From c91c5afb0919ed214a30d0a0eb4fac6be635f505 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Wed, 1 Oct 2025 20:45:50 -0300 Subject: [PATCH 01/52] test: revenue sharing upgrade unit tests --- .../mock/configs/RevenueShareNonOptIn.toml | 21 ++ test/template/RevenueShareUpgradePath.t.sol | 297 ++++++++++++++++++ 2 files changed, 318 insertions(+) create mode 100644 test/tasks/mock/configs/RevenueShareNonOptIn.toml create mode 100644 test/template/RevenueShareUpgradePath.t.sol diff --git a/test/tasks/mock/configs/RevenueShareNonOptIn.toml b/test/tasks/mock/configs/RevenueShareNonOptIn.toml new file mode 100644 index 0000000000..40ebcc3843 --- /dev/null +++ b/test/tasks/mock/configs/RevenueShareNonOptIn.toml @@ -0,0 +1,21 @@ +templateName = "RevenueShareV100UpgradePath" +optInRevenueShare = false +portal = "0xbEb5Fc579115071764c7423A4f12eDde41f106Ed" +saltSeed = "DeploymentSalt" +deploymentGasLimit = 1000000 +baseFeeVaultWithdrawalNetwork = 0 +baseFeeVaultRecipient = "0x3333333333333333333333333333333333333333" +baseFeeVaultMinWithdrawalAmount = "1000000000000000000" +l1FeeVaultWithdrawalNetwork = 0 +l1FeeVaultRecipient = "0x4444444444444444444444444444444444444444" +l1FeeVaultMinWithdrawalAmount = "1000000000000000000" +sequencerFeeVaultWithdrawalNetwork = 0 +sequencerFeeVaultRecipient = "0x5555555555555555555555555555555555555555" +sequencerFeeVaultMinWithdrawalAmount = "1000000000000000000" +operatorFeeVaultWithdrawalNetwork = 0 +operatorFeeVaultRecipient = "0x6666666666666666666666666666666666666666" +operatorFeeVaultMinWithdrawalAmount = "1000000000000000000" + +[addresses] +ProxyAdminOwner = "0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A" +OptimismPortal = "0xbEb5Fc579115071764c7423A4f12eDde41f106Ed" diff --git a/test/template/RevenueShareUpgradePath.t.sol b/test/template/RevenueShareUpgradePath.t.sol new file mode 100644 index 0000000000..f2fa163385 --- /dev/null +++ b/test/template/RevenueShareUpgradePath.t.sol @@ -0,0 +1,297 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import {Test} from "forge-std/Test.sol"; +import {console2} from "forge-std/console2.sol"; +import {stdStorage, StdStorage} from "forge-std/StdStorage.sol"; +import {VmSafe} from "forge-std/Vm.sol"; +import {IGnosisSafe, Enum} from "@base-contracts/script/universal/IGnosisSafe.sol"; +import {IMulticall3} from "forge-std/interfaces/IMulticall3.sol"; +import {Signatures} from "@base-contracts/script/universal/Signatures.sol"; + +import {RevenueShareV100UpgradePath} from "src/template/RevenueShareUpgradePath.sol"; +import {SimpleAddressRegistry} from "src/SimpleAddressRegistry.sol"; +import {Action, TaskPayload, SafeData} from "src/libraries/MultisigTypes.sol"; +import {Utils} from "src/libraries/Utils.sol"; + +interface IOptimismPortal2 { + function depositTransaction(address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes memory _data) + external + payable; +} + +contract RevenueShareUpgradePathTest is Test { + using stdStorage for StdStorage; + + RevenueShareV100UpgradePath public template; + string public configPath = "test/tasks/example/eth/015-revenue-share-upgrade/config.toml"; + + // Expected addresses from config + address public constant PORTAL = 0xbEb5Fc579115071764c7423A4f12eDde41f106Ed; + address public constant PROXY_ADMIN_OWNER = 0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A; + + // L2 predeploys + address internal constant CREATE2_DEPLOYER = 0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2; + address internal constant FEE_SPLITTER = 0x420000000000000000000000000000000000002B; + + // Track portal calls for verification + struct PortalCall { + address to; + uint256 value; + uint64 gasLimit; + bool isCreation; + bytes data; + } + PortalCall[] public recordedPortalCalls; + + function setUp() public { + vm.createSelectFork("mainnet", 21_000_000); + + // Create template + template = new RevenueShareV100UpgradePath(); + } + + function testOptInRevenueShare() public { + console2.log("=== Testing Revenue Share Upgrade with Pranked Multisig Execution ==="); + + // Step 1: Run simulate to prepare everything and get the actions + console2.log("\n1. Running simulate to prepare the task..."); + ( + VmSafe.AccountAccess[] memory accountAccesses, + Action[] memory actions, + bytes32 txHash, + bytes memory dataToSign, + address rootSafe + ) = template.simulate(configPath, new address[](0)); + + console2.log(" Root safe:", rootSafe); + console2.log(" Transaction hash:", vm.toString(txHash)); + console2.log(" Number of actions:", actions.length); + + // Verify we got the expected safe + assertEq(rootSafe, PROXY_ADMIN_OWNER, "Root safe should be ProxyAdminOwner"); + assertEq(actions.length, 12, "Should have 12 actions for opt-in scenario"); + + // Step 2: Get the safe's owners + IGnosisSafe safe = IGnosisSafe(rootSafe); + address[] memory owners = safe.getOwners(); + uint256 threshold = safe.getThreshold(); + + console2.log("\n2. Safe configuration:"); + console2.log(" Number of owners:", owners.length); + console2.log(" Threshold:", threshold); + for (uint i = 0; i < owners.length; i++) { + console2.log(" Owner", i, ":", owners[i]); + } + + // Step 3: Get the multicall calldata that will be executed + IMulticall3.Call3Value[] memory calls = new IMulticall3.Call3Value[](actions.length); + for (uint256 i = 0; i < actions.length; i++) { + calls[i] = IMulticall3.Call3Value({ + target: actions[i].target, + allowFailure: false, + value: actions[i].value, + callData: actions[i].arguments + }); + } + bytes memory multicallData = abi.encodeCall(IMulticall3.aggregate3Value, (calls)); + + // Step 4: Mock the portal to record calls instead of reverting + console2.log("\n3. Setting up portal mock to record calls..."); + vm.mockCall( + PORTAL, + abi.encodeWithSelector(IOptimismPortal2.depositTransaction.selector), + abi.encode() + ); + + // Record portal calls using expectCall + for (uint i = 0; i < actions.length; i++) { + vm.expectCall(PORTAL, actions[i].arguments); + } + + // Step 5: Prank owners to approve the hash + console2.log("\n4. Pranking owners to approve transaction hash..."); + for (uint256 i = 0; i < owners.length; i++) { + console2.log(" Owner", i, "approving hash"); + vm.prank(owners[i]); + safe.approveHash(txHash); + } + + // Step 6: Generate signatures after approval + bytes memory signatures = Signatures.genPrevalidatedSignatures(owners); + console2.log("\n5. Generated prevalidated signatures (length:", signatures.length, "bytes)"); + + // Step 7: Execute the transaction + console2.log("\n6. Executing safe transaction..."); + uint256 nonceBefore = safe.nonce(); + + // The hash we computed should match the one from simulate + // Let's compute it fresh to make sure it's correct + bytes32 freshHash = safe.getTransactionHash( + template.multicallTarget(), + 0, // value + multicallData, + Enum.Operation.DelegateCall, + 0, // safeTxGas + 0, // baseGas + 0, // gasPrice + address(0), // gasToken + payable(address(0)), // refundReceiver + nonceBefore + ); + + console2.log(" Fresh computed hash:", vm.toString(freshHash)); + console2.log(" Original hash: ", vm.toString(txHash)); + + // Make sure they match + if (freshHash != txHash) { + console2.log(" ERROR: Hash mismatch! Using fresh hash for execution."); + // Re-approve with the fresh hash + for (uint256 i = 0; i < owners.length; i++) { + vm.prank(owners[i]); + safe.approveHash(freshHash); + } + } + + vm.prank(msg.sender); // Execute as current sender + bool success = safe.execTransaction( + template.multicallTarget(), + 0, // value + multicallData, + Enum.Operation.DelegateCall, + 0, // safeTxGas + 0, // baseGas + 0, // gasPrice + address(0), // gasToken + payable(address(0)), // refundReceiver + signatures + ); + + assertTrue(success, "Transaction should execute successfully"); + assertEq(safe.nonce(), nonceBefore + 1, "Safe nonce should increment"); + + console2.log(" Transaction executed successfully!"); + console2.log(" Safe nonce incremented from", nonceBefore, "to", safe.nonce()); + + // Step 8: Verify the portal calls + console2.log("\n7. Verifying portal calls..."); + _verifyPortalCalls(actions); + } + + function _verifyPortalCalls(Action[] memory actions) internal { + console2.log(" Analyzing", actions.length, "portal calls:"); + + uint256 deploymentCalls = 0; + uint256 upgradeCalls = 0; + + for (uint i = 0; i < actions.length; i++) { + // Decode the depositTransaction parameters + bytes memory params = new bytes(actions[i].arguments.length - 4); + for (uint j = 0; j < params.length; j++) { + params[j] = actions[i].arguments[j + 4]; + } + (address to, uint256 value, uint64 gasLimit, bool isCreation, bytes memory data) = + abi.decode(params, (address, uint256, uint64, bool, bytes)); + + if (to == CREATE2_DEPLOYER) { + deploymentCalls++; + console2.log(" Call", i, ": Deploy contract via CREATE2"); + } else { + upgradeCalls++; + console2.log(" Call", i, ": Upgrade proxy at", to); + } + } + + console2.log("\n Summary:"); + console2.log(" Deployment calls:", deploymentCalls); + console2.log(" Upgrade calls:", upgradeCalls); + + // For opt-in scenario, we expect: + // - 7 deployments (L1Withdrawer, SCRevShareCalc, FeeSplitter, 4 vaults) + // - 5 upgrades (4 vault proxies + 1 FeeSplitter upgrade) + assertEq(deploymentCalls, 7, "Should have 7 deployment calls"); + assertEq(upgradeCalls, 5, "Should have 5 upgrade calls"); + } + + function testOptOutRevenueShare() public { + console2.log("=== Testing Non Opt-In Revenue Share Scenario ==="); + + // Create a non-opt-in config + string memory nonOptInConfig = _createNonOptInConfig(); + + // Step 1: Run simulate to prepare everything and get the actions + console2.log("\n1. Running simulate with non-opt-in config..."); + ( + VmSafe.AccountAccess[] memory accountAccesses, + Action[] memory actions, + bytes32 txHash, + bytes memory dataToSign, + address rootSafe + ) = template.simulate(nonOptInConfig, new address[](0)); + + console2.log(" Number of actions for non-opt-in:", actions.length); + + // For non-opt-in, we should have 10 actions (no L1Withdrawer or SCRevShareCalc) + assertEq(actions.length, 10, "Should have 10 actions for non-opt-in scenario"); + + // Verify portal calls + console2.log("\n2. Verifying non-opt-in portal calls..."); + _verifyNonOptInPortalCalls(actions); + } + + function _createNonOptInConfig() internal returns (string memory) { + string memory config = string.concat( + "templateName = \"RevenueShareV100UpgradePath\"\n", + "optInRevenueShare = false\n", + "portal = \"0xbEb5Fc579115071764c7423A4f12eDde41f106Ed\"\n", + "saltSeed = \"DeploymentSalt\"\n", + "deploymentGasLimit = 1000000\n", + "baseFeeVaultWithdrawalNetwork = 0\n", + "baseFeeVaultRecipient = \"0x3333333333333333333333333333333333333333\"\n", + "baseFeeVaultMinWithdrawalAmount = \"1000000000000000000\"\n", + "l1FeeVaultWithdrawalNetwork = 0\n", + "l1FeeVaultRecipient = \"0x4444444444444444444444444444444444444444\"\n", + "l1FeeVaultMinWithdrawalAmount = \"1000000000000000000\"\n", + "sequencerFeeVaultWithdrawalNetwork = 0\n", + "sequencerFeeVaultRecipient = \"0x5555555555555555555555555555555555555555\"\n", + "sequencerFeeVaultMinWithdrawalAmount = \"1000000000000000000\"\n", + "operatorFeeVaultWithdrawalNetwork = 0\n", + "operatorFeeVaultRecipient = \"0x6666666666666666666666666666666666666666\"\n", + "operatorFeeVaultMinWithdrawalAmount = \"1000000000000000000\"\n", + "\n", + "[addresses]\n", + "ProxyAdminOwner = \"0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A\"\n", + "OptimismPortal = \"0xbEb5Fc579115071764c7423A4f12eDde41f106Ed\"\n" + ); + + string memory path = "test/tasks/mock/configs/RevenueShareNonOptIn.toml"; + vm.writeFile(path, config); + return path; + } + + function _verifyNonOptInPortalCalls(Action[] memory actions) internal pure { + uint256 deploymentCalls = 0; + uint256 upgradeCalls = 0; + + for (uint i = 0; i < actions.length; i++) { + // Decode the depositTransaction parameters + bytes memory params = new bytes(actions[i].arguments.length - 4); + for (uint j = 0; j < params.length; j++) { + params[j] = actions[i].arguments[j + 4]; + } + (address to,,,,) = abi.decode(params, (address, uint256, uint64, bool, bytes)); + + if (to == CREATE2_DEPLOYER) { + deploymentCalls++; + } else { + upgradeCalls++; + } + } + + // For non-opt-in scenario: + // - 5 deployments (FeeSplitter + 4 vaults, no L1Withdrawer/SCRevShareCalc) + // - 5 upgrades (4 vault proxies + FeeSplitter) + assertEq(deploymentCalls, 5, "Should have 5 deployment calls for non-opt-in"); + assertEq(upgradeCalls, 5, "Should have 5 upgrade calls for non-opt-in"); + } +} \ No newline at end of file From dab30952c16e45dd29304e9ff67fd84520181ae1 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Wed, 1 Oct 2025 20:49:32 -0300 Subject: [PATCH 02/52] chore: remove temp file after creation in test --- .../mock/configs/RevenueShareNonOptIn.toml | 21 ------------------- test/template/RevenueShareUpgradePath.t.sol | 3 +++ 2 files changed, 3 insertions(+), 21 deletions(-) delete mode 100644 test/tasks/mock/configs/RevenueShareNonOptIn.toml diff --git a/test/tasks/mock/configs/RevenueShareNonOptIn.toml b/test/tasks/mock/configs/RevenueShareNonOptIn.toml deleted file mode 100644 index 40ebcc3843..0000000000 --- a/test/tasks/mock/configs/RevenueShareNonOptIn.toml +++ /dev/null @@ -1,21 +0,0 @@ -templateName = "RevenueShareV100UpgradePath" -optInRevenueShare = false -portal = "0xbEb5Fc579115071764c7423A4f12eDde41f106Ed" -saltSeed = "DeploymentSalt" -deploymentGasLimit = 1000000 -baseFeeVaultWithdrawalNetwork = 0 -baseFeeVaultRecipient = "0x3333333333333333333333333333333333333333" -baseFeeVaultMinWithdrawalAmount = "1000000000000000000" -l1FeeVaultWithdrawalNetwork = 0 -l1FeeVaultRecipient = "0x4444444444444444444444444444444444444444" -l1FeeVaultMinWithdrawalAmount = "1000000000000000000" -sequencerFeeVaultWithdrawalNetwork = 0 -sequencerFeeVaultRecipient = "0x5555555555555555555555555555555555555555" -sequencerFeeVaultMinWithdrawalAmount = "1000000000000000000" -operatorFeeVaultWithdrawalNetwork = 0 -operatorFeeVaultRecipient = "0x6666666666666666666666666666666666666666" -operatorFeeVaultMinWithdrawalAmount = "1000000000000000000" - -[addresses] -ProxyAdminOwner = "0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A" -OptimismPortal = "0xbEb5Fc579115071764c7423A4f12eDde41f106Ed" diff --git a/test/template/RevenueShareUpgradePath.t.sol b/test/template/RevenueShareUpgradePath.t.sol index f2fa163385..3a2d4a2a19 100644 --- a/test/template/RevenueShareUpgradePath.t.sol +++ b/test/template/RevenueShareUpgradePath.t.sol @@ -237,6 +237,9 @@ contract RevenueShareUpgradePathTest is Test { // Verify portal calls console2.log("\n2. Verifying non-opt-in portal calls..."); _verifyNonOptInPortalCalls(actions); + + // Clean up the temporary file + vm.removeFile(nonOptInConfig); } function _createNonOptInConfig() internal returns (string memory) { From dddf7611d715e3738c3ea69b04122fcba718018f Mon Sep 17 00:00:00 2001 From: 0xchin Date: Thu, 2 Oct 2025 00:12:06 -0300 Subject: [PATCH 03/52] chore: remove fork block number --- test/template/RevenueShareUpgradePath.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/template/RevenueShareUpgradePath.t.sol b/test/template/RevenueShareUpgradePath.t.sol index 3a2d4a2a19..e741879956 100644 --- a/test/template/RevenueShareUpgradePath.t.sol +++ b/test/template/RevenueShareUpgradePath.t.sol @@ -45,7 +45,7 @@ contract RevenueShareUpgradePathTest is Test { PortalCall[] public recordedPortalCalls; function setUp() public { - vm.createSelectFork("mainnet", 21_000_000); + vm.createSelectFork("mainnet"); // Create template template = new RevenueShareV100UpgradePath(); From 3986eb1b9a9cd892bf0c683844b08dba028caa64 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Thu, 2 Oct 2025 00:28:52 -0300 Subject: [PATCH 04/52] chore: remove logs --- test/template/RevenueShareUpgradePath.t.sol | 37 --------------------- 1 file changed, 37 deletions(-) diff --git a/test/template/RevenueShareUpgradePath.t.sol b/test/template/RevenueShareUpgradePath.t.sol index e741879956..6e0f813c4d 100644 --- a/test/template/RevenueShareUpgradePath.t.sol +++ b/test/template/RevenueShareUpgradePath.t.sol @@ -2,7 +2,6 @@ pragma solidity 0.8.15; import {Test} from "forge-std/Test.sol"; -import {console2} from "forge-std/console2.sol"; import {stdStorage, StdStorage} from "forge-std/StdStorage.sol"; import {VmSafe} from "forge-std/Vm.sol"; import {IGnosisSafe, Enum} from "@base-contracts/script/universal/IGnosisSafe.sol"; @@ -47,15 +46,11 @@ contract RevenueShareUpgradePathTest is Test { function setUp() public { vm.createSelectFork("mainnet"); - // Create template template = new RevenueShareV100UpgradePath(); } function testOptInRevenueShare() public { - console2.log("=== Testing Revenue Share Upgrade with Pranked Multisig Execution ==="); - // Step 1: Run simulate to prepare everything and get the actions - console2.log("\n1. Running simulate to prepare the task..."); ( VmSafe.AccountAccess[] memory accountAccesses, Action[] memory actions, @@ -64,10 +59,6 @@ contract RevenueShareUpgradePathTest is Test { address rootSafe ) = template.simulate(configPath, new address[](0)); - console2.log(" Root safe:", rootSafe); - console2.log(" Transaction hash:", vm.toString(txHash)); - console2.log(" Number of actions:", actions.length); - // Verify we got the expected safe assertEq(rootSafe, PROXY_ADMIN_OWNER, "Root safe should be ProxyAdminOwner"); assertEq(actions.length, 12, "Should have 12 actions for opt-in scenario"); @@ -77,13 +68,6 @@ contract RevenueShareUpgradePathTest is Test { address[] memory owners = safe.getOwners(); uint256 threshold = safe.getThreshold(); - console2.log("\n2. Safe configuration:"); - console2.log(" Number of owners:", owners.length); - console2.log(" Threshold:", threshold); - for (uint i = 0; i < owners.length; i++) { - console2.log(" Owner", i, ":", owners[i]); - } - // Step 3: Get the multicall calldata that will be executed IMulticall3.Call3Value[] memory calls = new IMulticall3.Call3Value[](actions.length); for (uint256 i = 0; i < actions.length; i++) { @@ -97,7 +81,6 @@ contract RevenueShareUpgradePathTest is Test { bytes memory multicallData = abi.encodeCall(IMulticall3.aggregate3Value, (calls)); // Step 4: Mock the portal to record calls instead of reverting - console2.log("\n3. Setting up portal mock to record calls..."); vm.mockCall( PORTAL, abi.encodeWithSelector(IOptimismPortal2.depositTransaction.selector), @@ -110,19 +93,15 @@ contract RevenueShareUpgradePathTest is Test { } // Step 5: Prank owners to approve the hash - console2.log("\n4. Pranking owners to approve transaction hash..."); for (uint256 i = 0; i < owners.length; i++) { - console2.log(" Owner", i, "approving hash"); vm.prank(owners[i]); safe.approveHash(txHash); } // Step 6: Generate signatures after approval bytes memory signatures = Signatures.genPrevalidatedSignatures(owners); - console2.log("\n5. Generated prevalidated signatures (length:", signatures.length, "bytes)"); // Step 7: Execute the transaction - console2.log("\n6. Executing safe transaction..."); uint256 nonceBefore = safe.nonce(); // The hash we computed should match the one from simulate @@ -140,12 +119,9 @@ contract RevenueShareUpgradePathTest is Test { nonceBefore ); - console2.log(" Fresh computed hash:", vm.toString(freshHash)); - console2.log(" Original hash: ", vm.toString(txHash)); // Make sure they match if (freshHash != txHash) { - console2.log(" ERROR: Hash mismatch! Using fresh hash for execution."); // Re-approve with the fresh hash for (uint256 i = 0; i < owners.length; i++) { vm.prank(owners[i]); @@ -170,16 +146,12 @@ contract RevenueShareUpgradePathTest is Test { assertTrue(success, "Transaction should execute successfully"); assertEq(safe.nonce(), nonceBefore + 1, "Safe nonce should increment"); - console2.log(" Transaction executed successfully!"); - console2.log(" Safe nonce incremented from", nonceBefore, "to", safe.nonce()); // Step 8: Verify the portal calls - console2.log("\n7. Verifying portal calls..."); _verifyPortalCalls(actions); } function _verifyPortalCalls(Action[] memory actions) internal { - console2.log(" Analyzing", actions.length, "portal calls:"); uint256 deploymentCalls = 0; uint256 upgradeCalls = 0; @@ -195,16 +167,11 @@ contract RevenueShareUpgradePathTest is Test { if (to == CREATE2_DEPLOYER) { deploymentCalls++; - console2.log(" Call", i, ": Deploy contract via CREATE2"); } else { upgradeCalls++; - console2.log(" Call", i, ": Upgrade proxy at", to); } } - console2.log("\n Summary:"); - console2.log(" Deployment calls:", deploymentCalls); - console2.log(" Upgrade calls:", upgradeCalls); // For opt-in scenario, we expect: // - 7 deployments (L1Withdrawer, SCRevShareCalc, FeeSplitter, 4 vaults) @@ -214,13 +181,11 @@ contract RevenueShareUpgradePathTest is Test { } function testOptOutRevenueShare() public { - console2.log("=== Testing Non Opt-In Revenue Share Scenario ==="); // Create a non-opt-in config string memory nonOptInConfig = _createNonOptInConfig(); // Step 1: Run simulate to prepare everything and get the actions - console2.log("\n1. Running simulate with non-opt-in config..."); ( VmSafe.AccountAccess[] memory accountAccesses, Action[] memory actions, @@ -229,13 +194,11 @@ contract RevenueShareUpgradePathTest is Test { address rootSafe ) = template.simulate(nonOptInConfig, new address[](0)); - console2.log(" Number of actions for non-opt-in:", actions.length); // For non-opt-in, we should have 10 actions (no L1Withdrawer or SCRevShareCalc) assertEq(actions.length, 10, "Should have 10 actions for non-opt-in scenario"); // Verify portal calls - console2.log("\n2. Verifying non-opt-in portal calls..."); _verifyNonOptInPortalCalls(actions); // Clean up the temporary file From 432ae73ff51bdb5c38961dc858c070bc04a96e3b Mon Sep 17 00:00:00 2001 From: 0xchin Date: Thu, 2 Oct 2025 00:39:41 -0300 Subject: [PATCH 05/52] fix: compiler warnings --- test/template/RevenueShareUpgradePath.t.sol | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/test/template/RevenueShareUpgradePath.t.sol b/test/template/RevenueShareUpgradePath.t.sol index 6e0f813c4d..daa26d212f 100644 --- a/test/template/RevenueShareUpgradePath.t.sol +++ b/test/template/RevenueShareUpgradePath.t.sol @@ -52,10 +52,10 @@ contract RevenueShareUpgradePathTest is Test { function testOptInRevenueShare() public { // Step 1: Run simulate to prepare everything and get the actions ( - VmSafe.AccountAccess[] memory accountAccesses, + , Action[] memory actions, bytes32 txHash, - bytes memory dataToSign, + , address rootSafe ) = template.simulate(configPath, new address[](0)); @@ -66,7 +66,6 @@ contract RevenueShareUpgradePathTest is Test { // Step 2: Get the safe's owners IGnosisSafe safe = IGnosisSafe(rootSafe); address[] memory owners = safe.getOwners(); - uint256 threshold = safe.getThreshold(); // Step 3: Get the multicall calldata that will be executed IMulticall3.Call3Value[] memory calls = new IMulticall3.Call3Value[](actions.length); @@ -151,7 +150,7 @@ contract RevenueShareUpgradePathTest is Test { _verifyPortalCalls(actions); } - function _verifyPortalCalls(Action[] memory actions) internal { + function _verifyPortalCalls(Action[] memory actions) internal pure { uint256 deploymentCalls = 0; uint256 upgradeCalls = 0; @@ -162,7 +161,7 @@ contract RevenueShareUpgradePathTest is Test { for (uint j = 0; j < params.length; j++) { params[j] = actions[i].arguments[j + 4]; } - (address to, uint256 value, uint64 gasLimit, bool isCreation, bytes memory data) = + (address to, , , , ) = abi.decode(params, (address, uint256, uint64, bool, bytes)); if (to == CREATE2_DEPLOYER) { @@ -187,11 +186,11 @@ contract RevenueShareUpgradePathTest is Test { // Step 1: Run simulate to prepare everything and get the actions ( - VmSafe.AccountAccess[] memory accountAccesses, + , Action[] memory actions, - bytes32 txHash, - bytes memory dataToSign, - address rootSafe + , + , + ) = template.simulate(nonOptInConfig, new address[](0)); From 352e47ab810f1c636b9d308ac15369ffba36e0a3 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Thu, 2 Oct 2025 12:08:14 -0300 Subject: [PATCH 06/52] refactor: cleanup --- test/template/RevenueShareUpgradePath.t.sol | 59 ++++++++++----------- 1 file changed, 27 insertions(+), 32 deletions(-) diff --git a/test/template/RevenueShareUpgradePath.t.sol b/test/template/RevenueShareUpgradePath.t.sol index daa26d212f..6ccd9e4cc4 100644 --- a/test/template/RevenueShareUpgradePath.t.sol +++ b/test/template/RevenueShareUpgradePath.t.sol @@ -43,6 +43,11 @@ contract RevenueShareUpgradePathTest is Test { } PortalCall[] public recordedPortalCalls; + function _mockAndExpect(address _receiver, bytes memory _calldata, bytes memory _returned) internal { + vm.mockCall(_receiver, _calldata, _returned); + vm.expectCall(_receiver, _calldata); + } + function setUp() public { vm.createSelectFork("mainnet"); @@ -54,7 +59,7 @@ contract RevenueShareUpgradePathTest is Test { ( , Action[] memory actions, - bytes32 txHash, + , , address rootSafe ) = template.simulate(configPath, new address[](0)); @@ -79,8 +84,24 @@ contract RevenueShareUpgradePathTest is Test { } bytes memory multicallData = abi.encodeCall(IMulticall3.aggregate3Value, (calls)); - // Step 4: Mock the portal to record calls instead of reverting - vm.mockCall( + // Step 4: Get the nonce and compute transaction hash before any state changes + uint256 nonceBefore = safe.nonce(); + + bytes32 txHash = safe.getTransactionHash( + template.multicallTarget(), + 0, // value + multicallData, + Enum.Operation.DelegateCall, + 0, // safeTxGas + 0, // baseGas + 0, // gasPrice + address(0), // gasToken + payable(address(0)), // refundReceiver + nonceBefore + ); + + // Step 5: Mock the portal to record calls instead of reverting + _mockAndExpect( PORTAL, abi.encodeWithSelector(IOptimismPortal2.depositTransaction.selector), abi.encode() @@ -91,43 +112,17 @@ contract RevenueShareUpgradePathTest is Test { vm.expectCall(PORTAL, actions[i].arguments); } - // Step 5: Prank owners to approve the hash + // Step 6: Prank owners to approve the hash for (uint256 i = 0; i < owners.length; i++) { vm.prank(owners[i]); safe.approveHash(txHash); } - // Step 6: Generate signatures after approval + // Step 7: Generate signatures after approval bytes memory signatures = Signatures.genPrevalidatedSignatures(owners); - // Step 7: Execute the transaction - uint256 nonceBefore = safe.nonce(); - - // The hash we computed should match the one from simulate - // Let's compute it fresh to make sure it's correct - bytes32 freshHash = safe.getTransactionHash( - template.multicallTarget(), - 0, // value - multicallData, - Enum.Operation.DelegateCall, - 0, // safeTxGas - 0, // baseGas - 0, // gasPrice - address(0), // gasToken - payable(address(0)), // refundReceiver - nonceBefore - ); - - - // Make sure they match - if (freshHash != txHash) { - // Re-approve with the fresh hash - for (uint256 i = 0; i < owners.length; i++) { - vm.prank(owners[i]); - safe.approveHash(freshHash); - } - } + // Step 8: Execute the transaction vm.prank(msg.sender); // Execute as current sender bool success = safe.execTransaction( template.multicallTarget(), From 4619a0c40d41cd6f21444cf1a65208ecc25e951f Mon Sep 17 00:00:00 2001 From: 0xchin Date: Thu, 2 Oct 2025 12:24:40 -0300 Subject: [PATCH 07/52] refactor: cleanup --- test/template/RevenueShareUpgradePath.t.sol | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/template/RevenueShareUpgradePath.t.sol b/test/template/RevenueShareUpgradePath.t.sol index 6ccd9e4cc4..6eeaba5ba7 100644 --- a/test/template/RevenueShareUpgradePath.t.sol +++ b/test/template/RevenueShareUpgradePath.t.sol @@ -107,12 +107,12 @@ contract RevenueShareUpgradePathTest is Test { abi.encode() ); - // Record portal calls using expectCall + // Expect all portal calls for (uint i = 0; i < actions.length; i++) { vm.expectCall(PORTAL, actions[i].arguments); } - // Step 6: Prank owners to approve the hash + // Step 6: Prank owners to approve the transaction for (uint256 i = 0; i < owners.length; i++) { vm.prank(owners[i]); safe.approveHash(txHash); @@ -123,7 +123,6 @@ contract RevenueShareUpgradePathTest is Test { // Step 8: Execute the transaction - vm.prank(msg.sender); // Execute as current sender bool success = safe.execTransaction( template.multicallTarget(), 0, // value From 663e1748c31980b3656cb50310fae26476170dfd Mon Sep 17 00:00:00 2001 From: 0xchin Date: Thu, 2 Oct 2025 12:32:20 -0300 Subject: [PATCH 08/52] test: improve opt out scenario tests --- test/template/RevenueShareUpgradePath.t.sol | 79 +++++++++++++++++++-- 1 file changed, 74 insertions(+), 5 deletions(-) diff --git a/test/template/RevenueShareUpgradePath.t.sol b/test/template/RevenueShareUpgradePath.t.sol index 6eeaba5ba7..0906f42cbf 100644 --- a/test/template/RevenueShareUpgradePath.t.sol +++ b/test/template/RevenueShareUpgradePath.t.sol @@ -174,7 +174,6 @@ contract RevenueShareUpgradePathTest is Test { } function testOptOutRevenueShare() public { - // Create a non-opt-in config string memory nonOptInConfig = _createNonOptInConfig(); @@ -184,14 +183,84 @@ contract RevenueShareUpgradePathTest is Test { Action[] memory actions, , , - + address rootSafe ) = template.simulate(nonOptInConfig, new address[](0)); - - // For non-opt-in, we should have 10 actions (no L1Withdrawer or SCRevShareCalc) + // Verify we got the expected safe and action count + assertEq(rootSafe, PROXY_ADMIN_OWNER, "Root safe should be ProxyAdminOwner"); assertEq(actions.length, 10, "Should have 10 actions for non-opt-in scenario"); - // Verify portal calls + // Step 2: Get the safe's owners + IGnosisSafe safe = IGnosisSafe(rootSafe); + address[] memory owners = safe.getOwners(); + + // Step 3: Get the multicall calldata that will be executed + IMulticall3.Call3Value[] memory calls = new IMulticall3.Call3Value[](actions.length); + for (uint256 i = 0; i < actions.length; i++) { + calls[i] = IMulticall3.Call3Value({ + target: actions[i].target, + allowFailure: false, + value: actions[i].value, + callData: actions[i].arguments + }); + } + bytes memory multicallData = abi.encodeCall(IMulticall3.aggregate3Value, (calls)); + + // Step 4: Get the nonce and compute transaction hash before any state changes + uint256 nonceBefore = safe.nonce(); + + bytes32 txHash = safe.getTransactionHash( + template.multicallTarget(), + 0, // value + multicallData, + Enum.Operation.DelegateCall, + 0, // safeTxGas + 0, // baseGas + 0, // gasPrice + address(0), // gasToken + payable(address(0)), // refundReceiver + nonceBefore + ); + + // Step 5: Mock the portal to record calls instead of reverting + _mockAndExpect( + PORTAL, + abi.encodeWithSelector(IOptimismPortal2.depositTransaction.selector), + abi.encode() + ); + + // Expect all portal calls + for (uint i = 0; i < actions.length; i++) { + vm.expectCall(PORTAL, actions[i].arguments); + } + + // Step 6: Prank owners to approve the transaction + for (uint256 i = 0; i < owners.length; i++) { + vm.prank(owners[i]); + safe.approveHash(txHash); + } + + // Step 7: Generate signatures after approval + bytes memory signatures = Signatures.genPrevalidatedSignatures(owners); + + // Step 8: Execute the transaction + bool success = safe.execTransaction( + template.multicallTarget(), + 0, // value + multicallData, + Enum.Operation.DelegateCall, + 0, // safeTxGas + 0, // baseGas + 0, // gasPrice + address(0), // gasToken + payable(address(0)), // refundReceiver + signatures + ); + + assertTrue(success, "Transaction should execute successfully"); + assertEq(safe.nonce(), nonceBefore + 1, "Safe nonce should increment"); + + // Step 9: Verify the portal calls _verifyNonOptInPortalCalls(actions); // Clean up the temporary file From 2b68c6f0e0c21c7c8024386cb9eb4834d5923f20 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Thu, 2 Oct 2025 15:52:21 -0300 Subject: [PATCH 09/52] test: add task for revshare opt out scenario --- test/tasks/Regression.t.sol | 28 ++++++++++++++ .../017-revenue-share-upgrade-opt-out/.env | 3 ++ .../config.toml | 27 ++++++++++++++ test/template/RevenueShareUpgradePath.t.sol | 37 +------------------ 4 files changed, 60 insertions(+), 35 deletions(-) create mode 100644 test/tasks/example/eth/017-revenue-share-upgrade-opt-out/.env create mode 100644 test/tasks/example/eth/017-revenue-share-upgrade-opt-out/config.toml diff --git a/test/tasks/Regression.t.sol b/test/tasks/Regression.t.sol index 776f78a1df..6d298de917 100644 --- a/test/tasks/Regression.t.sol +++ b/test/tasks/Regression.t.sol @@ -891,6 +891,34 @@ contract RegressionTest is Test { _assertDataToSignNestedMultisig(multisigTask, actions, expectedDataToSign, MULTICALL3_ADDRESS, rootSafe); } + /// @notice Expected call data and data to sign generated by manually running the RevenueShareV100UpgradePath template at block 23434662 on mainnet (opt-out scenario). + /// Simulate from task directory (test/tasks/example/eth/017-revenue-share-upgrade-opt-out/config.toml) with: + /// just --dotenv-path $(pwd)/.env --justfile ../../../../../src/improvements/justfile simulate (foundation|council) + function testRegressionCallDataMatches_RevenueShareV100UpgradePathOptOut() public { + // TODO: Fix + /* string memory taskConfigFilePath = "test/tasks/example/eth/017-revenue-share-upgrade-opt-out/config.toml"; + string memory expectedCallData = + "0x174dea710000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000174000000000000000000000000000000000000000000000000000000000000019800000000000000000000000000000000000000000000000000000000000002b400000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000003f0000000000000000000000000000000000000000000000000000000000000040c0000000000000000000000000000000000000000000000000000000000000528000000000000000000000000000000000000000000000000000000000000054400000000000000000000000000000000000000000000000000000000000006600000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001544e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000146466cfa0570000000000000000000000000000000000000000000000000000000000000000d7c04619bfc311a92d20723f9d08baaba18c3c8c7dcd85736bf66b85f59c37f6000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000013d26080604052348015600e575f80fd5b5060156019565b60d4565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101560d2575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6112f1806100e15f395ff3fe608060405260043610610096575f3560e01c80637dfbd04911610066578063b87ea8d41161004c578063b87ea8d414610313578063c4d66de814610327578063d61a398b14610346575f80fd5b80637dfbd049146102dd5780637fc81bb7146102f4575f80fd5b80630a7617b3146101dd5780630c0544a3146101fe578063394d27311461026057806354fd4d5014610288575f80fd5b366101d9577fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455c6100f3576040517f17617f6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b337342000000000000000000000000000000000000111480159061012b57503373420000000000000000000000000000000000001914155b801561014b57503373420000000000000000000000000000000000001a14155b801561016b57503373420000000000000000000000000000000000001b14155b156101a2576040517f9dcde10900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405134815233907f2ccfc58c2cef4ee590b5f16be0548cc54afc12e1c66a67b362b7d640fd16bb2d9060200160405180910390a2005b5f80fd5b3480156101e8575f80fd5b506101fc6101f7366004610f4b565b61039c565b005b348015610209575f80fd5b5060015461023a9070010000000000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561026b575f80fd5b5060015461023a906fffffffffffffffffffffffffffffffff1681565b348015610293575f80fd5b506102d06040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516102579190610f66565b3480156102e8575f80fd5b5061023a6301e1338081565b3480156102ff575f80fd5b506101fc61030e366004610fb9565b61055e565b34801561031e575f80fd5b506101fc610706565b348015610332575f80fd5b506101fc610341366004610f4b565b610aea565b348015610351575f80fd5b505f546103779062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610257565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041d9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610481576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166104ce576040517f99c6ec0800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff85161790945560408051949093049091168084526020840191909152917f16417cc372deec0caee5f52e2ad77a5f07b4591fd56b4ff31b6e20f817d4daeb91015b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105df9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610643576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6301e133806fffffffffffffffffffffffffffffffff82161115610693576040517f30b9f35e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546fffffffffffffffffffffffffffffffff8381167001000000000000000000000000000000008181028385161790945560408051949093049091168084526020840191909152917f4492086b630ed3846eec0979dd87a71c814ceb1c6dab80ab81e3450b21e4de289101610552565b60015461073b906fffffffffffffffffffffffffffffffff700100000000000000000000000000000000820481169116611030565b6fffffffffffffffffffffffffffffffff16421015610786576040517f1e4a9f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016426fffffffffffffffffffffffffffffffff161781556107cb90610ce0565b5f6107e9734200000000000000000000000000000000000011610d06565b90505f610809734200000000000000000000000000000000000019610d06565b90505f61082973420000000000000000000000000000000000001a610d06565b90505f61084973420000000000000000000000000000000000001b610d06565b90506108545f610ce0565b5f82826108618688611060565b61086b9190611060565b6108759190611060565b9050805f036108b0576040517fc8972e5200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517f54e7f42d000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101859052606481018690526201000090910473ffffffffffffffffffffffffffffffffffffffff16906354e7f42d906084015f60405180830381865afa158015610936573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261097b9190810190611118565b905080515f036109b7576040517f763970d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b8251811015610a6e575f8382815181106109d6576109d66111e7565b60200260200101515f015190505f8483815181106109f6576109f66111e7565b6020026020010151602001519050805f03610a12575050610a66565b5f610a1d8383610f03565b905080610a56576040517fd68d1b1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a608286611060565b94505050505b6001016109ba565b50828114610aa8576040517f9c01eac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f73f9a13241a1848ec157967f3a85601709353e616f1f2605d818c0f2d21774df8284604051610ad9929190611214565b60405180910390a150505050505050565b5f54610100900460ff1615808015610b0857505f54600160ff909116105b80610b215750303b158015610b2157505f5460ff166001145b610bb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610c0d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff851602179055600180546fffffffffffffffffffffffffffffffff1672015180000000000000000000000000000000001790558015610cdc575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200161055"; + + MultisigTask multisigTask = new RevenueShareV100UpgradePath(); + address rootSafe = address(0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A); // ProxyAdminOwner + + address[] memory allSafes = MultisigTaskTestHelper.getAllSafes(rootSafe); + (Action[] memory actions, uint256[] memory allOriginalNonces) = + _setupAndSimulate(taskConfigFilePath, 23434662, "mainnet", multisigTask, allSafes); + _assertCallDataMatches(multisigTask, actions, allSafes, allOriginalNonces, expectedCallData); */ + + // TODO: Generate correct expectedDataToSign values for opt-out scenario + // string[] memory expectedDataToSign = new string[](2); + // // Foundation + // expectedDataToSign[0] = + // "0x19010c3aeb5e4f7a3efb6e901e30efdb0a0c0b45bb08b72b78ef5d15bb4b6a3cef6b6b0e743dc88e22c3fef3c4ea52e7b8c42fd7a4f1f5c83dd9e9871b8c9bfe0c8"; + // // Security Council + // expectedDataToSign[1] = + // "0x1901b9d88d3c2db5bb5b8a0c1a2d8f6ac6c48e9ec4f2c8b1d8f6ac6c48e9ec4f2c8b1d8a9f2b3c4d7e8f9a0b1c2d3e4f5678901234567890abcdef1234567890abcdef"; + // _assertDataToSignNestedMultisig(multisigTask, actions, expectedDataToSign, MULTICALL3_ADDRESS, rootSafe); + } + /// @notice Expected call data and data to sign generated by manually running the GnosisSafeRotateSigner at block 9264006 on sepolia using script: /// forge script GnosisSafeRotateSigner --sig "simulate(string)" test/tasks/example/sep/016-gnosis-safe-remove-owner/config.toml --rpc-url sepolia --fork-block-number 9264006 -vv function testRegressionCallDataMatches_GnosisSafeRotateSigner() public { diff --git a/test/tasks/example/eth/017-revenue-share-upgrade-opt-out/.env b/test/tasks/example/eth/017-revenue-share-upgrade-opt-out/.env new file mode 100644 index 0000000000..be0c0bdcfe --- /dev/null +++ b/test/tasks/example/eth/017-revenue-share-upgrade-opt-out/.env @@ -0,0 +1,3 @@ +TENDERLY_GAS=15000000 +FORK_BLOCK_NUMBER=23434662 +NESTED_SAFE_NAME_DEPTH_1=foundation \ No newline at end of file diff --git a/test/tasks/example/eth/017-revenue-share-upgrade-opt-out/config.toml b/test/tasks/example/eth/017-revenue-share-upgrade-opt-out/config.toml new file mode 100644 index 0000000000..2bd40a4548 --- /dev/null +++ b/test/tasks/example/eth/017-revenue-share-upgrade-opt-out/config.toml @@ -0,0 +1,27 @@ +templateName = "RevenueShareV100UpgradePath" + +# Revenue Share Configuration +optInRevenueShare = false + +# Portal and deployment configuration +portal = "0xbEb5Fc579115071764c7423A4f12eDde41f106Ed" # OptimismPortal address +saltSeed = "DeploymentSalt" # Deployment salt +deploymentGasLimit = 1000000 + +# Vaults Configuration +baseFeeVaultWithdrawalNetwork = 0 +baseFeeVaultRecipient = "0x3333333333333333333333333333333333333333" +baseFeeVaultMinWithdrawalAmount = "1000000000000000000" +l1FeeVaultWithdrawalNetwork = 0 +l1FeeVaultRecipient = "0x4444444444444444444444444444444444444444" +l1FeeVaultMinWithdrawalAmount = "1000000000000000000" +sequencerFeeVaultWithdrawalNetwork = 0 +sequencerFeeVaultRecipient = "0x5555555555555555555555555555555555555555" +sequencerFeeVaultMinWithdrawalAmount = "1000000000000000000" +operatorFeeVaultWithdrawalNetwork = 0 +operatorFeeVaultRecipient = "0x6666666666666666666666666666666666666666" +operatorFeeVaultMinWithdrawalAmount = "1000000000000000000" + +[addresses] +ProxyAdminOwner = "0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A" +OptimismPortal = "0xbEb5Fc579115071764c7423A4f12eDde41f106Ed" \ No newline at end of file diff --git a/test/template/RevenueShareUpgradePath.t.sol b/test/template/RevenueShareUpgradePath.t.sol index 0906f42cbf..c1873bb757 100644 --- a/test/template/RevenueShareUpgradePath.t.sol +++ b/test/template/RevenueShareUpgradePath.t.sol @@ -175,7 +175,7 @@ contract RevenueShareUpgradePathTest is Test { function testOptOutRevenueShare() public { // Create a non-opt-in config - string memory nonOptInConfig = _createNonOptInConfig(); + string memory configPath = "test/tasks/example/eth/017-revenue-share-upgrade-opt-out/config.toml"; // Step 1: Run simulate to prepare everything and get the actions ( @@ -184,7 +184,7 @@ contract RevenueShareUpgradePathTest is Test { , , address rootSafe - ) = template.simulate(nonOptInConfig, new address[](0)); + ) = template.simulate(configPath, new address[](0)); // Verify we got the expected safe and action count assertEq(rootSafe, PROXY_ADMIN_OWNER, "Root safe should be ProxyAdminOwner"); @@ -262,39 +262,6 @@ contract RevenueShareUpgradePathTest is Test { // Step 9: Verify the portal calls _verifyNonOptInPortalCalls(actions); - - // Clean up the temporary file - vm.removeFile(nonOptInConfig); - } - - function _createNonOptInConfig() internal returns (string memory) { - string memory config = string.concat( - "templateName = \"RevenueShareV100UpgradePath\"\n", - "optInRevenueShare = false\n", - "portal = \"0xbEb5Fc579115071764c7423A4f12eDde41f106Ed\"\n", - "saltSeed = \"DeploymentSalt\"\n", - "deploymentGasLimit = 1000000\n", - "baseFeeVaultWithdrawalNetwork = 0\n", - "baseFeeVaultRecipient = \"0x3333333333333333333333333333333333333333\"\n", - "baseFeeVaultMinWithdrawalAmount = \"1000000000000000000\"\n", - "l1FeeVaultWithdrawalNetwork = 0\n", - "l1FeeVaultRecipient = \"0x4444444444444444444444444444444444444444\"\n", - "l1FeeVaultMinWithdrawalAmount = \"1000000000000000000\"\n", - "sequencerFeeVaultWithdrawalNetwork = 0\n", - "sequencerFeeVaultRecipient = \"0x5555555555555555555555555555555555555555\"\n", - "sequencerFeeVaultMinWithdrawalAmount = \"1000000000000000000\"\n", - "operatorFeeVaultWithdrawalNetwork = 0\n", - "operatorFeeVaultRecipient = \"0x6666666666666666666666666666666666666666\"\n", - "operatorFeeVaultMinWithdrawalAmount = \"1000000000000000000\"\n", - "\n", - "[addresses]\n", - "ProxyAdminOwner = \"0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A\"\n", - "OptimismPortal = \"0xbEb5Fc579115071764c7423A4f12eDde41f106Ed\"\n" - ); - - string memory path = "test/tasks/mock/configs/RevenueShareNonOptIn.toml"; - vm.writeFile(path, config); - return path; } function _verifyNonOptInPortalCalls(Action[] memory actions) internal pure { From d0a501f2f3ae4aef112d3f55965080167efd1456 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Thu, 2 Oct 2025 17:09:00 -0300 Subject: [PATCH 10/52] fix: regression test --- test/tasks/Regression.t.sol | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/test/tasks/Regression.t.sol b/test/tasks/Regression.t.sol index 6d298de917..00ed385aa3 100644 --- a/test/tasks/Regression.t.sol +++ b/test/tasks/Regression.t.sol @@ -895,28 +895,26 @@ contract RegressionTest is Test { /// Simulate from task directory (test/tasks/example/eth/017-revenue-share-upgrade-opt-out/config.toml) with: /// just --dotenv-path $(pwd)/.env --justfile ../../../../../src/improvements/justfile simulate (foundation|council) function testRegressionCallDataMatches_RevenueShareV100UpgradePathOptOut() public { - // TODO: Fix - /* string memory taskConfigFilePath = "test/tasks/example/eth/017-revenue-share-upgrade-opt-out/config.toml"; + string memory taskConfigFilePath = "test/tasks/example/eth/017-revenue-share-upgrade-opt-out/config.toml"; string memory expectedCallData = - "0x174dea710000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000174000000000000000000000000000000000000000000000000000000000000019800000000000000000000000000000000000000000000000000000000000002b400000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000003f0000000000000000000000000000000000000000000000000000000000000040c0000000000000000000000000000000000000000000000000000000000000528000000000000000000000000000000000000000000000000000000000000054400000000000000000000000000000000000000000000000000000000000006600000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001544e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000146466cfa0570000000000000000000000000000000000000000000000000000000000000000d7c04619bfc311a92d20723f9d08baaba18c3c8c7dcd85736bf66b85f59c37f6000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000013d26080604052348015600e575f80fd5b5060156019565b60d4565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101560d2575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6112f1806100e15f395ff3fe608060405260043610610096575f3560e01c80637dfbd04911610066578063b87ea8d41161004c578063b87ea8d414610313578063c4d66de814610327578063d61a398b14610346575f80fd5b80637dfbd049146102dd5780637fc81bb7146102f4575f80fd5b80630a7617b3146101dd5780630c0544a3146101fe578063394d27311461026057806354fd4d5014610288575f80fd5b366101d9577fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455c6100f3576040517f17617f6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b337342000000000000000000000000000000000000111480159061012b57503373420000000000000000000000000000000000001914155b801561014b57503373420000000000000000000000000000000000001a14155b801561016b57503373420000000000000000000000000000000000001b14155b156101a2576040517f9dcde10900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405134815233907f2ccfc58c2cef4ee590b5f16be0548cc54afc12e1c66a67b362b7d640fd16bb2d9060200160405180910390a2005b5f80fd5b3480156101e8575f80fd5b506101fc6101f7366004610f4b565b61039c565b005b348015610209575f80fd5b5060015461023a9070010000000000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561026b575f80fd5b5060015461023a906fffffffffffffffffffffffffffffffff1681565b348015610293575f80fd5b506102d06040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516102579190610f66565b3480156102e8575f80fd5b5061023a6301e1338081565b3480156102ff575f80fd5b506101fc61030e366004610fb9565b61055e565b34801561031e575f80fd5b506101fc610706565b348015610332575f80fd5b506101fc610341366004610f4b565b610aea565b348015610351575f80fd5b505f546103779062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610257565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041d9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610481576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166104ce576040517f99c6ec0800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff85161790945560408051949093049091168084526020840191909152917f16417cc372deec0caee5f52e2ad77a5f07b4591fd56b4ff31b6e20f817d4daeb91015b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105df9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610643576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6301e133806fffffffffffffffffffffffffffffffff82161115610693576040517f30b9f35e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546fffffffffffffffffffffffffffffffff8381167001000000000000000000000000000000008181028385161790945560408051949093049091168084526020840191909152917f4492086b630ed3846eec0979dd87a71c814ceb1c6dab80ab81e3450b21e4de289101610552565b60015461073b906fffffffffffffffffffffffffffffffff700100000000000000000000000000000000820481169116611030565b6fffffffffffffffffffffffffffffffff16421015610786576040517f1e4a9f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016426fffffffffffffffffffffffffffffffff161781556107cb90610ce0565b5f6107e9734200000000000000000000000000000000000011610d06565b90505f610809734200000000000000000000000000000000000019610d06565b90505f61082973420000000000000000000000000000000000001a610d06565b90505f61084973420000000000000000000000000000000000001b610d06565b90506108545f610ce0565b5f82826108618688611060565b61086b9190611060565b6108759190611060565b9050805f036108b0576040517fc8972e5200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517f54e7f42d000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101859052606481018690526201000090910473ffffffffffffffffffffffffffffffffffffffff16906354e7f42d906084015f60405180830381865afa158015610936573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261097b9190810190611118565b905080515f036109b7576040517f763970d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b8251811015610a6e575f8382815181106109d6576109d66111e7565b60200260200101515f015190505f8483815181106109f6576109f66111e7565b6020026020010151602001519050805f03610a12575050610a66565b5f610a1d8383610f03565b905080610a56576040517fd68d1b1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a608286611060565b94505050505b6001016109ba565b50828114610aa8576040517f9c01eac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f73f9a13241a1848ec157967f3a85601709353e616f1f2605d818c0f2d21774df8284604051610ad9929190611214565b60405180910390a150505050505050565b5f54610100900460ff1615808015610b0857505f54600160ff909116105b80610b215750303b158015610b2157505f5460ff166001145b610bb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610c0d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff851602179055600180546fffffffffffffffffffffffffffffffff1672015180000000000000000000000000000000001790558015610cdc575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200161055"; - + "0x174dea710000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000174000000000000000000000000000000000000000000000000000000000000019800000000000000000000000000000000000000000000000000000000000002b400000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000003f0000000000000000000000000000000000000000000000000000000000000040c0000000000000000000000000000000000000000000000000000000000000528000000000000000000000000000000000000000000000000000000000000054400000000000000000000000000000000000000000000000000000000000006600000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001544e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000146466cfa0570000000000000000000000000000000000000000000000000000000000000000d7c04619bfc311a92d20723f9d08baaba18c3c8c7dcd85736bf66b85f59c37f6000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000013d26080604052348015600e575f80fd5b5060156019565b60d4565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101560d2575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6112f1806100e15f395ff3fe608060405260043610610096575f3560e01c80637dfbd04911610066578063b87ea8d41161004c578063b87ea8d414610313578063c4d66de814610327578063d61a398b14610346575f80fd5b80637dfbd049146102dd5780637fc81bb7146102f4575f80fd5b80630a7617b3146101dd5780630c0544a3146101fe578063394d27311461026057806354fd4d5014610288575f80fd5b366101d9577fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455c6100f3576040517f17617f6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b337342000000000000000000000000000000000000111480159061012b57503373420000000000000000000000000000000000001914155b801561014b57503373420000000000000000000000000000000000001a14155b801561016b57503373420000000000000000000000000000000000001b14155b156101a2576040517f9dcde10900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405134815233907f2ccfc58c2cef4ee590b5f16be0548cc54afc12e1c66a67b362b7d640fd16bb2d9060200160405180910390a2005b5f80fd5b3480156101e8575f80fd5b506101fc6101f7366004610f4b565b61039c565b005b348015610209575f80fd5b5060015461023a9070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561026b575f80fd5b5060015461023a906fffffffffffffffffffffffffffffffff1681565b348015610293575f80fd5b506102d06040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516102579190610f66565b3480156102e8575f80fd5b5061023a6301e1338081565b3480156102ff575f80fd5b506101fc61030e366004610fb9565b61055e565b34801561031e575f80fd5b506101fc610706565b348015610332575f80fd5b506101fc610341366004610f4b565b610aea565b348015610351575f80fd5b505f546103779062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610257565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041d9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610481576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166104ce576040517f99c6ec0800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff85161790945560408051949093049091168084526020840191909152917f16417cc372deec0caee5f52e2ad77a5f07b4591fd56b4ff31b6e20f817d4daeb91015b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105df9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610643576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6301e133806fffffffffffffffffffffffffffffffff82161115610693576040517f30b9f35e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546fffffffffffffffffffffffffffffffff8381167001000000000000000000000000000000008181028385161790945560408051949093049091168084526020840191909152917f4492086b630ed3846eec0979dd87a71c814ceb1c6dab80ab81e3450b21e4de289101610552565b60015461073b906fffffffffffffffffffffffffffffffff700100000000000000000000000000000000820481169116611030565b6fffffffffffffffffffffffffffffffff16421015610786576040517f1e4a9f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016426fffffffffffffffffffffffffffffffff161781556107cb90610ce0565b5f6107e9734200000000000000000000000000000000000011610d06565b90505f610809734200000000000000000000000000000000000019610d06565b90505f61082973420000000000000000000000000000000000001a610d06565b90505f61084973420000000000000000000000000000000000001b610d06565b90506108545f610ce0565b5f82826108618688611060565b61086b9190611060565b6108759190611060565b9050805f036108b0576040517fc8972e5200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517f54e7f42d000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101859052606481018690526201000090910473ffffffffffffffffffffffffffffffffffffffff16906354e7f42d906084015f60405180830381865afa158015610936573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261097b9190810190611118565b905080515f036109b7576040517f763970d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b8251811015610a6e575f8382815181106109d6576109d66111e7565b60200260200101515f015190505f8483815181106109f6576109f66111e7565b6020026020010151602001519050805f03610a12575050610a66565b5f610a1d8383610f03565b905080610a56576040517fd68d1b1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a608286611060565b94505050505b6001016109ba565b50828114610aa8576040517f9c01eac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f73f9a13241a1848ec157967f3a85601709353e616f1f2605d818c0f2d21774df8284604051610ad9929190611214565b60405180910390a150505050505050565b5f54610100900460ff1615808015610b0857505f54600160ff909116105b80610b215750303b158015610b2157505f5460ff166001145b610bb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610c0d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff851602179055600180546fffffffffffffffffffffffffffffffff1672015180000000000000000000000000000000001790558015610cdc575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610552565b5050565b807fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455d50565b5f60018273ffffffffffffffffffffffffffffffffffffffff166382356d8a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d7691906112af565b6001811115610d8757610d87611282565b14610dbe576040517fb4726cbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff166366d003ac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e429190610fe8565b73ffffffffffffffffffffffffffffffffffffffff1614610e8f576040517fc3380cef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610ed9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610efd91906112cd565b92915050565b5f610f0f835a84610f16565b9392505050565b5f805f805f858888f1949350505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f48575f80fd5b50565b5f60208284031215610f5b575f80fd5b8135610f0f81610f27565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f60208284031215610fc9575f80fd5b81356fffffffffffffffffffffffffffffffff81168114610f0f575f80fd5b5f60208284031215610ff8575f80fd5b8151610f0f81610f27565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6fffffffffffffffffffffffffffffffff81811683821601908082111561105957611059611003565b5092915050565b80820180821115610efd57610efd611003565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156110c3576110c3611073565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561111057611110611073565b604052919050565b5f6020808385031215611129575f80fd5b825167ffffffffffffffff80821115611140575f80fd5b818501915085601f830112611153575f80fd5b81518181111561116557611165611073565b611173848260051b016110c9565b818152848101925060069190911b830184019087821115611192575f80fd5b928401925b818410156111dc57604084890312156111ae575f80fd5b6111b66110a0565b84516111c181610f27565b81528486015186820152835260409093019291840191611197565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604080825283518282018190525f91906020906060850190828801855b8281101561126c578151805173ffffffffffffffffffffffffffffffffffffffff168552850151858501529285019290840190600101611231565b5050508093505050508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f602082840312156112bf575f80fd5b815160028110610f0f575f80fd5b5f602082840312156112dd575f80fd5b505191905056fea164736f6c6343000819000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000184e9e05c42000000000000000000000000420000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a44f1ef2860000000000000000000000006b0d0b5d65c13ed9ec80617772aee4d6c594a66e00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa0570000000000000000000000000000000000000000000000000000000000000000783aa8b3e401c8404e3eff9401ba29702719ddc0c0f69ec9ac77188bacea107300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9c60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a00000000000000000000000066666666666666666666666666666666666666660000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000104e9e05c42000000000000000000000000420000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000243659cfe60000000000000000000000001e2d5b3362d3b6726dd715284dc83faf7e6c27ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001144e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000106466cfa0570000000000000000000000000000000000000000000000000000000000000000204cb368f75f2d6cade61b62cb318bffd2bd31a57a3f86dff75f5bfd9d2dd14900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000fcb60e060405234801561001057600080fd5b50604051610f6b380380610f6b83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e466101256000396000818161028f0152610a0101526000818160f401526109910152600081816102c30152610a550152610e466000f3fe6080604052600436106100d65760003560e01c806382356d8a1161007f57806385b5b14d1161005957806385b5b14d1461025d578063d0e12f901461027d578063d3e5792b146102b1578063d4ff9218146102e557600080fd5b806382356d8a146102105780638312f1491461023257806384411d651461024757600080fd5b80633ccfd60b116100b05780633ccfd60b1461018257806354fd4d50146101a557806366d003ac146101fb57600080fd5b80630d9019e1146100e2578063307f2962146101405780633bbed4a01461016257600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506101167f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014c57600080fd5b5061016061015b366004610c14565b6102fa565b005b34801561016e57600080fd5b5061016061017d366004610c5a565b6104c2565b34801561018e57600080fd5b50610197610642565b604051908152602001610137565b3480156101b157600080fd5b506101ee6040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b6040516101379190610c77565b34801561020757600080fd5b5061011661094a565b34801561021c57600080fd5b506102256109b3565b6040516101379190610d54565b34801561023e57600080fd5b50610197610a23565b34801561025357600080fd5b5061019760005481565b34801561026957600080fd5b50610160610278366004610d68565b610a77565b34801561028957600080fd5b506102257f000000000000000000000000000000000000000000000000000000000000000081565b3480156102bd57600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f157600080fd5b50610116610bdd565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610359573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037d9190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103e1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043d5761043d610cea565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104b69083908590610d9e565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610521573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105459190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105a9576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e459391016104b6565b600061064c610a23565b471015610706576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b4790508060008082825461071a9190610db9565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161074a61094a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee816107a861094a565b336107b16109b3565b6040516107c19493929190610df8565b60405180910390a160016107d36109b3565b60018111156107e4576107e4610cea565b0361088f5760006107fc6107f661094a565b83610bec565b90508061088b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106fd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac826108b261094a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561092e57600080fd5b505af1158015610942573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561098e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109fe575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a52575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ad6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afa9190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b5e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e420391016104b6565b6000610be761094a565b905090565b6000610bf9835a84610c00565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610c2657600080fd5b813560028110610bf957600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c5757600080fd5b50565b600060208284031215610c6c57600080fd5b8135610bf981610c35565b600060208083528351808285015260005b81811015610ca457858101830151858201604001528201610c88565b81811115610cb6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d50577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d628284610d19565b92915050565b600060208284031215610d7a57600080fd5b5035919050565b600060208284031215610d9357600080fd5b8151610bf981610c35565b60408101610dac8285610d19565b610bf96020830184610d19565b60008219821115610df3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e306060830184610d19565b9594505050505056fea164736f6c634300080f000a00000000000000000000000055555555555555555555555555555555555555550000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000104e9e05c420000000000000000000000004200000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000243659cfe60000000000000000000000002ca727314d2c6c683998ce385c2853923719aea10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa05700000000000000000000000000000000000000000000000000000000000000007a2bde9cfb7f80a4198677bdf885a43dc36c598688294f694cf64429164f140000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9c60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a00000000000000000000000033333333333333333333333333333333333333330000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000104e9e05c420000000000000000000000004200000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000243659cfe600000000000000000000000063e87ea1598d7b59b88685b56be6e5d7b2e11ed90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa05700000000000000000000000000000000000000000000000000000000000000004ac8e160bee0acc95b22d1744fa9cc7068869945397f78a77ed68ef8ae1d87a900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9c60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a00000000000000000000000044444444444444444444444444444444444444440000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000104e9e05c42000000000000000000000000420000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000243659cfe6000000000000000000000000ad552e53be11c5fc03a95d8be3bb72ab675e0ddb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; MultisigTask multisigTask = new RevenueShareV100UpgradePath(); - address rootSafe = address(0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A); // ProxyAdminOwner + address rootSafe = address(0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A); // L1PAO + address securityCouncilChildMultisig = address(0xc2819DC788505Aac350142A7A707BF9D03E3Bd03); + address[] memory allSafes = MultisigTaskTestHelper.getAllSafes(rootSafe, securityCouncilChildMultisig); - address[] memory allSafes = MultisigTaskTestHelper.getAllSafes(rootSafe); (Action[] memory actions, uint256[] memory allOriginalNonces) = _setupAndSimulate(taskConfigFilePath, 23434662, "mainnet", multisigTask, allSafes); - _assertCallDataMatches(multisigTask, actions, allSafes, allOriginalNonces, expectedCallData); */ - - // TODO: Generate correct expectedDataToSign values for opt-out scenario - // string[] memory expectedDataToSign = new string[](2); - // // Foundation - // expectedDataToSign[0] = - // "0x19010c3aeb5e4f7a3efb6e901e30efdb0a0c0b45bb08b72b78ef5d15bb4b6a3cef6b6b0e743dc88e22c3fef3c4ea52e7b8c42fd7a4f1f5c83dd9e9871b8c9bfe0c8"; - // // Security Council - // expectedDataToSign[1] = - // "0x1901b9d88d3c2db5bb5b8a0c1a2d8f6ac6c48e9ec4f2c8b1d8f6ac6c48e9ec4f2c8b1d8a9f2b3c4d7e8f9a0b1c2d3e4f5678901234567890abcdef1234567890abcdef"; - // _assertDataToSignNestedMultisig(multisigTask, actions, expectedDataToSign, MULTICALL3_ADDRESS, rootSafe); + _assertCallDataMatches(multisigTask, actions, allSafes, allOriginalNonces, expectedCallData); + + string[] memory expectedDataToSign = new string[](2); + // Foundation + expectedDataToSign[0] = + "0x1901a4a9c312badf3fcaa05eafe5dc9bee8bd9316c78ee8b0bebe3115bb21b7326729360d32885899fbe960dd20fe0674956e984a753cbe9c9af7928c2b111c4516b"; + // Security Council + expectedDataToSign[1] = + "0x1901df53d510b56e539b90b369ef08fce3631020fbf921e3136ea5f8747c20bce9674b39cd390f38f5dd4f4e719d2dec428e4df67599f340ef3d2bb91da76211a60a"; + _assertDataToSignNestedMultisig(multisigTask, actions, expectedDataToSign, MULTICALL3_ADDRESS, rootSafe); } /// @notice Expected call data and data to sign generated by manually running the GnosisSafeRotateSigner at block 9264006 on sepolia using script: From d2696997f95f4a27e5648a38cc9dc3bab021e8b6 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Thu, 2 Oct 2025 17:22:19 -0300 Subject: [PATCH 11/52] chore: remove portal calls struct --- test/template/RevenueShareUpgradePath.t.sol | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/test/template/RevenueShareUpgradePath.t.sol b/test/template/RevenueShareUpgradePath.t.sol index c1873bb757..ff640fbf81 100644 --- a/test/template/RevenueShareUpgradePath.t.sol +++ b/test/template/RevenueShareUpgradePath.t.sol @@ -33,16 +33,6 @@ contract RevenueShareUpgradePathTest is Test { address internal constant CREATE2_DEPLOYER = 0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2; address internal constant FEE_SPLITTER = 0x420000000000000000000000000000000000002B; - // Track portal calls for verification - struct PortalCall { - address to; - uint256 value; - uint64 gasLimit; - bool isCreation; - bytes data; - } - PortalCall[] public recordedPortalCalls; - function _mockAndExpect(address _receiver, bytes memory _calldata, bytes memory _returned) internal { vm.mockCall(_receiver, _calldata, _returned); vm.expectCall(_receiver, _calldata); From 69db45ecc32f43e084b3024a5cf9e4a454421edb Mon Sep 17 00:00:00 2001 From: 0xchin Date: Thu, 2 Oct 2025 17:24:06 -0300 Subject: [PATCH 12/52] refactor: conventional test naming --- test/template/RevenueShareUpgradePath.t.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/template/RevenueShareUpgradePath.t.sol b/test/template/RevenueShareUpgradePath.t.sol index ff640fbf81..cdf89ee97e 100644 --- a/test/template/RevenueShareUpgradePath.t.sol +++ b/test/template/RevenueShareUpgradePath.t.sol @@ -44,7 +44,7 @@ contract RevenueShareUpgradePathTest is Test { template = new RevenueShareV100UpgradePath(); } - function testOptInRevenueShare() public { + function test_optInRevenueShare_succeeds() public { // Step 1: Run simulate to prepare everything and get the actions ( , @@ -163,7 +163,7 @@ contract RevenueShareUpgradePathTest is Test { assertEq(upgradeCalls, 5, "Should have 5 upgrade calls"); } - function testOptOutRevenueShare() public { + function test_optOutRevenueShare_succeeds() public { // Create a non-opt-in config string memory configPath = "test/tasks/example/eth/017-revenue-share-upgrade-opt-out/config.toml"; From b88760bf7ff66aaf822961757d3468f07476190c Mon Sep 17 00:00:00 2001 From: 0xchin Date: Thu, 2 Oct 2025 17:29:25 -0300 Subject: [PATCH 13/52] test: remove mock call from opt out scenario --- test/template/RevenueShareUpgradePath.t.sol | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/test/template/RevenueShareUpgradePath.t.sol b/test/template/RevenueShareUpgradePath.t.sol index cdf89ee97e..4ce8cec2e5 100644 --- a/test/template/RevenueShareUpgradePath.t.sol +++ b/test/template/RevenueShareUpgradePath.t.sol @@ -212,28 +212,21 @@ contract RevenueShareUpgradePathTest is Test { nonceBefore ); - // Step 5: Mock the portal to record calls instead of reverting - _mockAndExpect( - PORTAL, - abi.encodeWithSelector(IOptimismPortal2.depositTransaction.selector), - abi.encode() - ); - // Expect all portal calls for (uint i = 0; i < actions.length; i++) { vm.expectCall(PORTAL, actions[i].arguments); } - // Step 6: Prank owners to approve the transaction + // Step 5: Prank owners to approve the transaction for (uint256 i = 0; i < owners.length; i++) { vm.prank(owners[i]); safe.approveHash(txHash); } - // Step 7: Generate signatures after approval + // Step 6: Generate signatures after approval bytes memory signatures = Signatures.genPrevalidatedSignatures(owners); - // Step 8: Execute the transaction + // Step 7: Execute the transaction bool success = safe.execTransaction( template.multicallTarget(), 0, // value @@ -250,7 +243,7 @@ contract RevenueShareUpgradePathTest is Test { assertTrue(success, "Transaction should execute successfully"); assertEq(safe.nonce(), nonceBefore + 1, "Safe nonce should increment"); - // Step 9: Verify the portal calls + // Step 8: Verify the portal calls _verifyNonOptInPortalCalls(actions); } From 254c9c6a1ffdd581dc772c27152fec7d866b4d73 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Thu, 2 Oct 2025 17:39:24 -0300 Subject: [PATCH 14/52] refactor: reuse portal calls verifier function --- test/template/RevenueShareUpgradePath.t.sol | 59 +++++++-------------- 1 file changed, 20 insertions(+), 39 deletions(-) diff --git a/test/template/RevenueShareUpgradePath.t.sol b/test/template/RevenueShareUpgradePath.t.sol index 4ce8cec2e5..cadef9293c 100644 --- a/test/template/RevenueShareUpgradePath.t.sol +++ b/test/template/RevenueShareUpgradePath.t.sol @@ -29,6 +29,12 @@ contract RevenueShareUpgradePathTest is Test { address public constant PORTAL = 0xbEb5Fc579115071764c7423A4f12eDde41f106Ed; address public constant PROXY_ADMIN_OWNER = 0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A; + // Expected number of actions + uint256 public constant EXPECTED_DEPLOYMENTS_OPT_IN = 7; + uint256 public constant EXPECTED_UPGRADES_OPT_IN = 5; + uint256 public constant EXPECTED_DEPLOYMENTS_OPT_OUT = 5; + uint256 public constant EXPECTED_UPGRADES_OPT_OUT = 5; + // L2 predeploys address internal constant CREATE2_DEPLOYER = 0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2; address internal constant FEE_SPLITTER = 0x420000000000000000000000000000000000002B; @@ -56,7 +62,7 @@ contract RevenueShareUpgradePathTest is Test { // Verify we got the expected safe assertEq(rootSafe, PROXY_ADMIN_OWNER, "Root safe should be ProxyAdminOwner"); - assertEq(actions.length, 12, "Should have 12 actions for opt-in scenario"); + assertEq(actions.length, EXPECTED_DEPLOYMENTS_OPT_IN + EXPECTED_UPGRADES_OPT_IN, "Should have 12 actions for opt-in scenario"); // Step 2: Get the safe's owners IGnosisSafe safe = IGnosisSafe(rootSafe); @@ -131,41 +137,15 @@ contract RevenueShareUpgradePathTest is Test { // Step 8: Verify the portal calls - _verifyPortalCalls(actions); - } - - function _verifyPortalCalls(Action[] memory actions) internal pure { - - uint256 deploymentCalls = 0; - uint256 upgradeCalls = 0; - - for (uint i = 0; i < actions.length; i++) { - // Decode the depositTransaction parameters - bytes memory params = new bytes(actions[i].arguments.length - 4); - for (uint j = 0; j < params.length; j++) { - params[j] = actions[i].arguments[j + 4]; - } - (address to, , , , ) = - abi.decode(params, (address, uint256, uint64, bool, bytes)); - - if (to == CREATE2_DEPLOYER) { - deploymentCalls++; - } else { - upgradeCalls++; - } - } - - // For opt-in scenario, we expect: // - 7 deployments (L1Withdrawer, SCRevShareCalc, FeeSplitter, 4 vaults) // - 5 upgrades (4 vault proxies + 1 FeeSplitter upgrade) - assertEq(deploymentCalls, 7, "Should have 7 deployment calls"); - assertEq(upgradeCalls, 5, "Should have 5 upgrade calls"); + _verifyPortalCalls(actions, EXPECTED_DEPLOYMENTS_OPT_IN, EXPECTED_UPGRADES_OPT_IN); } function test_optOutRevenueShare_succeeds() public { - // Create a non-opt-in config - string memory configPath = "test/tasks/example/eth/017-revenue-share-upgrade-opt-out/config.toml"; + // Define the config path + configPath = "test/tasks/example/eth/017-revenue-share-upgrade-opt-out/config.toml"; // Step 1: Run simulate to prepare everything and get the actions ( @@ -178,7 +158,7 @@ contract RevenueShareUpgradePathTest is Test { // Verify we got the expected safe and action count assertEq(rootSafe, PROXY_ADMIN_OWNER, "Root safe should be ProxyAdminOwner"); - assertEq(actions.length, 10, "Should have 10 actions for non-opt-in scenario"); + assertEq(actions.length, EXPECTED_DEPLOYMENTS_OPT_OUT + EXPECTED_UPGRADES_OPT_OUT, "Should have 10 actions for non-opt-in scenario"); // Step 2: Get the safe's owners IGnosisSafe safe = IGnosisSafe(rootSafe); @@ -244,10 +224,13 @@ contract RevenueShareUpgradePathTest is Test { assertEq(safe.nonce(), nonceBefore + 1, "Safe nonce should increment"); // Step 8: Verify the portal calls - _verifyNonOptInPortalCalls(actions); + // For non-opt-in scenario: + // - 5 deployments (FeeSplitter + 4 vaults, no L1Withdrawer/SCRevShareCalc) + // - 5 upgrades (4 vault proxies + FeeSplitter) + _verifyPortalCalls(actions, EXPECTED_DEPLOYMENTS_OPT_OUT, EXPECTED_UPGRADES_OPT_OUT); } - function _verifyNonOptInPortalCalls(Action[] memory actions) internal pure { + function _verifyPortalCalls(Action[] memory actions, uint256 expectedDeployments, uint256 expectedUpgrades) internal pure { uint256 deploymentCalls = 0; uint256 upgradeCalls = 0; @@ -257,7 +240,8 @@ contract RevenueShareUpgradePathTest is Test { for (uint j = 0; j < params.length; j++) { params[j] = actions[i].arguments[j + 4]; } - (address to,,,,) = abi.decode(params, (address, uint256, uint64, bool, bytes)); + (address to, , , , ) = + abi.decode(params, (address, uint256, uint64, bool, bytes)); if (to == CREATE2_DEPLOYER) { deploymentCalls++; @@ -266,10 +250,7 @@ contract RevenueShareUpgradePathTest is Test { } } - // For non-opt-in scenario: - // - 5 deployments (FeeSplitter + 4 vaults, no L1Withdrawer/SCRevShareCalc) - // - 5 upgrades (4 vault proxies + FeeSplitter) - assertEq(deploymentCalls, 5, "Should have 5 deployment calls for non-opt-in"); - assertEq(upgradeCalls, 5, "Should have 5 upgrade calls for non-opt-in"); + assertEq(deploymentCalls, expectedDeployments, "Incorrect number of deployment calls"); + assertEq(upgradeCalls, expectedUpgrades, "Incorrect number of upgrade calls"); } } \ No newline at end of file From 7d20d2df4a379e6bb32880f5dbd9e23c869049d2 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Fri, 3 Oct 2025 14:15:26 -0300 Subject: [PATCH 15/52] test: expected calls with config data --- test/template/RevenueShareUpgradePath.t.sol | 131 +++++++++++++++++--- 1 file changed, 115 insertions(+), 16 deletions(-) diff --git a/test/template/RevenueShareUpgradePath.t.sol b/test/template/RevenueShareUpgradePath.t.sol index cadef9293c..4070f09166 100644 --- a/test/template/RevenueShareUpgradePath.t.sol +++ b/test/template/RevenueShareUpgradePath.t.sol @@ -19,6 +19,15 @@ interface IOptimismPortal2 { payable; } +interface ICreate2Deployer { + function deploy(uint256 _value, bytes32 _salt, bytes memory _code) external; +} + +interface IProxy { + function upgradeTo(address _implementation) external; + function upgradeToAndCall(address _implementation, bytes memory _data) external payable returns (bytes memory); +} + contract RevenueShareUpgradePathTest is Test { using stdStorage for StdStorage; @@ -103,22 +112,20 @@ contract RevenueShareUpgradePathTest is Test { abi.encode() ); - // Expect all portal calls - for (uint i = 0; i < actions.length; i++) { - vm.expectCall(PORTAL, actions[i].arguments); - } + // Step 6: Manually verify expected portal calls based on known config values + _verifyExpectedPortalCalls(actions); - // Step 6: Prank owners to approve the transaction + // Step 7: Prank owners to approve the transaction for (uint256 i = 0; i < owners.length; i++) { vm.prank(owners[i]); safe.approveHash(txHash); } - // Step 7: Generate signatures after approval + // Step 8: Generate signatures after approval bytes memory signatures = Signatures.genPrevalidatedSignatures(owners); - // Step 8: Execute the transaction + // Step 9: Execute the transaction bool success = safe.execTransaction( template.multicallTarget(), 0, // value @@ -136,7 +143,7 @@ contract RevenueShareUpgradePathTest is Test { assertEq(safe.nonce(), nonceBefore + 1, "Safe nonce should increment"); - // Step 8: Verify the portal calls + // Step 10: Verify the portal calls // For opt-in scenario, we expect: // - 7 deployments (L1Withdrawer, SCRevShareCalc, FeeSplitter, 4 vaults) // - 5 upgrades (4 vault proxies + 1 FeeSplitter upgrade) @@ -192,21 +199,19 @@ contract RevenueShareUpgradePathTest is Test { nonceBefore ); - // Expect all portal calls - for (uint i = 0; i < actions.length; i++) { - vm.expectCall(PORTAL, actions[i].arguments); - } + // Step 5: Manually verify expected portal calls based on known config values + _verifyExpectedPortalCalls(actions); - // Step 5: Prank owners to approve the transaction + // Step 6: Prank owners to approve the transaction for (uint256 i = 0; i < owners.length; i++) { vm.prank(owners[i]); safe.approveHash(txHash); } - // Step 6: Generate signatures after approval + // Step 7: Generate signatures after approval bytes memory signatures = Signatures.genPrevalidatedSignatures(owners); - // Step 7: Execute the transaction + // Step 8: Execute the transaction bool success = safe.execTransaction( template.multicallTarget(), 0, // value @@ -223,7 +228,7 @@ contract RevenueShareUpgradePathTest is Test { assertTrue(success, "Transaction should execute successfully"); assertEq(safe.nonce(), nonceBefore + 1, "Safe nonce should increment"); - // Step 8: Verify the portal calls + // Step 9: Verify the portal calls // For non-opt-in scenario: // - 5 deployments (FeeSplitter + 4 vaults, no L1Withdrawer/SCRevShareCalc) // - 5 upgrades (4 vault proxies + FeeSplitter) @@ -253,4 +258,98 @@ contract RevenueShareUpgradePathTest is Test { assertEq(deploymentCalls, expectedDeployments, "Incorrect number of deployment calls"); assertEq(upgradeCalls, expectedUpgrades, "Incorrect number of upgrade calls"); } + + /// @notice Manually construct and expect portal calls based on known config values + /// This ensures the template generates correct calldata, not just circular validation + function _verifyExpectedPortalCalls(Action[] memory actions) internal { + string memory config = vm.readFile(configPath); + uint64 gasLimit = uint64(vm.parseTomlUint(config, ".deploymentGasLimit")); + + uint256 deploymentCount; + uint256 upgradeCount; + + for (uint256 i = 0; i < actions.length; i++) { + bytes memory params = _extractParams(actions[i].arguments); + (address to, uint256 value, uint64 actualGasLimit, bool isCreation, bytes memory data) = + abi.decode(params, (address, uint256, uint64, bool, bytes)); + + assertEq(actions[i].target, PORTAL, "All actions should target the portal"); + _verifyCommonParams(value, actualGasLimit, gasLimit, isCreation, data); + + if (to == CREATE2_DEPLOYER) { + deploymentCount++; + _verifyDeploymentCall(to, gasLimit, data); + } else { + upgradeCount++; + _verifyUpgradeCall(to, gasLimit, data); + } + } + + assertGt(deploymentCount, 0, "Should have at least one deployment"); + assertGt(upgradeCount, 0, "Should have at least one upgrade"); + assertEq(deploymentCount + upgradeCount, actions.length, "All actions should be accounted for"); + } + + function _extractParams(bytes memory arguments) internal pure returns (bytes memory) { + bytes memory params = new bytes(arguments.length - 4); + for (uint256 j = 0; j < params.length; j++) { + params[j] = arguments[j + 4]; + } + return params; + } + + function _verifyCommonParams( + uint256 value, + uint64 actualGasLimit, + uint64 expectedGasLimit, + bool isCreation, + bytes memory data + ) internal pure { + require(value == 0, "All calls should have 0 value"); + require(actualGasLimit == expectedGasLimit, "Gas limit should match config"); + require(!isCreation, "Should not use creation flag"); + require(data.length > 0, "Should have calldata"); + } + + function _verifyDeploymentCall(address to, uint64 gasLimit, bytes memory data) internal { + vm.expectCall( + PORTAL, + abi.encodeCall(IOptimismPortal2.depositTransaction, (CREATE2_DEPLOYER, 0, gasLimit, false, data)) + ); + + bytes4 actualSelector; + assembly { + actualSelector := mload(add(data, 32)) + } + assertEq(actualSelector, ICreate2Deployer.deploy.selector, "Deployment should call CREATE2 deploy"); + } + + function _verifyUpgradeCall(address to, uint64 gasLimit, bytes memory data) internal { + vm.expectCall( + PORTAL, + abi.encodeCall(IOptimismPortal2.depositTransaction, (to, 0, gasLimit, false, data)) + ); + + _assertIsKnownVault(to); + + bytes4 selector; + assembly { + selector := mload(add(data, 32)) + } + assertTrue( + selector == IProxy.upgradeTo.selector || selector == IProxy.upgradeToAndCall.selector, + "Upgrade should call upgradeTo or upgradeToAndCall" + ); + } + + function _assertIsKnownVault(address to) internal pure { + require( + to == 0x420000000000000000000000000000000000002B || // L1_FEE_VAULT + to == 0x4200000000000000000000000000000000000011 || // SEQUENCER_FEE_VAULT + to == 0x4200000000000000000000000000000000000019 || // BASE_FEE_VAULT + to == 0x420000000000000000000000000000000000001A || // OPERATOR_FEE_VAULT + to == 0x420000000000000000000000000000000000001b, // L1_BLOCK_ATTRIBUTES + "Upgrade should target a known vault or L1Block contract" + ); + } } \ No newline at end of file From 9ac3368722ba6f64863910b4c3ac6f8f534eb43d Mon Sep 17 00:00:00 2001 From: 0xchin Date: Fri, 3 Oct 2025 14:28:04 -0300 Subject: [PATCH 16/52] style: formatting --- test/template/RevenueShareUpgradePath.t.sol | 82 +++++++++------------ 1 file changed, 35 insertions(+), 47 deletions(-) diff --git a/test/template/RevenueShareUpgradePath.t.sol b/test/template/RevenueShareUpgradePath.t.sol index 4070f09166..547a62d2bd 100644 --- a/test/template/RevenueShareUpgradePath.t.sol +++ b/test/template/RevenueShareUpgradePath.t.sol @@ -61,17 +61,15 @@ contract RevenueShareUpgradePathTest is Test { function test_optInRevenueShare_succeeds() public { // Step 1: Run simulate to prepare everything and get the actions - ( - , - Action[] memory actions, - , - , - address rootSafe - ) = template.simulate(configPath, new address[](0)); + (, Action[] memory actions,,, address rootSafe) = template.simulate(configPath, new address[](0)); // Verify we got the expected safe assertEq(rootSafe, PROXY_ADMIN_OWNER, "Root safe should be ProxyAdminOwner"); - assertEq(actions.length, EXPECTED_DEPLOYMENTS_OPT_IN + EXPECTED_UPGRADES_OPT_IN, "Should have 12 actions for opt-in scenario"); + assertEq( + actions.length, + EXPECTED_DEPLOYMENTS_OPT_IN + EXPECTED_UPGRADES_OPT_IN, + "Should have 12 actions for opt-in scenario" + ); // Step 2: Get the safe's owners IGnosisSafe safe = IGnosisSafe(rootSafe); @@ -106,11 +104,7 @@ contract RevenueShareUpgradePathTest is Test { ); // Step 5: Mock the portal to record calls instead of reverting - _mockAndExpect( - PORTAL, - abi.encodeWithSelector(IOptimismPortal2.depositTransaction.selector), - abi.encode() - ); + _mockAndExpect(PORTAL, abi.encodeWithSelector(IOptimismPortal2.depositTransaction.selector), abi.encode()); // Step 6: Manually verify expected portal calls based on known config values _verifyExpectedPortalCalls(actions); @@ -124,7 +118,6 @@ contract RevenueShareUpgradePathTest is Test { // Step 8: Generate signatures after approval bytes memory signatures = Signatures.genPrevalidatedSignatures(owners); - // Step 9: Execute the transaction bool success = safe.execTransaction( template.multicallTarget(), @@ -142,7 +135,6 @@ contract RevenueShareUpgradePathTest is Test { assertTrue(success, "Transaction should execute successfully"); assertEq(safe.nonce(), nonceBefore + 1, "Safe nonce should increment"); - // Step 10: Verify the portal calls // For opt-in scenario, we expect: // - 7 deployments (L1Withdrawer, SCRevShareCalc, FeeSplitter, 4 vaults) @@ -155,17 +147,15 @@ contract RevenueShareUpgradePathTest is Test { configPath = "test/tasks/example/eth/017-revenue-share-upgrade-opt-out/config.toml"; // Step 1: Run simulate to prepare everything and get the actions - ( - , - Action[] memory actions, - , - , - address rootSafe - ) = template.simulate(configPath, new address[](0)); + (, Action[] memory actions,,, address rootSafe) = template.simulate(configPath, new address[](0)); // Verify we got the expected safe and action count assertEq(rootSafe, PROXY_ADMIN_OWNER, "Root safe should be ProxyAdminOwner"); - assertEq(actions.length, EXPECTED_DEPLOYMENTS_OPT_OUT + EXPECTED_UPGRADES_OPT_OUT, "Should have 10 actions for non-opt-in scenario"); + assertEq( + actions.length, + EXPECTED_DEPLOYMENTS_OPT_OUT + EXPECTED_UPGRADES_OPT_OUT, + "Should have 10 actions for non-opt-in scenario" + ); // Step 2: Get the safe's owners IGnosisSafe safe = IGnosisSafe(rootSafe); @@ -235,18 +225,20 @@ contract RevenueShareUpgradePathTest is Test { _verifyPortalCalls(actions, EXPECTED_DEPLOYMENTS_OPT_OUT, EXPECTED_UPGRADES_OPT_OUT); } - function _verifyPortalCalls(Action[] memory actions, uint256 expectedDeployments, uint256 expectedUpgrades) internal pure { + function _verifyPortalCalls(Action[] memory actions, uint256 expectedDeployments, uint256 expectedUpgrades) + internal + pure + { uint256 deploymentCalls = 0; uint256 upgradeCalls = 0; - for (uint i = 0; i < actions.length; i++) { + for (uint256 i = 0; i < actions.length; i++) { // Decode the depositTransaction parameters bytes memory params = new bytes(actions[i].arguments.length - 4); - for (uint j = 0; j < params.length; j++) { + for (uint256 j = 0; j < params.length; j++) { params[j] = actions[i].arguments[j + 4]; } - (address to, , , , ) = - abi.decode(params, (address, uint256, uint64, bool, bytes)); + (address to,,,,) = abi.decode(params, (address, uint256, uint64, bool, bytes)); if (to == CREATE2_DEPLOYER) { deploymentCalls++; @@ -264,15 +256,15 @@ contract RevenueShareUpgradePathTest is Test { function _verifyExpectedPortalCalls(Action[] memory actions) internal { string memory config = vm.readFile(configPath); uint64 gasLimit = uint64(vm.parseTomlUint(config, ".deploymentGasLimit")); - + uint256 deploymentCount; uint256 upgradeCount; - + for (uint256 i = 0; i < actions.length; i++) { bytes memory params = _extractParams(actions[i].arguments); (address to, uint256 value, uint64 actualGasLimit, bool isCreation, bytes memory data) = abi.decode(params, (address, uint256, uint64, bool, bytes)); - + assertEq(actions[i].target, PORTAL, "All actions should target the portal"); _verifyCommonParams(value, actualGasLimit, gasLimit, isCreation, data); @@ -284,7 +276,7 @@ contract RevenueShareUpgradePathTest is Test { _verifyUpgradeCall(to, gasLimit, data); } } - + assertGt(deploymentCount, 0, "Should have at least one deployment"); assertGt(upgradeCount, 0, "Should have at least one upgrade"); assertEq(deploymentCount + upgradeCount, actions.length, "All actions should be accounted for"); @@ -313,10 +305,9 @@ contract RevenueShareUpgradePathTest is Test { function _verifyDeploymentCall(address to, uint64 gasLimit, bytes memory data) internal { vm.expectCall( - PORTAL, - abi.encodeCall(IOptimismPortal2.depositTransaction, (CREATE2_DEPLOYER, 0, gasLimit, false, data)) + PORTAL, abi.encodeCall(IOptimismPortal2.depositTransaction, (CREATE2_DEPLOYER, 0, gasLimit, false, data)) ); - + bytes4 actualSelector; assembly { actualSelector := mload(add(data, 32)) @@ -325,13 +316,10 @@ contract RevenueShareUpgradePathTest is Test { } function _verifyUpgradeCall(address to, uint64 gasLimit, bytes memory data) internal { - vm.expectCall( - PORTAL, - abi.encodeCall(IOptimismPortal2.depositTransaction, (to, 0, gasLimit, false, data)) - ); - + vm.expectCall(PORTAL, abi.encodeCall(IOptimismPortal2.depositTransaction, (to, 0, gasLimit, false, data))); + _assertIsKnownVault(to); - + bytes4 selector; assembly { selector := mload(add(data, 32)) @@ -344,12 +332,12 @@ contract RevenueShareUpgradePathTest is Test { function _assertIsKnownVault(address to) internal pure { require( - to == 0x420000000000000000000000000000000000002B || // L1_FEE_VAULT - to == 0x4200000000000000000000000000000000000011 || // SEQUENCER_FEE_VAULT - to == 0x4200000000000000000000000000000000000019 || // BASE_FEE_VAULT - to == 0x420000000000000000000000000000000000001A || // OPERATOR_FEE_VAULT - to == 0x420000000000000000000000000000000000001b, // L1_BLOCK_ATTRIBUTES + to == 0x420000000000000000000000000000000000002B // L1_FEE_VAULT + || to == 0x4200000000000000000000000000000000000011 // SEQUENCER_FEE_VAULT + || to == 0x4200000000000000000000000000000000000019 // BASE_FEE_VAULT + || to == 0x420000000000000000000000000000000000001A // OPERATOR_FEE_VAULT + || to == 0x420000000000000000000000000000000000001b, // L1_BLOCK_ATTRIBUTES "Upgrade should target a known vault or L1Block contract" ); } -} \ No newline at end of file +} From 5f6c01ab75a3c30d003dacfe541dab364dfd4985 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Fri, 3 Oct 2025 14:34:46 -0300 Subject: [PATCH 17/52] fix: correct variables naming --- test/template/RevenueShareUpgradePath.t.sol | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/test/template/RevenueShareUpgradePath.t.sol b/test/template/RevenueShareUpgradePath.t.sol index 547a62d2bd..e2f7b74c8f 100644 --- a/test/template/RevenueShareUpgradePath.t.sol +++ b/test/template/RevenueShareUpgradePath.t.sol @@ -47,6 +47,10 @@ contract RevenueShareUpgradePathTest is Test { // L2 predeploys address internal constant CREATE2_DEPLOYER = 0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2; address internal constant FEE_SPLITTER = 0x420000000000000000000000000000000000002B; + address internal constant SEQUENCER_FEE_VAULT = 0x4200000000000000000000000000000000000011; + address internal constant OPERATOR_FEE_VAULT = 0x420000000000000000000000000000000000001b; + address internal constant BASE_FEE_VAULT = 0x4200000000000000000000000000000000000019; + address internal constant L1_FEE_VAULT = 0x420000000000000000000000000000000000001A; function _mockAndExpect(address _receiver, bytes memory _calldata, bytes memory _returned) internal { vm.mockCall(_receiver, _calldata, _returned); @@ -331,13 +335,13 @@ contract RevenueShareUpgradePathTest is Test { } function _assertIsKnownVault(address to) internal pure { - require( - to == 0x420000000000000000000000000000000000002B // L1_FEE_VAULT - || to == 0x4200000000000000000000000000000000000011 // SEQUENCER_FEE_VAULT - || to == 0x4200000000000000000000000000000000000019 // BASE_FEE_VAULT - || to == 0x420000000000000000000000000000000000001A // OPERATOR_FEE_VAULT - || to == 0x420000000000000000000000000000000000001b, // L1_BLOCK_ATTRIBUTES - "Upgrade should target a known vault or L1Block contract" + assertTrue( + to == L1_FEE_VAULT // L1_FEE_VAULT + || to == SEQUENCER_FEE_VAULT // SEQUENCER_FEE_VAULT + || to == BASE_FEE_VAULT // BASE_FEE_VAULT + || to == OPERATOR_FEE_VAULT // OPERATOR_FEE_VAULT + || to == FEE_SPLITTER, // FEE_SPLITTER + "Upgrade should target a known vault or the fee splitter" ); } } From b1bf26dbc46603309817be0ef4bee6f451dc588b Mon Sep 17 00:00:00 2001 From: 0xchin Date: Fri, 3 Oct 2025 14:35:31 -0300 Subject: [PATCH 18/52] chore: remove redundant comments --- test/template/RevenueShareUpgradePath.t.sol | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/template/RevenueShareUpgradePath.t.sol b/test/template/RevenueShareUpgradePath.t.sol index e2f7b74c8f..b4d8927832 100644 --- a/test/template/RevenueShareUpgradePath.t.sol +++ b/test/template/RevenueShareUpgradePath.t.sol @@ -336,11 +336,11 @@ contract RevenueShareUpgradePathTest is Test { function _assertIsKnownVault(address to) internal pure { assertTrue( - to == L1_FEE_VAULT // L1_FEE_VAULT - || to == SEQUENCER_FEE_VAULT // SEQUENCER_FEE_VAULT - || to == BASE_FEE_VAULT // BASE_FEE_VAULT - || to == OPERATOR_FEE_VAULT // OPERATOR_FEE_VAULT - || to == FEE_SPLITTER, // FEE_SPLITTER + to == L1_FEE_VAULT + || to == SEQUENCER_FEE_VAULT + || to == BASE_FEE_VAULT + || to == OPERATOR_FEE_VAULT + || to == FEE_SPLITTER, "Upgrade should target a known vault or the fee splitter" ); } From 584d1e68a7fbccb33ac5dd421654e1c6d0b413d9 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Mon, 6 Oct 2025 16:11:03 -0300 Subject: [PATCH 19/52] fix: same task id for examples --- test/tasks/Regression.t.sol | 4 ++-- .../.env | 0 .../config.toml | 0 test/template/RevenueShareUpgradePath.t.sol | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename test/tasks/example/eth/{017-revenue-share-upgrade-opt-out => 019-revenue-share-upgrade-opt-out}/.env (100%) rename test/tasks/example/eth/{017-revenue-share-upgrade-opt-out => 019-revenue-share-upgrade-opt-out}/config.toml (100%) diff --git a/test/tasks/Regression.t.sol b/test/tasks/Regression.t.sol index f66e0e26cc..4822ae425f 100644 --- a/test/tasks/Regression.t.sol +++ b/test/tasks/Regression.t.sol @@ -893,10 +893,10 @@ contract RegressionTest is Test { } /// @notice Expected call data and data to sign generated by manually running the RevenueShareV100UpgradePath template at block 23434662 on mainnet (opt-out scenario). - /// Simulate from task directory (test/tasks/example/eth/017-revenue-share-upgrade-opt-out/config.toml) with: + /// Simulate from task directory (test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml) with: /// just --dotenv-path $(pwd)/.env --justfile ../../../../../src/improvements/justfile simulate (foundation|council) function testRegressionCallDataMatches_RevenueShareV100UpgradePathOptOut() public { - string memory taskConfigFilePath = "test/tasks/example/eth/017-revenue-share-upgrade-opt-out/config.toml"; + string memory taskConfigFilePath = "test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml"; string memory expectedCallData = "0x174dea710000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000174000000000000000000000000000000000000000000000000000000000000019800000000000000000000000000000000000000000000000000000000000002b400000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000003f0000000000000000000000000000000000000000000000000000000000000040c0000000000000000000000000000000000000000000000000000000000000528000000000000000000000000000000000000000000000000000000000000054400000000000000000000000000000000000000000000000000000000000006600000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001544e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000146466cfa0570000000000000000000000000000000000000000000000000000000000000000d7c04619bfc311a92d20723f9d08baaba18c3c8c7dcd85736bf66b85f59c37f6000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000013d26080604052348015600e575f80fd5b5060156019565b60d4565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101560d2575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6112f1806100e15f395ff3fe608060405260043610610096575f3560e01c80637dfbd04911610066578063b87ea8d41161004c578063b87ea8d414610313578063c4d66de814610327578063d61a398b14610346575f80fd5b80637dfbd049146102dd5780637fc81bb7146102f4575f80fd5b80630a7617b3146101dd5780630c0544a3146101fe578063394d27311461026057806354fd4d5014610288575f80fd5b366101d9577fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455c6100f3576040517f17617f6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b337342000000000000000000000000000000000000111480159061012b57503373420000000000000000000000000000000000001914155b801561014b57503373420000000000000000000000000000000000001a14155b801561016b57503373420000000000000000000000000000000000001b14155b156101a2576040517f9dcde10900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405134815233907f2ccfc58c2cef4ee590b5f16be0548cc54afc12e1c66a67b362b7d640fd16bb2d9060200160405180910390a2005b5f80fd5b3480156101e8575f80fd5b506101fc6101f7366004610f4b565b61039c565b005b348015610209575f80fd5b5060015461023a9070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561026b575f80fd5b5060015461023a906fffffffffffffffffffffffffffffffff1681565b348015610293575f80fd5b506102d06040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516102579190610f66565b3480156102e8575f80fd5b5061023a6301e1338081565b3480156102ff575f80fd5b506101fc61030e366004610fb9565b61055e565b34801561031e575f80fd5b506101fc610706565b348015610332575f80fd5b506101fc610341366004610f4b565b610aea565b348015610351575f80fd5b505f546103779062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610257565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041d9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610481576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166104ce576040517f99c6ec0800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff85161790945560408051949093049091168084526020840191909152917f16417cc372deec0caee5f52e2ad77a5f07b4591fd56b4ff31b6e20f817d4daeb91015b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105df9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610643576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6301e133806fffffffffffffffffffffffffffffffff82161115610693576040517f30b9f35e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546fffffffffffffffffffffffffffffffff8381167001000000000000000000000000000000008181028385161790945560408051949093049091168084526020840191909152917f4492086b630ed3846eec0979dd87a71c814ceb1c6dab80ab81e3450b21e4de289101610552565b60015461073b906fffffffffffffffffffffffffffffffff700100000000000000000000000000000000820481169116611030565b6fffffffffffffffffffffffffffffffff16421015610786576040517f1e4a9f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016426fffffffffffffffffffffffffffffffff161781556107cb90610ce0565b5f6107e9734200000000000000000000000000000000000011610d06565b90505f610809734200000000000000000000000000000000000019610d06565b90505f61082973420000000000000000000000000000000000001a610d06565b90505f61084973420000000000000000000000000000000000001b610d06565b90506108545f610ce0565b5f82826108618688611060565b61086b9190611060565b6108759190611060565b9050805f036108b0576040517fc8972e5200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517f54e7f42d000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101859052606481018690526201000090910473ffffffffffffffffffffffffffffffffffffffff16906354e7f42d906084015f60405180830381865afa158015610936573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261097b9190810190611118565b905080515f036109b7576040517f763970d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b8251811015610a6e575f8382815181106109d6576109d66111e7565b60200260200101515f015190505f8483815181106109f6576109f66111e7565b6020026020010151602001519050805f03610a12575050610a66565b5f610a1d8383610f03565b905080610a56576040517fd68d1b1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a608286611060565b94505050505b6001016109ba565b50828114610aa8576040517f9c01eac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f73f9a13241a1848ec157967f3a85601709353e616f1f2605d818c0f2d21774df8284604051610ad9929190611214565b60405180910390a150505050505050565b5f54610100900460ff1615808015610b0857505f54600160ff909116105b80610b215750303b158015610b2157505f5460ff166001145b610bb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610c0d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff851602179055600180546fffffffffffffffffffffffffffffffff1672015180000000000000000000000000000000001790558015610cdc575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610552565b5050565b807fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455d50565b5f60018273ffffffffffffffffffffffffffffffffffffffff166382356d8a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d7691906112af565b6001811115610d8757610d87611282565b14610dbe576040517fb4726cbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff166366d003ac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e429190610fe8565b73ffffffffffffffffffffffffffffffffffffffff1614610e8f576040517fc3380cef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610ed9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610efd91906112cd565b92915050565b5f610f0f835a84610f16565b9392505050565b5f805f805f858888f1949350505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f48575f80fd5b50565b5f60208284031215610f5b575f80fd5b8135610f0f81610f27565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f60208284031215610fc9575f80fd5b81356fffffffffffffffffffffffffffffffff81168114610f0f575f80fd5b5f60208284031215610ff8575f80fd5b8151610f0f81610f27565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6fffffffffffffffffffffffffffffffff81811683821601908082111561105957611059611003565b5092915050565b80820180821115610efd57610efd611003565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156110c3576110c3611073565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561111057611110611073565b604052919050565b5f6020808385031215611129575f80fd5b825167ffffffffffffffff80821115611140575f80fd5b818501915085601f830112611153575f80fd5b81518181111561116557611165611073565b611173848260051b016110c9565b818152848101925060069190911b830184019087821115611192575f80fd5b928401925b818410156111dc57604084890312156111ae575f80fd5b6111b66110a0565b84516111c181610f27565b81528486015186820152835260409093019291840191611197565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604080825283518282018190525f91906020906060850190828801855b8281101561126c578151805173ffffffffffffffffffffffffffffffffffffffff168552850151858501529285019290840190600101611231565b5050508093505050508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f602082840312156112bf575f80fd5b815160028110610f0f575f80fd5b5f602082840312156112dd575f80fd5b505191905056fea164736f6c6343000819000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000184e9e05c42000000000000000000000000420000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a44f1ef2860000000000000000000000006b0d0b5d65c13ed9ec80617772aee4d6c594a66e00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa0570000000000000000000000000000000000000000000000000000000000000000783aa8b3e401c8404e3eff9401ba29702719ddc0c0f69ec9ac77188bacea107300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9c60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a00000000000000000000000066666666666666666666666666666666666666660000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000104e9e05c42000000000000000000000000420000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000243659cfe60000000000000000000000001e2d5b3362d3b6726dd715284dc83faf7e6c27ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001144e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000106466cfa0570000000000000000000000000000000000000000000000000000000000000000204cb368f75f2d6cade61b62cb318bffd2bd31a57a3f86dff75f5bfd9d2dd14900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000fcb60e060405234801561001057600080fd5b50604051610f6b380380610f6b83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e466101256000396000818161028f0152610a0101526000818160f401526109910152600081816102c30152610a550152610e466000f3fe6080604052600436106100d65760003560e01c806382356d8a1161007f57806385b5b14d1161005957806385b5b14d1461025d578063d0e12f901461027d578063d3e5792b146102b1578063d4ff9218146102e557600080fd5b806382356d8a146102105780638312f1491461023257806384411d651461024757600080fd5b80633ccfd60b116100b05780633ccfd60b1461018257806354fd4d50146101a557806366d003ac146101fb57600080fd5b80630d9019e1146100e2578063307f2962146101405780633bbed4a01461016257600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506101167f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014c57600080fd5b5061016061015b366004610c14565b6102fa565b005b34801561016e57600080fd5b5061016061017d366004610c5a565b6104c2565b34801561018e57600080fd5b50610197610642565b604051908152602001610137565b3480156101b157600080fd5b506101ee6040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b6040516101379190610c77565b34801561020757600080fd5b5061011661094a565b34801561021c57600080fd5b506102256109b3565b6040516101379190610d54565b34801561023e57600080fd5b50610197610a23565b34801561025357600080fd5b5061019760005481565b34801561026957600080fd5b50610160610278366004610d68565b610a77565b34801561028957600080fd5b506102257f000000000000000000000000000000000000000000000000000000000000000081565b3480156102bd57600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f157600080fd5b50610116610bdd565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610359573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037d9190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103e1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043d5761043d610cea565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104b69083908590610d9e565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610521573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105459190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105a9576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e459391016104b6565b600061064c610a23565b471015610706576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b4790508060008082825461071a9190610db9565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161074a61094a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee816107a861094a565b336107b16109b3565b6040516107c19493929190610df8565b60405180910390a160016107d36109b3565b60018111156107e4576107e4610cea565b0361088f5760006107fc6107f661094a565b83610bec565b90508061088b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106fd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac826108b261094a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561092e57600080fd5b505af1158015610942573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561098e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109fe575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a52575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ad6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afa9190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b5e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e420391016104b6565b6000610be761094a565b905090565b6000610bf9835a84610c00565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610c2657600080fd5b813560028110610bf957600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c5757600080fd5b50565b600060208284031215610c6c57600080fd5b8135610bf981610c35565b600060208083528351808285015260005b81811015610ca457858101830151858201604001528201610c88565b81811115610cb6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d50577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d628284610d19565b92915050565b600060208284031215610d7a57600080fd5b5035919050565b600060208284031215610d9357600080fd5b8151610bf981610c35565b60408101610dac8285610d19565b610bf96020830184610d19565b60008219821115610df3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e306060830184610d19565b9594505050505056fea164736f6c634300080f000a00000000000000000000000055555555555555555555555555555555555555550000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000104e9e05c420000000000000000000000004200000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000243659cfe60000000000000000000000002ca727314d2c6c683998ce385c2853923719aea10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa05700000000000000000000000000000000000000000000000000000000000000007a2bde9cfb7f80a4198677bdf885a43dc36c598688294f694cf64429164f140000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9c60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a00000000000000000000000033333333333333333333333333333333333333330000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000104e9e05c420000000000000000000000004200000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000243659cfe600000000000000000000000063e87ea1598d7b59b88685b56be6e5d7b2e11ed90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa05700000000000000000000000000000000000000000000000000000000000000004ac8e160bee0acc95b22d1744fa9cc7068869945397f78a77ed68ef8ae1d87a900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9c60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a00000000000000000000000044444444444444444444444444444444444444440000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000104e9e05c42000000000000000000000000420000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000243659cfe6000000000000000000000000ad552e53be11c5fc03a95d8be3bb72ab675e0ddb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; MultisigTask multisigTask = new RevenueShareV100UpgradePath(); diff --git a/test/tasks/example/eth/017-revenue-share-upgrade-opt-out/.env b/test/tasks/example/eth/019-revenue-share-upgrade-opt-out/.env similarity index 100% rename from test/tasks/example/eth/017-revenue-share-upgrade-opt-out/.env rename to test/tasks/example/eth/019-revenue-share-upgrade-opt-out/.env diff --git a/test/tasks/example/eth/017-revenue-share-upgrade-opt-out/config.toml b/test/tasks/example/eth/019-revenue-share-upgrade-opt-out/config.toml similarity index 100% rename from test/tasks/example/eth/017-revenue-share-upgrade-opt-out/config.toml rename to test/tasks/example/eth/019-revenue-share-upgrade-opt-out/config.toml diff --git a/test/template/RevenueShareUpgradePath.t.sol b/test/template/RevenueShareUpgradePath.t.sol index b4d8927832..ad4605a496 100644 --- a/test/template/RevenueShareUpgradePath.t.sol +++ b/test/template/RevenueShareUpgradePath.t.sol @@ -148,7 +148,7 @@ contract RevenueShareUpgradePathTest is Test { function test_optOutRevenueShare_succeeds() public { // Define the config path - configPath = "test/tasks/example/eth/017-revenue-share-upgrade-opt-out/config.toml"; + configPath = "test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml"; // Step 1: Run simulate to prepare everything and get the actions (, Action[] memory actions,,, address rootSafe) = template.simulate(configPath, new address[](0)); From 741e0e7cb6e2a618e4aaf5d5cb7ea443d3f59712 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Mon, 6 Oct 2025 23:29:32 -0300 Subject: [PATCH 20/52] test: add integration tests (not working) --- .gitmodules | 3 + lib/interop-lib | 1 + .../integration/RevenueShareIntegration.t.sol | 293 ++++++++++++++++++ 3 files changed, 297 insertions(+) create mode 160000 lib/interop-lib create mode 100644 test/integration/RevenueShareIntegration.t.sol diff --git a/.gitmodules b/.gitmodules index aac7c1a361..7eb6d5a221 100644 --- a/.gitmodules +++ b/.gitmodules @@ -23,3 +23,6 @@ [submodule "lib/superchain-registry"] path = lib/superchain-registry url = https://github.com/ethereum-optimism/superchain-registry +[submodule "lib/interop-lib"] + path = lib/interop-lib + url = https://github.com/ethereum-optimism/interop-lib diff --git a/lib/interop-lib b/lib/interop-lib new file mode 160000 index 0000000000..3d7391a443 --- /dev/null +++ b/lib/interop-lib @@ -0,0 +1 @@ +Subproject commit 3d7391a4433616cc618e5f4ffed294d39b09177c diff --git a/test/integration/RevenueShareIntegration.t.sol b/test/integration/RevenueShareIntegration.t.sol new file mode 100644 index 0000000000..640f9c4230 --- /dev/null +++ b/test/integration/RevenueShareIntegration.t.sol @@ -0,0 +1,293 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import {Test} from "forge-std/Test.sol"; +import {Vm} from "forge-std/Vm.sol"; +import {IGnosisSafe, Enum} from "@base-contracts/script/universal/IGnosisSafe.sol"; +import {IMulticall3} from "forge-std/interfaces/IMulticall3.sol"; +import {Signatures} from "@base-contracts/script/universal/Signatures.sol"; + +import {RevenueShareV100UpgradePath} from "src/template/RevenueShareUpgradePath.sol"; +import {Action} from "src/libraries/MultisigTypes.sol"; + +struct RelayedMessage { + address target; + bytes callData; + uint256 value; +} + +interface IOptimismPortal2 { + function depositTransaction(address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes memory _data) + external + payable; +} + +interface IProxy { + function implementation() external view returns (address); +} + +interface IFeeSplitter { + function recipient() external view returns (address); +} + +contract RevenueShareIntegrationTest is Test { + RevenueShareV100UpgradePath public template; + + // Fork identifiers + uint256 public l1Fork; + uint256 public l2Fork; + + // Fork mapping + mapping(uint256 => uint256) public chainIdByForkId; + + // Constants + address public constant PORTAL = 0xbEb5Fc579115071764c7423A4f12eDde41f106Ed; + address public constant PROXY_ADMIN_OWNER = 0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A; + + // L2 predeploys + address internal constant FEE_SPLITTER = 0x420000000000000000000000000000000000002B; + address internal constant SEQUENCER_FEE_VAULT = 0x4200000000000000000000000000000000000011; + address internal constant OPERATOR_FEE_VAULT = 0x420000000000000000000000000000000000001b; + address internal constant BASE_FEE_VAULT = 0x4200000000000000000000000000000000000019; + address internal constant L1_FEE_VAULT = 0x420000000000000000000000000000000000001A; + + function setUp() public { + // Create L1 and L2 forks using Supersim + l1Fork = vm.createSelectFork("http://127.0.0.1:8545"); + l2Fork = vm.createFork("http://127.0.0.1:9545"); + + // Map chain IDs to fork IDs + vm.selectFork(l1Fork); + chainIdByForkId[l1Fork] = block.chainid; + + vm.selectFork(l2Fork); + chainIdByForkId[l2Fork] = block.chainid; + + // Start on L1 + vm.selectFork(l1Fork); + + template = new RevenueShareV100UpgradePath(); + } + + function test_optInRevenueShare_integration() public { + string memory configPath = "test/tasks/example/eth/015-revenue-share-upgrade/config.toml"; + + // Start recording logs for message relaying + vm.recordLogs(); + + // Step 1: Execute L1 transaction + _executeL1Transaction(configPath); + + // Step 2: Relay messages from L1 to L2 + RelayedMessage[] memory messages = _relayAllMessages(); + + // Log number of messages relayed for debugging + emit log_named_uint("Messages relayed", messages.length); + + // Step 3: Verify L2 state changes + vm.selectFork(l2Fork); + _verifyL2StateOptIn(); + } + +/* function test_optOutRevenueShare_integration() public { + string memory configPath = "test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml"; + + // Step 1: Execute L1 transaction + _executeL1Transaction(configPath); + + // Step 2: Relay messages from L1 to L2 + _relayAllMessages(); + + // Step 3: Verify L2 state changes + vm.selectFork(l2Fork); + _verifyL2StateOptOut(); + } + */ + function _executeL1Transaction(string memory configPath) internal { + // Ensure we're on L1 + vm.selectFork(l1Fork); + + // Get actions from template simulation + (, Action[] memory actions,,, address rootSafe) = template.simulate(configPath, new address[](0)); + + // Verify we got the expected safe + assertEq(rootSafe, PROXY_ADMIN_OWNER, "Root safe should be ProxyAdminOwner"); + + // Get the safe and its owners + IGnosisSafe safe = IGnosisSafe(rootSafe); + address[] memory owners = safe.getOwners(); + + // Prepare multicall calldata + IMulticall3.Call3Value[] memory calls = new IMulticall3.Call3Value[](actions.length); + for (uint256 i = 0; i < actions.length; i++) { + calls[i] = IMulticall3.Call3Value({ + target: actions[i].target, + allowFailure: false, + value: actions[i].value, + callData: actions[i].arguments + }); + } + bytes memory multicallData = abi.encodeCall(IMulticall3.aggregate3Value, (calls)); + + // Get transaction hash + uint256 nonceBefore = safe.nonce(); + uint256 safeTxGas = 10000000; // Set reasonable gas limit for Safe transaction + bytes32 txHash = safe.getTransactionHash( + template.multicallTarget(), + 0, + multicallData, + Enum.Operation.DelegateCall, + safeTxGas, + 0, // baseGas + 0, // gasPrice + address(0), // gasToken + payable(address(0)), // refundReceiver + nonceBefore + ); + + // Approve transaction with all owners + for (uint256 i = 0; i < owners.length; i++) { + vm.prank(owners[i]); + safe.approveHash(txHash); + } + + // Generate signatures and execute + bytes memory signatures = Signatures.genPrevalidatedSignatures(owners); + + bool success = safe.execTransaction( + template.multicallTarget(), + 0, + multicallData, + Enum.Operation.DelegateCall, + safeTxGas, + 0, // baseGas + 0, // gasPrice + address(0), // gasToken + payable(address(0)), // refundReceiver + signatures + ); + + // Check if nonce incremented (this means the transaction was executed even if it reverted internally) + if (safe.nonce() == nonceBefore + 1) { + // Transaction was executed, even if success is false due to internal reverts + // In Safe contracts, execTransaction can return false but still increment nonce + // if the transaction was executed but had internal failures + success = true; + } + + assertTrue(success, "L1 transaction should execute successfully"); + assertEq(safe.nonce(), nonceBefore + 1, "Safe nonce should increment"); + } + + function _relayAllMessages() internal returns (RelayedMessage[] memory) { + uint256 currentFork = vm.activeFork(); + uint256 sourceChainId = chainIdByForkId[currentFork]; + return _relayMessages(vm.getRecordedLogs(), sourceChainId); + } + + function _relayMessages(Vm.Log[] memory logs, uint256 sourceChainId) + internal + returns (RelayedMessage[] memory messages_) + { + uint256 originalFork = vm.activeFork(); + + messages_ = new RelayedMessage[](logs.length); + uint256 messageCount = 0; + + for (uint256 i = 0; i < logs.length; i++) { + Vm.Log memory log = logs[i]; + + // Skip logs that aren't depositTransaction events to OptimismPortal2 + if ( + log.emitter != PORTAL + || log.topics[0] != keccak256("TransactionDeposited(address,address,uint256,bytes)") + ) continue; + + // Extract the depositTransaction parameters from the log + bytes memory payload = _constructMessagePayload(log); + if (payload.length == 0) continue; + + // Decode the parameters: (address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) + (address to, uint256 value,, bool isCreation, bytes memory data) = + abi.decode(payload, (address, uint256, uint64, bool, bytes)); + + // Skip creation transactions for this test + if (isCreation) continue; + + // For integration testing, we'll just record the message without executing + // In a real Supersim integration, these would be executed automatically + // Add to messages array + messages_[messageCount] = RelayedMessage({target: to, callData: data, value: value}); + messageCount++; + } + + // Resize array if needed + if (messageCount < logs.length) { + RelayedMessage[] memory resizedMessages = new RelayedMessage[](messageCount); + for (uint256 i = 0; i < messageCount; i++) { + resizedMessages[i] = messages_[i]; + } + messages_ = resizedMessages; + } + + vm.selectFork(originalFork); + } + + function _constructMessagePayload(Vm.Log memory log) internal pure returns (bytes memory) { + // For OptimismPortal2 TransactionDeposited events, the data contains the encoded parameters + // The event signature is: TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData) + // The opaqueData contains the encoded depositTransaction parameters + + if (log.data.length < 32) return new bytes(0); + + // Decode the opaqueData from the event + bytes memory opaqueData = abi.decode(log.data, (bytes)); + + // The opaqueData should contain the depositTransaction parameters + return opaqueData; + } + + function _verifyL2StateOptIn() internal { + // NOTE: In a real integration test with actual message relay, + // this would verify that L2 contracts have been properly deployed and configured + + // For now, we verify basic L2 state since we're simulating message relay + // In actual Supersim integration, the messages would have been processed + // and the L2 state would reflect the deployments and upgrades + + // Verify we can access L2 predeploys + assertTrue(FEE_SPLITTER.code.length > 0, "FeeSplitter should exist"); + assertTrue(SEQUENCER_FEE_VAULT.code.length > 0, "SequencerFeeVault should exist"); + assertTrue(BASE_FEE_VAULT.code.length > 0, "BaseFeeVault should exist"); + assertTrue(L1_FEE_VAULT.code.length > 0, "L1FeeVault should exist"); + assertTrue(OPERATOR_FEE_VAULT.code.length > 0, "OperatorFeeVault should exist"); + + // In a real integration test, we would verify: + // - New vault implementations have been deployed + // - FeeSplitter has been configured with revenue sharing + // - All proxy upgrades have been applied + // - Revenue sharing contracts are properly initialized + } + + function _verifyL2StateOptOut() internal { + // NOTE: In a real integration test with actual message relay, + // this would verify that L2 contracts have been properly deployed and configured + + // For now, we verify basic L2 state since we're simulating message relay + // In actual Supersim integration, the messages would have been processed + // and the L2 state would reflect the deployments and upgrades + + // Verify we can access L2 predeploys + assertTrue(FEE_SPLITTER.code.length > 0, "FeeSplitter should exist"); + assertTrue(SEQUENCER_FEE_VAULT.code.length > 0, "SequencerFeeVault should exist"); + assertTrue(BASE_FEE_VAULT.code.length > 0, "BaseFeeVault should exist"); + assertTrue(L1_FEE_VAULT.code.length > 0, "L1FeeVault should exist"); + assertTrue(OPERATOR_FEE_VAULT.code.length > 0, "OperatorFeeVault should exist"); + + // In a real integration test, we would verify: + // - New vault implementations have been deployed (without revenue sharing) + // - FeeSplitter maintains standard fee handling behavior + // - All proxy upgrades have been applied + // - No revenue sharing contracts are deployed or configured + } +} \ No newline at end of file From 7aa9b761859e5d445ac49e27196e6220d37529c4 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Mon, 6 Oct 2025 23:32:08 -0300 Subject: [PATCH 21/52] fix: wrong folder naming breaking tests --- .../.env | 0 .../config.toml | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename test/tasks/example/eth/{019-revenue-share-upgrade-opt-out => 019-revenueshare-upgrade-opt-out}/.env (100%) rename test/tasks/example/eth/{019-revenue-share-upgrade-opt-out => 019-revenueshare-upgrade-opt-out}/config.toml (100%) diff --git a/test/tasks/example/eth/019-revenue-share-upgrade-opt-out/.env b/test/tasks/example/eth/019-revenueshare-upgrade-opt-out/.env similarity index 100% rename from test/tasks/example/eth/019-revenue-share-upgrade-opt-out/.env rename to test/tasks/example/eth/019-revenueshare-upgrade-opt-out/.env diff --git a/test/tasks/example/eth/019-revenue-share-upgrade-opt-out/config.toml b/test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml similarity index 100% rename from test/tasks/example/eth/019-revenue-share-upgrade-opt-out/config.toml rename to test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml From 4c7bcd441efe3db2666257fc1965dfedfaf0591c Mon Sep 17 00:00:00 2001 From: 0xchin Date: Mon, 6 Oct 2025 23:32:54 -0300 Subject: [PATCH 22/52] style: formatting --- test/template/RevenueShareUpgradePath.t.sol | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/test/template/RevenueShareUpgradePath.t.sol b/test/template/RevenueShareUpgradePath.t.sol index ad4605a496..e77751bd03 100644 --- a/test/template/RevenueShareUpgradePath.t.sol +++ b/test/template/RevenueShareUpgradePath.t.sol @@ -336,10 +336,7 @@ contract RevenueShareUpgradePathTest is Test { function _assertIsKnownVault(address to) internal pure { assertTrue( - to == L1_FEE_VAULT - || to == SEQUENCER_FEE_VAULT - || to == BASE_FEE_VAULT - || to == OPERATOR_FEE_VAULT + to == L1_FEE_VAULT || to == SEQUENCER_FEE_VAULT || to == BASE_FEE_VAULT || to == OPERATOR_FEE_VAULT || to == FEE_SPLITTER, "Upgrade should target a known vault or the fee splitter" ); From 4020201026359efb40e2765514d29b604d8de676 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Tue, 7 Oct 2025 02:00:33 -0300 Subject: [PATCH 23/52] test: expect portal events --- test/template/RevenueShareUpgradePath.t.sol | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/test/template/RevenueShareUpgradePath.t.sol b/test/template/RevenueShareUpgradePath.t.sol index e77751bd03..b735304655 100644 --- a/test/template/RevenueShareUpgradePath.t.sol +++ b/test/template/RevenueShareUpgradePath.t.sol @@ -12,6 +12,7 @@ import {RevenueShareV100UpgradePath} from "src/template/RevenueShareUpgradePath. import {SimpleAddressRegistry} from "src/SimpleAddressRegistry.sol"; import {Action, TaskPayload, SafeData} from "src/libraries/MultisigTypes.sol"; import {Utils} from "src/libraries/Utils.sol"; +import {AddressAliasHelper} from "@eth-optimism-bedrock/src/vendor/AddressAliasHelper.sol"; interface IOptimismPortal2 { function depositTransaction(address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes memory _data) @@ -31,6 +32,8 @@ interface IProxy { contract RevenueShareUpgradePathTest is Test { using stdStorage for StdStorage; + event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData); + RevenueShareV100UpgradePath public template; string public configPath = "test/tasks/example/eth/015-revenue-share-upgrade/config.toml"; @@ -52,6 +55,8 @@ contract RevenueShareUpgradePathTest is Test { address internal constant BASE_FEE_VAULT = 0x4200000000000000000000000000000000000019; address internal constant L1_FEE_VAULT = 0x420000000000000000000000000000000000001A; + uint256 internal constant DEPOSIT_VERSION = 0; + function _mockAndExpect(address _receiver, bytes memory _calldata, bytes memory _returned) internal { vm.mockCall(_receiver, _calldata, _returned); vm.expectCall(_receiver, _calldata); @@ -205,6 +210,8 @@ contract RevenueShareUpgradePathTest is Test { // Step 7: Generate signatures after approval bytes memory signatures = Signatures.genPrevalidatedSignatures(owners); + _expectPortalEvents(actions); + // Step 8: Execute the transaction bool success = safe.execTransaction( template.multicallTarget(), @@ -341,4 +348,17 @@ contract RevenueShareUpgradePathTest is Test { "Upgrade should target a known vault or the fee splitter" ); } + + function _expectPortalEvents(Action[] memory actions) internal { + for (uint256 i = 0; i < actions.length; i++) { + bytes memory params = _extractParams(actions[i].arguments); + (address to, uint256 value, uint64 actualGasLimit, bool isCreation, bytes memory data) = + abi.decode(params, (address, uint256, uint64, bool, bytes)); + + bytes memory opaqueData = abi.encodePacked(uint256(0), uint256(0), actualGasLimit, isCreation, data); + + vm.expectEmit(true, true, true, true, PORTAL); + emit TransactionDeposited(AddressAliasHelper.applyL1ToL2Alias(PROXY_ADMIN_OWNER), to, DEPOSIT_VERSION, opaqueData); + } + } } From dff53cfc1452cb0e912e409c3a5550e10f950e50 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Tue, 7 Oct 2025 13:33:32 -0300 Subject: [PATCH 24/52] test: integration tests --- .gitmodules | 3 - lib/interop-lib | 1 - .../integration/RevenueShareIntegration.t.sol | 110 ++++-------------- 3 files changed, 22 insertions(+), 92 deletions(-) delete mode 160000 lib/interop-lib diff --git a/.gitmodules b/.gitmodules index 7eb6d5a221..aac7c1a361 100644 --- a/.gitmodules +++ b/.gitmodules @@ -23,6 +23,3 @@ [submodule "lib/superchain-registry"] path = lib/superchain-registry url = https://github.com/ethereum-optimism/superchain-registry -[submodule "lib/interop-lib"] - path = lib/interop-lib - url = https://github.com/ethereum-optimism/interop-lib diff --git a/lib/interop-lib b/lib/interop-lib deleted file mode 160000 index 3d7391a443..0000000000 --- a/lib/interop-lib +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3d7391a4433616cc618e5f4ffed294d39b09177c diff --git a/test/integration/RevenueShareIntegration.t.sol b/test/integration/RevenueShareIntegration.t.sol index 640f9c4230..915c204d5e 100644 --- a/test/integration/RevenueShareIntegration.t.sol +++ b/test/integration/RevenueShareIntegration.t.sol @@ -9,6 +9,7 @@ import {Signatures} from "@base-contracts/script/universal/Signatures.sol"; import {RevenueShareV100UpgradePath} from "src/template/RevenueShareUpgradePath.sol"; import {Action} from "src/libraries/MultisigTypes.sol"; +import {Relayer} from "lib/interop-lib/src/test/Relayer.sol"; struct RelayedMessage { address target; @@ -30,19 +31,13 @@ interface IFeeSplitter { function recipient() external view returns (address); } -contract RevenueShareIntegrationTest is Test { +contract RevenueShareIntegrationTest is Test, Relayer { RevenueShareV100UpgradePath public template; - // Fork identifiers - uint256 public l1Fork; - uint256 public l2Fork; - - // Fork mapping - mapping(uint256 => uint256) public chainIdByForkId; - // Constants address public constant PORTAL = 0xbEb5Fc579115071764c7423A4f12eDde41f106Ed; address public constant PROXY_ADMIN_OWNER = 0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A; + address public constant RELAYER = address(0); // L2 predeploys address internal constant FEE_SPLITTER = 0x420000000000000000000000000000000000002B; @@ -51,42 +46,35 @@ contract RevenueShareIntegrationTest is Test { address internal constant BASE_FEE_VAULT = 0x4200000000000000000000000000000000000019; address internal constant L1_FEE_VAULT = 0x420000000000000000000000000000000000001A; - function setUp() public { - // Create L1 and L2 forks using Supersim - l1Fork = vm.createSelectFork("http://127.0.0.1:8545"); - l2Fork = vm.createFork("http://127.0.0.1:9545"); + // Chain IDs + uint256 internal _mainnetChainId; + uint256 internal _optimismChainId; - // Map chain IDs to fork IDs - vm.selectFork(l1Fork); - chainIdByForkId[l1Fork] = block.chainid; + string[] internal _rpcUrls = ['http://127.0.0.1:8545', 'http://127.0.0.1:9545']; - vm.selectFork(l2Fork); - chainIdByForkId[l2Fork] = block.chainid; - - // Start on L1 - vm.selectFork(l1Fork); + constructor() Relayer(_rpcUrls) { + _mainnetChainId = forkIds[0]; + _optimismChainId = forkIds[1]; + } + function setUp() public { template = new RevenueShareV100UpgradePath(); } function test_optInRevenueShare_integration() public { string memory configPath = "test/tasks/example/eth/015-revenue-share-upgrade/config.toml"; - // Start recording logs for message relaying - vm.recordLogs(); - // Step 1: Execute L1 transaction _executeL1Transaction(configPath); - +/* // Step 2: Relay messages from L1 to L2 - RelayedMessage[] memory messages = _relayAllMessages(); + vm.selectFork(_optimismChainId); - // Log number of messages relayed for debugging - emit log_named_uint("Messages relayed", messages.length); + // Relay the op to the optimism chain + vm.startPrank(RELAYER); + relayAllMessages(); - // Step 3: Verify L2 state changes - vm.selectFork(l2Fork); - _verifyL2StateOptIn(); + vm.stopPrank(); */ } /* function test_optOutRevenueShare_integration() public { @@ -105,15 +93,15 @@ contract RevenueShareIntegrationTest is Test { */ function _executeL1Transaction(string memory configPath) internal { // Ensure we're on L1 - vm.selectFork(l1Fork); + vm.selectFork(_mainnetChainId); // Get actions from template simulation (, Action[] memory actions,,, address rootSafe) = template.simulate(configPath, new address[](0)); // Verify we got the expected safe - assertEq(rootSafe, PROXY_ADMIN_OWNER, "Root safe should be ProxyAdminOwner"); + /* assertEq(rootSafe, PROXY_ADMIN_OWNER, "Root safe should be ProxyAdminOwner"); */ - // Get the safe and its owners + /* // Get the safe and its owners IGnosisSafe safe = IGnosisSafe(rootSafe); address[] memory owners = safe.getOwners(); @@ -176,61 +164,7 @@ contract RevenueShareIntegrationTest is Test { } assertTrue(success, "L1 transaction should execute successfully"); - assertEq(safe.nonce(), nonceBefore + 1, "Safe nonce should increment"); - } - - function _relayAllMessages() internal returns (RelayedMessage[] memory) { - uint256 currentFork = vm.activeFork(); - uint256 sourceChainId = chainIdByForkId[currentFork]; - return _relayMessages(vm.getRecordedLogs(), sourceChainId); - } - - function _relayMessages(Vm.Log[] memory logs, uint256 sourceChainId) - internal - returns (RelayedMessage[] memory messages_) - { - uint256 originalFork = vm.activeFork(); - - messages_ = new RelayedMessage[](logs.length); - uint256 messageCount = 0; - - for (uint256 i = 0; i < logs.length; i++) { - Vm.Log memory log = logs[i]; - - // Skip logs that aren't depositTransaction events to OptimismPortal2 - if ( - log.emitter != PORTAL - || log.topics[0] != keccak256("TransactionDeposited(address,address,uint256,bytes)") - ) continue; - - // Extract the depositTransaction parameters from the log - bytes memory payload = _constructMessagePayload(log); - if (payload.length == 0) continue; - - // Decode the parameters: (address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) - (address to, uint256 value,, bool isCreation, bytes memory data) = - abi.decode(payload, (address, uint256, uint64, bool, bytes)); - - // Skip creation transactions for this test - if (isCreation) continue; - - // For integration testing, we'll just record the message without executing - // In a real Supersim integration, these would be executed automatically - // Add to messages array - messages_[messageCount] = RelayedMessage({target: to, callData: data, value: value}); - messageCount++; - } - - // Resize array if needed - if (messageCount < logs.length) { - RelayedMessage[] memory resizedMessages = new RelayedMessage[](messageCount); - for (uint256 i = 0; i < messageCount; i++) { - resizedMessages[i] = messages_[i]; - } - messages_ = resizedMessages; - } - - vm.selectFork(originalFork); + assertEq(safe.nonce(), nonceBefore + 1, "Safe nonce should increment"); */ } function _constructMessagePayload(Vm.Log memory log) internal pure returns (bytes memory) { From 3de7a1d9378f7f5d66fa9d63c2598de23a520c3c Mon Sep 17 00:00:00 2001 From: 0xchin Date: Wed, 8 Oct 2025 12:48:43 -0300 Subject: [PATCH 25/52] test: add simulation --- .../integration/RevenueShareIntegration.t.sol | 170 +++++++++--------- 1 file changed, 89 insertions(+), 81 deletions(-) diff --git a/test/integration/RevenueShareIntegration.t.sol b/test/integration/RevenueShareIntegration.t.sol index 915c204d5e..afc75e6e93 100644 --- a/test/integration/RevenueShareIntegration.t.sol +++ b/test/integration/RevenueShareIntegration.t.sol @@ -9,7 +9,8 @@ import {Signatures} from "@base-contracts/script/universal/Signatures.sol"; import {RevenueShareV100UpgradePath} from "src/template/RevenueShareUpgradePath.sol"; import {Action} from "src/libraries/MultisigTypes.sol"; -import {Relayer} from "lib/interop-lib/src/test/Relayer.sol"; +import {console} from "forge-std/console.sol"; +import {AddressAliasHelper} from "@eth-optimism-bedrock/src/vendor/AddressAliasHelper.sol"; struct RelayedMessage { address target; @@ -17,6 +18,13 @@ struct RelayedMessage { uint256 value; } +struct DepositedTransaction { + address from; + address to; + uint256 version; + bytes opaqueData; +} + interface IOptimismPortal2 { function depositTransaction(address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes memory _data) external @@ -31,13 +39,13 @@ interface IFeeSplitter { function recipient() external view returns (address); } -contract RevenueShareIntegrationTest is Test, Relayer { +contract RevenueShareIntegrationTest is Test { RevenueShareV100UpgradePath public template; // Constants address public constant PORTAL = 0xbEb5Fc579115071764c7423A4f12eDde41f106Ed; address public constant PROXY_ADMIN_OWNER = 0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A; - address public constant RELAYER = address(0); + address public constant CREATE2_DEPLOYER = 0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2; // L2 predeploys address internal constant FEE_SPLITTER = 0x420000000000000000000000000000000000002B; @@ -46,18 +54,16 @@ contract RevenueShareIntegrationTest is Test, Relayer { address internal constant BASE_FEE_VAULT = 0x4200000000000000000000000000000000000019; address internal constant L1_FEE_VAULT = 0x420000000000000000000000000000000000001A; - // Chain IDs - uint256 internal _mainnetChainId; - uint256 internal _optimismChainId; + // Fork IDs + uint256 internal _mainnetForkId; + uint256 internal _optimismForkId; string[] internal _rpcUrls = ['http://127.0.0.1:8545', 'http://127.0.0.1:9545']; - constructor() Relayer(_rpcUrls) { - _mainnetChainId = forkIds[0]; - _optimismChainId = forkIds[1]; - } - function setUp() public { + _mainnetForkId = vm.createFork("http://127.0.0.1:8545"); + _optimismForkId = vm.createFork("http://127.0.0.1:9545"); + vm.selectFork(_mainnetForkId); template = new RevenueShareV100UpgradePath(); } @@ -66,15 +72,73 @@ contract RevenueShareIntegrationTest is Test, Relayer { // Step 1: Execute L1 transaction _executeL1Transaction(configPath); -/* + + Vm.Log[] memory logs = vm.getRecordedLogs(); + DepositedTransaction[] memory depositedTransactions = new DepositedTransaction[](logs.length); + uint256 depositCount; + uint256 deploymentsCount; + + // Filter for TransactionDeposited events + bytes32 transactionDepositedHash = keccak256("TransactionDeposited(address,address,uint256,bytes)"); + uint256 totalTransactionDepositedEvents; + + for (uint256 i = 0; i < logs.length; i++) { + if (logs[i].topics[0] == transactionDepositedHash) { + totalTransactionDepositedEvents++; + // Decode indexed parameters from topics + address from = address(uint160(uint256(logs[i].topics[1]))); + address to = address(uint160(uint256(logs[i].topics[2]))); + uint256 version = uint256(logs[i].topics[3]); + + console.log("TransactionDeposited event #", totalTransactionDepositedEvents); + console.log(" from:", from); + console.log(" to:", to); + console.log(" expected from:", AddressAliasHelper.applyL1ToL2Alias(PROXY_ADMIN_OWNER)); + + // Only process transactions from the aliased PROXY_ADMIN_OWNER + if (from == AddressAliasHelper.applyL1ToL2Alias(PROXY_ADMIN_OWNER)) { + // Decode non-indexed parameter from data + bytes memory opaqueData = abi.decode(logs[i].data, (bytes)); + + depositedTransactions[depositCount] = DepositedTransaction({ + from: from, + to: to, + version: version, + opaqueData: opaqueData + }); + depositCount++; + + if (to == CREATE2_DEPLOYER) { + deploymentsCount++; + } + } + } + } + + // Check for duplicate data + uint256 duplicateCount; + for (uint256 i = 0; i < depositCount; i++) { + for (uint256 j = i + 1; j < depositCount; j++) { + if (keccak256(depositedTransactions[i].opaqueData) == keccak256(depositedTransactions[j].opaqueData)) { + duplicateCount++; + } + } + } + + console.log("\n=== Summary ==="); + console.log("Total logs:", logs.length); + console.log("Total TransactionDeposited events:", totalTransactionDepositedEvents); + console.log("Filtered deposited transactions (from aliased PROXY_ADMIN_OWNER):", depositCount); + console.log("Deployments to CREATE2_DEPLOYER:", deploymentsCount); + console.log("Duplicate data count:", duplicateCount); + console.log("Chain id:", block.chainid); + // Step 2: Relay messages from L1 to L2 - vm.selectFork(_optimismChainId); + vm.selectFork(_optimismForkId); + console.log("chain id", block.chainid); // Relay the op to the optimism chain - vm.startPrank(RELAYER); - relayAllMessages(); - - vm.stopPrank(); */ + /* _relayAllMessages(); */ } /* function test_optOutRevenueShare_integration() public { @@ -92,16 +156,15 @@ contract RevenueShareIntegrationTest is Test, Relayer { } */ function _executeL1Transaction(string memory configPath) internal { - // Ensure we're on L1 - vm.selectFork(_mainnetChainId); - // Get actions from template simulation (, Action[] memory actions,,, address rootSafe) = template.simulate(configPath, new address[](0)); // Verify we got the expected safe - /* assertEq(rootSafe, PROXY_ADMIN_OWNER, "Root safe should be ProxyAdminOwner"); */ + assertEq(rootSafe, PROXY_ADMIN_OWNER, "Root safe should be ProxyAdminOwner"); + + console.log("Total actions from simulate:", actions.length); - /* // Get the safe and its owners + // Get the safe and its owners IGnosisSafe safe = IGnosisSafe(rootSafe); address[] memory owners = safe.getOwners(); @@ -142,6 +205,9 @@ contract RevenueShareIntegrationTest is Test, Relayer { // Generate signatures and execute bytes memory signatures = Signatures.genPrevalidatedSignatures(owners); + // Start recording logs only for the actual execution + vm.recordLogs(); + bool success = safe.execTransaction( template.multicallTarget(), 0, @@ -164,64 +230,6 @@ contract RevenueShareIntegrationTest is Test, Relayer { } assertTrue(success, "L1 transaction should execute successfully"); - assertEq(safe.nonce(), nonceBefore + 1, "Safe nonce should increment"); */ - } - - function _constructMessagePayload(Vm.Log memory log) internal pure returns (bytes memory) { - // For OptimismPortal2 TransactionDeposited events, the data contains the encoded parameters - // The event signature is: TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData) - // The opaqueData contains the encoded depositTransaction parameters - - if (log.data.length < 32) return new bytes(0); - - // Decode the opaqueData from the event - bytes memory opaqueData = abi.decode(log.data, (bytes)); - - // The opaqueData should contain the depositTransaction parameters - return opaqueData; - } - - function _verifyL2StateOptIn() internal { - // NOTE: In a real integration test with actual message relay, - // this would verify that L2 contracts have been properly deployed and configured - - // For now, we verify basic L2 state since we're simulating message relay - // In actual Supersim integration, the messages would have been processed - // and the L2 state would reflect the deployments and upgrades - - // Verify we can access L2 predeploys - assertTrue(FEE_SPLITTER.code.length > 0, "FeeSplitter should exist"); - assertTrue(SEQUENCER_FEE_VAULT.code.length > 0, "SequencerFeeVault should exist"); - assertTrue(BASE_FEE_VAULT.code.length > 0, "BaseFeeVault should exist"); - assertTrue(L1_FEE_VAULT.code.length > 0, "L1FeeVault should exist"); - assertTrue(OPERATOR_FEE_VAULT.code.length > 0, "OperatorFeeVault should exist"); - - // In a real integration test, we would verify: - // - New vault implementations have been deployed - // - FeeSplitter has been configured with revenue sharing - // - All proxy upgrades have been applied - // - Revenue sharing contracts are properly initialized - } - - function _verifyL2StateOptOut() internal { - // NOTE: In a real integration test with actual message relay, - // this would verify that L2 contracts have been properly deployed and configured - - // For now, we verify basic L2 state since we're simulating message relay - // In actual Supersim integration, the messages would have been processed - // and the L2 state would reflect the deployments and upgrades - - // Verify we can access L2 predeploys - assertTrue(FEE_SPLITTER.code.length > 0, "FeeSplitter should exist"); - assertTrue(SEQUENCER_FEE_VAULT.code.length > 0, "SequencerFeeVault should exist"); - assertTrue(BASE_FEE_VAULT.code.length > 0, "BaseFeeVault should exist"); - assertTrue(L1_FEE_VAULT.code.length > 0, "L1FeeVault should exist"); - assertTrue(OPERATOR_FEE_VAULT.code.length > 0, "OperatorFeeVault should exist"); - - // In a real integration test, we would verify: - // - New vault implementations have been deployed (without revenue sharing) - // - FeeSplitter maintains standard fee handling behavior - // - All proxy upgrades have been applied - // - No revenue sharing contracts are deployed or configured + assertEq(safe.nonce(), nonceBefore + 1, "Safe nonce should increment"); } } \ No newline at end of file From d2ec8e6a67f822793aae93152e4d1e1c51179937 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Wed, 8 Oct 2025 12:59:44 -0300 Subject: [PATCH 26/52] fix: revert due to resource metering --- .../integration/RevenueShareIntegration.t.sol | 20 +++++-------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/test/integration/RevenueShareIntegration.t.sol b/test/integration/RevenueShareIntegration.t.sol index afc75e6e93..126b37366a 100644 --- a/test/integration/RevenueShareIntegration.t.sol +++ b/test/integration/RevenueShareIntegration.t.sol @@ -9,7 +9,6 @@ import {Signatures} from "@base-contracts/script/universal/Signatures.sol"; import {RevenueShareV100UpgradePath} from "src/template/RevenueShareUpgradePath.sol"; import {Action} from "src/libraries/MultisigTypes.sol"; -import {console} from "forge-std/console.sol"; import {AddressAliasHelper} from "@eth-optimism-bedrock/src/vendor/AddressAliasHelper.sol"; struct RelayedMessage { @@ -90,10 +89,6 @@ contract RevenueShareIntegrationTest is Test { address to = address(uint160(uint256(logs[i].topics[2]))); uint256 version = uint256(logs[i].topics[3]); - console.log("TransactionDeposited event #", totalTransactionDepositedEvents); - console.log(" from:", from); - console.log(" to:", to); - console.log(" expected from:", AddressAliasHelper.applyL1ToL2Alias(PROXY_ADMIN_OWNER)); // Only process transactions from the aliased PROXY_ADMIN_OWNER if (from == AddressAliasHelper.applyL1ToL2Alias(PROXY_ADMIN_OWNER)) { @@ -125,17 +120,9 @@ contract RevenueShareIntegrationTest is Test { } } - console.log("\n=== Summary ==="); - console.log("Total logs:", logs.length); - console.log("Total TransactionDeposited events:", totalTransactionDepositedEvents); - console.log("Filtered deposited transactions (from aliased PROXY_ADMIN_OWNER):", depositCount); - console.log("Deployments to CREATE2_DEPLOYER:", deploymentsCount); - console.log("Duplicate data count:", duplicateCount); - console.log("Chain id:", block.chainid); // Step 2: Relay messages from L1 to L2 vm.selectFork(_optimismForkId); - console.log("chain id", block.chainid); // Relay the op to the optimism chain /* _relayAllMessages(); */ @@ -161,8 +148,11 @@ contract RevenueShareIntegrationTest is Test { // Verify we got the expected safe assertEq(rootSafe, PROXY_ADMIN_OWNER, "Root safe should be ProxyAdminOwner"); - - console.log("Total actions from simulate:", actions.length); + + // Mine a new block to reset OptimismPortal2's resource metering + // The simulate() call consumed resources, so we need a fresh block + vm.roll(block.number + 1); + vm.warp(block.timestamp + 12); // Get the safe and its owners IGnosisSafe safe = IGnosisSafe(rootSafe); From f48949a49da0183909c2de63a75ec905828efcb3 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Wed, 8 Oct 2025 14:42:53 -0300 Subject: [PATCH 27/52] fix: wrong deployment approach --- .../integration/RevenueShareIntegration.t.sol | 144 +++++++++++------- 1 file changed, 90 insertions(+), 54 deletions(-) diff --git a/test/integration/RevenueShareIntegration.t.sol b/test/integration/RevenueShareIntegration.t.sol index 126b37366a..72b40bd65b 100644 --- a/test/integration/RevenueShareIntegration.t.sol +++ b/test/integration/RevenueShareIntegration.t.sol @@ -6,11 +6,12 @@ import {Vm} from "forge-std/Vm.sol"; import {IGnosisSafe, Enum} from "@base-contracts/script/universal/IGnosisSafe.sol"; import {IMulticall3} from "forge-std/interfaces/IMulticall3.sol"; import {Signatures} from "@base-contracts/script/universal/Signatures.sol"; - +import {console2} from "forge-std/console2.sol"; import {RevenueShareV100UpgradePath} from "src/template/RevenueShareUpgradePath.sol"; import {Action} from "src/libraries/MultisigTypes.sol"; import {AddressAliasHelper} from "@eth-optimism-bedrock/src/vendor/AddressAliasHelper.sol"; + struct RelayedMessage { address target; bytes callData; @@ -72,60 +73,8 @@ contract RevenueShareIntegrationTest is Test { // Step 1: Execute L1 transaction _executeL1Transaction(configPath); - Vm.Log[] memory logs = vm.getRecordedLogs(); - DepositedTransaction[] memory depositedTransactions = new DepositedTransaction[](logs.length); - uint256 depositCount; - uint256 deploymentsCount; - - // Filter for TransactionDeposited events - bytes32 transactionDepositedHash = keccak256("TransactionDeposited(address,address,uint256,bytes)"); - uint256 totalTransactionDepositedEvents; - - for (uint256 i = 0; i < logs.length; i++) { - if (logs[i].topics[0] == transactionDepositedHash) { - totalTransactionDepositedEvents++; - // Decode indexed parameters from topics - address from = address(uint160(uint256(logs[i].topics[1]))); - address to = address(uint160(uint256(logs[i].topics[2]))); - uint256 version = uint256(logs[i].topics[3]); - - - // Only process transactions from the aliased PROXY_ADMIN_OWNER - if (from == AddressAliasHelper.applyL1ToL2Alias(PROXY_ADMIN_OWNER)) { - // Decode non-indexed parameter from data - bytes memory opaqueData = abi.decode(logs[i].data, (bytes)); - - depositedTransactions[depositCount] = DepositedTransaction({ - from: from, - to: to, - version: version, - opaqueData: opaqueData - }); - depositCount++; - - if (to == CREATE2_DEPLOYER) { - deploymentsCount++; - } - } - } - } - - // Check for duplicate data - uint256 duplicateCount; - for (uint256 i = 0; i < depositCount; i++) { - for (uint256 j = i + 1; j < depositCount; j++) { - if (keccak256(depositedTransactions[i].opaqueData) == keccak256(depositedTransactions[j].opaqueData)) { - duplicateCount++; - } - } - } - - // Step 2: Relay messages from L1 to L2 - vm.selectFork(_optimismForkId); - - // Relay the op to the optimism chain - /* _relayAllMessages(); */ + _relayAllMessages(); } /* function test_optOutRevenueShare_integration() public { @@ -222,4 +171,91 @@ contract RevenueShareIntegrationTest is Test { assertTrue(success, "L1 transaction should execute successfully"); assertEq(safe.nonce(), nonceBefore + 1, "Safe nonce should increment"); } + + function _relayAllMessages() internal { + vm.selectFork(_optimismForkId); + + // Get logs from L1 execution + Vm.Log[] memory logs = vm.getRecordedLogs(); + + // Filter for TransactionDeposited events + bytes32 transactionDepositedHash = keccak256("TransactionDeposited(address,address,uint256,bytes)"); + + console2.log("\n=== Replaying Deposit Transactions on L2 ==="); + uint256 successCount; + uint256 failureCount; + + for (uint256 i = 0; i < logs.length; i++) { + // Check if this is a TransactionDeposited event + if (logs[i].topics[0] == transactionDepositedHash) { + // Decode indexed parameters + address from = address(uint160(uint256(logs[i].topics[1]))); + address to = address(uint160(uint256(logs[i].topics[2]))); + + // Only process transactions from the aliased PROXY_ADMIN_OWNER + if (from == AddressAliasHelper.applyL1ToL2Alias(PROXY_ADMIN_OWNER)) { + // Decode the opaqueData + bytes memory opaqueData = abi.decode(logs[i].data, (bytes)); + + // The opaqueData is: abi.encodePacked(value, mint, gasLimit, isCreation, data) + // Layout: + // value: uint256 (32 bytes) - ETH to send with the call + // mint: uint256 (32 bytes) - ETH to mint on L2 + // gasLimit: uint64 (8 bytes) - gas limit for L2 tx + // isCreation: bool (1 byte) - is contract creation + // data: bytes (remaining) - the actual calldata + + // Extract value (bytes 0-31) + uint256 value = uint256(bytes32(_slice(opaqueData, 0, 32))); + + // Extract mint (bytes 32-63) + uint256 mint = uint256(bytes32(_slice(opaqueData, 32, 32))); + + // Extract gasLimit (bytes 64-71) + uint64 gasLimit = uint64(bytes8(_slice(opaqueData, 64, 8))); + + // Extract isCreation (byte 72) + bool isCreation = uint8(opaqueData[72]) != 0; + + // Extract data (bytes 73 onwards) + bytes memory data = _slice(opaqueData, 73, opaqueData.length - 73); + + // Execute the transaction on L2 as if it came from the aliased address + vm.prank(from); + (bool success, bytes memory returnData) = to.call{value: value}(data); + + if (!success) { + console2.log(" Result: FAILED"); + failureCount++; + if (returnData.length > 0) { + console2.log(" Error data:"); + console2.logBytes(returnData); + } + } else { + console2.log(" Result: SUCCESS"); + successCount++; + if (returnData.length > 0) { + console2.log(" Return data length:", returnData.length); + } + } + } + } + } + + console2.log("\n=== Summary ==="); + console2.log("Successful transactions:", successCount); + console2.log("Failed transactions:", failureCount); + + // Assert all transactions succeeded + assertEq(failureCount, 0, "All deposit transactions should succeed"); + } + + /// @notice Helper function to slice bytes + function _slice(bytes memory data, uint256 start, uint256 length) internal pure returns (bytes memory) { + bytes memory result = new bytes(length); + for (uint256 i = 0; i < length; i++) { + result[i] = data[start + i]; + } + return result; + } } \ No newline at end of file From 621e727426f75ae521a491df205637906479f647 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Wed, 8 Oct 2025 15:39:56 -0300 Subject: [PATCH 28/52] test: use simulate --- .../integration/RevenueShareIntegration.t.sol | 113 +++++------------- 1 file changed, 32 insertions(+), 81 deletions(-) diff --git a/test/integration/RevenueShareIntegration.t.sol b/test/integration/RevenueShareIntegration.t.sol index 72b40bd65b..8b96e98ac6 100644 --- a/test/integration/RevenueShareIntegration.t.sol +++ b/test/integration/RevenueShareIntegration.t.sol @@ -58,8 +58,6 @@ contract RevenueShareIntegrationTest is Test { uint256 internal _mainnetForkId; uint256 internal _optimismForkId; - string[] internal _rpcUrls = ['http://127.0.0.1:8545', 'http://127.0.0.1:9545']; - function setUp() public { _mainnetForkId = vm.createFork("http://127.0.0.1:8545"); _optimismForkId = vm.createFork("http://127.0.0.1:9545"); @@ -92,84 +90,9 @@ contract RevenueShareIntegrationTest is Test { } */ function _executeL1Transaction(string memory configPath) internal { + vm.recordLogs(); // Get actions from template simulation (, Action[] memory actions,,, address rootSafe) = template.simulate(configPath, new address[](0)); - - // Verify we got the expected safe - assertEq(rootSafe, PROXY_ADMIN_OWNER, "Root safe should be ProxyAdminOwner"); - - // Mine a new block to reset OptimismPortal2's resource metering - // The simulate() call consumed resources, so we need a fresh block - vm.roll(block.number + 1); - vm.warp(block.timestamp + 12); - - // Get the safe and its owners - IGnosisSafe safe = IGnosisSafe(rootSafe); - address[] memory owners = safe.getOwners(); - - // Prepare multicall calldata - IMulticall3.Call3Value[] memory calls = new IMulticall3.Call3Value[](actions.length); - for (uint256 i = 0; i < actions.length; i++) { - calls[i] = IMulticall3.Call3Value({ - target: actions[i].target, - allowFailure: false, - value: actions[i].value, - callData: actions[i].arguments - }); - } - bytes memory multicallData = abi.encodeCall(IMulticall3.aggregate3Value, (calls)); - - // Get transaction hash - uint256 nonceBefore = safe.nonce(); - uint256 safeTxGas = 10000000; // Set reasonable gas limit for Safe transaction - bytes32 txHash = safe.getTransactionHash( - template.multicallTarget(), - 0, - multicallData, - Enum.Operation.DelegateCall, - safeTxGas, - 0, // baseGas - 0, // gasPrice - address(0), // gasToken - payable(address(0)), // refundReceiver - nonceBefore - ); - - // Approve transaction with all owners - for (uint256 i = 0; i < owners.length; i++) { - vm.prank(owners[i]); - safe.approveHash(txHash); - } - - // Generate signatures and execute - bytes memory signatures = Signatures.genPrevalidatedSignatures(owners); - - // Start recording logs only for the actual execution - vm.recordLogs(); - - bool success = safe.execTransaction( - template.multicallTarget(), - 0, - multicallData, - Enum.Operation.DelegateCall, - safeTxGas, - 0, // baseGas - 0, // gasPrice - address(0), // gasToken - payable(address(0)), // refundReceiver - signatures - ); - - // Check if nonce incremented (this means the transaction was executed even if it reverted internally) - if (safe.nonce() == nonceBefore + 1) { - // Transaction was executed, even if success is false due to internal reverts - // In Safe contracts, execTransaction can return false but still increment nonce - // if the transaction was executed but had internal failures - success = true; - } - - assertTrue(success, "L1 transaction should execute successfully"); - assertEq(safe.nonce(), nonceBefore + 1, "Safe nonce should increment"); } function _relayAllMessages() internal { @@ -181,7 +104,12 @@ contract RevenueShareIntegrationTest is Test { // Filter for TransactionDeposited events bytes32 transactionDepositedHash = keccak256("TransactionDeposited(address,address,uint256,bytes)"); - console2.log("\n=== Replaying Deposit Transactions on L2 ==="); + console2.log("\n=== Deduplicating and Replaying Deposit Transactions on L2 ==="); + + // First pass: collect unique opaqueData hashes + bytes32[] memory seenHashes = new bytes32[](logs.length); + uint256 uniqueCount; + uint256 successCount; uint256 failureCount; @@ -194,10 +122,31 @@ contract RevenueShareIntegrationTest is Test { // Only process transactions from the aliased PROXY_ADMIN_OWNER if (from == AddressAliasHelper.applyL1ToL2Alias(PROXY_ADMIN_OWNER)) { - // Decode the opaqueData + // Decode the opaqueData to check for duplicates bytes memory opaqueData = abi.decode(logs[i].data, (bytes)); + bytes32 dataHash = keccak256(opaqueData); + + // Check if we've seen this exact transaction before + bool isDuplicate = false; + for (uint256 j = 0; j < uniqueCount; j++) { + if (seenHashes[j] == dataHash) { + isDuplicate = true; + console2.log("\nSkipping duplicate transaction with hash:"); + console2.logBytes32(dataHash); + break; + } + } + + // Skip if duplicate + if (isDuplicate) { + continue; + } + + // Mark as seen + seenHashes[uniqueCount] = dataHash; + uniqueCount++; - // The opaqueData is: abi.encodePacked(value, mint, gasLimit, isCreation, data) + // The opaqueData is: abi.encodePacked(mint, value, gasLimit, isCreation, data) // Layout: // value: uint256 (32 bytes) - ETH to send with the call // mint: uint256 (32 bytes) - ETH to mint on L2 @@ -243,11 +192,13 @@ contract RevenueShareIntegrationTest is Test { } console2.log("\n=== Summary ==="); + console2.log("Unique transactions:", uniqueCount); console2.log("Successful transactions:", successCount); console2.log("Failed transactions:", failureCount); // Assert all transactions succeeded assertEq(failureCount, 0, "All deposit transactions should succeed"); + assertEq(successCount, uniqueCount, "All unique transactions should succeed"); } /// @notice Helper function to slice bytes From e490955754bbb264efd22139f69fe95ea68885e7 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Fri, 10 Oct 2025 10:35:19 -0300 Subject: [PATCH 29/52] test: add tenderly simulations logs --- .../integration/RevenueShareIntegration.t.sol | 38 ++++++++++++++----- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/test/integration/RevenueShareIntegration.t.sol b/test/integration/RevenueShareIntegration.t.sol index 8b96e98ac6..47827c59ed 100644 --- a/test/integration/RevenueShareIntegration.t.sol +++ b/test/integration/RevenueShareIntegration.t.sol @@ -98,14 +98,19 @@ contract RevenueShareIntegrationTest is Test { function _relayAllMessages() internal { vm.selectFork(_optimismForkId); + console2.log("\n"); + console2.log("================================================================================"); + console2.log("=== Replaying Deposit Transactions on L2 ==="); + console2.log("=== Each transaction includes Tenderly simulation parameters ==="); + console2.log("=== Use these to manually verify transactions on Tenderly before execution ==="); + console2.log("================================================================================"); + // Get logs from L1 execution Vm.Log[] memory logs = vm.getRecordedLogs(); // Filter for TransactionDeposited events bytes32 transactionDepositedHash = keccak256("TransactionDeposited(address,address,uint256,bytes)"); - console2.log("\n=== Deduplicating and Replaying Deposit Transactions on L2 ==="); - // First pass: collect unique opaqueData hashes bytes32[] memory seenHashes = new bytes32[](logs.length); uint256 uniqueCount; @@ -131,8 +136,6 @@ contract RevenueShareIntegrationTest is Test { for (uint256 j = 0; j < uniqueCount; j++) { if (seenHashes[j] == dataHash) { isDuplicate = true; - console2.log("\nSkipping duplicate transaction with hash:"); - console2.logBytes32(dataHash); break; } } @@ -169,23 +172,38 @@ contract RevenueShareIntegrationTest is Test { // Extract data (bytes 73 onwards) bytes memory data = _slice(opaqueData, 73, opaqueData.length - 73); + // Print Tenderly simulation parameters + console2.log("\n=== Transaction #", uniqueCount, "- Tenderly Simulation Parameters ==="); + console2.log("To Address (Contract):", to); + console2.log("From Address (Sender):", from); + console2.log("Gas Limit:", uint256(gasLimit)); + console2.log("Value (ETH):", value); + console2.log("Raw Input Data (Calldata):"); + console2.logBytes(data); + + if (data.length >= 4) { + bytes4 selector; + assembly { + selector := mload(add(data, 32)) + } + console2.log("Function Selector:"); + console2.logBytes4(selector); + } + // Execute the transaction on L2 as if it came from the aliased address vm.prank(from); (bool success, bytes memory returnData) = to.call{value: value}(data); if (!success) { - console2.log(" Result: FAILED"); + console2.log("Result: FAILED"); failureCount++; if (returnData.length > 0) { - console2.log(" Error data:"); + console2.log("Error data:"); console2.logBytes(returnData); } } else { - console2.log(" Result: SUCCESS"); + console2.log("Result: SUCCESS"); successCount++; - if (returnData.length > 0) { - console2.log(" Return data length:", returnData.length); - } } } } From 9ea7747ee2d396970879945bf7ea309c5bb22658 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Fri, 10 Oct 2025 11:19:30 -0300 Subject: [PATCH 30/52] test: refactor and add opt out path --- test/integration/IntegrationBase.t.sol | 196 +++++++++++++++++ .../integration/RevenueShareIntegration.t.sol | 200 ++---------------- 2 files changed, 209 insertions(+), 187 deletions(-) create mode 100644 test/integration/IntegrationBase.t.sol diff --git a/test/integration/IntegrationBase.t.sol b/test/integration/IntegrationBase.t.sol new file mode 100644 index 0000000000..2aad4f42f2 --- /dev/null +++ b/test/integration/IntegrationBase.t.sol @@ -0,0 +1,196 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +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"; + +/// @title IntegrationBase +/// @notice Base contract for integration tests with L1->L2 deposit transaction replay functionality +abstract contract IntegrationBase is Test { + /// @notice Replay all deposit transactions from L1 to L2 + function _relayAllMessages(uint256 _forkId) internal { + vm.selectFork(_forkId); + + console2.log("\n"); + console2.log("================================================================================"); + console2.log("=== Replaying Deposit Transactions on L2 ==="); + console2.log("=== Each transaction includes Tenderly simulation link ==="); + console2.log("=== Network is set to 10 (OP Mainnet) - adjust if testing on different L2 ==="); + console2.log("================================================================================"); + + // Get logs from L1 execution + Vm.Log[] memory logs = vm.getRecordedLogs(); + + // Filter for TransactionDeposited events + bytes32 transactionDepositedHash = keccak256("TransactionDeposited(address,address,uint256,bytes)"); + + // First pass: collect unique opaqueData hashes + bytes32[] memory seenHashes = new bytes32[](logs.length); + uint256 uniqueCount; + uint256 successCount; + uint256 failureCount; + + for (uint256 i = 0; i < logs.length; i++) { + // Check if this is a TransactionDeposited event + if (logs[i].topics[0] == transactionDepositedHash) { + // Decode indexed parameters + address from = address(uint160(uint256(logs[i].topics[1]))); + address to = address(uint160(uint256(logs[i].topics[2]))); + + // Decode the opaqueData to check for duplicates + bytes memory opaqueData = abi.decode(logs[i].data, (bytes)); + bytes32 dataHash = keccak256(opaqueData); + + // Check if we've seen this exact transaction before + bool isDuplicate = _isDuplicate(seenHashes, uniqueCount, dataHash); + if (isDuplicate) continue; + + // Mark as seen + seenHashes[uniqueCount] = dataHash; + uniqueCount++; + + // Process and execute the transaction + bool success = _processDepositTransaction(from, to, opaqueData, uniqueCount); + + if (success) { + successCount++; + } else { + failureCount++; + } + } + } + + console2.log("\n=== Summary ==="); + console2.log("Unique transactions:", uniqueCount); + console2.log("Successful transactions:", successCount); + console2.log("Failed transactions:", failureCount); + + // Assert all transactions succeeded + assertEq(failureCount, 0, "All deposit transactions should succeed"); + assertEq(successCount, uniqueCount, "All unique transactions should succeed"); + } + + /// @notice Check if transaction is a duplicate + function _isDuplicate(bytes32[] memory seenHashes, uint256 count, bytes32 hash) internal pure returns (bool) { + for (uint256 j = 0; j < count; j++) { + if (seenHashes[j] == hash) { + return true; + } + } + return false; + } + + /// @notice Process and execute a deposit transaction + function _processDepositTransaction( + address from, + address to, + bytes memory opaqueData, + uint256 txNumber + ) internal returns (bool) { + // Extract value (bytes 0-31) + uint256 value = uint256(bytes32(_slice(opaqueData, 0, 32))); + + // Extract gasLimit (bytes 64-71) + uint64 gasLimit = uint64(bytes8(_slice(opaqueData, 64, 8))); + + // Extract data (bytes 73 onwards) + bytes memory data = _slice(opaqueData, 73, opaqueData.length - 73); + + // Print Tenderly simulation parameters + _logTransactionDetails(from, to, value, gasLimit, data, txNumber); + + // Execute the transaction on L2 as if it came from the aliased address + vm.prank(from); + (bool success, ) = to.call{value: value}(data); + + return success; + } + + /// @notice Log transaction details and Tenderly link + function _logTransactionDetails( + address from, + address to, + uint256 value, + uint64 gasLimit, + bytes memory data, + uint256 txNumber + ) internal view { + if (data.length >= 4) { + bytes4 selector; + assembly { + selector := mload(add(data, 32)) + } + } + + // Generate Tenderly simulation link + string memory tenderlyLink = _generateTenderlyLink(to, from, uint256(gasLimit), value, data); + console2.log("\nTenderly Simulation Link for transaction #", txNumber); + console2.log(tenderlyLink); + } + + /// @notice Helper function to slice bytes + function _slice(bytes memory data, uint256 start, uint256 length) internal pure returns (bytes memory) { + bytes memory result = new bytes(length); + for (uint256 i = 0; i < length; i++) { + result[i] = data[start + i]; + } + return result; + } + + /// @notice Generate Tenderly simulation link for L2 transaction + function _generateTenderlyLink( + address contractAddress, + address from, + uint256 gas, + uint256 value, + bytes memory rawFunctionInput + ) internal pure returns (string memory) { + // Convert bytes to hex string + string memory calldataHex = _bytesToHexString(rawFunctionInput); + + // Build the Tenderly URL + // network=10 for OP Mainnet (change if testing on different L2) + return string.concat( + "https://dashboard.tenderly.co/TENDERLY_USERNAME/TENDERLY_PROJECT/simulator/new", + "?network=10", + "&contractAddress=0x", _toAsciiString(contractAddress), + "&from=0x", _toAsciiString(from), + "&gas=", vm.toString(gas), + "&value=", vm.toString(value), + "&rawFunctionInput=0x", calldataHex + ); + } + + /// @notice Convert address to lowercase hex string without 0x prefix + function _toAsciiString(address addr) internal pure returns (string memory) { + bytes memory s = new bytes(40); + for (uint256 i = 0; i < 20; i++) { + bytes1 b = bytes1(uint8(uint256(uint160(addr)) / (2**(8*(19 - i))))); + bytes1 hi = bytes1(uint8(b) / 16); + bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi)); + s[2*i] = _char(hi); + s[2*i+1] = _char(lo); + } + return string(s); + } + + /// @notice Convert bytes to hex string without 0x prefix + function _bytesToHexString(bytes memory data) internal pure returns (string memory) { + bytes memory hexChars = "0123456789abcdef"; + bytes memory result = new bytes(data.length * 2); + for (uint256 i = 0; i < data.length; i++) { + result[i * 2] = hexChars[uint8(data[i] >> 4)]; + result[i * 2 + 1] = hexChars[uint8(data[i] & 0x0f)]; + } + return string(result); + } + + /// @notice Convert nibble to hex character + function _char(bytes1 b) internal pure returns (bytes1) { + if (uint8(b) < 10) return bytes1(uint8(b) + 0x30); + else return bytes1(uint8(b) + 0x57); + } +} + diff --git a/test/integration/RevenueShareIntegration.t.sol b/test/integration/RevenueShareIntegration.t.sol index 47827c59ed..5ad06d4e70 100644 --- a/test/integration/RevenueShareIntegration.t.sol +++ b/test/integration/RevenueShareIntegration.t.sol @@ -1,50 +1,16 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import {Test} from "forge-std/Test.sol"; -import {Vm} from "forge-std/Vm.sol"; -import {IGnosisSafe, Enum} from "@base-contracts/script/universal/IGnosisSafe.sol"; -import {IMulticall3} from "forge-std/interfaces/IMulticall3.sol"; -import {Signatures} from "@base-contracts/script/universal/Signatures.sol"; import {console2} from "forge-std/console2.sol"; import {RevenueShareV100UpgradePath} from "src/template/RevenueShareUpgradePath.sol"; import {Action} from "src/libraries/MultisigTypes.sol"; -import {AddressAliasHelper} from "@eth-optimism-bedrock/src/vendor/AddressAliasHelper.sol"; +import {IntegrationBase} from "./IntegrationBase.t.sol"; - -struct RelayedMessage { - address target; - bytes callData; - uint256 value; -} - -struct DepositedTransaction { - address from; - address to; - uint256 version; - bytes opaqueData; -} - -interface IOptimismPortal2 { - function depositTransaction(address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes memory _data) - external - payable; -} - -interface IProxy { - function implementation() external view returns (address); -} - -interface IFeeSplitter { - function recipient() external view returns (address); -} - -contract RevenueShareIntegrationTest is Test { +contract RevenueShareIntegrationTest is IntegrationBase { RevenueShareV100UpgradePath public template; // Constants address public constant PORTAL = 0xbEb5Fc579115071764c7423A4f12eDde41f106Ed; - address public constant PROXY_ADMIN_OWNER = 0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A; address public constant CREATE2_DEPLOYER = 0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2; // L2 predeploys @@ -55,8 +21,8 @@ contract RevenueShareIntegrationTest is Test { address internal constant L1_FEE_VAULT = 0x420000000000000000000000000000000000001A; // Fork IDs - uint256 internal _mainnetForkId; - uint256 internal _optimismForkId; + uint256 internal _mainnetForkId; + uint256 internal _optimismForkId; function setUp() public { _mainnetForkId = vm.createFork("http://127.0.0.1:8545"); @@ -68,163 +34,23 @@ contract RevenueShareIntegrationTest is Test { function test_optInRevenueShare_integration() public { string memory configPath = "test/tasks/example/eth/015-revenue-share-upgrade/config.toml"; - // Step 1: Execute L1 transaction - _executeL1Transaction(configPath); + // Step 1: Execute L1 transaction recording logs + vm.recordLogs(); + template.simulate(configPath, new address[](0)); // Step 2: Relay messages from L1 to L2 - _relayAllMessages(); + _relayAllMessages(_optimismForkId); } -/* function test_optOutRevenueShare_integration() public { + function test_optOutRevenueShare_integration() public { string memory configPath = "test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml"; - // Step 1: Execute L1 transaction - _executeL1Transaction(configPath); - - // Step 2: Relay messages from L1 to L2 - _relayAllMessages(); - - // Step 3: Verify L2 state changes - vm.selectFork(l2Fork); - _verifyL2StateOptOut(); - } - */ - function _executeL1Transaction(string memory configPath) internal { + // Step 1: Execute L1 transaction recording logs vm.recordLogs(); - // Get actions from template simulation - (, Action[] memory actions,,, address rootSafe) = template.simulate(configPath, new address[](0)); - } + template.simulate(configPath, new address[](0)); - function _relayAllMessages() internal { - vm.selectFork(_optimismForkId); - - console2.log("\n"); - console2.log("================================================================================"); - console2.log("=== Replaying Deposit Transactions on L2 ==="); - console2.log("=== Each transaction includes Tenderly simulation parameters ==="); - console2.log("=== Use these to manually verify transactions on Tenderly before execution ==="); - console2.log("================================================================================"); - - // Get logs from L1 execution - Vm.Log[] memory logs = vm.getRecordedLogs(); - - // Filter for TransactionDeposited events - bytes32 transactionDepositedHash = keccak256("TransactionDeposited(address,address,uint256,bytes)"); - - // First pass: collect unique opaqueData hashes - bytes32[] memory seenHashes = new bytes32[](logs.length); - uint256 uniqueCount; - - uint256 successCount; - uint256 failureCount; - - for (uint256 i = 0; i < logs.length; i++) { - // Check if this is a TransactionDeposited event - if (logs[i].topics[0] == transactionDepositedHash) { - // Decode indexed parameters - address from = address(uint160(uint256(logs[i].topics[1]))); - address to = address(uint160(uint256(logs[i].topics[2]))); - - // Only process transactions from the aliased PROXY_ADMIN_OWNER - if (from == AddressAliasHelper.applyL1ToL2Alias(PROXY_ADMIN_OWNER)) { - // Decode the opaqueData to check for duplicates - bytes memory opaqueData = abi.decode(logs[i].data, (bytes)); - bytes32 dataHash = keccak256(opaqueData); - - // Check if we've seen this exact transaction before - bool isDuplicate = false; - for (uint256 j = 0; j < uniqueCount; j++) { - if (seenHashes[j] == dataHash) { - isDuplicate = true; - break; - } - } - - // Skip if duplicate - if (isDuplicate) { - continue; - } - - // Mark as seen - seenHashes[uniqueCount] = dataHash; - uniqueCount++; - - // The opaqueData is: abi.encodePacked(mint, value, gasLimit, isCreation, data) - // Layout: - // value: uint256 (32 bytes) - ETH to send with the call - // mint: uint256 (32 bytes) - ETH to mint on L2 - // gasLimit: uint64 (8 bytes) - gas limit for L2 tx - // isCreation: bool (1 byte) - is contract creation - // data: bytes (remaining) - the actual calldata - - // Extract value (bytes 0-31) - uint256 value = uint256(bytes32(_slice(opaqueData, 0, 32))); - - // Extract mint (bytes 32-63) - uint256 mint = uint256(bytes32(_slice(opaqueData, 32, 32))); - - // Extract gasLimit (bytes 64-71) - uint64 gasLimit = uint64(bytes8(_slice(opaqueData, 64, 8))); - - // Extract isCreation (byte 72) - bool isCreation = uint8(opaqueData[72]) != 0; - - // Extract data (bytes 73 onwards) - bytes memory data = _slice(opaqueData, 73, opaqueData.length - 73); - - // Print Tenderly simulation parameters - console2.log("\n=== Transaction #", uniqueCount, "- Tenderly Simulation Parameters ==="); - console2.log("To Address (Contract):", to); - console2.log("From Address (Sender):", from); - console2.log("Gas Limit:", uint256(gasLimit)); - console2.log("Value (ETH):", value); - console2.log("Raw Input Data (Calldata):"); - console2.logBytes(data); - - if (data.length >= 4) { - bytes4 selector; - assembly { - selector := mload(add(data, 32)) - } - console2.log("Function Selector:"); - console2.logBytes4(selector); - } - - // Execute the transaction on L2 as if it came from the aliased address - vm.prank(from); - (bool success, bytes memory returnData) = to.call{value: value}(data); - - if (!success) { - console2.log("Result: FAILED"); - failureCount++; - if (returnData.length > 0) { - console2.log("Error data:"); - console2.logBytes(returnData); - } - } else { - console2.log("Result: SUCCESS"); - successCount++; - } - } - } - } - - console2.log("\n=== Summary ==="); - console2.log("Unique transactions:", uniqueCount); - console2.log("Successful transactions:", successCount); - console2.log("Failed transactions:", failureCount); - - // Assert all transactions succeeded - assertEq(failureCount, 0, "All deposit transactions should succeed"); - assertEq(successCount, uniqueCount, "All unique transactions should succeed"); + // Step 2: Relay messages from L1 to L2 + _relayAllMessages(_optimismForkId); } - /// @notice Helper function to slice bytes - function _slice(bytes memory data, uint256 start, uint256 length) internal pure returns (bytes memory) { - bytes memory result = new bytes(length); - for (uint256 i = 0; i < length; i++) { - result[i] = data[start + i]; - } - return result; - } } \ No newline at end of file From c2f80ca9167108caa1908e9aa0f8f55ee1234587 Mon Sep 17 00:00:00 2001 From: Flux <175354924+0xiamflux@users.noreply.github.com> Date: Mon, 13 Oct 2025 20:07:09 -0400 Subject: [PATCH 31/52] chore: updates the bytecode for vaults, using initialize instead of constructor --- src/libraries/RevShareCodeRepo.sol | 10 +- src/template/RevenueShareUpgradePath.sol | 139 +++++++++++++++++------ 2 files changed, 110 insertions(+), 39 deletions(-) diff --git a/src/libraries/RevShareCodeRepo.sol b/src/libraries/RevShareCodeRepo.sol index 5dc5e7a374..a7a14583ca 100644 --- a/src/libraries/RevShareCodeRepo.sol +++ b/src/libraries/RevShareCodeRepo.sol @@ -4,15 +4,15 @@ pragma solidity 0.8.15; /// @notice Library for storing the creation code for the revenue share contracts. library RevShareCodeRepo { /// @notice The creation code for each fee vault, fee splitter, l1 withdrawer, FeesDepositor and sc rev share calculator. - /// Obtained from https://github.com/defi-wonderland/optimism at commit 799f92f298ce4a0b40ec36fdcbcddf8f8fe946d1 + /// Obtained from https://github.com/defi-wonderland/optimism at commit 989afa818dfee3ee1fba715584c2f7e8663268f8 bytes public constant operatorFeeVaultCreationCode = - hex"60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a"; + hex"6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610eb9806100d65f395ff3fe6080604052600436106100d1575f3560e01c806382356d8a1161007c57806385b5b14d1161005757806385b5b14d14610276578063b49dc74114610295578063d0e12f90146102b4578063d3e5792b146102e3575f80fd5b806382356d8a1461020f5780638312f1491461024d57806384411d6514610262575f80fd5b80633ccfd60b116100ac5780633ccfd60b1461016c57806354fd4d501461018e57806366d003ac146101e3575f80fd5b80630d9019e1146100dc578063307f29621461012c5780633bbed4a01461014d575f80fd5b366100d857005b5f80fd5b3480156100e7575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610137575f80fd5b5061014b610146366004610c86565b6102f7565b005b348015610158575f80fd5b5061014b610167366004610cc3565b61047a565b348015610177575f80fd5b506101806105de565b604051908152602001610123565b348015610199575f80fd5b506101d66040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516101239190610cde565b3480156101ee575f80fd5b506002546101029073ffffffffffffffffffffffffffffffffffffffff1681565b34801561021a575f80fd5b506002546102409074010000000000000000000000000000000000000000900460ff1681565b6040516101239190610d97565b348015610258575f80fd5b5061018060015481565b34801561026d575f80fd5b506101805f5481565b348015610281575f80fd5b5061014b610290366004610dab565b610918565b3480156102a0575f80fd5b5061014b6102af366004610dc2565b610a3b565b3480156102bf575f80fd5b5060025474010000000000000000000000000000000000000000900460ff16610240565b3480156102ee575f80fd5b50600154610180565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610354573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103789190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103dc576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043857610438610d31565b02179055507ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8818360405161046e929190610e18565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fb9190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461055f576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161046e565b5f60015447101561069c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050805f808282546106af9190610e33565b90915550506002546040805183815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a16002546040517f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee9161077491849173ffffffffffffffffffffffffffffffffffffffff811691339174010000000000000000000000000000000000000000900460ff1690610e6b565b60405180910390a1600160025474010000000000000000000000000000000000000000900460ff1660018111156107ad576107ad610d31565b0361086a576002545f906107d79073ffffffffffffffffffffffffffffffffffffffff1683610c4f565b905080610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e74000000000000000000000000000000006064820152608401610693565b5090565b6002546040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a806024820152606060448201525f60648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084015f604051808303818588803b1580156108fe575f80fd5b505af1158015610910573d5f803e3d5ffd5b505050505090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610975573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109999190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109fd576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e4203910161046e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610a855750825b90505f8267ffffffffffffffff166001148015610aa15750303b155b905081158015610aaf575080155b15610ae6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610b475784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6002805473ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117835560018a81558993927fffffffffffffffffffffff000000000000000000000000000000000000000000169091179074010000000000000000000000000000000000000000908490811115610bdf57610bdf610d31565b02179055508315610c455784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610c5b835a84610c62565b9392505050565b5f805f805f858888f1949350505050565b803560028110610c81575f80fd5b919050565b5f60208284031215610c96575f80fd5b610c5b82610c73565b73ffffffffffffffffffffffffffffffffffffffff81168114610cc0575f80fd5b50565b5f60208284031215610cd3575f80fd5b8135610c5b81610c9f565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110610d93577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610da58284610d5e565b92915050565b5f60208284031215610dbb575f80fd5b5035919050565b5f805f60608486031215610dd4575f80fd5b8335610ddf81610c9f565b925060208401359150610df460408501610c73565b90509250925092565b5f60208284031215610e0d575f80fd5b8151610c5b81610c9f565b60408101610e268285610d5e565b610c5b6020830184610d5e565b80820180821115610da5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610ea36060830184610d5e565b9594505050505056fea164736f6c6343000819000a"; bytes public constant sequencerFeeVaultCreationCode = - hex"60e060405234801561001057600080fd5b50604051610f6b380380610f6b83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e466101256000396000818161028f0152610a0101526000818160f401526109910152600081816102c30152610a550152610e466000f3fe6080604052600436106100d65760003560e01c806382356d8a1161007f57806385b5b14d1161005957806385b5b14d1461025d578063d0e12f901461027d578063d3e5792b146102b1578063d4ff9218146102e557600080fd5b806382356d8a146102105780638312f1491461023257806384411d651461024757600080fd5b80633ccfd60b116100b05780633ccfd60b1461018257806354fd4d50146101a557806366d003ac146101fb57600080fd5b80630d9019e1146100e2578063307f2962146101405780633bbed4a01461016257600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506101167f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014c57600080fd5b5061016061015b366004610c14565b6102fa565b005b34801561016e57600080fd5b5061016061017d366004610c5a565b6104c2565b34801561018e57600080fd5b50610197610642565b604051908152602001610137565b3480156101b157600080fd5b506101ee6040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b6040516101379190610c77565b34801561020757600080fd5b5061011661094a565b34801561021c57600080fd5b506102256109b3565b6040516101379190610d54565b34801561023e57600080fd5b50610197610a23565b34801561025357600080fd5b5061019760005481565b34801561026957600080fd5b50610160610278366004610d68565b610a77565b34801561028957600080fd5b506102257f000000000000000000000000000000000000000000000000000000000000000081565b3480156102bd57600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f157600080fd5b50610116610bdd565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610359573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037d9190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103e1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043d5761043d610cea565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104b69083908590610d9e565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610521573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105459190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105a9576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e459391016104b6565b600061064c610a23565b471015610706576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b4790508060008082825461071a9190610db9565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161074a61094a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee816107a861094a565b336107b16109b3565b6040516107c19493929190610df8565b60405180910390a160016107d36109b3565b60018111156107e4576107e4610cea565b0361088f5760006107fc6107f661094a565b83610bec565b90508061088b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106fd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac826108b261094a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561092e57600080fd5b505af1158015610942573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561098e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109fe575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a52575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ad6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afa9190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b5e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e420391016104b6565b6000610be761094a565b905090565b6000610bf9835a84610c00565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610c2657600080fd5b813560028110610bf957600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c5757600080fd5b50565b600060208284031215610c6c57600080fd5b8135610bf981610c35565b600060208083528351808285015260005b81811015610ca457858101830151858201604001528201610c88565b81811115610cb6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d50577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d628284610d19565b92915050565b600060208284031215610d7a57600080fd5b5035919050565b600060208284031215610d9357600080fd5b8151610bf981610c35565b60408101610dac8285610d19565b610bf96020830184610d19565b60008219821115610df3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e306060830184610d19565b9594505050505056fea164736f6c634300080f000a"; + hex"6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610ec4806100d65f395ff3fe6080604052600436106100dc575f3560e01c80638312f1491161007c578063b49dc74111610057578063b49dc741146102a0578063d0e12f90146102bf578063d3e5792b146102ee578063d4ff9218146100e7575f80fd5b80638312f1491461025857806384411d651461026d57806385b5b14d14610281575f80fd5b80633ccfd60b116100b75780633ccfd60b1461017757806354fd4d501461019957806366d003ac146101ee57806382356d8a1461021a575f80fd5b80630d9019e1146100e7578063307f2962146101375780633bbed4a014610158575f80fd5b366100e357005b5f80fd5b3480156100f2575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610142575f80fd5b50610156610151366004610c91565b610302565b005b348015610163575f80fd5b50610156610172366004610cce565b610485565b348015610182575f80fd5b5061018b6105e9565b60405190815260200161012e565b3480156101a4575f80fd5b506101e16040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012e9190610ce9565b3480156101f9575f80fd5b5060025461010d9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610225575f80fd5b5060025461024b9074010000000000000000000000000000000000000000900460ff1681565b60405161012e9190610da2565b348015610263575f80fd5b5061018b60015481565b348015610278575f80fd5b5061018b5f5481565b34801561028c575f80fd5b5061015661029b366004610db6565b610923565b3480156102ab575f80fd5b506101566102ba366004610dcd565b610a46565b3480156102ca575f80fd5b5060025474010000000000000000000000000000000000000000900460ff1661024b565b3480156102f9575f80fd5b5060015461018b565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561035f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103839190610e08565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103e7576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561044357610443610d3c565b02179055507ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc88183604051610479929190610e23565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105069190610e08565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461056a576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610479565b5f6001544710156106a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050805f808282546106ba9190610e3e565b90915550506002546040805183815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a16002546040517f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee9161077f91849173ffffffffffffffffffffffffffffffffffffffff811691339174010000000000000000000000000000000000000000900460ff1690610e76565b60405180910390a1600160025474010000000000000000000000000000000000000000900460ff1660018111156107b8576107b8610d3c565b03610875576002545f906107e29073ffffffffffffffffffffffffffffffffffffffff1683610c5a565b905080610871576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e7400000000000000000000000000000000606482015260840161069e565b5090565b6002546040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a806024820152606060448201525f60648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084015f604051808303818588803b158015610909575f80fd5b505af115801561091b573d5f803e3d5ffd5b505050505090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610980573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109a49190610e08565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a08576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610479565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610a905750825b90505f8267ffffffffffffffff166001148015610aac5750303b155b905081158015610aba575080155b15610af1576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610b525784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6002805473ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117835560018a81558993927fffffffffffffffffffffff000000000000000000000000000000000000000000169091179074010000000000000000000000000000000000000000908490811115610bea57610bea610d3c565b02179055508315610c505784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610c66835a84610c6d565b9392505050565b5f805f805f858888f1949350505050565b803560028110610c8c575f80fd5b919050565b5f60208284031215610ca1575f80fd5b610c6682610c7e565b73ffffffffffffffffffffffffffffffffffffffff81168114610ccb575f80fd5b50565b5f60208284031215610cde575f80fd5b8135610c6681610caa565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110610d9e577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610db08284610d69565b92915050565b5f60208284031215610dc6575f80fd5b5035919050565b5f805f60608486031215610ddf575f80fd5b8335610dea81610caa565b925060208401359150610dff60408501610c7e565b90509250925092565b5f60208284031215610e18575f80fd5b8151610c6681610caa565b60408101610e318285610d69565b610c666020830184610d69565b80820180821115610db0577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610eae6060830184610d69565b9594505050505056fea164736f6c6343000819000a"; bytes public constant baseFeeVaultCreationCode = - hex"60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a"; + hex"6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610eb9806100d65f395ff3fe6080604052600436106100d1575f3560e01c806382356d8a1161007c57806385b5b14d1161005757806385b5b14d14610276578063b49dc74114610295578063d0e12f90146102b4578063d3e5792b146102e3575f80fd5b806382356d8a1461020f5780638312f1491461024d57806384411d6514610262575f80fd5b80633ccfd60b116100ac5780633ccfd60b1461016c57806354fd4d501461018e57806366d003ac146101e3575f80fd5b80630d9019e1146100dc578063307f29621461012c5780633bbed4a01461014d575f80fd5b366100d857005b5f80fd5b3480156100e7575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610137575f80fd5b5061014b610146366004610c86565b6102f7565b005b348015610158575f80fd5b5061014b610167366004610cc3565b61047a565b348015610177575f80fd5b506101806105de565b604051908152602001610123565b348015610199575f80fd5b506101d66040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b6040516101239190610cde565b3480156101ee575f80fd5b506002546101029073ffffffffffffffffffffffffffffffffffffffff1681565b34801561021a575f80fd5b506002546102409074010000000000000000000000000000000000000000900460ff1681565b6040516101239190610d97565b348015610258575f80fd5b5061018060015481565b34801561026d575f80fd5b506101805f5481565b348015610281575f80fd5b5061014b610290366004610dab565b610918565b3480156102a0575f80fd5b5061014b6102af366004610dc2565b610a3b565b3480156102bf575f80fd5b5060025474010000000000000000000000000000000000000000900460ff16610240565b3480156102ee575f80fd5b50600154610180565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610354573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103789190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103dc576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043857610438610d31565b02179055507ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8818360405161046e929190610e18565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fb9190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461055f576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161046e565b5f60015447101561069c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050805f808282546106af9190610e33565b90915550506002546040805183815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a16002546040517f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee9161077491849173ffffffffffffffffffffffffffffffffffffffff811691339174010000000000000000000000000000000000000000900460ff1690610e6b565b60405180910390a1600160025474010000000000000000000000000000000000000000900460ff1660018111156107ad576107ad610d31565b0361086a576002545f906107d79073ffffffffffffffffffffffffffffffffffffffff1683610c4f565b905080610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e74000000000000000000000000000000006064820152608401610693565b5090565b6002546040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a806024820152606060448201525f60648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084015f604051808303818588803b1580156108fe575f80fd5b505af1158015610910573d5f803e3d5ffd5b505050505090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610975573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109999190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109fd576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e4203910161046e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610a855750825b90505f8267ffffffffffffffff166001148015610aa15750303b155b905081158015610aaf575080155b15610ae6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610b475784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6002805473ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117835560018a81558993927fffffffffffffffffffffff000000000000000000000000000000000000000000169091179074010000000000000000000000000000000000000000908490811115610bdf57610bdf610d31565b02179055508315610c455784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610c5b835a84610c62565b9392505050565b5f805f805f858888f1949350505050565b803560028110610c81575f80fd5b919050565b5f60208284031215610c96575f80fd5b610c5b82610c73565b73ffffffffffffffffffffffffffffffffffffffff81168114610cc0575f80fd5b50565b5f60208284031215610cd3575f80fd5b8135610c5b81610c9f565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110610d93577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610da58284610d5e565b92915050565b5f60208284031215610dbb575f80fd5b5035919050565b5f805f60608486031215610dd4575f80fd5b8335610ddf81610c9f565b925060208401359150610df460408501610c73565b90509250925092565b5f60208284031215610e0d575f80fd5b8151610c5b81610c9f565b60408101610e268285610d5e565b610c5b6020830184610d5e565b80820180821115610da5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610ea36060830184610d5e565b9594505050505056fea164736f6c6343000819000a"; bytes public constant l1FeeVaultCreationCode = - hex"60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a"; + hex"6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610eb9806100d65f395ff3fe6080604052600436106100d1575f3560e01c806382356d8a1161007c57806385b5b14d1161005757806385b5b14d14610276578063b49dc74114610295578063d0e12f90146102b4578063d3e5792b146102e3575f80fd5b806382356d8a1461020f5780638312f1491461024d57806384411d6514610262575f80fd5b80633ccfd60b116100ac5780633ccfd60b1461016c57806354fd4d501461018e57806366d003ac146101e3575f80fd5b80630d9019e1146100dc578063307f29621461012c5780633bbed4a01461014d575f80fd5b366100d857005b5f80fd5b3480156100e7575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610137575f80fd5b5061014b610146366004610c86565b6102f7565b005b348015610158575f80fd5b5061014b610167366004610cc3565b61047a565b348015610177575f80fd5b506101806105de565b604051908152602001610123565b348015610199575f80fd5b506101d66040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b6040516101239190610cde565b3480156101ee575f80fd5b506002546101029073ffffffffffffffffffffffffffffffffffffffff1681565b34801561021a575f80fd5b506002546102409074010000000000000000000000000000000000000000900460ff1681565b6040516101239190610d97565b348015610258575f80fd5b5061018060015481565b34801561026d575f80fd5b506101805f5481565b348015610281575f80fd5b5061014b610290366004610dab565b610918565b3480156102a0575f80fd5b5061014b6102af366004610dc2565b610a3b565b3480156102bf575f80fd5b5060025474010000000000000000000000000000000000000000900460ff16610240565b3480156102ee575f80fd5b50600154610180565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610354573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103789190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103dc576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043857610438610d31565b02179055507ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8818360405161046e929190610e18565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fb9190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461055f576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161046e565b5f60015447101561069c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050805f808282546106af9190610e33565b90915550506002546040805183815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a16002546040517f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee9161077491849173ffffffffffffffffffffffffffffffffffffffff811691339174010000000000000000000000000000000000000000900460ff1690610e6b565b60405180910390a1600160025474010000000000000000000000000000000000000000900460ff1660018111156107ad576107ad610d31565b0361086a576002545f906107d79073ffffffffffffffffffffffffffffffffffffffff1683610c4f565b905080610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e74000000000000000000000000000000006064820152608401610693565b5090565b6002546040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a806024820152606060448201525f60648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084015f604051808303818588803b1580156108fe575f80fd5b505af1158015610910573d5f803e3d5ffd5b505050505090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610975573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109999190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109fd576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e4203910161046e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610a855750825b90505f8267ffffffffffffffff166001148015610aa15750303b155b905081158015610aaf575080155b15610ae6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610b475784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6002805473ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117835560018a81558993927fffffffffffffffffffffff000000000000000000000000000000000000000000169091179074010000000000000000000000000000000000000000908490811115610bdf57610bdf610d31565b02179055508315610c455784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610c5b835a84610c62565b9392505050565b5f805f805f858888f1949350505050565b803560028110610c81575f80fd5b919050565b5f60208284031215610c96575f80fd5b610c5b82610c73565b73ffffffffffffffffffffffffffffffffffffffff81168114610cc0575f80fd5b50565b5f60208284031215610cd3575f80fd5b8135610c5b81610c9f565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110610d93577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610da58284610d5e565b92915050565b5f60208284031215610dbb575f80fd5b5035919050565b5f805f60608486031215610dd4575f80fd5b8335610ddf81610c9f565b925060208401359150610df460408501610c73565b90509250925092565b5f60208284031215610e0d575f80fd5b8151610c5b81610c9f565b60408101610e268285610d5e565b610c5b6020830184610d5e565b80820180821115610da5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610ea36060830184610d5e565b9594505050505056fea164736f6c6343000819000a"; bytes public constant feeSplitterCreationCode = hex"6080604052348015600e575f80fd5b5060156019565b60d4565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101560d2575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6112f1806100e15f395ff3fe608060405260043610610096575f3560e01c80637dfbd04911610066578063b87ea8d41161004c578063b87ea8d414610313578063c4d66de814610327578063d61a398b14610346575f80fd5b80637dfbd049146102dd5780637fc81bb7146102f4575f80fd5b80630a7617b3146101dd5780630c0544a3146101fe578063394d27311461026057806354fd4d5014610288575f80fd5b366101d9577fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455c6100f3576040517f17617f6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b337342000000000000000000000000000000000000111480159061012b57503373420000000000000000000000000000000000001914155b801561014b57503373420000000000000000000000000000000000001a14155b801561016b57503373420000000000000000000000000000000000001b14155b156101a2576040517f9dcde10900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405134815233907f2ccfc58c2cef4ee590b5f16be0548cc54afc12e1c66a67b362b7d640fd16bb2d9060200160405180910390a2005b5f80fd5b3480156101e8575f80fd5b506101fc6101f7366004610f4b565b61039c565b005b348015610209575f80fd5b5060015461023a9070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561026b575f80fd5b5060015461023a906fffffffffffffffffffffffffffffffff1681565b348015610293575f80fd5b506102d06040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516102579190610f66565b3480156102e8575f80fd5b5061023a6301e1338081565b3480156102ff575f80fd5b506101fc61030e366004610fb9565b61055e565b34801561031e575f80fd5b506101fc610706565b348015610332575f80fd5b506101fc610341366004610f4b565b610aea565b348015610351575f80fd5b505f546103779062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610257565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041d9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610481576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166104ce576040517f99c6ec0800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff85161790945560408051949093049091168084526020840191909152917f16417cc372deec0caee5f52e2ad77a5f07b4591fd56b4ff31b6e20f817d4daeb91015b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105df9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610643576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6301e133806fffffffffffffffffffffffffffffffff82161115610693576040517f30b9f35e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546fffffffffffffffffffffffffffffffff8381167001000000000000000000000000000000008181028385161790945560408051949093049091168084526020840191909152917f4492086b630ed3846eec0979dd87a71c814ceb1c6dab80ab81e3450b21e4de289101610552565b60015461073b906fffffffffffffffffffffffffffffffff700100000000000000000000000000000000820481169116611030565b6fffffffffffffffffffffffffffffffff16421015610786576040517f1e4a9f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016426fffffffffffffffffffffffffffffffff161781556107cb90610ce0565b5f6107e9734200000000000000000000000000000000000011610d06565b90505f610809734200000000000000000000000000000000000019610d06565b90505f61082973420000000000000000000000000000000000001a610d06565b90505f61084973420000000000000000000000000000000000001b610d06565b90506108545f610ce0565b5f82826108618688611060565b61086b9190611060565b6108759190611060565b9050805f036108b0576040517fc8972e5200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517f54e7f42d000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101859052606481018690526201000090910473ffffffffffffffffffffffffffffffffffffffff16906354e7f42d906084015f60405180830381865afa158015610936573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261097b9190810190611118565b905080515f036109b7576040517f763970d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b8251811015610a6e575f8382815181106109d6576109d66111e7565b60200260200101515f015190505f8483815181106109f6576109f66111e7565b6020026020010151602001519050805f03610a12575050610a66565b5f610a1d8383610f03565b905080610a56576040517fd68d1b1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a608286611060565b94505050505b6001016109ba565b50828114610aa8576040517f9c01eac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f73f9a13241a1848ec157967f3a85601709353e616f1f2605d818c0f2d21774df8284604051610ad9929190611214565b60405180910390a150505050505050565b5f54610100900460ff1615808015610b0857505f54600160ff909116105b80610b215750303b158015610b2157505f5460ff166001145b610bb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610c0d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff851602179055600180546fffffffffffffffffffffffffffffffff1672015180000000000000000000000000000000001790558015610cdc575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610552565b5050565b807fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455d50565b5f60018273ffffffffffffffffffffffffffffffffffffffff166382356d8a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d7691906112af565b6001811115610d8757610d87611282565b14610dbe576040517fb4726cbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff166366d003ac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e429190610fe8565b73ffffffffffffffffffffffffffffffffffffffff1614610e8f576040517fc3380cef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610ed9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610efd91906112cd565b92915050565b5f610f0f835a84610f16565b9392505050565b5f805f805f858888f1949350505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f48575f80fd5b50565b5f60208284031215610f5b575f80fd5b8135610f0f81610f27565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f60208284031215610fc9575f80fd5b81356fffffffffffffffffffffffffffffffff81168114610f0f575f80fd5b5f60208284031215610ff8575f80fd5b8151610f0f81610f27565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6fffffffffffffffffffffffffffffffff81811683821601908082111561105957611059611003565b5092915050565b80820180821115610efd57610efd611003565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156110c3576110c3611073565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561111057611110611073565b604052919050565b5f6020808385031215611129575f80fd5b825167ffffffffffffffff80821115611140575f80fd5b818501915085601f830112611153575f80fd5b81518181111561116557611165611073565b611173848260051b016110c9565b818152848101925060069190911b830184019087821115611192575f80fd5b928401925b818410156111dc57604084890312156111ae575f80fd5b6111b66110a0565b84516111c181610f27565b81528486015186820152835260409093019291840191611197565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604080825283518282018190525f91906020906060850190828801855b8281101561126c578151805173ffffffffffffffffffffffffffffffffffffffff168552850151858501529285019290840190600101611231565b5050508093505050508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f602082840312156112bf575f80fd5b815160028110610f0f575f80fd5b5f602082840312156112dd575f80fd5b505191905056fea164736f6c6343000819000a"; bytes public constant scRevShareCalculatorCreationCode = diff --git a/src/template/RevenueShareUpgradePath.sol b/src/template/RevenueShareUpgradePath.sol index 5a31fef5bf..e97bbd10ae 100644 --- a/src/template/RevenueShareUpgradePath.sol +++ b/src/template/RevenueShareUpgradePath.sol @@ -27,6 +27,11 @@ interface IFeeSplitter { function initialize(address _sharesCalculator) external; } +/// @notice Interface for the vaults in L2. +interface IFeeVault { + function initialize(address _recipient, uint256 _minWithdrawalAmount, uint8 _withdrawalNetwork) external; +} + /// @notice Interface for ProxyAdmin. interface IProxyAdmin { function upgrade(address payable _proxy, address _implementation) external; @@ -322,12 +327,7 @@ contract RevenueShareV100UpgradePath is SimpleTaskBase { // Calculate addresses and data to deploy vaults // Calculate addresses and data to deploy OperatorFeeVault - bytes memory _operatorFeeVaultInitCode = bytes.concat( - RevShareCodeRepo.operatorFeeVaultCreationCode, - abi.encode( - operatorFeeVaultRecipient, operatorFeeVaultMinWithdrawalAmount, operatorFeeVaultWithdrawalNetwork - ) - ); + bytes memory _operatorFeeVaultInitCode = RevShareCodeRepo.operatorFeeVaultCreationCode; _operatorFeeVaultPrecalculatedAddress = Utils.getCreate2Address(_getSalt(saltSeed, "OperatorFeeVault"), _operatorFeeVaultInitCode, CREATE2_DEPLOYER); @@ -335,7 +335,7 @@ contract RevenueShareV100UpgradePath is SimpleTaskBase { ICreate2Deployer.deploy, (0, _getSalt(saltSeed, "OperatorFeeVault"), _operatorFeeVaultInitCode) ); - // Expected calls for OperatorFeeVault: 2 (deploy + upgrade) + // Expected calls for OperatorFeeVault: 2 (deploy + upgradeAndCall) _incrementCallsToPortal( abi.encodeCall( IOptimismPortal2.depositTransaction, @@ -351,20 +351,26 @@ contract RevenueShareV100UpgradePath is SimpleTaskBase { UPGRADE_GAS_LIMIT, false, abi.encodeCall( - IProxyAdmin.upgrade, - (payable(OPERATOR_FEE_VAULT), address(_operatorFeeVaultPrecalculatedAddress)) + IProxyAdmin.upgradeAndCall, + ( + payable(OPERATOR_FEE_VAULT), + address(_operatorFeeVaultPrecalculatedAddress), + abi.encodeCall( + IFeeVault.initialize, + ( + operatorFeeVaultRecipient, + operatorFeeVaultMinWithdrawalAmount, + operatorFeeVaultWithdrawalNetwork + ) + ) + ) ) ) ) ); // Calculate addresses and data to deploy SequencerFeeVault - bytes memory _sequencerFeeVaultInitCode = bytes.concat( - RevShareCodeRepo.sequencerFeeVaultCreationCode, - abi.encode( - sequencerFeeVaultRecipient, sequencerFeeVaultMinWithdrawalAmount, sequencerFeeVaultWithdrawalNetwork - ) - ); + bytes memory _sequencerFeeVaultInitCode = RevShareCodeRepo.sequencerFeeVaultCreationCode; _sequencerFeeVaultPrecalculatedAddress = Utils.getCreate2Address( _getSalt(saltSeed, "SequencerFeeVault"), _sequencerFeeVaultInitCode, CREATE2_DEPLOYER ); @@ -388,24 +394,32 @@ contract RevenueShareV100UpgradePath is SimpleTaskBase { UPGRADE_GAS_LIMIT, false, abi.encodeCall( - IProxyAdmin.upgrade, - (payable(SEQUENCER_FEE_VAULT), address(_sequencerFeeVaultPrecalculatedAddress)) + IProxyAdmin.upgradeAndCall, + ( + payable(SEQUENCER_FEE_VAULT), + address(_sequencerFeeVaultPrecalculatedAddress), + abi.encodeCall( + IFeeVault.initialize, + ( + sequencerFeeVaultRecipient, + sequencerFeeVaultMinWithdrawalAmount, + sequencerFeeVaultWithdrawalNetwork + ) + ) + ) ) ) ) ); // Calculate addresses and data to deploy BaseFeeVault - bytes memory _baseFeeVaultInitCode = bytes.concat( - RevShareCodeRepo.baseFeeVaultCreationCode, - abi.encode(baseFeeVaultRecipient, baseFeeVaultMinWithdrawalAmount, baseFeeVaultWithdrawalNetwork) - ); + bytes memory _baseFeeVaultInitCode = RevShareCodeRepo.baseFeeVaultCreationCode; _baseFeeVaultPrecalculatedAddress = Utils.getCreate2Address(_getSalt(saltSeed, "BaseFeeVault"), _baseFeeVaultInitCode, CREATE2_DEPLOYER); _baseFeeVaultCalldata = abi.encodeCall(ICreate2Deployer.deploy, (0, _getSalt(saltSeed, "BaseFeeVault"), _baseFeeVaultInitCode)); - // Expected calls for BaseFeeVault: 2 (deploy + upgrade) + // Expected calls for BaseFeeVault: 2 (deploy + upgradeAndCall) _incrementCallsToPortal( abi.encodeCall( IOptimismPortal2.depositTransaction, @@ -421,23 +435,28 @@ contract RevenueShareV100UpgradePath is SimpleTaskBase { UPGRADE_GAS_LIMIT, false, abi.encodeCall( - IProxyAdmin.upgrade, (payable(BASE_FEE_VAULT), address(_baseFeeVaultPrecalculatedAddress)) + IProxyAdmin.upgradeAndCall, + ( + payable(BASE_FEE_VAULT), + address(_baseFeeVaultPrecalculatedAddress), + abi.encodeCall( + IFeeVault.initialize, + (baseFeeVaultRecipient, baseFeeVaultMinWithdrawalAmount, baseFeeVaultWithdrawalNetwork) + ) + ) ) ) ) ); // Calculate addresses and data to deploy L1FeeVault - bytes memory _l1FeeVaultInitCode = bytes.concat( - RevShareCodeRepo.l1FeeVaultCreationCode, - abi.encode(l1FeeVaultRecipient, l1FeeVaultMinWithdrawalAmount, l1FeeVaultWithdrawalNetwork) - ); + bytes memory _l1FeeVaultInitCode = RevShareCodeRepo.l1FeeVaultCreationCode; _l1FeeVaultPrecalculatedAddress = Utils.getCreate2Address(_getSalt(saltSeed, "L1FeeVault"), _l1FeeVaultInitCode, CREATE2_DEPLOYER); _l1FeeVaultCalldata = abi.encodeCall(ICreate2Deployer.deploy, (0, _getSalt(saltSeed, "L1FeeVault"), _l1FeeVaultInitCode)); - // Expected calls for L1FeeVault: 2 (deploy + upgrade) + // Expected calls for L1FeeVault: 2 (deploy + upgradeAndCall) _incrementCallsToPortal( abi.encodeCall( IOptimismPortal2.depositTransaction, @@ -453,7 +472,15 @@ contract RevenueShareV100UpgradePath is SimpleTaskBase { UPGRADE_GAS_LIMIT, false, abi.encodeCall( - IProxyAdmin.upgrade, (payable(L1_FEE_VAULT), address(_l1FeeVaultPrecalculatedAddress)) + IProxyAdmin.upgradeAndCall, + ( + payable(L1_FEE_VAULT), + address(_l1FeeVaultPrecalculatedAddress), + abi.encodeCall( + IFeeVault.initialize, + (l1FeeVaultRecipient, l1FeeVaultMinWithdrawalAmount, l1FeeVaultWithdrawalNetwork) + ) + ) ) ) ) @@ -467,7 +494,7 @@ contract RevenueShareV100UpgradePath is SimpleTaskBase { _getSalt(saltSeed, "FeeSplitter"), RevShareCodeRepo.feeSplitterCreationCode, CREATE2_DEPLOYER ); - // Expected calls for FeeSplitter: 2 (deploy + upgrade) + // Expected calls for FeeSplitter: 2 (deploy + upgradeAndCall) _incrementCallsToPortal( abi.encodeCall( IOptimismPortal2.depositTransaction, @@ -561,7 +588,19 @@ contract RevenueShareV100UpgradePath is SimpleTaskBase { UPGRADE_GAS_LIMIT, false, abi.encodeCall( - IProxyAdmin.upgrade, (payable(OPERATOR_FEE_VAULT), address(_operatorFeeVaultPrecalculatedAddress)) + IProxyAdmin.upgradeAndCall, + ( + payable(OPERATOR_FEE_VAULT), + address(_operatorFeeVaultPrecalculatedAddress), + abi.encodeCall( + IFeeVault.initialize, + ( + operatorFeeVaultRecipient, + operatorFeeVaultMinWithdrawalAmount, + operatorFeeVaultWithdrawalNetwork + ) + ) + ) ) ); @@ -575,7 +614,19 @@ contract RevenueShareV100UpgradePath is SimpleTaskBase { UPGRADE_GAS_LIMIT, false, abi.encodeCall( - IProxyAdmin.upgrade, (payable(SEQUENCER_FEE_VAULT), address(_sequencerFeeVaultPrecalculatedAddress)) + IProxyAdmin.upgradeAndCall, + ( + payable(SEQUENCER_FEE_VAULT), + address(_sequencerFeeVaultPrecalculatedAddress), + abi.encodeCall( + IFeeVault.initialize, + ( + sequencerFeeVaultRecipient, + sequencerFeeVaultMinWithdrawalAmount, + sequencerFeeVaultWithdrawalNetwork + ) + ) + ) ) ); @@ -588,7 +639,17 @@ contract RevenueShareV100UpgradePath is SimpleTaskBase { 0, UPGRADE_GAS_LIMIT, false, - abi.encodeCall(IProxyAdmin.upgrade, (payable(BASE_FEE_VAULT), address(_baseFeeVaultPrecalculatedAddress))) + abi.encodeCall( + IProxyAdmin.upgradeAndCall, + ( + payable(BASE_FEE_VAULT), + address(_baseFeeVaultPrecalculatedAddress), + abi.encodeCall( + IFeeVault.initialize, + (baseFeeVaultRecipient, baseFeeVaultMinWithdrawalAmount, baseFeeVaultWithdrawalNetwork) + ) + ) + ) ); // Deploy the l1 fee vault @@ -600,7 +661,17 @@ contract RevenueShareV100UpgradePath is SimpleTaskBase { 0, UPGRADE_GAS_LIMIT, false, - abi.encodeCall(IProxyAdmin.upgrade, (payable(L1_FEE_VAULT), address(_l1FeeVaultPrecalculatedAddress))) + abi.encodeCall( + IProxyAdmin.upgradeAndCall, + ( + payable(L1_FEE_VAULT), + address(_l1FeeVaultPrecalculatedAddress), + abi.encodeCall( + IFeeVault.initialize, + (l1FeeVaultRecipient, l1FeeVaultMinWithdrawalAmount, l1FeeVaultWithdrawalNetwork) + ) + ) + ) ); } From d6822b71ca47ddf434a0288eb2a88cd91a29150e Mon Sep 17 00:00:00 2001 From: 0xchin Date: Tue, 14 Oct 2025 13:40:15 -0300 Subject: [PATCH 32/52] chore: remove unused vars --- test/integration/RevenueShareIntegration.t.sol | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/test/integration/RevenueShareIntegration.t.sol b/test/integration/RevenueShareIntegration.t.sol index 5ad06d4e70..a852d5968e 100644 --- a/test/integration/RevenueShareIntegration.t.sol +++ b/test/integration/RevenueShareIntegration.t.sol @@ -9,17 +9,6 @@ import {IntegrationBase} from "./IntegrationBase.t.sol"; contract RevenueShareIntegrationTest is IntegrationBase { RevenueShareV100UpgradePath public template; - // Constants - address public constant PORTAL = 0xbEb5Fc579115071764c7423A4f12eDde41f106Ed; - address public constant CREATE2_DEPLOYER = 0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2; - - // L2 predeploys - address internal constant FEE_SPLITTER = 0x420000000000000000000000000000000000002B; - address internal constant SEQUENCER_FEE_VAULT = 0x4200000000000000000000000000000000000011; - address internal constant OPERATOR_FEE_VAULT = 0x420000000000000000000000000000000000001b; - address internal constant BASE_FEE_VAULT = 0x4200000000000000000000000000000000000019; - address internal constant L1_FEE_VAULT = 0x420000000000000000000000000000000000001A; - // Fork IDs uint256 internal _mainnetForkId; uint256 internal _optimismForkId; From 16d7b989e978f87dd18fbe1857001f702976a521 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Tue, 14 Oct 2025 13:42:02 -0300 Subject: [PATCH 33/52] chore: remove unused deployment gas limit var in opt out revshare config --- .../example/eth/019-revenueshare-upgrade-opt-out/config.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml b/test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml index 2bd40a4548..559b1eea89 100644 --- a/test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml +++ b/test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml @@ -6,7 +6,6 @@ optInRevenueShare = false # Portal and deployment configuration portal = "0xbEb5Fc579115071764c7423A4f12eDde41f106Ed" # OptimismPortal address saltSeed = "DeploymentSalt" # Deployment salt -deploymentGasLimit = 1000000 # Vaults Configuration baseFeeVaultWithdrawalNetwork = 0 From a28b513227bd1af4bcb3c905577c6732dc94ac23 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Tue, 14 Oct 2025 13:48:52 -0300 Subject: [PATCH 34/52] style: add underscore prefix on function and stack vars --- test/integration/IntegrationBase.t.sol | 172 +++++++++--------- .../integration/RevenueShareIntegration.t.sol | 8 +- 2 files changed, 90 insertions(+), 90 deletions(-) diff --git a/test/integration/IntegrationBase.t.sol b/test/integration/IntegrationBase.t.sol index 2aad4f42f2..e5e0398844 100644 --- a/test/integration/IntegrationBase.t.sol +++ b/test/integration/IntegrationBase.t.sol @@ -21,61 +21,61 @@ abstract contract IntegrationBase is Test { console2.log("================================================================================"); // Get logs from L1 execution - Vm.Log[] memory logs = vm.getRecordedLogs(); + Vm.Log[] memory _logs = vm.getRecordedLogs(); // Filter for TransactionDeposited events - bytes32 transactionDepositedHash = keccak256("TransactionDeposited(address,address,uint256,bytes)"); + bytes32 _transactionDepositedHash = keccak256("TransactionDeposited(address,address,uint256,bytes)"); // First pass: collect unique opaqueData hashes - bytes32[] memory seenHashes = new bytes32[](logs.length); - uint256 uniqueCount; - uint256 successCount; - uint256 failureCount; + bytes32[] memory _seenHashes = new bytes32[](_logs.length); + uint256 _uniqueCount; + uint256 _successCount; + uint256 _failureCount; - for (uint256 i = 0; i < logs.length; i++) { + for (uint256 _i = 0; _i < _logs.length; _i++) { // Check if this is a TransactionDeposited event - if (logs[i].topics[0] == transactionDepositedHash) { + if (_logs[_i].topics[0] == _transactionDepositedHash) { // Decode indexed parameters - address from = address(uint160(uint256(logs[i].topics[1]))); - address to = address(uint160(uint256(logs[i].topics[2]))); + address _from = address(uint160(uint256(_logs[_i].topics[1]))); + address _to = address(uint160(uint256(_logs[_i].topics[2]))); // Decode the opaqueData to check for duplicates - bytes memory opaqueData = abi.decode(logs[i].data, (bytes)); - bytes32 dataHash = keccak256(opaqueData); + bytes memory _opaqueData = abi.decode(_logs[_i].data, (bytes)); + bytes32 _dataHash = keccak256(_opaqueData); // Check if we've seen this exact transaction before - bool isDuplicate = _isDuplicate(seenHashes, uniqueCount, dataHash); - if (isDuplicate) continue; + bool _isDuplicate = _isDuplicate(_seenHashes, _uniqueCount, _dataHash); + if (_isDuplicate) continue; // Mark as seen - seenHashes[uniqueCount] = dataHash; - uniqueCount++; + _seenHashes[_uniqueCount] = _dataHash; + _uniqueCount++; // Process and execute the transaction - bool success = _processDepositTransaction(from, to, opaqueData, uniqueCount); + bool _success = _processDepositTransaction(_from, _to, _opaqueData, _uniqueCount); - if (success) { - successCount++; + if (_success) { + _successCount++; } else { - failureCount++; + _failureCount++; } } } console2.log("\n=== Summary ==="); - console2.log("Unique transactions:", uniqueCount); - console2.log("Successful transactions:", successCount); - console2.log("Failed transactions:", failureCount); + console2.log("Unique transactions:", _uniqueCount); + console2.log("Successful transactions:", _successCount); + console2.log("Failed transactions:", _failureCount); // Assert all transactions succeeded - assertEq(failureCount, 0, "All deposit transactions should succeed"); - assertEq(successCount, uniqueCount, "All unique transactions should succeed"); + assertEq(_failureCount, 0, "All deposit transactions should succeed"); + assertEq(_successCount, _uniqueCount, "All unique transactions should succeed"); } /// @notice Check if transaction is a duplicate - function _isDuplicate(bytes32[] memory seenHashes, uint256 count, bytes32 hash) internal pure returns (bool) { - for (uint256 j = 0; j < count; j++) { - if (seenHashes[j] == hash) { + function _isDuplicate(bytes32[] memory _seenHashes, uint256 _count, bytes32 _hash) internal pure returns (bool) { + for (uint256 _j = 0; _j < _count; _j++) { + if (_seenHashes[_j] == _hash) { return true; } } @@ -84,113 +84,113 @@ abstract contract IntegrationBase is Test { /// @notice Process and execute a deposit transaction function _processDepositTransaction( - address from, - address to, - bytes memory opaqueData, - uint256 txNumber + address _from, + address _to, + bytes memory _opaqueData, + uint256 _txNumber ) internal returns (bool) { // Extract value (bytes 0-31) - uint256 value = uint256(bytes32(_slice(opaqueData, 0, 32))); + uint256 _value = uint256(bytes32(_slice(_opaqueData, 0, 32))); // Extract gasLimit (bytes 64-71) - uint64 gasLimit = uint64(bytes8(_slice(opaqueData, 64, 8))); + uint64 _gasLimit = uint64(bytes8(_slice(_opaqueData, 64, 8))); // Extract data (bytes 73 onwards) - bytes memory data = _slice(opaqueData, 73, opaqueData.length - 73); + bytes memory _data = _slice(_opaqueData, 73, _opaqueData.length - 73); // Print Tenderly simulation parameters - _logTransactionDetails(from, to, value, gasLimit, data, txNumber); + _logTransactionDetails(_from, _to, _value, _gasLimit, _data, _txNumber); // Execute the transaction on L2 as if it came from the aliased address - vm.prank(from); - (bool success, ) = to.call{value: value}(data); + vm.prank(_from); + (bool _success, ) = _to.call{value: _value}(_data); - return success; + return _success; } /// @notice Log transaction details and Tenderly link function _logTransactionDetails( - address from, - address to, - uint256 value, - uint64 gasLimit, - bytes memory data, - uint256 txNumber + address _from, + address _to, + uint256 _value, + uint64 _gasLimit, + bytes memory _data, + uint256 _txNumber ) internal view { - if (data.length >= 4) { - bytes4 selector; + if (_data.length >= 4) { + bytes4 _selector; assembly { - selector := mload(add(data, 32)) + _selector := mload(add(_data, 32)) } } // Generate Tenderly simulation link - string memory tenderlyLink = _generateTenderlyLink(to, from, uint256(gasLimit), value, data); - console2.log("\nTenderly Simulation Link for transaction #", txNumber); - console2.log(tenderlyLink); + string memory _tenderlyLink = _generateTenderlyLink(_to, _from, uint256(_gasLimit), _value, _data); + console2.log("\nTenderly Simulation Link for transaction #", _txNumber); + console2.log(_tenderlyLink); } /// @notice Helper function to slice bytes - function _slice(bytes memory data, uint256 start, uint256 length) internal pure returns (bytes memory) { - bytes memory result = new bytes(length); - for (uint256 i = 0; i < length; i++) { - result[i] = data[start + i]; + function _slice(bytes memory _data, uint256 _start, uint256 _length) internal pure returns (bytes memory) { + bytes memory _result = new bytes(_length); + for (uint256 _i = 0; _i < _length; _i++) { + _result[_i] = _data[_start + _i]; } - return result; + return _result; } /// @notice Generate Tenderly simulation link for L2 transaction function _generateTenderlyLink( - address contractAddress, - address from, - uint256 gas, - uint256 value, - bytes memory rawFunctionInput + address _contractAddress, + address _from, + uint256 _gas, + uint256 _value, + bytes memory _rawFunctionInput ) internal pure returns (string memory) { // Convert bytes to hex string - string memory calldataHex = _bytesToHexString(rawFunctionInput); + string memory _calldataHex = _bytesToHexString(_rawFunctionInput); // Build the Tenderly URL // network=10 for OP Mainnet (change if testing on different L2) return string.concat( "https://dashboard.tenderly.co/TENDERLY_USERNAME/TENDERLY_PROJECT/simulator/new", "?network=10", - "&contractAddress=0x", _toAsciiString(contractAddress), - "&from=0x", _toAsciiString(from), - "&gas=", vm.toString(gas), - "&value=", vm.toString(value), - "&rawFunctionInput=0x", calldataHex + "&contractAddress=0x", _toAsciiString(_contractAddress), + "&from=0x", _toAsciiString(_from), + "&gas=", vm.toString(_gas), + "&value=", vm.toString(_value), + "&rawFunctionInput=0x", _calldataHex ); } /// @notice Convert address to lowercase hex string without 0x prefix - function _toAsciiString(address addr) internal pure returns (string memory) { - bytes memory s = new bytes(40); - for (uint256 i = 0; i < 20; i++) { - bytes1 b = bytes1(uint8(uint256(uint160(addr)) / (2**(8*(19 - i))))); - bytes1 hi = bytes1(uint8(b) / 16); - bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi)); - s[2*i] = _char(hi); - s[2*i+1] = _char(lo); + function _toAsciiString(address _addr) internal pure returns (string memory) { + bytes memory _s = new bytes(40); + for (uint256 _i = 0; _i < 20; _i++) { + bytes1 _b = bytes1(uint8(uint256(uint160(_addr)) / (2**(8*(19 - _i))))); + bytes1 _hi = bytes1(uint8(_b) / 16); + bytes1 _lo = bytes1(uint8(_b) - 16 * uint8(_hi)); + _s[2*_i] = _char(_hi); + _s[2*_i+1] = _char(_lo); } - return string(s); + return string(_s); } /// @notice Convert bytes to hex string without 0x prefix - function _bytesToHexString(bytes memory data) internal pure returns (string memory) { - bytes memory hexChars = "0123456789abcdef"; - bytes memory result = new bytes(data.length * 2); - for (uint256 i = 0; i < data.length; i++) { - result[i * 2] = hexChars[uint8(data[i] >> 4)]; - result[i * 2 + 1] = hexChars[uint8(data[i] & 0x0f)]; + function _bytesToHexString(bytes memory _data) internal pure returns (string memory) { + bytes memory _hexChars = "0123456789abcdef"; + bytes memory _result = new bytes(_data.length * 2); + for (uint256 _i = 0; _i < _data.length; _i++) { + _result[_i * 2] = _hexChars[uint8(_data[_i] >> 4)]; + _result[_i * 2 + 1] = _hexChars[uint8(_data[_i] & 0x0f)]; } - return string(result); + return string(_result); } /// @notice Convert nibble to hex character - function _char(bytes1 b) internal pure returns (bytes1) { - if (uint8(b) < 10) return bytes1(uint8(b) + 0x30); - else return bytes1(uint8(b) + 0x57); + function _char(bytes1 _b) internal pure returns (bytes1) { + if (uint8(_b) < 10) return bytes1(uint8(_b) + 0x30); + else return bytes1(uint8(_b) + 0x57); } } diff --git a/test/integration/RevenueShareIntegration.t.sol b/test/integration/RevenueShareIntegration.t.sol index a852d5968e..0f82cd3798 100644 --- a/test/integration/RevenueShareIntegration.t.sol +++ b/test/integration/RevenueShareIntegration.t.sol @@ -21,22 +21,22 @@ contract RevenueShareIntegrationTest is IntegrationBase { } function test_optInRevenueShare_integration() public { - string memory configPath = "test/tasks/example/eth/015-revenue-share-upgrade/config.toml"; + string memory _configPath = "test/tasks/example/eth/015-revenue-share-upgrade/config.toml"; // Step 1: Execute L1 transaction recording logs vm.recordLogs(); - template.simulate(configPath, new address[](0)); + template.simulate(_configPath, new address[](0)); // Step 2: Relay messages from L1 to L2 _relayAllMessages(_optimismForkId); } function test_optOutRevenueShare_integration() public { - string memory configPath = "test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml"; + string memory _configPath = "test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml"; // Step 1: Execute L1 transaction recording logs vm.recordLogs(); - template.simulate(configPath, new address[](0)); + template.simulate(_configPath, new address[](0)); // Step 2: Relay messages from L1 to L2 _relayAllMessages(_optimismForkId); From c1f6eaa8e949c7bf21315645325e094d20342cd8 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Tue, 14 Oct 2025 13:57:09 -0300 Subject: [PATCH 35/52] test: add gas limit --- test/integration/IntegrationBase.t.sol | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/integration/IntegrationBase.t.sol b/test/integration/IntegrationBase.t.sol index e5e0398844..1b44bbe265 100644 --- a/test/integration/IntegrationBase.t.sol +++ b/test/integration/IntegrationBase.t.sol @@ -44,8 +44,7 @@ abstract contract IntegrationBase is Test { bytes32 _dataHash = keccak256(_opaqueData); // Check if we've seen this exact transaction before - bool _isDuplicate = _isDuplicate(_seenHashes, _uniqueCount, _dataHash); - if (_isDuplicate) continue; + if (_isDuplicate(_seenHashes, _uniqueCount, _dataHash)) continue; // Mark as seen _seenHashes[_uniqueCount] = _dataHash; @@ -103,7 +102,7 @@ abstract contract IntegrationBase is Test { // Execute the transaction on L2 as if it came from the aliased address vm.prank(_from); - (bool _success, ) = _to.call{value: _value}(_data); + (bool _success, ) = _to.call{value: _value, gas: _gasLimit}(_data); return _success; } From c7b2cee5dba5611cdad85f1dcfcfa0ae1af75c93 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Tue, 14 Oct 2025 14:05:06 -0300 Subject: [PATCH 36/52] refactor: improve approach for simulations --- test/integration/IntegrationBase.t.sol | 49 +++++++++---------- .../integration/RevenueShareIntegration.t.sol | 6 ++- 2 files changed, 27 insertions(+), 28 deletions(-) diff --git a/test/integration/IntegrationBase.t.sol b/test/integration/IntegrationBase.t.sol index 1b44bbe265..aa262b33b4 100644 --- a/test/integration/IntegrationBase.t.sol +++ b/test/integration/IntegrationBase.t.sol @@ -10,7 +10,12 @@ import {AddressAliasHelper} from "@eth-optimism-bedrock/src/vendor/AddressAliasH /// @notice Base contract for integration tests with L1->L2 deposit transaction replay functionality abstract contract IntegrationBase is Test { /// @notice Replay all deposit transactions from L1 to L2 - function _relayAllMessages(uint256 _forkId) internal { + /// @param _forkId The fork ID to switch to for L2 execution + /// @param _isSimulate If true, only process the second half of logs to avoid duplicates. + /// Task simulations emit events twice: once during the initial dry-run + /// and once during the actual simulation. Taking the second half ensures + /// we only process the final simulation results. + function _relayAllMessages(uint256 _forkId, bool _isSimulate) internal { vm.selectFork(_forkId); console2.log("\n"); @@ -21,14 +26,22 @@ abstract contract IntegrationBase is Test { console2.log("================================================================================"); // Get logs from L1 execution - Vm.Log[] memory _logs = vm.getRecordedLogs(); + Vm.Log[] memory _allLogs = vm.getRecordedLogs(); + + // If this is a simulation, only take the second half of logs to avoid processing duplicates + // Simulations emit events twice, so we skip the first half + uint256 _startIndex = _isSimulate ? _allLogs.length / 2 : 0; + uint256 _logsCount = _isSimulate ? _allLogs.length - _startIndex : _allLogs.length; + + Vm.Log[] memory _logs = new Vm.Log[](_logsCount); + for (uint256 _i = 0; _i < _logsCount; _i++) { + _logs[_i] = _allLogs[_startIndex + _i]; + } // Filter for TransactionDeposited events bytes32 _transactionDepositedHash = keccak256("TransactionDeposited(address,address,uint256,bytes)"); - // First pass: collect unique opaqueData hashes - bytes32[] memory _seenHashes = new bytes32[](_logs.length); - uint256 _uniqueCount; + uint256 _transactionCount; uint256 _successCount; uint256 _failureCount; @@ -39,19 +52,13 @@ abstract contract IntegrationBase is Test { address _from = address(uint160(uint256(_logs[_i].topics[1]))); address _to = address(uint160(uint256(_logs[_i].topics[2]))); - // Decode the opaqueData to check for duplicates + // Decode the opaqueData bytes memory _opaqueData = abi.decode(_logs[_i].data, (bytes)); - bytes32 _dataHash = keccak256(_opaqueData); - - // Check if we've seen this exact transaction before - if (_isDuplicate(_seenHashes, _uniqueCount, _dataHash)) continue; - // Mark as seen - _seenHashes[_uniqueCount] = _dataHash; - _uniqueCount++; + _transactionCount++; // Process and execute the transaction - bool _success = _processDepositTransaction(_from, _to, _opaqueData, _uniqueCount); + bool _success = _processDepositTransaction(_from, _to, _opaqueData, _transactionCount); if (_success) { _successCount++; @@ -62,23 +69,13 @@ abstract contract IntegrationBase is Test { } console2.log("\n=== Summary ==="); - console2.log("Unique transactions:", _uniqueCount); + console2.log("Total transactions:", _transactionCount); console2.log("Successful transactions:", _successCount); console2.log("Failed transactions:", _failureCount); // Assert all transactions succeeded assertEq(_failureCount, 0, "All deposit transactions should succeed"); - assertEq(_successCount, _uniqueCount, "All unique transactions should succeed"); - } - - /// @notice Check if transaction is a duplicate - function _isDuplicate(bytes32[] memory _seenHashes, uint256 _count, bytes32 _hash) internal pure returns (bool) { - for (uint256 _j = 0; _j < _count; _j++) { - if (_seenHashes[_j] == _hash) { - return true; - } - } - return false; + assertEq(_successCount, _transactionCount, "All transactions should succeed"); } /// @notice Process and execute a deposit transaction diff --git a/test/integration/RevenueShareIntegration.t.sol b/test/integration/RevenueShareIntegration.t.sol index 0f82cd3798..2841ed3ebe 100644 --- a/test/integration/RevenueShareIntegration.t.sol +++ b/test/integration/RevenueShareIntegration.t.sol @@ -28,7 +28,8 @@ contract RevenueShareIntegrationTest is IntegrationBase { template.simulate(_configPath, new address[](0)); // Step 2: Relay messages from L1 to L2 - _relayAllMessages(_optimismForkId); + // Pass true for _isSimulate since simulate() emits events twice + _relayAllMessages(_optimismForkId, true); } function test_optOutRevenueShare_integration() public { @@ -39,7 +40,8 @@ contract RevenueShareIntegrationTest is IntegrationBase { template.simulate(_configPath, new address[](0)); // Step 2: Relay messages from L1 to L2 - _relayAllMessages(_optimismForkId); + // Pass true for _isSimulate since simulate() emits events twice + _relayAllMessages(_optimismForkId, true); } } \ No newline at end of file From 6a696421d51fd917df6ac309f8fa238cd9df69fd Mon Sep 17 00:00:00 2001 From: 0xchin Date: Wed, 15 Oct 2025 12:08:03 -0300 Subject: [PATCH 37/52] docs: add tenderly simulations doc --- .../tenderly/RevenueShareSimulations.md | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 test/integration/tenderly/RevenueShareSimulations.md diff --git a/test/integration/tenderly/RevenueShareSimulations.md b/test/integration/tenderly/RevenueShareSimulations.md new file mode 100644 index 0000000000..3b81bd4198 --- /dev/null +++ b/test/integration/tenderly/RevenueShareSimulations.md @@ -0,0 +1,28 @@ +# Revenue Share Simulations +A list of tenderly simulations are provided based on the formatting of the `TransactionDeposited` events emitted in L1 and its execution in the target L2, in this case, OP Mainnet. For details, check the [Simulating Portal Deposit Transactions](todo) document + +### Revenue Share Upgrade Opt In +1. [L1Withdrawer Deploy](https://www.tdly.co/shared/simulation/bcd94969-b645-4f62-893c-0b2ce793b5bf) Gas: 558,056/625,000 (89%) +2. [Rev Share Calculator Deploy](https://dashboard.tenderly.co/0xchin/project/simulator/c2970c09-7df7-4f97-bd2c-fd74caf1f2b0) Gas: 579,688/625,000 (93%) +3. [Fee Splitter Deploy](https://dashboard.tenderly.co/0xchin/project/simulator/6b084159-75ed-41b1-993c-a0a6953616c5) Gas: 1.121.747/1,235,000 (91%) +4. [Fee Splitter Upgrade](https://www.tdly.co/shared/simulation/3e224c10-f2e9-4346-8ea4-ddb031d37894) Gas: 65,378/500,000 (13%) +5. [Operator Fee Vault Deploy](https://www.tdly.co/shared/simulation/c78942e2-6008-475d-a049-f07866586ef6) Gas: 831,558/910,000 (91%) +6. [Operator Fee Vault Upgrade](https://www.tdly.co/shared/simulation/3ce52bed-aff0-4a25-9de6-be08e14e0524) Gas: 42,886/500,000 (9%) +7. [Sequencer Fee Vault Deploy](https://www.tdly.co/shared/simulation/19e79c8e-4461-48dc-8477-e2bc5e1160eb) Gas: 841,784/910,000 (93%) +8. [Sequencer Fee Vault Upgrade](https://www.tdly.co/shared/simulation/fd7dfe19-900a-497f-8c34-283f82f3c3ec) Gas: 40,386/500,000 (8%) +9. [Base Fee Vault Deploy](https://www.tdly.co/shared/simulation/db7e5826-deab-4e22-82e1-20c862ccb195) Gas: 831,546/910,000 (91%) +10. [Base Fee Vault Upgrade](https://dashboard.tenderly.co/0xchin/project/simulator/8ca93686-3e7b-48d8-a413-3acf910e50c0) Gas: 42,886/500,000 (9%) +11. [L1 Fee Vault Deploy](https://www.tdly.co/shared/simulation/c372faa5-72e2-45a5-97a7-28b3c4826869) Gas: 831,558/910,000 (91%) +12. [L1 Fee Vault Upgrade](https://www.tdly.co/shared/simulation/99eec896-d220-44ce-acd5-4ed91c3b0d5d) Gas: 42,886/500,000 (9%) + +### Revenue Share Upgrade Opt Out +1. [Fee Splitter Deploy](https://dashboard.tenderly.co/0xchin/project/simulator/6b084159-75ed-41b1-993c-a0a6953616c5) Gas: 1.121.747/1,235,000 (91%) +2. [Fee Splitter Upgrade](https://www.tdly.co/shared/simulation/3e224c10-f2e9-4346-8ea4-ddb031d37894) Gas: 65,378/500,000 (13%) +3. [Operator Fee Vault Deploy](https://www.tdly.co/shared/simulation/c78942e2-6008-475d-a049-f07866586ef6) Gas: 831,558/910,000 (91%) +4. [Operator Fee Vault Upgrade](https://www.tdly.co/shared/simulation/3ce52bed-aff0-4a25-9de6-be08e14e0524) Gas: 42,886/500,000 (9%) +5. [Sequencer Fee Vault Deploy](https://www.tdly.co/shared/simulation/19e79c8e-4461-48dc-8477-e2bc5e1160eb) Gas: 841,784/910,000 (93%) +6. [Sequencer Fee Vault Upgrade](https://www.tdly.co/shared/simulation/fd7dfe19-900a-497f-8c34-283f82f3c3ec) Gas: 40,386/500,000 (8%) +7. [Base Fee Vault Deploy](https://www.tdly.co/shared/simulation/db7e5826-deab-4e22-82e1-20c862ccb195) Gas: 831,546/910,000 (91%) +8. [Base Fee Vault Upgrade](https://dashboard.tenderly.co/0xchin/project/simulator/8ca93686-3e7b-48d8-a413-3acf910e50c0) Gas: 42,886/500,000 (9%) +9. [L1 Fee Vault Deploy](https://www.tdly.co/shared/simulation/c372faa5-72e2-45a5-97a7-28b3c4826869) Gas: 831,558/910,000 (91%) +10. [L1 Fee Vault Upgrade](https://www.tdly.co/shared/simulation/99eec896-d220-44ce-acd5-4ed91c3b0d5d) Gas: 42,886/500,000 (9%) \ No newline at end of file From 8e6cc8db17573c3d17e2b6e34b2353e3f4f336ed Mon Sep 17 00:00:00 2001 From: Chiin <77933451+0xChin@users.noreply.github.com> Date: Wed, 15 Oct 2025 14:12:09 -0300 Subject: [PATCH 38/52] test: revenue sharing upgrade unit tests (#22) --- test/tasks/Regression.t.sol | 33 +- .../eth/019-revenueshare-upgrade-opt-out/.env | 3 + .../config.toml | 27 ++ test/template/RevenueShareUpgradePath.t.sol | 361 ++++++++++++++++++ 4 files changed, 421 insertions(+), 3 deletions(-) create mode 100644 test/tasks/example/eth/019-revenueshare-upgrade-opt-out/.env create mode 100644 test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml create mode 100644 test/template/RevenueShareUpgradePath.t.sol diff --git a/test/tasks/Regression.t.sol b/test/tasks/Regression.t.sol index f12605860a..5bb4b645c8 100644 --- a/test/tasks/Regression.t.sol +++ b/test/tasks/Regression.t.sol @@ -899,7 +899,7 @@ contract RegressionTest is Test { function testRegressionCallDataMatches_DeployFeesDepositor() public { string memory taskConfigFilePath = "test/tasks/example/eth/016-deploy-fees-depositor/config.toml"; string memory expectedCallData = - "0x174dea7100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000010400000000000000000000000000000000000000000000000000000000000001e8000000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000f2466cfa0570000000000000000000000000000000000000000000000000000000000000000666565732d6465706f7369746f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000e9660a060405234801561001057600080fd5b50600160805261001e610023565b6100e3565b600054610100900460ff161561008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156100e1576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051610d9161010560003960008181610274015261048e0152610d916000f3fe6080604052600436106100cb5760003560e01c8063645006ca11610074578063a2a956171161004e578063a2a9561714610425578063dad544e014610445578063f68016b71461045a57600080fd5b8063645006ca1461038657806366125607146103c85780637b11936e146103e857600080fd5b80633e47158c116100a55780633e47158c146102fb57806352d84c621461031057806354fd4d501461033057600080fd5b80630de2db4d1461024057806338d38c97146102605780633cb747bf146102a357600080fd5b3661023b576040805134815247602082018190529133917f363f315f930a17d1266b86a20d6dd34b1cfbc5a9db9f13a65d06a689c3a2af8a910160405180910390a26001546bffffffffffffffffffffffff16811061023957600154600080546002546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff6c0100000000000000000000000090950485166004820181905260606024830152606482019490945263ffffffff90911660448201529192620100009091041690633dbb202b9084906084016000604051808303818588803b1580156101ce57600080fd5b505af11580156101e2573d6000803e3d6000fd5b50505050508073ffffffffffffffffffffffffffffffffffffffff167f2acaf92365a0b69fb3570802396f62d51aabccd684036b72c3ce78699425e7ee8360405161022f91815260200190565b60405180910390a2505b005b600080fd5b34801561024c57600080fd5b5061023961025b366004610bde565b61048c565b34801561026c57600080fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020015b60405180910390f35b3480156102af57600080fd5b506000546102d69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161029a565b34801561030757600080fd5b506102d661069e565b34801561031c57600080fd5b5061023961032b366004610c36565b6108a9565b34801561033c57600080fd5b506103796040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161029a9190610c58565b34801561039257600080fd5b506001546103ab906bffffffffffffffffffffffff1681565b6040516bffffffffffffffffffffffff909116815260200161029a565b3480156103d457600080fd5b506102396103e3366004610ccb565b610928565b3480156103f457600080fd5b506001546102d6906c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561043157600080fd5b50610239610440366004610ce8565b6109af565b34801561045157600080fd5b506102d6610a2e565b34801561046657600080fd5b506002546104779063ffffffff1681565b60405163ffffffff909116815260200161029a565b7f0000000000000000000000000000000000000000000000000000000000000000600054610100900460ff161580156104cc575060005460ff8083169116105b61055c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055610595610aab565b6000805473ffffffffffffffffffffffffffffffffffffffff8681166c01000000000000000000000000026bffffffffffffffffffffffff8916176001556002805463ffffffff87167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000009091161790557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9086166201000002167fffffffffffffffffffff000000000000000000000000000000000000000000ff9091161790556040517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989061068f90839060ff91909116815260200190565b60405180910390a15050505050565b6000806106c97fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff8116156106ec57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000081525051600261072f9190610d03565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000919091179061078a906060015b604051602081830303815290604052805190602001205490565b146107c1576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513060208201526001918101919091526000906107e390606001610770565b905073ffffffffffffffffffffffffffffffffffffffff811615610877578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108709190610d67565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108b1610b2e565b6002805463ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000083168117909355604080519190921680825260208201939093527f84858bb3fb3ecf87e268ebef250ef9ad9cd53ef7973ef7a0ec9d89470bb00a8091015b60405180910390a15050565b610930610b2e565b6001805473ffffffffffffffffffffffffffffffffffffffff8381166c010000000000000000000000008181026bffffffffffffffffffffffff85161790945560408051949093049091168084526020840191909152917f158f04d12e0403fdd63fbced694e8f70d3b87d04d8e2dfad526f5fcf6e49bbcf910161091c565b6109b7610b2e565b600180546bffffffffffffffffffffffff8381167fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083168117909355604080519190921680825260208201939093527f132832be4270c0d1573ca543c41517dd443fe9daf5f21a9c74940e6db282e229910161091c565b6000610a3861069e565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa69190610d67565b905090565b33610ab461069e565b73ffffffffffffffffffffffffffffffffffffffff1614158015610af5575033610adc610a2e565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610b2c576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b33610b37610a2e565b73ffffffffffffffffffffffffffffffffffffffff1614610b2c576040517f7f12c64b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356bffffffffffffffffffffffff81168114610ba057600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610bc757600080fd5b50565b803563ffffffff81168114610ba057600080fd5b60008060008060808587031215610bf457600080fd5b610bfd85610b84565b93506020850135610c0d81610ba5565b92506040850135610c1d81610ba5565b9150610c2b60608601610bca565b905092959194509250565b600060208284031215610c4857600080fd5b610c5182610bca565b9392505050565b600060208083528351808285015260005b81811015610c8557858101830151858201604001528201610c69565b81811115610c97576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600060208284031215610cdd57600080fd5b8135610c5181610ba5565b600060208284031215610cfa57600080fd5b610c5182610b84565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610d62577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500290565b600060208284031215610d7957600080fd5b8151610c5181610ba556fea164736f6c634300080f000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000d8466cfa0570000000000000000000000000000000000000000000000000000000000000000666565732d6465706f7369746f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000ce760806040523480156200001157600080fd5b5060405162000cc738038062000cc783398181016040528101906200003791906200016f565b62000048816200004f60201b60201c565b50620001df565b600062000061620000ce60201b60201c565b905060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b90508281557f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f8284604051620000c1929190620001b2565b60405180910390a1505050565b60008060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b905080549150819250505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000137826200010a565b9050919050565b62000149816200012a565b81146200015557600080fd5b50565b60008151905062000169816200013e565b92915050565b60006020828403121562000188576200018762000105565b5b6000620001988482850162000158565b91505092915050565b620001ac816200012a565b82525050565b6000604082019050620001c96000830185620001a1565b620001d86020830184620001a1565b9392505050565b610ad880620001ef6000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100675780634f1ef286146100905780635c60da1b146100c05780638f283970146100eb578063f851a440146101145761005d565b3661005d5761005b61013f565b005b61006561013f565b005b34801561007357600080fd5b5061008e60048036038101906100899190610715565b6101dc565b005b6100aa60048036038101906100a591906107a7565b610268565b6040516100b791906108a0565b60405180910390f35b3480156100cc57600080fd5b506100d56103ae565b6040516100e291906108d1565b60405180910390f35b3480156100f757600080fd5b50610112600480360381019061010d9190610715565b61043d565b005b34801561012057600080fd5b506101296104c9565b60405161013691906108d1565b60405180910390f35b6000610149610558565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101b19061096f565b60405180910390fd5b3660008037600080366000845af43d6000803e806101d7573d6000fd5b3d6000f35b6101e461058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102495750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561025c57610257816105c6565b610265565b61026461013f565b5b50565b606061027261058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102d75750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561039e576102e5846105c6565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161030f9291906109ce565b600060405180830381855af49150503d806000811461034a576040519150601f19603f3d011682016040523d82523d6000602084013e61034f565b606091505b509150915081610394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038b90610a59565b60405180910390fd5b80925050506103a7565b6103a661013f565b5b9392505050565b60006103b861058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061041d5750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156104315761042a610558565b905061043a565b61043961013f565b5b90565b61044561058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104aa5750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156104bd576104b881610638565b6104c6565b6104c561013f565b5b50565b60006104d361058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806105385750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561054c5761054561058f565b9050610555565b61055461013f565b5b90565b60008060007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150819250505090565b60008060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b905080549150819250505090565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181558173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25050565b600061064261058f565b905060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b90508281557f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f82846040516106a0929190610a79565b60405180910390a1505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106e2826106b7565b9050919050565b6106f2816106d7565b81146106fd57600080fd5b50565b60008135905061070f816106e9565b92915050565b60006020828403121561072b5761072a6106ad565b5b600061073984828501610700565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261076757610766610742565b5b8235905067ffffffffffffffff81111561078457610783610747565b5b6020830191508360018202830111156107a05761079f61074c565b5b9250929050565b6000806000604084860312156107c0576107bf6106ad565b5b60006107ce86828701610700565b935050602084013567ffffffffffffffff8111156107ef576107ee6106b2565b5b6107fb86828701610751565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b83811015610841578082015181840152602081019050610826565b83811115610850576000848401525b50505050565b6000601f19601f8301169050919050565b600061087282610807565b61087c8185610812565b935061088c818560208601610823565b61089581610856565b840191505092915050565b600060208201905081810360008301526108ba8184610867565b905092915050565b6108cb816106d7565b82525050565b60006020820190506108e660008301846108c2565b92915050565b600082825260208201905092915050565b7f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160008201527f6c697a6564000000000000000000000000000000000000000000000000000000602082015250565b60006109596025836108ec565b9150610964826108fd565b604082019050919050565b600060208201905081810360008301526109888161094c565b9050919050565b600081905092915050565b82818337600083830152505050565b60006109b5838561098f565b93506109c283858461099a565b82840190509392505050565b60006109db8284866109a9565b91508190509392505050565b7f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560008201527f6d656e746174696f6e20636f6e7472616374206661696c656400000000000000602082015250565b6000610a436039836108ec565b9150610a4e826109e7565b604082019050919050565b60006020820190508181036000830152610a7281610a36565b9050919050565b6000604082019050610a8e60008301856108c2565b610a9b60208301846108c2565b939250505056fea2646970667358221220154d9317746aa0e4cac83ccac5a296d517da380b7a9bb2889947cfba8d5a8bc164736f6c634300080f00330000000000000000000000005a0aae59d09fccbddb6c6cceb07b7279367c3d2a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032ecd94bbfb350f8aafb70dfba1f4d7fcbc5065b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001044f1ef28600000000000000000000000090a79d28ad7f6d472ad1cfe3bad65204ab2969a2000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000840de2db4d0000000000000000000000000000000000000000000000004563918244f400000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000493e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + "0x174dea7100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000010400000000000000000000000000000000000000000000000000000000000001e8000000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000f2466cfa0570000000000000000000000000000000000000000000000000000000000000000666565732d6465706f7369746f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000e9660a060405234801561001057600080fd5b50600160805261001e610023565b6100e3565b600054610100900460ff161561008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156100e1576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051610d9161010560003960008181610274015261048e0152610d916000f3fe6080604052600436106100cb5760003560e01c8063645006ca11610074578063a2a956171161004e578063a2a9561714610425578063dad544e014610445578063f68016b71461045a57600080fd5b8063645006ca1461038657806366125607146103c85780637b11936e146103e857600080fd5b80633e47158c116100a55780633e47158c146102fb57806352d84c621461031057806354fd4d501461033057600080fd5b80630de2db4d1461024057806338d38c97146102605780633cb747bf146102a357600080fd5b3661023b576040805134815247602082018190529133917f363f315f930a17d1266b86a20d6dd34b1cfbc5a9db9f13a65d06a689c3a2af8a910160405180910390a26001546bffffffffffffffffffffffff16811061023957600154600080546002546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff6c0100000000000000000000000090950485166004820181905260606024830152606482019490945263ffffffff90911660448201529192620100009091041690633dbb202b9084906084016000604051808303818588803b1580156101ce57600080fd5b505af11580156101e2573d6000803e3d6000fd5b50505050508073ffffffffffffffffffffffffffffffffffffffff167f2acaf92365a0b69fb3570802396f62d51aabccd684036b72c3ce78699425e7ee8360405161022f91815260200190565b60405180910390a2505b005b600080fd5b34801561024c57600080fd5b5061023961025b366004610bde565b61048c565b34801561026c57600080fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020015b60405180910390f35b3480156102af57600080fd5b506000546102d69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161029a565b34801561030757600080fd5b506102d661069e565b34801561031c57600080fd5b5061023961032b366004610c36565b6108a9565b34801561033c57600080fd5b506103796040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161029a9190610c58565b34801561039257600080fd5b506001546103ab906bffffffffffffffffffffffff1681565b6040516bffffffffffffffffffffffff909116815260200161029a565b3480156103d457600080fd5b506102396103e3366004610ccb565b610928565b3480156103f457600080fd5b506001546102d6906c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561043157600080fd5b50610239610440366004610ce8565b6109af565b34801561045157600080fd5b506102d6610a2e565b34801561046657600080fd5b506002546104779063ffffffff1681565b60405163ffffffff909116815260200161029a565b7f0000000000000000000000000000000000000000000000000000000000000000600054610100900460ff161580156104cc575060005460ff8083169116105b61055c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055610595610aab565b6000805473ffffffffffffffffffffffffffffffffffffffff8681166c01000000000000000000000000026bffffffffffffffffffffffff8916176001556002805463ffffffff87167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000009091161790557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9086166201000002167fffffffffffffffffffff000000000000000000000000000000000000000000ff9091161790556040517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989061068f90839060ff91909116815260200190565b60405180910390a15050505050565b6000806106c97fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff8116156106ec57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000081525051600261072f9190610d03565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000919091179061078a906060015b604051602081830303815290604052805190602001205490565b146107c1576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513060208201526001918101919091526000906107e390606001610770565b905073ffffffffffffffffffffffffffffffffffffffff811615610877578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108709190610d67565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108b1610b2e565b6002805463ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000083168117909355604080519190921680825260208201939093527f84858bb3fb3ecf87e268ebef250ef9ad9cd53ef7973ef7a0ec9d89470bb00a8091015b60405180910390a15050565b610930610b2e565b6001805473ffffffffffffffffffffffffffffffffffffffff8381166c010000000000000000000000008181026bffffffffffffffffffffffff85161790945560408051949093049091168084526020840191909152917f158f04d12e0403fdd63fbced694e8f70d3b87d04d8e2dfad526f5fcf6e49bbcf910161091c565b6109b7610b2e565b600180546bffffffffffffffffffffffff8381167fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083168117909355604080519190921680825260208201939093527f132832be4270c0d1573ca543c41517dd443fe9daf5f21a9c74940e6db282e229910161091c565b6000610a3861069e565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa69190610d67565b905090565b33610ab461069e565b73ffffffffffffffffffffffffffffffffffffffff1614158015610af5575033610adc610a2e565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610b2c576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b33610b37610a2e565b73ffffffffffffffffffffffffffffffffffffffff1614610b2c576040517f7f12c64b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356bffffffffffffffffffffffff81168114610ba057600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610bc757600080fd5b50565b803563ffffffff81168114610ba057600080fd5b60008060008060808587031215610bf457600080fd5b610bfd85610b84565b93506020850135610c0d81610ba5565b92506040850135610c1d81610ba5565b9150610c2b60608601610bca565b905092959194509250565b600060208284031215610c4857600080fd5b610c5182610bca565b9392505050565b600060208083528351808285015260005b81811015610c8557858101830151858201604001528201610c69565b81811115610c97576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600060208284031215610cdd57600080fd5b8135610c5181610ba5565b600060208284031215610cfa57600080fd5b610c5182610b84565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610d62577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500290565b600060208284031215610d7957600080fd5b8151610c5181610ba556fea164736f6c634300080f000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000d8466cfa0570000000000000000000000000000000000000000000000000000000000000000666565732d6465706f7369746f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000ce760806040523480156200001157600080fd5b5060405162000cc738038062000cc783398181016040528101906200003791906200016f565b62000048816200004f60201b60201c565b50620001df565b600062000061620000ce60201b60201c565b905060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b90508281557f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f8284604051620000c1929190620001b2565b60405180910390a1505050565b60008060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b905080549150819250505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000137826200010a565b9050919050565b62000149816200012a565b81146200015557600080fd5b50565b60008151905062000169816200013e565b92915050565b60006020828403121562000188576200018762000105565b5b6000620001988482850162000158565b91505092915050565b620001ac816200012a565b82525050565b6000604082019050620001c96000830185620001a1565b620001d86020830184620001a1565b9392505050565b610ad880620001ef6000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100675780634f1ef286146100905780635c60da1b146100c05780638f283970146100eb578063f851a440146101145761005d565b3661005d5761005b61013f565b005b61006561013f565b005b34801561007357600080fd5b5061008e60048036038101906100899190610715565b6101dc565b005b6100aa60048036038101906100a591906107a7565b610268565b6040516100b791906108a0565b60405180910390f35b3480156100cc57600080fd5b506100d56103ae565b6040516100e291906108d1565b60405180910390f35b3480156100f757600080fd5b50610112600480360381019061010d9190610715565b61043d565b005b34801561012057600080fd5b506101296104c9565b60405161013691906108d1565b60405180910390f35b6000610149610558565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101b19061096f565b60405180910390fd5b3660008037600080366000845af43d6000803e806101d7573d6000fd5b3d6000f35b6101e461058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102495750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561025c57610257816105c6565b610265565b61026461013f565b5b50565b606061027261058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102d75750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561039e576102e5846105c6565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161030f9291906109ce565b600060405180830381855af49150503d806000811461034a576040519150601f19603f3d011682016040523d82523d6000602084013e61034f565b606091505b509150915081610394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038b90610a59565b60405180910390fd5b80925050506103a7565b6103a661013f565b5b9392505050565b60006103b861058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061041d5750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156104315761042a610558565b905061043a565b61043961013f565b5b90565b61044561058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104aa5750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156104bd576104b881610638565b6104c6565b6104c561013f565b5b50565b60006104d361058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806105385750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561054c5761054561058f565b9050610555565b61055461013f565b5b90565b60008060007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150819250505090565b60008060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b905080549150819250505090565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181558173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25050565b600061064261058f565b905060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b90508281557f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f82846040516106a0929190610a79565b60405180910390a1505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106e2826106b7565b9050919050565b6106f2816106d7565b81146106fd57600080fd5b50565b60008135905061070f816106e9565b92915050565b60006020828403121561072b5761072a6106ad565b5b600061073984828501610700565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261076757610766610742565b5b8235905067ffffffffffffffff81111561078457610783610747565b5b6020830191508360018202830111156107a05761079f61074c565b5b9250929050565b6000806000604084860312156107c0576107bf6106ad565b5b60006107ce86828701610700565b935050602084013567ffffffffffffffff8111156107ef576107ee6106b2565b5b6107fb86828701610751565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b83811015610841578082015181840152602081019050610826565b83811115610850576000848401525b50505050565b6000601f19601f8301169050919050565b600061087282610807565b61087c8185610812565b935061088c818560208601610823565b61089581610856565b840191505092915050565b600060208201905081810360008301526108ba8184610867565b905092915050565b6108cb816106d7565b82525050565b60006020820190506108e660008301846108c2565b92915050565b600082825260208201905092915050565b7f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160008201527f6c697a6564000000000000000000000000000000000000000000000000000000602082015250565b60006109596025836108ec565b9150610964826108fd565b604082019050919050565b600060208201905081810360008301526109888161094c565b9050919050565b600081905092915050565b82818337600083830152505050565b60006109b5838561098f565b93506109c283858461099a565b82840190509392505050565b60006109db8284866109a9565b91508190509392505050565b7f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560008201527f6d656e746174696f6e20636f6e7472616374206661696c656400000000000000602082015250565b6000610a436039836108ec565b9150610a4e826109e7565b604082019050919050565b60006020820190508181036000830152610a7281610a36565b9050919050565b6000604082019050610a8e60008301856108c2565b610a9b60208301846108c2565b939250505056fea2646970667358221220e170e6bf8ee3cc199be5ea3ca30084b98725d89b560e407f600f4a174236633364736f6c634300080f00330000000000000000000000005a0aae59d09fccbddb6c6cceb07b7279367c3d2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa7da4552791535ae416525d695a85743f40624300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001044f1ef28600000000000000000000000090a79d28ad7f6d472ad1cfe3bad65204ab2969a2000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000840de2db4d0000000000000000000000000000000000000000000000004563918244f400000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000493e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; MultisigTask multisigTask = new DeployFeesDepositor(); address rootSafe = address(0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A); // L1PAO address securityCouncilChildMultisig = address(0xc2819DC788505Aac350142A7A707BF9D03E3Bd03); @@ -912,10 +912,37 @@ contract RegressionTest is Test { string[] memory expectedDataToSign = new string[](2); // Foundation expectedDataToSign[0] = - "0x1901a4a9c312badf3fcaa05eafe5dc9bee8bd9316c78ee8b0bebe3115bb21b732672145a6a0f915fed1b5793937cb6d6cba1ec86fd6563b0315d14f55a409de52ab9"; + "0x1901a4a9c312badf3fcaa05eafe5dc9bee8bd9316c78ee8b0bebe3115bb21b7326728b096f6bceaab1716dfe8e85bae705192df4b5dae6e3b94d58bdf567edb6bfef"; // Security Council expectedDataToSign[1] = - "0x1901df53d510b56e539b90b369ef08fce3631020fbf921e3136ea5f8747c20bce9673ef6274f3fe58ee20ab2931fc049b8a5af8bd6319918f91e2c9951e8630f9247"; + "0x1901df53d510b56e539b90b369ef08fce3631020fbf921e3136ea5f8747c20bce967e5d2666095a6ced42244873f800e6714389265e35cf0e8e9e5236e720601e2b6"; + _assertDataToSignNestedMultisig(multisigTask, actions, expectedDataToSign, MULTICALL3_ADDRESS, rootSafe); + } + + /// @notice Expected call data and data to sign generated by manually running the RevenueShareV100UpgradePath template at block 23434662 on mainnet (opt-out scenario). + /// Simulate from task directory (test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml) with: + /// just --dotenv-path $(pwd)/.env --justfile ../../../../../src/improvements/justfile simulate (foundation|council) + function testRegressionCallDataMatches_RevenueShareV100UpgradePathOptOut() public { + string memory taskConfigFilePath = "test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml"; + string memory expectedCallData = + + "0x174dea710000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000174000000000000000000000000000000000000000000000000000000000000019a00000000000000000000000000000000000000000000000000000000000002b600000000000000000000000000000000000000000000000000000000000002d400000000000000000000000000000000000000000000000000000000000003f40000000000000000000000000000000000000000000000000000000000000412000000000000000000000000000000000000000000000000000000000000052e000000000000000000000000000000000000000000000000000000000000054c00000000000000000000000000000000000000000000000000000000000006680000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001544e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012d838000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000146466cfa0570000000000000000000000000000000000000000000000000000000000000000d7c04619bfc311a92d20723f9d08baaba18c3c8c7dcd85736bf66b85f59c37f6000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000013d26080604052348015600e575f80fd5b5060156019565b60d4565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101560d2575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6112f1806100e15f395ff3fe608060405260043610610096575f3560e01c80637dfbd04911610066578063b87ea8d41161004c578063b87ea8d414610313578063c4d66de814610327578063d61a398b14610346575f80fd5b80637dfbd049146102dd5780637fc81bb7146102f4575f80fd5b80630a7617b3146101dd5780630c0544a3146101fe578063394d27311461026057806354fd4d5014610288575f80fd5b366101d9577fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455c6100f3576040517f17617f6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b337342000000000000000000000000000000000000111480159061012b57503373420000000000000000000000000000000000001914155b801561014b57503373420000000000000000000000000000000000001a14155b801561016b57503373420000000000000000000000000000000000001b14155b156101a2576040517f9dcde10900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405134815233907f2ccfc58c2cef4ee590b5f16be0548cc54afc12e1c66a67b362b7d640fd16bb2d9060200160405180910390a2005b5f80fd5b3480156101e8575f80fd5b506101fc6101f7366004610f4b565b61039c565b005b348015610209575f80fd5b5060015461023a9070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561026b575f80fd5b5060015461023a906fffffffffffffffffffffffffffffffff1681565b348015610293575f80fd5b506102d06040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516102579190610f66565b3480156102e8575f80fd5b5061023a6301e1338081565b3480156102ff575f80fd5b506101fc61030e366004610fb9565b61055e565b34801561031e575f80fd5b506101fc610706565b348015610332575f80fd5b506101fc610341366004610f4b565b610aea565b348015610351575f80fd5b505f546103779062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610257565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041d9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610481576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166104ce576040517f99c6ec0800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff85161790945560408051949093049091168084526020840191909152917f16417cc372deec0caee5f52e2ad77a5f07b4591fd56b4ff31b6e20f817d4daeb91015b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105df9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610643576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6301e133806fffffffffffffffffffffffffffffffff82161115610693576040517f30b9f35e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546fffffffffffffffffffffffffffffffff8381167001000000000000000000000000000000008181028385161790945560408051949093049091168084526020840191909152917f4492086b630ed3846eec0979dd87a71c814ceb1c6dab80ab81e3450b21e4de289101610552565b60015461073b906fffffffffffffffffffffffffffffffff700100000000000000000000000000000000820481169116611030565b6fffffffffffffffffffffffffffffffff16421015610786576040517f1e4a9f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016426fffffffffffffffffffffffffffffffff161781556107cb90610ce0565b5f6107e9734200000000000000000000000000000000000011610d06565b90505f610809734200000000000000000000000000000000000019610d06565b90505f61082973420000000000000000000000000000000000001a610d06565b90505f61084973420000000000000000000000000000000000001b610d06565b90506108545f610ce0565b5f82826108618688611060565b61086b9190611060565b6108759190611060565b9050805f036108b0576040517fc8972e5200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517f54e7f42d000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101859052606481018690526201000090910473ffffffffffffffffffffffffffffffffffffffff16906354e7f42d906084015f60405180830381865afa158015610936573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261097b9190810190611118565b905080515f036109b7576040517f763970d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b8251811015610a6e575f8382815181106109d6576109d66111e7565b60200260200101515f015190505f8483815181106109f6576109f66111e7565b6020026020010151602001519050805f03610a12575050610a66565b5f610a1d8383610f03565b905080610a56576040517fd68d1b1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a608286611060565b94505050505b6001016109ba565b50828114610aa8576040517f9c01eac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f73f9a13241a1848ec157967f3a85601709353e616f1f2605d818c0f2d21774df8284604051610ad9929190611214565b60405180910390a150505050505050565b5f54610100900460ff1615808015610b0857505f54600160ff909116105b80610b215750303b158015610b2157505f5460ff166001145b610bb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610c0d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff851602179055600180546fffffffffffffffffffffffffffffffff1672015180000000000000000000000000000000001790558015610cdc575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610552565b5050565b807fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455d50565b5f60018273ffffffffffffffffffffffffffffffffffffffff166382356d8a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d7691906112af565b6001811115610d8757610d87611282565b14610dbe576040517fb4726cbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff166366d003ac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e429190610fe8565b73ffffffffffffffffffffffffffffffffffffffff1614610e8f576040517fc3380cef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610ed9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610efd91906112cd565b92915050565b5f610f0f835a84610f16565b9392505050565b5f805f805f858888f1949350505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f48575f80fd5b50565b5f60208284031215610f5b575f80fd5b8135610f0f81610f27565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f60208284031215610fc9575f80fd5b81356fffffffffffffffffffffffffffffffff81168114610f0f575f80fd5b5f60208284031215610ff8575f80fd5b8151610f0f81610f27565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6fffffffffffffffffffffffffffffffff81811683821601908082111561105957611059611003565b5092915050565b80820180821115610efd57610efd611003565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156110c3576110c3611073565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561111057611110611073565b604052919050565b5f6020808385031215611129575f80fd5b825167ffffffffffffffff80821115611140575f80fd5b818501915085601f830112611153575f80fd5b81518181111561116557611165611073565b611173848260051b016110c9565b818152848101925060069190911b830184019087821115611192575f80fd5b928401925b818410156111dc57604084890312156111ae575f80fd5b6111b66110a0565b84516111c181610f27565b81528486015186820152835260409093019291840191611197565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604080825283518282018190525f91906020906060850190828801855b8281101561126c578151805173ffffffffffffffffffffffffffffffffffffffff168552850151858501529285019290840190600101611231565b5050508093505050508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f602082840312156112bf575f80fd5b815160028110610f0f575f80fd5b5f602082840312156112dd575f80fd5b505191905056fea164736f6c6343000819000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c49623609d000000000000000000000000420000000000000000000000000000000000002b0000000000000000000000006b0d0b5d65c13ed9ec80617772aee4d6c594a66e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa0570000000000000000000000000000000000000000000000000000000000000000783aa8b3e401c8404e3eff9401ba29702719ddc0c0f69ec9ac77188bacea107300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9c60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a00000000000000000000000066666666666666666666666666666666666666660000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000124e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004499a88ec4000000000000000000000000420000000000000000000000000000000000001b0000000000000000000000001e2d5b3362d3b6726dd715284dc83faf7e6c27ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001144e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000106466cfa0570000000000000000000000000000000000000000000000000000000000000000204cb368f75f2d6cade61b62cb318bffd2bd31a57a3f86dff75f5bfd9d2dd14900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000fcb60e060405234801561001057600080fd5b50604051610f6b380380610f6b83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e466101256000396000818161028f0152610a0101526000818160f401526109910152600081816102c30152610a550152610e466000f3fe6080604052600436106100d65760003560e01c806382356d8a1161007f57806385b5b14d1161005957806385b5b14d1461025d578063d0e12f901461027d578063d3e5792b146102b1578063d4ff9218146102e557600080fd5b806382356d8a146102105780638312f1491461023257806384411d651461024757600080fd5b80633ccfd60b116100b05780633ccfd60b1461018257806354fd4d50146101a557806366d003ac146101fb57600080fd5b80630d9019e1146100e2578063307f2962146101405780633bbed4a01461016257600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506101167f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014c57600080fd5b5061016061015b366004610c14565b6102fa565b005b34801561016e57600080fd5b5061016061017d366004610c5a565b6104c2565b34801561018e57600080fd5b50610197610642565b604051908152602001610137565b3480156101b157600080fd5b506101ee6040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b6040516101379190610c77565b34801561020757600080fd5b5061011661094a565b34801561021c57600080fd5b506102256109b3565b6040516101379190610d54565b34801561023e57600080fd5b50610197610a23565b34801561025357600080fd5b5061019760005481565b34801561026957600080fd5b50610160610278366004610d68565b610a77565b34801561028957600080fd5b506102257f000000000000000000000000000000000000000000000000000000000000000081565b3480156102bd57600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f157600080fd5b50610116610bdd565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610359573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037d9190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103e1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043d5761043d610cea565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104b69083908590610d9e565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610521573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105459190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105a9576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e459391016104b6565b600061064c610a23565b471015610706576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b4790508060008082825461071a9190610db9565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161074a61094a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee816107a861094a565b336107b16109b3565b6040516107c19493929190610df8565b60405180910390a160016107d36109b3565b60018111156107e4576107e4610cea565b0361088f5760006107fc6107f661094a565b83610bec565b90508061088b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106fd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac826108b261094a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561092e57600080fd5b505af1158015610942573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561098e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109fe575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a52575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ad6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afa9190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b5e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e420391016104b6565b6000610be761094a565b905090565b6000610bf9835a84610c00565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610c2657600080fd5b813560028110610bf957600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c5757600080fd5b50565b600060208284031215610c6c57600080fd5b8135610bf981610c35565b600060208083528351808285015260005b81811015610ca457858101830151858201604001528201610c88565b81811115610cb6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d50577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d628284610d19565b92915050565b600060208284031215610d7a57600080fd5b5035919050565b600060208284031215610d9357600080fd5b8151610bf981610c35565b60408101610dac8285610d19565b610bf96020830184610d19565b60008219821115610df3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e306060830184610d19565b9594505050505056fea164736f6c634300080f000a00000000000000000000000055555555555555555555555555555555555555550000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000124e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004499a88ec400000000000000000000000042000000000000000000000000000000000000110000000000000000000000002ca727314d2c6c683998ce385c2853923719aea10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa05700000000000000000000000000000000000000000000000000000000000000007a2bde9cfb7f80a4198677bdf885a43dc36c598688294f694cf64429164f140000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9c60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a00000000000000000000000033333333333333333333333333333333333333330000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000124e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004499a88ec4000000000000000000000000420000000000000000000000000000000000001900000000000000000000000063e87ea1598d7b59b88685b56be6e5d7b2e11ed90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa05700000000000000000000000000000000000000000000000000000000000000004ac8e160bee0acc95b22d1744fa9cc7068869945397f78a77ed68ef8ae1d87a900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9c60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a00000000000000000000000044444444444444444444444444444444444444440000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000124e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004499a88ec4000000000000000000000000420000000000000000000000000000000000001a000000000000000000000000ad552e53be11c5fc03a95d8be3bb72ab675e0ddb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + MultisigTask multisigTask = new RevenueShareV100UpgradePath(); + address rootSafe = address(0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A); // L1PAO + address securityCouncilChildMultisig = address(0xc2819DC788505Aac350142A7A707BF9D03E3Bd03); + address[] memory allSafes = MultisigTaskTestHelper.getAllSafes(rootSafe, securityCouncilChildMultisig); + + (Action[] memory actions, uint256[] memory allOriginalNonces) = + _setupAndSimulate(taskConfigFilePath, 23434662, "mainnet", multisigTask, allSafes); + _assertCallDataMatches(multisigTask, actions, allSafes, allOriginalNonces, expectedCallData); + + string[] memory expectedDataToSign = new string[](2); + // Foundation + expectedDataToSign[0] = + "0x1901a4a9c312badf3fcaa05eafe5dc9bee8bd9316c78ee8b0bebe3115bb21b7326720fcac3c106c785224ef903950a68b26a207774df0678d827e05193070a0bccb1"; + // Security Council + expectedDataToSign[1] = + "0x1901df53d510b56e539b90b369ef08fce3631020fbf921e3136ea5f8747c20bce96711b7f5b7a1340529fc0442b8beb32a2df55edd7fb2d6c77f35ed285cd6bcc267"; _assertDataToSignNestedMultisig(multisigTask, actions, expectedDataToSign, MULTICALL3_ADDRESS, rootSafe); } diff --git a/test/tasks/example/eth/019-revenueshare-upgrade-opt-out/.env b/test/tasks/example/eth/019-revenueshare-upgrade-opt-out/.env new file mode 100644 index 0000000000..be0c0bdcfe --- /dev/null +++ b/test/tasks/example/eth/019-revenueshare-upgrade-opt-out/.env @@ -0,0 +1,3 @@ +TENDERLY_GAS=15000000 +FORK_BLOCK_NUMBER=23434662 +NESTED_SAFE_NAME_DEPTH_1=foundation \ No newline at end of file diff --git a/test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml b/test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml new file mode 100644 index 0000000000..2bd40a4548 --- /dev/null +++ b/test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml @@ -0,0 +1,27 @@ +templateName = "RevenueShareV100UpgradePath" + +# Revenue Share Configuration +optInRevenueShare = false + +# Portal and deployment configuration +portal = "0xbEb5Fc579115071764c7423A4f12eDde41f106Ed" # OptimismPortal address +saltSeed = "DeploymentSalt" # Deployment salt +deploymentGasLimit = 1000000 + +# Vaults Configuration +baseFeeVaultWithdrawalNetwork = 0 +baseFeeVaultRecipient = "0x3333333333333333333333333333333333333333" +baseFeeVaultMinWithdrawalAmount = "1000000000000000000" +l1FeeVaultWithdrawalNetwork = 0 +l1FeeVaultRecipient = "0x4444444444444444444444444444444444444444" +l1FeeVaultMinWithdrawalAmount = "1000000000000000000" +sequencerFeeVaultWithdrawalNetwork = 0 +sequencerFeeVaultRecipient = "0x5555555555555555555555555555555555555555" +sequencerFeeVaultMinWithdrawalAmount = "1000000000000000000" +operatorFeeVaultWithdrawalNetwork = 0 +operatorFeeVaultRecipient = "0x6666666666666666666666666666666666666666" +operatorFeeVaultMinWithdrawalAmount = "1000000000000000000" + +[addresses] +ProxyAdminOwner = "0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A" +OptimismPortal = "0xbEb5Fc579115071764c7423A4f12eDde41f106Ed" \ No newline at end of file diff --git a/test/template/RevenueShareUpgradePath.t.sol b/test/template/RevenueShareUpgradePath.t.sol new file mode 100644 index 0000000000..2efd463dca --- /dev/null +++ b/test/template/RevenueShareUpgradePath.t.sol @@ -0,0 +1,361 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import {Test} from "forge-std/Test.sol"; +import {stdStorage, StdStorage} from "forge-std/StdStorage.sol"; +import {VmSafe} from "forge-std/Vm.sol"; +import {IGnosisSafe, Enum} from "@base-contracts/script/universal/IGnosisSafe.sol"; +import {IMulticall3} from "forge-std/interfaces/IMulticall3.sol"; +import {Signatures} from "@base-contracts/script/universal/Signatures.sol"; + +import {RevenueShareV100UpgradePath} from "src/template/RevenueShareUpgradePath.sol"; +import {SimpleAddressRegistry} from "src/SimpleAddressRegistry.sol"; +import {Action, TaskPayload, SafeData} from "src/libraries/MultisigTypes.sol"; +import {Utils} from "src/libraries/Utils.sol"; +import {AddressAliasHelper} from "@eth-optimism-bedrock/src/vendor/AddressAliasHelper.sol"; + +interface IOptimismPortal2 { + function depositTransaction(address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes memory _data) + external + payable; +} + +interface ICreate2Deployer { + function deploy(uint256 _value, bytes32 _salt, bytes memory _code) external; +} + +interface IProxyAdmin { + function upgrade(address _proxy, address _implementation) external; + function upgradeAndCall(address _proxy, address _implementation, bytes memory _data) external payable returns (bytes memory); +} + +contract RevenueShareUpgradePathTest is Test { + using stdStorage for StdStorage; + + event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData); + + RevenueShareV100UpgradePath public template; + + // Expected addresses from config + address public constant PORTAL = 0xbEb5Fc579115071764c7423A4f12eDde41f106Ed; + address public constant PROXY_ADMIN_OWNER = 0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A; + + // Expected number of actions + uint256 public constant EXPECTED_DEPLOYMENTS_OPT_IN = 7; + uint256 public constant EXPECTED_UPGRADES_OPT_IN = 5; + uint256 public constant EXPECTED_DEPLOYMENTS_OPT_OUT = 5; + uint256 public constant EXPECTED_UPGRADES_OPT_OUT = 5; + + // L2 predeploys + address internal constant CREATE2_DEPLOYER = 0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2; + address internal constant FEE_SPLITTER = 0x420000000000000000000000000000000000002B; + address internal constant PROXY_ADMIN = 0x4200000000000000000000000000000000000018; + + // Gas limits, defined in the template based on the transaction simulations + uint64 internal constant SC_REV_SHARE_CALCULATOR_DEPLOYMENT_GAS_LIMIT = 625_000; + uint64 internal constant L1_WITHDRAWER_DEPLOYMENT_GAS_LIMIT = 625_000; + uint64 internal constant FEE_VAULTS_DEPLOYMENT_GAS_LIMIT = 910_000; + uint64 internal constant FEE_SPLITTER_DEPLOYMENT_GAS_LIMIT = 1_235_000; + uint64 internal constant UPGRADE_GAS_LIMIT = 150_000; + + uint64[12] internal EXPECTED_GAS_LIMITS_OPT_IN = [ + L1_WITHDRAWER_DEPLOYMENT_GAS_LIMIT, + SC_REV_SHARE_CALCULATOR_DEPLOYMENT_GAS_LIMIT, + FEE_SPLITTER_DEPLOYMENT_GAS_LIMIT, + UPGRADE_GAS_LIMIT, + FEE_VAULTS_DEPLOYMENT_GAS_LIMIT, + UPGRADE_GAS_LIMIT, + FEE_VAULTS_DEPLOYMENT_GAS_LIMIT, + UPGRADE_GAS_LIMIT, + FEE_VAULTS_DEPLOYMENT_GAS_LIMIT, + UPGRADE_GAS_LIMIT, + FEE_VAULTS_DEPLOYMENT_GAS_LIMIT, + UPGRADE_GAS_LIMIT + ]; + + uint64[10] internal EXPECTED_GAS_LIMITS_OPT_OUT = [ + FEE_SPLITTER_DEPLOYMENT_GAS_LIMIT, + UPGRADE_GAS_LIMIT, + FEE_VAULTS_DEPLOYMENT_GAS_LIMIT, + UPGRADE_GAS_LIMIT, + FEE_VAULTS_DEPLOYMENT_GAS_LIMIT, + UPGRADE_GAS_LIMIT, + FEE_VAULTS_DEPLOYMENT_GAS_LIMIT, + UPGRADE_GAS_LIMIT, + FEE_VAULTS_DEPLOYMENT_GAS_LIMIT, + UPGRADE_GAS_LIMIT + ]; + + uint256 internal constant DEPOSIT_VERSION = 0; + + function _mockAndExpect(address _receiver, bytes memory _calldata, bytes memory _returned) internal { + vm.mockCall(_receiver, _calldata, _returned); + vm.expectCall(_receiver, _calldata); + } + + function setUp() public { + vm.createSelectFork("mainnet"); + + template = new RevenueShareV100UpgradePath(); + } + + function test_optInRevenueShare_succeeds() public { + _testRevenueShareUpgrade( + "test/tasks/example/eth/015-revenue-share-upgrade/config.toml", + true, // isOptIn + EXPECTED_DEPLOYMENTS_OPT_IN + EXPECTED_UPGRADES_OPT_IN, + EXPECTED_DEPLOYMENTS_OPT_IN, + EXPECTED_UPGRADES_OPT_IN, + "Should have 12 actions for opt-in scenario" + ); + } + + function test_optOutRevenueShare_succeeds() public { + _testRevenueShareUpgrade( + "test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml", + false, // isOptIn + EXPECTED_DEPLOYMENTS_OPT_OUT + EXPECTED_UPGRADES_OPT_OUT, + EXPECTED_DEPLOYMENTS_OPT_OUT, + EXPECTED_UPGRADES_OPT_OUT, + "Should have 10 actions for non-opt-in scenario" + ); + } + + /// @notice Helper function to test revenue share upgrade scenarios + /// @param _configPath Path to the config file + /// @param _isOptIn Whether this is an opt-in or opt-out scenario + /// @param _expectedTotalActions Expected total number of actions + /// @param _expectedDeployments Expected number of deployment actions + /// @param _expectedUpgrades Expected number of upgrade actions + /// @param _actionCountMessage Assertion message for action count verification + function _testRevenueShareUpgrade( + string memory _configPath, + bool _isOptIn, + uint256 _expectedTotalActions, + uint256 _expectedDeployments, + uint256 _expectedUpgrades, + string memory _actionCountMessage + ) internal { + // Step 1: Run simulate to prepare everything and get the actions + (, Action[] memory _actions,,, address _rootSafe) = template.simulate(_configPath, new address[](0)); + + // Verify we got the expected safe and action count + assertEq(_rootSafe, PROXY_ADMIN_OWNER, "Root safe should be ProxyAdminOwner"); + assertEq(_actions.length, _expectedTotalActions, _actionCountMessage); + + // Step 2: Get the safe's owners + IGnosisSafe _safe = IGnosisSafe(_rootSafe); + address[] memory _owners = _safe.getOwners(); + + // Step 3: Get the multicall calldata that will be executed + IMulticall3.Call3Value[] memory _calls = new IMulticall3.Call3Value[](_actions.length); + for (uint256 i; i < _actions.length; i++) { + _calls[i] = IMulticall3.Call3Value({ + target: _actions[i].target, + allowFailure: false, + value: _actions[i].value, + callData: _actions[i].arguments + }); + } + bytes memory _multicallData = abi.encodeCall(IMulticall3.aggregate3Value, (_calls)); + + // Step 4: Get the nonce and compute transaction hash before any state changes + uint256 _nonceBefore = _safe.nonce(); + + bytes32 _txHash = _safe.getTransactionHash( + template.multicallTarget(), + 0, // value + _multicallData, + Enum.Operation.DelegateCall, + 0, // safeTxGas + 0, // baseGas + 0, // gasPrice + address(0), // gasToken + payable(address(0)), // refundReceiver + _nonceBefore + ); + + // Step 5: Manually verify expected portal calls based on known config values + _verifyExpectedPortalCalls(_actions, _isOptIn); + + // Step 6: Prank owners to approve the transaction + for (uint256 i; i < _owners.length; i++) { + vm.prank(_owners[i]); + _safe.approveHash(_txHash); + } + + // Step 7: Generate signatures after approval + bytes memory _signatures = Signatures.genPrevalidatedSignatures(_owners); + + _expectPortalEvents(_actions); + + // Step 8: Execute the transaction + bool _success = _safe.execTransaction( + template.multicallTarget(), + 0, // value + _multicallData, + Enum.Operation.DelegateCall, + 0, // safeTxGas + 0, // baseGas + 0, // gasPrice + address(0), // gasToken + payable(address(0)), // refundReceiver + _signatures + ); + + assertTrue(_success, "Transaction should execute successfully"); + assertEq(_safe.nonce(), _nonceBefore + 1, "Safe nonce should increment"); + + // Step 9: Verify the portal calls + _verifyPortalCalls(_actions, _expectedDeployments, _expectedUpgrades); + } + + /// @notice Verify the portal calls based on the expected deployments and upgrades + /// @param _actions The actions to verify + /// @param _expectedDeployments The expected number of deployments + /// @param _expectedUpgrades The expected number of upgrades + function _verifyPortalCalls(Action[] memory _actions, uint256 _expectedDeployments, uint256 _expectedUpgrades) + internal + pure + { + uint256 _deploymentCalls = 0; + uint256 _upgradeCalls = 0; + + for (uint256 i; i < _actions.length; i++) { + // Decode the depositTransaction parameters + bytes memory _params = new bytes(_actions[i].arguments.length - 4); + for (uint256 j; j < _params.length; j++) { + _params[j] = _actions[i].arguments[j + 4]; + } + (address _to,,,,) = abi.decode(_params, (address, uint256, uint64, bool, bytes)); + + if (_to == CREATE2_DEPLOYER) { + _deploymentCalls++; + } else { + _upgradeCalls++; + } + } + + assertEq(_deploymentCalls, _expectedDeployments, "Incorrect number of deployment calls"); + assertEq(_upgradeCalls, _expectedUpgrades, "Incorrect number of upgrade calls"); + } + + /// @notice Manually construct and expect portal calls based on known config values + /// This ensures the template generates correct calldata, not just circular validation + function _verifyExpectedPortalCalls(Action[] memory _actions, bool _isOptIn) internal { + uint256 _deploymentCount; + uint256 _upgradeCount; + + for (uint256 i; i < _actions.length; i++) { + bytes memory _params = _extractParams(_actions[i].arguments); + // depending on if is optin or optout, we use the expected gas limits + uint64 _gasLimit = _isOptIn ? EXPECTED_GAS_LIMITS_OPT_IN[i] : EXPECTED_GAS_LIMITS_OPT_OUT[i]; + (address _to, uint256 _value, uint64 _actualGasLimit, bool _isCreation, bytes memory _data) = + abi.decode(_params, (address, uint256, uint64, bool, bytes)); + + assertEq(_actions[i].target, PORTAL, "All actions should target the portal"); + _verifyCommonParams(_value, _actualGasLimit, _gasLimit, _isCreation, _data); + + if (_to == CREATE2_DEPLOYER) { + _deploymentCount++; + _verifyDeploymentCall(_gasLimit, _data); + } else { + _upgradeCount++; + _verifyUpgradeCall(_to, _gasLimit, _data); + } + } + + assertGt(_deploymentCount, 0, "Should have at least one deployment"); + assertGt(_upgradeCount, 0, "Should have at least one upgrade"); + assertEq(_deploymentCount + _upgradeCount, _actions.length, "All actions should be accounted for"); + } + + /// @notice Extract the parameters from the arguments + /// @param _arguments The arguments to extract the parameters from + /// @return The parameters + function _extractParams(bytes memory _arguments) internal pure returns (bytes memory) { + bytes memory _params = new bytes(_arguments.length - 4); + for (uint256 j; j < _params.length; j++) { + _params[j] = _arguments[j + 4]; + } + return _params; + } + + /// @notice Verify the parameters on the expected portal calls + /// @param _value The value + /// @param _actualGasLimit The actual gas limit + /// @param _expectedGasLimit The expected gas limit + /// @param _isCreation The is creation + /// @param _data The data, only checking calldata length + /// it is better tested in RevenueShareUpgradePath.sol::_validate + function _verifyCommonParams( + uint256 _value, + uint64 _actualGasLimit, + uint64 _expectedGasLimit, + bool _isCreation, + bytes memory _data + ) internal pure { + require(_value == 0, "All calls should have 0 value"); + require(_actualGasLimit == _expectedGasLimit, "Gas limit should match config"); + require(!_isCreation, "Should not use creation flag"); + require(_data.length > 0, "Should have calldata"); + } + + /// @notice Verify the deployment call + /// @param _gasLimit The expected gas limit + /// @param _data The expected data + function _verifyDeploymentCall(uint64 _gasLimit, bytes memory _data) internal { + vm.expectCall( + PORTAL, abi.encodeCall(IOptimismPortal2.depositTransaction, (CREATE2_DEPLOYER, 0, _gasLimit, false, _data)) + ); + + bytes4 _actualSelector; + assembly { + _actualSelector := mload(add(_data, 32)) + } + assertEq(_actualSelector, ICreate2Deployer.deploy.selector, "Deployment should call CREATE2 deploy"); + } + + /// @notice Verify the upgrade call + /// @param _to The target address, it MUST be the proxy admin + /// @param _gasLimit The expected gas limit + /// @param _data The expected data + function _verifyUpgradeCall(address _to, uint64 _gasLimit, bytes memory _data) internal { + vm.expectCall(PORTAL, abi.encodeCall(IOptimismPortal2.depositTransaction, (_to, 0, _gasLimit, false, _data))); + + _assertIsProxyAdmin(_to); + + bytes4 _selector; + assembly { + _selector := mload(add(_data, 32)) + } + assertTrue( + _selector == IProxyAdmin.upgrade.selector || _selector == IProxyAdmin.upgradeAndCall.selector, + "Upgrade should call upgradeTo or upgradeToAndCall" + ); + } + + /// @notice Verify the target address is the proxy admin + /// @param _to The target address + function _assertIsProxyAdmin(address _to) internal pure { + assertTrue( + _to == PROXY_ADMIN, + "Upgrade should target the proxy admin" + ); + } + + /// @notice Expect the portal events + /// @param _actions The actions to expect the events for + function _expectPortalEvents(Action[] memory _actions) internal { + for (uint256 i; i < _actions.length; i++) { + bytes memory _params = _extractParams(_actions[i].arguments); + (address _to,, uint64 _actualGasLimit, bool _isCreation, bytes memory _data) = + abi.decode(_params, (address, uint256, uint64, bool, bytes)); + + bytes memory _opaqueData = abi.encodePacked(uint256(0), uint256(0), _actualGasLimit, _isCreation, _data); + + vm.expectEmit(true, true, true, true, PORTAL); + emit TransactionDeposited(AddressAliasHelper.applyL1ToL2Alias(PROXY_ADMIN_OWNER), _to, DEPOSIT_VERSION, _opaqueData); + } + } +} From 211c2f407fcd0560c4237eabb4b4aa17d0079440 Mon Sep 17 00:00:00 2001 From: Flux <175354924+0xiamflux@users.noreply.github.com> Date: Wed, 15 Oct 2025 15:30:44 -0400 Subject: [PATCH 39/52] chore: update regression tests --- test/tasks/Regression.t.sol | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/test/tasks/Regression.t.sol b/test/tasks/Regression.t.sol index 5bb4b645c8..b5cf29ec92 100644 --- a/test/tasks/Regression.t.sol +++ b/test/tasks/Regression.t.sol @@ -873,7 +873,7 @@ contract RegressionTest is Test { function testRegressionCallDataMatches_RevenueShareV100UpgradePath() public { string memory taskConfigFilePath = "test/tasks/example/eth/015-revenue-share-upgrade/config.toml"; string memory expectedCallData = - "0x174dea710000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000d2000000000000000000000000000000000000000000000000000000000000018e00000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000003140000000000000000000000000000000000000000000000000000000000000430000000000000000000000000000000000000000000000000000000000000044e000000000000000000000000000000000000000000000000000000000000056e000000000000000000000000000000000000000000000000000000000000058c00000000000000000000000000000000000000000000000000000000000006a800000000000000000000000000000000000000000000000000000000000006c600000000000000000000000000000000000000000000000000000000000007e20000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000ae4e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000a0466cfa0570000000000000000000000000000000000000000000000000000000000000000fa8e542d08c461382d17d78973c846bafcf01f0c60f78f77abd977884fd393ff000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000009686080604052348015600e575f80fd5b50604051610908380380610908833981016040819052602b916067565b5f929092556001805463ffffffff909316600160a01b026001600160c01b03199093166001600160a01b039092169190911791909117905560b8565b5f805f606084860312156078575f80fd5b835160208501519093506001600160a01b03811681146095575f80fd5b604085015190925063ffffffff8116811460ad575f80fd5b809150509250925092565b610843806100c55f395ff3fe608060405260043610610071575f3560e01c806366d003ac1161004c57806366d003ac146102995780638312f149146102ea57806385b5b14d1461030c5780639d7955b41461032b575f80fd5b80633bbed4a0146101d7578063500bf72f146101f657806354fd4d5014610244575f80fd5b366101d3576040805134815247602082018190529133917f363f315f930a17d1266b86a20d6dd34b1cfbc5a9db9f13a65d06a689c3a2af8a910160405180910390a25f5481106101d1576001546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152606060248201525f60648201527401000000000000000000000000000000000000000090910463ffffffff16604482015273420000000000000000000000000000000000000790633dbb202b9083906084015f604051808303818588803b158015610169575f80fd5b505af115801561017b573d5f803e3d5ffd5b505060015460405185815273ffffffffffffffffffffffffffffffffffffffff90911693507f6d92f7d3303f995bf21956bb0c51b388bae348eaf45c23debd2cfa3fcd9ec6469250602001905060405180910390a25b005b5f80fd5b3480156101e2575f80fd5b506101d16101f136600461076c565b61034a565b348015610201575f80fd5b5060015461022a9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b34801561024f575f80fd5b5061028c6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161023b919061078e565b3480156102a4575f80fd5b506001546102c59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161023b565b3480156102f5575f80fd5b506102fe5f5481565b60405190815260200161023b565b348015610317575f80fd5b506101d16103263660046107e1565b6104b6565b348015610336575f80fd5b506101d16103453660046107f8565b6105d8565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103cb919061081b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461042f576040517f807b982000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e459391015b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610513573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610537919061081b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461059b576040517f807b982000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e420391016104aa565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610635573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610659919061081b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106bd576040517f807b982000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805463ffffffff838116740100000000000000000000000000000000000000008181027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff85161790945560408051949093049091168084526020840191909152917fd00b9b2acb0059a20066ca19b541618141c03305a0a6644d43277758c539b5de91016104aa565b73ffffffffffffffffffffffffffffffffffffffff81168114610769575f80fd5b50565b5f6020828403121561077c575f80fd5b813561078781610748565b9392505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f602082840312156107f1575f80fd5b5035919050565b5f60208284031215610808575f80fd5b813563ffffffff81168114610787575f80fd5b5f6020828403121561082b575f80fd5b81516107878161074856fea164736f6c6343000819000a0000000000000000000000000000000000000000000000000000000000055730000000000000000000000000742d35cc6634c0532925a3b8d0c0c8b8b0c0c8b80000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000b04e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000a2466cfa0570000000000000000000000000000000000000000000000000000000000000000d07fd81b3e1bcfbf3c91e5b2f6b54443cff180a787261d425462132920599561000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000009956080604052348015600e575f80fd5b50604051610955380380610955833981016040819052602b916074565b5f80546001600160a01b039384166001600160a01b0319918216179091556001805492909316911617905560a0565b80516001600160a01b0381168114606f575f80fd5b919050565b5f80604083850312156084575f80fd5b608b83605a565b9150609760208401605a565b90509250929050565b6108a8806100ad5f395ff3fe608060405234801561000f575f80fd5b506004361061009f575f3560e01c80635b201d83116100725780637b42d6c2116100585780637b42d6c21461019157806396d842be1461019a5780639c662fdd146101b9575f80fd5b80635b201d831461016b578063712d7bb814610189575f80fd5b806329f33ec8146100a35780634b012e9a146100ed57806354e7f42d1461010257806354fd4d5014610122575b5f80fd5b6001546100c39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101006100fb3660046106a3565b6101cc565b005b6101156101103660046106c5565b610325565b6040516100e491906106f4565b61015e6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100e49190610758565b61017461271081565b60405163ffffffff90911681526020016100e4565b61017460fa81565b6101746105dc81565b5f546100c39073ffffffffffffffffffffffffffffffffffffffff1681565b6101006101c73660046106a3565b610524565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610229573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061024d91906107ab565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146102b1576040517f67102c4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917fc7b7459ad1ab31862524bf0c4a5e6a8518c60f27607a5c483a58ea27e30c214c9190a35050565b6040805160028082526060828101909352816020015b604080518082019091525f808252602082015281526020019060019003908161033b575050604080518082019091525f805473ffffffffffffffffffffffffffffffffffffffff16825260208201819052825192935090918391906103a2576103a26107c6565b6020026020010181905250604051806040016040528060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f8152508160018151811061040c5761040c6107c6565b60209081029190910101525f82846104248789610820565b61042e9190610820565b6104389190610820565b90505f61271061044960fa84610839565b6104539190610850565b9050805f0361048e576040517f0174e42600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104998584610888565b90505f6127106104ab6105dc84610839565b6104b59190610850565b90505f8184116104c557816104c7565b835b905080865f815181106104dc576104dc6107c6565b60209081029190910181015101526104f48186610888565b86600181518110610507576105076107c6565b602002602001015160200181815250505050505050949350505050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610581573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105a591906107ab565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610609576040517f67102c4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f28c1e0a919cd3b91d6d516417dedc06a2bd7954ad8960315347250b1aee2a4f1905f90a35050565b73ffffffffffffffffffffffffffffffffffffffff811681146106a0575f80fd5b50565b5f602082840312156106b3575f80fd5b81356106be8161067f565b9392505050565b5f805f80608085870312156106d8575f80fd5b5050823594602084013594506040840135936060013592509050565b602080825282518282018190525f919060409081850190868401855b8281101561074b578151805173ffffffffffffffffffffffffffffffffffffffff168552860151868501529284019290850190600101610710565b5091979650505050505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f602082840312156107bb575f80fd5b81516106be8161067f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610833576108336107f3565b92915050565b8082028115828204841417610833576108336107f3565b5f82610883577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115610833576108336107f356fea164736f6c6343000819000a00000000000000000000000065e05252dd7964dbb722a9fca24c6a2d7afbef570000000000000000000000008b0c0c8b8b0c0c8b8b0c0c8b8b0c0c8b8b0c0c8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001544e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012d838000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000146466cfa0570000000000000000000000000000000000000000000000000000000000000000d7c04619bfc311a92d20723f9d08baaba18c3c8c7dcd85736bf66b85f59c37f6000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000013d26080604052348015600e575f80fd5b5060156019565b60d4565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101560d2575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6112f1806100e15f395ff3fe608060405260043610610096575f3560e01c80637dfbd04911610066578063b87ea8d41161004c578063b87ea8d414610313578063c4d66de814610327578063d61a398b14610346575f80fd5b80637dfbd049146102dd5780637fc81bb7146102f4575f80fd5b80630a7617b3146101dd5780630c0544a3146101fe578063394d27311461026057806354fd4d5014610288575f80fd5b366101d9577fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455c6100f3576040517f17617f6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b337342000000000000000000000000000000000000111480159061012b57503373420000000000000000000000000000000000001914155b801561014b57503373420000000000000000000000000000000000001a14155b801561016b57503373420000000000000000000000000000000000001b14155b156101a2576040517f9dcde10900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405134815233907f2ccfc58c2cef4ee590b5f16be0548cc54afc12e1c66a67b362b7d640fd16bb2d9060200160405180910390a2005b5f80fd5b3480156101e8575f80fd5b506101fc6101f7366004610f4b565b61039c565b005b348015610209575f80fd5b5060015461023a9070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561026b575f80fd5b5060015461023a906fffffffffffffffffffffffffffffffff1681565b348015610293575f80fd5b506102d06040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516102579190610f66565b3480156102e8575f80fd5b5061023a6301e1338081565b3480156102ff575f80fd5b506101fc61030e366004610fb9565b61055e565b34801561031e575f80fd5b506101fc610706565b348015610332575f80fd5b506101fc610341366004610f4b565b610aea565b348015610351575f80fd5b505f546103779062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610257565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041d9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610481576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166104ce576040517f99c6ec0800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff85161790945560408051949093049091168084526020840191909152917f16417cc372deec0caee5f52e2ad77a5f07b4591fd56b4ff31b6e20f817d4daeb91015b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105df9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610643576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6301e133806fffffffffffffffffffffffffffffffff82161115610693576040517f30b9f35e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546fffffffffffffffffffffffffffffffff8381167001000000000000000000000000000000008181028385161790945560408051949093049091168084526020840191909152917f4492086b630ed3846eec0979dd87a71c814ceb1c6dab80ab81e3450b21e4de289101610552565b60015461073b906fffffffffffffffffffffffffffffffff700100000000000000000000000000000000820481169116611030565b6fffffffffffffffffffffffffffffffff16421015610786576040517f1e4a9f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016426fffffffffffffffffffffffffffffffff161781556107cb90610ce0565b5f6107e9734200000000000000000000000000000000000011610d06565b90505f610809734200000000000000000000000000000000000019610d06565b90505f61082973420000000000000000000000000000000000001a610d06565b90505f61084973420000000000000000000000000000000000001b610d06565b90506108545f610ce0565b5f82826108618688611060565b61086b9190611060565b6108759190611060565b9050805f036108b0576040517fc8972e5200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517f54e7f42d000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101859052606481018690526201000090910473ffffffffffffffffffffffffffffffffffffffff16906354e7f42d906084015f60405180830381865afa158015610936573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261097b9190810190611118565b905080515f036109b7576040517f763970d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b8251811015610a6e575f8382815181106109d6576109d66111e7565b60200260200101515f015190505f8483815181106109f6576109f66111e7565b6020026020010151602001519050805f03610a12575050610a66565b5f610a1d8383610f03565b905080610a56576040517fd68d1b1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a608286611060565b94505050505b6001016109ba565b50828114610aa8576040517f9c01eac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f73f9a13241a1848ec157967f3a85601709353e616f1f2605d818c0f2d21774df8284604051610ad9929190611214565b60405180910390a150505050505050565b5f54610100900460ff1615808015610b0857505f54600160ff909116105b80610b215750303b158015610b2157505f5460ff166001145b610bb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610c0d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff851602179055600180546fffffffffffffffffffffffffffffffff1672015180000000000000000000000000000000001790558015610cdc575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610552565b5050565b807fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455d50565b5f60018273ffffffffffffffffffffffffffffffffffffffff166382356d8a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d7691906112af565b6001811115610d8757610d87611282565b14610dbe576040517fb4726cbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff166366d003ac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e429190610fe8565b73ffffffffffffffffffffffffffffffffffffffff1614610e8f576040517fc3380cef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610ed9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610efd91906112cd565b92915050565b5f610f0f835a84610f16565b9392505050565b5f805f805f858888f1949350505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f48575f80fd5b50565b5f60208284031215610f5b575f80fd5b8135610f0f81610f27565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f60208284031215610fc9575f80fd5b81356fffffffffffffffffffffffffffffffff81168114610f0f575f80fd5b5f60208284031215610ff8575f80fd5b8151610f0f81610f27565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6fffffffffffffffffffffffffffffffff81811683821601908082111561105957611059611003565b5092915050565b80820180821115610efd57610efd611003565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156110c3576110c3611073565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561111057611110611073565b604052919050565b5f6020808385031215611129575f80fd5b825167ffffffffffffffff80821115611140575f80fd5b818501915085601f830112611153575f80fd5b81518181111561116557611165611073565b611173848260051b016110c9565b818152848101925060069190911b830184019087821115611192575f80fd5b928401925b818410156111dc57604084890312156111ae575f80fd5b6111b66110a0565b84516111c181610f27565b81528486015186820152835260409093019291840191611197565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604080825283518282018190525f91906020906060850190828801855b8281101561126c578151805173ffffffffffffffffffffffffffffffffffffffff168552850151858501529285019290840190600101611231565b5050508093505050508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f602082840312156112bf575f80fd5b815160028110610f0f575f80fd5b5f602082840312156112dd575f80fd5b505191905056fea164736f6c6343000819000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c49623609d000000000000000000000000420000000000000000000000000000000000002b0000000000000000000000006b0d0b5d65c13ed9ec80617772aee4d6c594a66e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de8000000000000000000000000a9c1d283ab6f149853337395e18850b3ff6cf192000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa0570000000000000000000000000000000000000000000000000000000000000000783aa8b3e401c8404e3eff9401ba29702719ddc0c0f69ec9ac77188bacea107300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9c60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a000000000000000000000000420000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000124e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004499a88ec4000000000000000000000000420000000000000000000000000000000000001b000000000000000000000000d71e5f87cc7065478ffd16130b3ac640caa14a2e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001144e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000106466cfa0570000000000000000000000000000000000000000000000000000000000000000204cb368f75f2d6cade61b62cb318bffd2bd31a57a3f86dff75f5bfd9d2dd14900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000fcb60e060405234801561001057600080fd5b50604051610f6b380380610f6b83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e466101256000396000818161028f0152610a0101526000818160f401526109910152600081816102c30152610a550152610e466000f3fe6080604052600436106100d65760003560e01c806382356d8a1161007f57806385b5b14d1161005957806385b5b14d1461025d578063d0e12f901461027d578063d3e5792b146102b1578063d4ff9218146102e557600080fd5b806382356d8a146102105780638312f1491461023257806384411d651461024757600080fd5b80633ccfd60b116100b05780633ccfd60b1461018257806354fd4d50146101a557806366d003ac146101fb57600080fd5b80630d9019e1146100e2578063307f2962146101405780633bbed4a01461016257600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506101167f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014c57600080fd5b5061016061015b366004610c14565b6102fa565b005b34801561016e57600080fd5b5061016061017d366004610c5a565b6104c2565b34801561018e57600080fd5b50610197610642565b604051908152602001610137565b3480156101b157600080fd5b506101ee6040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b6040516101379190610c77565b34801561020757600080fd5b5061011661094a565b34801561021c57600080fd5b506102256109b3565b6040516101379190610d54565b34801561023e57600080fd5b50610197610a23565b34801561025357600080fd5b5061019760005481565b34801561026957600080fd5b50610160610278366004610d68565b610a77565b34801561028957600080fd5b506102257f000000000000000000000000000000000000000000000000000000000000000081565b3480156102bd57600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f157600080fd5b50610116610bdd565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610359573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037d9190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103e1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043d5761043d610cea565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104b69083908590610d9e565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610521573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105459190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105a9576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e459391016104b6565b600061064c610a23565b471015610706576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b4790508060008082825461071a9190610db9565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161074a61094a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee816107a861094a565b336107b16109b3565b6040516107c19493929190610df8565b60405180910390a160016107d36109b3565b60018111156107e4576107e4610cea565b0361088f5760006107fc6107f661094a565b83610bec565b90508061088b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106fd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac826108b261094a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561092e57600080fd5b505af1158015610942573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561098e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109fe575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a52575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ad6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afa9190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b5e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e420391016104b6565b6000610be761094a565b905090565b6000610bf9835a84610c00565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610c2657600080fd5b813560028110610bf957600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c5757600080fd5b50565b600060208284031215610c6c57600080fd5b8135610bf981610c35565b600060208083528351808285015260005b81811015610ca457858101830151858201604001528201610c88565b81811115610cb6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d50577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d628284610d19565b92915050565b600060208284031215610d7a57600080fd5b5035919050565b600060208284031215610d9357600080fd5b8151610bf981610c35565b60408101610dac8285610d19565b610bf96020830184610d19565b60008219821115610df3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e306060830184610d19565b9594505050505056fea164736f6c634300080f000a000000000000000000000000420000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000124e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004499a88ec4000000000000000000000000420000000000000000000000000000000000001100000000000000000000000016ffe2014590a40f0ae5fa5f2fca9458335336600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa05700000000000000000000000000000000000000000000000000000000000000007a2bde9cfb7f80a4198677bdf885a43dc36c598688294f694cf64429164f140000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9c60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a000000000000000000000000420000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000124e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004499a88ec4000000000000000000000000420000000000000000000000000000000000001900000000000000000000000073cafd1099ac8c206790cd7e74dfa9fe43dfd7b50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa05700000000000000000000000000000000000000000000000000000000000000004ac8e160bee0acc95b22d1744fa9cc7068869945397f78a77ed68ef8ae1d87a900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9c60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a000000000000000000000000420000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000124e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004499a88ec4000000000000000000000000420000000000000000000000000000000000001a0000000000000000000000004d76e5decbbd6a0de0ae39e089eca932e14cf6730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + "0x174dea710000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000d2000000000000000000000000000000000000000000000000000000000000018e00000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000003140000000000000000000000000000000000000000000000000000000000000430000000000000000000000000000000000000000000000000000000000000045a000000000000000000000000000000000000000000000000000000000000057600000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000006bc00000000000000000000000000000000000000000000000000000000000006e600000000000000000000000000000000000000000000000000000000000008020000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000ae4e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000a0466cfa0570000000000000000000000000000000000000000000000000000000000000000fa8e542d08c461382d17d78973c846bafcf01f0c60f78f77abd977884fd393ff000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000009686080604052348015600e575f80fd5b50604051610908380380610908833981016040819052602b916067565b5f929092556001805463ffffffff909316600160a01b026001600160c01b03199093166001600160a01b039092169190911791909117905560b8565b5f805f606084860312156078575f80fd5b835160208501519093506001600160a01b03811681146095575f80fd5b604085015190925063ffffffff8116811460ad575f80fd5b809150509250925092565b610843806100c55f395ff3fe608060405260043610610071575f3560e01c806366d003ac1161004c57806366d003ac146102995780638312f149146102ea57806385b5b14d1461030c5780639d7955b41461032b575f80fd5b80633bbed4a0146101d7578063500bf72f146101f657806354fd4d5014610244575f80fd5b366101d3576040805134815247602082018190529133917f363f315f930a17d1266b86a20d6dd34b1cfbc5a9db9f13a65d06a689c3a2af8a910160405180910390a25f5481106101d1576001546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152606060248201525f60648201527401000000000000000000000000000000000000000090910463ffffffff16604482015273420000000000000000000000000000000000000790633dbb202b9083906084015f604051808303818588803b158015610169575f80fd5b505af115801561017b573d5f803e3d5ffd5b505060015460405185815273ffffffffffffffffffffffffffffffffffffffff90911693507f6d92f7d3303f995bf21956bb0c51b388bae348eaf45c23debd2cfa3fcd9ec6469250602001905060405180910390a25b005b5f80fd5b3480156101e2575f80fd5b506101d16101f136600461076c565b61034a565b348015610201575f80fd5b5060015461022a9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b34801561024f575f80fd5b5061028c6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161023b919061078e565b3480156102a4575f80fd5b506001546102c59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161023b565b3480156102f5575f80fd5b506102fe5f5481565b60405190815260200161023b565b348015610317575f80fd5b506101d16103263660046107e1565b6104b6565b348015610336575f80fd5b506101d16103453660046107f8565b6105d8565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103cb919061081b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461042f576040517f807b982000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e459391015b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610513573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610537919061081b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461059b576040517f807b982000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e420391016104aa565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610635573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610659919061081b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106bd576040517f807b982000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805463ffffffff838116740100000000000000000000000000000000000000008181027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff85161790945560408051949093049091168084526020840191909152917fd00b9b2acb0059a20066ca19b541618141c03305a0a6644d43277758c539b5de91016104aa565b73ffffffffffffffffffffffffffffffffffffffff81168114610769575f80fd5b50565b5f6020828403121561077c575f80fd5b813561078781610748565b9392505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f602082840312156107f1575f80fd5b5035919050565b5f60208284031215610808575f80fd5b813563ffffffff81168114610787575f80fd5b5f6020828403121561082b575f80fd5b81516107878161074856fea164736f6c6343000819000a0000000000000000000000000000000000000000000000000000000000055730000000000000000000000000742d35cc6634c0532925a3b8d0c0c8b8b0c0c8b80000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000b04e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000a2466cfa0570000000000000000000000000000000000000000000000000000000000000000d07fd81b3e1bcfbf3c91e5b2f6b54443cff180a787261d425462132920599561000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000009956080604052348015600e575f80fd5b50604051610955380380610955833981016040819052602b916074565b5f80546001600160a01b039384166001600160a01b0319918216179091556001805492909316911617905560a0565b80516001600160a01b0381168114606f575f80fd5b919050565b5f80604083850312156084575f80fd5b608b83605a565b9150609760208401605a565b90509250929050565b6108a8806100ad5f395ff3fe608060405234801561000f575f80fd5b506004361061009f575f3560e01c80635b201d83116100725780637b42d6c2116100585780637b42d6c21461019157806396d842be1461019a5780639c662fdd146101b9575f80fd5b80635b201d831461016b578063712d7bb814610189575f80fd5b806329f33ec8146100a35780634b012e9a146100ed57806354e7f42d1461010257806354fd4d5014610122575b5f80fd5b6001546100c39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101006100fb3660046106a3565b6101cc565b005b6101156101103660046106c5565b610325565b6040516100e491906106f4565b61015e6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100e49190610758565b61017461271081565b60405163ffffffff90911681526020016100e4565b61017460fa81565b6101746105dc81565b5f546100c39073ffffffffffffffffffffffffffffffffffffffff1681565b6101006101c73660046106a3565b610524565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610229573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061024d91906107ab565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146102b1576040517f67102c4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917fc7b7459ad1ab31862524bf0c4a5e6a8518c60f27607a5c483a58ea27e30c214c9190a35050565b6040805160028082526060828101909352816020015b604080518082019091525f808252602082015281526020019060019003908161033b575050604080518082019091525f805473ffffffffffffffffffffffffffffffffffffffff16825260208201819052825192935090918391906103a2576103a26107c6565b6020026020010181905250604051806040016040528060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f8152508160018151811061040c5761040c6107c6565b60209081029190910101525f82846104248789610820565b61042e9190610820565b6104389190610820565b90505f61271061044960fa84610839565b6104539190610850565b9050805f0361048e576040517f0174e42600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104998584610888565b90505f6127106104ab6105dc84610839565b6104b59190610850565b90505f8184116104c557816104c7565b835b905080865f815181106104dc576104dc6107c6565b60209081029190910181015101526104f48186610888565b86600181518110610507576105076107c6565b602002602001015160200181815250505050505050949350505050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610581573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105a591906107ab565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610609576040517f67102c4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f28c1e0a919cd3b91d6d516417dedc06a2bd7954ad8960315347250b1aee2a4f1905f90a35050565b73ffffffffffffffffffffffffffffffffffffffff811681146106a0575f80fd5b50565b5f602082840312156106b3575f80fd5b81356106be8161067f565b9392505050565b5f805f80608085870312156106d8575f80fd5b5050823594602084013594506040840135936060013592509050565b602080825282518282018190525f919060409081850190868401855b8281101561074b578151805173ffffffffffffffffffffffffffffffffffffffff168552860151868501529284019290850190600101610710565b5091979650505050505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f602082840312156107bb575f80fd5b81516106be8161067f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610833576108336107f3565b92915050565b8082028115828204841417610833576108336107f3565b5f82610883577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115610833576108336107f356fea164736f6c6343000819000a00000000000000000000000065e05252dd7964dbb722a9fca24c6a2d7afbef570000000000000000000000008b0c0c8b8b0c0c8b8b0c0c8b8b0c0c8b8b0c0c8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001544e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012d838000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000146466cfa0570000000000000000000000000000000000000000000000000000000000000000d7c04619bfc311a92d20723f9d08baaba18c3c8c7dcd85736bf66b85f59c37f6000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000013d26080604052348015600e575f80fd5b5060156019565b60d4565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101560d2575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6112f1806100e15f395ff3fe608060405260043610610096575f3560e01c80637dfbd04911610066578063b87ea8d41161004c578063b87ea8d414610313578063c4d66de814610327578063d61a398b14610346575f80fd5b80637dfbd049146102dd5780637fc81bb7146102f4575f80fd5b80630a7617b3146101dd5780630c0544a3146101fe578063394d27311461026057806354fd4d5014610288575f80fd5b366101d9577fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455c6100f3576040517f17617f6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b337342000000000000000000000000000000000000111480159061012b57503373420000000000000000000000000000000000001914155b801561014b57503373420000000000000000000000000000000000001a14155b801561016b57503373420000000000000000000000000000000000001b14155b156101a2576040517f9dcde10900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405134815233907f2ccfc58c2cef4ee590b5f16be0548cc54afc12e1c66a67b362b7d640fd16bb2d9060200160405180910390a2005b5f80fd5b3480156101e8575f80fd5b506101fc6101f7366004610f4b565b61039c565b005b348015610209575f80fd5b5060015461023a9070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561026b575f80fd5b5060015461023a906fffffffffffffffffffffffffffffffff1681565b348015610293575f80fd5b506102d06040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516102579190610f66565b3480156102e8575f80fd5b5061023a6301e1338081565b3480156102ff575f80fd5b506101fc61030e366004610fb9565b61055e565b34801561031e575f80fd5b506101fc610706565b348015610332575f80fd5b506101fc610341366004610f4b565b610aea565b348015610351575f80fd5b505f546103779062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610257565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041d9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610481576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166104ce576040517f99c6ec0800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff85161790945560408051949093049091168084526020840191909152917f16417cc372deec0caee5f52e2ad77a5f07b4591fd56b4ff31b6e20f817d4daeb91015b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105df9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610643576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6301e133806fffffffffffffffffffffffffffffffff82161115610693576040517f30b9f35e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546fffffffffffffffffffffffffffffffff8381167001000000000000000000000000000000008181028385161790945560408051949093049091168084526020840191909152917f4492086b630ed3846eec0979dd87a71c814ceb1c6dab80ab81e3450b21e4de289101610552565b60015461073b906fffffffffffffffffffffffffffffffff700100000000000000000000000000000000820481169116611030565b6fffffffffffffffffffffffffffffffff16421015610786576040517f1e4a9f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016426fffffffffffffffffffffffffffffffff161781556107cb90610ce0565b5f6107e9734200000000000000000000000000000000000011610d06565b90505f610809734200000000000000000000000000000000000019610d06565b90505f61082973420000000000000000000000000000000000001a610d06565b90505f61084973420000000000000000000000000000000000001b610d06565b90506108545f610ce0565b5f82826108618688611060565b61086b9190611060565b6108759190611060565b9050805f036108b0576040517fc8972e5200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517f54e7f42d000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101859052606481018690526201000090910473ffffffffffffffffffffffffffffffffffffffff16906354e7f42d906084015f60405180830381865afa158015610936573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261097b9190810190611118565b905080515f036109b7576040517f763970d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b8251811015610a6e575f8382815181106109d6576109d66111e7565b60200260200101515f015190505f8483815181106109f6576109f66111e7565b6020026020010151602001519050805f03610a12575050610a66565b5f610a1d8383610f03565b905080610a56576040517fd68d1b1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a608286611060565b94505050505b6001016109ba565b50828114610aa8576040517f9c01eac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f73f9a13241a1848ec157967f3a85601709353e616f1f2605d818c0f2d21774df8284604051610ad9929190611214565b60405180910390a150505050505050565b5f54610100900460ff1615808015610b0857505f54600160ff909116105b80610b215750303b158015610b2157505f5460ff166001145b610bb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610c0d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff851602179055600180546fffffffffffffffffffffffffffffffff1672015180000000000000000000000000000000001790558015610cdc575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610552565b5050565b807fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455d50565b5f60018273ffffffffffffffffffffffffffffffffffffffff166382356d8a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d7691906112af565b6001811115610d8757610d87611282565b14610dbe576040517fb4726cbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff166366d003ac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e429190610fe8565b73ffffffffffffffffffffffffffffffffffffffff1614610e8f576040517fc3380cef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610ed9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610efd91906112cd565b92915050565b5f610f0f835a84610f16565b9392505050565b5f805f805f858888f1949350505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f48575f80fd5b50565b5f60208284031215610f5b575f80fd5b8135610f0f81610f27565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f60208284031215610fc9575f80fd5b81356fffffffffffffffffffffffffffffffff81168114610f0f575f80fd5b5f60208284031215610ff8575f80fd5b8151610f0f81610f27565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6fffffffffffffffffffffffffffffffff81811683821601908082111561105957611059611003565b5092915050565b80820180821115610efd57610efd611003565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156110c3576110c3611073565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561111057611110611073565b604052919050565b5f6020808385031215611129575f80fd5b825167ffffffffffffffff80821115611140575f80fd5b818501915085601f830112611153575f80fd5b81518181111561116557611165611073565b611173848260051b016110c9565b818152848101925060069190911b830184019087821115611192575f80fd5b928401925b818410156111dc57604084890312156111ae575f80fd5b6111b66110a0565b84516111c181610f27565b81528486015186820152835260409093019291840191611197565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604080825283518282018190525f91906020906060850190828801855b8281101561126c578151805173ffffffffffffffffffffffffffffffffffffffff168552850151858501529285019290840190600101611231565b5050508093505050508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f602082840312156112bf575f80fd5b815160028110610f0f575f80fd5b5f602082840312156112dd575f80fd5b505191905056fea164736f6c6343000819000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c49623609d000000000000000000000000420000000000000000000000000000000000002b0000000000000000000000006b0d0b5d65c13ed9ec80617772aee4d6c594a66e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de8000000000000000000000000a9c1d283ab6f149853337395e18850b3ff6cf192000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa0570000000000000000000000000000000000000000000000000000000000000000783aa8b3e401c8404e3eff9401ba29702719ddc0c0f69ec9ac77188bacea107300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f8f6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610eb9806100d65f395ff3fe6080604052600436106100d1575f3560e01c806382356d8a1161007c57806385b5b14d1161005757806385b5b14d14610276578063b49dc74114610295578063d0e12f90146102b4578063d3e5792b146102e3575f80fd5b806382356d8a1461020f5780638312f1491461024d57806384411d6514610262575f80fd5b80633ccfd60b116100ac5780633ccfd60b1461016c57806354fd4d501461018e57806366d003ac146101e3575f80fd5b80630d9019e1146100dc578063307f29621461012c5780633bbed4a01461014d575f80fd5b366100d857005b5f80fd5b3480156100e7575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610137575f80fd5b5061014b610146366004610c86565b6102f7565b005b348015610158575f80fd5b5061014b610167366004610cc3565b61047a565b348015610177575f80fd5b506101806105de565b604051908152602001610123565b348015610199575f80fd5b506101d66040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516101239190610cde565b3480156101ee575f80fd5b506002546101029073ffffffffffffffffffffffffffffffffffffffff1681565b34801561021a575f80fd5b506002546102409074010000000000000000000000000000000000000000900460ff1681565b6040516101239190610d97565b348015610258575f80fd5b5061018060015481565b34801561026d575f80fd5b506101805f5481565b348015610281575f80fd5b5061014b610290366004610dab565b610918565b3480156102a0575f80fd5b5061014b6102af366004610dc2565b610a3b565b3480156102bf575f80fd5b5060025474010000000000000000000000000000000000000000900460ff16610240565b3480156102ee575f80fd5b50600154610180565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610354573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103789190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103dc576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043857610438610d31565b02179055507ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8818360405161046e929190610e18565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fb9190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461055f576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161046e565b5f60015447101561069c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050805f808282546106af9190610e33565b90915550506002546040805183815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a16002546040517f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee9161077491849173ffffffffffffffffffffffffffffffffffffffff811691339174010000000000000000000000000000000000000000900460ff1690610e6b565b60405180910390a1600160025474010000000000000000000000000000000000000000900460ff1660018111156107ad576107ad610d31565b0361086a576002545f906107d79073ffffffffffffffffffffffffffffffffffffffff1683610c4f565b905080610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e74000000000000000000000000000000006064820152608401610693565b5090565b6002546040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a806024820152606060448201525f60648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084015f604051808303818588803b1580156108fe575f80fd5b505af1158015610910573d5f803e3d5ffd5b505050505090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610975573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109999190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109fd576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e4203910161046e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610a855750825b90505f8267ffffffffffffffff166001148015610aa15750303b155b905081158015610aaf575080155b15610ae6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610b475784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6002805473ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117835560018a81558993927fffffffffffffffffffffff000000000000000000000000000000000000000000169091179074010000000000000000000000000000000000000000908490811115610bdf57610bdf610d31565b02179055508315610c455784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610c5b835a84610c62565b9392505050565b5f805f805f858888f1949350505050565b803560028110610c81575f80fd5b919050565b5f60208284031215610c96575f80fd5b610c5b82610c73565b73ffffffffffffffffffffffffffffffffffffffff81168114610cc0575f80fd5b50565b5f60208284031215610cd3575f80fd5b8135610c5b81610c9f565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110610d93577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610da58284610d5e565b92915050565b5f60208284031215610dbb575f80fd5b5035919050565b5f805f60608486031215610dd4575f80fd5b8335610ddf81610c9f565b925060208401359150610df460408501610c73565b90509250925092565b5f60208284031215610e0d575f80fd5b8151610c5b81610c9f565b60408101610e268285610d5e565b610c5b6020830184610d5e565b80820180821115610da5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610ea36060830184610d5e565b9594505050505056fea164736f6c6343000819000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001e4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001049623609d000000000000000000000000420000000000000000000000000000000000001b000000000000000000000000bb8accad49adb30084bdf22d01a109883fd13dce00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064b49dc741000000000000000000000000420000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa0570000000000000000000000000000000000000000000000000000000000000000204cb368f75f2d6cade61b62cb318bffd2bd31a57a3f86dff75f5bfd9d2dd14900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9a6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610ec4806100d65f395ff3fe6080604052600436106100dc575f3560e01c80638312f1491161007c578063b49dc74111610057578063b49dc741146102a0578063d0e12f90146102bf578063d3e5792b146102ee578063d4ff9218146100e7575f80fd5b80638312f1491461025857806384411d651461026d57806385b5b14d14610281575f80fd5b80633ccfd60b116100b75780633ccfd60b1461017757806354fd4d501461019957806366d003ac146101ee57806382356d8a1461021a575f80fd5b80630d9019e1146100e7578063307f2962146101375780633bbed4a014610158575f80fd5b366100e357005b5f80fd5b3480156100f2575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610142575f80fd5b50610156610151366004610c91565b610302565b005b348015610163575f80fd5b50610156610172366004610cce565b610485565b348015610182575f80fd5b5061018b6105e9565b60405190815260200161012e565b3480156101a4575f80fd5b506101e16040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012e9190610ce9565b3480156101f9575f80fd5b5060025461010d9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610225575f80fd5b5060025461024b9074010000000000000000000000000000000000000000900460ff1681565b60405161012e9190610da2565b348015610263575f80fd5b5061018b60015481565b348015610278575f80fd5b5061018b5f5481565b34801561028c575f80fd5b5061015661029b366004610db6565b610923565b3480156102ab575f80fd5b506101566102ba366004610dcd565b610a46565b3480156102ca575f80fd5b5060025474010000000000000000000000000000000000000000900460ff1661024b565b3480156102f9575f80fd5b5060015461018b565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561035f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103839190610e08565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103e7576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561044357610443610d3c565b02179055507ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc88183604051610479929190610e23565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105069190610e08565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461056a576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610479565b5f6001544710156106a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050805f808282546106ba9190610e3e565b90915550506002546040805183815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a16002546040517f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee9161077f91849173ffffffffffffffffffffffffffffffffffffffff811691339174010000000000000000000000000000000000000000900460ff1690610e76565b60405180910390a1600160025474010000000000000000000000000000000000000000900460ff1660018111156107b8576107b8610d3c565b03610875576002545f906107e29073ffffffffffffffffffffffffffffffffffffffff1683610c5a565b905080610871576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e7400000000000000000000000000000000606482015260840161069e565b5090565b6002546040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a806024820152606060448201525f60648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084015f604051808303818588803b158015610909575f80fd5b505af115801561091b573d5f803e3d5ffd5b505050505090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610980573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109a49190610e08565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a08576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610479565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610a905750825b90505f8267ffffffffffffffff166001148015610aac5750303b155b905081158015610aba575080155b15610af1576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610b525784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6002805473ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117835560018a81558993927fffffffffffffffffffffff000000000000000000000000000000000000000000169091179074010000000000000000000000000000000000000000908490811115610bea57610bea610d3c565b02179055508315610c505784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610c66835a84610c6d565b9392505050565b5f805f805f858888f1949350505050565b803560028110610c8c575f80fd5b919050565b5f60208284031215610ca1575f80fd5b610c6682610c7e565b73ffffffffffffffffffffffffffffffffffffffff81168114610ccb575f80fd5b50565b5f60208284031215610cde575f80fd5b8135610c6681610caa565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110610d9e577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610db08284610d69565b92915050565b5f60208284031215610dc6575f80fd5b5035919050565b5f805f60608486031215610ddf575f80fd5b8335610dea81610caa565b925060208401359150610dff60408501610c7e565b90509250925092565b5f60208284031215610e18575f80fd5b8151610c6681610caa565b60408101610e318285610d69565b610c666020830184610d69565b80820180821115610db0577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610eae6060830184610d69565b9594505050505056fea164736f6c6343000819000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001e4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001049623609d00000000000000000000000042000000000000000000000000000000000000110000000000000000000000006ca5002ca794cfeebc0ec0d04ef89a382bb3942500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064b49dc741000000000000000000000000420000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa05700000000000000000000000000000000000000000000000000000000000000007a2bde9cfb7f80a4198677bdf885a43dc36c598688294f694cf64429164f140000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f8f6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610eb9806100d65f395ff3fe6080604052600436106100d1575f3560e01c806382356d8a1161007c57806385b5b14d1161005757806385b5b14d14610276578063b49dc74114610295578063d0e12f90146102b4578063d3e5792b146102e3575f80fd5b806382356d8a1461020f5780638312f1491461024d57806384411d6514610262575f80fd5b80633ccfd60b116100ac5780633ccfd60b1461016c57806354fd4d501461018e57806366d003ac146101e3575f80fd5b80630d9019e1146100dc578063307f29621461012c5780633bbed4a01461014d575f80fd5b366100d857005b5f80fd5b3480156100e7575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610137575f80fd5b5061014b610146366004610c86565b6102f7565b005b348015610158575f80fd5b5061014b610167366004610cc3565b61047a565b348015610177575f80fd5b506101806105de565b604051908152602001610123565b348015610199575f80fd5b506101d66040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b6040516101239190610cde565b3480156101ee575f80fd5b506002546101029073ffffffffffffffffffffffffffffffffffffffff1681565b34801561021a575f80fd5b506002546102409074010000000000000000000000000000000000000000900460ff1681565b6040516101239190610d97565b348015610258575f80fd5b5061018060015481565b34801561026d575f80fd5b506101805f5481565b348015610281575f80fd5b5061014b610290366004610dab565b610918565b3480156102a0575f80fd5b5061014b6102af366004610dc2565b610a3b565b3480156102bf575f80fd5b5060025474010000000000000000000000000000000000000000900460ff16610240565b3480156102ee575f80fd5b50600154610180565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610354573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103789190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103dc576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043857610438610d31565b02179055507ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8818360405161046e929190610e18565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fb9190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461055f576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161046e565b5f60015447101561069c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050805f808282546106af9190610e33565b90915550506002546040805183815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a16002546040517f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee9161077491849173ffffffffffffffffffffffffffffffffffffffff811691339174010000000000000000000000000000000000000000900460ff1690610e6b565b60405180910390a1600160025474010000000000000000000000000000000000000000900460ff1660018111156107ad576107ad610d31565b0361086a576002545f906107d79073ffffffffffffffffffffffffffffffffffffffff1683610c4f565b905080610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e74000000000000000000000000000000006064820152608401610693565b5090565b6002546040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a806024820152606060448201525f60648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084015f604051808303818588803b1580156108fe575f80fd5b505af1158015610910573d5f803e3d5ffd5b505050505090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610975573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109999190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109fd576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e4203910161046e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610a855750825b90505f8267ffffffffffffffff166001148015610aa15750303b155b905081158015610aaf575080155b15610ae6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610b475784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6002805473ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117835560018a81558993927fffffffffffffffffffffff000000000000000000000000000000000000000000169091179074010000000000000000000000000000000000000000908490811115610bdf57610bdf610d31565b02179055508315610c455784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610c5b835a84610c62565b9392505050565b5f805f805f858888f1949350505050565b803560028110610c81575f80fd5b919050565b5f60208284031215610c96575f80fd5b610c5b82610c73565b73ffffffffffffffffffffffffffffffffffffffff81168114610cc0575f80fd5b50565b5f60208284031215610cd3575f80fd5b8135610c5b81610c9f565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110610d93577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610da58284610d5e565b92915050565b5f60208284031215610dbb575f80fd5b5035919050565b5f805f60608486031215610dd4575f80fd5b8335610ddf81610c9f565b925060208401359150610df460408501610c73565b90509250925092565b5f60208284031215610e0d575f80fd5b8151610c5b81610c9f565b60408101610e268285610d5e565b610c5b6020830184610d5e565b80820180821115610da5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610ea36060830184610d5e565b9594505050505056fea164736f6c6343000819000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001e4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001049623609d00000000000000000000000042000000000000000000000000000000000000190000000000000000000000003240dd3b3ba917563f63ea129cddff7fb696070500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064b49dc741000000000000000000000000420000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa05700000000000000000000000000000000000000000000000000000000000000004ac8e160bee0acc95b22d1744fa9cc7068869945397f78a77ed68ef8ae1d87a900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f8f6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610eb9806100d65f395ff3fe6080604052600436106100d1575f3560e01c806382356d8a1161007c57806385b5b14d1161005757806385b5b14d14610276578063b49dc74114610295578063d0e12f90146102b4578063d3e5792b146102e3575f80fd5b806382356d8a1461020f5780638312f1491461024d57806384411d6514610262575f80fd5b80633ccfd60b116100ac5780633ccfd60b1461016c57806354fd4d501461018e57806366d003ac146101e3575f80fd5b80630d9019e1146100dc578063307f29621461012c5780633bbed4a01461014d575f80fd5b366100d857005b5f80fd5b3480156100e7575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610137575f80fd5b5061014b610146366004610c86565b6102f7565b005b348015610158575f80fd5b5061014b610167366004610cc3565b61047a565b348015610177575f80fd5b506101806105de565b604051908152602001610123565b348015610199575f80fd5b506101d66040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b6040516101239190610cde565b3480156101ee575f80fd5b506002546101029073ffffffffffffffffffffffffffffffffffffffff1681565b34801561021a575f80fd5b506002546102409074010000000000000000000000000000000000000000900460ff1681565b6040516101239190610d97565b348015610258575f80fd5b5061018060015481565b34801561026d575f80fd5b506101805f5481565b348015610281575f80fd5b5061014b610290366004610dab565b610918565b3480156102a0575f80fd5b5061014b6102af366004610dc2565b610a3b565b3480156102bf575f80fd5b5060025474010000000000000000000000000000000000000000900460ff16610240565b3480156102ee575f80fd5b50600154610180565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610354573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103789190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103dc576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043857610438610d31565b02179055507ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8818360405161046e929190610e18565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fb9190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461055f576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161046e565b5f60015447101561069c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050805f808282546106af9190610e33565b90915550506002546040805183815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a16002546040517f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee9161077491849173ffffffffffffffffffffffffffffffffffffffff811691339174010000000000000000000000000000000000000000900460ff1690610e6b565b60405180910390a1600160025474010000000000000000000000000000000000000000900460ff1660018111156107ad576107ad610d31565b0361086a576002545f906107d79073ffffffffffffffffffffffffffffffffffffffff1683610c4f565b905080610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e74000000000000000000000000000000006064820152608401610693565b5090565b6002546040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a806024820152606060448201525f60648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084015f604051808303818588803b1580156108fe575f80fd5b505af1158015610910573d5f803e3d5ffd5b505050505090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610975573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109999190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109fd576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e4203910161046e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610a855750825b90505f8267ffffffffffffffff166001148015610aa15750303b155b905081158015610aaf575080155b15610ae6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610b475784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6002805473ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117835560018a81558993927fffffffffffffffffffffff000000000000000000000000000000000000000000169091179074010000000000000000000000000000000000000000908490811115610bdf57610bdf610d31565b02179055508315610c455784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610c5b835a84610c62565b9392505050565b5f805f805f858888f1949350505050565b803560028110610c81575f80fd5b919050565b5f60208284031215610c96575f80fd5b610c5b82610c73565b73ffffffffffffffffffffffffffffffffffffffff81168114610cc0575f80fd5b50565b5f60208284031215610cd3575f80fd5b8135610c5b81610c9f565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110610d93577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610da58284610d5e565b92915050565b5f60208284031215610dbb575f80fd5b5035919050565b5f805f60608486031215610dd4575f80fd5b8335610ddf81610c9f565b925060208401359150610df460408501610c73565b90509250925092565b5f60208284031215610e0d575f80fd5b8151610c5b81610c9f565b60408101610e268285610d5e565b610c5b6020830184610d5e565b80820180821115610da5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610ea36060830184610d5e565b9594505050505056fea164736f6c6343000819000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001e4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001049623609d000000000000000000000000420000000000000000000000000000000000001a0000000000000000000000006b692240ef7a6b18aaf63a56a94d423c1b5cec0a00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064b49dc741000000000000000000000000420000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; MultisigTask multisigTask = new RevenueShareV100UpgradePath(); address rootSafe = address(0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A); // L1PAO address securityCouncilChildMultisig = address(0xc2819DC788505Aac350142A7A707BF9D03E3Bd03); @@ -886,10 +886,10 @@ contract RegressionTest is Test { string[] memory expectedDataToSign = new string[](2); // Foundation expectedDataToSign[0] = - "0x1901a4a9c312badf3fcaa05eafe5dc9bee8bd9316c78ee8b0bebe3115bb21b7326720313ee9ae43e92fc9227c785e277f13afcaff8a8817806bacef82d6fa81a603a"; + "0x1901a4a9c312badf3fcaa05eafe5dc9bee8bd9316c78ee8b0bebe3115bb21b732672c44bb44f324d271b9734a58c7a830677045c1de195cb8f48299584539b8bbdbd"; // Security Council expectedDataToSign[1] = - "0x1901df53d510b56e539b90b369ef08fce3631020fbf921e3136ea5f8747c20bce9676a65974950a2d2363dd3764f52e7a51528b9159c9bcb10cd57ec23480e3f9ec8"; + "0x1901df53d510b56e539b90b369ef08fce3631020fbf921e3136ea5f8747c20bce967c5c905636dd8d633390ce8159bb909cb8831f92949870769a8f0f0971cc03097"; _assertDataToSignNestedMultisig(multisigTask, actions, expectedDataToSign, MULTICALL3_ADDRESS, rootSafe); } @@ -899,7 +899,7 @@ contract RegressionTest is Test { function testRegressionCallDataMatches_DeployFeesDepositor() public { string memory taskConfigFilePath = "test/tasks/example/eth/016-deploy-fees-depositor/config.toml"; string memory expectedCallData = - "0x174dea7100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000010400000000000000000000000000000000000000000000000000000000000001e8000000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000f2466cfa0570000000000000000000000000000000000000000000000000000000000000000666565732d6465706f7369746f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000e9660a060405234801561001057600080fd5b50600160805261001e610023565b6100e3565b600054610100900460ff161561008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156100e1576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051610d9161010560003960008181610274015261048e0152610d916000f3fe6080604052600436106100cb5760003560e01c8063645006ca11610074578063a2a956171161004e578063a2a9561714610425578063dad544e014610445578063f68016b71461045a57600080fd5b8063645006ca1461038657806366125607146103c85780637b11936e146103e857600080fd5b80633e47158c116100a55780633e47158c146102fb57806352d84c621461031057806354fd4d501461033057600080fd5b80630de2db4d1461024057806338d38c97146102605780633cb747bf146102a357600080fd5b3661023b576040805134815247602082018190529133917f363f315f930a17d1266b86a20d6dd34b1cfbc5a9db9f13a65d06a689c3a2af8a910160405180910390a26001546bffffffffffffffffffffffff16811061023957600154600080546002546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff6c0100000000000000000000000090950485166004820181905260606024830152606482019490945263ffffffff90911660448201529192620100009091041690633dbb202b9084906084016000604051808303818588803b1580156101ce57600080fd5b505af11580156101e2573d6000803e3d6000fd5b50505050508073ffffffffffffffffffffffffffffffffffffffff167f2acaf92365a0b69fb3570802396f62d51aabccd684036b72c3ce78699425e7ee8360405161022f91815260200190565b60405180910390a2505b005b600080fd5b34801561024c57600080fd5b5061023961025b366004610bde565b61048c565b34801561026c57600080fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020015b60405180910390f35b3480156102af57600080fd5b506000546102d69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161029a565b34801561030757600080fd5b506102d661069e565b34801561031c57600080fd5b5061023961032b366004610c36565b6108a9565b34801561033c57600080fd5b506103796040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161029a9190610c58565b34801561039257600080fd5b506001546103ab906bffffffffffffffffffffffff1681565b6040516bffffffffffffffffffffffff909116815260200161029a565b3480156103d457600080fd5b506102396103e3366004610ccb565b610928565b3480156103f457600080fd5b506001546102d6906c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561043157600080fd5b50610239610440366004610ce8565b6109af565b34801561045157600080fd5b506102d6610a2e565b34801561046657600080fd5b506002546104779063ffffffff1681565b60405163ffffffff909116815260200161029a565b7f0000000000000000000000000000000000000000000000000000000000000000600054610100900460ff161580156104cc575060005460ff8083169116105b61055c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055610595610aab565b6000805473ffffffffffffffffffffffffffffffffffffffff8681166c01000000000000000000000000026bffffffffffffffffffffffff8916176001556002805463ffffffff87167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000009091161790557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9086166201000002167fffffffffffffffffffff000000000000000000000000000000000000000000ff9091161790556040517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989061068f90839060ff91909116815260200190565b60405180910390a15050505050565b6000806106c97fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff8116156106ec57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000081525051600261072f9190610d03565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000919091179061078a906060015b604051602081830303815290604052805190602001205490565b146107c1576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513060208201526001918101919091526000906107e390606001610770565b905073ffffffffffffffffffffffffffffffffffffffff811615610877578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108709190610d67565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108b1610b2e565b6002805463ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000083168117909355604080519190921680825260208201939093527f84858bb3fb3ecf87e268ebef250ef9ad9cd53ef7973ef7a0ec9d89470bb00a8091015b60405180910390a15050565b610930610b2e565b6001805473ffffffffffffffffffffffffffffffffffffffff8381166c010000000000000000000000008181026bffffffffffffffffffffffff85161790945560408051949093049091168084526020840191909152917f158f04d12e0403fdd63fbced694e8f70d3b87d04d8e2dfad526f5fcf6e49bbcf910161091c565b6109b7610b2e565b600180546bffffffffffffffffffffffff8381167fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083168117909355604080519190921680825260208201939093527f132832be4270c0d1573ca543c41517dd443fe9daf5f21a9c74940e6db282e229910161091c565b6000610a3861069e565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa69190610d67565b905090565b33610ab461069e565b73ffffffffffffffffffffffffffffffffffffffff1614158015610af5575033610adc610a2e565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610b2c576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b33610b37610a2e565b73ffffffffffffffffffffffffffffffffffffffff1614610b2c576040517f7f12c64b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356bffffffffffffffffffffffff81168114610ba057600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610bc757600080fd5b50565b803563ffffffff81168114610ba057600080fd5b60008060008060808587031215610bf457600080fd5b610bfd85610b84565b93506020850135610c0d81610ba5565b92506040850135610c1d81610ba5565b9150610c2b60608601610bca565b905092959194509250565b600060208284031215610c4857600080fd5b610c5182610bca565b9392505050565b600060208083528351808285015260005b81811015610c8557858101830151858201604001528201610c69565b81811115610c97576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600060208284031215610cdd57600080fd5b8135610c5181610ba5565b600060208284031215610cfa57600080fd5b610c5182610b84565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610d62577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500290565b600060208284031215610d7957600080fd5b8151610c5181610ba556fea164736f6c634300080f000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000d8466cfa0570000000000000000000000000000000000000000000000000000000000000000666565732d6465706f7369746f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000ce760806040523480156200001157600080fd5b5060405162000cc738038062000cc783398181016040528101906200003791906200016f565b62000048816200004f60201b60201c565b50620001df565b600062000061620000ce60201b60201c565b905060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b90508281557f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f8284604051620000c1929190620001b2565b60405180910390a1505050565b60008060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b905080549150819250505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000137826200010a565b9050919050565b62000149816200012a565b81146200015557600080fd5b50565b60008151905062000169816200013e565b92915050565b60006020828403121562000188576200018762000105565b5b6000620001988482850162000158565b91505092915050565b620001ac816200012a565b82525050565b6000604082019050620001c96000830185620001a1565b620001d86020830184620001a1565b9392505050565b610ad880620001ef6000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100675780634f1ef286146100905780635c60da1b146100c05780638f283970146100eb578063f851a440146101145761005d565b3661005d5761005b61013f565b005b61006561013f565b005b34801561007357600080fd5b5061008e60048036038101906100899190610715565b6101dc565b005b6100aa60048036038101906100a591906107a7565b610268565b6040516100b791906108a0565b60405180910390f35b3480156100cc57600080fd5b506100d56103ae565b6040516100e291906108d1565b60405180910390f35b3480156100f757600080fd5b50610112600480360381019061010d9190610715565b61043d565b005b34801561012057600080fd5b506101296104c9565b60405161013691906108d1565b60405180910390f35b6000610149610558565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101b19061096f565b60405180910390fd5b3660008037600080366000845af43d6000803e806101d7573d6000fd5b3d6000f35b6101e461058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102495750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561025c57610257816105c6565b610265565b61026461013f565b5b50565b606061027261058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102d75750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561039e576102e5846105c6565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161030f9291906109ce565b600060405180830381855af49150503d806000811461034a576040519150601f19603f3d011682016040523d82523d6000602084013e61034f565b606091505b509150915081610394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038b90610a59565b60405180910390fd5b80925050506103a7565b6103a661013f565b5b9392505050565b60006103b861058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061041d5750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156104315761042a610558565b905061043a565b61043961013f565b5b90565b61044561058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104aa5750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156104bd576104b881610638565b6104c6565b6104c561013f565b5b50565b60006104d361058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806105385750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561054c5761054561058f565b9050610555565b61055461013f565b5b90565b60008060007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150819250505090565b60008060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b905080549150819250505090565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181558173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25050565b600061064261058f565b905060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b90508281557f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f82846040516106a0929190610a79565b60405180910390a1505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106e2826106b7565b9050919050565b6106f2816106d7565b81146106fd57600080fd5b50565b60008135905061070f816106e9565b92915050565b60006020828403121561072b5761072a6106ad565b5b600061073984828501610700565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261076757610766610742565b5b8235905067ffffffffffffffff81111561078457610783610747565b5b6020830191508360018202830111156107a05761079f61074c565b5b9250929050565b6000806000604084860312156107c0576107bf6106ad565b5b60006107ce86828701610700565b935050602084013567ffffffffffffffff8111156107ef576107ee6106b2565b5b6107fb86828701610751565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b83811015610841578082015181840152602081019050610826565b83811115610850576000848401525b50505050565b6000601f19601f8301169050919050565b600061087282610807565b61087c8185610812565b935061088c818560208601610823565b61089581610856565b840191505092915050565b600060208201905081810360008301526108ba8184610867565b905092915050565b6108cb816106d7565b82525050565b60006020820190506108e660008301846108c2565b92915050565b600082825260208201905092915050565b7f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160008201527f6c697a6564000000000000000000000000000000000000000000000000000000602082015250565b60006109596025836108ec565b9150610964826108fd565b604082019050919050565b600060208201905081810360008301526109888161094c565b9050919050565b600081905092915050565b82818337600083830152505050565b60006109b5838561098f565b93506109c283858461099a565b82840190509392505050565b60006109db8284866109a9565b91508190509392505050565b7f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560008201527f6d656e746174696f6e20636f6e7472616374206661696c656400000000000000602082015250565b6000610a436039836108ec565b9150610a4e826109e7565b604082019050919050565b60006020820190508181036000830152610a7281610a36565b9050919050565b6000604082019050610a8e60008301856108c2565b610a9b60208301846108c2565b939250505056fea2646970667358221220e170e6bf8ee3cc199be5ea3ca30084b98725d89b560e407f600f4a174236633364736f6c634300080f00330000000000000000000000005a0aae59d09fccbddb6c6cceb07b7279367c3d2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa7da4552791535ae416525d695a85743f40624300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001044f1ef28600000000000000000000000090a79d28ad7f6d472ad1cfe3bad65204ab2969a2000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000840de2db4d0000000000000000000000000000000000000000000000004563918244f400000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000493e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + "0x174dea7100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000010400000000000000000000000000000000000000000000000000000000000001e8000000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000f2466cfa0570000000000000000000000000000000000000000000000000000000000000000666565732d6465706f7369746f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000e9660a060405234801561001057600080fd5b50600160805261001e610023565b6100e3565b600054610100900460ff161561008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156100e1576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051610d9161010560003960008181610274015261048e0152610d916000f3fe6080604052600436106100cb5760003560e01c8063645006ca11610074578063a2a956171161004e578063a2a9561714610425578063dad544e014610445578063f68016b71461045a57600080fd5b8063645006ca1461038657806366125607146103c85780637b11936e146103e857600080fd5b80633e47158c116100a55780633e47158c146102fb57806352d84c621461031057806354fd4d501461033057600080fd5b80630de2db4d1461024057806338d38c97146102605780633cb747bf146102a357600080fd5b3661023b576040805134815247602082018190529133917f363f315f930a17d1266b86a20d6dd34b1cfbc5a9db9f13a65d06a689c3a2af8a910160405180910390a26001546bffffffffffffffffffffffff16811061023957600154600080546002546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff6c0100000000000000000000000090950485166004820181905260606024830152606482019490945263ffffffff90911660448201529192620100009091041690633dbb202b9084906084016000604051808303818588803b1580156101ce57600080fd5b505af11580156101e2573d6000803e3d6000fd5b50505050508073ffffffffffffffffffffffffffffffffffffffff167f2acaf92365a0b69fb3570802396f62d51aabccd684036b72c3ce78699425e7ee8360405161022f91815260200190565b60405180910390a2505b005b600080fd5b34801561024c57600080fd5b5061023961025b366004610bde565b61048c565b34801561026c57600080fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020015b60405180910390f35b3480156102af57600080fd5b506000546102d69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161029a565b34801561030757600080fd5b506102d661069e565b34801561031c57600080fd5b5061023961032b366004610c36565b6108a9565b34801561033c57600080fd5b506103796040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161029a9190610c58565b34801561039257600080fd5b506001546103ab906bffffffffffffffffffffffff1681565b6040516bffffffffffffffffffffffff909116815260200161029a565b3480156103d457600080fd5b506102396103e3366004610ccb565b610928565b3480156103f457600080fd5b506001546102d6906c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561043157600080fd5b50610239610440366004610ce8565b6109af565b34801561045157600080fd5b506102d6610a2e565b34801561046657600080fd5b506002546104779063ffffffff1681565b60405163ffffffff909116815260200161029a565b7f0000000000000000000000000000000000000000000000000000000000000000600054610100900460ff161580156104cc575060005460ff8083169116105b61055c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055610595610aab565b6000805473ffffffffffffffffffffffffffffffffffffffff8681166c01000000000000000000000000026bffffffffffffffffffffffff8916176001556002805463ffffffff87167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000009091161790557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9086166201000002167fffffffffffffffffffff000000000000000000000000000000000000000000ff9091161790556040517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989061068f90839060ff91909116815260200190565b60405180910390a15050505050565b6000806106c97fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff8116156106ec57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000081525051600261072f9190610d03565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000919091179061078a906060015b604051602081830303815290604052805190602001205490565b146107c1576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513060208201526001918101919091526000906107e390606001610770565b905073ffffffffffffffffffffffffffffffffffffffff811615610877578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108709190610d67565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108b1610b2e565b6002805463ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000083168117909355604080519190921680825260208201939093527f84858bb3fb3ecf87e268ebef250ef9ad9cd53ef7973ef7a0ec9d89470bb00a8091015b60405180910390a15050565b610930610b2e565b6001805473ffffffffffffffffffffffffffffffffffffffff8381166c010000000000000000000000008181026bffffffffffffffffffffffff85161790945560408051949093049091168084526020840191909152917f158f04d12e0403fdd63fbced694e8f70d3b87d04d8e2dfad526f5fcf6e49bbcf910161091c565b6109b7610b2e565b600180546bffffffffffffffffffffffff8381167fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083168117909355604080519190921680825260208201939093527f132832be4270c0d1573ca543c41517dd443fe9daf5f21a9c74940e6db282e229910161091c565b6000610a3861069e565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa69190610d67565b905090565b33610ab461069e565b73ffffffffffffffffffffffffffffffffffffffff1614158015610af5575033610adc610a2e565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610b2c576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b33610b37610a2e565b73ffffffffffffffffffffffffffffffffffffffff1614610b2c576040517f7f12c64b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356bffffffffffffffffffffffff81168114610ba057600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610bc757600080fd5b50565b803563ffffffff81168114610ba057600080fd5b60008060008060808587031215610bf457600080fd5b610bfd85610b84565b93506020850135610c0d81610ba5565b92506040850135610c1d81610ba5565b9150610c2b60608601610bca565b905092959194509250565b600060208284031215610c4857600080fd5b610c5182610bca565b9392505050565b600060208083528351808285015260005b81811015610c8557858101830151858201604001528201610c69565b81811115610c97576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600060208284031215610cdd57600080fd5b8135610c5181610ba5565b600060208284031215610cfa57600080fd5b610c5182610b84565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610d62577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500290565b600060208284031215610d7957600080fd5b8151610c5181610ba556fea164736f6c634300080f000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000d8466cfa0570000000000000000000000000000000000000000000000000000000000000000666565732d6465706f7369746f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000ce760806040523480156200001157600080fd5b5060405162000cc738038062000cc783398181016040528101906200003791906200016f565b62000048816200004f60201b60201c565b50620001df565b600062000061620000ce60201b60201c565b905060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b90508281557f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f8284604051620000c1929190620001b2565b60405180910390a1505050565b60008060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b905080549150819250505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000137826200010a565b9050919050565b62000149816200012a565b81146200015557600080fd5b50565b60008151905062000169816200013e565b92915050565b60006020828403121562000188576200018762000105565b5b6000620001988482850162000158565b91505092915050565b620001ac816200012a565b82525050565b6000604082019050620001c96000830185620001a1565b620001d86020830184620001a1565b9392505050565b610ad880620001ef6000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100675780634f1ef286146100905780635c60da1b146100c05780638f283970146100eb578063f851a440146101145761005d565b3661005d5761005b61013f565b005b61006561013f565b005b34801561007357600080fd5b5061008e60048036038101906100899190610715565b6101dc565b005b6100aa60048036038101906100a591906107a7565b610268565b6040516100b791906108a0565b60405180910390f35b3480156100cc57600080fd5b506100d56103ae565b6040516100e291906108d1565b60405180910390f35b3480156100f757600080fd5b50610112600480360381019061010d9190610715565b61043d565b005b34801561012057600080fd5b506101296104c9565b60405161013691906108d1565b60405180910390f35b6000610149610558565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101b19061096f565b60405180910390fd5b3660008037600080366000845af43d6000803e806101d7573d6000fd5b3d6000f35b6101e461058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102495750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561025c57610257816105c6565b610265565b61026461013f565b5b50565b606061027261058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102d75750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561039e576102e5846105c6565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161030f9291906109ce565b600060405180830381855af49150503d806000811461034a576040519150601f19603f3d011682016040523d82523d6000602084013e61034f565b606091505b509150915081610394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038b90610a59565b60405180910390fd5b80925050506103a7565b6103a661013f565b5b9392505050565b60006103b861058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061041d5750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156104315761042a610558565b905061043a565b61043961013f565b5b90565b61044561058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104aa5750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156104bd576104b881610638565b6104c6565b6104c561013f565b5b50565b60006104d361058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806105385750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561054c5761054561058f565b9050610555565b61055461013f565b5b90565b60008060007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150819250505090565b60008060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b905080549150819250505090565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181558173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25050565b600061064261058f565b905060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b90508281557f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f82846040516106a0929190610a79565b60405180910390a1505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106e2826106b7565b9050919050565b6106f2816106d7565b81146106fd57600080fd5b50565b60008135905061070f816106e9565b92915050565b60006020828403121561072b5761072a6106ad565b5b600061073984828501610700565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261076757610766610742565b5b8235905067ffffffffffffffff81111561078457610783610747565b5b6020830191508360018202830111156107a05761079f61074c565b5b9250929050565b6000806000604084860312156107c0576107bf6106ad565b5b60006107ce86828701610700565b935050602084013567ffffffffffffffff8111156107ef576107ee6106b2565b5b6107fb86828701610751565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b83811015610841578082015181840152602081019050610826565b83811115610850576000848401525b50505050565b6000601f19601f8301169050919050565b600061087282610807565b61087c8185610812565b935061088c818560208601610823565b61089581610856565b840191505092915050565b600060208201905081810360008301526108ba8184610867565b905092915050565b6108cb816106d7565b82525050565b60006020820190506108e660008301846108c2565b92915050565b600082825260208201905092915050565b7f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160008201527f6c697a6564000000000000000000000000000000000000000000000000000000602082015250565b60006109596025836108ec565b9150610964826108fd565b604082019050919050565b600060208201905081810360008301526109888161094c565b9050919050565b600081905092915050565b82818337600083830152505050565b60006109b5838561098f565b93506109c283858461099a565b82840190509392505050565b60006109db8284866109a9565b91508190509392505050565b7f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560008201527f6d656e746174696f6e20636f6e7472616374206661696c656400000000000000602082015250565b6000610a436039836108ec565b9150610a4e826109e7565b604082019050919050565b60006020820190508181036000830152610a7281610a36565b9050919050565b6000604082019050610a8e60008301856108c2565b610a9b60208301846108c2565b939250505056fea2646970667358221220154d9317746aa0e4cac83ccac5a296d517da380b7a9bb2889947cfba8d5a8bc164736f6c634300080f00330000000000000000000000005a0aae59d09fccbddb6c6cceb07b7279367c3d2a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032ecd94bbfb350f8aafb70dfba1f4d7fcbc5065b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001044f1ef28600000000000000000000000090a79d28ad7f6d472ad1cfe3bad65204ab2969a2000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000840de2db4d0000000000000000000000000000000000000000000000004563918244f400000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000493e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; MultisigTask multisigTask = new DeployFeesDepositor(); address rootSafe = address(0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A); // L1PAO address securityCouncilChildMultisig = address(0xc2819DC788505Aac350142A7A707BF9D03E3Bd03); @@ -912,10 +912,10 @@ contract RegressionTest is Test { string[] memory expectedDataToSign = new string[](2); // Foundation expectedDataToSign[0] = - "0x1901a4a9c312badf3fcaa05eafe5dc9bee8bd9316c78ee8b0bebe3115bb21b7326728b096f6bceaab1716dfe8e85bae705192df4b5dae6e3b94d58bdf567edb6bfef"; + "0x1901a4a9c312badf3fcaa05eafe5dc9bee8bd9316c78ee8b0bebe3115bb21b732672145a6a0f915fed1b5793937cb6d6cba1ec86fd6563b0315d14f55a409de52ab9"; // Security Council expectedDataToSign[1] = - "0x1901df53d510b56e539b90b369ef08fce3631020fbf921e3136ea5f8747c20bce967e5d2666095a6ced42244873f800e6714389265e35cf0e8e9e5236e720601e2b6"; + "0x1901df53d510b56e539b90b369ef08fce3631020fbf921e3136ea5f8747c20bce9673ef6274f3fe58ee20ab2931fc049b8a5af8bd6319918f91e2c9951e8630f9247"; _assertDataToSignNestedMultisig(multisigTask, actions, expectedDataToSign, MULTICALL3_ADDRESS, rootSafe); } @@ -925,8 +925,7 @@ contract RegressionTest is Test { function testRegressionCallDataMatches_RevenueShareV100UpgradePathOptOut() public { string memory taskConfigFilePath = "test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml"; string memory expectedCallData = - - "0x174dea710000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000174000000000000000000000000000000000000000000000000000000000000019a00000000000000000000000000000000000000000000000000000000000002b600000000000000000000000000000000000000000000000000000000000002d400000000000000000000000000000000000000000000000000000000000003f40000000000000000000000000000000000000000000000000000000000000412000000000000000000000000000000000000000000000000000000000000052e000000000000000000000000000000000000000000000000000000000000054c00000000000000000000000000000000000000000000000000000000000006680000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001544e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012d838000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000146466cfa0570000000000000000000000000000000000000000000000000000000000000000d7c04619bfc311a92d20723f9d08baaba18c3c8c7dcd85736bf66b85f59c37f6000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000013d26080604052348015600e575f80fd5b5060156019565b60d4565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101560d2575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6112f1806100e15f395ff3fe608060405260043610610096575f3560e01c80637dfbd04911610066578063b87ea8d41161004c578063b87ea8d414610313578063c4d66de814610327578063d61a398b14610346575f80fd5b80637dfbd049146102dd5780637fc81bb7146102f4575f80fd5b80630a7617b3146101dd5780630c0544a3146101fe578063394d27311461026057806354fd4d5014610288575f80fd5b366101d9577fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455c6100f3576040517f17617f6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b337342000000000000000000000000000000000000111480159061012b57503373420000000000000000000000000000000000001914155b801561014b57503373420000000000000000000000000000000000001a14155b801561016b57503373420000000000000000000000000000000000001b14155b156101a2576040517f9dcde10900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405134815233907f2ccfc58c2cef4ee590b5f16be0548cc54afc12e1c66a67b362b7d640fd16bb2d9060200160405180910390a2005b5f80fd5b3480156101e8575f80fd5b506101fc6101f7366004610f4b565b61039c565b005b348015610209575f80fd5b5060015461023a9070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561026b575f80fd5b5060015461023a906fffffffffffffffffffffffffffffffff1681565b348015610293575f80fd5b506102d06040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516102579190610f66565b3480156102e8575f80fd5b5061023a6301e1338081565b3480156102ff575f80fd5b506101fc61030e366004610fb9565b61055e565b34801561031e575f80fd5b506101fc610706565b348015610332575f80fd5b506101fc610341366004610f4b565b610aea565b348015610351575f80fd5b505f546103779062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610257565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041d9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610481576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166104ce576040517f99c6ec0800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff85161790945560408051949093049091168084526020840191909152917f16417cc372deec0caee5f52e2ad77a5f07b4591fd56b4ff31b6e20f817d4daeb91015b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105df9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610643576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6301e133806fffffffffffffffffffffffffffffffff82161115610693576040517f30b9f35e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546fffffffffffffffffffffffffffffffff8381167001000000000000000000000000000000008181028385161790945560408051949093049091168084526020840191909152917f4492086b630ed3846eec0979dd87a71c814ceb1c6dab80ab81e3450b21e4de289101610552565b60015461073b906fffffffffffffffffffffffffffffffff700100000000000000000000000000000000820481169116611030565b6fffffffffffffffffffffffffffffffff16421015610786576040517f1e4a9f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016426fffffffffffffffffffffffffffffffff161781556107cb90610ce0565b5f6107e9734200000000000000000000000000000000000011610d06565b90505f610809734200000000000000000000000000000000000019610d06565b90505f61082973420000000000000000000000000000000000001a610d06565b90505f61084973420000000000000000000000000000000000001b610d06565b90506108545f610ce0565b5f82826108618688611060565b61086b9190611060565b6108759190611060565b9050805f036108b0576040517fc8972e5200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517f54e7f42d000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101859052606481018690526201000090910473ffffffffffffffffffffffffffffffffffffffff16906354e7f42d906084015f60405180830381865afa158015610936573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261097b9190810190611118565b905080515f036109b7576040517f763970d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b8251811015610a6e575f8382815181106109d6576109d66111e7565b60200260200101515f015190505f8483815181106109f6576109f66111e7565b6020026020010151602001519050805f03610a12575050610a66565b5f610a1d8383610f03565b905080610a56576040517fd68d1b1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a608286611060565b94505050505b6001016109ba565b50828114610aa8576040517f9c01eac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f73f9a13241a1848ec157967f3a85601709353e616f1f2605d818c0f2d21774df8284604051610ad9929190611214565b60405180910390a150505050505050565b5f54610100900460ff1615808015610b0857505f54600160ff909116105b80610b215750303b158015610b2157505f5460ff166001145b610bb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610c0d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff851602179055600180546fffffffffffffffffffffffffffffffff1672015180000000000000000000000000000000001790558015610cdc575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610552565b5050565b807fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455d50565b5f60018273ffffffffffffffffffffffffffffffffffffffff166382356d8a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d7691906112af565b6001811115610d8757610d87611282565b14610dbe576040517fb4726cbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff166366d003ac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e429190610fe8565b73ffffffffffffffffffffffffffffffffffffffff1614610e8f576040517fc3380cef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610ed9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610efd91906112cd565b92915050565b5f610f0f835a84610f16565b9392505050565b5f805f805f858888f1949350505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f48575f80fd5b50565b5f60208284031215610f5b575f80fd5b8135610f0f81610f27565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f60208284031215610fc9575f80fd5b81356fffffffffffffffffffffffffffffffff81168114610f0f575f80fd5b5f60208284031215610ff8575f80fd5b8151610f0f81610f27565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6fffffffffffffffffffffffffffffffff81811683821601908082111561105957611059611003565b5092915050565b80820180821115610efd57610efd611003565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156110c3576110c3611073565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561111057611110611073565b604052919050565b5f6020808385031215611129575f80fd5b825167ffffffffffffffff80821115611140575f80fd5b818501915085601f830112611153575f80fd5b81518181111561116557611165611073565b611173848260051b016110c9565b818152848101925060069190911b830184019087821115611192575f80fd5b928401925b818410156111dc57604084890312156111ae575f80fd5b6111b66110a0565b84516111c181610f27565b81528486015186820152835260409093019291840191611197565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604080825283518282018190525f91906020906060850190828801855b8281101561126c578151805173ffffffffffffffffffffffffffffffffffffffff168552850151858501529285019290840190600101611231565b5050508093505050508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f602082840312156112bf575f80fd5b815160028110610f0f575f80fd5b5f602082840312156112dd575f80fd5b505191905056fea164736f6c6343000819000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c49623609d000000000000000000000000420000000000000000000000000000000000002b0000000000000000000000006b0d0b5d65c13ed9ec80617772aee4d6c594a66e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa0570000000000000000000000000000000000000000000000000000000000000000783aa8b3e401c8404e3eff9401ba29702719ddc0c0f69ec9ac77188bacea107300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9c60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a00000000000000000000000066666666666666666666666666666666666666660000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000124e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004499a88ec4000000000000000000000000420000000000000000000000000000000000001b0000000000000000000000001e2d5b3362d3b6726dd715284dc83faf7e6c27ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001144e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000106466cfa0570000000000000000000000000000000000000000000000000000000000000000204cb368f75f2d6cade61b62cb318bffd2bd31a57a3f86dff75f5bfd9d2dd14900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000fcb60e060405234801561001057600080fd5b50604051610f6b380380610f6b83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e466101256000396000818161028f0152610a0101526000818160f401526109910152600081816102c30152610a550152610e466000f3fe6080604052600436106100d65760003560e01c806382356d8a1161007f57806385b5b14d1161005957806385b5b14d1461025d578063d0e12f901461027d578063d3e5792b146102b1578063d4ff9218146102e557600080fd5b806382356d8a146102105780638312f1491461023257806384411d651461024757600080fd5b80633ccfd60b116100b05780633ccfd60b1461018257806354fd4d50146101a557806366d003ac146101fb57600080fd5b80630d9019e1146100e2578063307f2962146101405780633bbed4a01461016257600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506101167f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014c57600080fd5b5061016061015b366004610c14565b6102fa565b005b34801561016e57600080fd5b5061016061017d366004610c5a565b6104c2565b34801561018e57600080fd5b50610197610642565b604051908152602001610137565b3480156101b157600080fd5b506101ee6040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b6040516101379190610c77565b34801561020757600080fd5b5061011661094a565b34801561021c57600080fd5b506102256109b3565b6040516101379190610d54565b34801561023e57600080fd5b50610197610a23565b34801561025357600080fd5b5061019760005481565b34801561026957600080fd5b50610160610278366004610d68565b610a77565b34801561028957600080fd5b506102257f000000000000000000000000000000000000000000000000000000000000000081565b3480156102bd57600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f157600080fd5b50610116610bdd565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610359573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037d9190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103e1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043d5761043d610cea565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104b69083908590610d9e565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610521573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105459190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105a9576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e459391016104b6565b600061064c610a23565b471015610706576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b4790508060008082825461071a9190610db9565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161074a61094a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee816107a861094a565b336107b16109b3565b6040516107c19493929190610df8565b60405180910390a160016107d36109b3565b60018111156107e4576107e4610cea565b0361088f5760006107fc6107f661094a565b83610bec565b90508061088b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106fd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac826108b261094a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561092e57600080fd5b505af1158015610942573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561098e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109fe575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a52575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ad6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afa9190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b5e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e420391016104b6565b6000610be761094a565b905090565b6000610bf9835a84610c00565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610c2657600080fd5b813560028110610bf957600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c5757600080fd5b50565b600060208284031215610c6c57600080fd5b8135610bf981610c35565b600060208083528351808285015260005b81811015610ca457858101830151858201604001528201610c88565b81811115610cb6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d50577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d628284610d19565b92915050565b600060208284031215610d7a57600080fd5b5035919050565b600060208284031215610d9357600080fd5b8151610bf981610c35565b60408101610dac8285610d19565b610bf96020830184610d19565b60008219821115610df3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e306060830184610d19565b9594505050505056fea164736f6c634300080f000a00000000000000000000000055555555555555555555555555555555555555550000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000124e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004499a88ec400000000000000000000000042000000000000000000000000000000000000110000000000000000000000002ca727314d2c6c683998ce385c2853923719aea10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa05700000000000000000000000000000000000000000000000000000000000000007a2bde9cfb7f80a4198677bdf885a43dc36c598688294f694cf64429164f140000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9c60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a00000000000000000000000033333333333333333333333333333333333333330000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000124e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004499a88ec4000000000000000000000000420000000000000000000000000000000000001900000000000000000000000063e87ea1598d7b59b88685b56be6e5d7b2e11ed90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa05700000000000000000000000000000000000000000000000000000000000000004ac8e160bee0acc95b22d1744fa9cc7068869945397f78a77ed68ef8ae1d87a900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9c60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a00000000000000000000000044444444444444444444444444444444444444440000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000124e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004499a88ec4000000000000000000000000420000000000000000000000000000000000001a000000000000000000000000ad552e53be11c5fc03a95d8be3bb72ab675e0ddb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + "0x174dea710000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000174000000000000000000000000000000000000000000000000000000000000019a00000000000000000000000000000000000000000000000000000000000002b600000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000003fc00000000000000000000000000000000000000000000000000000000000004260000000000000000000000000000000000000000000000000000000000000542000000000000000000000000000000000000000000000000000000000000056c00000000000000000000000000000000000000000000000000000000000006880000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001544e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012d838000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000146466cfa0570000000000000000000000000000000000000000000000000000000000000000d7c04619bfc311a92d20723f9d08baaba18c3c8c7dcd85736bf66b85f59c37f6000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000013d26080604052348015600e575f80fd5b5060156019565b60d4565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101560d2575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6112f1806100e15f395ff3fe608060405260043610610096575f3560e01c80637dfbd04911610066578063b87ea8d41161004c578063b87ea8d414610313578063c4d66de814610327578063d61a398b14610346575f80fd5b80637dfbd049146102dd5780637fc81bb7146102f4575f80fd5b80630a7617b3146101dd5780630c0544a3146101fe578063394d27311461026057806354fd4d5014610288575f80fd5b366101d9577fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455c6100f3576040517f17617f6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b337342000000000000000000000000000000000000111480159061012b57503373420000000000000000000000000000000000001914155b801561014b57503373420000000000000000000000000000000000001a14155b801561016b57503373420000000000000000000000000000000000001b14155b156101a2576040517f9dcde10900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405134815233907f2ccfc58c2cef4ee590b5f16be0548cc54afc12e1c66a67b362b7d640fd16bb2d9060200160405180910390a2005b5f80fd5b3480156101e8575f80fd5b506101fc6101f7366004610f4b565b61039c565b005b348015610209575f80fd5b5060015461023a9070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561026b575f80fd5b5060015461023a906fffffffffffffffffffffffffffffffff1681565b348015610293575f80fd5b506102d06040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516102579190610f66565b3480156102e8575f80fd5b5061023a6301e1338081565b3480156102ff575f80fd5b506101fc61030e366004610fb9565b61055e565b34801561031e575f80fd5b506101fc610706565b348015610332575f80fd5b506101fc610341366004610f4b565b610aea565b348015610351575f80fd5b505f546103779062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610257565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041d9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610481576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166104ce576040517f99c6ec0800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff85161790945560408051949093049091168084526020840191909152917f16417cc372deec0caee5f52e2ad77a5f07b4591fd56b4ff31b6e20f817d4daeb91015b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105df9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610643576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6301e133806fffffffffffffffffffffffffffffffff82161115610693576040517f30b9f35e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546fffffffffffffffffffffffffffffffff8381167001000000000000000000000000000000008181028385161790945560408051949093049091168084526020840191909152917f4492086b630ed3846eec0979dd87a71c814ceb1c6dab80ab81e3450b21e4de289101610552565b60015461073b906fffffffffffffffffffffffffffffffff700100000000000000000000000000000000820481169116611030565b6fffffffffffffffffffffffffffffffff16421015610786576040517f1e4a9f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016426fffffffffffffffffffffffffffffffff161781556107cb90610ce0565b5f6107e9734200000000000000000000000000000000000011610d06565b90505f610809734200000000000000000000000000000000000019610d06565b90505f61082973420000000000000000000000000000000000001a610d06565b90505f61084973420000000000000000000000000000000000001b610d06565b90506108545f610ce0565b5f82826108618688611060565b61086b9190611060565b6108759190611060565b9050805f036108b0576040517fc8972e5200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517f54e7f42d000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101859052606481018690526201000090910473ffffffffffffffffffffffffffffffffffffffff16906354e7f42d906084015f60405180830381865afa158015610936573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261097b9190810190611118565b905080515f036109b7576040517f763970d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b8251811015610a6e575f8382815181106109d6576109d66111e7565b60200260200101515f015190505f8483815181106109f6576109f66111e7565b6020026020010151602001519050805f03610a12575050610a66565b5f610a1d8383610f03565b905080610a56576040517fd68d1b1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a608286611060565b94505050505b6001016109ba565b50828114610aa8576040517f9c01eac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f73f9a13241a1848ec157967f3a85601709353e616f1f2605d818c0f2d21774df8284604051610ad9929190611214565b60405180910390a150505050505050565b5f54610100900460ff1615808015610b0857505f54600160ff909116105b80610b215750303b158015610b2157505f5460ff166001145b610bb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610c0d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff851602179055600180546fffffffffffffffffffffffffffffffff1672015180000000000000000000000000000000001790558015610cdc575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610552565b5050565b807fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455d50565b5f60018273ffffffffffffffffffffffffffffffffffffffff166382356d8a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d7691906112af565b6001811115610d8757610d87611282565b14610dbe576040517fb4726cbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff166366d003ac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e429190610fe8565b73ffffffffffffffffffffffffffffffffffffffff1614610e8f576040517fc3380cef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610ed9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610efd91906112cd565b92915050565b5f610f0f835a84610f16565b9392505050565b5f805f805f858888f1949350505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f48575f80fd5b50565b5f60208284031215610f5b575f80fd5b8135610f0f81610f27565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f60208284031215610fc9575f80fd5b81356fffffffffffffffffffffffffffffffff81168114610f0f575f80fd5b5f60208284031215610ff8575f80fd5b8151610f0f81610f27565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6fffffffffffffffffffffffffffffffff81811683821601908082111561105957611059611003565b5092915050565b80820180821115610efd57610efd611003565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156110c3576110c3611073565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561111057611110611073565b604052919050565b5f6020808385031215611129575f80fd5b825167ffffffffffffffff80821115611140575f80fd5b818501915085601f830112611153575f80fd5b81518181111561116557611165611073565b611173848260051b016110c9565b818152848101925060069190911b830184019087821115611192575f80fd5b928401925b818410156111dc57604084890312156111ae575f80fd5b6111b66110a0565b84516111c181610f27565b81528486015186820152835260409093019291840191611197565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604080825283518282018190525f91906020906060850190828801855b8281101561126c578151805173ffffffffffffffffffffffffffffffffffffffff168552850151858501529285019290840190600101611231565b5050508093505050508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f602082840312156112bf575f80fd5b815160028110610f0f575f80fd5b5f602082840312156112dd575f80fd5b505191905056fea164736f6c6343000819000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c49623609d000000000000000000000000420000000000000000000000000000000000002b0000000000000000000000006b0d0b5d65c13ed9ec80617772aee4d6c594a66e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa0570000000000000000000000000000000000000000000000000000000000000000783aa8b3e401c8404e3eff9401ba29702719ddc0c0f69ec9ac77188bacea107300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f8f6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610eb9806100d65f395ff3fe6080604052600436106100d1575f3560e01c806382356d8a1161007c57806385b5b14d1161005757806385b5b14d14610276578063b49dc74114610295578063d0e12f90146102b4578063d3e5792b146102e3575f80fd5b806382356d8a1461020f5780638312f1491461024d57806384411d6514610262575f80fd5b80633ccfd60b116100ac5780633ccfd60b1461016c57806354fd4d501461018e57806366d003ac146101e3575f80fd5b80630d9019e1146100dc578063307f29621461012c5780633bbed4a01461014d575f80fd5b366100d857005b5f80fd5b3480156100e7575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610137575f80fd5b5061014b610146366004610c86565b6102f7565b005b348015610158575f80fd5b5061014b610167366004610cc3565b61047a565b348015610177575f80fd5b506101806105de565b604051908152602001610123565b348015610199575f80fd5b506101d66040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516101239190610cde565b3480156101ee575f80fd5b506002546101029073ffffffffffffffffffffffffffffffffffffffff1681565b34801561021a575f80fd5b506002546102409074010000000000000000000000000000000000000000900460ff1681565b6040516101239190610d97565b348015610258575f80fd5b5061018060015481565b34801561026d575f80fd5b506101805f5481565b348015610281575f80fd5b5061014b610290366004610dab565b610918565b3480156102a0575f80fd5b5061014b6102af366004610dc2565b610a3b565b3480156102bf575f80fd5b5060025474010000000000000000000000000000000000000000900460ff16610240565b3480156102ee575f80fd5b50600154610180565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610354573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103789190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103dc576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043857610438610d31565b02179055507ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8818360405161046e929190610e18565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fb9190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461055f576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161046e565b5f60015447101561069c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050805f808282546106af9190610e33565b90915550506002546040805183815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a16002546040517f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee9161077491849173ffffffffffffffffffffffffffffffffffffffff811691339174010000000000000000000000000000000000000000900460ff1690610e6b565b60405180910390a1600160025474010000000000000000000000000000000000000000900460ff1660018111156107ad576107ad610d31565b0361086a576002545f906107d79073ffffffffffffffffffffffffffffffffffffffff1683610c4f565b905080610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e74000000000000000000000000000000006064820152608401610693565b5090565b6002546040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a806024820152606060448201525f60648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084015f604051808303818588803b1580156108fe575f80fd5b505af1158015610910573d5f803e3d5ffd5b505050505090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610975573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109999190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109fd576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e4203910161046e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610a855750825b90505f8267ffffffffffffffff166001148015610aa15750303b155b905081158015610aaf575080155b15610ae6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610b475784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6002805473ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117835560018a81558993927fffffffffffffffffffffff000000000000000000000000000000000000000000169091179074010000000000000000000000000000000000000000908490811115610bdf57610bdf610d31565b02179055508315610c455784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610c5b835a84610c62565b9392505050565b5f805f805f858888f1949350505050565b803560028110610c81575f80fd5b919050565b5f60208284031215610c96575f80fd5b610c5b82610c73565b73ffffffffffffffffffffffffffffffffffffffff81168114610cc0575f80fd5b50565b5f60208284031215610cd3575f80fd5b8135610c5b81610c9f565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110610d93577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610da58284610d5e565b92915050565b5f60208284031215610dbb575f80fd5b5035919050565b5f805f60608486031215610dd4575f80fd5b8335610ddf81610c9f565b925060208401359150610df460408501610c73565b90509250925092565b5f60208284031215610e0d575f80fd5b8151610c5b81610c9f565b60408101610e268285610d5e565b610c5b6020830184610d5e565b80820180821115610da5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610ea36060830184610d5e565b9594505050505056fea164736f6c6343000819000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001e4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001049623609d000000000000000000000000420000000000000000000000000000000000001b000000000000000000000000bb8accad49adb30084bdf22d01a109883fd13dce00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064b49dc74100000000000000000000000066666666666666666666666666666666666666660000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa0570000000000000000000000000000000000000000000000000000000000000000204cb368f75f2d6cade61b62cb318bffd2bd31a57a3f86dff75f5bfd9d2dd14900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9a6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610ec4806100d65f395ff3fe6080604052600436106100dc575f3560e01c80638312f1491161007c578063b49dc74111610057578063b49dc741146102a0578063d0e12f90146102bf578063d3e5792b146102ee578063d4ff9218146100e7575f80fd5b80638312f1491461025857806384411d651461026d57806385b5b14d14610281575f80fd5b80633ccfd60b116100b75780633ccfd60b1461017757806354fd4d501461019957806366d003ac146101ee57806382356d8a1461021a575f80fd5b80630d9019e1146100e7578063307f2962146101375780633bbed4a014610158575f80fd5b366100e357005b5f80fd5b3480156100f2575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610142575f80fd5b50610156610151366004610c91565b610302565b005b348015610163575f80fd5b50610156610172366004610cce565b610485565b348015610182575f80fd5b5061018b6105e9565b60405190815260200161012e565b3480156101a4575f80fd5b506101e16040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012e9190610ce9565b3480156101f9575f80fd5b5060025461010d9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610225575f80fd5b5060025461024b9074010000000000000000000000000000000000000000900460ff1681565b60405161012e9190610da2565b348015610263575f80fd5b5061018b60015481565b348015610278575f80fd5b5061018b5f5481565b34801561028c575f80fd5b5061015661029b366004610db6565b610923565b3480156102ab575f80fd5b506101566102ba366004610dcd565b610a46565b3480156102ca575f80fd5b5060025474010000000000000000000000000000000000000000900460ff1661024b565b3480156102f9575f80fd5b5060015461018b565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561035f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103839190610e08565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103e7576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561044357610443610d3c565b02179055507ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc88183604051610479929190610e23565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105069190610e08565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461056a576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610479565b5f6001544710156106a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050805f808282546106ba9190610e3e565b90915550506002546040805183815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a16002546040517f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee9161077f91849173ffffffffffffffffffffffffffffffffffffffff811691339174010000000000000000000000000000000000000000900460ff1690610e76565b60405180910390a1600160025474010000000000000000000000000000000000000000900460ff1660018111156107b8576107b8610d3c565b03610875576002545f906107e29073ffffffffffffffffffffffffffffffffffffffff1683610c5a565b905080610871576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e7400000000000000000000000000000000606482015260840161069e565b5090565b6002546040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a806024820152606060448201525f60648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084015f604051808303818588803b158015610909575f80fd5b505af115801561091b573d5f803e3d5ffd5b505050505090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610980573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109a49190610e08565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a08576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610479565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610a905750825b90505f8267ffffffffffffffff166001148015610aac5750303b155b905081158015610aba575080155b15610af1576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610b525784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6002805473ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117835560018a81558993927fffffffffffffffffffffff000000000000000000000000000000000000000000169091179074010000000000000000000000000000000000000000908490811115610bea57610bea610d3c565b02179055508315610c505784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610c66835a84610c6d565b9392505050565b5f805f805f858888f1949350505050565b803560028110610c8c575f80fd5b919050565b5f60208284031215610ca1575f80fd5b610c6682610c7e565b73ffffffffffffffffffffffffffffffffffffffff81168114610ccb575f80fd5b50565b5f60208284031215610cde575f80fd5b8135610c6681610caa565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110610d9e577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610db08284610d69565b92915050565b5f60208284031215610dc6575f80fd5b5035919050565b5f805f60608486031215610ddf575f80fd5b8335610dea81610caa565b925060208401359150610dff60408501610c7e565b90509250925092565b5f60208284031215610e18575f80fd5b8151610c6681610caa565b60408101610e318285610d69565b610c666020830184610d69565b80820180821115610db0577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610eae6060830184610d69565b9594505050505056fea164736f6c6343000819000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001e4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001049623609d00000000000000000000000042000000000000000000000000000000000000110000000000000000000000006ca5002ca794cfeebc0ec0d04ef89a382bb3942500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064b49dc74100000000000000000000000055555555555555555555555555555555555555550000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa05700000000000000000000000000000000000000000000000000000000000000007a2bde9cfb7f80a4198677bdf885a43dc36c598688294f694cf64429164f140000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f8f6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610eb9806100d65f395ff3fe6080604052600436106100d1575f3560e01c806382356d8a1161007c57806385b5b14d1161005757806385b5b14d14610276578063b49dc74114610295578063d0e12f90146102b4578063d3e5792b146102e3575f80fd5b806382356d8a1461020f5780638312f1491461024d57806384411d6514610262575f80fd5b80633ccfd60b116100ac5780633ccfd60b1461016c57806354fd4d501461018e57806366d003ac146101e3575f80fd5b80630d9019e1146100dc578063307f29621461012c5780633bbed4a01461014d575f80fd5b366100d857005b5f80fd5b3480156100e7575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610137575f80fd5b5061014b610146366004610c86565b6102f7565b005b348015610158575f80fd5b5061014b610167366004610cc3565b61047a565b348015610177575f80fd5b506101806105de565b604051908152602001610123565b348015610199575f80fd5b506101d66040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b6040516101239190610cde565b3480156101ee575f80fd5b506002546101029073ffffffffffffffffffffffffffffffffffffffff1681565b34801561021a575f80fd5b506002546102409074010000000000000000000000000000000000000000900460ff1681565b6040516101239190610d97565b348015610258575f80fd5b5061018060015481565b34801561026d575f80fd5b506101805f5481565b348015610281575f80fd5b5061014b610290366004610dab565b610918565b3480156102a0575f80fd5b5061014b6102af366004610dc2565b610a3b565b3480156102bf575f80fd5b5060025474010000000000000000000000000000000000000000900460ff16610240565b3480156102ee575f80fd5b50600154610180565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610354573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103789190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103dc576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043857610438610d31565b02179055507ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8818360405161046e929190610e18565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fb9190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461055f576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161046e565b5f60015447101561069c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050805f808282546106af9190610e33565b90915550506002546040805183815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a16002546040517f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee9161077491849173ffffffffffffffffffffffffffffffffffffffff811691339174010000000000000000000000000000000000000000900460ff1690610e6b565b60405180910390a1600160025474010000000000000000000000000000000000000000900460ff1660018111156107ad576107ad610d31565b0361086a576002545f906107d79073ffffffffffffffffffffffffffffffffffffffff1683610c4f565b905080610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e74000000000000000000000000000000006064820152608401610693565b5090565b6002546040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a806024820152606060448201525f60648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084015f604051808303818588803b1580156108fe575f80fd5b505af1158015610910573d5f803e3d5ffd5b505050505090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610975573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109999190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109fd576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e4203910161046e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610a855750825b90505f8267ffffffffffffffff166001148015610aa15750303b155b905081158015610aaf575080155b15610ae6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610b475784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6002805473ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117835560018a81558993927fffffffffffffffffffffff000000000000000000000000000000000000000000169091179074010000000000000000000000000000000000000000908490811115610bdf57610bdf610d31565b02179055508315610c455784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610c5b835a84610c62565b9392505050565b5f805f805f858888f1949350505050565b803560028110610c81575f80fd5b919050565b5f60208284031215610c96575f80fd5b610c5b82610c73565b73ffffffffffffffffffffffffffffffffffffffff81168114610cc0575f80fd5b50565b5f60208284031215610cd3575f80fd5b8135610c5b81610c9f565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110610d93577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610da58284610d5e565b92915050565b5f60208284031215610dbb575f80fd5b5035919050565b5f805f60608486031215610dd4575f80fd5b8335610ddf81610c9f565b925060208401359150610df460408501610c73565b90509250925092565b5f60208284031215610e0d575f80fd5b8151610c5b81610c9f565b60408101610e268285610d5e565b610c5b6020830184610d5e565b80820180821115610da5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610ea36060830184610d5e565b9594505050505056fea164736f6c6343000819000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001e4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001049623609d00000000000000000000000042000000000000000000000000000000000000190000000000000000000000003240dd3b3ba917563f63ea129cddff7fb696070500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064b49dc74100000000000000000000000033333333333333333333333333333333333333330000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa05700000000000000000000000000000000000000000000000000000000000000004ac8e160bee0acc95b22d1744fa9cc7068869945397f78a77ed68ef8ae1d87a900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f8f6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610eb9806100d65f395ff3fe6080604052600436106100d1575f3560e01c806382356d8a1161007c57806385b5b14d1161005757806385b5b14d14610276578063b49dc74114610295578063d0e12f90146102b4578063d3e5792b146102e3575f80fd5b806382356d8a1461020f5780638312f1491461024d57806384411d6514610262575f80fd5b80633ccfd60b116100ac5780633ccfd60b1461016c57806354fd4d501461018e57806366d003ac146101e3575f80fd5b80630d9019e1146100dc578063307f29621461012c5780633bbed4a01461014d575f80fd5b366100d857005b5f80fd5b3480156100e7575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610137575f80fd5b5061014b610146366004610c86565b6102f7565b005b348015610158575f80fd5b5061014b610167366004610cc3565b61047a565b348015610177575f80fd5b506101806105de565b604051908152602001610123565b348015610199575f80fd5b506101d66040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b6040516101239190610cde565b3480156101ee575f80fd5b506002546101029073ffffffffffffffffffffffffffffffffffffffff1681565b34801561021a575f80fd5b506002546102409074010000000000000000000000000000000000000000900460ff1681565b6040516101239190610d97565b348015610258575f80fd5b5061018060015481565b34801561026d575f80fd5b506101805f5481565b348015610281575f80fd5b5061014b610290366004610dab565b610918565b3480156102a0575f80fd5b5061014b6102af366004610dc2565b610a3b565b3480156102bf575f80fd5b5060025474010000000000000000000000000000000000000000900460ff16610240565b3480156102ee575f80fd5b50600154610180565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610354573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103789190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103dc576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043857610438610d31565b02179055507ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8818360405161046e929190610e18565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fb9190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461055f576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161046e565b5f60015447101561069c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050805f808282546106af9190610e33565b90915550506002546040805183815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a16002546040517f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee9161077491849173ffffffffffffffffffffffffffffffffffffffff811691339174010000000000000000000000000000000000000000900460ff1690610e6b565b60405180910390a1600160025474010000000000000000000000000000000000000000900460ff1660018111156107ad576107ad610d31565b0361086a576002545f906107d79073ffffffffffffffffffffffffffffffffffffffff1683610c4f565b905080610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e74000000000000000000000000000000006064820152608401610693565b5090565b6002546040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a806024820152606060448201525f60648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084015f604051808303818588803b1580156108fe575f80fd5b505af1158015610910573d5f803e3d5ffd5b505050505090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610975573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109999190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109fd576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e4203910161046e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610a855750825b90505f8267ffffffffffffffff166001148015610aa15750303b155b905081158015610aaf575080155b15610ae6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610b475784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6002805473ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117835560018a81558993927fffffffffffffffffffffff000000000000000000000000000000000000000000169091179074010000000000000000000000000000000000000000908490811115610bdf57610bdf610d31565b02179055508315610c455784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610c5b835a84610c62565b9392505050565b5f805f805f858888f1949350505050565b803560028110610c81575f80fd5b919050565b5f60208284031215610c96575f80fd5b610c5b82610c73565b73ffffffffffffffffffffffffffffffffffffffff81168114610cc0575f80fd5b50565b5f60208284031215610cd3575f80fd5b8135610c5b81610c9f565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110610d93577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610da58284610d5e565b92915050565b5f60208284031215610dbb575f80fd5b5035919050565b5f805f60608486031215610dd4575f80fd5b8335610ddf81610c9f565b925060208401359150610df460408501610c73565b90509250925092565b5f60208284031215610e0d575f80fd5b8151610c5b81610c9f565b60408101610e268285610d5e565b610c5b6020830184610d5e565b80820180821115610da5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610ea36060830184610d5e565b9594505050505056fea164736f6c6343000819000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001e4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001049623609d000000000000000000000000420000000000000000000000000000000000001a0000000000000000000000006b692240ef7a6b18aaf63a56a94d423c1b5cec0a00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064b49dc74100000000000000000000000044444444444444444444444444444444444444440000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; MultisigTask multisigTask = new RevenueShareV100UpgradePath(); address rootSafe = address(0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A); // L1PAO address securityCouncilChildMultisig = address(0xc2819DC788505Aac350142A7A707BF9D03E3Bd03); @@ -939,10 +938,10 @@ contract RegressionTest is Test { string[] memory expectedDataToSign = new string[](2); // Foundation expectedDataToSign[0] = - "0x1901a4a9c312badf3fcaa05eafe5dc9bee8bd9316c78ee8b0bebe3115bb21b7326720fcac3c106c785224ef903950a68b26a207774df0678d827e05193070a0bccb1"; + "0x1901a4a9c312badf3fcaa05eafe5dc9bee8bd9316c78ee8b0bebe3115bb21b73267239c98a2190652e75765bd0ea126d17bac09e3b1d5fbc0279c907394fb2b84c19"; // Security Council expectedDataToSign[1] = - "0x1901df53d510b56e539b90b369ef08fce3631020fbf921e3136ea5f8747c20bce96711b7f5b7a1340529fc0442b8beb32a2df55edd7fb2d6c77f35ed285cd6bcc267"; + "0x1901df53d510b56e539b90b369ef08fce3631020fbf921e3136ea5f8747c20bce9670525b8e323c17ad930925c81e1673aaafc2005d19738ef733095ce585329714f"; _assertDataToSignNestedMultisig(multisigTask, actions, expectedDataToSign, MULTICALL3_ADDRESS, rootSafe); } From 1559a8c4942158075396a540a94e1b26abef9ff9 Mon Sep 17 00:00:00 2001 From: Flux <175354924+0xiamflux@users.noreply.github.com> Date: Wed, 15 Oct 2025 15:31:01 -0400 Subject: [PATCH 40/52] chore: fmt check --- test/template/RevenueShareUpgradePath.t.sol | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/test/template/RevenueShareUpgradePath.t.sol b/test/template/RevenueShareUpgradePath.t.sol index 2efd463dca..1dc7646b3c 100644 --- a/test/template/RevenueShareUpgradePath.t.sol +++ b/test/template/RevenueShareUpgradePath.t.sol @@ -26,7 +26,10 @@ interface ICreate2Deployer { interface IProxyAdmin { function upgrade(address _proxy, address _implementation) external; - function upgradeAndCall(address _proxy, address _implementation, bytes memory _data) external payable returns (bytes memory); + function upgradeAndCall(address _proxy, address _implementation, bytes memory _data) + external + payable + returns (bytes memory); } contract RevenueShareUpgradePathTest is Test { @@ -338,10 +341,7 @@ contract RevenueShareUpgradePathTest is Test { /// @notice Verify the target address is the proxy admin /// @param _to The target address function _assertIsProxyAdmin(address _to) internal pure { - assertTrue( - _to == PROXY_ADMIN, - "Upgrade should target the proxy admin" - ); + assertTrue(_to == PROXY_ADMIN, "Upgrade should target the proxy admin"); } /// @notice Expect the portal events @@ -355,7 +355,9 @@ contract RevenueShareUpgradePathTest is Test { bytes memory _opaqueData = abi.encodePacked(uint256(0), uint256(0), _actualGasLimit, _isCreation, _data); vm.expectEmit(true, true, true, true, PORTAL); - emit TransactionDeposited(AddressAliasHelper.applyL1ToL2Alias(PROXY_ADMIN_OWNER), _to, DEPOSIT_VERSION, _opaqueData); + emit TransactionDeposited( + AddressAliasHelper.applyL1ToL2Alias(PROXY_ADMIN_OWNER), _to, DEPOSIT_VERSION, _opaqueData + ); } } } From 2a5c0c4e3a05476f6b39c49a2a3cc026536d5c62 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Wed, 15 Oct 2025 17:03:50 -0300 Subject: [PATCH 41/52] test: add revenue share upgrade path assertions --- .../integration/RevenueShareIntegration.t.sol | 108 +++++++++++++++++- 1 file changed, 107 insertions(+), 1 deletion(-) diff --git a/test/integration/RevenueShareIntegration.t.sol b/test/integration/RevenueShareIntegration.t.sol index 2841ed3ebe..b51f910b64 100644 --- a/test/integration/RevenueShareIntegration.t.sol +++ b/test/integration/RevenueShareIntegration.t.sol @@ -5,14 +5,62 @@ import {console2} from "forge-std/console2.sol"; import {RevenueShareV100UpgradePath} from "src/template/RevenueShareUpgradePath.sol"; import {Action} from "src/libraries/MultisigTypes.sol"; import {IntegrationBase} from "./IntegrationBase.t.sol"; +import {Test} from "forge-std/Test.sol"; -contract RevenueShareIntegrationTest is IntegrationBase { +enum WithdrawalNetwork { + L1, + L2 +} + +interface IFeeVault { + function MIN_WITHDRAWAL_AMOUNT() external view returns (uint256); + function RECIPIENT() external view returns (address); + function WITHDRAWAL_NETWORK() external view returns (WithdrawalNetwork); + function minWithdrawalAmount() external view returns (uint256); + function recipient() external view returns (address); + function withdrawalNetwork() external view returns (WithdrawalNetwork); +} + +interface IFeeSplitter { + function sharesCalculator() external view returns (address); +} + +interface IL1Withdrawer { + function minWithdrawalAmount() external view returns (uint256); + function recipient() external view returns (address); + function withdrawalGasLimit() external view returns (uint32); +} + +interface ISuperchainRevSharesCalculator { + function shareRecipient() external view returns (address payable); + function remainderRecipient() external view returns (address payable); +} + +contract RevenueShareIntegrationTest is IntegrationBase { RevenueShareV100UpgradePath public template; // Fork IDs uint256 internal _mainnetForkId; uint256 internal _optimismForkId; + // L2 predeploys + /// @notice Address of the Sequencer Fee Vault Predeploy on L2. + address internal constant SEQUENCER_FEE_VAULT = 0x4200000000000000000000000000000000000011; + /// @notice Address of the Operator Fee Vault Predeploy on L2. + address internal constant OPERATOR_FEE_VAULT = 0x420000000000000000000000000000000000001b; + /// @notice Address of the Base Fee Vault Predeploy on L2. + address internal constant BASE_FEE_VAULT = 0x4200000000000000000000000000000000000019; + /// @notice Address of the L1 Fee Vault Predeploy on L2. + address internal constant L1_FEE_VAULT = 0x420000000000000000000000000000000000001A; + /// @notice Address of the FeeSplitter Predeploy on L2. + address internal constant FEE_SPLITTER = 0x420000000000000000000000000000000000002B; + + // Deployed contracts (precalculated as they are deployed with CREATE2) + /// @notice Address of the L1 Withdrawer Predeploy on L2. + address internal constant L1_WITHDRAWER = 0x65E05252dd7964dBb722a9fCa24c6a2D7AFbeF57; + /// @notice Address of the Rev Share Calculator Predeploy on L2. + address internal constant REV_SHARE_CALCULATOR = 0xa9C1d283Ab6f149853337395E18850B3fF6cf192; + function setUp() public { _mainnetForkId = vm.createFork("http://127.0.0.1:8545"); _optimismForkId = vm.createFork("http://127.0.0.1:9545"); @@ -30,6 +78,25 @@ contract RevenueShareIntegrationTest is IntegrationBase { // Step 2: Relay messages from L1 to L2 // Pass true for _isSimulate since simulate() emits events twice _relayAllMessages(_optimismForkId, true); + + // Step 3: Assert the state of the L2 contracts + string memory _config = vm.readFile(_configPath); + + // L1Withdrawer: check withdrawal threshold and fees depositor + assertEq(IL1Withdrawer(L1_WITHDRAWER).minWithdrawalAmount(), vm.parseTomlUint(_config, ".l1WithdrawerMinWithdrawalAmount")); + assertEq(IL1Withdrawer(L1_WITHDRAWER).recipient(), vm.parseTomlAddress(_config, ".l1WithdrawerRecipient")); + assertEq(IL1Withdrawer(L1_WITHDRAWER).withdrawalGasLimit(), vm.parseTomlUint(_config, ".l1WithdrawerGasLimit")); + + // Rev Share Calculator: check chain fees recipient and remainder recipient + assertEq(ISuperchainRevSharesCalculator(REV_SHARE_CALCULATOR).shareRecipient(), L1_WITHDRAWER); + assertEq(ISuperchainRevSharesCalculator(REV_SHARE_CALCULATOR).remainderRecipient(), vm.parseTomlAddress(_config, ".scRevShareCalcChainFeesRecipient")); + + // Fee Splitter: check calculator is set + assertNotEq(IFeeSplitter(FEE_SPLITTER).sharesCalculator(), address(0)); + + // Vaults: recipient should be fee splitter, withdrawal network should be L2, min withdrawal amount 0 + // getters for legacy and the new values should be the same + _assertFeeVaultsState(true, _config); } function test_optOutRevenueShare_integration() public { @@ -42,6 +109,45 @@ contract RevenueShareIntegrationTest is IntegrationBase { // Step 2: Relay messages from L1 to L2 // Pass true for _isSimulate since simulate() emits events twice _relayAllMessages(_optimismForkId, true); + + // Step 3: Assert the state of the L2 contracts + string memory _config = vm.readFile(_configPath); + + // Fee Splitter: check calculator is set to address(0) + assertEq(IFeeSplitter(FEE_SPLITTER).sharesCalculator(), address(0)); + + // Vaults: vaults configuration should be the same as the ones in the config provided + // getters for legacy and the new values should be the same + _assertFeeVaultsState(false, _config); } + + function _assertFeeVaultsState(bool _isOptIn, string memory _config) internal { + if (_isOptIn) { + _assertVaultGetters(SEQUENCER_FEE_VAULT, FEE_SPLITTER, WithdrawalNetwork.L2, 0); + _assertVaultGetters(OPERATOR_FEE_VAULT, FEE_SPLITTER, WithdrawalNetwork.L2, 0); + _assertVaultGetters(BASE_FEE_VAULT, FEE_SPLITTER, WithdrawalNetwork.L2, 0); + _assertVaultGetters(L1_FEE_VAULT, FEE_SPLITTER, WithdrawalNetwork.L2, 0); + } else { + _assertVaultGetters(SEQUENCER_FEE_VAULT, vm.parseTomlAddress(_config, ".sequencerFeeVaultRecipient"), WithdrawalNetwork(vm.parseTomlUint(_config, ".sequencerFeeVaultWithdrawalNetwork")), vm.parseTomlUint(_config, ".sequencerFeeVaultMinWithdrawalAmount")); + _assertVaultGetters(OPERATOR_FEE_VAULT, vm.parseTomlAddress(_config, ".operatorFeeVaultRecipient"), WithdrawalNetwork(vm.parseTomlUint(_config, ".operatorFeeVaultWithdrawalNetwork")), vm.parseTomlUint(_config, ".operatorFeeVaultMinWithdrawalAmount")); + _assertVaultGetters(BASE_FEE_VAULT, vm.parseTomlAddress(_config, ".baseFeeVaultRecipient"), WithdrawalNetwork(vm.parseTomlUint(_config, ".baseFeeVaultWithdrawalNetwork")), vm.parseTomlUint(_config, ".baseFeeVaultMinWithdrawalAmount")); + _assertVaultGetters(L1_FEE_VAULT, vm.parseTomlAddress(_config, ".l1FeeVaultRecipient"), WithdrawalNetwork(vm.parseTomlUint(_config, ".l1FeeVaultWithdrawalNetwork")), vm.parseTomlUint(_config, ".l1FeeVaultMinWithdrawalAmount")); + } + } + + /// @notice Assert the configuration of a fee vault + /// @param _vault The address of the fee vault + /// @param _recipient The recipient of the fee vault + /// @param _withdrawalNetwork The withdrawal network of the fee vault + /// @param _minWithdrawalAmount The minimum withdrawal amount of the fee vault + /// @dev Ensures both the legacy and the new getters return the same value + function _assertVaultGetters(address _vault, address _recipient, WithdrawalNetwork _withdrawalNetwork, uint256 _minWithdrawalAmount) internal { + assertEq(IFeeVault(_vault).recipient(), _recipient); + assertEq(uint256(IFeeVault(_vault).withdrawalNetwork()), uint256(_withdrawalNetwork)); + assertEq(IFeeVault(_vault).minWithdrawalAmount(), _minWithdrawalAmount); + assertEq(IFeeVault(_vault).RECIPIENT(), _recipient); + assertEq(uint256(IFeeVault(_vault).WITHDRAWAL_NETWORK()), uint256(_withdrawalNetwork)); + assertEq(IFeeVault(_vault).MIN_WITHDRAWAL_AMOUNT(), _minWithdrawalAmount); + } } \ No newline at end of file From 807a28d44f56562b955a324e9812e4c26f42865e Mon Sep 17 00:00:00 2001 From: 0xchin Date: Wed, 15 Oct 2025 17:17:20 -0300 Subject: [PATCH 42/52] docs: add gas from tenderly new simulations --- .../tenderly/RevenueShareSimulations.md | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/test/integration/tenderly/RevenueShareSimulations.md b/test/integration/tenderly/RevenueShareSimulations.md index 3b81bd4198..c55c5c0f3c 100644 --- a/test/integration/tenderly/RevenueShareSimulations.md +++ b/test/integration/tenderly/RevenueShareSimulations.md @@ -2,27 +2,27 @@ A list of tenderly simulations are provided based on the formatting of the `TransactionDeposited` events emitted in L1 and its execution in the target L2, in this case, OP Mainnet. For details, check the [Simulating Portal Deposit Transactions](todo) document ### Revenue Share Upgrade Opt In -1. [L1Withdrawer Deploy](https://www.tdly.co/shared/simulation/bcd94969-b645-4f62-893c-0b2ce793b5bf) Gas: 558,056/625,000 (89%) +1. [L1Withdrawer Deploy](https://www.tdly.co/shared/simulation/2de00980-0c73-4cf8-834f-c9210ba738d2) Gas: 558,056/625,000 (89%) 2. [Rev Share Calculator Deploy](https://dashboard.tenderly.co/0xchin/project/simulator/c2970c09-7df7-4f97-bd2c-fd74caf1f2b0) Gas: 579,688/625,000 (93%) 3. [Fee Splitter Deploy](https://dashboard.tenderly.co/0xchin/project/simulator/6b084159-75ed-41b1-993c-a0a6953616c5) Gas: 1.121.747/1,235,000 (91%) -4. [Fee Splitter Upgrade](https://www.tdly.co/shared/simulation/3e224c10-f2e9-4346-8ea4-ddb031d37894) Gas: 65,378/500,000 (13%) +4. [Fee Splitter Upgrade](https://www.tdly.co/shared/simulation/3e224c10-f2e9-4346-8ea4-ddb031d37894) Gas: 65,378/150,000 (44%) 5. [Operator Fee Vault Deploy](https://www.tdly.co/shared/simulation/c78942e2-6008-475d-a049-f07866586ef6) Gas: 831,558/910,000 (91%) -6. [Operator Fee Vault Upgrade](https://www.tdly.co/shared/simulation/3ce52bed-aff0-4a25-9de6-be08e14e0524) Gas: 42,886/500,000 (9%) +6. [Operator Fee Vault Upgrade](https://www.tdly.co/shared/simulation/ff2a2b2b-992b-46f7-9355-743df1cffd96) Gas: 42,886/150,000 (29%) 7. [Sequencer Fee Vault Deploy](https://www.tdly.co/shared/simulation/19e79c8e-4461-48dc-8477-e2bc5e1160eb) Gas: 841,784/910,000 (93%) -8. [Sequencer Fee Vault Upgrade](https://www.tdly.co/shared/simulation/fd7dfe19-900a-497f-8c34-283f82f3c3ec) Gas: 40,386/500,000 (8%) +8. [Sequencer Fee Vault Upgrade](https://www.tdly.co/shared/simulation/d857f412-b3b3-456a-b2f8-5ecfc064d193) Gas: 40,386/150,000 (27%) 9. [Base Fee Vault Deploy](https://www.tdly.co/shared/simulation/db7e5826-deab-4e22-82e1-20c862ccb195) Gas: 831,546/910,000 (91%) -10. [Base Fee Vault Upgrade](https://dashboard.tenderly.co/0xchin/project/simulator/8ca93686-3e7b-48d8-a413-3acf910e50c0) Gas: 42,886/500,000 (9%) +10. [Base Fee Vault Upgrade](https://www.tdly.co/shared/simulation/e16884f7-0905-4723-bca3-febf65c523b4) Gas: 42,886/150,000 (29%) 11. [L1 Fee Vault Deploy](https://www.tdly.co/shared/simulation/c372faa5-72e2-45a5-97a7-28b3c4826869) Gas: 831,558/910,000 (91%) -12. [L1 Fee Vault Upgrade](https://www.tdly.co/shared/simulation/99eec896-d220-44ce-acd5-4ed91c3b0d5d) Gas: 42,886/500,000 (9%) +12. [L1 Fee Vault Upgrade](https://www.tdly.co/shared/simulation/37d55586-306a-40bd-a80d-954fe2373751) Gas: 42,886/150,000 (29%) ### Revenue Share Upgrade Opt Out 1. [Fee Splitter Deploy](https://dashboard.tenderly.co/0xchin/project/simulator/6b084159-75ed-41b1-993c-a0a6953616c5) Gas: 1.121.747/1,235,000 (91%) -2. [Fee Splitter Upgrade](https://www.tdly.co/shared/simulation/3e224c10-f2e9-4346-8ea4-ddb031d37894) Gas: 65,378/500,000 (13%) +2. [Fee Splitter Upgrade](https://www.tdly.co/shared/simulation/3e224c10-f2e9-4346-8ea4-ddb031d37894) Gas: 65,378/150,000 (44%) 3. [Operator Fee Vault Deploy](https://www.tdly.co/shared/simulation/c78942e2-6008-475d-a049-f07866586ef6) Gas: 831,558/910,000 (91%) -4. [Operator Fee Vault Upgrade](https://www.tdly.co/shared/simulation/3ce52bed-aff0-4a25-9de6-be08e14e0524) Gas: 42,886/500,000 (9%) +4. [Operator Fee Vault Upgrade](https://www.tdly.co/shared/simulation/ff2a2b2b-992b-46f7-9355-743df1cffd96) Gas: 42,886/150,000 (29%) 5. [Sequencer Fee Vault Deploy](https://www.tdly.co/shared/simulation/19e79c8e-4461-48dc-8477-e2bc5e1160eb) Gas: 841,784/910,000 (93%) -6. [Sequencer Fee Vault Upgrade](https://www.tdly.co/shared/simulation/fd7dfe19-900a-497f-8c34-283f82f3c3ec) Gas: 40,386/500,000 (8%) +6. [Sequencer Fee Vault Upgrade](https://www.tdly.co/shared/simulation/d857f412-b3b3-456a-b2f8-5ecfc064d193) Gas: 40,386/150,000 (27%) 7. [Base Fee Vault Deploy](https://www.tdly.co/shared/simulation/db7e5826-deab-4e22-82e1-20c862ccb195) Gas: 831,546/910,000 (91%) -8. [Base Fee Vault Upgrade](https://dashboard.tenderly.co/0xchin/project/simulator/8ca93686-3e7b-48d8-a413-3acf910e50c0) Gas: 42,886/500,000 (9%) +8. [Base Fee Vault Upgrade](https://www.tdly.co/shared/simulation/e16884f7-0905-4723-bca3-febf65c523b4) Gas: 42,886/150,000 (29%) 9. [L1 Fee Vault Deploy](https://www.tdly.co/shared/simulation/c372faa5-72e2-45a5-97a7-28b3c4826869) Gas: 831,558/910,000 (91%) -10. [L1 Fee Vault Upgrade](https://www.tdly.co/shared/simulation/99eec896-d220-44ce-acd5-4ed91c3b0d5d) Gas: 42,886/500,000 (9%) \ No newline at end of file +10. [L1 Fee Vault Upgrade](https://www.tdly.co/shared/simulation/37d55586-306a-40bd-a80d-954fe2373751) Gas: 42,886/150,000 (29%) \ No newline at end of file From 4602d3f201822e0128ab136f6f2de7bf38d9db07 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Wed, 15 Oct 2025 17:23:50 -0300 Subject: [PATCH 43/52] style: formatting --- test/integration/IntegrationBase.t.sol | 70 ++++++++++--------- .../integration/RevenueShareIntegration.t.sol | 54 ++++++++++---- test/tasks/Regression.t.sol | 1 - test/template/RevenueShareUpgradePath.t.sol | 14 ++-- 4 files changed, 86 insertions(+), 53 deletions(-) diff --git a/test/integration/IntegrationBase.t.sol b/test/integration/IntegrationBase.t.sol index aa262b33b4..c5c26e1ec4 100644 --- a/test/integration/IntegrationBase.t.sol +++ b/test/integration/IntegrationBase.t.sol @@ -27,39 +27,39 @@ abstract contract IntegrationBase is Test { // Get logs from L1 execution Vm.Log[] memory _allLogs = vm.getRecordedLogs(); - + // If this is a simulation, only take the second half of logs to avoid processing duplicates // Simulations emit events twice, so we skip the first half uint256 _startIndex = _isSimulate ? _allLogs.length / 2 : 0; uint256 _logsCount = _isSimulate ? _allLogs.length - _startIndex : _allLogs.length; - + Vm.Log[] memory _logs = new Vm.Log[](_logsCount); for (uint256 _i = 0; _i < _logsCount; _i++) { _logs[_i] = _allLogs[_startIndex + _i]; } - + // Filter for TransactionDeposited events bytes32 _transactionDepositedHash = keccak256("TransactionDeposited(address,address,uint256,bytes)"); - + uint256 _transactionCount; uint256 _successCount; uint256 _failureCount; - + for (uint256 _i = 0; _i < _logs.length; _i++) { // Check if this is a TransactionDeposited event if (_logs[_i].topics[0] == _transactionDepositedHash) { // Decode indexed parameters address _from = address(uint160(uint256(_logs[_i].topics[1]))); address _to = address(uint160(uint256(_logs[_i].topics[2]))); - + // Decode the opaqueData bytes memory _opaqueData = abi.decode(_logs[_i].data, (bytes)); - + _transactionCount++; - + // Process and execute the transaction bool _success = _processDepositTransaction(_from, _to, _opaqueData, _transactionCount); - + if (_success) { _successCount++; } else { @@ -67,40 +67,38 @@ abstract contract IntegrationBase is Test { } } } - + console2.log("\n=== Summary ==="); console2.log("Total transactions:", _transactionCount); console2.log("Successful transactions:", _successCount); console2.log("Failed transactions:", _failureCount); - + // Assert all transactions succeeded assertEq(_failureCount, 0, "All deposit transactions should succeed"); assertEq(_successCount, _transactionCount, "All transactions should succeed"); } /// @notice Process and execute a deposit transaction - function _processDepositTransaction( - address _from, - address _to, - bytes memory _opaqueData, - uint256 _txNumber - ) internal returns (bool) { + function _processDepositTransaction(address _from, address _to, bytes memory _opaqueData, uint256 _txNumber) + internal + returns (bool) + { // Extract value (bytes 0-31) uint256 _value = uint256(bytes32(_slice(_opaqueData, 0, 32))); - + // Extract gasLimit (bytes 64-71) uint64 _gasLimit = uint64(bytes8(_slice(_opaqueData, 64, 8))); - + // Extract data (bytes 73 onwards) bytes memory _data = _slice(_opaqueData, 73, _opaqueData.length - 73); - + // Print Tenderly simulation parameters _logTransactionDetails(_from, _to, _value, _gasLimit, _data, _txNumber); - + // Execute the transaction on L2 as if it came from the aliased address vm.prank(_from); - (bool _success, ) = _to.call{value: _value, gas: _gasLimit}(_data); - + (bool _success,) = _to.call{value: _value, gas: _gasLimit}(_data); + return _success; } @@ -119,7 +117,7 @@ abstract contract IntegrationBase is Test { _selector := mload(add(_data, 32)) } } - + // Generate Tenderly simulation link string memory _tenderlyLink = _generateTenderlyLink(_to, _from, uint256(_gasLimit), _value, _data); console2.log("\nTenderly Simulation Link for transaction #", _txNumber); @@ -145,17 +143,22 @@ abstract contract IntegrationBase is Test { ) internal pure returns (string memory) { // Convert bytes to hex string string memory _calldataHex = _bytesToHexString(_rawFunctionInput); - + // Build the Tenderly URL // network=10 for OP Mainnet (change if testing on different L2) return string.concat( "https://dashboard.tenderly.co/TENDERLY_USERNAME/TENDERLY_PROJECT/simulator/new", "?network=10", - "&contractAddress=0x", _toAsciiString(_contractAddress), - "&from=0x", _toAsciiString(_from), - "&gas=", vm.toString(_gas), - "&value=", vm.toString(_value), - "&rawFunctionInput=0x", _calldataHex + "&contractAddress=0x", + _toAsciiString(_contractAddress), + "&from=0x", + _toAsciiString(_from), + "&gas=", + vm.toString(_gas), + "&value=", + vm.toString(_value), + "&rawFunctionInput=0x", + _calldataHex ); } @@ -163,11 +166,11 @@ abstract contract IntegrationBase is Test { function _toAsciiString(address _addr) internal pure returns (string memory) { bytes memory _s = new bytes(40); for (uint256 _i = 0; _i < 20; _i++) { - bytes1 _b = bytes1(uint8(uint256(uint160(_addr)) / (2**(8*(19 - _i))))); + bytes1 _b = bytes1(uint8(uint256(uint160(_addr)) / (2 ** (8 * (19 - _i))))); bytes1 _hi = bytes1(uint8(_b) / 16); bytes1 _lo = bytes1(uint8(_b) - 16 * uint8(_hi)); - _s[2*_i] = _char(_hi); - _s[2*_i+1] = _char(_lo); + _s[2 * _i] = _char(_hi); + _s[2 * _i + 1] = _char(_lo); } return string(_s); } @@ -189,4 +192,3 @@ abstract contract IntegrationBase is Test { else return bytes1(uint8(_b) + 0x57); } } - diff --git a/test/integration/RevenueShareIntegration.t.sol b/test/integration/RevenueShareIntegration.t.sol index b51f910b64..86c1dcbb49 100644 --- a/test/integration/RevenueShareIntegration.t.sol +++ b/test/integration/RevenueShareIntegration.t.sol @@ -36,7 +36,7 @@ interface ISuperchainRevSharesCalculator { function remainderRecipient() external view returns (address payable); } -contract RevenueShareIntegrationTest is IntegrationBase { +contract RevenueShareIntegrationTest is IntegrationBase { RevenueShareV100UpgradePath public template; // Fork IDs @@ -83,13 +83,19 @@ contract RevenueShareIntegrationTest is IntegrationBase { string memory _config = vm.readFile(_configPath); // L1Withdrawer: check withdrawal threshold and fees depositor - assertEq(IL1Withdrawer(L1_WITHDRAWER).minWithdrawalAmount(), vm.parseTomlUint(_config, ".l1WithdrawerMinWithdrawalAmount")); + assertEq( + IL1Withdrawer(L1_WITHDRAWER).minWithdrawalAmount(), + vm.parseTomlUint(_config, ".l1WithdrawerMinWithdrawalAmount") + ); assertEq(IL1Withdrawer(L1_WITHDRAWER).recipient(), vm.parseTomlAddress(_config, ".l1WithdrawerRecipient")); assertEq(IL1Withdrawer(L1_WITHDRAWER).withdrawalGasLimit(), vm.parseTomlUint(_config, ".l1WithdrawerGasLimit")); - + // Rev Share Calculator: check chain fees recipient and remainder recipient assertEq(ISuperchainRevSharesCalculator(REV_SHARE_CALCULATOR).shareRecipient(), L1_WITHDRAWER); - assertEq(ISuperchainRevSharesCalculator(REV_SHARE_CALCULATOR).remainderRecipient(), vm.parseTomlAddress(_config, ".scRevShareCalcChainFeesRecipient")); + assertEq( + ISuperchainRevSharesCalculator(REV_SHARE_CALCULATOR).remainderRecipient(), + vm.parseTomlAddress(_config, ".scRevShareCalcChainFeesRecipient") + ); // Fee Splitter: check calculator is set assertNotEq(IFeeSplitter(FEE_SPLITTER).sharesCalculator(), address(0)); @@ -121,7 +127,6 @@ contract RevenueShareIntegrationTest is IntegrationBase { _assertFeeVaultsState(false, _config); } - function _assertFeeVaultsState(bool _isOptIn, string memory _config) internal { if (_isOptIn) { _assertVaultGetters(SEQUENCER_FEE_VAULT, FEE_SPLITTER, WithdrawalNetwork.L2, 0); @@ -129,20 +134,45 @@ contract RevenueShareIntegrationTest is IntegrationBase { _assertVaultGetters(BASE_FEE_VAULT, FEE_SPLITTER, WithdrawalNetwork.L2, 0); _assertVaultGetters(L1_FEE_VAULT, FEE_SPLITTER, WithdrawalNetwork.L2, 0); } else { - _assertVaultGetters(SEQUENCER_FEE_VAULT, vm.parseTomlAddress(_config, ".sequencerFeeVaultRecipient"), WithdrawalNetwork(vm.parseTomlUint(_config, ".sequencerFeeVaultWithdrawalNetwork")), vm.parseTomlUint(_config, ".sequencerFeeVaultMinWithdrawalAmount")); - _assertVaultGetters(OPERATOR_FEE_VAULT, vm.parseTomlAddress(_config, ".operatorFeeVaultRecipient"), WithdrawalNetwork(vm.parseTomlUint(_config, ".operatorFeeVaultWithdrawalNetwork")), vm.parseTomlUint(_config, ".operatorFeeVaultMinWithdrawalAmount")); - _assertVaultGetters(BASE_FEE_VAULT, vm.parseTomlAddress(_config, ".baseFeeVaultRecipient"), WithdrawalNetwork(vm.parseTomlUint(_config, ".baseFeeVaultWithdrawalNetwork")), vm.parseTomlUint(_config, ".baseFeeVaultMinWithdrawalAmount")); - _assertVaultGetters(L1_FEE_VAULT, vm.parseTomlAddress(_config, ".l1FeeVaultRecipient"), WithdrawalNetwork(vm.parseTomlUint(_config, ".l1FeeVaultWithdrawalNetwork")), vm.parseTomlUint(_config, ".l1FeeVaultMinWithdrawalAmount")); + _assertVaultGetters( + SEQUENCER_FEE_VAULT, + vm.parseTomlAddress(_config, ".sequencerFeeVaultRecipient"), + WithdrawalNetwork(vm.parseTomlUint(_config, ".sequencerFeeVaultWithdrawalNetwork")), + vm.parseTomlUint(_config, ".sequencerFeeVaultMinWithdrawalAmount") + ); + _assertVaultGetters( + OPERATOR_FEE_VAULT, + vm.parseTomlAddress(_config, ".operatorFeeVaultRecipient"), + WithdrawalNetwork(vm.parseTomlUint(_config, ".operatorFeeVaultWithdrawalNetwork")), + vm.parseTomlUint(_config, ".operatorFeeVaultMinWithdrawalAmount") + ); + _assertVaultGetters( + BASE_FEE_VAULT, + vm.parseTomlAddress(_config, ".baseFeeVaultRecipient"), + WithdrawalNetwork(vm.parseTomlUint(_config, ".baseFeeVaultWithdrawalNetwork")), + vm.parseTomlUint(_config, ".baseFeeVaultMinWithdrawalAmount") + ); + _assertVaultGetters( + L1_FEE_VAULT, + vm.parseTomlAddress(_config, ".l1FeeVaultRecipient"), + WithdrawalNetwork(vm.parseTomlUint(_config, ".l1FeeVaultWithdrawalNetwork")), + vm.parseTomlUint(_config, ".l1FeeVaultMinWithdrawalAmount") + ); } } - + /// @notice Assert the configuration of a fee vault /// @param _vault The address of the fee vault /// @param _recipient The recipient of the fee vault /// @param _withdrawalNetwork The withdrawal network of the fee vault /// @param _minWithdrawalAmount The minimum withdrawal amount of the fee vault /// @dev Ensures both the legacy and the new getters return the same value - function _assertVaultGetters(address _vault, address _recipient, WithdrawalNetwork _withdrawalNetwork, uint256 _minWithdrawalAmount) internal { + function _assertVaultGetters( + address _vault, + address _recipient, + WithdrawalNetwork _withdrawalNetwork, + uint256 _minWithdrawalAmount + ) internal { assertEq(IFeeVault(_vault).recipient(), _recipient); assertEq(uint256(IFeeVault(_vault).withdrawalNetwork()), uint256(_withdrawalNetwork)); assertEq(IFeeVault(_vault).minWithdrawalAmount(), _minWithdrawalAmount); @@ -150,4 +180,4 @@ contract RevenueShareIntegrationTest is IntegrationBase { assertEq(uint256(IFeeVault(_vault).WITHDRAWAL_NETWORK()), uint256(_withdrawalNetwork)); assertEq(IFeeVault(_vault).MIN_WITHDRAWAL_AMOUNT(), _minWithdrawalAmount); } -} \ No newline at end of file +} diff --git a/test/tasks/Regression.t.sol b/test/tasks/Regression.t.sol index 5bb4b645c8..c063a0ff1d 100644 --- a/test/tasks/Regression.t.sol +++ b/test/tasks/Regression.t.sol @@ -925,7 +925,6 @@ contract RegressionTest is Test { function testRegressionCallDataMatches_RevenueShareV100UpgradePathOptOut() public { string memory taskConfigFilePath = "test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml"; string memory expectedCallData = - "0x174dea710000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000174000000000000000000000000000000000000000000000000000000000000019a00000000000000000000000000000000000000000000000000000000000002b600000000000000000000000000000000000000000000000000000000000002d400000000000000000000000000000000000000000000000000000000000003f40000000000000000000000000000000000000000000000000000000000000412000000000000000000000000000000000000000000000000000000000000052e000000000000000000000000000000000000000000000000000000000000054c00000000000000000000000000000000000000000000000000000000000006680000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001544e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012d838000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000146466cfa0570000000000000000000000000000000000000000000000000000000000000000d7c04619bfc311a92d20723f9d08baaba18c3c8c7dcd85736bf66b85f59c37f6000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000013d26080604052348015600e575f80fd5b5060156019565b60d4565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101560d2575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6112f1806100e15f395ff3fe608060405260043610610096575f3560e01c80637dfbd04911610066578063b87ea8d41161004c578063b87ea8d414610313578063c4d66de814610327578063d61a398b14610346575f80fd5b80637dfbd049146102dd5780637fc81bb7146102f4575f80fd5b80630a7617b3146101dd5780630c0544a3146101fe578063394d27311461026057806354fd4d5014610288575f80fd5b366101d9577fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455c6100f3576040517f17617f6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b337342000000000000000000000000000000000000111480159061012b57503373420000000000000000000000000000000000001914155b801561014b57503373420000000000000000000000000000000000001a14155b801561016b57503373420000000000000000000000000000000000001b14155b156101a2576040517f9dcde10900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405134815233907f2ccfc58c2cef4ee590b5f16be0548cc54afc12e1c66a67b362b7d640fd16bb2d9060200160405180910390a2005b5f80fd5b3480156101e8575f80fd5b506101fc6101f7366004610f4b565b61039c565b005b348015610209575f80fd5b5060015461023a9070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561026b575f80fd5b5060015461023a906fffffffffffffffffffffffffffffffff1681565b348015610293575f80fd5b506102d06040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516102579190610f66565b3480156102e8575f80fd5b5061023a6301e1338081565b3480156102ff575f80fd5b506101fc61030e366004610fb9565b61055e565b34801561031e575f80fd5b506101fc610706565b348015610332575f80fd5b506101fc610341366004610f4b565b610aea565b348015610351575f80fd5b505f546103779062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610257565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041d9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610481576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166104ce576040517f99c6ec0800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff85161790945560408051949093049091168084526020840191909152917f16417cc372deec0caee5f52e2ad77a5f07b4591fd56b4ff31b6e20f817d4daeb91015b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105df9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610643576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6301e133806fffffffffffffffffffffffffffffffff82161115610693576040517f30b9f35e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546fffffffffffffffffffffffffffffffff8381167001000000000000000000000000000000008181028385161790945560408051949093049091168084526020840191909152917f4492086b630ed3846eec0979dd87a71c814ceb1c6dab80ab81e3450b21e4de289101610552565b60015461073b906fffffffffffffffffffffffffffffffff700100000000000000000000000000000000820481169116611030565b6fffffffffffffffffffffffffffffffff16421015610786576040517f1e4a9f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016426fffffffffffffffffffffffffffffffff161781556107cb90610ce0565b5f6107e9734200000000000000000000000000000000000011610d06565b90505f610809734200000000000000000000000000000000000019610d06565b90505f61082973420000000000000000000000000000000000001a610d06565b90505f61084973420000000000000000000000000000000000001b610d06565b90506108545f610ce0565b5f82826108618688611060565b61086b9190611060565b6108759190611060565b9050805f036108b0576040517fc8972e5200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517f54e7f42d000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101859052606481018690526201000090910473ffffffffffffffffffffffffffffffffffffffff16906354e7f42d906084015f60405180830381865afa158015610936573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261097b9190810190611118565b905080515f036109b7576040517f763970d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b8251811015610a6e575f8382815181106109d6576109d66111e7565b60200260200101515f015190505f8483815181106109f6576109f66111e7565b6020026020010151602001519050805f03610a12575050610a66565b5f610a1d8383610f03565b905080610a56576040517fd68d1b1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a608286611060565b94505050505b6001016109ba565b50828114610aa8576040517f9c01eac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f73f9a13241a1848ec157967f3a85601709353e616f1f2605d818c0f2d21774df8284604051610ad9929190611214565b60405180910390a150505050505050565b5f54610100900460ff1615808015610b0857505f54600160ff909116105b80610b215750303b158015610b2157505f5460ff166001145b610bb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610c0d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff851602179055600180546fffffffffffffffffffffffffffffffff1672015180000000000000000000000000000000001790558015610cdc575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610552565b5050565b807fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455d50565b5f60018273ffffffffffffffffffffffffffffffffffffffff166382356d8a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d7691906112af565b6001811115610d8757610d87611282565b14610dbe576040517fb4726cbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff166366d003ac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e429190610fe8565b73ffffffffffffffffffffffffffffffffffffffff1614610e8f576040517fc3380cef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610ed9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610efd91906112cd565b92915050565b5f610f0f835a84610f16565b9392505050565b5f805f805f858888f1949350505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f48575f80fd5b50565b5f60208284031215610f5b575f80fd5b8135610f0f81610f27565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f60208284031215610fc9575f80fd5b81356fffffffffffffffffffffffffffffffff81168114610f0f575f80fd5b5f60208284031215610ff8575f80fd5b8151610f0f81610f27565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6fffffffffffffffffffffffffffffffff81811683821601908082111561105957611059611003565b5092915050565b80820180821115610efd57610efd611003565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156110c3576110c3611073565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561111057611110611073565b604052919050565b5f6020808385031215611129575f80fd5b825167ffffffffffffffff80821115611140575f80fd5b818501915085601f830112611153575f80fd5b81518181111561116557611165611073565b611173848260051b016110c9565b818152848101925060069190911b830184019087821115611192575f80fd5b928401925b818410156111dc57604084890312156111ae575f80fd5b6111b66110a0565b84516111c181610f27565b81528486015186820152835260409093019291840191611197565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604080825283518282018190525f91906020906060850190828801855b8281101561126c578151805173ffffffffffffffffffffffffffffffffffffffff168552850151858501529285019290840190600101611231565b5050508093505050508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f602082840312156112bf575f80fd5b815160028110610f0f575f80fd5b5f602082840312156112dd575f80fd5b505191905056fea164736f6c6343000819000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c49623609d000000000000000000000000420000000000000000000000000000000000002b0000000000000000000000006b0d0b5d65c13ed9ec80617772aee4d6c594a66e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa0570000000000000000000000000000000000000000000000000000000000000000783aa8b3e401c8404e3eff9401ba29702719ddc0c0f69ec9ac77188bacea107300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9c60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a00000000000000000000000066666666666666666666666666666666666666660000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000124e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004499a88ec4000000000000000000000000420000000000000000000000000000000000001b0000000000000000000000001e2d5b3362d3b6726dd715284dc83faf7e6c27ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001144e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000106466cfa0570000000000000000000000000000000000000000000000000000000000000000204cb368f75f2d6cade61b62cb318bffd2bd31a57a3f86dff75f5bfd9d2dd14900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000fcb60e060405234801561001057600080fd5b50604051610f6b380380610f6b83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e466101256000396000818161028f0152610a0101526000818160f401526109910152600081816102c30152610a550152610e466000f3fe6080604052600436106100d65760003560e01c806382356d8a1161007f57806385b5b14d1161005957806385b5b14d1461025d578063d0e12f901461027d578063d3e5792b146102b1578063d4ff9218146102e557600080fd5b806382356d8a146102105780638312f1491461023257806384411d651461024757600080fd5b80633ccfd60b116100b05780633ccfd60b1461018257806354fd4d50146101a557806366d003ac146101fb57600080fd5b80630d9019e1146100e2578063307f2962146101405780633bbed4a01461016257600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506101167f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014c57600080fd5b5061016061015b366004610c14565b6102fa565b005b34801561016e57600080fd5b5061016061017d366004610c5a565b6104c2565b34801561018e57600080fd5b50610197610642565b604051908152602001610137565b3480156101b157600080fd5b506101ee6040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b6040516101379190610c77565b34801561020757600080fd5b5061011661094a565b34801561021c57600080fd5b506102256109b3565b6040516101379190610d54565b34801561023e57600080fd5b50610197610a23565b34801561025357600080fd5b5061019760005481565b34801561026957600080fd5b50610160610278366004610d68565b610a77565b34801561028957600080fd5b506102257f000000000000000000000000000000000000000000000000000000000000000081565b3480156102bd57600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f157600080fd5b50610116610bdd565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610359573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037d9190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103e1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043d5761043d610cea565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104b69083908590610d9e565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610521573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105459190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105a9576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e459391016104b6565b600061064c610a23565b471015610706576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b4790508060008082825461071a9190610db9565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161074a61094a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee816107a861094a565b336107b16109b3565b6040516107c19493929190610df8565b60405180910390a160016107d36109b3565b60018111156107e4576107e4610cea565b0361088f5760006107fc6107f661094a565b83610bec565b90508061088b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106fd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac826108b261094a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561092e57600080fd5b505af1158015610942573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561098e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109fe575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a52575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ad6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afa9190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b5e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e420391016104b6565b6000610be761094a565b905090565b6000610bf9835a84610c00565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610c2657600080fd5b813560028110610bf957600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c5757600080fd5b50565b600060208284031215610c6c57600080fd5b8135610bf981610c35565b600060208083528351808285015260005b81811015610ca457858101830151858201604001528201610c88565b81811115610cb6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d50577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d628284610d19565b92915050565b600060208284031215610d7a57600080fd5b5035919050565b600060208284031215610d9357600080fd5b8151610bf981610c35565b60408101610dac8285610d19565b610bf96020830184610d19565b60008219821115610df3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e306060830184610d19565b9594505050505056fea164736f6c634300080f000a00000000000000000000000055555555555555555555555555555555555555550000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000124e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004499a88ec400000000000000000000000042000000000000000000000000000000000000110000000000000000000000002ca727314d2c6c683998ce385c2853923719aea10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa05700000000000000000000000000000000000000000000000000000000000000007a2bde9cfb7f80a4198677bdf885a43dc36c598688294f694cf64429164f140000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9c60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a00000000000000000000000033333333333333333333333333333333333333330000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000124e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004499a88ec4000000000000000000000000420000000000000000000000000000000000001900000000000000000000000063e87ea1598d7b59b88685b56be6e5d7b2e11ed90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa05700000000000000000000000000000000000000000000000000000000000000004ac8e160bee0acc95b22d1744fa9cc7068869945397f78a77ed68ef8ae1d87a900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9c60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a00000000000000000000000044444444444444444444444444444444444444440000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000124e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004499a88ec4000000000000000000000000420000000000000000000000000000000000001a000000000000000000000000ad552e53be11c5fc03a95d8be3bb72ab675e0ddb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; MultisigTask multisigTask = new RevenueShareV100UpgradePath(); address rootSafe = address(0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A); // L1PAO diff --git a/test/template/RevenueShareUpgradePath.t.sol b/test/template/RevenueShareUpgradePath.t.sol index 2efd463dca..1dc7646b3c 100644 --- a/test/template/RevenueShareUpgradePath.t.sol +++ b/test/template/RevenueShareUpgradePath.t.sol @@ -26,7 +26,10 @@ interface ICreate2Deployer { interface IProxyAdmin { function upgrade(address _proxy, address _implementation) external; - function upgradeAndCall(address _proxy, address _implementation, bytes memory _data) external payable returns (bytes memory); + function upgradeAndCall(address _proxy, address _implementation, bytes memory _data) + external + payable + returns (bytes memory); } contract RevenueShareUpgradePathTest is Test { @@ -338,10 +341,7 @@ contract RevenueShareUpgradePathTest is Test { /// @notice Verify the target address is the proxy admin /// @param _to The target address function _assertIsProxyAdmin(address _to) internal pure { - assertTrue( - _to == PROXY_ADMIN, - "Upgrade should target the proxy admin" - ); + assertTrue(_to == PROXY_ADMIN, "Upgrade should target the proxy admin"); } /// @notice Expect the portal events @@ -355,7 +355,9 @@ contract RevenueShareUpgradePathTest is Test { bytes memory _opaqueData = abi.encodePacked(uint256(0), uint256(0), _actualGasLimit, _isCreation, _data); vm.expectEmit(true, true, true, true, PORTAL); - emit TransactionDeposited(AddressAliasHelper.applyL1ToL2Alias(PROXY_ADMIN_OWNER), _to, DEPOSIT_VERSION, _opaqueData); + emit TransactionDeposited( + AddressAliasHelper.applyL1ToL2Alias(PROXY_ADMIN_OWNER), _to, DEPOSIT_VERSION, _opaqueData + ); } } } From 68f0b51f213c12f2198c3d1edba1d42d71b2463f Mon Sep 17 00:00:00 2001 From: 0xchin Date: Thu, 16 Oct 2025 13:28:48 -0300 Subject: [PATCH 44/52] fix: broken regression tests --- test/tasks/Regression.t.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/tasks/Regression.t.sol b/test/tasks/Regression.t.sol index b5cf29ec92..3ee2303357 100644 --- a/test/tasks/Regression.t.sol +++ b/test/tasks/Regression.t.sol @@ -899,7 +899,7 @@ contract RegressionTest is Test { function testRegressionCallDataMatches_DeployFeesDepositor() public { string memory taskConfigFilePath = "test/tasks/example/eth/016-deploy-fees-depositor/config.toml"; string memory expectedCallData = - "0x174dea7100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000010400000000000000000000000000000000000000000000000000000000000001e8000000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000f2466cfa0570000000000000000000000000000000000000000000000000000000000000000666565732d6465706f7369746f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000e9660a060405234801561001057600080fd5b50600160805261001e610023565b6100e3565b600054610100900460ff161561008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156100e1576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051610d9161010560003960008181610274015261048e0152610d916000f3fe6080604052600436106100cb5760003560e01c8063645006ca11610074578063a2a956171161004e578063a2a9561714610425578063dad544e014610445578063f68016b71461045a57600080fd5b8063645006ca1461038657806366125607146103c85780637b11936e146103e857600080fd5b80633e47158c116100a55780633e47158c146102fb57806352d84c621461031057806354fd4d501461033057600080fd5b80630de2db4d1461024057806338d38c97146102605780633cb747bf146102a357600080fd5b3661023b576040805134815247602082018190529133917f363f315f930a17d1266b86a20d6dd34b1cfbc5a9db9f13a65d06a689c3a2af8a910160405180910390a26001546bffffffffffffffffffffffff16811061023957600154600080546002546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff6c0100000000000000000000000090950485166004820181905260606024830152606482019490945263ffffffff90911660448201529192620100009091041690633dbb202b9084906084016000604051808303818588803b1580156101ce57600080fd5b505af11580156101e2573d6000803e3d6000fd5b50505050508073ffffffffffffffffffffffffffffffffffffffff167f2acaf92365a0b69fb3570802396f62d51aabccd684036b72c3ce78699425e7ee8360405161022f91815260200190565b60405180910390a2505b005b600080fd5b34801561024c57600080fd5b5061023961025b366004610bde565b61048c565b34801561026c57600080fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020015b60405180910390f35b3480156102af57600080fd5b506000546102d69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161029a565b34801561030757600080fd5b506102d661069e565b34801561031c57600080fd5b5061023961032b366004610c36565b6108a9565b34801561033c57600080fd5b506103796040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161029a9190610c58565b34801561039257600080fd5b506001546103ab906bffffffffffffffffffffffff1681565b6040516bffffffffffffffffffffffff909116815260200161029a565b3480156103d457600080fd5b506102396103e3366004610ccb565b610928565b3480156103f457600080fd5b506001546102d6906c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561043157600080fd5b50610239610440366004610ce8565b6109af565b34801561045157600080fd5b506102d6610a2e565b34801561046657600080fd5b506002546104779063ffffffff1681565b60405163ffffffff909116815260200161029a565b7f0000000000000000000000000000000000000000000000000000000000000000600054610100900460ff161580156104cc575060005460ff8083169116105b61055c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055610595610aab565b6000805473ffffffffffffffffffffffffffffffffffffffff8681166c01000000000000000000000000026bffffffffffffffffffffffff8916176001556002805463ffffffff87167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000009091161790557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9086166201000002167fffffffffffffffffffff000000000000000000000000000000000000000000ff9091161790556040517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989061068f90839060ff91909116815260200190565b60405180910390a15050505050565b6000806106c97fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff8116156106ec57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000081525051600261072f9190610d03565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000919091179061078a906060015b604051602081830303815290604052805190602001205490565b146107c1576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513060208201526001918101919091526000906107e390606001610770565b905073ffffffffffffffffffffffffffffffffffffffff811615610877578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108709190610d67565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108b1610b2e565b6002805463ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000083168117909355604080519190921680825260208201939093527f84858bb3fb3ecf87e268ebef250ef9ad9cd53ef7973ef7a0ec9d89470bb00a8091015b60405180910390a15050565b610930610b2e565b6001805473ffffffffffffffffffffffffffffffffffffffff8381166c010000000000000000000000008181026bffffffffffffffffffffffff85161790945560408051949093049091168084526020840191909152917f158f04d12e0403fdd63fbced694e8f70d3b87d04d8e2dfad526f5fcf6e49bbcf910161091c565b6109b7610b2e565b600180546bffffffffffffffffffffffff8381167fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083168117909355604080519190921680825260208201939093527f132832be4270c0d1573ca543c41517dd443fe9daf5f21a9c74940e6db282e229910161091c565b6000610a3861069e565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa69190610d67565b905090565b33610ab461069e565b73ffffffffffffffffffffffffffffffffffffffff1614158015610af5575033610adc610a2e565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610b2c576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b33610b37610a2e565b73ffffffffffffffffffffffffffffffffffffffff1614610b2c576040517f7f12c64b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356bffffffffffffffffffffffff81168114610ba057600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610bc757600080fd5b50565b803563ffffffff81168114610ba057600080fd5b60008060008060808587031215610bf457600080fd5b610bfd85610b84565b93506020850135610c0d81610ba5565b92506040850135610c1d81610ba5565b9150610c2b60608601610bca565b905092959194509250565b600060208284031215610c4857600080fd5b610c5182610bca565b9392505050565b600060208083528351808285015260005b81811015610c8557858101830151858201604001528201610c69565b81811115610c97576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600060208284031215610cdd57600080fd5b8135610c5181610ba5565b600060208284031215610cfa57600080fd5b610c5182610b84565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610d62577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500290565b600060208284031215610d7957600080fd5b8151610c5181610ba556fea164736f6c634300080f000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000d8466cfa0570000000000000000000000000000000000000000000000000000000000000000666565732d6465706f7369746f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000ce760806040523480156200001157600080fd5b5060405162000cc738038062000cc783398181016040528101906200003791906200016f565b62000048816200004f60201b60201c565b50620001df565b600062000061620000ce60201b60201c565b905060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b90508281557f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f8284604051620000c1929190620001b2565b60405180910390a1505050565b60008060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b905080549150819250505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000137826200010a565b9050919050565b62000149816200012a565b81146200015557600080fd5b50565b60008151905062000169816200013e565b92915050565b60006020828403121562000188576200018762000105565b5b6000620001988482850162000158565b91505092915050565b620001ac816200012a565b82525050565b6000604082019050620001c96000830185620001a1565b620001d86020830184620001a1565b9392505050565b610ad880620001ef6000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100675780634f1ef286146100905780635c60da1b146100c05780638f283970146100eb578063f851a440146101145761005d565b3661005d5761005b61013f565b005b61006561013f565b005b34801561007357600080fd5b5061008e60048036038101906100899190610715565b6101dc565b005b6100aa60048036038101906100a591906107a7565b610268565b6040516100b791906108a0565b60405180910390f35b3480156100cc57600080fd5b506100d56103ae565b6040516100e291906108d1565b60405180910390f35b3480156100f757600080fd5b50610112600480360381019061010d9190610715565b61043d565b005b34801561012057600080fd5b506101296104c9565b60405161013691906108d1565b60405180910390f35b6000610149610558565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101b19061096f565b60405180910390fd5b3660008037600080366000845af43d6000803e806101d7573d6000fd5b3d6000f35b6101e461058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102495750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561025c57610257816105c6565b610265565b61026461013f565b5b50565b606061027261058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102d75750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561039e576102e5846105c6565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161030f9291906109ce565b600060405180830381855af49150503d806000811461034a576040519150601f19603f3d011682016040523d82523d6000602084013e61034f565b606091505b509150915081610394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038b90610a59565b60405180910390fd5b80925050506103a7565b6103a661013f565b5b9392505050565b60006103b861058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061041d5750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156104315761042a610558565b905061043a565b61043961013f565b5b90565b61044561058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104aa5750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156104bd576104b881610638565b6104c6565b6104c561013f565b5b50565b60006104d361058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806105385750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561054c5761054561058f565b9050610555565b61055461013f565b5b90565b60008060007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150819250505090565b60008060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b905080549150819250505090565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181558173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25050565b600061064261058f565b905060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b90508281557f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f82846040516106a0929190610a79565b60405180910390a1505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106e2826106b7565b9050919050565b6106f2816106d7565b81146106fd57600080fd5b50565b60008135905061070f816106e9565b92915050565b60006020828403121561072b5761072a6106ad565b5b600061073984828501610700565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261076757610766610742565b5b8235905067ffffffffffffffff81111561078457610783610747565b5b6020830191508360018202830111156107a05761079f61074c565b5b9250929050565b6000806000604084860312156107c0576107bf6106ad565b5b60006107ce86828701610700565b935050602084013567ffffffffffffffff8111156107ef576107ee6106b2565b5b6107fb86828701610751565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b83811015610841578082015181840152602081019050610826565b83811115610850576000848401525b50505050565b6000601f19601f8301169050919050565b600061087282610807565b61087c8185610812565b935061088c818560208601610823565b61089581610856565b840191505092915050565b600060208201905081810360008301526108ba8184610867565b905092915050565b6108cb816106d7565b82525050565b60006020820190506108e660008301846108c2565b92915050565b600082825260208201905092915050565b7f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160008201527f6c697a6564000000000000000000000000000000000000000000000000000000602082015250565b60006109596025836108ec565b9150610964826108fd565b604082019050919050565b600060208201905081810360008301526109888161094c565b9050919050565b600081905092915050565b82818337600083830152505050565b60006109b5838561098f565b93506109c283858461099a565b82840190509392505050565b60006109db8284866109a9565b91508190509392505050565b7f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560008201527f6d656e746174696f6e20636f6e7472616374206661696c656400000000000000602082015250565b6000610a436039836108ec565b9150610a4e826109e7565b604082019050919050565b60006020820190508181036000830152610a7281610a36565b9050919050565b6000604082019050610a8e60008301856108c2565b610a9b60208301846108c2565b939250505056fea2646970667358221220154d9317746aa0e4cac83ccac5a296d517da380b7a9bb2889947cfba8d5a8bc164736f6c634300080f00330000000000000000000000005a0aae59d09fccbddb6c6cceb07b7279367c3d2a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032ecd94bbfb350f8aafb70dfba1f4d7fcbc5065b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001044f1ef28600000000000000000000000090a79d28ad7f6d472ad1cfe3bad65204ab2969a2000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000840de2db4d0000000000000000000000000000000000000000000000004563918244f400000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000493e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + "0x174dea7100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000010400000000000000000000000000000000000000000000000000000000000001e8000000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000f2466cfa0570000000000000000000000000000000000000000000000000000000000000000666565732d6465706f7369746f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000e9660a060405234801561001057600080fd5b50600160805261001e610023565b6100e3565b600054610100900460ff161561008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156100e1576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051610d9161010560003960008181610274015261048e0152610d916000f3fe6080604052600436106100cb5760003560e01c8063645006ca11610074578063a2a956171161004e578063a2a9561714610425578063dad544e014610445578063f68016b71461045a57600080fd5b8063645006ca1461038657806366125607146103c85780637b11936e146103e857600080fd5b80633e47158c116100a55780633e47158c146102fb57806352d84c621461031057806354fd4d501461033057600080fd5b80630de2db4d1461024057806338d38c97146102605780633cb747bf146102a357600080fd5b3661023b576040805134815247602082018190529133917f363f315f930a17d1266b86a20d6dd34b1cfbc5a9db9f13a65d06a689c3a2af8a910160405180910390a26001546bffffffffffffffffffffffff16811061023957600154600080546002546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff6c0100000000000000000000000090950485166004820181905260606024830152606482019490945263ffffffff90911660448201529192620100009091041690633dbb202b9084906084016000604051808303818588803b1580156101ce57600080fd5b505af11580156101e2573d6000803e3d6000fd5b50505050508073ffffffffffffffffffffffffffffffffffffffff167f2acaf92365a0b69fb3570802396f62d51aabccd684036b72c3ce78699425e7ee8360405161022f91815260200190565b60405180910390a2505b005b600080fd5b34801561024c57600080fd5b5061023961025b366004610bde565b61048c565b34801561026c57600080fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020015b60405180910390f35b3480156102af57600080fd5b506000546102d69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161029a565b34801561030757600080fd5b506102d661069e565b34801561031c57600080fd5b5061023961032b366004610c36565b6108a9565b34801561033c57600080fd5b506103796040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161029a9190610c58565b34801561039257600080fd5b506001546103ab906bffffffffffffffffffffffff1681565b6040516bffffffffffffffffffffffff909116815260200161029a565b3480156103d457600080fd5b506102396103e3366004610ccb565b610928565b3480156103f457600080fd5b506001546102d6906c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561043157600080fd5b50610239610440366004610ce8565b6109af565b34801561045157600080fd5b506102d6610a2e565b34801561046657600080fd5b506002546104779063ffffffff1681565b60405163ffffffff909116815260200161029a565b7f0000000000000000000000000000000000000000000000000000000000000000600054610100900460ff161580156104cc575060005460ff8083169116105b61055c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055610595610aab565b6000805473ffffffffffffffffffffffffffffffffffffffff8681166c01000000000000000000000000026bffffffffffffffffffffffff8916176001556002805463ffffffff87167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000009091161790557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9086166201000002167fffffffffffffffffffff000000000000000000000000000000000000000000ff9091161790556040517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989061068f90839060ff91909116815260200190565b60405180910390a15050505050565b6000806106c97fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff8116156106ec57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000081525051600261072f9190610d03565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000919091179061078a906060015b604051602081830303815290604052805190602001205490565b146107c1576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513060208201526001918101919091526000906107e390606001610770565b905073ffffffffffffffffffffffffffffffffffffffff811615610877578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108709190610d67565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108b1610b2e565b6002805463ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000083168117909355604080519190921680825260208201939093527f84858bb3fb3ecf87e268ebef250ef9ad9cd53ef7973ef7a0ec9d89470bb00a8091015b60405180910390a15050565b610930610b2e565b6001805473ffffffffffffffffffffffffffffffffffffffff8381166c010000000000000000000000008181026bffffffffffffffffffffffff85161790945560408051949093049091168084526020840191909152917f158f04d12e0403fdd63fbced694e8f70d3b87d04d8e2dfad526f5fcf6e49bbcf910161091c565b6109b7610b2e565b600180546bffffffffffffffffffffffff8381167fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083168117909355604080519190921680825260208201939093527f132832be4270c0d1573ca543c41517dd443fe9daf5f21a9c74940e6db282e229910161091c565b6000610a3861069e565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa69190610d67565b905090565b33610ab461069e565b73ffffffffffffffffffffffffffffffffffffffff1614158015610af5575033610adc610a2e565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610b2c576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b33610b37610a2e565b73ffffffffffffffffffffffffffffffffffffffff1614610b2c576040517f7f12c64b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356bffffffffffffffffffffffff81168114610ba057600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610bc757600080fd5b50565b803563ffffffff81168114610ba057600080fd5b60008060008060808587031215610bf457600080fd5b610bfd85610b84565b93506020850135610c0d81610ba5565b92506040850135610c1d81610ba5565b9150610c2b60608601610bca565b905092959194509250565b600060208284031215610c4857600080fd5b610c5182610bca565b9392505050565b600060208083528351808285015260005b81811015610c8557858101830151858201604001528201610c69565b81811115610c97576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600060208284031215610cdd57600080fd5b8135610c5181610ba5565b600060208284031215610cfa57600080fd5b610c5182610b84565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610d62577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500290565b600060208284031215610d7957600080fd5b8151610c5181610ba556fea164736f6c634300080f000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000d8466cfa0570000000000000000000000000000000000000000000000000000000000000000666565732d6465706f7369746f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000ce760806040523480156200001157600080fd5b5060405162000cc738038062000cc783398181016040528101906200003791906200016f565b62000048816200004f60201b60201c565b50620001df565b600062000061620000ce60201b60201c565b905060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b90508281557f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f8284604051620000c1929190620001b2565b60405180910390a1505050565b60008060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b905080549150819250505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000137826200010a565b9050919050565b62000149816200012a565b81146200015557600080fd5b50565b60008151905062000169816200013e565b92915050565b60006020828403121562000188576200018762000105565b5b6000620001988482850162000158565b91505092915050565b620001ac816200012a565b82525050565b6000604082019050620001c96000830185620001a1565b620001d86020830184620001a1565b9392505050565b610ad880620001ef6000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100675780634f1ef286146100905780635c60da1b146100c05780638f283970146100eb578063f851a440146101145761005d565b3661005d5761005b61013f565b005b61006561013f565b005b34801561007357600080fd5b5061008e60048036038101906100899190610715565b6101dc565b005b6100aa60048036038101906100a591906107a7565b610268565b6040516100b791906108a0565b60405180910390f35b3480156100cc57600080fd5b506100d56103ae565b6040516100e291906108d1565b60405180910390f35b3480156100f757600080fd5b50610112600480360381019061010d9190610715565b61043d565b005b34801561012057600080fd5b506101296104c9565b60405161013691906108d1565b60405180910390f35b6000610149610558565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101b19061096f565b60405180910390fd5b3660008037600080366000845af43d6000803e806101d7573d6000fd5b3d6000f35b6101e461058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102495750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561025c57610257816105c6565b610265565b61026461013f565b5b50565b606061027261058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102d75750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561039e576102e5846105c6565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161030f9291906109ce565b600060405180830381855af49150503d806000811461034a576040519150601f19603f3d011682016040523d82523d6000602084013e61034f565b606091505b509150915081610394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038b90610a59565b60405180910390fd5b80925050506103a7565b6103a661013f565b5b9392505050565b60006103b861058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061041d5750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156104315761042a610558565b905061043a565b61043961013f565b5b90565b61044561058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104aa5750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156104bd576104b881610638565b6104c6565b6104c561013f565b5b50565b60006104d361058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806105385750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561054c5761054561058f565b9050610555565b61055461013f565b5b90565b60008060007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150819250505090565b60008060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b905080549150819250505090565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181558173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25050565b600061064261058f565b905060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b90508281557f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f82846040516106a0929190610a79565b60405180910390a1505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106e2826106b7565b9050919050565b6106f2816106d7565b81146106fd57600080fd5b50565b60008135905061070f816106e9565b92915050565b60006020828403121561072b5761072a6106ad565b5b600061073984828501610700565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261076757610766610742565b5b8235905067ffffffffffffffff81111561078457610783610747565b5b6020830191508360018202830111156107a05761079f61074c565b5b9250929050565b6000806000604084860312156107c0576107bf6106ad565b5b60006107ce86828701610700565b935050602084013567ffffffffffffffff8111156107ef576107ee6106b2565b5b6107fb86828701610751565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b83811015610841578082015181840152602081019050610826565b83811115610850576000848401525b50505050565b6000601f19601f8301169050919050565b600061087282610807565b61087c8185610812565b935061088c818560208601610823565b61089581610856565b840191505092915050565b600060208201905081810360008301526108ba8184610867565b905092915050565b6108cb816106d7565b82525050565b60006020820190506108e660008301846108c2565b92915050565b600082825260208201905092915050565b7f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160008201527f6c697a6564000000000000000000000000000000000000000000000000000000602082015250565b60006109596025836108ec565b9150610964826108fd565b604082019050919050565b600060208201905081810360008301526109888161094c565b9050919050565b600081905092915050565b82818337600083830152505050565b60006109b5838561098f565b93506109c283858461099a565b82840190509392505050565b60006109db8284866109a9565b91508190509392505050565b7f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560008201527f6d656e746174696f6e20636f6e7472616374206661696c656400000000000000602082015250565b6000610a436039836108ec565b9150610a4e826109e7565b604082019050919050565b60006020820190508181036000830152610a7281610a36565b9050919050565b6000604082019050610a8e60008301856108c2565b610a9b60208301846108c2565b939250505056fea2646970667358221220e170e6bf8ee3cc199be5ea3ca30084b98725d89b560e407f600f4a174236633364736f6c634300080f00330000000000000000000000005a0aae59d09fccbddb6c6cceb07b7279367c3d2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa7da4552791535ae416525d695a85743f40624300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001044f1ef28600000000000000000000000090a79d28ad7f6d472ad1cfe3bad65204ab2969a2000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000840de2db4d0000000000000000000000000000000000000000000000004563918244f400000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000493e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; MultisigTask multisigTask = new DeployFeesDepositor(); address rootSafe = address(0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A); // L1PAO address securityCouncilChildMultisig = address(0xc2819DC788505Aac350142A7A707BF9D03E3Bd03); @@ -912,10 +912,10 @@ contract RegressionTest is Test { string[] memory expectedDataToSign = new string[](2); // Foundation expectedDataToSign[0] = - "0x1901a4a9c312badf3fcaa05eafe5dc9bee8bd9316c78ee8b0bebe3115bb21b732672145a6a0f915fed1b5793937cb6d6cba1ec86fd6563b0315d14f55a409de52ab9"; + "0x1901a4a9c312badf3fcaa05eafe5dc9bee8bd9316c78ee8b0bebe3115bb21b7326728b096f6bceaab1716dfe8e85bae705192df4b5dae6e3b94d58bdf567edb6bfef"; // Security Council expectedDataToSign[1] = - "0x1901df53d510b56e539b90b369ef08fce3631020fbf921e3136ea5f8747c20bce9673ef6274f3fe58ee20ab2931fc049b8a5af8bd6319918f91e2c9951e8630f9247"; + "0x1901df53d510b56e539b90b369ef08fce3631020fbf921e3136ea5f8747c20bce967e5d2666095a6ced42244873f800e6714389265e35cf0e8e9e5236e720601e2b6"; _assertDataToSignNestedMultisig(multisigTask, actions, expectedDataToSign, MULTICALL3_ADDRESS, rootSafe); } From 338981ac84e29cb7eabe942c4216c6ed4e9deec2 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Thu, 16 Oct 2025 17:04:44 -0300 Subject: [PATCH 45/52] chore: improve vars naming' --- test/integration/RevenueShareIntegration.t.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/integration/RevenueShareIntegration.t.sol b/test/integration/RevenueShareIntegration.t.sol index 86c1dcbb49..f085893355 100644 --- a/test/integration/RevenueShareIntegration.t.sol +++ b/test/integration/RevenueShareIntegration.t.sol @@ -41,7 +41,7 @@ contract RevenueShareIntegrationTest is IntegrationBase { // Fork IDs uint256 internal _mainnetForkId; - uint256 internal _optimismForkId; + uint256 internal _l2ForkId; // L2 predeploys /// @notice Address of the Sequencer Fee Vault Predeploy on L2. @@ -63,7 +63,7 @@ contract RevenueShareIntegrationTest is IntegrationBase { function setUp() public { _mainnetForkId = vm.createFork("http://127.0.0.1:8545"); - _optimismForkId = vm.createFork("http://127.0.0.1:9545"); + _l2ForkId = vm.createFork("http://127.0.0.1:9545"); vm.selectFork(_mainnetForkId); template = new RevenueShareV100UpgradePath(); } @@ -77,7 +77,7 @@ contract RevenueShareIntegrationTest is IntegrationBase { // Step 2: Relay messages from L1 to L2 // Pass true for _isSimulate since simulate() emits events twice - _relayAllMessages(_optimismForkId, true); + _relayAllMessages(_l2ForkId, true); // Step 3: Assert the state of the L2 contracts string memory _config = vm.readFile(_configPath); @@ -114,7 +114,7 @@ contract RevenueShareIntegrationTest is IntegrationBase { // Step 2: Relay messages from L1 to L2 // Pass true for _isSimulate since simulate() emits events twice - _relayAllMessages(_optimismForkId, true); + _relayAllMessages(_l2ForkId, true); // Step 3: Assert the state of the L2 contracts string memory _config = vm.readFile(_configPath); From c5c2ef0e9600f71acf528bb5623b4d1d9bc3a6af Mon Sep 17 00:00:00 2001 From: 0xchin Date: Thu, 16 Oct 2025 17:05:18 -0300 Subject: [PATCH 46/52] chore: remove unused imports --- test/integration/RevenueShareIntegration.t.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/test/integration/RevenueShareIntegration.t.sol b/test/integration/RevenueShareIntegration.t.sol index f085893355..870cb82927 100644 --- a/test/integration/RevenueShareIntegration.t.sol +++ b/test/integration/RevenueShareIntegration.t.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import {console2} from "forge-std/console2.sol"; import {RevenueShareV100UpgradePath} from "src/template/RevenueShareUpgradePath.sol"; import {Action} from "src/libraries/MultisigTypes.sol"; import {IntegrationBase} from "./IntegrationBase.t.sol"; From 72c41b8c59bb0f7fb5d6260a48c3a4c1bfa5880e Mon Sep 17 00:00:00 2001 From: 0xchin Date: Thu, 16 Oct 2025 17:06:33 -0300 Subject: [PATCH 47/52] docs: add natspec --- test/integration/RevenueShareIntegration.t.sol | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/integration/RevenueShareIntegration.t.sol b/test/integration/RevenueShareIntegration.t.sol index 870cb82927..91519f9dc2 100644 --- a/test/integration/RevenueShareIntegration.t.sol +++ b/test/integration/RevenueShareIntegration.t.sol @@ -67,6 +67,7 @@ contract RevenueShareIntegrationTest is IntegrationBase { template = new RevenueShareV100UpgradePath(); } + /// @notice Test the integration of the revenue share system when the chain is opting in function test_optInRevenueShare_integration() public { string memory _configPath = "test/tasks/example/eth/015-revenue-share-upgrade/config.toml"; @@ -104,6 +105,7 @@ contract RevenueShareIntegrationTest is IntegrationBase { _assertFeeVaultsState(true, _config); } + /// @notice Test the integration of the revenue share system when the chain is opting out function test_optOutRevenueShare_integration() public { string memory _configPath = "test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml"; @@ -126,6 +128,10 @@ contract RevenueShareIntegrationTest is IntegrationBase { _assertFeeVaultsState(false, _config); } + /// @notice Assert the configuration of the fee vaults + /// @param _isOptIn Whether the chain is opting in to use the Fee Splitter + /// @param _config The configuration of the fee vaults + /// @dev Ensures both the legacy and the new getters return the same value function _assertFeeVaultsState(bool _isOptIn, string memory _config) internal { if (_isOptIn) { _assertVaultGetters(SEQUENCER_FEE_VAULT, FEE_SPLITTER, WithdrawalNetwork.L2, 0); From 3f639a0a7a46bd7ee66388ebd3ddbc9efa83c83a Mon Sep 17 00:00:00 2001 From: 0xchin Date: Thu, 16 Oct 2025 17:35:04 -0300 Subject: [PATCH 48/52] test: assert correct calculator address when opting in --- test/integration/RevenueShareIntegration.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/RevenueShareIntegration.t.sol b/test/integration/RevenueShareIntegration.t.sol index 91519f9dc2..abe9fe1216 100644 --- a/test/integration/RevenueShareIntegration.t.sol +++ b/test/integration/RevenueShareIntegration.t.sol @@ -98,7 +98,7 @@ contract RevenueShareIntegrationTest is IntegrationBase { ); // Fee Splitter: check calculator is set - assertNotEq(IFeeSplitter(FEE_SPLITTER).sharesCalculator(), address(0)); + assertEq(IFeeSplitter(FEE_SPLITTER).sharesCalculator(), REV_SHARE_CALCULATOR); // Vaults: recipient should be fee splitter, withdrawal network should be L2, min withdrawal amount 0 // getters for legacy and the new values should be the same From a23fc52fddbb113aa52a69529e07bfabae86fdac Mon Sep 17 00:00:00 2001 From: Chiin <77933451+0xChin@users.noreply.github.com> Date: Thu, 16 Oct 2025 17:56:44 -0300 Subject: [PATCH 49/52] chore: improve function modifiers Co-authored-by: Disco <131301107+0xDiscotech@users.noreply.github.com> Signed-off-by: Chiin <77933451+0xChin@users.noreply.github.com> --- test/integration/IntegrationBase.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/IntegrationBase.t.sol b/test/integration/IntegrationBase.t.sol index c5c26e1ec4..5a478bfb83 100644 --- a/test/integration/IntegrationBase.t.sol +++ b/test/integration/IntegrationBase.t.sol @@ -110,7 +110,7 @@ abstract contract IntegrationBase is Test { uint64 _gasLimit, bytes memory _data, uint256 _txNumber - ) internal view { + ) internal pure { if (_data.length >= 4) { bytes4 _selector; assembly { From 1684c110ab35148c196020c7e8c0065c2f45d666 Mon Sep 17 00:00:00 2001 From: Chiin <77933451+0xChin@users.noreply.github.com> Date: Thu, 16 Oct 2025 17:56:55 -0300 Subject: [PATCH 50/52] chore: improve function modifiers Co-authored-by: Disco <131301107+0xDiscotech@users.noreply.github.com> Signed-off-by: Chiin <77933451+0xChin@users.noreply.github.com> --- test/integration/RevenueShareIntegration.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/RevenueShareIntegration.t.sol b/test/integration/RevenueShareIntegration.t.sol index abe9fe1216..d2a14852d6 100644 --- a/test/integration/RevenueShareIntegration.t.sol +++ b/test/integration/RevenueShareIntegration.t.sol @@ -177,7 +177,7 @@ contract RevenueShareIntegrationTest is IntegrationBase { address _recipient, WithdrawalNetwork _withdrawalNetwork, uint256 _minWithdrawalAmount - ) internal { + ) internal view { assertEq(IFeeVault(_vault).recipient(), _recipient); assertEq(uint256(IFeeVault(_vault).withdrawalNetwork()), uint256(_withdrawalNetwork)); assertEq(IFeeVault(_vault).minWithdrawalAmount(), _minWithdrawalAmount); From b79460791ba954d96766c05a6d357863ee273c46 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Thu, 16 Oct 2025 18:01:20 -0300 Subject: [PATCH 51/52] chore: improve function modifiers --- test/integration/RevenueShareIntegration.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/RevenueShareIntegration.t.sol b/test/integration/RevenueShareIntegration.t.sol index d2a14852d6..e216402bf4 100644 --- a/test/integration/RevenueShareIntegration.t.sol +++ b/test/integration/RevenueShareIntegration.t.sol @@ -132,7 +132,7 @@ contract RevenueShareIntegrationTest is IntegrationBase { /// @param _isOptIn Whether the chain is opting in to use the Fee Splitter /// @param _config The configuration of the fee vaults /// @dev Ensures both the legacy and the new getters return the same value - function _assertFeeVaultsState(bool _isOptIn, string memory _config) internal { + function _assertFeeVaultsState(bool _isOptIn, string memory _config) internal view { if (_isOptIn) { _assertVaultGetters(SEQUENCER_FEE_VAULT, FEE_SPLITTER, WithdrawalNetwork.L2, 0); _assertVaultGetters(OPERATOR_FEE_VAULT, FEE_SPLITTER, WithdrawalNetwork.L2, 0); From 7ec5820d47b97eb21b40e964b3c95059eea51536 Mon Sep 17 00:00:00 2001 From: 0xchin Date: Thu, 16 Oct 2025 18:25:00 -0300 Subject: [PATCH 52/52] test: fix fees depositor regression tests --- src/template/DeployFeesDepositor.sol | 5 ++--- src/template/LateOptInRevenueShare.sol | 2 +- test/tasks/Regression.t.sol | 6 +++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/template/DeployFeesDepositor.sol b/src/template/DeployFeesDepositor.sol index 4402b78b4f..9c24d15ff3 100644 --- a/src/template/DeployFeesDepositor.sol +++ b/src/template/DeployFeesDepositor.sol @@ -70,7 +70,7 @@ contract DeployFeesDepositor is SimpleTaskBase { /// @notice Sets up the template with implementation configurations from a TOML file. /// State overrides are not applied yet. Keep this in mind when performing various pre-simulation assertions in this function. - function _templateSetup(string memory _taskConfigFilePath, address _rootSafe) internal override { + function _templateSetup(string memory _taskConfigFilePath, address) internal override { string memory tomlContent = vm.readFile(_taskConfigFilePath); salt = tomlContent.readString(".salt"); require(bytes(salt).length > 0, "salt must be set"); @@ -109,8 +109,7 @@ contract DeployFeesDepositor is SimpleTaskBase { /// implicitly because if the calculated address of the Proxy would differ from the one we /// calculated, the task would fail on the check for code to be present, since the changes /// in build function revert and the parent contract validates that accessed accounts have code. - /// @param _rootSafe The address of the root safe (unused in this implementation). - function _build(address _rootSafe) internal override { + function _build(address) internal override { // Deploy the FeesDepositor implementation contract using CREATE2 ICreate2Deployer(CREATE2_DEPLOYER).deploy(0, bytes32(bytes(salt)), RevShareCodeRepo.feesDepositorCreationCode); diff --git a/src/template/LateOptInRevenueShare.sol b/src/template/LateOptInRevenueShare.sol index 8d5c9e3ce6..c41fad67df 100644 --- a/src/template/LateOptInRevenueShare.sol +++ b/src/template/LateOptInRevenueShare.sol @@ -126,7 +126,7 @@ contract LateOptInRevenueShare is SimpleTaskBase { /// @notice Sets up the template with implementation configurations from a TOML file. /// State overrides are not applied yet. Keep this in mind when performing various pre-simulation assertions in this function. - function _templateSetup(string memory _taskConfigFilePath, address _rootSafe) internal override { + function _templateSetup(string memory _taskConfigFilePath, address) internal override { string memory _toml = vm.readFile(_taskConfigFilePath); portal = simpleAddrRegistry.get("OptimismPortal"); diff --git a/test/tasks/Regression.t.sol b/test/tasks/Regression.t.sol index b5cf29ec92..3ee2303357 100644 --- a/test/tasks/Regression.t.sol +++ b/test/tasks/Regression.t.sol @@ -899,7 +899,7 @@ contract RegressionTest is Test { function testRegressionCallDataMatches_DeployFeesDepositor() public { string memory taskConfigFilePath = "test/tasks/example/eth/016-deploy-fees-depositor/config.toml"; string memory expectedCallData = - "0x174dea7100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000010400000000000000000000000000000000000000000000000000000000000001e8000000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000f2466cfa0570000000000000000000000000000000000000000000000000000000000000000666565732d6465706f7369746f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000e9660a060405234801561001057600080fd5b50600160805261001e610023565b6100e3565b600054610100900460ff161561008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156100e1576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051610d9161010560003960008181610274015261048e0152610d916000f3fe6080604052600436106100cb5760003560e01c8063645006ca11610074578063a2a956171161004e578063a2a9561714610425578063dad544e014610445578063f68016b71461045a57600080fd5b8063645006ca1461038657806366125607146103c85780637b11936e146103e857600080fd5b80633e47158c116100a55780633e47158c146102fb57806352d84c621461031057806354fd4d501461033057600080fd5b80630de2db4d1461024057806338d38c97146102605780633cb747bf146102a357600080fd5b3661023b576040805134815247602082018190529133917f363f315f930a17d1266b86a20d6dd34b1cfbc5a9db9f13a65d06a689c3a2af8a910160405180910390a26001546bffffffffffffffffffffffff16811061023957600154600080546002546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff6c0100000000000000000000000090950485166004820181905260606024830152606482019490945263ffffffff90911660448201529192620100009091041690633dbb202b9084906084016000604051808303818588803b1580156101ce57600080fd5b505af11580156101e2573d6000803e3d6000fd5b50505050508073ffffffffffffffffffffffffffffffffffffffff167f2acaf92365a0b69fb3570802396f62d51aabccd684036b72c3ce78699425e7ee8360405161022f91815260200190565b60405180910390a2505b005b600080fd5b34801561024c57600080fd5b5061023961025b366004610bde565b61048c565b34801561026c57600080fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020015b60405180910390f35b3480156102af57600080fd5b506000546102d69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161029a565b34801561030757600080fd5b506102d661069e565b34801561031c57600080fd5b5061023961032b366004610c36565b6108a9565b34801561033c57600080fd5b506103796040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161029a9190610c58565b34801561039257600080fd5b506001546103ab906bffffffffffffffffffffffff1681565b6040516bffffffffffffffffffffffff909116815260200161029a565b3480156103d457600080fd5b506102396103e3366004610ccb565b610928565b3480156103f457600080fd5b506001546102d6906c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561043157600080fd5b50610239610440366004610ce8565b6109af565b34801561045157600080fd5b506102d6610a2e565b34801561046657600080fd5b506002546104779063ffffffff1681565b60405163ffffffff909116815260200161029a565b7f0000000000000000000000000000000000000000000000000000000000000000600054610100900460ff161580156104cc575060005460ff8083169116105b61055c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055610595610aab565b6000805473ffffffffffffffffffffffffffffffffffffffff8681166c01000000000000000000000000026bffffffffffffffffffffffff8916176001556002805463ffffffff87167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000009091161790557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9086166201000002167fffffffffffffffffffff000000000000000000000000000000000000000000ff9091161790556040517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989061068f90839060ff91909116815260200190565b60405180910390a15050505050565b6000806106c97fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff8116156106ec57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000081525051600261072f9190610d03565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000919091179061078a906060015b604051602081830303815290604052805190602001205490565b146107c1576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513060208201526001918101919091526000906107e390606001610770565b905073ffffffffffffffffffffffffffffffffffffffff811615610877578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108709190610d67565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108b1610b2e565b6002805463ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000083168117909355604080519190921680825260208201939093527f84858bb3fb3ecf87e268ebef250ef9ad9cd53ef7973ef7a0ec9d89470bb00a8091015b60405180910390a15050565b610930610b2e565b6001805473ffffffffffffffffffffffffffffffffffffffff8381166c010000000000000000000000008181026bffffffffffffffffffffffff85161790945560408051949093049091168084526020840191909152917f158f04d12e0403fdd63fbced694e8f70d3b87d04d8e2dfad526f5fcf6e49bbcf910161091c565b6109b7610b2e565b600180546bffffffffffffffffffffffff8381167fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083168117909355604080519190921680825260208201939093527f132832be4270c0d1573ca543c41517dd443fe9daf5f21a9c74940e6db282e229910161091c565b6000610a3861069e565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa69190610d67565b905090565b33610ab461069e565b73ffffffffffffffffffffffffffffffffffffffff1614158015610af5575033610adc610a2e565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610b2c576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b33610b37610a2e565b73ffffffffffffffffffffffffffffffffffffffff1614610b2c576040517f7f12c64b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356bffffffffffffffffffffffff81168114610ba057600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610bc757600080fd5b50565b803563ffffffff81168114610ba057600080fd5b60008060008060808587031215610bf457600080fd5b610bfd85610b84565b93506020850135610c0d81610ba5565b92506040850135610c1d81610ba5565b9150610c2b60608601610bca565b905092959194509250565b600060208284031215610c4857600080fd5b610c5182610bca565b9392505050565b600060208083528351808285015260005b81811015610c8557858101830151858201604001528201610c69565b81811115610c97576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600060208284031215610cdd57600080fd5b8135610c5181610ba5565b600060208284031215610cfa57600080fd5b610c5182610b84565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610d62577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500290565b600060208284031215610d7957600080fd5b8151610c5181610ba556fea164736f6c634300080f000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000d8466cfa0570000000000000000000000000000000000000000000000000000000000000000666565732d6465706f7369746f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000ce760806040523480156200001157600080fd5b5060405162000cc738038062000cc783398181016040528101906200003791906200016f565b62000048816200004f60201b60201c565b50620001df565b600062000061620000ce60201b60201c565b905060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b90508281557f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f8284604051620000c1929190620001b2565b60405180910390a1505050565b60008060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b905080549150819250505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000137826200010a565b9050919050565b62000149816200012a565b81146200015557600080fd5b50565b60008151905062000169816200013e565b92915050565b60006020828403121562000188576200018762000105565b5b6000620001988482850162000158565b91505092915050565b620001ac816200012a565b82525050565b6000604082019050620001c96000830185620001a1565b620001d86020830184620001a1565b9392505050565b610ad880620001ef6000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100675780634f1ef286146100905780635c60da1b146100c05780638f283970146100eb578063f851a440146101145761005d565b3661005d5761005b61013f565b005b61006561013f565b005b34801561007357600080fd5b5061008e60048036038101906100899190610715565b6101dc565b005b6100aa60048036038101906100a591906107a7565b610268565b6040516100b791906108a0565b60405180910390f35b3480156100cc57600080fd5b506100d56103ae565b6040516100e291906108d1565b60405180910390f35b3480156100f757600080fd5b50610112600480360381019061010d9190610715565b61043d565b005b34801561012057600080fd5b506101296104c9565b60405161013691906108d1565b60405180910390f35b6000610149610558565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101b19061096f565b60405180910390fd5b3660008037600080366000845af43d6000803e806101d7573d6000fd5b3d6000f35b6101e461058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102495750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561025c57610257816105c6565b610265565b61026461013f565b5b50565b606061027261058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102d75750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561039e576102e5846105c6565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161030f9291906109ce565b600060405180830381855af49150503d806000811461034a576040519150601f19603f3d011682016040523d82523d6000602084013e61034f565b606091505b509150915081610394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038b90610a59565b60405180910390fd5b80925050506103a7565b6103a661013f565b5b9392505050565b60006103b861058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061041d5750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156104315761042a610558565b905061043a565b61043961013f565b5b90565b61044561058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104aa5750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156104bd576104b881610638565b6104c6565b6104c561013f565b5b50565b60006104d361058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806105385750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561054c5761054561058f565b9050610555565b61055461013f565b5b90565b60008060007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150819250505090565b60008060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b905080549150819250505090565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181558173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25050565b600061064261058f565b905060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b90508281557f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f82846040516106a0929190610a79565b60405180910390a1505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106e2826106b7565b9050919050565b6106f2816106d7565b81146106fd57600080fd5b50565b60008135905061070f816106e9565b92915050565b60006020828403121561072b5761072a6106ad565b5b600061073984828501610700565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261076757610766610742565b5b8235905067ffffffffffffffff81111561078457610783610747565b5b6020830191508360018202830111156107a05761079f61074c565b5b9250929050565b6000806000604084860312156107c0576107bf6106ad565b5b60006107ce86828701610700565b935050602084013567ffffffffffffffff8111156107ef576107ee6106b2565b5b6107fb86828701610751565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b83811015610841578082015181840152602081019050610826565b83811115610850576000848401525b50505050565b6000601f19601f8301169050919050565b600061087282610807565b61087c8185610812565b935061088c818560208601610823565b61089581610856565b840191505092915050565b600060208201905081810360008301526108ba8184610867565b905092915050565b6108cb816106d7565b82525050565b60006020820190506108e660008301846108c2565b92915050565b600082825260208201905092915050565b7f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160008201527f6c697a6564000000000000000000000000000000000000000000000000000000602082015250565b60006109596025836108ec565b9150610964826108fd565b604082019050919050565b600060208201905081810360008301526109888161094c565b9050919050565b600081905092915050565b82818337600083830152505050565b60006109b5838561098f565b93506109c283858461099a565b82840190509392505050565b60006109db8284866109a9565b91508190509392505050565b7f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560008201527f6d656e746174696f6e20636f6e7472616374206661696c656400000000000000602082015250565b6000610a436039836108ec565b9150610a4e826109e7565b604082019050919050565b60006020820190508181036000830152610a7281610a36565b9050919050565b6000604082019050610a8e60008301856108c2565b610a9b60208301846108c2565b939250505056fea2646970667358221220154d9317746aa0e4cac83ccac5a296d517da380b7a9bb2889947cfba8d5a8bc164736f6c634300080f00330000000000000000000000005a0aae59d09fccbddb6c6cceb07b7279367c3d2a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032ecd94bbfb350f8aafb70dfba1f4d7fcbc5065b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001044f1ef28600000000000000000000000090a79d28ad7f6d472ad1cfe3bad65204ab2969a2000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000840de2db4d0000000000000000000000000000000000000000000000004563918244f400000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000493e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + "0x174dea7100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000010400000000000000000000000000000000000000000000000000000000000001e8000000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000f2466cfa0570000000000000000000000000000000000000000000000000000000000000000666565732d6465706f7369746f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000e9660a060405234801561001057600080fd5b50600160805261001e610023565b6100e3565b600054610100900460ff161561008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156100e1576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051610d9161010560003960008181610274015261048e0152610d916000f3fe6080604052600436106100cb5760003560e01c8063645006ca11610074578063a2a956171161004e578063a2a9561714610425578063dad544e014610445578063f68016b71461045a57600080fd5b8063645006ca1461038657806366125607146103c85780637b11936e146103e857600080fd5b80633e47158c116100a55780633e47158c146102fb57806352d84c621461031057806354fd4d501461033057600080fd5b80630de2db4d1461024057806338d38c97146102605780633cb747bf146102a357600080fd5b3661023b576040805134815247602082018190529133917f363f315f930a17d1266b86a20d6dd34b1cfbc5a9db9f13a65d06a689c3a2af8a910160405180910390a26001546bffffffffffffffffffffffff16811061023957600154600080546002546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff6c0100000000000000000000000090950485166004820181905260606024830152606482019490945263ffffffff90911660448201529192620100009091041690633dbb202b9084906084016000604051808303818588803b1580156101ce57600080fd5b505af11580156101e2573d6000803e3d6000fd5b50505050508073ffffffffffffffffffffffffffffffffffffffff167f2acaf92365a0b69fb3570802396f62d51aabccd684036b72c3ce78699425e7ee8360405161022f91815260200190565b60405180910390a2505b005b600080fd5b34801561024c57600080fd5b5061023961025b366004610bde565b61048c565b34801561026c57600080fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020015b60405180910390f35b3480156102af57600080fd5b506000546102d69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161029a565b34801561030757600080fd5b506102d661069e565b34801561031c57600080fd5b5061023961032b366004610c36565b6108a9565b34801561033c57600080fd5b506103796040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161029a9190610c58565b34801561039257600080fd5b506001546103ab906bffffffffffffffffffffffff1681565b6040516bffffffffffffffffffffffff909116815260200161029a565b3480156103d457600080fd5b506102396103e3366004610ccb565b610928565b3480156103f457600080fd5b506001546102d6906c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561043157600080fd5b50610239610440366004610ce8565b6109af565b34801561045157600080fd5b506102d6610a2e565b34801561046657600080fd5b506002546104779063ffffffff1681565b60405163ffffffff909116815260200161029a565b7f0000000000000000000000000000000000000000000000000000000000000000600054610100900460ff161580156104cc575060005460ff8083169116105b61055c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055610595610aab565b6000805473ffffffffffffffffffffffffffffffffffffffff8681166c01000000000000000000000000026bffffffffffffffffffffffff8916176001556002805463ffffffff87167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000009091161790557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9086166201000002167fffffffffffffffffffff000000000000000000000000000000000000000000ff9091161790556040517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989061068f90839060ff91909116815260200190565b60405180910390a15050505050565b6000806106c97fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff8116156106ec57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000081525051600261072f9190610d03565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000919091179061078a906060015b604051602081830303815290604052805190602001205490565b146107c1576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513060208201526001918101919091526000906107e390606001610770565b905073ffffffffffffffffffffffffffffffffffffffff811615610877578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108709190610d67565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108b1610b2e565b6002805463ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000083168117909355604080519190921680825260208201939093527f84858bb3fb3ecf87e268ebef250ef9ad9cd53ef7973ef7a0ec9d89470bb00a8091015b60405180910390a15050565b610930610b2e565b6001805473ffffffffffffffffffffffffffffffffffffffff8381166c010000000000000000000000008181026bffffffffffffffffffffffff85161790945560408051949093049091168084526020840191909152917f158f04d12e0403fdd63fbced694e8f70d3b87d04d8e2dfad526f5fcf6e49bbcf910161091c565b6109b7610b2e565b600180546bffffffffffffffffffffffff8381167fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083168117909355604080519190921680825260208201939093527f132832be4270c0d1573ca543c41517dd443fe9daf5f21a9c74940e6db282e229910161091c565b6000610a3861069e565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa69190610d67565b905090565b33610ab461069e565b73ffffffffffffffffffffffffffffffffffffffff1614158015610af5575033610adc610a2e565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610b2c576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b33610b37610a2e565b73ffffffffffffffffffffffffffffffffffffffff1614610b2c576040517f7f12c64b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356bffffffffffffffffffffffff81168114610ba057600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610bc757600080fd5b50565b803563ffffffff81168114610ba057600080fd5b60008060008060808587031215610bf457600080fd5b610bfd85610b84565b93506020850135610c0d81610ba5565b92506040850135610c1d81610ba5565b9150610c2b60608601610bca565b905092959194509250565b600060208284031215610c4857600080fd5b610c5182610bca565b9392505050565b600060208083528351808285015260005b81811015610c8557858101830151858201604001528201610c69565b81811115610c97576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600060208284031215610cdd57600080fd5b8135610c5181610ba5565b600060208284031215610cfa57600080fd5b610c5182610b84565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610d62577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500290565b600060208284031215610d7957600080fd5b8151610c5181610ba556fea164736f6c634300080f000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000d8466cfa0570000000000000000000000000000000000000000000000000000000000000000666565732d6465706f7369746f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000ce760806040523480156200001157600080fd5b5060405162000cc738038062000cc783398181016040528101906200003791906200016f565b62000048816200004f60201b60201c565b50620001df565b600062000061620000ce60201b60201c565b905060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b90508281557f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f8284604051620000c1929190620001b2565b60405180910390a1505050565b60008060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b905080549150819250505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000137826200010a565b9050919050565b62000149816200012a565b81146200015557600080fd5b50565b60008151905062000169816200013e565b92915050565b60006020828403121562000188576200018762000105565b5b6000620001988482850162000158565b91505092915050565b620001ac816200012a565b82525050565b6000604082019050620001c96000830185620001a1565b620001d86020830184620001a1565b9392505050565b610ad880620001ef6000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100675780634f1ef286146100905780635c60da1b146100c05780638f283970146100eb578063f851a440146101145761005d565b3661005d5761005b61013f565b005b61006561013f565b005b34801561007357600080fd5b5061008e60048036038101906100899190610715565b6101dc565b005b6100aa60048036038101906100a591906107a7565b610268565b6040516100b791906108a0565b60405180910390f35b3480156100cc57600080fd5b506100d56103ae565b6040516100e291906108d1565b60405180910390f35b3480156100f757600080fd5b50610112600480360381019061010d9190610715565b61043d565b005b34801561012057600080fd5b506101296104c9565b60405161013691906108d1565b60405180910390f35b6000610149610558565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101b19061096f565b60405180910390fd5b3660008037600080366000845af43d6000803e806101d7573d6000fd5b3d6000f35b6101e461058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102495750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561025c57610257816105c6565b610265565b61026461013f565b5b50565b606061027261058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102d75750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561039e576102e5846105c6565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161030f9291906109ce565b600060405180830381855af49150503d806000811461034a576040519150601f19603f3d011682016040523d82523d6000602084013e61034f565b606091505b509150915081610394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038b90610a59565b60405180910390fd5b80925050506103a7565b6103a661013f565b5b9392505050565b60006103b861058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061041d5750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156104315761042a610558565b905061043a565b61043961013f565b5b90565b61044561058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104aa5750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156104bd576104b881610638565b6104c6565b6104c561013f565b5b50565b60006104d361058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806105385750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561054c5761054561058f565b9050610555565b61055461013f565b5b90565b60008060007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150819250505090565b60008060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b905080549150819250505090565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181558173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25050565b600061064261058f565b905060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b90508281557f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f82846040516106a0929190610a79565b60405180910390a1505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106e2826106b7565b9050919050565b6106f2816106d7565b81146106fd57600080fd5b50565b60008135905061070f816106e9565b92915050565b60006020828403121561072b5761072a6106ad565b5b600061073984828501610700565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261076757610766610742565b5b8235905067ffffffffffffffff81111561078457610783610747565b5b6020830191508360018202830111156107a05761079f61074c565b5b9250929050565b6000806000604084860312156107c0576107bf6106ad565b5b60006107ce86828701610700565b935050602084013567ffffffffffffffff8111156107ef576107ee6106b2565b5b6107fb86828701610751565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b83811015610841578082015181840152602081019050610826565b83811115610850576000848401525b50505050565b6000601f19601f8301169050919050565b600061087282610807565b61087c8185610812565b935061088c818560208601610823565b61089581610856565b840191505092915050565b600060208201905081810360008301526108ba8184610867565b905092915050565b6108cb816106d7565b82525050565b60006020820190506108e660008301846108c2565b92915050565b600082825260208201905092915050565b7f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160008201527f6c697a6564000000000000000000000000000000000000000000000000000000602082015250565b60006109596025836108ec565b9150610964826108fd565b604082019050919050565b600060208201905081810360008301526109888161094c565b9050919050565b600081905092915050565b82818337600083830152505050565b60006109b5838561098f565b93506109c283858461099a565b82840190509392505050565b60006109db8284866109a9565b91508190509392505050565b7f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560008201527f6d656e746174696f6e20636f6e7472616374206661696c656400000000000000602082015250565b6000610a436039836108ec565b9150610a4e826109e7565b604082019050919050565b60006020820190508181036000830152610a7281610a36565b9050919050565b6000604082019050610a8e60008301856108c2565b610a9b60208301846108c2565b939250505056fea2646970667358221220e170e6bf8ee3cc199be5ea3ca30084b98725d89b560e407f600f4a174236633364736f6c634300080f00330000000000000000000000005a0aae59d09fccbddb6c6cceb07b7279367c3d2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa7da4552791535ae416525d695a85743f40624300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001044f1ef28600000000000000000000000090a79d28ad7f6d472ad1cfe3bad65204ab2969a2000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000840de2db4d0000000000000000000000000000000000000000000000004563918244f400000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000493e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; MultisigTask multisigTask = new DeployFeesDepositor(); address rootSafe = address(0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A); // L1PAO address securityCouncilChildMultisig = address(0xc2819DC788505Aac350142A7A707BF9D03E3Bd03); @@ -912,10 +912,10 @@ contract RegressionTest is Test { string[] memory expectedDataToSign = new string[](2); // Foundation expectedDataToSign[0] = - "0x1901a4a9c312badf3fcaa05eafe5dc9bee8bd9316c78ee8b0bebe3115bb21b732672145a6a0f915fed1b5793937cb6d6cba1ec86fd6563b0315d14f55a409de52ab9"; + "0x1901a4a9c312badf3fcaa05eafe5dc9bee8bd9316c78ee8b0bebe3115bb21b7326728b096f6bceaab1716dfe8e85bae705192df4b5dae6e3b94d58bdf567edb6bfef"; // Security Council expectedDataToSign[1] = - "0x1901df53d510b56e539b90b369ef08fce3631020fbf921e3136ea5f8747c20bce9673ef6274f3fe58ee20ab2931fc049b8a5af8bd6319918f91e2c9951e8630f9247"; + "0x1901df53d510b56e539b90b369ef08fce3631020fbf921e3136ea5f8747c20bce967e5d2666095a6ced42244873f800e6714389265e35cf0e8e9e5236e720601e2b6"; _assertDataToSignNestedMultisig(multisigTask, actions, expectedDataToSign, MULTICALL3_ADDRESS, rootSafe); }