Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions src/doc/simulate-l2-deposit-transactions.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,15 @@ https://github.com/ethereum-optimism/supersim
Start supersim with forked chains for multiple L2s:

```bash
supersim fork --chains=op,ink
supersim fork --chains=op,ink,soneium
```

**Note:** You can specify any L2 chains supported by supersim (e.g., `op`, `base`, `mode`, `ink`, etc.). The default ports are:
**Note:** You can specify any L2 chains supported by supersim (e.g., `op`, `base`, `mode`, `ink`, `soneium`, etc.). The default ports are:
- L1 (Ethereum): `http://127.0.0.1:8545`
- L2 (OP Mainnet): `http://127.0.0.1:9545`
- L2 (Ink Mainnet): `http://127.0.0.1:9546`
- Additional L2s will increment the port (9547, 9548, etc.)
- L2 (Soneium Mainnet): `http://127.0.0.1:9547`
- Additional L2s will increment the port (9548, 9549, etc.)

For different L2 chains, adjust the RPC URLs and network IDs accordingly.

Expand Down
46 changes: 38 additions & 8 deletions test/integration/IntegrationBase.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ import {Test} from "forge-std/Test.sol";
import {Vm} from "forge-std/Vm.sol";
import {console2} from "forge-std/console2.sol";
import {AddressAliasHelper} from "@eth-optimism-bedrock/src/vendor/AddressAliasHelper.sol";
import {FeeSplitterSetup} from "src/libraries/FeeSplitterSetup.sol";
import {RevShareCommon} from "src/libraries/RevShareCommon.sol";
import {Utils} from "src/libraries/Utils.sol";
import {RevShareContractsUpgrader} from "src/RevShareContractsUpgrader.sol";
import {Predeploys} from "@eth-optimism-bedrock/src/libraries/Predeploys.sol";
import {IFeeSplitter} from "src/interfaces/IFeeSplitter.sol";
Expand All @@ -22,6 +25,7 @@ abstract contract IntegrationBase is Test {
uint256 internal _mainnetForkId;
uint256 internal _opMainnetForkId;
uint256 internal _inkMainnetForkId;
uint256 internal _soneiumMainnetForkId;

// Shared upgrader contract
RevShareContractsUpgrader public revShareUpgrader;
Expand All @@ -30,6 +34,7 @@ abstract contract IntegrationBase is Test {
address internal constant PROXY_ADMIN_OWNER = 0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A;
address internal constant OP_MAINNET_PORTAL = 0xbEb5Fc579115071764c7423A4f12eDde41f106Ed;
address internal constant INK_MAINNET_PORTAL = 0x5d66C1782664115999C47c9fA5cd031f495D3e4F;
address internal constant SONEIUM_MAINNET_PORTAL = 0x88e529A6ccd302c948689Cd5156C83D4614FAE92;
address internal constant REV_SHARE_UPGRADER_ADDRESS = 0x0000000000000000000000000000000000001337;

// L2 predeploys (same across all OP Stack chains)
Expand All @@ -39,13 +44,6 @@ abstract contract IntegrationBase is Test {
address internal constant L1_FEE_VAULT = 0x420000000000000000000000000000000000001A;
address internal constant FEE_SPLITTER = 0x420000000000000000000000000000000000002B;

// Expected deployed contracts (deterministic CREATE2 addresses)
address internal constant OP_L1_WITHDRAWER = 0xB3AeB34b88D73Fb4832f65BEa5Bd865017fB5daC;
address internal constant OP_REV_SHARE_CALCULATOR = 0x3E806Fd8592366E850197FEC8D80608b5526Bba2;

address internal constant INK_L1_WITHDRAWER = 0x70e26B12a578176BccCD3b7e7f58f605871c5eF7;
address internal constant INK_REV_SHARE_CALCULATOR = 0xd7a5307B4Ce92B0269903191007b95dF42552Dfa;

// Test configuration - OP Mainnet
uint256 internal constant OP_MIN_WITHDRAWAL_AMOUNT = 350000;
address internal constant OP_L1_WITHDRAWAL_RECIPIENT = 0x0000000000000000000000000000000000000001;
Expand All @@ -55,9 +53,15 @@ abstract contract IntegrationBase is Test {
// Test configuration - Ink Mainnet
uint256 internal constant INK_MIN_WITHDRAWAL_AMOUNT = 500000;
address internal constant INK_L1_WITHDRAWAL_RECIPIENT = 0x0000000000000000000000000000000000000002;
uint32 internal constant INK_WITHDRAWAL_GAS_LIMIT = 1000000;
uint32 internal constant INK_WITHDRAWAL_GAS_LIMIT = 800000;
address internal constant INK_CHAIN_FEES_RECIPIENT = 0x0000000000000000000000000000000000000002;

// Test configuration - Soneium Mainnet
uint256 internal constant SONEIUM_MIN_WITHDRAWAL_AMOUNT = 500000;
address internal constant SONEIUM_L1_WITHDRAWAL_RECIPIENT = 0x0000000000000000000000000000000000000003;
uint32 internal constant SONEIUM_WITHDRAWAL_GAS_LIMIT = 800000;
address internal constant SONEIUM_CHAIN_FEES_RECIPIENT = 0x0000000000000000000000000000000000000003;

bool internal constant IS_SIMULATE = true;
/// @notice Relay all deposit transactions from L1 to multiple L2s
/// @param _forkIds Array of fork IDs for each L2 chain
Expand Down Expand Up @@ -175,9 +179,35 @@ abstract contract IntegrationBase is Test {
return _result;
}

/// @notice Compute deterministic L1Withdrawer address using CREATE2
function _computeL1WithdrawerAddress(uint256 _minWithdrawalAmount, address _recipient, uint32 _gasLimit)
internal
pure
returns (address)
{
bytes memory _initCode = bytes.concat(
FeeSplitterSetup.l1WithdrawerCreationCode, abi.encode(_minWithdrawalAmount, _recipient, _gasLimit)
);
bytes32 _salt = RevShareCommon.getSalt("L1Withdrawer");
return Utils.getCreate2Address(_salt, _initCode, RevShareCommon.CREATE2_DEPLOYER);
}

/// @notice Compute deterministic RevShareCalculator address using CREATE2
function _computeRevShareCalculatorAddress(address _l1Withdrawer, address _chainFeesRecipient)
internal
pure
returns (address)
{
bytes memory _initCode = bytes.concat(
FeeSplitterSetup.scRevShareCalculatorCreationCode, abi.encode(_l1Withdrawer, _chainFeesRecipient)
);
bytes32 _salt = RevShareCommon.getSalt("SCRevShareCalculator");
return Utils.getCreate2Address(_salt, _initCode, RevShareCommon.CREATE2_DEPLOYER);
}
/// @notice Fund all fee vaults with specified amount
/// @param _amount Amount to fund each vault with
/// @param _forkId Fork ID to execute on

function _fundVaults(uint256 _amount, uint256 _forkId) internal {
vm.selectFork(_forkId);
vm.deal(SEQUENCER_FEE_VAULT, _amount);
Expand Down
48 changes: 39 additions & 9 deletions test/integration/RevShareContractsUpgraderIntegration.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@ contract RevShareContractsUpgraderIntegrationTest is IntegrationBase {
RevShareUpgradeAndSetup public revShareTask;

function setUp() public {
// Create forks for L1 (mainnet) and L2 (OP Mainnet)
// Create forks for L1 (mainnet) and L2s
_mainnetForkId = vm.createFork("http://127.0.0.1:8545");
_opMainnetForkId = vm.createFork("http://127.0.0.1:9545");
_inkMainnetForkId = vm.createFork("http://127.0.0.1:9546");
_soneiumMainnetForkId = vm.createFork("http://127.0.0.1:9547");

// Deploy contracts on L1
vm.selectFork(_mainnetForkId);
Expand All @@ -35,21 +36,26 @@ contract RevShareContractsUpgraderIntegrationTest is IntegrationBase {
revShareTask.simulate("test/tasks/example/eth/016-revshare-upgrade-and-setup/config.toml");

// Step 3: Relay deposit transactions from L1 to all L2s
uint256[] memory forkIds = new uint256[](2);
uint256[] memory forkIds = new uint256[](3);
forkIds[0] = _opMainnetForkId;
forkIds[1] = _inkMainnetForkId;
forkIds[2] = _soneiumMainnetForkId;

address[] memory portals = new address[](2);
address[] memory portals = new address[](3);
portals[0] = OP_MAINNET_PORTAL;
portals[1] = INK_MAINNET_PORTAL;
portals[2] = SONEIUM_MAINNET_PORTAL;

_relayAllMessages(forkIds, IS_SIMULATE, portals);

// Step 4: Assert the state of the OP Mainnet contracts
vm.selectFork(_opMainnetForkId);
address opL1Withdrawer =
_computeL1WithdrawerAddress(OP_MIN_WITHDRAWAL_AMOUNT, OP_L1_WITHDRAWAL_RECIPIENT, OP_WITHDRAWAL_GAS_LIMIT);
address opRevShareCalculator = _computeRevShareCalculatorAddress(opL1Withdrawer, OP_CHAIN_FEES_RECIPIENT);
_assertL2State(
OP_L1_WITHDRAWER,
OP_REV_SHARE_CALCULATOR,
opL1Withdrawer,
opRevShareCalculator,
OP_MIN_WITHDRAWAL_AMOUNT,
OP_L1_WITHDRAWAL_RECIPIENT,
OP_WITHDRAWAL_GAS_LIMIT,
Expand All @@ -58,22 +64,43 @@ contract RevShareContractsUpgraderIntegrationTest is IntegrationBase {

// Step 5: Assert the state of the Ink Mainnet contracts
vm.selectFork(_inkMainnetForkId);
address inkL1Withdrawer = _computeL1WithdrawerAddress(
INK_MIN_WITHDRAWAL_AMOUNT, INK_L1_WITHDRAWAL_RECIPIENT, INK_WITHDRAWAL_GAS_LIMIT
);
address inkRevShareCalculator = _computeRevShareCalculatorAddress(inkL1Withdrawer, INK_CHAIN_FEES_RECIPIENT);
_assertL2State(
INK_L1_WITHDRAWER,
INK_REV_SHARE_CALCULATOR,
inkL1Withdrawer,
inkRevShareCalculator,
INK_MIN_WITHDRAWAL_AMOUNT,
INK_L1_WITHDRAWAL_RECIPIENT,
INK_WITHDRAWAL_GAS_LIMIT,
INK_CHAIN_FEES_RECIPIENT
);

// Step 6: Do a withdrawal flow
// Step 6: Assert the state of the Soneium Mainnet contracts
vm.selectFork(_soneiumMainnetForkId);
address soneiumL1Withdrawer = _computeL1WithdrawerAddress(
SONEIUM_MIN_WITHDRAWAL_AMOUNT, SONEIUM_L1_WITHDRAWAL_RECIPIENT, SONEIUM_WITHDRAWAL_GAS_LIMIT
);
address soneiumRevShareCalculator =
_computeRevShareCalculatorAddress(soneiumL1Withdrawer, SONEIUM_CHAIN_FEES_RECIPIENT);
_assertL2State(
soneiumL1Withdrawer,
soneiumRevShareCalculator,
SONEIUM_MIN_WITHDRAWAL_AMOUNT,
SONEIUM_L1_WITHDRAWAL_RECIPIENT,
SONEIUM_WITHDRAWAL_GAS_LIMIT,
SONEIUM_CHAIN_FEES_RECIPIENT
);

// Step 7: Do a withdrawal flow

// Fund vaults with amount > minWithdrawalAmount
_fundVaults(1 ether, _opMainnetForkId);
_fundVaults(1 ether, _inkMainnetForkId);
_fundVaults(1 ether, _soneiumMainnetForkId);

// Disburse fees in both chains and expect the L1Withdrawer to trigger the withdrawal
// Disburse fees in all chains and expect the L1Withdrawer to trigger the withdrawal
// Expected L1Withdrawer share = 3 ether * 15% = 0.45 ether
// It is 3 ether instead of 4 because net revenue doesn't count L1FeeVault's balance
// For details on the rev share calculation, check the SuperchainRevSharesCalculator contract.
Expand All @@ -82,5 +109,8 @@ contract RevShareContractsUpgraderIntegrationTest is IntegrationBase {

_executeDisburseAndAssertWithdrawal(_opMainnetForkId, OP_L1_WITHDRAWAL_RECIPIENT, expectedWithdrawalAmount);
_executeDisburseAndAssertWithdrawal(_inkMainnetForkId, INK_L1_WITHDRAWAL_RECIPIENT, expectedWithdrawalAmount);
_executeDisburseAndAssertWithdrawal(
_soneiumMainnetForkId, SONEIUM_L1_WITHDRAWAL_RECIPIENT, expectedWithdrawalAmount
);
}
}
Loading