From 4125cc615cefcdce406d40c3c7032607e1993bd7 Mon Sep 17 00:00:00 2001 From: niha <205694301+0xniha@users.noreply.github.com> Date: Mon, 30 Mar 2026 11:15:41 -0300 Subject: [PATCH 01/15] refactor: gather all config from generate nut bundle script to fix sync issues --- .../scripts/libraries/UpgradeUtils.sol | 67 -- .../scripts/upgrade/GenerateNUTBundle.s.sol | 612 ++++++++++-------- .../upgrades/current-upgrade-bundle.json | 68 +- .../test/L2/fork/L2ForkUpgrade.t.sol | 8 +- .../test/scripts/GenerateNUTBundle.t.sol | 18 +- 5 files changed, 409 insertions(+), 364 deletions(-) diff --git a/packages/contracts-bedrock/scripts/libraries/UpgradeUtils.sol b/packages/contracts-bedrock/scripts/libraries/UpgradeUtils.sol index 0308af3d2d097..55fb62be2dc5a 100644 --- a/packages/contracts-bedrock/scripts/libraries/UpgradeUtils.sol +++ b/packages/contracts-bedrock/scripts/libraries/UpgradeUtils.sol @@ -21,15 +21,6 @@ import { ConditionalDeployer } from "src/L2/ConditionalDeployer.sol"; library UpgradeUtils { Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); - /// @notice The number of implementations deployed in every upgrade. - /// Includes: - /// - 1 StorageSetter - /// - 18 base predeploys - /// - 4 INTEROP predeploys - /// - 2 CGT predeploys (NativeAssetLiquidity, LiquidityController) - /// - 2 CGT variants (L1BlockCGT, L2ToL1MessagePasserCGT) - uint256 internal constant IMPLEMENTATION_COUNT = 27; - /// @notice Gas limits for different types of upgrade transactions. /// @param l2cmDeployment Gas for deploying L2ContractsManager /// @param upgradeExecution Gas for L2ProxyAdmin.upgradePredeploys() call @@ -46,22 +37,6 @@ library UpgradeUtils { uint64 proxyAdminUpgrade; } - /// @notice Returns the total number of transactions for the current upgrade. - /// @dev Total count: - /// - IMPLEMENTATION_COUNT implementation deployments - /// - [KARST] 2 ConditionalDeployer (deployment + upgrade) - /// - [KARST] 1 ProxyAdmin upgrade - /// - 1 L2CM deployment - /// - 1 Upgrade Predeploys call - function getTransactionCount() internal pure returns (uint256 txnCount_) { - if (IMPLEMENTATION_COUNT != 27) { - revert( - "UpgradeUtils: implementation count changed, ensure that the txnCount_ calculation is still correct." - ); - } - txnCount_ = IMPLEMENTATION_COUNT + 5; - } - /// @notice Returns the gas limits for all upgrade transaction types. /// @dev Gas limits are chosen to provide sufficient headroom while being /// conservative enough to fit within the upgrade block gas allocation. @@ -90,48 +65,6 @@ library UpgradeUtils { }); } - /// @notice Returns the array of predeploy names to upgrade. - /// @dev Exception: StorageSetter is not a predeploy, but is upgraded in L2CM too. - /// @return implementations_ Array of implementation names to upgrade. - function getImplementationsNamesToUpgrade() internal pure returns (string[] memory implementations_) { - implementations_ = new string[](IMPLEMENTATION_COUNT); - - // StorageSetter - implementations_[0] = "StorageSetter"; - - // Base predeploys - implementations_[1] = "L2CrossDomainMessenger"; - implementations_[2] = "GasPriceOracle"; - implementations_[3] = "L2StandardBridge"; - implementations_[4] = "SequencerFeeVault"; - implementations_[5] = "OptimismMintableERC20Factory"; - implementations_[6] = "L2ERC721Bridge"; - implementations_[7] = "L1Block"; - implementations_[8] = "L2ToL1MessagePasser"; - implementations_[9] = "OptimismMintableERC721Factory"; - implementations_[10] = "L2ProxyAdmin"; - implementations_[11] = "BaseFeeVault"; - implementations_[12] = "L1FeeVault"; - implementations_[13] = "OperatorFeeVault"; - implementations_[14] = "SchemaRegistry"; - implementations_[15] = "EAS"; - implementations_[16] = "FeeSplitter"; - implementations_[17] = "ConditionalDeployer"; - implementations_[18] = "L2DevFeatureFlags"; - - // INTEROP predeploys - implementations_[19] = "CrossL2Inbox"; - implementations_[20] = "L2ToL2CrossDomainMessenger"; - implementations_[21] = "SuperchainETHBridge"; - implementations_[22] = "ETHLiquidity"; - - // CGT predeploys - implementations_[23] = "L1BlockCGT"; - implementations_[24] = "L2ToL1MessagePasserCGT"; - implementations_[25] = "LiquidityController"; - implementations_[26] = "NativeAssetLiquidity"; - } - /// @notice Uses vm.computeCreate2Address to compute the CREATE2 address for given initcode and salt. /// @dev Uses the DeterministicDeploymentProxy address as the deployer. /// @param _code The contract initcode (creation bytecode). diff --git a/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol b/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol index d3da371ea6cd3..f1537410acb33 100644 --- a/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol +++ b/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol @@ -41,7 +41,8 @@ contract GenerateNUTBundle is Script { /// @param deploymentGasLimit Gas limit for the deployment transaction. /// @param artifactPath Forge artifact path (e.g., "MyContract.sol:MyContract"). /// @param name Human-readable name for the contract. - /// @param args ABI-encoded constructor arguments. + /// @param skipStandardDeploy If true, this implementation is excluded from the standard deployment + /// loop and must be deployed via a custom phase instead (e.g. Phase 1 for Karst). struct ImplementationConfig { address implementation; uint64 deploymentGasLimit; @@ -55,16 +56,19 @@ contract GenerateNUTBundle is Script { /// @notice Expected implementations for the upgrade. L2ContractsManagerTypes.Implementations internal implementations; - /// @notice Implementation configurations. - mapping(string => ImplementationConfig) public implementationConfigs; + /// @notice Ordered list of all implementation configurations. + /// @dev This is the single source of truth for what implementations exist and which ones + /// are deployed. + ImplementationConfig[] internal _implementationConfigs; /// @notice Array of generated transactions. - NetworkUpgradeTxns.NetworkUpgradeTxn[] internal txns; + NetworkUpgradeTxns.NetworkUpgradeTxn[] internal _txns; function setUp() public { - // Clear previous txns: Transactions are pushed to a dynamic array, so we need - // to delete the array to avoid pushing duplicates. - delete txns; + // Clear previous state: dynamic arrays must be deleted to avoid pushing duplicates + // across multiple setUp/run calls. + delete _txns; + delete _implementationConfigs; gasLimits = UpgradeUtils.gasLimits(); } @@ -107,10 +111,10 @@ contract GenerateNUTBundle is Script { _generateUpgradeExecution(); // Copy storage array to memory array for return - uint256 txnsLength = txns.length; + uint256 txnsLength = _txns.length; output_.txns = new NetworkUpgradeTxns.NetworkUpgradeTxn[](txnsLength); for (uint256 i = 0; i < txnsLength; i++) { - output_.txns[i] = txns[i]; + output_.txns[i] = _txns[i]; } _assertValidOutput(output_); @@ -118,17 +122,35 @@ contract GenerateNUTBundle is Script { // Write transactions to artifact with metadata NetworkUpgradeTxns.BundleMetadata memory metadata = NetworkUpgradeTxns.BundleMetadata({ version: BUNDLE_VERSION }); - NetworkUpgradeTxns.writeArtifact(txns, metadata, Constants.CURRENT_BUNDLE_PATH); + NetworkUpgradeTxns.writeArtifact(_txns, metadata, Constants.CURRENT_BUNDLE_PATH); + } + + /// @notice Returns the names of implementations scheduled for standard deployment. + /// @dev Excludes implementations with skipStandardDeploy = true. + /// Requires setUp() + _buildImplementationDeploymentConfigs() to have been called first. + function getStandardDeploymentNames() public view returns (string[] memory names_) { + uint256 count = _implementationConfigs.length; + names_ = new string[](count); + for (uint256 i = 0; i < count; i++) { + names_[i] = _implementationConfigs[i].name; + } } /// @notice Asserts the output is valid. /// @param _output The output to assert. - function _assertValidOutput(Output memory _output) internal pure { - uint256 transactionCount = UpgradeUtils.getTransactionCount(); - uint256 txnsLength = _output.txns.length; - require(txnsLength == transactionCount, "GenerateNUTBundle: invalid transaction count"); + function _assertValidOutput(Output memory _output) internal view { + // Total expected transactions: + // - standard implementation deployments + // - [KARST] ConditionalDeployer deployment + ConditionalDeployer upgrade + L2ProxyAdmin upgrade + // - L2ContractsManager deployment + // - L2ProxyAdmin.upgradePredeploys() call + uint256 transactionCount = _implementationConfigs.length + 2; + if (keccak256(abi.encodePacked(UPGRADE_NAME)) == keccak256(abi.encodePacked("karst"))) { + transactionCount += 3; + } + require(_output.txns.length == transactionCount, "GenerateNUTBundle: invalid transaction count"); - for (uint256 i = 0; i < txnsLength; i++) { + for (uint256 i = 0; i < transactionCount; i++) { require(_output.txns[i].data.length > 0, "GenerateNUTBundle: invalid transaction data"); require(bytes(_output.txns[i].intent).length > 0, "GenerateNUTBundle: invalid transaction intent"); require(_output.txns[i].to != address(0), "GenerateNUTBundle: invalid transaction to"); @@ -200,7 +222,7 @@ contract GenerateNUTBundle is Script { bytes memory conditionalDeployerCode = abi.encodePacked(DeployUtils.getCode("ConditionalDeployer.sol:ConditionalDeployer")); - txns.push( + _txns.push( NetworkUpgradeTxns.NetworkUpgradeTxn({ intent: "ConditionalDeployer Deployment", from: Constants.DEPOSITOR_ACCOUNT, @@ -212,7 +234,7 @@ contract GenerateNUTBundle is Script { // 2. Upgrade ConditionalDeployer proxy address newConditionalDeployerImpl = UpgradeUtils.computeCreate2Address(conditionalDeployerCode, SALT); - txns.push( + _txns.push( UpgradeUtils.createUpgradeTxn( "ConditionalDeployer", Predeploys.CONDITIONAL_DEPLOYER, @@ -227,7 +249,7 @@ contract GenerateNUTBundle is Script { /// @param _proxyAdminImpl Address of the new L2ProxyAdmin implementation. /// @dev TODO(#19369): Remove this function once Karst upgrade is deployed in all chains. function _generateL2ProxyAdminUpgrade(address _proxyAdminImpl) internal { - txns.push( + _txns.push( UpgradeUtils.createUpgradeTxn( "L2ProxyAdmin", Predeploys.PROXY_ADMIN, _proxyAdminImpl, gasLimits.proxyAdminUpgrade ) @@ -241,18 +263,16 @@ contract GenerateNUTBundle is Script { /// @notice Generates implementation deployment transactions for all the implementations to upgrade. /// @dev This function is called for all upgrades. It deploys implementation contracts /// via ConditionalDeployer.deploy(), which ensures idempotent deployments. + /// Implementations with skipStandardDeploy = true are skipped here and must be + /// deployed via a custom phase (e.g. _preImplementationDeployments for Karst). /// @dev IMPORTANT: Only modify this function if you need to add or modify a fixed implementation deployment. function _generateImplementationDeployments() internal { - // Get all implementations to upgrade - string[] memory implementationsToUpgrade = UpgradeUtils.getImplementationsNamesToUpgrade(); - - for (uint256 i = 0; i < implementationsToUpgrade.length; i++) { - // Get implementation config - ImplementationConfig memory config = implementationConfigs[implementationsToUpgrade[i]]; + for (uint256 i = 0; i < _implementationConfigs.length; i++) { + ImplementationConfig memory config = _implementationConfigs[i]; _assertValidImplementationConfig(config); - txns.push( + _txns.push( UpgradeUtils.createDeploymentTxn(config.name, config.artifactPath, SALT, config.deploymentGasLimit) ); } @@ -266,7 +286,7 @@ contract GenerateNUTBundle is Script { bytes memory l2cmArgs = abi.encode(implementations); // Deploy L2ContractsManager with encoded implementation addresses - txns.push( + _txns.push( UpgradeUtils.createDeploymentTxnWithArgs( "L2ContractsManager", "L2ContractsManager.sol:L2ContractsManager", @@ -291,7 +311,7 @@ contract GenerateNUTBundle is Script { ); // Create upgrade execution transaction - txns.push( + _txns.push( NetworkUpgradeTxns.NetworkUpgradeTxn({ intent: "L2ProxyAdmin Upgrade Predeploys", from: Constants.DEPOSITOR_ACCOUNT, @@ -306,8 +326,21 @@ contract GenerateNUTBundle is Script { // HELPERS // ======================================== + /// @notice Looks up an implementation address by contract name. + /// @dev Iterates implementationConfigs linearly; acceptable cost for a script. + /// @param _name The human-readable name used in _buildImplementationDeploymentConfigs. + /// @return impl_ The implementation address, or reverts if not found. + function findImplByName(string memory _name) public view returns (address impl_) { + for (uint256 i = 0; i < _implementationConfigs.length; i++) { + if (keccak256(bytes(_implementationConfigs[i].name)) == keccak256(bytes(_name))) { + return _implementationConfigs[i].implementation; + } + } + revert(string.concat("GenerateNUTBundle: implementation not found: ", _name)); + } + /// @notice Retrieves all expected implementation addresses for the upgrade. - /// @dev All addresses are looked up from the implementationConfigs mapping, which contains + /// @dev All addresses are looked up from the implementationConfigs array, which contains /// deterministically computed CREATE2 addresses using the hardcoded salt. This ensures /// identical addresses across all chains executing the upgrade. /// @return implementations_ Struct containing all implementation addresses. @@ -317,33 +350,33 @@ contract GenerateNUTBundle is Script { returns (L2ContractsManagerTypes.Implementations memory implementations_) { implementations_ = L2ContractsManagerTypes.Implementations({ - storageSetterImpl: implementationConfigs["StorageSetter"].implementation, - l2CrossDomainMessengerImpl: implementationConfigs["L2CrossDomainMessenger"].implementation, - gasPriceOracleImpl: implementationConfigs["GasPriceOracle"].implementation, - l2StandardBridgeImpl: implementationConfigs["L2StandardBridge"].implementation, - sequencerFeeWalletImpl: implementationConfigs["SequencerFeeVault"].implementation, - optimismMintableERC20FactoryImpl: implementationConfigs["OptimismMintableERC20Factory"].implementation, - l2ERC721BridgeImpl: implementationConfigs["L2ERC721Bridge"].implementation, - l1BlockImpl: implementationConfigs["L1Block"].implementation, - l1BlockCGTImpl: implementationConfigs["L1BlockCGT"].implementation, - l2ToL1MessagePasserImpl: implementationConfigs["L2ToL1MessagePasser"].implementation, - l2ToL1MessagePasserCGTImpl: implementationConfigs["L2ToL1MessagePasserCGT"].implementation, - optimismMintableERC721FactoryImpl: implementationConfigs["OptimismMintableERC721Factory"].implementation, - proxyAdminImpl: implementationConfigs["L2ProxyAdmin"].implementation, - baseFeeVaultImpl: implementationConfigs["BaseFeeVault"].implementation, - l1FeeVaultImpl: implementationConfigs["L1FeeVault"].implementation, - operatorFeeVaultImpl: implementationConfigs["OperatorFeeVault"].implementation, - schemaRegistryImpl: implementationConfigs["SchemaRegistry"].implementation, - easImpl: implementationConfigs["EAS"].implementation, - crossL2InboxImpl: implementationConfigs["CrossL2Inbox"].implementation, - l2ToL2CrossDomainMessengerImpl: implementationConfigs["L2ToL2CrossDomainMessenger"].implementation, - superchainETHBridgeImpl: implementationConfigs["SuperchainETHBridge"].implementation, - ethLiquidityImpl: implementationConfigs["ETHLiquidity"].implementation, - nativeAssetLiquidityImpl: implementationConfigs["NativeAssetLiquidity"].implementation, - liquidityControllerImpl: implementationConfigs["LiquidityController"].implementation, - feeSplitterImpl: implementationConfigs["FeeSplitter"].implementation, - conditionalDeployerImpl: implementationConfigs["ConditionalDeployer"].implementation, - l2DevFeatureFlagsImpl: implementationConfigs["L2DevFeatureFlags"].implementation + storageSetterImpl: findImplByName("StorageSetter"), + l2CrossDomainMessengerImpl: findImplByName("L2CrossDomainMessenger"), + gasPriceOracleImpl: findImplByName("GasPriceOracle"), + l2StandardBridgeImpl: findImplByName("L2StandardBridge"), + sequencerFeeWalletImpl: findImplByName("SequencerFeeVault"), + optimismMintableERC20FactoryImpl: findImplByName("OptimismMintableERC20Factory"), + l2ERC721BridgeImpl: findImplByName("L2ERC721Bridge"), + l1BlockImpl: findImplByName("L1Block"), + l1BlockCGTImpl: findImplByName("L1BlockCGT"), + l2ToL1MessagePasserImpl: findImplByName("L2ToL1MessagePasser"), + l2ToL1MessagePasserCGTImpl: findImplByName("L2ToL1MessagePasserCGT"), + optimismMintableERC721FactoryImpl: findImplByName("OptimismMintableERC721Factory"), + proxyAdminImpl: findImplByName("L2ProxyAdmin"), + baseFeeVaultImpl: findImplByName("BaseFeeVault"), + l1FeeVaultImpl: findImplByName("L1FeeVault"), + operatorFeeVaultImpl: findImplByName("OperatorFeeVault"), + schemaRegistryImpl: findImplByName("SchemaRegistry"), + easImpl: findImplByName("EAS"), + crossL2InboxImpl: findImplByName("CrossL2Inbox"), + l2ToL2CrossDomainMessengerImpl: findImplByName("L2ToL2CrossDomainMessenger"), + superchainETHBridgeImpl: findImplByName("SuperchainETHBridge"), + ethLiquidityImpl: findImplByName("ETHLiquidity"), + nativeAssetLiquidityImpl: findImplByName("NativeAssetLiquidity"), + liquidityControllerImpl: findImplByName("LiquidityController"), + feeSplitterImpl: findImplByName("FeeSplitter"), + conditionalDeployerImpl: findImplByName("ConditionalDeployer"), + l2DevFeatureFlagsImpl: findImplByName("L2DevFeatureFlags") }); } @@ -353,229 +386,300 @@ contract GenerateNUTBundle is Script { /// @dev An array of strings is used to add contracts that are not predeploys (StorageSetter) or have /// feature-specific variants (e.g. CGT). /// @dev Gas limits are based on actual gas profiling of mainnet fork execution with 1.5x safety margin. - function _buildImplementationDeploymentConfigs() internal { + function _buildImplementationDeploymentConfigs() public { // Gas profiling: 280,600 gas used → 420,900 recommended → 500K with safety margin - implementationConfigs["StorageSetter"] = ImplementationConfig({ - name: "StorageSetter", - artifactPath: "StorageSetter.sol:StorageSetter", - deploymentGasLimit: 500_000, - implementation: UpgradeUtils.computeCreate2Address(DeployUtils.getCode("StorageSetter.sol:StorageSetter"), SALT) - }); + _implementationConfigs.push( + ImplementationConfig({ + name: "StorageSetter", + artifactPath: "StorageSetter.sol:StorageSetter", + deploymentGasLimit: 500_000, + implementation: UpgradeUtils.computeCreate2Address( + DeployUtils.getCode("StorageSetter.sol:StorageSetter"), SALT + ) + }) + ); // Gas profiling: 1,708,099 gas used → 2,562,148 recommended → 2.6M with safety margin - implementationConfigs["L2CrossDomainMessenger"] = ImplementationConfig({ - name: "L2CrossDomainMessenger", - artifactPath: "L2CrossDomainMessenger.sol:L2CrossDomainMessenger", - deploymentGasLimit: 2_600_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("L2CrossDomainMessenger.sol:L2CrossDomainMessenger"), SALT - ) - }); + _implementationConfigs.push( + ImplementationConfig({ + name: "L2CrossDomainMessenger", + artifactPath: "L2CrossDomainMessenger.sol:L2CrossDomainMessenger", + deploymentGasLimit: 2_600_000, + implementation: UpgradeUtils.computeCreate2Address( + DeployUtils.getCode("L2CrossDomainMessenger.sol:L2CrossDomainMessenger"), SALT + ) + }) + ); // Gas profiling: 1,681,024 gas used → 2,521,536 recommended → 2.6M with safety margin - implementationConfigs["GasPriceOracle"] = ImplementationConfig({ - name: "GasPriceOracle", - artifactPath: "GasPriceOracle.sol:GasPriceOracle", - deploymentGasLimit: 2_600_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("GasPriceOracle.sol:GasPriceOracle"), SALT - ) - }); + _implementationConfigs.push( + ImplementationConfig({ + name: "GasPriceOracle", + artifactPath: "GasPriceOracle.sol:GasPriceOracle", + deploymentGasLimit: 2_600_000, + implementation: UpgradeUtils.computeCreate2Address( + DeployUtils.getCode("GasPriceOracle.sol:GasPriceOracle"), SALT + ) + }) + ); // Gas profiling: 2,358,092 gas used → 3,537,138 recommended → 3.6M with safety margin - implementationConfigs["L2StandardBridge"] = ImplementationConfig({ - name: "L2StandardBridge", - artifactPath: "L2StandardBridge.sol:L2StandardBridge", - deploymentGasLimit: 3_600_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("L2StandardBridge.sol:L2StandardBridge"), SALT - ) - }); + _implementationConfigs.push( + ImplementationConfig({ + name: "L2StandardBridge", + artifactPath: "L2StandardBridge.sol:L2StandardBridge", + deploymentGasLimit: 3_600_000, + implementation: UpgradeUtils.computeCreate2Address( + DeployUtils.getCode("L2StandardBridge.sol:L2StandardBridge"), SALT + ) + }) + ); // Gas profiling: 841,152 gas used → 1,261,728 recommended → 1.3M with safety margin - implementationConfigs["SequencerFeeVault"] = ImplementationConfig({ - name: "SequencerFeeVault", - artifactPath: "SequencerFeeVault.sol:SequencerFeeVault", - deploymentGasLimit: 1_300_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("SequencerFeeVault.sol:SequencerFeeVault"), SALT - ) - }); + _implementationConfigs.push( + ImplementationConfig({ + name: "SequencerFeeVault", + artifactPath: "SequencerFeeVault.sol:SequencerFeeVault", + deploymentGasLimit: 1_300_000, + implementation: UpgradeUtils.computeCreate2Address( + DeployUtils.getCode("SequencerFeeVault.sol:SequencerFeeVault"), SALT + ) + }) + ); // Gas profiling: 2,347,504 gas used → 3,521,256 recommended → 3.6M with safety margin - implementationConfigs["OptimismMintableERC20Factory"] = ImplementationConfig({ - name: "OptimismMintableERC20Factory", - artifactPath: "OptimismMintableERC20Factory.sol:OptimismMintableERC20Factory", - deploymentGasLimit: 3_600_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("OptimismMintableERC20Factory.sol:OptimismMintableERC20Factory"), SALT - ) - }); + _implementationConfigs.push( + ImplementationConfig({ + name: "OptimismMintableERC20Factory", + artifactPath: "OptimismMintableERC20Factory.sol:OptimismMintableERC20Factory", + deploymentGasLimit: 3_600_000, + implementation: UpgradeUtils.computeCreate2Address( + DeployUtils.getCode("OptimismMintableERC20Factory.sol:OptimismMintableERC20Factory"), SALT + ) + }) + ); // Gas profiling: 1,242,108 gas used → 1,863,162 recommended → 1.9M with safety margin - implementationConfigs["L2ERC721Bridge"] = ImplementationConfig({ - name: "L2ERC721Bridge", - artifactPath: "L2ERC721Bridge.sol:L2ERC721Bridge", - deploymentGasLimit: 1_900_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("L2ERC721Bridge.sol:L2ERC721Bridge"), SALT - ) - }); - // Gas profiling: 750K with safety margin - implementationConfigs["L1Block"] = ImplementationConfig({ - name: "L1Block", - artifactPath: "L1Block.sol:L1Block", - deploymentGasLimit: 750_000, - implementation: UpgradeUtils.computeCreate2Address(DeployUtils.getCode("L1Block.sol:L1Block"), SALT) - }); + _implementationConfigs.push( + ImplementationConfig({ + name: "L2ERC721Bridge", + artifactPath: "L2ERC721Bridge.sol:L2ERC721Bridge", + deploymentGasLimit: 1_900_000, + implementation: UpgradeUtils.computeCreate2Address( + DeployUtils.getCode("L2ERC721Bridge.sol:L2ERC721Bridge"), SALT + ) + }) + ); + // Gas profiling: 707,557 gas used → 1,061,335 recommended → 1.1M with safety margin + _implementationConfigs.push( + ImplementationConfig({ + name: "L1Block", + artifactPath: "L1Block.sol:L1Block", + deploymentGasLimit: 1_100_000, + implementation: UpgradeUtils.computeCreate2Address(DeployUtils.getCode("L1Block.sol:L1Block"), SALT) + }) + ); // Gas profiling: 710,257 gas used → 1,065,385 recommended → 1.1M with safety margin - implementationConfigs["L1BlockCGT"] = ImplementationConfig({ - name: "L1BlockCGT", - artifactPath: "L1BlockCGT.sol:L1BlockCGT", - deploymentGasLimit: 1_100_000, - implementation: UpgradeUtils.computeCreate2Address(DeployUtils.getCode("L1BlockCGT.sol:L1BlockCGT"), SALT) - }); + _implementationConfigs.push( + ImplementationConfig({ + name: "L1BlockCGT", + artifactPath: "L1BlockCGT.sol:L1BlockCGT", + deploymentGasLimit: 1_100_000, + implementation: UpgradeUtils.computeCreate2Address(DeployUtils.getCode("L1BlockCGT.sol:L1BlockCGT"), SALT) + }) + ); // Gas profiling: 400,911 gas used → 601,366 recommended → 650K with safety margin - implementationConfigs["L2ToL1MessagePasser"] = ImplementationConfig({ - name: "L2ToL1MessagePasser", - artifactPath: "L2ToL1MessagePasser.sol:L2ToL1MessagePasser", - deploymentGasLimit: 650_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("L2ToL1MessagePasser.sol:L2ToL1MessagePasser"), SALT - ) - }); + _implementationConfigs.push( + ImplementationConfig({ + name: "L2ToL1MessagePasser", + artifactPath: "L2ToL1MessagePasser.sol:L2ToL1MessagePasser", + deploymentGasLimit: 650_000, + implementation: UpgradeUtils.computeCreate2Address( + DeployUtils.getCode("L2ToL1MessagePasser.sol:L2ToL1MessagePasser"), SALT + ) + }) + ); // Gas profiling: 484,560 gas used → 726,840 recommended → 750K with safety margin - implementationConfigs["L2ToL1MessagePasserCGT"] = ImplementationConfig({ - name: "L2ToL1MessagePasserCGT", - artifactPath: "L2ToL1MessagePasserCGT.sol:L2ToL1MessagePasserCGT", - deploymentGasLimit: 750_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("L2ToL1MessagePasserCGT.sol:L2ToL1MessagePasserCGT"), SALT - ) - }); - + _implementationConfigs.push( + ImplementationConfig({ + name: "L2ToL1MessagePasserCGT", + artifactPath: "L2ToL1MessagePasserCGT.sol:L2ToL1MessagePasserCGT", + deploymentGasLimit: 750_000, + implementation: UpgradeUtils.computeCreate2Address( + DeployUtils.getCode("L2ToL1MessagePasserCGT.sol:L2ToL1MessagePasserCGT"), SALT + ) + }) + ); // Gas profiling: 3,248,395 gas used → 4,872,592 recommended → 4.9M with safety margin - implementationConfigs["OptimismMintableERC721Factory"] = ImplementationConfig({ - name: "OptimismMintableERC721Factory", - artifactPath: "OptimismMintableERC721Factory.sol:OptimismMintableERC721Factory", - deploymentGasLimit: 4_900_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("OptimismMintableERC721Factory.sol:OptimismMintableERC721Factory"), SALT - ) - }); + _implementationConfigs.push( + ImplementationConfig({ + name: "OptimismMintableERC721Factory", + artifactPath: "OptimismMintableERC721Factory.sol:OptimismMintableERC721Factory", + deploymentGasLimit: 4_900_000, + implementation: UpgradeUtils.computeCreate2Address( + DeployUtils.getCode("OptimismMintableERC721Factory.sol:OptimismMintableERC721Factory"), SALT + ) + }) + ); // Gas profiling: 1,538,265 gas used → 2,307,397 recommended → 2.4M with safety margin - implementationConfigs["L2ProxyAdmin"] = ImplementationConfig({ - name: "L2ProxyAdmin", - artifactPath: "L2ProxyAdmin.sol:L2ProxyAdmin", - deploymentGasLimit: 2_400_000, - implementation: UpgradeUtils.computeCreate2Address(DeployUtils.getCode("L2ProxyAdmin.sol:L2ProxyAdmin"), SALT) - }); + _implementationConfigs.push( + ImplementationConfig({ + name: "L2ProxyAdmin", + artifactPath: "L2ProxyAdmin.sol:L2ProxyAdmin", + deploymentGasLimit: 2_400_000, + implementation: UpgradeUtils.computeCreate2Address( + DeployUtils.getCode("L2ProxyAdmin.sol:L2ProxyAdmin"), SALT + ) + }) + ); // Gas profiling: 838,947 gas used → 1,258,420 recommended → 1.3M with safety margin - implementationConfigs["BaseFeeVault"] = ImplementationConfig({ - name: "BaseFeeVault", - artifactPath: "BaseFeeVault.sol:BaseFeeVault", - deploymentGasLimit: 1_300_000, - implementation: UpgradeUtils.computeCreate2Address(DeployUtils.getCode("BaseFeeVault.sol:BaseFeeVault"), SALT) - }); + _implementationConfigs.push( + ImplementationConfig({ + name: "BaseFeeVault", + artifactPath: "BaseFeeVault.sol:BaseFeeVault", + deploymentGasLimit: 1_300_000, + implementation: UpgradeUtils.computeCreate2Address( + DeployUtils.getCode("BaseFeeVault.sol:BaseFeeVault"), SALT + ) + }) + ); // Gas profiling: 14,439 gas used → 21,658 recommended → 50K with safety margin - implementationConfigs["L1FeeVault"] = ImplementationConfig({ - name: "L1FeeVault", - artifactPath: "L1FeeVault.sol:L1FeeVault", - deploymentGasLimit: 50_000, - implementation: UpgradeUtils.computeCreate2Address(DeployUtils.getCode("L1FeeVault.sol:L1FeeVault"), SALT) - }); + _implementationConfigs.push( + ImplementationConfig({ + name: "L1FeeVault", + artifactPath: "L1FeeVault.sol:L1FeeVault", + deploymentGasLimit: 50_000, + implementation: UpgradeUtils.computeCreate2Address(DeployUtils.getCode("L1FeeVault.sol:L1FeeVault"), SALT) + }) + ); // Gas profiling: 838,947 gas used → 1,258,420 recommended → 1.3M with safety margin - implementationConfigs["OperatorFeeVault"] = ImplementationConfig({ - name: "OperatorFeeVault", - artifactPath: "OperatorFeeVault.sol:OperatorFeeVault", - deploymentGasLimit: 1_300_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("OperatorFeeVault.sol:OperatorFeeVault"), SALT - ) - }); + _implementationConfigs.push( + ImplementationConfig({ + name: "OperatorFeeVault", + artifactPath: "OperatorFeeVault.sol:OperatorFeeVault", + deploymentGasLimit: 1_300_000, + implementation: UpgradeUtils.computeCreate2Address( + DeployUtils.getCode("OperatorFeeVault.sol:OperatorFeeVault"), SALT + ) + }) + ); // Gas profiling: 464,947 gas used → 697,420 recommended → 700K with safety margin - implementationConfigs["SchemaRegistry"] = ImplementationConfig({ - name: "SchemaRegistry", - artifactPath: "SchemaRegistry.sol:SchemaRegistry", - deploymentGasLimit: 700_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("SchemaRegistry.sol:SchemaRegistry"), SALT - ) - }); + _implementationConfigs.push( + ImplementationConfig({ + name: "SchemaRegistry", + artifactPath: "SchemaRegistry.sol:SchemaRegistry", + deploymentGasLimit: 700_000, + implementation: UpgradeUtils.computeCreate2Address( + DeployUtils.getCode("SchemaRegistry.sol:SchemaRegistry"), SALT + ) + }) + ); // Gas profiling: 3,820,943 gas used → 5,731,414 recommended → 5.8M with safety margin - implementationConfigs["EAS"] = ImplementationConfig({ - name: "EAS", - artifactPath: "EAS.sol:EAS", - deploymentGasLimit: 5_800_000, - implementation: UpgradeUtils.computeCreate2Address(DeployUtils.getCode("EAS.sol:EAS"), SALT) - }); + _implementationConfigs.push( + ImplementationConfig({ + name: "EAS", + artifactPath: "EAS.sol:EAS", + deploymentGasLimit: 5_800_000, + implementation: UpgradeUtils.computeCreate2Address(DeployUtils.getCode("EAS.sol:EAS"), SALT) + }) + ); // Gas profiling: 385,975 gas used → 578,962 recommended → 600K with safety margin - implementationConfigs["CrossL2Inbox"] = ImplementationConfig({ - name: "CrossL2Inbox", - artifactPath: "CrossL2Inbox.sol:CrossL2Inbox", - deploymentGasLimit: 600_000, - implementation: UpgradeUtils.computeCreate2Address(DeployUtils.getCode("CrossL2Inbox.sol:CrossL2Inbox"), SALT) - }); + _implementationConfigs.push( + ImplementationConfig({ + name: "CrossL2Inbox", + artifactPath: "CrossL2Inbox.sol:CrossL2Inbox", + deploymentGasLimit: 600_000, + implementation: UpgradeUtils.computeCreate2Address( + DeployUtils.getCode("CrossL2Inbox.sol:CrossL2Inbox"), SALT + ) + }) + ); // Gas profiling: 965,734 gas used → 1,448,601 recommended → 1.5M with safety margin - implementationConfigs["L2ToL2CrossDomainMessenger"] = ImplementationConfig({ - name: "L2ToL2CrossDomainMessenger", - artifactPath: "L2ToL2CrossDomainMessenger.sol:L2ToL2CrossDomainMessenger", - deploymentGasLimit: 1_500_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("L2ToL2CrossDomainMessenger.sol:L2ToL2CrossDomainMessenger"), SALT - ) - }); + _implementationConfigs.push( + ImplementationConfig({ + name: "L2ToL2CrossDomainMessenger", + artifactPath: "L2ToL2CrossDomainMessenger.sol:L2ToL2CrossDomainMessenger", + deploymentGasLimit: 1_500_000, + implementation: UpgradeUtils.computeCreate2Address( + DeployUtils.getCode("L2ToL2CrossDomainMessenger.sol:L2ToL2CrossDomainMessenger"), SALT + ) + }) + ); // Gas profiling: 441,198 gas used → 661,797 recommended → 700K with safety margin - implementationConfigs["SuperchainETHBridge"] = ImplementationConfig({ - name: "SuperchainETHBridge", - artifactPath: "SuperchainETHBridge.sol:SuperchainETHBridge", - deploymentGasLimit: 700_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("SuperchainETHBridge.sol:SuperchainETHBridge"), SALT - ) - }); + _implementationConfigs.push( + ImplementationConfig({ + name: "SuperchainETHBridge", + artifactPath: "SuperchainETHBridge.sol:SuperchainETHBridge", + deploymentGasLimit: 700_000, + implementation: UpgradeUtils.computeCreate2Address( + DeployUtils.getCode("SuperchainETHBridge.sol:SuperchainETHBridge"), SALT + ) + }) + ); // Gas profiling: 230,857 gas used → 346,285 recommended → 400K with safety margin - implementationConfigs["ETHLiquidity"] = ImplementationConfig({ - name: "ETHLiquidity", - artifactPath: "ETHLiquidity.sol:ETHLiquidity", - deploymentGasLimit: 400_000, - implementation: UpgradeUtils.computeCreate2Address(DeployUtils.getCode("ETHLiquidity.sol:ETHLiquidity"), SALT) - }); + _implementationConfigs.push( + ImplementationConfig({ + name: "ETHLiquidity", + artifactPath: "ETHLiquidity.sol:ETHLiquidity", + deploymentGasLimit: 400_000, + implementation: UpgradeUtils.computeCreate2Address( + DeployUtils.getCode("ETHLiquidity.sol:ETHLiquidity"), SALT + ) + }) + ); // Gas profiling: 215,592 gas used → 323,388 recommended → 400K with safety margin - implementationConfigs["NativeAssetLiquidity"] = ImplementationConfig({ - name: "NativeAssetLiquidity", - artifactPath: "NativeAssetLiquidity.sol:NativeAssetLiquidity", - deploymentGasLimit: 400_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("NativeAssetLiquidity.sol:NativeAssetLiquidity"), SALT - ) - }); + _implementationConfigs.push( + ImplementationConfig({ + name: "NativeAssetLiquidity", + artifactPath: "NativeAssetLiquidity.sol:NativeAssetLiquidity", + deploymentGasLimit: 400_000, + implementation: UpgradeUtils.computeCreate2Address( + DeployUtils.getCode("NativeAssetLiquidity.sol:NativeAssetLiquidity"), SALT + ) + }) + ); // Gas profiling: 914,648 gas used → 1,371,972 recommended → 1.4M with safety margin - implementationConfigs["LiquidityController"] = ImplementationConfig({ - name: "LiquidityController", - artifactPath: "LiquidityController.sol:LiquidityController", - deploymentGasLimit: 1_400_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("LiquidityController.sol:LiquidityController"), SALT - ) - }); + _implementationConfigs.push( + ImplementationConfig({ + name: "LiquidityController", + artifactPath: "LiquidityController.sol:LiquidityController", + deploymentGasLimit: 1_400_000, + implementation: UpgradeUtils.computeCreate2Address( + DeployUtils.getCode("LiquidityController.sol:LiquidityController"), SALT + ) + }) + ); // Gas profiling: 1,077,380 gas used → 1,616,070 recommended → 1.7M with safety margin - implementationConfigs["FeeSplitter"] = ImplementationConfig({ - name: "FeeSplitter", - artifactPath: "FeeSplitter.sol:FeeSplitter", - deploymentGasLimit: 1_700_000, - implementation: UpgradeUtils.computeCreate2Address(DeployUtils.getCode("FeeSplitter.sol:FeeSplitter"), SALT) - }); + _implementationConfigs.push( + ImplementationConfig({ + name: "FeeSplitter", + artifactPath: "FeeSplitter.sol:FeeSplitter", + deploymentGasLimit: 1_700_000, + implementation: UpgradeUtils.computeCreate2Address(DeployUtils.getCode("FeeSplitter.sol:FeeSplitter"), SALT) + }) + ); // Gas profiling: 339,403 gas used → 509,104 recommended → 600K with safety margin - implementationConfigs["ConditionalDeployer"] = ImplementationConfig({ - name: "ConditionalDeployer", - artifactPath: "ConditionalDeployer.sol:ConditionalDeployer", - deploymentGasLimit: 600_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("ConditionalDeployer.sol:ConditionalDeployer"), SALT - ) - }); - implementationConfigs["L2DevFeatureFlags"] = ImplementationConfig({ - name: "L2DevFeatureFlags", - artifactPath: "L2DevFeatureFlags.sol:L2DevFeatureFlags", - deploymentGasLimit: 300_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("L2DevFeatureFlags.sol:L2DevFeatureFlags"), SALT - ) - }); + _implementationConfigs.push( + ImplementationConfig({ + name: "ConditionalDeployer", + artifactPath: "ConditionalDeployer.sol:ConditionalDeployer", + deploymentGasLimit: 600_000, + implementation: UpgradeUtils.computeCreate2Address( + DeployUtils.getCode("ConditionalDeployer.sol:ConditionalDeployer"), SALT + ) + }) + ); + // Gas profiling: 167,063 gas used → 250,594 recommended → 260K with safety margin + _implementationConfigs.push( + ImplementationConfig({ + name: "L2DevFeatureFlags", + artifactPath: "L2DevFeatureFlags.sol:L2DevFeatureFlags", + deploymentGasLimit: 260_000, + implementation: UpgradeUtils.computeCreate2Address( + DeployUtils.getCode("L2DevFeatureFlags.sol:L2DevFeatureFlags"), SALT + ) + }) + ); + } + + /// @notice Returns the implementation configurations. + /// @dev This function is used to get the implementation configurations for testing. + /// @return implementationConfigs_ The implementation configurations. + function implementationConfigs() public view returns (ImplementationConfig[] memory implementationConfigs_) { + implementationConfigs_ = _implementationConfigs; } } diff --git a/packages/contracts-bedrock/snapshots/upgrades/current-upgrade-bundle.json b/packages/contracts-bedrock/snapshots/upgrades/current-upgrade-bundle.json index 6aebb769ded30..e186dbd32ba10 100644 --- a/packages/contracts-bedrock/snapshots/upgrades/current-upgrade-bundle.json +++ b/packages/contracts-bedrock/snapshots/upgrades/current-upgrade-bundle.json @@ -69,10 +69,17 @@ { "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000cad608060405234801561001057600080fd5b50610c8d806100206000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80635cf24969116100f9578063c598591811610097578063e591b28211610071578063e591b28214610469578063e81b2c6d14610483578063f82061401461048c578063fe3d57101461049557600080fd5b8063c598591814610408578063d844471514610428578063dad544e01461046157600080fd5b80638381f58a116100d35780638381f58a146103c25780638b239f73146103d65780639e8c4966146103df578063b80777ea146103e857600080fd5b80635cf249691461038957806364ca23ef1461039257806368d5dca6146103a657600080fd5b80634397dfef1161016657806347af267b1161014057806347af267b146102ba5780634d5d9a2a146102dd57806354fd4d501461030e578063550fcdc91461035057600080fd5b80634397dfef14610277578063440a5e201461029f57806346a4d780146102a757600080fd5b806316d3bc7f116101a257806316d3bc7f14610202578063213268491461022f5780633db6be2b146102425780633e47158c1461024a57600080fd5b8063015d8eb9146101c9578063098999be146101de57806309bd5a60146101e6575b600080fd5b6101dc6101d7366004610ae1565b6104c6565b005b6101dc610605565b6101ef60025481565b6040519081526020015b60405180910390f35b6008546102169067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101f9565b60005b60405190151581526020016101f9565b6101dc610618565b610252610642565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101f9565b6040805173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee815260126020820152016101f9565b6101dc61084d565b6101dc6102b5366004610b53565b6108a4565b6102326102c8366004610b53565b60096020526000908152604090205460ff1681565b6008546102f99068010000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016101f9565b60408051808201909152600581527f312e392e3000000000000000000000000000000000000000000000000000000060208201525b6040516101f99190610b6c565b60408051808201909152600381527f45544800000000000000000000000000000000000000000000000000000000006020820152610343565b6101ef60015481565b6003546102169067ffffffffffffffff1681565b6003546102f99068010000000000000000900463ffffffff1681565b6000546102169067ffffffffffffffff1681565b6101ef60055481565b6101ef60065481565b6000546102169068010000000000000000900467ffffffffffffffff1681565b6003546102f9906c01000000000000000000000000900463ffffffff1681565b60408051808201909152600581527f45746865720000000000000000000000000000000000000000000000000000006020820152610343565b6102526108b9565b73deaddeaddeaddeaddeaddeaddeaddeaddead0001610252565b6101ef60045481565b6101ef60075481565b6008546104b3906c01000000000000000000000000900461ffff1681565b60405161ffff90911681526020016101f9565b3373deaddeaddeaddeaddeaddeaddeaddeaddead00011461056d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4c31426c6f636b3a206f6e6c7920746865206465706f7369746f72206163636f60448201527f756e742063616e20736574204c3120626c6f636b2076616c7565730000000000606482015260840160405180910390fd5b6000805467ffffffffffffffff98891668010000000000000000027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116998916999099179890981790975560019490945560029290925560038054919094167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009190911617909255600491909155600555600655565b61060d61084d565b60a43560a01c600855565b61062061084d565b6dffff00000000000000000000000060b03560901c1660a43560a01c17600855565b60008061066d7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff81161561069057919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000008152505160026106d39190610bdf565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000919091179061072e906060015b604051602081830303815290604052805190602001205490565b14610765576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805130602082015260019181019190915260009061078790606001610714565b905073ffffffffffffffffffffffffffffffffffffffff81161561081b578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108149190610c43565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73deaddeaddeaddeaddeaddeaddeaddeaddead000133811461087757633cc50b456000526004601cfd5b60043560801c60035560143560801c60005560243560015560443560075560643560025560843560045550565b6108ad33610936565b6108b681610a13565b50565b60006108c3610642565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561090d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109319190610c43565b905090565b73ffffffffffffffffffffffffffffffffffffffff811673deaddeaddeaddeaddeaddeaddeaddeaddead000114806109a057506109716108b9565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b806109dd57506109ae610642565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b6108b6576040517fbe9d7ca600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526009602052604090205460ff1615610a5c576040517f4f45326000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091559051909183917fb876f6594132c89891d2fd198e925e999be741ec809abb58bfe9b966876cc06c9190a350565b803567ffffffffffffffff81168114610adc57600080fd5b919050565b600080600080600080600080610100898b031215610afe57600080fd5b610b0789610ac4565b9750610b1560208a01610ac4565b96506040890135955060608901359450610b3160808a01610ac4565b979a969950949793969560a0850135955060c08501359460e001359350915050565b600060208284031215610b6557600080fd5b5035919050565b600060208083528351808285015260005b81811015610b9957858101830151858201604001528201610b7d565b81811115610bab576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610c3e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500290565b600060208284031215610c5557600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610c7957600080fd5b939250505056fea164736f6c634300080f000a00000000000000000000000000000000000000", "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", - "gasLimit": 750000, + "gasLimit": 1100000, "intent": "Deploy L1Block Implementation", "to": "0x420000000000000000000000000000000000002C" }, + { + "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000010b1608060405234801561001057600080fd5b50611091806100206000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80635cf24969116100f9578063c598591811610097578063e591b28211610071578063e591b28214610434578063e81b2c6d1461044e578063f820614014610457578063fe3d57101461046057600080fd5b8063c598591814610404578063d844471514610424578063dad544e01461042c57600080fd5b80638381f58a116100d35780638381f58a146103be5780638b239f73146103d25780639e8c4966146103db578063b80777ea146103e457600080fd5b80635cf249691461038557806364ca23ef1461038e57806368d5dca6146103a257600080fd5b80634397dfef1161016657806347af267b1161014057806347af267b146103145780634d5d9a2a1461033757806354fd4d5014610368578063550fcdc91461037d57600080fd5b80634397dfef146102c3578063440a5e20146102f957806346a4d7801461030157600080fd5b806316d3bc7f116101a257806316d3bc7f14610202578063213268491461022f5780633db6be2b1461028e5780633e47158c1461029657600080fd5b8063015d8eb9146101c9578063098999be146101de57806309bd5a60146101e6575b600080fd5b6101dc6101d7366004610d9c565b610491565b005b6101dc6105d1565b6101ef60025481565b6040519081526020015b60405180910390f35b6008546102169067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101f9565b7f435553544f4d5f4741535f544f4b454e0000000000000000000000000000000060005260096020527f4ad9936a67aeb1898ef7b848aecdf71a1f8999fbf63ff2f5b5691cb14bedfe4d5460ff165b60405190151581526020016101f9565b6101dc6105e4565b61029e61060e565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101f9565b6102cb610819565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260ff9091166020830152016101f9565b6101dc610880565b6101dc61030f366004610e0e565b6108d7565b61027e610322366004610e0e565b60096020526000908152604090205460ff1681565b6008546103539068010000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016101f9565b6103706108ec565b6040516101f99190610e57565b61037061094c565b6101ef60015481565b6003546102169067ffffffffffffffff1681565b6003546103539068010000000000000000900463ffffffff1681565b6000546102169067ffffffffffffffff1681565b6101ef60055481565b6101ef60065481565b6000546102169068010000000000000000900467ffffffffffffffff1681565b600354610353906c01000000000000000000000000900463ffffffff1681565b610370610a88565b61029e610b79565b73deaddeaddeaddeaddeaddeaddeaddeaddead000161029e565b6101ef60045481565b6101ef60075481565b60085461047e906c01000000000000000000000000900461ffff1681565b60405161ffff90911681526020016101f9565b3373deaddeaddeaddeaddeaddeaddeaddeaddead000114610539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4c31426c6f636b3a206f6e6c7920746865206465706f7369746f72206163636f60448201527f756e742063616e20736574204c3120626c6f636b2076616c756573000000000060648201526084015b60405180910390fd5b6000805467ffffffffffffffff98891668010000000000000000027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116998916999099179890981790975560019490945560029290925560038054919094167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009190911617909255600491909155600555600655565b6105d9610880565b60a43560a01c600855565b6105ec610880565b6dffff00000000000000000000000060b03560901c1660a43560a01c17600855565b6000806106397fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff81161561065c57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000081525051600261069f9190610ea8565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000091909117906106fa906060015b604051602081830303815290604052805190602001205490565b14610731576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051306020820152600191810191909152600090610753906060016106e0565b905073ffffffffffffffffffffffffffffffffffffffff8116156107e7578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e09190610f0c565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4c31426c6f636b4347543a20646570726563617465640000000000000000000060448201526000908190606401610530565b73deaddeaddeaddeaddeaddeaddeaddeaddead00013381146108aa57633cc50b456000526004601cfd5b60043560801c60035560143560801c60005560243560015560443560075560643560025560843560045550565b6108e033610bf1565b6108e981610cce565b50565b606061092860408051808201909152600581527f312e392e30000000000000000000000000000000000000000000000000000000602082015290565b6040516020016109389190610f49565b604051602081830303815290604052905090565b60606109a27f435553544f4d5f4741535f544f4b454e0000000000000000000000000000000060005260096020527f4ad9936a67aeb1898ef7b848aecdf71a1f8999fbf63ff2f5b5691cb14bedfe4d5460ff1690565b6109de575060408051808201909152600381527f4554480000000000000000000000000000000000000000000000000000000000602082015290565b73420000000000000000000000000000000000002a73ffffffffffffffffffffffffffffffffffffffff1663550fcdc96040518163ffffffff1660e01b8152600401600060405180830381865afa158015610a3d573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610a839190810190610fb9565b905090565b6060610ade7f435553544f4d5f4741535f544f4b454e0000000000000000000000000000000060005260096020527f4ad9936a67aeb1898ef7b848aecdf71a1f8999fbf63ff2f5b5691cb14bedfe4d5460ff1690565b610b1a575060408051808201909152600581527f4574686572000000000000000000000000000000000000000000000000000000602082015290565b73420000000000000000000000000000000000002a73ffffffffffffffffffffffffffffffffffffffff1663d84447156040518163ffffffff1660e01b8152600401600060405180830381865afa158015610a3d573d6000803e3d6000fd5b6000610b8361060e565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a839190610f0c565b73ffffffffffffffffffffffffffffffffffffffff811673deaddeaddeaddeaddeaddeaddeaddeaddead00011480610c5b5750610c2c610b79565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b80610c985750610c6961060e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b6108e9576040517fbe9d7ca600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526009602052604090205460ff1615610d17576040517f4f45326000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091559051909183917fb876f6594132c89891d2fd198e925e999be741ec809abb58bfe9b966876cc06c9190a350565b803567ffffffffffffffff81168114610d9757600080fd5b919050565b600080600080600080600080610100898b031215610db957600080fd5b610dc289610d7f565b9750610dd060208a01610d7f565b96506040890135955060608901359450610dec60808a01610d7f565b979a969950949793969560a0850135955060c08501359460e001359350915050565b600060208284031215610e2057600080fd5b5035919050565b60005b83811015610e42578181015183820152602001610e2a565b83811115610e51576000848401525b50505050565b6020815260008251806020840152610e76816040850160208701610e27565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610f07577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500290565b600060208284031215610f1e57600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610f4257600080fd5b9392505050565b60008251610f5b818460208701610e27565b7f2b637573746f6d2d6761732d746f6b656e2e3100000000000000000000000000920191825250601301919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610fcb57600080fd5b815167ffffffffffffffff80821115610fe357600080fd5b818401915084601f830112610ff757600080fd5b81518181111561100957611009610f8a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561104f5761104f610f8a565b8160405282815287602084870101111561106857600080fd5b611079836020830160208801610e27565b97965050505050505056fea164736f6c634300080f000a000000000000000000000000000000", + "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", + "gasLimit": 1100000, + "intent": "Deploy L1BlockCGT Implementation", + "to": "0x420000000000000000000000000000000000002C" + }, { "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000006e9608060405234801561001057600080fd5b506106c9806100206000396000f3fe6080604052600436106100695760003560e01c806382e3702d1161004357806382e3702d14610120578063c2b3e5ac14610160578063ecc704281461017357600080fd5b80633f827a5a1461009257806344df8e70146100bf57806354fd4d50146100d457600080fd5b3661008d5761008b33620186a0604051806020016040528060008152506101d8565b005b600080fd5b34801561009e57600080fd5b506100a7600181565b60405161ffff90911681526020015b60405180910390f35b3480156100cb57600080fd5b5061008b61039c565b3480156100e057600080fd5b50604080518082018252600581527f312e322e30000000000000000000000000000000000000000000000000000000602082015290516100b691906104c7565b34801561012c57600080fd5b5061015061013b3660046104e1565b60006020819052908152604090205460ff1681565b60405190151581526020016100b6565b61008b61016e366004610529565b6101d8565b34801561017f57600080fd5b506101ca6001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016100b6565b600061026e6040518060c001604052806102326001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b815233602082015273ffffffffffffffffffffffffffffffffffffffff871660408201523460608201526080810186905260a0018490526103d4565b600081815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055905073ffffffffffffffffffffffffffffffffffffffff8416336103096001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b7f02a52367d10742d8032712c1bb8e0144ff1ec5ffda1ed7d70bb05a27449550543487878760405161033e949392919061062d565b60405180910390a45050600180547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8082168301167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b476103a681610421565b60405181907f7967de617a5ac1cc7eba2d6f37570a0135afa950d8bb77cdd35f0d0b4e85a16f90600090a250565b80516020808301516040808501516060860151608087015160a0880151935160009761040497909695910161065d565b604051602081830303815290604052805190602001209050919050565b8060405161042e90610450565b6040518091039082f090508015801561044b573d6000803e3d6000fd5b505050565b6008806106b583390190565b6000815180845260005b8181101561048257602081850181015186830182015201610466565b81811115610494576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104da602083018461045c565b9392505050565b6000602082840312156104f357600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060006060848603121561053e57600080fd5b833573ffffffffffffffffffffffffffffffffffffffff8116811461056257600080fd5b925060208401359150604084013567ffffffffffffffff8082111561058657600080fd5b818601915086601f83011261059a57600080fd5b8135818111156105ac576105ac6104fa565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156105f2576105f26104fa565b8160405282815289602084870101111561060b57600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b84815283602082015260806040820152600061064c608083018561045c565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a08301526106a860c083018461045c565b9897505050505050505056fe608060405230fffea164736f6c634300080f000a0000000000000000000000000000000000000000000000", "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", @@ -80,6 +87,13 @@ "intent": "Deploy L2ToL1MessagePasser Implementation", "to": "0x420000000000000000000000000000000000002C" }, + { + "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000862608060405234801561001057600080fd5b50610842806100206000396000f3fe6080604052600436106100695760003560e01c806382e3702d1161004357806382e3702d146100f6578063c2b3e5ac14610136578063ecc704281461014957600080fd5b80633f827a5a1461009257806344df8e70146100bf57806354fd4d50146100d457600080fd5b3661008d5761008b33620186a0604051806020016040528060008152506101ae565b005b600080fd5b34801561009e57600080fd5b506100a7600181565b60405161ffff90911681526020015b60405180910390f35b3480156100cb57600080fd5b5061008b610284565b3480156100e057600080fd5b506100e96102bc565b6040516100b691906105dd565b34801561010257600080fd5b506101266101113660046105f7565b60006020819052908152604090205460ff1681565b60405190151581526020016100b6565b61008b61014436600461063f565b6101ae565b34801561015557600080fd5b506101a06001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016100b6565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663213268496040518163ffffffff1660e01b8152600401602060405180830381865afa15801561020d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102319190610743565b801561023d5750600034115b15610274576040517fcdfaa11100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61027f83838361031c565b505050565b4761028e816104e0565b60405181907f7967de617a5ac1cc7eba2d6f37570a0135afa950d8bb77cdd35f0d0b4e85a16f90600090a250565b60606102f860408051808201909152600581527f312e322e30000000000000000000000000000000000000000000000000000000602082015290565b6040516020016103089190610765565b604051602081830303815290604052905090565b60006103b26040518060c001604052806103766001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b815233602082015273ffffffffffffffffffffffffffffffffffffffff871660408201523460608201526080810186905260a00184905261050a565b600081815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055905073ffffffffffffffffffffffffffffffffffffffff84163361044d6001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b7f02a52367d10742d8032712c1bb8e0144ff1ec5ffda1ed7d70bb05a27449550543487878760405161048294939291906107a6565b60405180910390a45050600180547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8082168301167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b806040516104ed90610557565b6040518091039082f090508015801561027f573d6000803e3d6000fd5b80516020808301516040808501516060860151608087015160a0880151935160009761053a9790969591016107d6565b604051602081830303815290604052805190602001209050919050565b60088061082e83390190565b60005b8381101561057e578181015183820152602001610566565b8381111561058d576000848401525b50505050565b600081518084526105ab816020860160208601610563565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006105f06020830184610593565b9392505050565b60006020828403121561060957600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060006060848603121561065457600080fd5b833573ffffffffffffffffffffffffffffffffffffffff8116811461067857600080fd5b925060208401359150604084013567ffffffffffffffff8082111561069c57600080fd5b818601915086601f8301126106b057600080fd5b8135818111156106c2576106c2610610565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561070857610708610610565b8160405282815289602084870101111561072157600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b60006020828403121561075557600080fd5b815180151581146105f057600080fd5b60008251610777818460208701610563565b7f2b637573746f6d2d6761732d746f6b656e000000000000000000000000000000920191825250601101919050565b8481528360208201526080604082015260006107c56080830185610593565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261082160c0830184610593565b9897505050505050505056fe608060405230fffea164736f6c634300080f000a000000000000000000000000000000000000000000000000000000000000", + "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", + "gasLimit": 750000, + "intent": "Deploy L2ToL1MessagePasserCGT Implementation", + "to": "0x420000000000000000000000000000000000002C" + }, { "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000003f8d608060405234801561001057600080fd5b5061001961001e565b6100de565b600154610100900460ff161561008a5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60015460ff90811610156100dc576001805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b613ea0806100ed6000396000f3fe60806040523480156200001157600080fd5b5060043610620000cd5760003560e01c8063d2382242116200007f578063dad544e01162000062578063dad544e014620001d6578063e78cea9214620001e0578063ee9a31a2146200020757600080fd5b8063d238224214620001b5578063d97df65214620001bf57600080fd5b80635572acae11620000b45780635572acae14620001525780637d1d0c5b1462000189578063cd6dc687146200019c57600080fd5b80633e47158c14620000d257806354fd4d501462000106575b600080fd5b620000dc6200022c565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b620001436040518060400160405280600581526020017f312e352e3100000000000000000000000000000000000000000000000000000081525081565b604051620000fd9190620009ad565b6200017862000163366004620009ef565b60006020819052908152604090205460ff1681565b6040519015158152602001620000fd565b6002545b604051908152602001620000fd565b620001b3620001ad36600462000a0f565b62000443565b005b6200018d60025481565b620000dc620001d036600462000b20565b62000628565b620000dc62000826565b600154620000dc9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60015462010000900473ffffffffffffffffffffffffffffffffffffffff16620000dc565b600080620002587fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff8116156200027c57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000815250516002620002c1919062000b9f565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000091909117906200031d906060015b604051602081830303815290604052805190602001205490565b1462000355576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051306020820152600191810191909152600090620003799060600162000303565b905073ffffffffffffffffffffffffffffffffffffffff81161562000411578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200040a919062000c04565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154610100900460ff16158080156200046157506001805460ff16105b806200047c5750303b1580156200047c57506001805460ff16145b6200050e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168117905580156200056c57600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b62000576620008a8565b600180547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff861602179055600282905580156200062357600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1681556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b600073ffffffffffffffffffffffffffffffffffffffff8416620006f6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4f7074696d69736d4d696e7461626c65455243373231466163746f72793a204c908201527f3120746f6b656e20616464726573732063616e6e6f742062652061646472657360648201527f7328302900000000000000000000000000000000000000000000000000000000608482015260a40162000505565b60008484846040516020016200070f9392919062000c24565b604051602081830303815290604052805190602001209050600081600160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600254888888604051620007619062000931565b6200077195949392919062000c73565b8190604051809103906000f590508015801562000792573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff8181166000818152602081815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590513381529394509189169290917fe72783bb8e0ca31286b85278da59684dd814df9762a52f0837f89edd1483b299910160405180910390a395945050505050565b6000620008326200022c565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200087d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008a3919062000c04565b905090565b33620008b36200022c565b73ffffffffffffffffffffffffffffffffffffffff1614158015620008f7575033620008de62000826565b73ffffffffffffffffffffffffffffffffffffffff1614155b156200092f576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6131bf8062000cd583390190565b6000815180845260005b81811015620009675760208185018101518683018201520162000949565b818111156200097a576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000620009c260208301846200093f565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114620009ec57600080fd5b50565b60006020828403121562000a0257600080fd5b8135620009c281620009c9565b6000806040838503121562000a2357600080fd5b823562000a3081620009c9565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011262000a7f57600080fd5b813567ffffffffffffffff8082111562000a9d5762000a9d62000a3e565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171562000ae65762000ae662000a3e565b8160405283815286602085880101111562000b0057600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121562000b3657600080fd5b833562000b4381620009c9565b9250602084013567ffffffffffffffff8082111562000b6157600080fd5b62000b6f8783880162000a6d565b9350604086013591508082111562000b8657600080fd5b5062000b958682870162000a6d565b9150509250925092565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000bff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500290565b60006020828403121562000c1757600080fd5b8151620009c281620009c9565b73ffffffffffffffffffffffffffffffffffffffff8416815260606020820152600062000c5560608301856200093f565b828103604084015262000c6981856200093f565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835286602084015280861660408401525060a0606083015262000cb460a08301856200093f565b828103608084015262000cc881856200093f565b9897505050505050505056fe60e06040523480156200001157600080fd5b50604051620031bf380380620031bf83398101604081905262000034916200062d565b8181600062000044838262000756565b50600162000053828262000756565b5050506001600160a01b038516620000d85760405162461bcd60e51b815260206004820152603360248201527f4f7074696d69736d4d696e7461626c654552433732313a20627269646765206360448201527f616e6e6f7420626520616464726573732830290000000000000000000000000060648201526084015b60405180910390fd5b83600003620001505760405162461bcd60e51b815260206004820152603660248201527f4f7074696d69736d4d696e7461626c654552433732313a2072656d6f7465206360448201527f6861696e2069642063616e6e6f74206265207a65726f000000000000000000006064820152608401620000cf565b6001600160a01b038316620001ce5760405162461bcd60e51b815260206004820152603960248201527f4f7074696d69736d4d696e7461626c654552433732313a2072656d6f7465207460448201527f6f6b656e2063616e6e6f742062652061646472657373283029000000000000006064820152608401620000cf565b60808490526001600160a01b0383811660a081905290861660c0526200020290601462000256602090811b62000eed17901c565b62000218856200041660201b620011301760201c565b6040516020016200022b92919062000822565b604051602081830303815290604052600a90816200024a919062000756565b50505050505062000993565b6060600062000267836002620008ac565b62000274906002620008ce565b6001600160401b038111156200028e576200028e62000553565b6040519080825280601f01601f191660200182016040528015620002b9576020820181803683370190505b509050600360fc1b81600081518110620002d757620002d7620008e9565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110620003095762000309620008e9565b60200101906001600160f81b031916908160001a90535060006200032f846002620008ac565b6200033c906001620008ce565b90505b6001811115620003be576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110620003745762000374620008e9565b1a60f81b8282815181106200038d576200038d620008e9565b60200101906001600160f81b031916908160001a90535060049490941c93620003b681620008ff565b90506200033f565b5083156200040f5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401620000cf565b9392505050565b6060816000036200043e5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156200046e5780620004558162000919565b9150620004669050600a836200094b565b915062000442565b6000816001600160401b038111156200048b576200048b62000553565b6040519080825280601f01601f191660200182016040528015620004b6576020820181803683370190505b5090505b84156200052e57620004ce60018362000962565b9150620004dd600a866200097c565b620004ea906030620008ce565b60f81b818381518110620005025762000502620008e9565b60200101906001600160f81b031916908160001a90535062000526600a866200094b565b9450620004ba565b949350505050565b80516001600160a01b03811681146200054e57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620005865781810151838201526020016200056c565b8381111562000596576000848401525b50505050565b600082601f830112620005ae57600080fd5b81516001600160401b0380821115620005cb57620005cb62000553565b604051601f8301601f19908116603f01168101908282118183101715620005f657620005f662000553565b816040528381528660208588010111156200061057600080fd5b6200062384602083016020890162000569565b9695505050505050565b600080600080600060a086880312156200064657600080fd5b620006518662000536565b945060208601519350620006686040870162000536565b60608701519093506001600160401b03808211156200068657600080fd5b6200069489838a016200059c565b93506080880151915080821115620006ab57600080fd5b50620006ba888289016200059c565b9150509295509295909350565b600181811c90821680620006dc57607f821691505b602082108103620006fd57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200075157600081815260208120601f850160051c810160208610156200072c5750805b601f850160051c820191505b818110156200074d5782815560010162000738565b5050505b505050565b81516001600160401b0381111562000772576200077262000553565b6200078a81620007838454620006c7565b8462000703565b602080601f831160018114620007c25760008415620007a95750858301515b600019600386901b1c1916600185901b1785556200074d565b600085815260208120601f198616915b82811015620007f357888601518255948401946001909101908401620007d2565b5085821015620008125787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6832ba3432b932bab69d60b91b8152600083516200084881600985016020880162000569565b600160fe1b60099184019182015283516200086b81600a84016020880162000569565b712f746f6b656e5552493f75696e743235363d60701b600a9290910191820152601c01949350505050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615620008c957620008c962000896565b500290565b60008219821115620008e457620008e462000896565b500190565b634e487b7160e01b600052603260045260246000fd5b60008162000911576200091162000896565b506000190190565b6000600182016200092e576200092e62000896565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826200095d576200095d62000935565b500490565b60008282101562000977576200097762000896565b500390565b6000826200098e576200098e62000935565b500690565b60805160a05160c0516127d9620009e6600039600081816103e20152818161047a01528181610b210152610c430152600081816101e001526103bc015260008181610329015261040801526127d96000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80637d1d0c5b116100ee578063c87b56dd11610097578063e78cea9211610071578063e78cea92146103e0578063e951819614610406578063e985e9c51461042c578063ee9a31a21461047557600080fd5b8063c87b56dd1461039f578063d547cfb7146103b2578063d6c0b2c4146103ba57600080fd5b8063a1448194116100c8578063a144819414610366578063a22cb46514610379578063b88d4fde1461038c57600080fd5b80637d1d0c5b1461032457806395d89b411461034b5780639dc29fac1461035357600080fd5b806323b872dd1161015b5780634f6ccce7116101355780634f6ccce7146102af57806354fd4d50146102c25780636352211e146102fe57806370a082311461031157600080fd5b806323b872dd146102765780632f745c591461028957806342842e0e1461029c57600080fd5b8063081812fc1161018c578063081812fc1461023c578063095ea7b31461024f57806318160ddd1461026457600080fd5b806301ffc9a7146101b3578063033964be146101db57806306fdde0314610227575b600080fd5b6101c66101c1366004612226565b61049c565b60405190151581526020015b60405180910390f35b6102027f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d2565b61022f6104fa565b6040516101d291906122b9565b61020261024a3660046122cc565b61058c565b61026261025d36600461230e565b6105c0565b005b6008545b6040519081526020016101d2565b610262610284366004612338565b610751565b61026861029736600461230e565b6107f2565b6102626102aa366004612338565b6108c1565b6102686102bd3660046122cc565b6108dc565b61022f6040518060400160405280600581526020017f312e332e3200000000000000000000000000000000000000000000000000000081525081565b61020261030c3660046122cc565b61099a565b61026861031f366004612374565b610a2c565b6102687f000000000000000000000000000000000000000000000000000000000000000081565b61022f610afa565b61026261036136600461230e565b610b09565b61026261037436600461230e565b610c2b565b61026261038736600461238f565b610d42565b61026261039a3660046123fa565b610d51565b61022f6103ad3660046122cc565b610df9565b61022f610e5f565b7f0000000000000000000000000000000000000000000000000000000000000000610202565b7f0000000000000000000000000000000000000000000000000000000000000000610202565b7f0000000000000000000000000000000000000000000000000000000000000000610268565b6101c661043a3660046124f4565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b6102027f000000000000000000000000000000000000000000000000000000000000000081565b60007faecafc23000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083168114806104f357506104f38361126d565b9392505050565b60606000805461050990612527565b80601f016020809104026020016040519081016040528092919081815260200182805461053590612527565b80156105825780601f1061055757610100808354040283529160200191610582565b820191906000526020600020905b81548152906001019060200180831161056557829003601f168201915b5050505050905090565b6000610597826112c3565b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60006105cb8261099a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361068d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821614806106b657506106b6813361043a565b610742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610684565b61074c8383611351565b505050565b61075b33826113f1565b6107e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f7665640000000000000000000000000000000000006064820152608401610684565b61074c8383836114b0565b60006107fd83610a2c565b821061088b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610684565b5073ffffffffffffffffffffffffffffffffffffffff919091166000908152600660209081526040808320938352929052205490565b61074c83838360405180602001604052806000815250610d51565b60006108e760085490565b8210610975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610684565b600882815481106109885761098861257a565b90600052602060002001549050919050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610a26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610684565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff8216610ad1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152608401610684565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b60606001805461050990612527565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610bce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4f7074696d69736d4d696e7461626c654552433732313a206f6e6c792062726960448201527f6467652063616e2063616c6c20746869732066756e6374696f6e0000000000006064820152608401610684565b610bd781611722565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca582604051610c1f91815260200190565b60405180910390a25050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610cf0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4f7074696d69736d4d696e7461626c654552433732313a206f6e6c792062726960448201527f6467652063616e2063616c6c20746869732066756e6374696f6e0000000000006064820152608401610684565b610cfa82826117fb565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688582604051610c1f91815260200190565b610d4d338383611815565b5050565b610d5b33836113f1565b610de7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f7665640000000000000000000000000000000000006064820152608401610684565b610df384848484611942565b50505050565b6060610e04826112c3565b6000610e0e6119e5565b90506000815111610e2e57604051806020016040528060008152506104f3565b80610e3884611130565b604051602001610e499291906125a9565b6040516020818303038152906040529392505050565b600a8054610e6c90612527565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9890612527565b8015610ee55780601f10610eba57610100808354040283529160200191610ee5565b820191906000526020600020905b815481529060010190602001808311610ec857829003601f168201915b505050505081565b60606000610efc836002612607565b610f07906002612644565b67ffffffffffffffff811115610f1f57610f1f6123cb565b6040519080825280601f01601f191660200182016040528015610f49576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110610f8057610f8061257a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110610fe357610fe361257a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061101f846002612607565b61102a906001612644565b90505b60018111156110c7577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061106b5761106b61257a565b1a60f81b8282815181106110815761108161257a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936110c08161265c565b905061102d565b5083156104f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610684565b60608160000361117357505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561119d578061118781612691565b91506111969050600a836126f8565b9150611177565b60008167ffffffffffffffff8111156111b8576111b86123cb565b6040519080825280601f01601f1916602001820160405280156111e2576020820181803683370190505b5090505b8415611265576111f760018361270c565b9150611204600a86612723565b61120f906030612644565b60f81b8183815181106112245761122461257a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061125e600a866126f8565b94506111e6565b949350505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d63000000000000000000000000000000000000000000000000000000001480610a265750610a26826119f4565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1661134e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610684565b50565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906113ab8261099a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806113fd8361099a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061146b575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b8061126557508373ffffffffffffffffffffffffffffffffffffffff166114918461058c565b73ffffffffffffffffffffffffffffffffffffffff1614949350505050565b8273ffffffffffffffffffffffffffffffffffffffff166114d08261099a565b73ffffffffffffffffffffffffffffffffffffffff1614611573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610684565b73ffffffffffffffffffffffffffffffffffffffff8216611615576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610684565b611620838383611ad7565b61162b600082611351565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546001929061166190849061270c565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040812080546001929061169c908490612644565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061172d8261099a565b905061173b81600084611ad7565b611746600083611351565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812080546001929061177c90849061270c565b909155505060008281526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555183919073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b610d4d828260405180602001604052806000815250611bdd565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036118aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610684565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61194d8484846114b0565b61195984848484611c80565b610df3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610684565b6060600a805461050990612527565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480611a8757507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610a2657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610a26565b73ffffffffffffffffffffffffffffffffffffffff8316611b3f57611b3a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611b7c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611b7c57611b7c8382611e73565b73ffffffffffffffffffffffffffffffffffffffff8216611ba05761074c81611f2a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461074c5761074c8282611fd9565b611be7838361202a565b611bf46000848484611c80565b61074c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610684565b600073ffffffffffffffffffffffffffffffffffffffff84163b15611e68576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290611cf7903390899088908890600401612737565b6020604051808303816000875af1925050508015611d50575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611d4d91810190612780565b60015b611e1d573d808015611d7e576040519150601f19603f3d011682016040523d82523d6000602084013e611d83565b606091505b508051600003611e15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610684565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611265565b506001949350505050565b60006001611e8084610a2c565b611e8a919061270c565b600083815260076020526040902054909150808214611eea5773ffffffffffffffffffffffffffffffffffffffff841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b50600091825260076020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600681528383209183525290812055565b600854600090611f3c9060019061270c565b60008381526009602052604081205460088054939450909284908110611f6457611f6461257a565b906000526020600020015490508060088381548110611f8557611f8561257a565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611fbd57611fbd61279d565b6001900381819060005260206000200160009055905550505050565b6000611fe483610a2c565b73ffffffffffffffffffffffffffffffffffffffff9093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b73ffffffffffffffffffffffffffffffffffffffff82166120a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610684565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610684565b61213f60008383611ad7565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290612175908490612644565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461134e57600080fd5b60006020828403121561223857600080fd5b81356104f3816121f8565b60005b8381101561225e578181015183820152602001612246565b83811115610df35750506000910152565b60008151808452612287816020860160208601612243565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104f3602083018461226f565b6000602082840312156122de57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461230957600080fd5b919050565b6000806040838503121561232157600080fd5b61232a836122e5565b946020939093013593505050565b60008060006060848603121561234d57600080fd5b612356846122e5565b9250612364602085016122e5565b9150604084013590509250925092565b60006020828403121561238657600080fd5b6104f3826122e5565b600080604083850312156123a257600080fd5b6123ab836122e5565b9150602083013580151581146123c057600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000806080858703121561241057600080fd5b612419856122e5565b9350612427602086016122e5565b925060408501359150606085013567ffffffffffffffff8082111561244b57600080fd5b818701915087601f83011261245f57600080fd5b813581811115612471576124716123cb565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156124b7576124b76123cb565b816040528281528a60208487010111156124d057600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561250757600080fd5b612510836122e5565b915061251e602084016122e5565b90509250929050565b600181811c9082168061253b57607f821691505b602082108103612574577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600083516125bb818460208801612243565b8351908301906125cf818360208801612243565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561263f5761263f6125d8565b500290565b60008219821115612657576126576125d8565b500190565b60008161266b5761266b6125d8565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036126c2576126c26125d8565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612707576127076126c9565b500490565b60008282101561271e5761271e6125d8565b500390565b600082612732576127326126c9565b500690565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612776608083018461226f565b9695505050505050565b60006020828403121561279257600080fd5b81516104f3816121f8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c634300080f000aa164736f6c634300080f000a00000000000000000000000000000000000000", "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", @@ -129,27 +143,6 @@ "intent": "Deploy EAS Implementation", "to": "0x420000000000000000000000000000000000002C" }, - { - "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000017586080604052348015600e575f80fd5b5060156019565b60d4565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101560d2575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b611677806100e15f395ff3fe6080604052600436106100bb575f3560e01c80637dfbd04911610071578063c4d66de81161004c578063c4d66de8146102f6578063d61a398b14610315578063dad544e014610346575f80fd5b80637dfbd049146102ac5780637fc81bb7146102c3578063b87ea8d4146102e2575f80fd5b8063394d2731116100a1578063394d2731146101f65780633e47158c1461021e57806354fd4d5014610257575f80fd5b80630a7617b3146101735780630c0544a314610194575f80fd5b3661016f573373ffffffffffffffffffffffffffffffffffffffff7f21346dddac42cc163a6523eefc19df981df7352c870dc3b0b17a6a92fc6fe8135c1614610130576040517f14885cf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805134815247602082018190529133917f213e72af0d3613bd643cff3059f872c1015e6541624e37872bf95eefbaf220a8910160405180910390a2005b5f80fd5b34801561017e575f80fd5b5061019261018d3660046112a1565b61035a565b005b34801561019f575f80fd5b506001546101d09070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610201575f80fd5b506001546101d0906fffffffffffffffffffffffffffffffff1681565b348015610229575f80fd5b5061023261051c565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ed565b348015610262575f80fd5b5061029f6040518060400160405280600581526020017f312e302e3100000000000000000000000000000000000000000000000000000081525081565b6040516101ed91906112bc565b3480156102b7575f80fd5b506101d06301e1338081565b3480156102ce575f80fd5b506101926102dd36600461130f565b610722565b3480156102ed575f80fd5b50610192610915565b348015610301575f80fd5b506101926103103660046112a1565b610ced565b348015610320575f80fd5b505f546102329062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b348015610351575f80fd5b50610232610ee9565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103db919061133e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043f576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811661048c576040517f99c6ec0800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff85161790945560408051949093049091168084526020840191909152917f16417cc372deec0caee5f52e2ad77a5f07b4591fd56b4ff31b6e20f817d4daeb91015b60405180910390a15050565b5f806105467fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff81161561056957919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000008152505160026105ac9190611386565b604080513060208201525f918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000009190911790610606906060015b604051602081830303815290604052805190602001205490565b1461063d576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513060208201526001918101919091525f9061065e906060016105ec565b905073ffffffffffffffffffffffffffffffffffffffff8116156106f0578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e9919061133e565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561077f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a3919061133e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610807576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806fffffffffffffffffffffffffffffffff165f03610852576040517fcf85916100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6301e133806fffffffffffffffffffffffffffffffff821611156108a2576040517f30b9f35e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546fffffffffffffffffffffffffffffffff8381167001000000000000000000000000000000008181028385161790945560408051949093049091168084526020840191909152917f4492086b630ed3846eec0979dd87a71c814ceb1c6dab80ab81e3450b21e4de289101610510565b60015461094a906fffffffffffffffffffffffffffffffff7001000000000000000000000000000000008204811691166113a3565b6fffffffffffffffffffffffffffffffff16421015610995576040517f1e4a9f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016426fffffffffffffffffffffffffffffffff161790555f6109ef734200000000000000000000000000000000000011610f63565b90505f610a0f734200000000000000000000000000000000000019610f63565b90505f610a2f73420000000000000000000000000000000000001a610f63565b90505f610a4f73420000000000000000000000000000000000001b610f63565b9050610a5a5f6111b0565b5f8282610a6786886113d3565b610a7191906113d3565b610a7b91906113d3565b9050805f03610ab6576040517fc8972e5200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517f54e7f42d000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101859052606481018690526201000090910473ffffffffffffffffffffffffffffffffffffffff16906354e7f42d906084015f60405180830381865afa158015610b3c573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610b81919081019061148b565b80519091505f819003610bc0576040517f763970d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b82811015610c70575f848281518110610bde57610bde61155a565b6020026020010151602001519050805f03610bf95750610c68565b5f610c20868481518110610c0f57610c0f61155a565b60200260200101515f0151836111d6565b905080610c59576040517fd68d1b1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c6382856113d3565b935050505b600101610bc3565b50838114610caa576040517f9c01eac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f73f9a13241a1848ec157967f3a85601709353e616f1f2605d818c0f2d21774df8385604051610cdb929190611587565b60405180910390a15050505050505050565b5f54610100900460ff1615808015610d0b57505f54600160ff909116105b80610d245750303b158015610d2457505f5460ff166001145b610db4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e10575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610e186111e9565b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff85160217905572015180000000000000000000000000000000006fffffffffffffffffffffffffffffffff4216176001558015610ee5575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610510565b5050565b5f610ef261051c565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f5e919061133e565b905090565b5f60018273ffffffffffffffffffffffffffffffffffffffff166382356d8a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610faf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd39190611622565b6001811115610fe457610fe46115f5565b1461101b576040517fb4726cbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff166366d003ac6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061109f919061133e565b73ffffffffffffffffffffffffffffffffffffffff16146110ec576040517fc3380cef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b476110f6836111b0565b8273ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015611140573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111649190611640565b915047826111728383611657565b146111a9576040517f87c91c5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050919050565b807f21346dddac42cc163a6523eefc19df981df7352c870dc3b0b17a6a92fc6fe8135d50565b5f6111e2835a8461126c565b9392505050565b336111f261051c565b73ffffffffffffffffffffffffffffffffffffffff161415801561123357503361121a610ee9565b73ffffffffffffffffffffffffffffffffffffffff1614155b1561126a576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f805f805f858888f1949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461129e575f80fd5b50565b5f602082840312156112b1575f80fd5b81356111e28161127d565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f6020828403121561131f575f80fd5b81356fffffffffffffffffffffffffffffffff811681146111e2575f80fd5b5f6020828403121561134e575f80fd5b81516111e28161127d565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761139d5761139d611359565b92915050565b6fffffffffffffffffffffffffffffffff8181168382160190808211156113cc576113cc611359565b5092915050565b8082018082111561139d5761139d611359565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715611436576114366113e6565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611483576114836113e6565b604052919050565b5f602080838503121561149c575f80fd5b825167ffffffffffffffff808211156114b3575f80fd5b818501915085601f8301126114c6575f80fd5b8151818111156114d8576114d86113e6565b6114e6848260051b0161143c565b818152848101925060069190911b830184019087821115611505575f80fd5b928401925b8184101561154f5760408489031215611521575f80fd5b611529611413565b84516115348161127d565b8152848601518682015283526040909301929184019161150a565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604080825283518282018190525f91906020906060850190828801855b828110156115df578151805173ffffffffffffffffffffffffffffffffffffffff1685528501518585015292850192908401906001016115a4565b5050508093505050508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f60208284031215611632575f80fd5b8151600281106111e2575f80fd5b5f60208284031215611650575f80fd5b5051919050565b8181038181111561139d5761139d61135956fea164736f6c6343000819000a0000000000000000", - "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", - "gasLimit": 1700000, - "intent": "Deploy FeeSplitter Implementation", - "to": "0x420000000000000000000000000000000000002C" - }, - { - "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000005d8608060405234801561001057600080fd5b506105b8806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806354fd4d5014610046578063cdcb760a14610098578063e0145f5c146100d0575b600080fd5b6100826040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161008f91906103f7565b60405180910390f35b6100ab6100a6366004610440565b6100ea565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161008f565b734e59b44847b379578588920ca78fbf26c0b4956c6100ab565b8051602080830191909120604080517fff00000000000000000000000000000000000000000000000000000000000000818501527f4e59b44847b379578588920ca78fbf26c0b4956c000000000000000000000000602182015260358101869052605580820184905282518083039091018152607590910190915280519201919091206000919073ffffffffffffffffffffffffffffffffffffffff81163b156101d85760405173ffffffffffffffffffffffffffffffffffffffff8216907ffbe57d889a7f75a4e0c7da304cd158fcaddc4b925cdd9f4cfb115c0f9e48009b90600090a291506103779050565b600080734e59b44847b379578588920ca78fbf26c0b4956c73ffffffffffffffffffffffffffffffffffffffff168787604051602001610219929190610519565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526102519161053f565b6000604051808303816000865af19150503d806000811461028e576040519150601f19603f3d011682016040523d82523d6000602084013e610293565b606091505b5091509150806102a29061055b565b60601c94508115806102e057508273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561032257806040517fcb0fc6f700000000000000000000000000000000000000000000000000000000815260040161031991906103f7565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff167f9b7318127ed899f286ea9ddd7925ed8ad24a682b6a825c3b5b3d88a3f00bc1d28860405161036a91815260200190565b60405180910390a2505050505b92915050565b60005b83811015610398578181015183820152602001610380565b838111156103a7576000848401525b50505050565b600081518084526103c581602086016020860161037d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061040a60208301846103ad565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561045357600080fd5b82359150602083013567ffffffffffffffff8082111561047257600080fd5b818501915085601f83011261048657600080fd5b81358181111561049857610498610411565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104de576104de610411565b816040528281528860208487010111156104f757600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b8281526000825161053181602085016020870161037d565b919091016020019392505050565b6000825161055181846020870161037d565b9190910192915050565b6000815160208301517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808216935060148310156105a35780818460140360031b1b83161693505b50505091905056fea164736f6c634300080f000a0000000000000000", - "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", - "gasLimit": 600000, - "intent": "Deploy ConditionalDeployer Implementation", - "to": "0x420000000000000000000000000000000000002C" - }, - { - "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000283608060405234801561001057600080fd5b50610263806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80631bec9d65146100515780631d8a4e921461006657806354fd4d501461009b57806378ecabce146100e4575b600080fd5b61006461005f3660046101ca565b610107565b005b7fc8bc8f9195cfb2d040744aac63412d02ffc186ea9bd519039edc4666ee9032bc546040519081526020015b60405180910390f35b6100d76040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161009291906101e3565b6100f76100f23660046101ca565b610178565b6040519015158152602001610092565b3373deaddeaddeaddeaddeaddeaddeaddeaddead000114610154576040517fee37fa8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8bc8f9195cfb2d040744aac63412d02ffc186ea9bd519039edc4666ee9032bc55565b60006101ab6101a57fc8bc8f9195cfb2d040744aac63412d02ffc186ea9bd519039edc4666ee9032bc5490565b836101b1565b92915050565b600081158015906101c3575081828416145b9392505050565b6000602082840312156101dc57600080fd5b5035919050565b600060208083528351808285015260005b81811015610210578581018301518582016040015282016101f4565b81811115610222576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01692909201604001939250505056fea164736f6c634300080f000a0000000000000000000000000000000000000000000000000000000000", - "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", - "gasLimit": 300000, - "intent": "Deploy L2DevFeatureFlags Implementation", - "to": "0x420000000000000000000000000000000000002C" - }, { "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca40000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000069e6080604052348015600e575f80fd5b506106828061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c8063331b637f1461004357806354fd4d5014610069578063ab4d6f75146100b2575b5f80fd5b610056610051366004610512565b6100c7565b6040519081526020015b60405180910390f35b6100a56040518060400160405280600581526020017f312e302e3200000000000000000000000000000000000000000000000000000081525081565b604051610060919061053b565b6100c56100c036600461058e565b61039e565b005b5f67ffffffffffffffff801683602001511115610110576040517fd1f79e8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604083015163ffffffff1015610152576040517f94338eba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606083015167ffffffffffffffff1015610198576040517f596a19a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82516040515f916101dd91859060200160609290921b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168252601482015260340190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181528282528051602091820120878201516060890151898501515f9487018590527fffffffffffffffff00000000000000000000000000000000000000000000000060c084811b8216602c8a015283901b1660348801527fffffffff0000000000000000000000000000000000000000000000000000000060e082901b16603c88015292965090949093919291016040516020818303038152906040526102ac906105bc565b90505f85826040516020016102cb929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060808d01519184018190529183015291505f90606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0300000000000000000000000000000000000000000000000000000000000000179a9950505050505050505050565b5f6103b76103b136859003850185610601565b836100c7565b90505f6103c38261043b565b509050806103fd576040517fe3c0081600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b827f5c37832d2e8d10e346e55ad62071a6a2f9fa5130614ef2ec6617555c6f467ba78560405161042d9190610622565b60405180910390a250505050565b5f805a835491505a6103e891031115939092509050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610475575f80fd5b919050565b5f60a0828403121561048a575f80fd5b60405160a0810181811067ffffffffffffffff821117156104d2577f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040529050806104e183610452565b8152602083013560208201526040830135604082015260608301356060820152608083013560808201525092915050565b5f8060c08385031215610523575f80fd5b61052d848461047a565b9460a0939093013593505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f8082840360c08112156105a0575f80fd5b60a08112156105ad575f80fd5b50919360a08501359350915050565b805160208083015191908110156105fb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8160200360031b1b821691505b50919050565b5f60a08284031215610611575f80fd5b61061b838361047a565b9392505050565b60a0810173ffffffffffffffffffffffffffffffffffffffff61064484610452565b168252602083013560208301526040830135604083015260608301356060830152608083013560808301529291505056fea164736f6c6343000819000a0000", "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", @@ -179,31 +172,38 @@ "to": "0x420000000000000000000000000000000000002C" }, { - "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000010b1608060405234801561001057600080fd5b50611091806100206000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80635cf24969116100f9578063c598591811610097578063e591b28211610071578063e591b28214610434578063e81b2c6d1461044e578063f820614014610457578063fe3d57101461046057600080fd5b8063c598591814610404578063d844471514610424578063dad544e01461042c57600080fd5b80638381f58a116100d35780638381f58a146103be5780638b239f73146103d25780639e8c4966146103db578063b80777ea146103e457600080fd5b80635cf249691461038557806364ca23ef1461038e57806368d5dca6146103a257600080fd5b80634397dfef1161016657806347af267b1161014057806347af267b146103145780634d5d9a2a1461033757806354fd4d5014610368578063550fcdc91461037d57600080fd5b80634397dfef146102c3578063440a5e20146102f957806346a4d7801461030157600080fd5b806316d3bc7f116101a257806316d3bc7f14610202578063213268491461022f5780633db6be2b1461028e5780633e47158c1461029657600080fd5b8063015d8eb9146101c9578063098999be146101de57806309bd5a60146101e6575b600080fd5b6101dc6101d7366004610d9c565b610491565b005b6101dc6105d1565b6101ef60025481565b6040519081526020015b60405180910390f35b6008546102169067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101f9565b7f435553544f4d5f4741535f544f4b454e0000000000000000000000000000000060005260096020527f4ad9936a67aeb1898ef7b848aecdf71a1f8999fbf63ff2f5b5691cb14bedfe4d5460ff165b60405190151581526020016101f9565b6101dc6105e4565b61029e61060e565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101f9565b6102cb610819565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260ff9091166020830152016101f9565b6101dc610880565b6101dc61030f366004610e0e565b6108d7565b61027e610322366004610e0e565b60096020526000908152604090205460ff1681565b6008546103539068010000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016101f9565b6103706108ec565b6040516101f99190610e57565b61037061094c565b6101ef60015481565b6003546102169067ffffffffffffffff1681565b6003546103539068010000000000000000900463ffffffff1681565b6000546102169067ffffffffffffffff1681565b6101ef60055481565b6101ef60065481565b6000546102169068010000000000000000900467ffffffffffffffff1681565b600354610353906c01000000000000000000000000900463ffffffff1681565b610370610a88565b61029e610b79565b73deaddeaddeaddeaddeaddeaddeaddeaddead000161029e565b6101ef60045481565b6101ef60075481565b60085461047e906c01000000000000000000000000900461ffff1681565b60405161ffff90911681526020016101f9565b3373deaddeaddeaddeaddeaddeaddeaddeaddead000114610539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4c31426c6f636b3a206f6e6c7920746865206465706f7369746f72206163636f60448201527f756e742063616e20736574204c3120626c6f636b2076616c756573000000000060648201526084015b60405180910390fd5b6000805467ffffffffffffffff98891668010000000000000000027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116998916999099179890981790975560019490945560029290925560038054919094167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009190911617909255600491909155600555600655565b6105d9610880565b60a43560a01c600855565b6105ec610880565b6dffff00000000000000000000000060b03560901c1660a43560a01c17600855565b6000806106397fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff81161561065c57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000081525051600261069f9190610ea8565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000091909117906106fa906060015b604051602081830303815290604052805190602001205490565b14610731576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051306020820152600191810191909152600090610753906060016106e0565b905073ffffffffffffffffffffffffffffffffffffffff8116156107e7578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e09190610f0c565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4c31426c6f636b4347543a20646570726563617465640000000000000000000060448201526000908190606401610530565b73deaddeaddeaddeaddeaddeaddeaddeaddead00013381146108aa57633cc50b456000526004601cfd5b60043560801c60035560143560801c60005560243560015560443560075560643560025560843560045550565b6108e033610bf1565b6108e981610cce565b50565b606061092860408051808201909152600581527f312e392e30000000000000000000000000000000000000000000000000000000602082015290565b6040516020016109389190610f49565b604051602081830303815290604052905090565b60606109a27f435553544f4d5f4741535f544f4b454e0000000000000000000000000000000060005260096020527f4ad9936a67aeb1898ef7b848aecdf71a1f8999fbf63ff2f5b5691cb14bedfe4d5460ff1690565b6109de575060408051808201909152600381527f4554480000000000000000000000000000000000000000000000000000000000602082015290565b73420000000000000000000000000000000000002a73ffffffffffffffffffffffffffffffffffffffff1663550fcdc96040518163ffffffff1660e01b8152600401600060405180830381865afa158015610a3d573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610a839190810190610fb9565b905090565b6060610ade7f435553544f4d5f4741535f544f4b454e0000000000000000000000000000000060005260096020527f4ad9936a67aeb1898ef7b848aecdf71a1f8999fbf63ff2f5b5691cb14bedfe4d5460ff1690565b610b1a575060408051808201909152600581527f4574686572000000000000000000000000000000000000000000000000000000602082015290565b73420000000000000000000000000000000000002a73ffffffffffffffffffffffffffffffffffffffff1663d84447156040518163ffffffff1660e01b8152600401600060405180830381865afa158015610a3d573d6000803e3d6000fd5b6000610b8361060e565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a839190610f0c565b73ffffffffffffffffffffffffffffffffffffffff811673deaddeaddeaddeaddeaddeaddeaddeaddead00011480610c5b5750610c2c610b79565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b80610c985750610c6961060e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b6108e9576040517fbe9d7ca600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526009602052604090205460ff1615610d17576040517f4f45326000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526009602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091559051909183917fb876f6594132c89891d2fd198e925e999be741ec809abb58bfe9b966876cc06c9190a350565b803567ffffffffffffffff81168114610d9757600080fd5b919050565b600080600080600080600080610100898b031215610db957600080fd5b610dc289610d7f565b9750610dd060208a01610d7f565b96506040890135955060608901359450610dec60808a01610d7f565b979a969950949793969560a0850135955060c08501359460e001359350915050565b600060208284031215610e2057600080fd5b5035919050565b60005b83811015610e42578181015183820152602001610e2a565b83811115610e51576000848401525b50505050565b6020815260008251806020840152610e76816040850160208701610e27565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610f07577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500290565b600060208284031215610f1e57600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610f4257600080fd5b9392505050565b60008251610f5b818460208701610e27565b7f2b637573746f6d2d6761732d746f6b656e2e3100000000000000000000000000920191825250601301919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610fcb57600080fd5b815167ffffffffffffffff80821115610fe357600080fd5b818401915084601f830112610ff757600080fd5b81518181111561100957611009610f8a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561104f5761104f610f8a565b8160405282815287602084870101111561106857600080fd5b611079836020830160208801610e27565b97965050505050505056fea164736f6c634300080f000a000000000000000000000000000000", + "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca40000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000036d608060405234801561001057600080fd5b5061034d806100206000396000f3fe6080604052600436106100345760003560e01c80632e1a7d4d1461003957806354fd4d501461005b578063d0e30db0146100ba575b600080fd5b34801561004557600080fd5b5061005961005436600461025b565b6100c2565b005b34801561006757600080fd5b506100a46040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100b19190610274565b60405180910390f35b6100596101cb565b3373420000000000000000000000000000000000002a1461010f576040517f565369fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b47811115610149576040517f7b7f21e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80336040516101579061024f565b73ffffffffffffffffffffffffffffffffffffffff90911681526020016040518091039082f0905080158015610191573d6000803e3d6000fd5b505060405181815233907fb1cce8684b4ffa8667b4577654e61ee3480d661ee9c27522ac80e211f6bd4d259060200160405180910390a250565b3373420000000000000000000000000000000000002a14610218576040517f565369fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405134815233907f7ff07ce9a287649537e4b012e45cf012d90228b12e2b56bb03515a6b5436fcdf9060200160405180910390a2565b6059806102e883390190565b60006020828403121561026d57600080fd5b5035919050565b600060208083528351808285015260005b818110156102a157858101830151858201604001528201610285565b818111156102b3576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01692909201604001939250505056fe608060405260405160593803806059833981016040819052601e91602a565b806001600160a01b0316ff5b600060208284031215603b57600080fd5b81516001600160a01b0381168114605157600080fd5b939250505056fea164736f6c634300080f000a00000000000000000000000000000000000000", "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", - "gasLimit": 1100000, - "intent": "Deploy L1BlockCGT Implementation", + "gasLimit": 400000, + "intent": "Deploy NativeAssetLiquidity Implementation", "to": "0x420000000000000000000000000000000000002C" }, { - "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000862608060405234801561001057600080fd5b50610842806100206000396000f3fe6080604052600436106100695760003560e01c806382e3702d1161004357806382e3702d146100f6578063c2b3e5ac14610136578063ecc704281461014957600080fd5b80633f827a5a1461009257806344df8e70146100bf57806354fd4d50146100d457600080fd5b3661008d5761008b33620186a0604051806020016040528060008152506101ae565b005b600080fd5b34801561009e57600080fd5b506100a7600181565b60405161ffff90911681526020015b60405180910390f35b3480156100cb57600080fd5b5061008b610284565b3480156100e057600080fd5b506100e96102bc565b6040516100b691906105dd565b34801561010257600080fd5b506101266101113660046105f7565b60006020819052908152604090205460ff1681565b60405190151581526020016100b6565b61008b61014436600461063f565b6101ae565b34801561015557600080fd5b506101a06001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016100b6565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663213268496040518163ffffffff1660e01b8152600401602060405180830381865afa15801561020d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102319190610743565b801561023d5750600034115b15610274576040517fcdfaa11100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61027f83838361031c565b505050565b4761028e816104e0565b60405181907f7967de617a5ac1cc7eba2d6f37570a0135afa950d8bb77cdd35f0d0b4e85a16f90600090a250565b60606102f860408051808201909152600581527f312e322e30000000000000000000000000000000000000000000000000000000602082015290565b6040516020016103089190610765565b604051602081830303815290604052905090565b60006103b26040518060c001604052806103766001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b815233602082015273ffffffffffffffffffffffffffffffffffffffff871660408201523460608201526080810186905260a00184905261050a565b600081815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055905073ffffffffffffffffffffffffffffffffffffffff84163361044d6001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b7f02a52367d10742d8032712c1bb8e0144ff1ec5ffda1ed7d70bb05a27449550543487878760405161048294939291906107a6565b60405180910390a45050600180547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8082168301167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b806040516104ed90610557565b6040518091039082f090508015801561027f573d6000803e3d6000fd5b80516020808301516040808501516060860151608087015160a0880151935160009761053a9790969591016107d6565b604051602081830303815290604052805190602001209050919050565b60088061082e83390190565b60005b8381101561057e578181015183820152602001610566565b8381111561058d576000848401525b50505050565b600081518084526105ab816020860160208601610563565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006105f06020830184610593565b9392505050565b60006020828403121561060957600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060006060848603121561065457600080fd5b833573ffffffffffffffffffffffffffffffffffffffff8116811461067857600080fd5b925060208401359150604084013567ffffffffffffffff8082111561069c57600080fd5b818601915086601f8301126106b057600080fd5b8135818111156106c2576106c2610610565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561070857610708610610565b8160405282815289602084870101111561072157600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b60006020828403121561075557600080fd5b815180151581146105f057600080fd5b60008251610777818460208701610563565b7f2b637573746f6d2d6761732d746f6b656e000000000000000000000000000000920191825250601101919050565b8481528360208201526080604082015260006107c56080830185610593565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261082160c0830184610593565b9897505050505050505056fe608060405230fffea164736f6c634300080f000a000000000000000000000000000000000000000000000000000000000000", + "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca40000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000146a608060405234801561001057600080fd5b5061001961001e565b6100de565b600054610100900460ff161561008a5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156100dc576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b61137d806100ed6000396000f3fe6080604052600436106100dd5760003560e01c80638da5cb5b1161007f578063d844471511610059578063d844471514610256578063dad544e01461026b578063f2fde38b14610280578063f46eccc4146102a057600080fd5b80638da5cb5b146101eb5780639065714714610216578063c6f69fbb1461023657600080fd5b806344df8e70116100bb57806344df8e701461016357806354fd4d501461016b578063550fcdc9146101c1578063715018a6146101d657600080fd5b80630c984832146100e25780633e47158c1461010457806340c10f1914610143575b600080fd5b3480156100ee57600080fd5b506101026100fd366004610ec7565b6102e0565b005b34801561011057600080fd5b5061011961035f565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014f57600080fd5b5061010261015e366004610eeb565b61056a565b6101026106cc565b34801561017757600080fd5b506101b46040518060400160405280600581526020017f312e302e3100000000000000000000000000000000000000000000000000000081525081565b60405161013a9190610f17565b3480156101cd57600080fd5b506101b46107c2565b3480156101e257600080fd5b50610102610850565b3480156101f757600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff16610119565b34801561022257600080fd5b50610102610231366004611064565b610864565b34801561024257600080fd5b50610102610251366004610ec7565b610a29565b34801561026257600080fd5b506101b4610aa5565b34801561027757600080fd5b50610119610ab2565b34801561028c57600080fd5b5061010261029b366004610ec7565b610b2f565b3480156102ac57600080fd5b506102d06102bb366004610ec7565b60656020526000908152604090205460ff1681565b604051901515815260200161013a565b6102e8610be6565b73ffffffffffffffffffffffffffffffffffffffff811660008181526065602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f83b05b6735acd4b85e3bded8e72c851d1a87718f81e3c8e6f0c9d9a2baa88e469190a250565b60008061038a7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff8116156103ad57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000008152505160026103f091906110da565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000919091179061044b906060015b604051602081830303815290604052805190602001205490565b14610482576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513060208201526001918101919091526000906104a490606001610431565b905073ffffffffffffffffffffffffffffffffffffffff811615610538578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561050d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610531919061113e565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526065602052604090205460ff166105b3576040517f5fbc4ede00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810182905273420000000000000000000000000000000000002990632e1a7d4d90602401600060405180830381600087803b15801561061957600080fd5b505af115801561062d573d6000803e3d6000fd5b50505050808260405161063f90610e99565b73ffffffffffffffffffffffffffffffffffffffff90911681526020016040518091039082f0905080158015610679573d6000803e3d6000fd5b505060405181815273ffffffffffffffffffffffffffffffffffffffff83169033907fec89d80a36947288037745287dde87d62cd8c141d5323130b3d26d97d84004c79060200160405180910390a35050565b3360009081526065602052604090205460ff16610715576040517f5fbc4ede00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73420000000000000000000000000000000000002973ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561077157600080fd5b505af1158015610785573d6000803e3d6000fd5b50506040513481523393507f875e07afd7ce17c6531b1a6b7b34829dcd8b7e6639448afbd6a8e29fa1422b829250602001905060405180910390a2565b606780546107cf9061115b565b80601f01602080910402602001604051908101604052809291908181526020018280546107fb9061115b565b80156108485780601f1061081d57610100808354040283529160200191610848565b820191906000526020600020905b81548152906001019060200180831161082b57829003601f168201915b505050505081565b610858610be6565b6108626000610c67565b565b600054610100900460ff16158080156108845750600054600160ff909116105b8061089e5750303b15801561089e575060005460ff166001145b61092f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561098d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610995610cde565b61099d610d5f565b6109a684610b2f565b60666109b284826111fd565b5060676109bf83826111fd565b508015610a2357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610a31610be6565b73ffffffffffffffffffffffffffffffffffffffff811660008181526065602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517fdf6bf03dfab5b4ccec3ba95544b98d7ecc9d4b9293d8673e86cb6edb5ac0cb629190a250565b606680546107cf9061115b565b6000610abc61035f565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2a919061113e565b905090565b610b37610be6565b73ffffffffffffffffffffffffffffffffffffffff8116610bda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610926565b610be381610c67565b50565b60335473ffffffffffffffffffffffffffffffffffffffff163314610862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610926565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b33610ce761035f565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d28575033610d0f610ab2565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610862576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16610df6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610926565b610862600054610100900460ff16610e90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610926565b61086233610c67565b60598061131883390190565b73ffffffffffffffffffffffffffffffffffffffff81168114610be357600080fd5b600060208284031215610ed957600080fd5b8135610ee481610ea5565b9392505050565b60008060408385031215610efe57600080fd5b8235610f0981610ea5565b946020939093013593505050565b600060208083528351808285015260005b81811015610f4457858101830151858201604001528201610f28565b81811115610f56576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112610fca57600080fd5b813567ffffffffffffffff80821115610fe557610fe5610f8a565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561102b5761102b610f8a565b8160405283815286602085880101111561104457600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561107957600080fd5b833561108481610ea5565b9250602084013567ffffffffffffffff808211156110a157600080fd5b6110ad87838801610fb9565b935060408601359150808211156110c357600080fd5b506110d086828701610fb9565b9150509250925092565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611139577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500290565b60006020828403121561115057600080fd5b8151610ee481610ea5565b600181811c9082168061116f57607f821691505b6020821081036111a8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f8211156111f857600081815260208120601f850160051c810160208610156111d55750805b601f850160051c820191505b818110156111f4578281556001016111e1565b5050505b505050565b815167ffffffffffffffff81111561121757611217610f8a565b61122b81611225845461115b565b846111ae565b602080601f83116001811461127e57600084156112485750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556111f4565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156112cb578886015182559484019460019091019084016112ac565b508582101561130757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fe608060405260405160593803806059833981016040819052601e91602a565b806001600160a01b0316ff5b600060208284031215603b57600080fd5b81516001600160a01b0381168114605157600080fd5b939250505056fea164736f6c634300080f000a00000000000000000000000000000000000000000000", "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", - "gasLimit": 750000, - "intent": "Deploy L2ToL1MessagePasserCGT Implementation", + "gasLimit": 1400000, + "intent": "Deploy LiquidityController Implementation", "to": "0x420000000000000000000000000000000000002C" }, { - "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca40000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000146a608060405234801561001057600080fd5b5061001961001e565b6100de565b600054610100900460ff161561008a5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156100dc576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b61137d806100ed6000396000f3fe6080604052600436106100dd5760003560e01c80638da5cb5b1161007f578063d844471511610059578063d844471514610256578063dad544e01461026b578063f2fde38b14610280578063f46eccc4146102a057600080fd5b80638da5cb5b146101eb5780639065714714610216578063c6f69fbb1461023657600080fd5b806344df8e70116100bb57806344df8e701461016357806354fd4d501461016b578063550fcdc9146101c1578063715018a6146101d657600080fd5b80630c984832146100e25780633e47158c1461010457806340c10f1914610143575b600080fd5b3480156100ee57600080fd5b506101026100fd366004610ec7565b6102e0565b005b34801561011057600080fd5b5061011961035f565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014f57600080fd5b5061010261015e366004610eeb565b61056a565b6101026106cc565b34801561017757600080fd5b506101b46040518060400160405280600581526020017f312e302e3100000000000000000000000000000000000000000000000000000081525081565b60405161013a9190610f17565b3480156101cd57600080fd5b506101b46107c2565b3480156101e257600080fd5b50610102610850565b3480156101f757600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff16610119565b34801561022257600080fd5b50610102610231366004611064565b610864565b34801561024257600080fd5b50610102610251366004610ec7565b610a29565b34801561026257600080fd5b506101b4610aa5565b34801561027757600080fd5b50610119610ab2565b34801561028c57600080fd5b5061010261029b366004610ec7565b610b2f565b3480156102ac57600080fd5b506102d06102bb366004610ec7565b60656020526000908152604090205460ff1681565b604051901515815260200161013a565b6102e8610be6565b73ffffffffffffffffffffffffffffffffffffffff811660008181526065602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f83b05b6735acd4b85e3bded8e72c851d1a87718f81e3c8e6f0c9d9a2baa88e469190a250565b60008061038a7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff8116156103ad57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000008152505160026103f091906110da565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000919091179061044b906060015b604051602081830303815290604052805190602001205490565b14610482576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513060208201526001918101919091526000906104a490606001610431565b905073ffffffffffffffffffffffffffffffffffffffff811615610538578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561050d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610531919061113e565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526065602052604090205460ff166105b3576040517f5fbc4ede00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810182905273420000000000000000000000000000000000002990632e1a7d4d90602401600060405180830381600087803b15801561061957600080fd5b505af115801561062d573d6000803e3d6000fd5b50505050808260405161063f90610e99565b73ffffffffffffffffffffffffffffffffffffffff90911681526020016040518091039082f0905080158015610679573d6000803e3d6000fd5b505060405181815273ffffffffffffffffffffffffffffffffffffffff83169033907fec89d80a36947288037745287dde87d62cd8c141d5323130b3d26d97d84004c79060200160405180910390a35050565b3360009081526065602052604090205460ff16610715576040517f5fbc4ede00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73420000000000000000000000000000000000002973ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561077157600080fd5b505af1158015610785573d6000803e3d6000fd5b50506040513481523393507f875e07afd7ce17c6531b1a6b7b34829dcd8b7e6639448afbd6a8e29fa1422b829250602001905060405180910390a2565b606780546107cf9061115b565b80601f01602080910402602001604051908101604052809291908181526020018280546107fb9061115b565b80156108485780601f1061081d57610100808354040283529160200191610848565b820191906000526020600020905b81548152906001019060200180831161082b57829003601f168201915b505050505081565b610858610be6565b6108626000610c67565b565b600054610100900460ff16158080156108845750600054600160ff909116105b8061089e5750303b15801561089e575060005460ff166001145b61092f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561098d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610995610cde565b61099d610d5f565b6109a684610b2f565b60666109b284826111fd565b5060676109bf83826111fd565b508015610a2357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610a31610be6565b73ffffffffffffffffffffffffffffffffffffffff811660008181526065602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517fdf6bf03dfab5b4ccec3ba95544b98d7ecc9d4b9293d8673e86cb6edb5ac0cb629190a250565b606680546107cf9061115b565b6000610abc61035f565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2a919061113e565b905090565b610b37610be6565b73ffffffffffffffffffffffffffffffffffffffff8116610bda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610926565b610be381610c67565b50565b60335473ffffffffffffffffffffffffffffffffffffffff163314610862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610926565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b33610ce761035f565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d28575033610d0f610ab2565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610862576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16610df6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610926565b610862600054610100900460ff16610e90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610926565b61086233610c67565b60598061131883390190565b73ffffffffffffffffffffffffffffffffffffffff81168114610be357600080fd5b600060208284031215610ed957600080fd5b8135610ee481610ea5565b9392505050565b60008060408385031215610efe57600080fd5b8235610f0981610ea5565b946020939093013593505050565b600060208083528351808285015260005b81811015610f4457858101830151858201604001528201610f28565b81811115610f56576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112610fca57600080fd5b813567ffffffffffffffff80821115610fe557610fe5610f8a565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561102b5761102b610f8a565b8160405283815286602085880101111561104457600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561107957600080fd5b833561108481610ea5565b9250602084013567ffffffffffffffff808211156110a157600080fd5b6110ad87838801610fb9565b935060408601359150808211156110c357600080fd5b506110d086828701610fb9565b9150509250925092565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611139577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500290565b60006020828403121561115057600080fd5b8151610ee481610ea5565b600181811c9082168061116f57607f821691505b6020821081036111a8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f8211156111f857600081815260208120601f850160051c810160208610156111d55750805b601f850160051c820191505b818110156111f4578281556001016111e1565b5050505b505050565b815167ffffffffffffffff81111561121757611217610f8a565b61122b81611225845461115b565b846111ae565b602080601f83116001811461127e57600084156112485750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556111f4565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156112cb578886015182559484019460019091019084016112ac565b508582101561130757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fe608060405260405160593803806059833981016040819052601e91602a565b806001600160a01b0316ff5b600060208284031215603b57600080fd5b81516001600160a01b0381168114605157600080fd5b939250505056fea164736f6c634300080f000a00000000000000000000000000000000000000000000", + "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000017586080604052348015600e575f80fd5b5060156019565b60d4565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101560d2575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b611677806100e15f395ff3fe6080604052600436106100bb575f3560e01c80637dfbd04911610071578063c4d66de81161004c578063c4d66de8146102f6578063d61a398b14610315578063dad544e014610346575f80fd5b80637dfbd049146102ac5780637fc81bb7146102c3578063b87ea8d4146102e2575f80fd5b8063394d2731116100a1578063394d2731146101f65780633e47158c1461021e57806354fd4d5014610257575f80fd5b80630a7617b3146101735780630c0544a314610194575f80fd5b3661016f573373ffffffffffffffffffffffffffffffffffffffff7f21346dddac42cc163a6523eefc19df981df7352c870dc3b0b17a6a92fc6fe8135c1614610130576040517f14885cf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805134815247602082018190529133917f213e72af0d3613bd643cff3059f872c1015e6541624e37872bf95eefbaf220a8910160405180910390a2005b5f80fd5b34801561017e575f80fd5b5061019261018d3660046112a1565b61035a565b005b34801561019f575f80fd5b506001546101d09070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610201575f80fd5b506001546101d0906fffffffffffffffffffffffffffffffff1681565b348015610229575f80fd5b5061023261051c565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ed565b348015610262575f80fd5b5061029f6040518060400160405280600581526020017f312e302e3100000000000000000000000000000000000000000000000000000081525081565b6040516101ed91906112bc565b3480156102b7575f80fd5b506101d06301e1338081565b3480156102ce575f80fd5b506101926102dd36600461130f565b610722565b3480156102ed575f80fd5b50610192610915565b348015610301575f80fd5b506101926103103660046112a1565b610ced565b348015610320575f80fd5b505f546102329062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b348015610351575f80fd5b50610232610ee9565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103db919061133e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043f576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811661048c576040517f99c6ec0800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff85161790945560408051949093049091168084526020840191909152917f16417cc372deec0caee5f52e2ad77a5f07b4591fd56b4ff31b6e20f817d4daeb91015b60405180910390a15050565b5f806105467fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff81161561056957919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000008152505160026105ac9190611386565b604080513060208201525f918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000009190911790610606906060015b604051602081830303815290604052805190602001205490565b1461063d576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513060208201526001918101919091525f9061065e906060016105ec565b905073ffffffffffffffffffffffffffffffffffffffff8116156106f0578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e9919061133e565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561077f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a3919061133e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610807576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806fffffffffffffffffffffffffffffffff165f03610852576040517fcf85916100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6301e133806fffffffffffffffffffffffffffffffff821611156108a2576040517f30b9f35e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546fffffffffffffffffffffffffffffffff8381167001000000000000000000000000000000008181028385161790945560408051949093049091168084526020840191909152917f4492086b630ed3846eec0979dd87a71c814ceb1c6dab80ab81e3450b21e4de289101610510565b60015461094a906fffffffffffffffffffffffffffffffff7001000000000000000000000000000000008204811691166113a3565b6fffffffffffffffffffffffffffffffff16421015610995576040517f1e4a9f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016426fffffffffffffffffffffffffffffffff161790555f6109ef734200000000000000000000000000000000000011610f63565b90505f610a0f734200000000000000000000000000000000000019610f63565b90505f610a2f73420000000000000000000000000000000000001a610f63565b90505f610a4f73420000000000000000000000000000000000001b610f63565b9050610a5a5f6111b0565b5f8282610a6786886113d3565b610a7191906113d3565b610a7b91906113d3565b9050805f03610ab6576040517fc8972e5200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517f54e7f42d000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101859052606481018690526201000090910473ffffffffffffffffffffffffffffffffffffffff16906354e7f42d906084015f60405180830381865afa158015610b3c573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610b81919081019061148b565b80519091505f819003610bc0576040517f763970d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b82811015610c70575f848281518110610bde57610bde61155a565b6020026020010151602001519050805f03610bf95750610c68565b5f610c20868481518110610c0f57610c0f61155a565b60200260200101515f0151836111d6565b905080610c59576040517fd68d1b1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c6382856113d3565b935050505b600101610bc3565b50838114610caa576040517f9c01eac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f73f9a13241a1848ec157967f3a85601709353e616f1f2605d818c0f2d21774df8385604051610cdb929190611587565b60405180910390a15050505050505050565b5f54610100900460ff1615808015610d0b57505f54600160ff909116105b80610d245750303b158015610d2457505f5460ff166001145b610db4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e10575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610e186111e9565b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff85160217905572015180000000000000000000000000000000006fffffffffffffffffffffffffffffffff4216176001558015610ee5575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610510565b5050565b5f610ef261051c565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f5e919061133e565b905090565b5f60018273ffffffffffffffffffffffffffffffffffffffff166382356d8a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610faf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd39190611622565b6001811115610fe457610fe46115f5565b1461101b576040517fb4726cbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff166366d003ac6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061109f919061133e565b73ffffffffffffffffffffffffffffffffffffffff16146110ec576040517fc3380cef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b476110f6836111b0565b8273ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015611140573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111649190611640565b915047826111728383611657565b146111a9576040517f87c91c5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050919050565b807f21346dddac42cc163a6523eefc19df981df7352c870dc3b0b17a6a92fc6fe8135d50565b5f6111e2835a8461126c565b9392505050565b336111f261051c565b73ffffffffffffffffffffffffffffffffffffffff161415801561123357503361121a610ee9565b73ffffffffffffffffffffffffffffffffffffffff1614155b1561126a576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f805f805f858888f1949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461129e575f80fd5b50565b5f602082840312156112b1575f80fd5b81356111e28161127d565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f6020828403121561131f575f80fd5b81356fffffffffffffffffffffffffffffffff811681146111e2575f80fd5b5f6020828403121561134e575f80fd5b81516111e28161127d565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761139d5761139d611359565b92915050565b6fffffffffffffffffffffffffffffffff8181168382160190808211156113cc576113cc611359565b5092915050565b8082018082111561139d5761139d611359565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715611436576114366113e6565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611483576114836113e6565b604052919050565b5f602080838503121561149c575f80fd5b825167ffffffffffffffff808211156114b3575f80fd5b818501915085601f8301126114c6575f80fd5b8151818111156114d8576114d86113e6565b6114e6848260051b0161143c565b818152848101925060069190911b830184019087821115611505575f80fd5b928401925b8184101561154f5760408489031215611521575f80fd5b611529611413565b84516115348161127d565b8152848601518682015283526040909301929184019161150a565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604080825283518282018190525f91906020906060850190828801855b828110156115df578151805173ffffffffffffffffffffffffffffffffffffffff1685528501518585015292850192908401906001016115a4565b5050508093505050508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f60208284031215611632575f80fd5b8151600281106111e2575f80fd5b5f60208284031215611650575f80fd5b5051919050565b8181038181111561139d5761139d61135956fea164736f6c6343000819000a0000000000000000", "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", - "gasLimit": 1400000, - "intent": "Deploy LiquidityController Implementation", + "gasLimit": 1700000, + "intent": "Deploy FeeSplitter Implementation", "to": "0x420000000000000000000000000000000000002C" }, { - "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca40000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000036d608060405234801561001057600080fd5b5061034d806100206000396000f3fe6080604052600436106100345760003560e01c80632e1a7d4d1461003957806354fd4d501461005b578063d0e30db0146100ba575b600080fd5b34801561004557600080fd5b5061005961005436600461025b565b6100c2565b005b34801561006757600080fd5b506100a46040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100b19190610274565b60405180910390f35b6100596101cb565b3373420000000000000000000000000000000000002a1461010f576040517f565369fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b47811115610149576040517f7b7f21e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80336040516101579061024f565b73ffffffffffffffffffffffffffffffffffffffff90911681526020016040518091039082f0905080158015610191573d6000803e3d6000fd5b505060405181815233907fb1cce8684b4ffa8667b4577654e61ee3480d661ee9c27522ac80e211f6bd4d259060200160405180910390a250565b3373420000000000000000000000000000000000002a14610218576040517f565369fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405134815233907f7ff07ce9a287649537e4b012e45cf012d90228b12e2b56bb03515a6b5436fcdf9060200160405180910390a2565b6059806102e883390190565b60006020828403121561026d57600080fd5b5035919050565b600060208083528351808285015260005b818110156102a157858101830151858201604001528201610285565b818111156102b3576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01692909201604001939250505056fe608060405260405160593803806059833981016040819052601e91602a565b806001600160a01b0316ff5b600060208284031215603b57600080fd5b81516001600160a01b0381168114605157600080fd5b939250505056fea164736f6c634300080f000a00000000000000000000000000000000000000", + "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000005d8608060405234801561001057600080fd5b506105b8806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806354fd4d5014610046578063cdcb760a14610098578063e0145f5c146100d0575b600080fd5b6100826040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161008f91906103f7565b60405180910390f35b6100ab6100a6366004610440565b6100ea565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161008f565b734e59b44847b379578588920ca78fbf26c0b4956c6100ab565b8051602080830191909120604080517fff00000000000000000000000000000000000000000000000000000000000000818501527f4e59b44847b379578588920ca78fbf26c0b4956c000000000000000000000000602182015260358101869052605580820184905282518083039091018152607590910190915280519201919091206000919073ffffffffffffffffffffffffffffffffffffffff81163b156101d85760405173ffffffffffffffffffffffffffffffffffffffff8216907ffbe57d889a7f75a4e0c7da304cd158fcaddc4b925cdd9f4cfb115c0f9e48009b90600090a291506103779050565b600080734e59b44847b379578588920ca78fbf26c0b4956c73ffffffffffffffffffffffffffffffffffffffff168787604051602001610219929190610519565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526102519161053f565b6000604051808303816000865af19150503d806000811461028e576040519150601f19603f3d011682016040523d82523d6000602084013e610293565b606091505b5091509150806102a29061055b565b60601c94508115806102e057508273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561032257806040517fcb0fc6f700000000000000000000000000000000000000000000000000000000815260040161031991906103f7565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff167f9b7318127ed899f286ea9ddd7925ed8ad24a682b6a825c3b5b3d88a3f00bc1d28860405161036a91815260200190565b60405180910390a2505050505b92915050565b60005b83811015610398578181015183820152602001610380565b838111156103a7576000848401525b50505050565b600081518084526103c581602086016020860161037d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061040a60208301846103ad565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561045357600080fd5b82359150602083013567ffffffffffffffff8082111561047257600080fd5b818501915085601f83011261048657600080fd5b81358181111561049857610498610411565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104de576104de610411565b816040528281528860208487010111156104f757600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b8281526000825161053181602085016020870161037d565b919091016020019392505050565b6000825161055181846020870161037d565b9190910192915050565b6000815160208301517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808216935060148310156105a35780818460140360031b1b83161693505b50505091905056fea164736f6c634300080f000a0000000000000000", "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", - "gasLimit": 400000, - "intent": "Deploy NativeAssetLiquidity Implementation", + "gasLimit": 600000, + "intent": "Deploy ConditionalDeployer Implementation", + "to": "0x420000000000000000000000000000000000002C" + }, + { + "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000283608060405234801561001057600080fd5b50610263806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80631bec9d65146100515780631d8a4e921461006657806354fd4d501461009b57806378ecabce146100e4575b600080fd5b61006461005f3660046101ca565b610107565b005b7fc8bc8f9195cfb2d040744aac63412d02ffc186ea9bd519039edc4666ee9032bc546040519081526020015b60405180910390f35b6100d76040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161009291906101e3565b6100f76100f23660046101ca565b610178565b6040519015158152602001610092565b3373deaddeaddeaddeaddeaddeaddeaddeaddead000114610154576040517fee37fa8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8bc8f9195cfb2d040744aac63412d02ffc186ea9bd519039edc4666ee9032bc55565b60006101ab6101a57fc8bc8f9195cfb2d040744aac63412d02ffc186ea9bd519039edc4666ee9032bc5490565b836101b1565b92915050565b600081158015906101c3575081828416145b9392505050565b6000602082840312156101dc57600080fd5b5035919050565b600060208083528351808285015260005b81811015610210578581018301518582016040015282016101f4565b81811115610222576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01692909201604001939250505056fea164736f6c634300080f000a0000000000000000000000000000000000000000000000000000000000", + "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", + "gasLimit": 260000, + "intent": "Deploy L2DevFeatureFlags Implementation", "to": "0x420000000000000000000000000000000000002C" }, { diff --git a/packages/contracts-bedrock/test/L2/fork/L2ForkUpgrade.t.sol b/packages/contracts-bedrock/test/L2/fork/L2ForkUpgrade.t.sol index 85812e2c76e53..1a8c98204ce52 100644 --- a/packages/contracts-bedrock/test/L2/fork/L2ForkUpgrade.t.sol +++ b/packages/contracts-bedrock/test/L2/fork/L2ForkUpgrade.t.sol @@ -109,14 +109,14 @@ contract L2ForkUpgrade_TestInit is CommonTest { if (_predeploy == Predeploys.L1_BLOCK_ATTRIBUTES) { // L1Block uses CGT variant on custom gas token networks string memory implName = commonState.isCustomGasToken ? "L1BlockCGT" : "L1Block"; - (expectedImpl_,,,) = generateScript.implementationConfigs(implName); + expectedImpl_ = generateScript.findImplByName(implName); } else if (_predeploy == Predeploys.L2_TO_L1_MESSAGE_PASSER) { // L2ToL1MessagePasser uses CGT variant on custom gas token networks string memory implName = commonState.isCustomGasToken ? "L2ToL1MessagePasserCGT" : "L2ToL1MessagePasser"; - (expectedImpl_,,,) = generateScript.implementationConfigs(implName); + expectedImpl_ = generateScript.findImplByName(implName); } else { // Standard implementation lookup - (expectedImpl_,,,) = generateScript.implementationConfigs(_name); + expectedImpl_ = generateScript.findImplByName(_name); } } } @@ -635,7 +635,7 @@ contract L2ForkUpgrade_Events_Test is L2ForkUpgrade_TestInit { /// @notice Tests that all predeploy proxies emit the Upgraded event with correct implementation. function test_l2ForkUpgrade_upgradeEventsEmitted_succeeds() public { // Get StorageSetter implementation to filter out intermediate upgrade events - (address storageSetterImpl,,,) = generateScript.implementationConfigs("StorageSetter"); + address storageSetterImpl = generateScript.findImplByName("StorageSetter"); // Start recording logs vm.recordLogs(); diff --git a/packages/contracts-bedrock/test/scripts/GenerateNUTBundle.t.sol b/packages/contracts-bedrock/test/scripts/GenerateNUTBundle.t.sol index 951a5ed25385f..3ba3608a0b8eb 100644 --- a/packages/contracts-bedrock/test/scripts/GenerateNUTBundle.t.sol +++ b/packages/contracts-bedrock/test/scripts/GenerateNUTBundle.t.sol @@ -9,7 +9,6 @@ import { GenerateNUTBundle } from "scripts/upgrade/GenerateNUTBundle.s.sol"; // Libraries import { NetworkUpgradeTxns } from "src/libraries/NetworkUpgradeTxns.sol"; -import { UpgradeUtils } from "scripts/libraries/UpgradeUtils.sol"; import { Constants } from "src/libraries/Constants.sol"; import { L2ContractsManagerTypes } from "src/libraries/L2ContractsManagerTypes.sol"; @@ -71,7 +70,7 @@ contract GenerateNUTBundleTest is Test { ); // Verify implementation deployments - string[] memory implementationsToUpgrade = UpgradeUtils.getImplementationsNamesToUpgrade(); + string[] memory implementationsToUpgrade = script.getStandardDeploymentNames(); for (uint256 i = 0; i < implementationsToUpgrade.length; i++) { assertEq( output.txns[i + 2].intent, @@ -131,10 +130,19 @@ contract GenerateNUTBundleTest is Test { /// @notice Tests that the number of implementations in the deployment list matches the number of fields in the /// Implementations struct. - function test_implementationCount_matchesStructFields_succeeds() public pure { + function test_implementationCount_matchesStructFields_succeeds() public { L2ContractsManagerTypes.Implementations memory emptyImpl; uint256 structFieldCount = abi.encode(emptyImpl).length / 32; - string[] memory names = UpgradeUtils.getImplementationsNamesToUpgrade(); - assertEq(names.length, structFieldCount, "Deployment list must equal Implementations struct field count"); + + // Build implementation deployment configurations + script._buildImplementationDeploymentConfigs(); + + // Verify that the number of implementations in the deployment list matches the number of fields in the + // Implementations struct + assertEq( + script.implementationConfigs().length, + structFieldCount, + "Deployment list must equal Implementations struct field count" + ); } } From 28149013a51e59e6de00f9192c86d6515cba91f0 Mon Sep 17 00:00:00 2001 From: niha <205694301+0xniha@users.noreply.github.com> Date: Tue, 31 Mar 2026 20:07:53 -0300 Subject: [PATCH 02/15] feat: unified predeploys source of truth --- .../contracts-bedrock/scripts/L2Genesis.s.sol | 47 +- .../scripts/upgrade/GenerateNUTBundle.s.sol | 328 ++---------- .../snapshots/semver-lock.json | 4 +- .../upgrades/current-upgrade-bundle.json | 18 +- .../src/L2/L2ContractsManager.sol | 5 +- .../src/libraries/Predeploys.sol | 470 +++++++++++++----- .../test/L2/L2ContractsManager.t.sol | 36 +- .../test/L2/L2GenesisForkUpgrade.t.sol | 8 +- .../test/L2/fork/L2ForkUpgrade.t.sol | 93 ++-- .../test/libraries/Predeploys.t.sol | 35 +- .../test/scripts/GenerateNUTBundle.t.sol | 30 +- .../test/scripts/L2Genesis.t.sol | 43 +- .../contracts-bedrock/test/setup/Setup.sol | 42 +- 13 files changed, 598 insertions(+), 561 deletions(-) diff --git a/packages/contracts-bedrock/scripts/L2Genesis.s.sol b/packages/contracts-bedrock/scripts/L2Genesis.s.sol index f85e2a91f8c16..4da7c3f2badeb 100644 --- a/packages/contracts-bedrock/scripts/L2Genesis.s.sol +++ b/packages/contracts-bedrock/scripts/L2Genesis.s.sol @@ -140,7 +140,7 @@ contract L2Genesis is Script { vm.chainId(_input.l2ChainID); dealEthToPrecompiles(); - setPredeployProxies(_input); + setPredeployProxies(); vm.stopPrank(); // Set L1 Block has its own pranking requirements which it handles internally @@ -222,27 +222,26 @@ contract L2Genesis is Script { /// to the expected nonce of 1 per EIP-161. This is because the legacy go genesis // script didn't set the nonce and we didn't want to change that behavior when /// migrating genesis generation to Solidity. - function setPredeployProxies(Input memory _input) internal { + function setPredeployProxies() internal { bytes memory code = vm.getDeployedCode("Proxy.sol:Proxy"); - uint160 prefix = uint160(0x420) << 148; + Predeploys.PredeployRecord[] memory records = Predeploys.getAllRecords(); - for (uint256 i = 0; i < Predeploys.PREDEPLOY_COUNT; i++) { - address addr = address(prefix | uint160(i)); - if (Predeploys.notProxied(addr)) { - continue; - } + for (uint256 i = 0; i < records.length; i++) { + // Non-proxied predeploys (WETH, GovernanceToken) are etched directly elsewhere. + if (!records[i].isProxied) continue; + // Skip duplicates — CGT variant records share a proxy with their standard counterpart. + if ( + keccak256(abi.encodePacked(records[i].name)) == keccak256(abi.encodePacked("L1BlockCGT")) + || keccak256(abi.encodePacked(records[i].name)) == keccak256(abi.encodePacked("L2ToL1MessagePasserCGT")) + ) continue; + + address addr = records[i].proxy; vm.etch(addr, code); EIP1967Helper.setAdmin(addr, Predeploys.PROXY_ADMIN); - if ( - Predeploys.isSupportedPredeploy( - addr, _input.fork, _input.useCustomGasToken, _input.useInterop, _input.devFeatureBitmap - ) - ) { - address implementation = Predeploys.predeployToCodeNamespace(addr); - EIP1967Helper.setImplementation(addr, implementation); - } + address implementation = Predeploys.predeployToCodeNamespace(addr); + EIP1967Helper.setImplementation(addr, implementation); } } @@ -257,9 +256,9 @@ contract L2Genesis is Script { // Must be first: other contracts' initialize() calls assert _assertOnlyProxyAdminOrProxyAdminOwner(), // which reads L2ProxyAdmin.owner(). The owner slot must be set before any initializer runs. setL2ProxyAdmin(_input); // 18 - setLegacyMessagePasser(); // 0 + // setLegacyMessagePasser(); // 0: LEGACY_MESSAGE_PASSER is deprecated and not used in OP-Stack // 01: legacy, not used in OP-Stack - setDeployerWhitelist(); // 2 + // setDeployerWhitelist(); // 2: DEPLOYER_WHITELIST is deprecated and not used in OP-Stack // 3,4,5: legacy, not used in OP-Stack. setWETH(); // 6: WETH (not behind a proxy) setL2CrossDomainMessenger(_input.l1CrossDomainMessengerProxy); // 7 @@ -268,7 +267,7 @@ contract L2Genesis is Script { setL2StandardBridge(_input.l1StandardBridgeProxy); // 10 setSequencerFeeVault(_input); // 11 setOptimismMintableERC20Factory(); // 12 - setL1BlockNumber(); // 13 + // setL1BlockNumber(); // 13: L1_BLOCK_NUMBER is deprecated and not used in OP-Stack setL2ERC721Bridge(_input.l1ERC721BridgeProxy); // 14 setL1Block(_input); // 15 setL2ToL1MessagePasser(_input.useCustomGasToken); // 16 @@ -533,18 +532,23 @@ contract L2Genesis is Script { /// @notice This predeploy is following the safety invariant #1. /// This contract has no initializer. function setCrossL2Inbox() internal { + Predeploys.assertGates(Predeploys.CROSS_L2_INBOX, DevFeatures.OPTIMISM_PORTAL_INTEROP, Features.INTEROP); _setImplementationCode(Predeploys.CROSS_L2_INBOX); } /// @notice This predeploy is following the safety invariant #1. /// This contract has no initializer. function setL2ToL2CrossDomainMessenger() internal { + Predeploys.assertGates( + Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER, DevFeatures.OPTIMISM_PORTAL_INTEROP, Features.INTEROP + ); _setImplementationCode(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER); } /// @notice This predeploy is following the safety invariant #1. /// This contract has no initializer. function setETHLiquidity() internal { + Predeploys.assertGates(Predeploys.ETH_LIQUIDITY, DevFeatures.OPTIMISM_PORTAL_INTEROP, Features.INTEROP); _setImplementationCode(Predeploys.ETH_LIQUIDITY); vm.deal(Predeploys.ETH_LIQUIDITY, type(uint128).max); } @@ -552,6 +556,7 @@ contract L2Genesis is Script { /// @notice This predeploy is following the safety invariant #1. /// This contract has no initializer. function setSuperchainETHBridge() internal { + Predeploys.assertGates(Predeploys.SUPERCHAIN_ETH_BRIDGE, DevFeatures.OPTIMISM_PORTAL_INTEROP, Features.INTEROP); _setImplementationCode(Predeploys.SUPERCHAIN_ETH_BRIDGE); } @@ -578,6 +583,7 @@ contract L2Genesis is Script { /// @notice This predeploy is following the safety invariant #1. function setLiquidityController(Input memory _input) internal { + Predeploys.assertGates(Predeploys.LIQUIDITY_CONTROLLER, bytes32(0), Features.CUSTOM_GAS_TOKEN); address impl = _setImplementationCode(Predeploys.LIQUIDITY_CONTROLLER); ILiquidityController(impl).initialize({ @@ -596,6 +602,7 @@ contract L2Genesis is Script { /// @notice This predeploy is following the safety invariant #1. /// This contract has no initializer. function setNativeAssetLiquidity(Input memory _input) internal { + Predeploys.assertGates(Predeploys.NATIVE_ASSET_LIQUIDITY, bytes32(0), Features.CUSTOM_GAS_TOKEN); _setImplementationCode(Predeploys.NATIVE_ASSET_LIQUIDITY); require( @@ -609,11 +616,13 @@ contract L2Genesis is Script { /// @notice This predeploy is following the safety invariant #1. function setConditionalDeployer() internal { + Predeploys.assertGates(Predeploys.CONDITIONAL_DEPLOYER, DevFeatures.L2CM, bytes32(0)); _setImplementationCode(Predeploys.CONDITIONAL_DEPLOYER); } /// @notice Sets up the L2DevFeatureFlags predeploy with the development feature bitmap. function setL2DevFeatureFlags(Input memory _input) internal { + Predeploys.assertGates(Predeploys.L2_DEV_FEATURE_FLAGS, DevFeatures.L2CM, bytes32(0)); _setImplementationCode(Predeploys.L2_DEV_FEATURE_FLAGS); vm.prank(Constants.DEPOSITOR_ACCOUNT); IL2DevFeatureFlags(Predeploys.L2_DEV_FEATURE_FLAGS).setDevFeatureBitmap(_input.devFeatureBitmap); diff --git a/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol b/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol index f1537410acb33..2697cfce7edf0 100644 --- a/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol +++ b/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol @@ -380,300 +380,44 @@ contract GenerateNUTBundle is Script { }); } - /// @notice Builds the implementation configuration mapping for all contracts to be deployed. - /// @dev IMPORTANT: Only modify this function if you need to add or modify a deployment implementation - /// configuration. - /// @dev An array of strings is used to add contracts that are not predeploys (StorageSetter) or have - /// feature-specific variants (e.g. CGT). - /// @dev Gas limits are based on actual gas profiling of mainnet fork execution with 1.5x safety margin. + /// @notice Builds the implementation configurations for all contracts to be deployed. + /// @dev Iterates the predeploy registry as the single source of truth. + /// All records are deployed unconditionally. L2CM selects the correct variant at runtime. + /// StorageSetter is prepended first; it is a utility impl, not a predeploy. function _buildImplementationDeploymentConfigs() public { // Gas profiling: 280,600 gas used → 420,900 recommended → 500K with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "StorageSetter", - artifactPath: "StorageSetter.sol:StorageSetter", - deploymentGasLimit: 500_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("StorageSetter.sol:StorageSetter"), SALT - ) - }) - ); - // Gas profiling: 1,708,099 gas used → 2,562,148 recommended → 2.6M with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "L2CrossDomainMessenger", - artifactPath: "L2CrossDomainMessenger.sol:L2CrossDomainMessenger", - deploymentGasLimit: 2_600_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("L2CrossDomainMessenger.sol:L2CrossDomainMessenger"), SALT - ) - }) - ); - // Gas profiling: 1,681,024 gas used → 2,521,536 recommended → 2.6M with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "GasPriceOracle", - artifactPath: "GasPriceOracle.sol:GasPriceOracle", - deploymentGasLimit: 2_600_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("GasPriceOracle.sol:GasPriceOracle"), SALT - ) - }) - ); - // Gas profiling: 2,358,092 gas used → 3,537,138 recommended → 3.6M with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "L2StandardBridge", - artifactPath: "L2StandardBridge.sol:L2StandardBridge", - deploymentGasLimit: 3_600_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("L2StandardBridge.sol:L2StandardBridge"), SALT - ) - }) - ); - // Gas profiling: 841,152 gas used → 1,261,728 recommended → 1.3M with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "SequencerFeeVault", - artifactPath: "SequencerFeeVault.sol:SequencerFeeVault", - deploymentGasLimit: 1_300_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("SequencerFeeVault.sol:SequencerFeeVault"), SALT - ) - }) - ); - // Gas profiling: 2,347,504 gas used → 3,521,256 recommended → 3.6M with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "OptimismMintableERC20Factory", - artifactPath: "OptimismMintableERC20Factory.sol:OptimismMintableERC20Factory", - deploymentGasLimit: 3_600_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("OptimismMintableERC20Factory.sol:OptimismMintableERC20Factory"), SALT - ) - }) - ); - // Gas profiling: 1,242,108 gas used → 1,863,162 recommended → 1.9M with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "L2ERC721Bridge", - artifactPath: "L2ERC721Bridge.sol:L2ERC721Bridge", - deploymentGasLimit: 1_900_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("L2ERC721Bridge.sol:L2ERC721Bridge"), SALT - ) - }) - ); - // Gas profiling: 707,557 gas used → 1,061,335 recommended → 1.1M with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "L1Block", - artifactPath: "L1Block.sol:L1Block", - deploymentGasLimit: 1_100_000, - implementation: UpgradeUtils.computeCreate2Address(DeployUtils.getCode("L1Block.sol:L1Block"), SALT) - }) - ); - // Gas profiling: 710,257 gas used → 1,065,385 recommended → 1.1M with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "L1BlockCGT", - artifactPath: "L1BlockCGT.sol:L1BlockCGT", - deploymentGasLimit: 1_100_000, - implementation: UpgradeUtils.computeCreate2Address(DeployUtils.getCode("L1BlockCGT.sol:L1BlockCGT"), SALT) - }) - ); - // Gas profiling: 400,911 gas used → 601,366 recommended → 650K with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "L2ToL1MessagePasser", - artifactPath: "L2ToL1MessagePasser.sol:L2ToL1MessagePasser", - deploymentGasLimit: 650_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("L2ToL1MessagePasser.sol:L2ToL1MessagePasser"), SALT - ) - }) - ); - // Gas profiling: 484,560 gas used → 726,840 recommended → 750K with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "L2ToL1MessagePasserCGT", - artifactPath: "L2ToL1MessagePasserCGT.sol:L2ToL1MessagePasserCGT", - deploymentGasLimit: 750_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("L2ToL1MessagePasserCGT.sol:L2ToL1MessagePasserCGT"), SALT - ) - }) - ); - // Gas profiling: 3,248,395 gas used → 4,872,592 recommended → 4.9M with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "OptimismMintableERC721Factory", - artifactPath: "OptimismMintableERC721Factory.sol:OptimismMintableERC721Factory", - deploymentGasLimit: 4_900_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("OptimismMintableERC721Factory.sol:OptimismMintableERC721Factory"), SALT - ) - }) - ); - // Gas profiling: 1,538,265 gas used → 2,307,397 recommended → 2.4M with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "L2ProxyAdmin", - artifactPath: "L2ProxyAdmin.sol:L2ProxyAdmin", - deploymentGasLimit: 2_400_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("L2ProxyAdmin.sol:L2ProxyAdmin"), SALT - ) - }) - ); - // Gas profiling: 838,947 gas used → 1,258,420 recommended → 1.3M with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "BaseFeeVault", - artifactPath: "BaseFeeVault.sol:BaseFeeVault", - deploymentGasLimit: 1_300_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("BaseFeeVault.sol:BaseFeeVault"), SALT - ) - }) - ); - // Gas profiling: 14,439 gas used → 21,658 recommended → 50K with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "L1FeeVault", - artifactPath: "L1FeeVault.sol:L1FeeVault", - deploymentGasLimit: 50_000, - implementation: UpgradeUtils.computeCreate2Address(DeployUtils.getCode("L1FeeVault.sol:L1FeeVault"), SALT) - }) - ); - // Gas profiling: 838,947 gas used → 1,258,420 recommended → 1.3M with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "OperatorFeeVault", - artifactPath: "OperatorFeeVault.sol:OperatorFeeVault", - deploymentGasLimit: 1_300_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("OperatorFeeVault.sol:OperatorFeeVault"), SALT - ) - }) - ); - // Gas profiling: 464,947 gas used → 697,420 recommended → 700K with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "SchemaRegistry", - artifactPath: "SchemaRegistry.sol:SchemaRegistry", - deploymentGasLimit: 700_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("SchemaRegistry.sol:SchemaRegistry"), SALT - ) - }) - ); - // Gas profiling: 3,820,943 gas used → 5,731,414 recommended → 5.8M with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "EAS", - artifactPath: "EAS.sol:EAS", - deploymentGasLimit: 5_800_000, - implementation: UpgradeUtils.computeCreate2Address(DeployUtils.getCode("EAS.sol:EAS"), SALT) - }) - ); - // Gas profiling: 385,975 gas used → 578,962 recommended → 600K with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "CrossL2Inbox", - artifactPath: "CrossL2Inbox.sol:CrossL2Inbox", - deploymentGasLimit: 600_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("CrossL2Inbox.sol:CrossL2Inbox"), SALT - ) - }) - ); - // Gas profiling: 965,734 gas used → 1,448,601 recommended → 1.5M with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "L2ToL2CrossDomainMessenger", - artifactPath: "L2ToL2CrossDomainMessenger.sol:L2ToL2CrossDomainMessenger", - deploymentGasLimit: 1_500_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("L2ToL2CrossDomainMessenger.sol:L2ToL2CrossDomainMessenger"), SALT - ) - }) - ); - // Gas profiling: 441,198 gas used → 661,797 recommended → 700K with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "SuperchainETHBridge", - artifactPath: "SuperchainETHBridge.sol:SuperchainETHBridge", - deploymentGasLimit: 700_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("SuperchainETHBridge.sol:SuperchainETHBridge"), SALT - ) - }) - ); - // Gas profiling: 230,857 gas used → 346,285 recommended → 400K with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "ETHLiquidity", - artifactPath: "ETHLiquidity.sol:ETHLiquidity", - deploymentGasLimit: 400_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("ETHLiquidity.sol:ETHLiquidity"), SALT - ) - }) - ); - // Gas profiling: 215,592 gas used → 323,388 recommended → 400K with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "NativeAssetLiquidity", - artifactPath: "NativeAssetLiquidity.sol:NativeAssetLiquidity", - deploymentGasLimit: 400_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("NativeAssetLiquidity.sol:NativeAssetLiquidity"), SALT - ) - }) - ); - // Gas profiling: 914,648 gas used → 1,371,972 recommended → 1.4M with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "LiquidityController", - artifactPath: "LiquidityController.sol:LiquidityController", - deploymentGasLimit: 1_400_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("LiquidityController.sol:LiquidityController"), SALT - ) - }) - ); - // Gas profiling: 1,077,380 gas used → 1,616,070 recommended → 1.7M with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "FeeSplitter", - artifactPath: "FeeSplitter.sol:FeeSplitter", - deploymentGasLimit: 1_700_000, - implementation: UpgradeUtils.computeCreate2Address(DeployUtils.getCode("FeeSplitter.sol:FeeSplitter"), SALT) - }) - ); - // Gas profiling: 339,403 gas used → 509,104 recommended → 600K with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "ConditionalDeployer", - artifactPath: "ConditionalDeployer.sol:ConditionalDeployer", - deploymentGasLimit: 600_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("ConditionalDeployer.sol:ConditionalDeployer"), SALT - ) - }) - ); - // Gas profiling: 167,063 gas used → 250,594 recommended → 260K with safety margin - _implementationConfigs.push( - ImplementationConfig({ - name: "L2DevFeatureFlags", - artifactPath: "L2DevFeatureFlags.sol:L2DevFeatureFlags", - deploymentGasLimit: 260_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("L2DevFeatureFlags.sol:L2DevFeatureFlags"), SALT - ) - }) - ); + _implementationConfigs.push(_makeConfig("StorageSetter", "StorageSetter.sol:StorageSetter", 500_000)); + + Predeploys.PredeployRecord[] memory records = Predeploys.getAllRecords(); + for (uint256 i = 0; i < records.length; i++) { + // Non-proxied predeploys (WETH, GovernanceToken) are not deployed via NUT bundles. + if (!records[i].isProxied) continue; + _implementationConfigs.push( + _makeConfig(records[i].name, records[i].artifactPath, records[i].deployGasLimit) + ); + } + } + + /// @notice Builds a single ImplementationConfig from name, artifact path, and gas limit. + /// @param _name The name of the implementation. + /// @param _artifactPath The artifact path of the implementation. + /// @param _gasLimit The gas limit for the implementation deployment. + /// @return config_ The implementation configuration. + function _makeConfig( + string memory _name, + string memory _artifactPath, + uint64 _gasLimit + ) + internal + view + returns (ImplementationConfig memory config_) + { + config_ = ImplementationConfig({ + name: _name, + artifactPath: _artifactPath, + deploymentGasLimit: _gasLimit, + implementation: UpgradeUtils.computeCreate2Address(DeployUtils.getCode(_artifactPath), SALT) + }); } /// @notice Returns the implementation configurations. diff --git a/packages/contracts-bedrock/snapshots/semver-lock.json b/packages/contracts-bedrock/snapshots/semver-lock.json index 9c51e615987ec..1e064f7797e5d 100644 --- a/packages/contracts-bedrock/snapshots/semver-lock.json +++ b/packages/contracts-bedrock/snapshots/semver-lock.json @@ -96,8 +96,8 @@ "sourceCodeHash": "0x7e438cbbe9a8248887b8c21f68c811f90a5cae4902cbbf7b0a1f6cd644dc42d9" }, "src/L2/L2ContractsManager.sol:L2ContractsManager": { - "initCodeHash": "0xbe8377775a9bcd43310f177433d5c0013cd7047648245b40db89505b3eb67e9e", - "sourceCodeHash": "0x6c928151568831d3cf6e4ec2ddf899985feb590a59e8e7bad3b80d11ff8010fe" + "initCodeHash": "0x0952d143928b477f946aee1313c13b1a23eeaf0572faee9da20846d9f5e1dc17", + "sourceCodeHash": "0x1ed9958a8d6059478c0d13f0ee4067871fe67f170dcc3d1573805ec3748d2e46" }, "src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger": { "initCodeHash": "0x76784e1bc7abe615094033f3eb16d3a6bd5caf28c2717377a3dd25e6825228f3", diff --git a/packages/contracts-bedrock/snapshots/upgrades/current-upgrade-bundle.json b/packages/contracts-bedrock/snapshots/upgrades/current-upgrade-bundle.json index e186dbd32ba10..b95307238c5d3 100644 --- a/packages/contracts-bedrock/snapshots/upgrades/current-upgrade-bundle.json +++ b/packages/contracts-bedrock/snapshots/upgrades/current-upgrade-bundle.json @@ -143,6 +143,13 @@ "intent": "Deploy EAS Implementation", "to": "0x420000000000000000000000000000000000002C" }, + { + "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000017586080604052348015600e575f80fd5b5060156019565b60d4565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101560d2575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b611677806100e15f395ff3fe6080604052600436106100bb575f3560e01c80637dfbd04911610071578063c4d66de81161004c578063c4d66de8146102f6578063d61a398b14610315578063dad544e014610346575f80fd5b80637dfbd049146102ac5780637fc81bb7146102c3578063b87ea8d4146102e2575f80fd5b8063394d2731116100a1578063394d2731146101f65780633e47158c1461021e57806354fd4d5014610257575f80fd5b80630a7617b3146101735780630c0544a314610194575f80fd5b3661016f573373ffffffffffffffffffffffffffffffffffffffff7f21346dddac42cc163a6523eefc19df981df7352c870dc3b0b17a6a92fc6fe8135c1614610130576040517f14885cf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805134815247602082018190529133917f213e72af0d3613bd643cff3059f872c1015e6541624e37872bf95eefbaf220a8910160405180910390a2005b5f80fd5b34801561017e575f80fd5b5061019261018d3660046112a1565b61035a565b005b34801561019f575f80fd5b506001546101d09070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610201575f80fd5b506001546101d0906fffffffffffffffffffffffffffffffff1681565b348015610229575f80fd5b5061023261051c565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ed565b348015610262575f80fd5b5061029f6040518060400160405280600581526020017f312e302e3100000000000000000000000000000000000000000000000000000081525081565b6040516101ed91906112bc565b3480156102b7575f80fd5b506101d06301e1338081565b3480156102ce575f80fd5b506101926102dd36600461130f565b610722565b3480156102ed575f80fd5b50610192610915565b348015610301575f80fd5b506101926103103660046112a1565b610ced565b348015610320575f80fd5b505f546102329062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b348015610351575f80fd5b50610232610ee9565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103db919061133e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043f576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811661048c576040517f99c6ec0800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff85161790945560408051949093049091168084526020840191909152917f16417cc372deec0caee5f52e2ad77a5f07b4591fd56b4ff31b6e20f817d4daeb91015b60405180910390a15050565b5f806105467fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff81161561056957919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000008152505160026105ac9190611386565b604080513060208201525f918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000009190911790610606906060015b604051602081830303815290604052805190602001205490565b1461063d576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513060208201526001918101919091525f9061065e906060016105ec565b905073ffffffffffffffffffffffffffffffffffffffff8116156106f0578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e9919061133e565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561077f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a3919061133e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610807576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806fffffffffffffffffffffffffffffffff165f03610852576040517fcf85916100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6301e133806fffffffffffffffffffffffffffffffff821611156108a2576040517f30b9f35e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546fffffffffffffffffffffffffffffffff8381167001000000000000000000000000000000008181028385161790945560408051949093049091168084526020840191909152917f4492086b630ed3846eec0979dd87a71c814ceb1c6dab80ab81e3450b21e4de289101610510565b60015461094a906fffffffffffffffffffffffffffffffff7001000000000000000000000000000000008204811691166113a3565b6fffffffffffffffffffffffffffffffff16421015610995576040517f1e4a9f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016426fffffffffffffffffffffffffffffffff161790555f6109ef734200000000000000000000000000000000000011610f63565b90505f610a0f734200000000000000000000000000000000000019610f63565b90505f610a2f73420000000000000000000000000000000000001a610f63565b90505f610a4f73420000000000000000000000000000000000001b610f63565b9050610a5a5f6111b0565b5f8282610a6786886113d3565b610a7191906113d3565b610a7b91906113d3565b9050805f03610ab6576040517fc8972e5200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517f54e7f42d000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101859052606481018690526201000090910473ffffffffffffffffffffffffffffffffffffffff16906354e7f42d906084015f60405180830381865afa158015610b3c573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610b81919081019061148b565b80519091505f819003610bc0576040517f763970d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b82811015610c70575f848281518110610bde57610bde61155a565b6020026020010151602001519050805f03610bf95750610c68565b5f610c20868481518110610c0f57610c0f61155a565b60200260200101515f0151836111d6565b905080610c59576040517fd68d1b1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c6382856113d3565b935050505b600101610bc3565b50838114610caa576040517f9c01eac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f73f9a13241a1848ec157967f3a85601709353e616f1f2605d818c0f2d21774df8385604051610cdb929190611587565b60405180910390a15050505050505050565b5f54610100900460ff1615808015610d0b57505f54600160ff909116105b80610d245750303b158015610d2457505f5460ff166001145b610db4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e10575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610e186111e9565b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff85160217905572015180000000000000000000000000000000006fffffffffffffffffffffffffffffffff4216176001558015610ee5575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610510565b5050565b5f610ef261051c565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f5e919061133e565b905090565b5f60018273ffffffffffffffffffffffffffffffffffffffff166382356d8a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610faf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd39190611622565b6001811115610fe457610fe46115f5565b1461101b576040517fb4726cbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff166366d003ac6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061109f919061133e565b73ffffffffffffffffffffffffffffffffffffffff16146110ec576040517fc3380cef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b476110f6836111b0565b8273ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015611140573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111649190611640565b915047826111728383611657565b146111a9576040517f87c91c5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050919050565b807f21346dddac42cc163a6523eefc19df981df7352c870dc3b0b17a6a92fc6fe8135d50565b5f6111e2835a8461126c565b9392505050565b336111f261051c565b73ffffffffffffffffffffffffffffffffffffffff161415801561123357503361121a610ee9565b73ffffffffffffffffffffffffffffffffffffffff1614155b1561126a576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f805f805f858888f1949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461129e575f80fd5b50565b5f602082840312156112b1575f80fd5b81356111e28161127d565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f6020828403121561131f575f80fd5b81356fffffffffffffffffffffffffffffffff811681146111e2575f80fd5b5f6020828403121561134e575f80fd5b81516111e28161127d565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761139d5761139d611359565b92915050565b6fffffffffffffffffffffffffffffffff8181168382160190808211156113cc576113cc611359565b5092915050565b8082018082111561139d5761139d611359565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715611436576114366113e6565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611483576114836113e6565b604052919050565b5f602080838503121561149c575f80fd5b825167ffffffffffffffff808211156114b3575f80fd5b818501915085601f8301126114c6575f80fd5b8151818111156114d8576114d86113e6565b6114e6848260051b0161143c565b818152848101925060069190911b830184019087821115611505575f80fd5b928401925b8184101561154f5760408489031215611521575f80fd5b611529611413565b84516115348161127d565b8152848601518682015283526040909301929184019161150a565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604080825283518282018190525f91906020906060850190828801855b828110156115df578151805173ffffffffffffffffffffffffffffffffffffffff1685528501518585015292850192908401906001016115a4565b5050508093505050508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f60208284031215611632575f80fd5b8151600281106111e2575f80fd5b5f60208284031215611650575f80fd5b5051919050565b8181038181111561139d5761139d61135956fea164736f6c6343000819000a0000000000000000", + "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", + "gasLimit": 1700000, + "intent": "Deploy FeeSplitter Implementation", + "to": "0x420000000000000000000000000000000000002C" + }, { "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca40000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000069e6080604052348015600e575f80fd5b506106828061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c8063331b637f1461004357806354fd4d5014610069578063ab4d6f75146100b2575b5f80fd5b610056610051366004610512565b6100c7565b6040519081526020015b60405180910390f35b6100a56040518060400160405280600581526020017f312e302e3200000000000000000000000000000000000000000000000000000081525081565b604051610060919061053b565b6100c56100c036600461058e565b61039e565b005b5f67ffffffffffffffff801683602001511115610110576040517fd1f79e8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604083015163ffffffff1015610152576040517f94338eba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606083015167ffffffffffffffff1015610198576040517f596a19a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82516040515f916101dd91859060200160609290921b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168252601482015260340190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181528282528051602091820120878201516060890151898501515f9487018590527fffffffffffffffff00000000000000000000000000000000000000000000000060c084811b8216602c8a015283901b1660348801527fffffffff0000000000000000000000000000000000000000000000000000000060e082901b16603c88015292965090949093919291016040516020818303038152906040526102ac906105bc565b90505f85826040516020016102cb929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060808d01519184018190529183015291505f90606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0300000000000000000000000000000000000000000000000000000000000000179a9950505050505050505050565b5f6103b76103b136859003850185610601565b836100c7565b90505f6103c38261043b565b509050806103fd576040517fe3c0081600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b827f5c37832d2e8d10e346e55ad62071a6a2f9fa5130614ef2ec6617555c6f467ba78560405161042d9190610622565b60405180910390a250505050565b5f805a835491505a6103e891031115939092509050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610475575f80fd5b919050565b5f60a0828403121561048a575f80fd5b60405160a0810181811067ffffffffffffffff821117156104d2577f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040529050806104e183610452565b8152602083013560208201526040830135604082015260608301356060820152608083013560808201525092915050565b5f8060c08385031215610523575f80fd5b61052d848461047a565b9460a0939093013593505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f8082840360c08112156105a0575f80fd5b60a08112156105ad575f80fd5b50919360a08501359350915050565b805160208083015191908110156105fb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8160200360031b1b821691505b50919050565b5f60a08284031215610611575f80fd5b61061b838361047a565b9392505050565b60a0810173ffffffffffffffffffffffffffffffffffffffff61064484610452565b168252602083013560208301526040830135604083015260608301356060830152608083013560808301529291505056fea164736f6c6343000819000a0000", "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", @@ -185,13 +192,6 @@ "intent": "Deploy LiquidityController Implementation", "to": "0x420000000000000000000000000000000000002C" }, - { - "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000017586080604052348015600e575f80fd5b5060156019565b60d4565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101560d2575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b611677806100e15f395ff3fe6080604052600436106100bb575f3560e01c80637dfbd04911610071578063c4d66de81161004c578063c4d66de8146102f6578063d61a398b14610315578063dad544e014610346575f80fd5b80637dfbd049146102ac5780637fc81bb7146102c3578063b87ea8d4146102e2575f80fd5b8063394d2731116100a1578063394d2731146101f65780633e47158c1461021e57806354fd4d5014610257575f80fd5b80630a7617b3146101735780630c0544a314610194575f80fd5b3661016f573373ffffffffffffffffffffffffffffffffffffffff7f21346dddac42cc163a6523eefc19df981df7352c870dc3b0b17a6a92fc6fe8135c1614610130576040517f14885cf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805134815247602082018190529133917f213e72af0d3613bd643cff3059f872c1015e6541624e37872bf95eefbaf220a8910160405180910390a2005b5f80fd5b34801561017e575f80fd5b5061019261018d3660046112a1565b61035a565b005b34801561019f575f80fd5b506001546101d09070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610201575f80fd5b506001546101d0906fffffffffffffffffffffffffffffffff1681565b348015610229575f80fd5b5061023261051c565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ed565b348015610262575f80fd5b5061029f6040518060400160405280600581526020017f312e302e3100000000000000000000000000000000000000000000000000000081525081565b6040516101ed91906112bc565b3480156102b7575f80fd5b506101d06301e1338081565b3480156102ce575f80fd5b506101926102dd36600461130f565b610722565b3480156102ed575f80fd5b50610192610915565b348015610301575f80fd5b506101926103103660046112a1565b610ced565b348015610320575f80fd5b505f546102329062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b348015610351575f80fd5b50610232610ee9565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103db919061133e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043f576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811661048c576040517f99c6ec0800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff85161790945560408051949093049091168084526020840191909152917f16417cc372deec0caee5f52e2ad77a5f07b4591fd56b4ff31b6e20f817d4daeb91015b60405180910390a15050565b5f806105467fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff81161561056957919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000008152505160026105ac9190611386565b604080513060208201525f918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000009190911790610606906060015b604051602081830303815290604052805190602001205490565b1461063d576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513060208201526001918101919091525f9061065e906060016105ec565b905073ffffffffffffffffffffffffffffffffffffffff8116156106f0578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e9919061133e565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561077f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a3919061133e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610807576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806fffffffffffffffffffffffffffffffff165f03610852576040517fcf85916100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6301e133806fffffffffffffffffffffffffffffffff821611156108a2576040517f30b9f35e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546fffffffffffffffffffffffffffffffff8381167001000000000000000000000000000000008181028385161790945560408051949093049091168084526020840191909152917f4492086b630ed3846eec0979dd87a71c814ceb1c6dab80ab81e3450b21e4de289101610510565b60015461094a906fffffffffffffffffffffffffffffffff7001000000000000000000000000000000008204811691166113a3565b6fffffffffffffffffffffffffffffffff16421015610995576040517f1e4a9f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016426fffffffffffffffffffffffffffffffff161790555f6109ef734200000000000000000000000000000000000011610f63565b90505f610a0f734200000000000000000000000000000000000019610f63565b90505f610a2f73420000000000000000000000000000000000001a610f63565b90505f610a4f73420000000000000000000000000000000000001b610f63565b9050610a5a5f6111b0565b5f8282610a6786886113d3565b610a7191906113d3565b610a7b91906113d3565b9050805f03610ab6576040517fc8972e5200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517f54e7f42d000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101859052606481018690526201000090910473ffffffffffffffffffffffffffffffffffffffff16906354e7f42d906084015f60405180830381865afa158015610b3c573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610b81919081019061148b565b80519091505f819003610bc0576040517f763970d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b82811015610c70575f848281518110610bde57610bde61155a565b6020026020010151602001519050805f03610bf95750610c68565b5f610c20868481518110610c0f57610c0f61155a565b60200260200101515f0151836111d6565b905080610c59576040517fd68d1b1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c6382856113d3565b935050505b600101610bc3565b50838114610caa576040517f9c01eac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f73f9a13241a1848ec157967f3a85601709353e616f1f2605d818c0f2d21774df8385604051610cdb929190611587565b60405180910390a15050505050505050565b5f54610100900460ff1615808015610d0b57505f54600160ff909116105b80610d245750303b158015610d2457505f5460ff166001145b610db4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e10575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610e186111e9565b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff85160217905572015180000000000000000000000000000000006fffffffffffffffffffffffffffffffff4216176001558015610ee5575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610510565b5050565b5f610ef261051c565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f5e919061133e565b905090565b5f60018273ffffffffffffffffffffffffffffffffffffffff166382356d8a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610faf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd39190611622565b6001811115610fe457610fe46115f5565b1461101b576040517fb4726cbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff166366d003ac6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061109f919061133e565b73ffffffffffffffffffffffffffffffffffffffff16146110ec576040517fc3380cef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b476110f6836111b0565b8273ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015611140573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111649190611640565b915047826111728383611657565b146111a9576040517f87c91c5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050919050565b807f21346dddac42cc163a6523eefc19df981df7352c870dc3b0b17a6a92fc6fe8135d50565b5f6111e2835a8461126c565b9392505050565b336111f261051c565b73ffffffffffffffffffffffffffffffffffffffff161415801561123357503361121a610ee9565b73ffffffffffffffffffffffffffffffffffffffff1614155b1561126a576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f805f805f858888f1949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461129e575f80fd5b50565b5f602082840312156112b1575f80fd5b81356111e28161127d565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f6020828403121561131f575f80fd5b81356fffffffffffffffffffffffffffffffff811681146111e2575f80fd5b5f6020828403121561134e575f80fd5b81516111e28161127d565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761139d5761139d611359565b92915050565b6fffffffffffffffffffffffffffffffff8181168382160190808211156113cc576113cc611359565b5092915050565b8082018082111561139d5761139d611359565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715611436576114366113e6565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611483576114836113e6565b604052919050565b5f602080838503121561149c575f80fd5b825167ffffffffffffffff808211156114b3575f80fd5b818501915085601f8301126114c6575f80fd5b8151818111156114d8576114d86113e6565b6114e6848260051b0161143c565b818152848101925060069190911b830184019087821115611505575f80fd5b928401925b8184101561154f5760408489031215611521575f80fd5b611529611413565b84516115348161127d565b8152848601518682015283526040909301929184019161150a565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604080825283518282018190525f91906020906060850190828801855b828110156115df578151805173ffffffffffffffffffffffffffffffffffffffff1685528501518585015292850192908401906001016115a4565b5050508093505050508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f60208284031215611632575f80fd5b8151600281106111e2575f80fd5b5f60208284031215611650575f80fd5b5051919050565b8181038181111561139d5761139d61135956fea164736f6c6343000819000a0000000000000000", - "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", - "gasLimit": 1700000, - "intent": "Deploy FeeSplitter Implementation", - "to": "0x420000000000000000000000000000000000002C" - }, { "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000005d8608060405234801561001057600080fd5b506105b8806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806354fd4d5014610046578063cdcb760a14610098578063e0145f5c146100d0575b600080fd5b6100826040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161008f91906103f7565b60405180910390f35b6100ab6100a6366004610440565b6100ea565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161008f565b734e59b44847b379578588920ca78fbf26c0b4956c6100ab565b8051602080830191909120604080517fff00000000000000000000000000000000000000000000000000000000000000818501527f4e59b44847b379578588920ca78fbf26c0b4956c000000000000000000000000602182015260358101869052605580820184905282518083039091018152607590910190915280519201919091206000919073ffffffffffffffffffffffffffffffffffffffff81163b156101d85760405173ffffffffffffffffffffffffffffffffffffffff8216907ffbe57d889a7f75a4e0c7da304cd158fcaddc4b925cdd9f4cfb115c0f9e48009b90600090a291506103779050565b600080734e59b44847b379578588920ca78fbf26c0b4956c73ffffffffffffffffffffffffffffffffffffffff168787604051602001610219929190610519565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526102519161053f565b6000604051808303816000865af19150503d806000811461028e576040519150601f19603f3d011682016040523d82523d6000602084013e610293565b606091505b5091509150806102a29061055b565b60601c94508115806102e057508273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561032257806040517fcb0fc6f700000000000000000000000000000000000000000000000000000000815260040161031991906103f7565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff167f9b7318127ed899f286ea9ddd7925ed8ad24a682b6a825c3b5b3d88a3f00bc1d28860405161036a91815260200190565b60405180910390a2505050505b92915050565b60005b83811015610398578181015183820152602001610380565b838111156103a7576000848401525b50505050565b600081518084526103c581602086016020860161037d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061040a60208301846103ad565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561045357600080fd5b82359150602083013567ffffffffffffffff8082111561047257600080fd5b818501915085601f83011261048657600080fd5b81358181111561049857610498610411565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104de576104de610411565b816040528281528860208487010111156104f757600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b8281526000825161053181602085016020870161037d565b919091016020019392505050565b6000825161055181846020870161037d565b9190910192915050565b6000815160208301517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808216935060148310156105a35780818460140360031b1b83161693505b50505091905056fea164736f6c634300080f000a0000000000000000", "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", @@ -214,14 +214,14 @@ "to": "0x4200000000000000000000000000000000000018" }, { - "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000003e9f6104006040523480156200001257600080fd5b5060405162003b3f38038062003b3f8339810160408190526200003591620001d4565b30608090815281516001600160a01b0390811660a09081526020840151821660e09081526040850151831660c0908152606086015184166101009081529486015184166101209081529286015184166101409081529086015184166101609081529186015184166101809081529486015184166101a09081529286015184166101c09081529086015184166101e09081529186015184166102009081529486015184166102209081529286015184166102409081529086015184166102609081529186015184166102809081529486015184166102a09081529286015184166102c09081529086015184166102e090815291860151841661030090815294860151841661032090815292860151841661034090815290860151841661036052908501518316610380529284015182166103a05283015181166103c052910151166103e05262000407565b60405161036081016001600160401b0381118282101715620001b157634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b0381168114620001cf57600080fd5b919050565b60006103608284031215620001e857600080fd5b620001f26200017f565b620001fd83620001b7565b81526200020d60208401620001b7565b60208201526200022060408401620001b7565b60408201526200023360608401620001b7565b60608201526200024660808401620001b7565b60808201526200025960a08401620001b7565b60a08201526200026c60c08401620001b7565b60c08201526200027f60e08401620001b7565b60e082015261010062000294818501620001b7565b90820152610120620002a8848201620001b7565b90820152610140620002bc848201620001b7565b90820152610160620002d0848201620001b7565b90820152610180620002e4848201620001b7565b908201526101a0620002f8848201620001b7565b908201526101c06200030c848201620001b7565b908201526101e062000320848201620001b7565b9082015261020062000334848201620001b7565b9082015261022062000348848201620001b7565b908201526102406200035c848201620001b7565b9082015261026062000370848201620001b7565b9082015261028062000384848201620001b7565b908201526102a062000398848201620001b7565b908201526102c0620003ac848201620001b7565b908201526102e0620003c0848201620001b7565b90820152610300620003d4848201620001b7565b90820152610320620003e8848201620001b7565b90820152610340620003fc848201620001b7565b908201529392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516103a0516103c0516103e0516134f56200064a600039600081816104d801526119530152600081816104af0152611b10015260008181610486015261145301526000818161045d015261130501526000818161043401526113ec01526000818161040b0152611a560152600081816103e20152611a180152600081816103b901526119da015260008181610390015261199c0152600081816103670152611ad201526000818161033e0152611a9401526000818161031501526116e90152600081816102ec01526116690152600081816102c301526115ea01526000818161029a0152611915015260008181610271015261120501526000818161024801526118d701526000818161021f01526118b10152600081816101f601526117c00152600081816101ce015261179a0152600081816101a601526110e101526000818161017e015261116d01526000818161015601526114cd01526000818161012e0152610fdb01526000818160df0152610ed5015260008181610107015261175201526000818160ba01528181610ef701528181610ffd015281816111030152818161118f015281816112270152818161132701528181611475015281816114ef0152818161160c0152818161168b015261170b0152600061052b01526134f56000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806354fd4d5014610046578063615f64fe14610098578063d55ec6971461050a575b600080fd5b6100826040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b60405161008f9190612f08565b60405180910390f35b604080516103608101825273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811682527f0000000000000000000000000000000000000000000000000000000000000000811660208301527f00000000000000000000000000000000000000000000000000000000000000008116828401527f0000000000000000000000000000000000000000000000000000000000000000811660608301527f0000000000000000000000000000000000000000000000000000000000000000811660808301527f0000000000000000000000000000000000000000000000000000000000000000811660a08301527f0000000000000000000000000000000000000000000000000000000000000000811660c08301527f0000000000000000000000000000000000000000000000000000000000000000811660e08301527f000000000000000000000000000000000000000000000000000000000000000081166101008301527f000000000000000000000000000000000000000000000000000000000000000081166101208301527f000000000000000000000000000000000000000000000000000000000000000081166101408301527f000000000000000000000000000000000000000000000000000000000000000081166101608301527f000000000000000000000000000000000000000000000000000000000000000081166101808301527f000000000000000000000000000000000000000000000000000000000000000081166101a08301527f000000000000000000000000000000000000000000000000000000000000000081166101c08301527f000000000000000000000000000000000000000000000000000000000000000081166101e08301527f000000000000000000000000000000000000000000000000000000000000000081166102008301527f000000000000000000000000000000000000000000000000000000000000000081166102208301527f000000000000000000000000000000000000000000000000000000000000000081166102408301527f000000000000000000000000000000000000000000000000000000000000000081166102608301527f000000000000000000000000000000000000000000000000000000000000000081166102808301527f000000000000000000000000000000000000000000000000000000000000000081166102a08301527f000000000000000000000000000000000000000000000000000000000000000081166102c08301527f000000000000000000000000000000000000000000000000000000000000000081166102e08301527f000000000000000000000000000000000000000000000000000000000000000081166103008301527f000000000000000000000000000000000000000000000000000000000000000081166103208301527f000000000000000000000000000000000000000000000000000000000000000016610340820152905161008f9190612f1b565b610512610514565b005b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610583576040517fada337cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061058d61059b565b905061059881610e96565b50565b6105a3612d52565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663213268496040518163ffffffff1660e01b8152600401602060405180830381865afa158015610602573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106269190613169565b15156101608201526040517f47af267b0000000000000000000000000000000000000000000000000000000081527f494e5445524f50000000000000000000000000000000000000000000000000006004820152734200000000000000000000000000000000000015906347af267b90602401602060405180830381865afa9250505080156106f0575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526106ed91810190613169565b60015b61070157600061018082015261070a565b15156101808201525b806101800151801561072357506107216001611b34565b155b1561075a576040517fa27dcc8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806020016040528073420000000000000000000000000000000000000773ffffffffffffffffffffffffffffffffffffffff16639fce812c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e891906131ad565b73ffffffffffffffffffffffffffffffffffffffff16905281526040805160208082018084527f7f46ddb200000000000000000000000000000000000000000000000000000000905291519091829173420000000000000000000000000000000000001091637f46ddb29160248086019291908187030181865afa158015610874573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089891906131ad565b73ffffffffffffffffffffffffffffffffffffffff168152508160200181905250604051806020016040528073420000000000000000000000000000000000001473ffffffffffffffffffffffffffffffffffffffff16637f46ddb26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610923573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094791906131ad565b73ffffffffffffffffffffffffffffffffffffffff168152508160400181905250604051806020016040528073420000000000000000000000000000000000001273ffffffffffffffffffffffffffffffffffffffff1663ee9a31a26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f691906131ad565b73ffffffffffffffffffffffffffffffffffffffff1690526060820152604080518082018083527fee9a31a2000000000000000000000000000000000000000000000000000000009052905181907342000000000000000000000000000000000000179063ee9a31a2906044808501916020918187030181865afa158015610a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa691906131ad565b73ffffffffffffffffffffffffffffffffffffffff16815260200173420000000000000000000000000000000000001773ffffffffffffffffffffffffffffffffffffffff16637d1d0c5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4491906131ca565b90526080820152610b68734200000000000000000000000000000000000011611c97565b60a0820152610b8a734200000000000000000000000000000000000019611c97565b60c0820152610bac73420000000000000000000000000000000000001a611c97565b60e0820152610bce73420000000000000000000000000000000000001b611c97565b61010082015261016081015115610dbe57600073420000000000000000000000000000000000002a905060405180606001604052808273ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7291906131ad565b73ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1663d84447156040518163ffffffff1660e01b8152600401600060405180830381865afa158015610cd8573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610d1e91908101906132a4565b81526020018273ffffffffffffffffffffffffffffffffffffffff1663550fcdc96040518163ffffffff1660e01b8152600401600060405180830381865afa158015610d6e573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610db491908101906132a4565b9052610120830152505b600073420000000000000000000000000000000000002b73ffffffffffffffffffffffffffffffffffffffff1663d61a398b6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610e59575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610e56918101906131ad565b60015b610e6557506000610e68565b90505b604080516020810190915273ffffffffffffffffffffffffffffffffffffffff909116815261014082015290565b80515160405173ffffffffffffffffffffffffffffffffffffffff9091166024820152610f9990734200000000000000000000000000000000000007907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de80000000000000000000000000000000000000000000000000000000017905260006014611e78565b60208101515160405173ffffffffffffffffffffffffffffffffffffffff909116602482015261109f90734200000000000000000000000000000000000010907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906044015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052600080611e78565b60408082015151905173ffffffffffffffffffffffffffffffffffffffff909116602482015261112b90734200000000000000000000000000000000000014907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401611021565b60608101515160405173ffffffffffffffffffffffffffffffffffffffff90911660248201526111b790734200000000000000000000000000000000000012907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401611021565b6080810151805160209091015160405173ffffffffffffffffffffffffffffffffffffffff909216602483015260448201526112c990734200000000000000000000000000000000000017907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090606401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcd6dc6870000000000000000000000000000000000000000000000000000000017905260016000611e78565b80610160015115611410576101208101518051602082015160409283015192516113d29373420000000000000000000000000000000000002a937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361135493906024016132f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f9065714700000000000000000000000000000000000000000000000000000000179052600080611e78565b6114107342000000000000000000000000000000000000297f000000000000000000000000000000000000000000000000000000000000000061254d565b6101408101515160405173ffffffffffffffffffffffffffffffffffffffff909116602482015261149d9073420000000000000000000000000000000000002b907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401611021565b60a08101518051602082015160409283015192516115ba93734200000000000000000000000000000000000011937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361151c939060240161336f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb49dc741000000000000000000000000000000000000000000000000000000001790527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006000611e78565b60c081015180516020820151604092830151925161163993734200000000000000000000000000000000000019937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361151c939060240161336f565b60e08101518051602082015160409283015192516116b89373420000000000000000000000000000000000001a937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361151c939060240161336f565b6101008101518051602082015160409283015192516117389373420000000000000000000000000000000000001b937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361151c939060240161336f565b61177673420000000000000000000000000000000000000f7f000000000000000000000000000000000000000000000000000000000000000061254d565b6117e47342000000000000000000000000000000000000158261016001516117be577f000000000000000000000000000000000000000000000000000000000000000061254d565b7f000000000000000000000000000000000000000000000000000000000000000061254d565b8061016001511561188d576040517f46a4d7800000000000000000000000000000000000000000000000000000000081527f435553544f4d5f4741535f544f4b454e000000000000000000000000000000006004820152734200000000000000000000000000000000000015906346a4d78090602401600060405180830381600087803b15801561187457600080fd5b505af1158015611888573d6000803e3d6000fd5b505050505b6118fb7342000000000000000000000000000000000000168261016001516118d5577f000000000000000000000000000000000000000000000000000000000000000061254d565b7f000000000000000000000000000000000000000000000000000000000000000061254d565b6119397342000000000000000000000000000000000000187f000000000000000000000000000000000000000000000000000000000000000061254d565b61197773420000000000000000000000000000000000002d7f000000000000000000000000000000000000000000000000000000000000000061254d565b80610180015115611a7a576119c07342000000000000000000000000000000000000227f000000000000000000000000000000000000000000000000000000000000000061254d565b6119fe7342000000000000000000000000000000000000237f000000000000000000000000000000000000000000000000000000000000000061254d565b611a3c7342000000000000000000000000000000000000247f000000000000000000000000000000000000000000000000000000000000000061254d565b611a7a7342000000000000000000000000000000000000257f000000000000000000000000000000000000000000000000000000000000000061254d565b611ab87342000000000000000000000000000000000000207f000000000000000000000000000000000000000000000000000000000000000061254d565b611af67342000000000000000000000000000000000000217f000000000000000000000000000000000000000000000000000000000000000061254d565b61059873420000000000000000000000000000000000002c7f000000000000000000000000000000000000000000000000000000000000000061254d565b6040517f204e1c7a00000000000000000000000000000000000000000000000000000000815273420000000000000000000000000000000000002d600482015260009081907342000000000000000000000000000000000000189063204e1c7a90602401602060405180830381865afa158015611bb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd991906131ad565b90508073ffffffffffffffffffffffffffffffffffffffff163b600003611c035750600092915050565b6040517f78ecabce0000000000000000000000000000000000000000000000000000000081526004810184905273420000000000000000000000000000000000002d906378ecabce90602401602060405180830381865afa158015611c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c909190613169565b9392505050565b611cb860408051606081018252600080825260208201819052909182015290565b60008273ffffffffffffffffffffffffffffffffffffffff1663d0e12f906040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611d3f575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611d3c918101906133d8565b60015b611d4b57506000611d4e565b90505b600083905060405180606001604052808273ffffffffffffffffffffffffffffffffffffffff16630d9019e16040518163ffffffff1660e01b8152600401602060405180830381865afa158015611da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dcd91906131ad565b73ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1663d3e5792b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5791906131ca565b8152602001836001811115611e6e57611e6e613340565b9052949350505050565b611e81866127da565b15612545576040517f204e1c7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526000907342000000000000000000000000000000000000189063204e1c7a90602401602060405180830381865afa158015611f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2b91906131ad565b905073ffffffffffffffffffffffffffffffffffffffff81163b1580159061207857506120788773ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa158015611f9c573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611fe291908101906132a4565b8773ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa15801561202d573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261207391908101906132a4565b612823565b156120cc576040517ff8ce5d1600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024015b60405180910390fd5b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152881690633659cfe690602401600060405180830381600087803b15801561213557600080fd5b505af1158015612149573d6000803e3d6000fd5b50506040517fa6ed563e000000000000000000000000000000000000000000000000000000008152600481018690527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0092506000915073ffffffffffffffffffffffffffffffffffffffff8a169063a6ed563e90602401602060405180830381865afa1580156121dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220191906131ca565b90508185141580156122305750612219846001613428565b6122279060ff16600861344d565b81901c60ff1615155b15612267576040517fc996d78400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061227760ff8616600861344d565b6040517f4e91db080000000000000000000000000000000000000000000000000000000081526004810188905260ff90911b198381166024830152915073ffffffffffffffffffffffffffffffffffffffff8b1690634e91db0890604401600060405180830381600087803b1580156122ef57600080fd5b505af1158015612303573d6000803e3d6000fd5b50506040517fa6ed563e000000000000000000000000000000000000000000000000000000008152600481018690526000925073ffffffffffffffffffffffffffffffffffffffff8d16915063a6ed563e90602401602060405180830381865afa158015612375573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061239991906131ca565b905060ff604082901c16156123da576040517fc996d78400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f4e91db08000000000000000000000000000000000000000000000000000000008152600481018590527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000082811660248301529073ffffffffffffffffffffffffffffffffffffffff8d1690634e91db0890604401600060405180830381600087803b15801561246c57600080fd5b505af1158015612480573d6000803e3d6000fd5b50506040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8f169250634f1ef28691506124d8908e908d9060040161348a565b6000604051808303816000875af11580156124f7573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261253d91908101906132a4565b505050505050505b505050505050565b612556826127da565b61255e575050565b6040517f204e1c7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526000907342000000000000000000000000000000000000189063204e1c7a90602401602060405180830381865afa1580156125df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061260391906131ad565b905073ffffffffffffffffffffffffffffffffffffffff81163b1580159061270557506127058373ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa158015612674573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526126ba91908101906132a4565b8373ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa15801561202d573d6000803e3d6000fd5b15612754576040517ff8ce5d1600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016120c3565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe690602401600060405180830381600087803b1580156127bd57600080fd5b505af11580156127d1573d6000803e3d6000fd5b50505050505050565b60007208400000000000000000000000000000000000600b83901c721fffffffffffffffffffffffffffffffffffff1614801561281d575061281b82612849565b155b92915050565b600061282f83836128b1565b158015611c9057506128418383612901565b159392505050565b600073ffffffffffffffffffffffffffffffffffffffff8216734200000000000000000000000000000000000042148061281d575073ffffffffffffffffffffffffffffffffffffffff82167342000000000000000000000000000000000000061492915050565b6000806128bd84612976565b905060006128ca84612976565b805183519192501480156128e5575080602001518260200151145b80156128f8575080604001518260400151145b95945050505050565b60008061290d84612976565b9050600061291a84612976565b805183519192501180612940575080518251148015612940575080602001518260200151105b806128f857508051825114801561295e575080602001518260200151145b80156128f85750604090810151910151109392505050565b61299a60405180606001604052806000815260200160008152602001600081525090565b60006129db836040518060400160405280600181526020017f2e00000000000000000000000000000000000000000000000000000000000000815250612b42565b9050600381511015612a19576040517f9eda858c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612a7482600281518110612a3157612a316134b9565b60200260200101516040518060400160405280600181526020017f2d00000000000000000000000000000000000000000000000000000000000000815250612b42565b90506000612ad182600081518110612a8e57612a8e6134b9565b60200260200101516040518060400160405280600181526020017f2b00000000000000000000000000000000000000000000000000000000000000815250612b42565b90506040518060600160405280612b0185600081518110612af457612af46134b9565b6020026020010151612bed565b8152602001612b1c85600181518110612af457612af46134b9565b8152602001612b3783600081518110612af457612af46134b9565b905295945050505050565b60606000612b508484612c65565b9050601f1960208201600183510160051b81018651838201526001845101845260005b825160608452818114612bb85760405182820380825286601f8201165b8b850181015183820152870180612b905750600082820160200152603f018616810160405284525b875160209490940193019050818310612b7357505050508091508251612be657602081019150600281510382525b5092915050565b80516000907f1999999999999999999999999999999999999999999999999999999999999999825b600181019050603060ff82870151160382851185600a028281019650600983118188108317171586029550505050828110612c1557505080612c5f5763101827966000526004601cfd5b50919050565b606082518251818111612d4a576020850194506020840193506020604051019250846001828488010301600060208410612c9e57508286205b601f841660200360031b87515b8951818118831c612d00578315612cde5783878c2014612cde5760018b019a50848b10612cd85750612d0f565b50612cab565b858b038952998601996020909801978615612d0057848b10612cd85750612d0f565b5060018a019950838a10612cab575b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08189030160051c8152602090970190525050505b505092915050565b604080516101c08101825260006101a08201818152825282516020808201855282825280840191909152835180820185528281528385015283518082018552828152606084015283518085019094528184528301529060808201908152602001612dd360408051606081018252600080825260208201819052909182015290565b8152602001612df960408051606081018252600080825260208201819052909182015290565b8152602001612e1f60408051606081018252600080825260208201819052909182015290565b8152602001612e4560408051606081018252600080825260208201819052909182015290565b8152604080516060808201835260008252602082810182905292820152910190815260408051602081810190925260008152910190815260006020820181905260409091015290565b60005b83811015612ea9578181015183820152602001612e91565b83811115612eb8576000848401525b50505050565b60008151808452612ed6816020860160208601612e8e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611c906020830184612ebe565b815173ffffffffffffffffffffffffffffffffffffffff16815261036081016020830151612f61602084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040830151612f89604084018273ffffffffffffffffffffffffffffffffffffffff169052565b506060830151612fb1606084018273ffffffffffffffffffffffffffffffffffffffff169052565b506080830151612fd9608084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060a083015161300160a084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060c083015161302960c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060e083015161305160e084018273ffffffffffffffffffffffffffffffffffffffff169052565b506101008381015173ffffffffffffffffffffffffffffffffffffffff90811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501518216908401526101e08085015182169084015261020080850151821690840152610220808501518216908401526102408085015182169084015261026080850151821690840152610280808501518216908401526102a0808501518216908401526102c0808501518216908401526102e0808501518216908401526103008085015182169084015261032080850151821690840152610340808501519182168185015290612d4a565b60006020828403121561317b57600080fd5b81518015158114611c9057600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461059857600080fd5b6000602082840312156131bf57600080fd5b8151611c908161318b565b6000602082840312156131dc57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561322d5761322d6131e3565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715613273576132736131e3565b8160405280935085815286868601111561328c57600080fd5b61329a866020830187612e8e565b5050509392505050565b6000602082840312156132b657600080fd5b815167ffffffffffffffff8111156132cd57600080fd5b8201601f810184136132de57600080fd5b6132ed84825160208401613212565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006133246060830185612ebe565b82810360408401526133368185612ebe565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff841681526020810183905260608101600283106133ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b826040830152949350505050565b6000602082840312156133ea57600080fd5b815160028110611c9057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060ff821660ff84168060ff03821115613445576134456133f9565b019392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613485576134856133f9565b500290565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015260006132ed6040830184612ebe565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080f000a0000000000000000000000002a5a3eabb9fd571a3af0299eebdf8eaafe29a914000000000000000000000000250af3f400cf8aac8d410c90f1ba3968dd87df96000000000000000000000000547d0fba434877d7237d511cf87fabe2ee26b152000000000000000000000000ac8538a2e6a1f5dfbb1c4b8bd97cefb2997824a8000000000000000000000000b178cdaa8336f25624a63c049edb5af7ca36c2da000000000000000000000000c053fc0155bf8bda5b568af53276e538f0ea4d58000000000000000000000000716ead0cf3e7ff86a02d4f8cb41a6d14922fa8330000000000000000000000006a97c5d55a21265326150efe12fc30fb21cbff56000000000000000000000000a0734858ba5085ff6db493021a0f8c54605c2cda00000000000000000000000027e51b2254433a3284d9ba73ea551c397db2a124000000000000000000000000a0f4ffff79a0a3e039fcbef738751efba8e84f96000000000000000000000000f43862b9d814bb4504158ceccb0b74b31265e4ee000000000000000000000000893c2ceeb71d38514daf67728d3ff1b213fc4b5f000000000000000000000000f7bed7215eef1003fac426682cf2edeb958569f7000000000000000000000000f7bed7215eef1003fac426682cf2edeb958569f7000000000000000000000000eddf416c7159387cc6df3015700f79cfb891137300000000000000000000000070de55bc0bfbc52c5d0cca1da5816c2428886a34000000000000000000000000bec660b456b84a081e90af29be43385bda5bf7b600000000000000000000000093a8a7a9c98cb998d88dba3373a6c7f8ee2e8a4600000000000000000000000037dc2fe754052a9fac35f17282599fafbeb9f423000000000000000000000000784f1fae11f1c3a9c413423fe1b370a3636b8d560000000000000000000000002f76618143d9d2731c56778192d3893864b423d7000000000000000000000000dda87ef358082ab3f4ba8982290c671efdc4d1590000000000000000000000008256398a687e740006098445b05d5ca46b7be21e0000000000000000000000008684ccc5bf484ec242dbc7119004a83533934a79000000000000000000000000906835344844979ffd3a752eaa23728d513db00b000000000000000000000000e35b194efc4907f383b7e3b87f4c2c339ce239f600", + "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000003f546104006040523480156200001257600080fd5b5060405162003bf438038062003bf48339810160408190526200003591620001d4565b30608090815281516001600160a01b0390811660a09081526020840151821660e09081526040850151831660c0908152606086015184166101009081529486015184166101209081529286015184166101409081529086015184166101609081529186015184166101809081529486015184166101a09081529286015184166101c09081529086015184166101e09081529186015184166102009081529486015184166102209081529286015184166102409081529086015184166102609081529186015184166102809081529486015184166102a09081529286015184166102c09081529086015184166102e090815291860151841661030090815294860151841661032090815292860151841661034090815290860151841661036052908501518316610380529284015182166103a05283015181166103c052910151166103e05262000407565b60405161036081016001600160401b0381118282101715620001b157634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b0381168114620001cf57600080fd5b919050565b60006103608284031215620001e857600080fd5b620001f26200017f565b620001fd83620001b7565b81526200020d60208401620001b7565b60208201526200022060408401620001b7565b60408201526200023360608401620001b7565b60608201526200024660808401620001b7565b60808201526200025960a08401620001b7565b60a08201526200026c60c08401620001b7565b60c08201526200027f60e08401620001b7565b60e082015261010062000294818501620001b7565b90820152610120620002a8848201620001b7565b90820152610140620002bc848201620001b7565b90820152610160620002d0848201620001b7565b90820152610180620002e4848201620001b7565b908201526101a0620002f8848201620001b7565b908201526101c06200030c848201620001b7565b908201526101e062000320848201620001b7565b9082015261020062000334848201620001b7565b9082015261022062000348848201620001b7565b908201526102406200035c848201620001b7565b9082015261026062000370848201620001b7565b9082015261028062000384848201620001b7565b908201526102a062000398848201620001b7565b908201526102c0620003ac848201620001b7565b908201526102e0620003c0848201620001b7565b90820152610300620003d4848201620001b7565b90820152610320620003e8848201620001b7565b90820152610340620003fc848201620001b7565b908201529392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516103a0516103c0516103e0516135aa6200064a600039600081816104d80152611a080152600081816104af0152611bc5015260008181610486015261145301526000818161045d015261130501526000818161043401526113ec01526000818161040b0152611b0b0152600081816103e20152611acd0152600081816103b90152611a8f0152600081816103900152611a510152600081816103670152611b8701526000818161033e0152611b4901526000818161031501526116e90152600081816102ec01526116690152600081816102c301526115ea01526000818161029a01526119ca0152600081816102710152611205015260008181610248015261198c01526000818161021f01526119660152600081816101f601526117c00152600081816101ce015261179a0152600081816101a601526110e101526000818161017e015261116d01526000818161015601526114cd01526000818161012e0152610fdb01526000818160df0152610ed5015260008181610107015261175201526000818160ba01528181610ef701528181610ffd015281816111030152818161118f015281816112270152818161132701528181611475015281816114ef0152818161160c0152818161168b015261170b0152600061052b01526135aa6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806354fd4d5014610046578063615f64fe14610098578063d55ec6971461050a575b600080fd5b6100826040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b60405161008f9190612fbd565b60405180910390f35b604080516103608101825273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811682527f0000000000000000000000000000000000000000000000000000000000000000811660208301527f00000000000000000000000000000000000000000000000000000000000000008116828401527f0000000000000000000000000000000000000000000000000000000000000000811660608301527f0000000000000000000000000000000000000000000000000000000000000000811660808301527f0000000000000000000000000000000000000000000000000000000000000000811660a08301527f0000000000000000000000000000000000000000000000000000000000000000811660c08301527f0000000000000000000000000000000000000000000000000000000000000000811660e08301527f000000000000000000000000000000000000000000000000000000000000000081166101008301527f000000000000000000000000000000000000000000000000000000000000000081166101208301527f000000000000000000000000000000000000000000000000000000000000000081166101408301527f000000000000000000000000000000000000000000000000000000000000000081166101608301527f000000000000000000000000000000000000000000000000000000000000000081166101808301527f000000000000000000000000000000000000000000000000000000000000000081166101a08301527f000000000000000000000000000000000000000000000000000000000000000081166101c08301527f000000000000000000000000000000000000000000000000000000000000000081166101e08301527f000000000000000000000000000000000000000000000000000000000000000081166102008301527f000000000000000000000000000000000000000000000000000000000000000081166102208301527f000000000000000000000000000000000000000000000000000000000000000081166102408301527f000000000000000000000000000000000000000000000000000000000000000081166102608301527f000000000000000000000000000000000000000000000000000000000000000081166102808301527f000000000000000000000000000000000000000000000000000000000000000081166102a08301527f000000000000000000000000000000000000000000000000000000000000000081166102c08301527f000000000000000000000000000000000000000000000000000000000000000081166102e08301527f000000000000000000000000000000000000000000000000000000000000000081166103008301527f000000000000000000000000000000000000000000000000000000000000000081166103208301527f000000000000000000000000000000000000000000000000000000000000000016610340820152905161008f9190612fd0565b610512610514565b005b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610583576040517fada337cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061058d61059b565b905061059881610e96565b50565b6105a3612e07565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663213268496040518163ffffffff1660e01b8152600401602060405180830381865afa158015610602573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610626919061321e565b15156101608201526040517f47af267b0000000000000000000000000000000000000000000000000000000081527f494e5445524f50000000000000000000000000000000000000000000000000006004820152734200000000000000000000000000000000000015906347af267b90602401602060405180830381865afa9250505080156106f0575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526106ed9181019061321e565b60015b61070157600061018082015261070a565b15156101808201525b806101800151801561072357506107216001611be9565b155b1561075a576040517fa27dcc8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806020016040528073420000000000000000000000000000000000000773ffffffffffffffffffffffffffffffffffffffff16639fce812c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e89190613262565b73ffffffffffffffffffffffffffffffffffffffff16905281526040805160208082018084527f7f46ddb200000000000000000000000000000000000000000000000000000000905291519091829173420000000000000000000000000000000000001091637f46ddb29160248086019291908187030181865afa158015610874573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108989190613262565b73ffffffffffffffffffffffffffffffffffffffff168152508160200181905250604051806020016040528073420000000000000000000000000000000000001473ffffffffffffffffffffffffffffffffffffffff16637f46ddb26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610923573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109479190613262565b73ffffffffffffffffffffffffffffffffffffffff168152508160400181905250604051806020016040528073420000000000000000000000000000000000001273ffffffffffffffffffffffffffffffffffffffff1663ee9a31a26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f69190613262565b73ffffffffffffffffffffffffffffffffffffffff1690526060820152604080518082018083527fee9a31a2000000000000000000000000000000000000000000000000000000009052905181907342000000000000000000000000000000000000179063ee9a31a2906044808501916020918187030181865afa158015610a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa69190613262565b73ffffffffffffffffffffffffffffffffffffffff16815260200173420000000000000000000000000000000000001773ffffffffffffffffffffffffffffffffffffffff16637d1d0c5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b44919061327f565b90526080820152610b68734200000000000000000000000000000000000011611d4c565b60a0820152610b8a734200000000000000000000000000000000000019611d4c565b60c0820152610bac73420000000000000000000000000000000000001a611d4c565b60e0820152610bce73420000000000000000000000000000000000001b611d4c565b61010082015261016081015115610dbe57600073420000000000000000000000000000000000002a905060405180606001604052808273ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c729190613262565b73ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1663d84447156040518163ffffffff1660e01b8152600401600060405180830381865afa158015610cd8573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610d1e9190810190613359565b81526020018273ffffffffffffffffffffffffffffffffffffffff1663550fcdc96040518163ffffffff1660e01b8152600401600060405180830381865afa158015610d6e573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610db49190810190613359565b9052610120830152505b600073420000000000000000000000000000000000002b73ffffffffffffffffffffffffffffffffffffffff1663d61a398b6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610e59575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610e5691810190613262565b60015b610e6557506000610e68565b90505b604080516020810190915273ffffffffffffffffffffffffffffffffffffffff909116815261014082015290565b80515160405173ffffffffffffffffffffffffffffffffffffffff9091166024820152610f9990734200000000000000000000000000000000000007907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de80000000000000000000000000000000000000000000000000000000017905260006014611f2d565b60208101515160405173ffffffffffffffffffffffffffffffffffffffff909116602482015261109f90734200000000000000000000000000000000000010907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906044015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052600080611f2d565b60408082015151905173ffffffffffffffffffffffffffffffffffffffff909116602482015261112b90734200000000000000000000000000000000000014907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401611021565b60608101515160405173ffffffffffffffffffffffffffffffffffffffff90911660248201526111b790734200000000000000000000000000000000000012907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401611021565b6080810151805160209091015160405173ffffffffffffffffffffffffffffffffffffffff909216602483015260448201526112c990734200000000000000000000000000000000000017907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090606401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcd6dc6870000000000000000000000000000000000000000000000000000000017905260016000611f2d565b80610160015115611410576101208101518051602082015160409283015192516113d29373420000000000000000000000000000000000002a937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361135493906024016133aa565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f9065714700000000000000000000000000000000000000000000000000000000179052600080611f2d565b6114107342000000000000000000000000000000000000297f0000000000000000000000000000000000000000000000000000000000000000612602565b6101408101515160405173ffffffffffffffffffffffffffffffffffffffff909116602482015261149d9073420000000000000000000000000000000000002b907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401611021565b60a08101518051602082015160409283015192516115ba93734200000000000000000000000000000000000011937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361151c9390602401613424565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb49dc741000000000000000000000000000000000000000000000000000000001790527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006000611f2d565b60c081015180516020820151604092830151925161163993734200000000000000000000000000000000000019937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361151c9390602401613424565b60e08101518051602082015160409283015192516116b89373420000000000000000000000000000000000001a937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361151c9390602401613424565b6101008101518051602082015160409283015192516117389373420000000000000000000000000000000000001b937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361151c9390602401613424565b61177673420000000000000000000000000000000000000f7f0000000000000000000000000000000000000000000000000000000000000000612602565b6117e47342000000000000000000000000000000000000158261016001516117be577f0000000000000000000000000000000000000000000000000000000000000000612602565b7f0000000000000000000000000000000000000000000000000000000000000000612602565b806101600151801561189f57506040517f47af267b0000000000000000000000000000000000000000000000000000000081527f435553544f4d5f4741535f544f4b454e000000000000000000000000000000006004820152734200000000000000000000000000000000000015906347af267b90602401602060405180830381865afa158015611879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189d919061321e565b155b15611942576040517f46a4d7800000000000000000000000000000000000000000000000000000000081527f435553544f4d5f4741535f544f4b454e000000000000000000000000000000006004820152734200000000000000000000000000000000000015906346a4d78090602401600060405180830381600087803b15801561192957600080fd5b505af115801561193d573d6000803e3d6000fd5b505050505b6119b073420000000000000000000000000000000000001682610160015161198a577f0000000000000000000000000000000000000000000000000000000000000000612602565b7f0000000000000000000000000000000000000000000000000000000000000000612602565b6119ee7342000000000000000000000000000000000000187f0000000000000000000000000000000000000000000000000000000000000000612602565b611a2c73420000000000000000000000000000000000002d7f0000000000000000000000000000000000000000000000000000000000000000612602565b80610180015115611b2f57611a757342000000000000000000000000000000000000227f0000000000000000000000000000000000000000000000000000000000000000612602565b611ab37342000000000000000000000000000000000000237f0000000000000000000000000000000000000000000000000000000000000000612602565b611af17342000000000000000000000000000000000000247f0000000000000000000000000000000000000000000000000000000000000000612602565b611b2f7342000000000000000000000000000000000000257f0000000000000000000000000000000000000000000000000000000000000000612602565b611b6d7342000000000000000000000000000000000000207f0000000000000000000000000000000000000000000000000000000000000000612602565b611bab7342000000000000000000000000000000000000217f0000000000000000000000000000000000000000000000000000000000000000612602565b61059873420000000000000000000000000000000000002c7f0000000000000000000000000000000000000000000000000000000000000000612602565b6040517f204e1c7a00000000000000000000000000000000000000000000000000000000815273420000000000000000000000000000000000002d600482015260009081907342000000000000000000000000000000000000189063204e1c7a90602401602060405180830381865afa158015611c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8e9190613262565b90508073ffffffffffffffffffffffffffffffffffffffff163b600003611cb85750600092915050565b6040517f78ecabce0000000000000000000000000000000000000000000000000000000081526004810184905273420000000000000000000000000000000000002d906378ecabce90602401602060405180830381865afa158015611d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d45919061321e565b9392505050565b611d6d60408051606081018252600080825260208201819052909182015290565b60008273ffffffffffffffffffffffffffffffffffffffff1663d0e12f906040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611df4575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611df19181019061348d565b60015b611e0057506000611e03565b90505b600083905060405180606001604052808273ffffffffffffffffffffffffffffffffffffffff16630d9019e16040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e829190613262565b73ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1663d3e5792b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0c919061327f565b8152602001836001811115611f2357611f236133f5565b9052949350505050565b611f368661288f565b156125fa576040517f204e1c7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526000907342000000000000000000000000000000000000189063204e1c7a90602401602060405180830381865afa158015611fbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe09190613262565b905073ffffffffffffffffffffffffffffffffffffffff81163b1580159061212d575061212d8773ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa158015612051573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526120979190810190613359565b8773ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa1580156120e2573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526121289190810190613359565b6128d8565b15612181576040517ff8ce5d1600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024015b60405180910390fd5b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152881690633659cfe690602401600060405180830381600087803b1580156121ea57600080fd5b505af11580156121fe573d6000803e3d6000fd5b50506040517fa6ed563e000000000000000000000000000000000000000000000000000000008152600481018690527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0092506000915073ffffffffffffffffffffffffffffffffffffffff8a169063a6ed563e90602401602060405180830381865afa158015612292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b6919061327f565b90508185141580156122e557506122ce8460016134dd565b6122dc9060ff166008613502565b81901c60ff1615155b1561231c576040517fc996d78400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061232c60ff86166008613502565b6040517f4e91db080000000000000000000000000000000000000000000000000000000081526004810188905260ff90911b198381166024830152915073ffffffffffffffffffffffffffffffffffffffff8b1690634e91db0890604401600060405180830381600087803b1580156123a457600080fd5b505af11580156123b8573d6000803e3d6000fd5b50506040517fa6ed563e000000000000000000000000000000000000000000000000000000008152600481018690526000925073ffffffffffffffffffffffffffffffffffffffff8d16915063a6ed563e90602401602060405180830381865afa15801561242a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244e919061327f565b905060ff604082901c161561248f576040517fc996d78400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f4e91db08000000000000000000000000000000000000000000000000000000008152600481018590527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000082811660248301529073ffffffffffffffffffffffffffffffffffffffff8d1690634e91db0890604401600060405180830381600087803b15801561252157600080fd5b505af1158015612535573d6000803e3d6000fd5b50506040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8f169250634f1ef286915061258d908e908d9060040161353f565b6000604051808303816000875af11580156125ac573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526125f29190810190613359565b505050505050505b505050505050565b61260b8261288f565b612613575050565b6040517f204e1c7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526000907342000000000000000000000000000000000000189063204e1c7a90602401602060405180830381865afa158015612694573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b89190613262565b905073ffffffffffffffffffffffffffffffffffffffff81163b158015906127ba57506127ba8373ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa158015612729573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261276f9190810190613359565b8373ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa1580156120e2573d6000803e3d6000fd5b15612809576040517ff8ce5d1600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401612178565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe690602401600060405180830381600087803b15801561287257600080fd5b505af1158015612886573d6000803e3d6000fd5b50505050505050565b60007208400000000000000000000000000000000000600b83901c721fffffffffffffffffffffffffffffffffffff161480156128d257506128d0826128fe565b155b92915050565b60006128e48383612966565b158015611d4557506128f683836129b6565b159392505050565b600073ffffffffffffffffffffffffffffffffffffffff821673420000000000000000000000000000000000004214806128d2575073ffffffffffffffffffffffffffffffffffffffff82167342000000000000000000000000000000000000061492915050565b60008061297284612a2b565b9050600061297f84612a2b565b8051835191925014801561299a575080602001518260200151145b80156129ad575080604001518260400151145b95945050505050565b6000806129c284612a2b565b905060006129cf84612a2b565b8051835191925011806129f55750805182511480156129f5575080602001518260200151105b806129ad575080518251148015612a13575080602001518260200151145b80156129ad5750604090810151910151109392505050565b612a4f60405180606001604052806000815260200160008152602001600081525090565b6000612a90836040518060400160405280600181526020017f2e00000000000000000000000000000000000000000000000000000000000000815250612bf7565b9050600381511015612ace576040517f9eda858c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612b2982600281518110612ae657612ae661356e565b60200260200101516040518060400160405280600181526020017f2d00000000000000000000000000000000000000000000000000000000000000815250612bf7565b90506000612b8682600081518110612b4357612b4361356e565b60200260200101516040518060400160405280600181526020017f2b00000000000000000000000000000000000000000000000000000000000000815250612bf7565b90506040518060600160405280612bb685600081518110612ba957612ba961356e565b6020026020010151612ca2565b8152602001612bd185600181518110612ba957612ba961356e565b8152602001612bec83600081518110612ba957612ba961356e565b905295945050505050565b60606000612c058484612d1a565b9050601f1960208201600183510160051b81018651838201526001845101845260005b825160608452818114612c6d5760405182820380825286601f8201165b8b850181015183820152870180612c455750600082820160200152603f018616810160405284525b875160209490940193019050818310612c2857505050508091508251612c9b57602081019150600281510382525b5092915050565b80516000907f1999999999999999999999999999999999999999999999999999999999999999825b600181019050603060ff82870151160382851185600a028281019650600983118188108317171586029550505050828110612cca57505080612d145763101827966000526004601cfd5b50919050565b606082518251818111612dff576020850194506020840193506020604051019250846001828488010301600060208410612d5357508286205b601f841660200360031b87515b8951818118831c612db5578315612d935783878c2014612d935760018b019a50848b10612d8d5750612dc4565b50612d60565b858b038952998601996020909801978615612db557848b10612d8d5750612dc4565b5060018a019950838a10612d60575b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08189030160051c8152602090970190525050505b505092915050565b604080516101c08101825260006101a08201818152825282516020808201855282825280840191909152835180820185528281528385015283518082018552828152606084015283518085019094528184528301529060808201908152602001612e8860408051606081018252600080825260208201819052909182015290565b8152602001612eae60408051606081018252600080825260208201819052909182015290565b8152602001612ed460408051606081018252600080825260208201819052909182015290565b8152602001612efa60408051606081018252600080825260208201819052909182015290565b8152604080516060808201835260008252602082810182905292820152910190815260408051602081810190925260008152910190815260006020820181905260409091015290565b60005b83811015612f5e578181015183820152602001612f46565b83811115612f6d576000848401525b50505050565b60008151808452612f8b816020860160208601612f43565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611d456020830184612f73565b815173ffffffffffffffffffffffffffffffffffffffff16815261036081016020830151613016602084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604083015161303e604084018273ffffffffffffffffffffffffffffffffffffffff169052565b506060830151613066606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50608083015161308e608084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060a08301516130b660a084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060c08301516130de60c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060e083015161310660e084018273ffffffffffffffffffffffffffffffffffffffff169052565b506101008381015173ffffffffffffffffffffffffffffffffffffffff90811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501518216908401526101e08085015182169084015261020080850151821690840152610220808501518216908401526102408085015182169084015261026080850151821690840152610280808501518216908401526102a0808501518216908401526102c0808501518216908401526102e0808501518216908401526103008085015182169084015261032080850151821690840152610340808501519182168185015290612dff565b60006020828403121561323057600080fd5b81518015158114611d4557600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461059857600080fd5b60006020828403121561327457600080fd5b8151611d4581613240565b60006020828403121561329157600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff808411156132e2576132e2613298565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561332857613328613298565b8160405280935085815286868601111561334157600080fd5b61334f866020830187612f43565b5050509392505050565b60006020828403121561336b57600080fd5b815167ffffffffffffffff81111561338257600080fd5b8201601f8101841361339357600080fd5b6133a2848251602084016132c7565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006133d96060830185612f73565b82810360408401526133eb8185612f73565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8416815260208101839052606081016002831061347f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b826040830152949350505050565b60006020828403121561349f57600080fd5b815160028110611d4557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060ff821660ff84168060ff038211156134fa576134fa6134ae565b019392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561353a5761353a6134ae565b500290565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015260006133a26040830184612f73565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080f000a0000000000000000000000002a5a3eabb9fd571a3af0299eebdf8eaafe29a914000000000000000000000000250af3f400cf8aac8d410c90f1ba3968dd87df96000000000000000000000000547d0fba434877d7237d511cf87fabe2ee26b152000000000000000000000000ac8538a2e6a1f5dfbb1c4b8bd97cefb2997824a8000000000000000000000000b178cdaa8336f25624a63c049edb5af7ca36c2da000000000000000000000000c053fc0155bf8bda5b568af53276e538f0ea4d58000000000000000000000000716ead0cf3e7ff86a02d4f8cb41a6d14922fa8330000000000000000000000006a97c5d55a21265326150efe12fc30fb21cbff56000000000000000000000000a0734858ba5085ff6db493021a0f8c54605c2cda00000000000000000000000027e51b2254433a3284d9ba73ea551c397db2a124000000000000000000000000a0f4ffff79a0a3e039fcbef738751efba8e84f96000000000000000000000000f43862b9d814bb4504158ceccb0b74b31265e4ee000000000000000000000000893c2ceeb71d38514daf67728d3ff1b213fc4b5f000000000000000000000000f7bed7215eef1003fac426682cf2edeb958569f7000000000000000000000000f7bed7215eef1003fac426682cf2edeb958569f7000000000000000000000000eddf416c7159387cc6df3015700f79cfb891137300000000000000000000000070de55bc0bfbc52c5d0cca1da5816c2428886a34000000000000000000000000bec660b456b84a081e90af29be43385bda5bf7b600000000000000000000000093a8a7a9c98cb998d88dba3373a6c7f8ee2e8a4600000000000000000000000037dc2fe754052a9fac35f17282599fafbeb9f423000000000000000000000000784f1fae11f1c3a9c413423fe1b370a3636b8d560000000000000000000000002f76618143d9d2731c56778192d3893864b423d7000000000000000000000000dda87ef358082ab3f4ba8982290c671efdc4d1590000000000000000000000008256398a687e740006098445b05d5ca46b7be21e0000000000000000000000008684ccc5bf484ec242dbc7119004a83533934a79000000000000000000000000906835344844979ffd3a752eaa23728d513db00b000000000000000000000000e35b194efc4907f383b7e3b87f4c2c339ce239f6000000000000000000000000", "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", "gasLimit": 4500000, "intent": "Deploy L2ContractsManager Implementation", "to": "0x420000000000000000000000000000000000002C" }, { - "data": "0x7c36f37e000000000000000000000000d0a2d13922abd9b7f45cf4eaf10d702df6bb30a1", + "data": "0x7c36f37e00000000000000000000000008d11be58b3df241255867d94fa867ac1e78b506", "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", "gasLimit": 3000000, "intent": "L2ProxyAdmin Upgrade Predeploys", diff --git a/packages/contracts-bedrock/src/L2/L2ContractsManager.sol b/packages/contracts-bedrock/src/L2/L2ContractsManager.sol index 08979f745a58b..67753f092f5b5 100644 --- a/packages/contracts-bedrock/src/L2/L2ContractsManager.sol +++ b/packages/contracts-bedrock/src/L2/L2ContractsManager.sol @@ -430,7 +430,10 @@ contract L2ContractsManager is ISemver { // After upgrading L1Block to the CGT impl, populate the feature mapping so that // isCustomGasToken() continues to return true. The new impl reads from the mapping // rather than the legacy storage slot. - if (_config.isCustomGasToken) { + if ( + _config.isCustomGasToken + && !IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).isFeatureEnabled(Features.CUSTOM_GAS_TOKEN) + ) { IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).setFeature(Features.CUSTOM_GAS_TOKEN); } L2ContractsManagerUtils.upgradeTo( diff --git a/packages/contracts-bedrock/src/libraries/Predeploys.sol b/packages/contracts-bedrock/src/libraries/Predeploys.sol index ce4a47086b31a..ee58c1d74f6cb 100644 --- a/packages/contracts-bedrock/src/libraries/Predeploys.sol +++ b/packages/contracts-bedrock/src/libraries/Predeploys.sol @@ -2,8 +2,8 @@ pragma solidity ^0.8.0; // Libraries -import { Fork } from "scripts/libraries/Config.sol"; import { DevFeatures } from "src/libraries/DevFeatures.sol"; +import { Features } from "src/libraries/Features.sol"; /// @title Predeploys /// @notice Contains constant addresses for protocol contracts that are pre-deployed to the L2 system. @@ -130,43 +130,43 @@ library Predeploys { /// @notice Address of the L2DevFeatureFlags predeploy. address internal constant L2_DEV_FEATURE_FLAGS = 0x420000000000000000000000000000000000002d; + /// @notice Configuration record for a single predeploy implementation. + /// @param proxy Canonical proxy address (0x4200...). CGT variants share the same + /// proxy as their standard counterpart. + /// @param name Implementation contract name (e.g. "L1Block", "L1BlockCGT"). + /// @param artifactPath Forge artifact path ("Contract.sol:Contract"). + /// @param deployGasLimit Gas limit for deployments in NUT bundles. + /// Based on gas profiling with a safety margin. + /// @param devFeatureGate DevFeatures constant that gates this predeploy on L2 genesis. + /// @param sysFeatureGate Features constant that gates this predeploy on L2 genesis. + /// @param isProxied True if the predeploy uses a Proxy. Non-proxied predeploys + /// (WETH, GovernanceToken) are etched directly without proxy or + /// implementation slot setup, and are excluded from NUT bundles. + struct PredeployRecord { + address proxy; + string name; + string artifactPath; + uint64 deployGasLimit; + bytes32 devFeatureGate; + bytes32 sysFeatureGate; + bool isProxied; + } + /// @notice Returns the name of the predeploy at the given address. function getName(address _addr) internal pure returns (string memory out_) { require(isPredeployNamespace(_addr), "Predeploys: address must be a predeploy"); - if (_addr == LEGACY_MESSAGE_PASSER) return "LegacyMessagePasser"; - if (_addr == L1_MESSAGE_SENDER) return "L1MessageSender"; - if (_addr == DEPLOYER_WHITELIST) return "DeployerWhitelist"; - if (_addr == WETH) return "WETH"; - if (_addr == L2_CROSS_DOMAIN_MESSENGER) return "L2CrossDomainMessenger"; - if (_addr == GAS_PRICE_ORACLE) return "GasPriceOracle"; - if (_addr == L2_STANDARD_BRIDGE) return "L2StandardBridge"; - if (_addr == SEQUENCER_FEE_WALLET) return "SequencerFeeVault"; - if (_addr == OPTIMISM_MINTABLE_ERC20_FACTORY) return "OptimismMintableERC20Factory"; - if (_addr == L1_BLOCK_NUMBER) return "L1BlockNumber"; - if (_addr == L2_ERC721_BRIDGE) return "L2ERC721Bridge"; - if (_addr == L1_BLOCK_ATTRIBUTES) return "L1Block"; + + // Get default name for CGT variants + if (_addr == L1_BLOCK_NUMBER) return "L1Block"; if (_addr == L2_TO_L1_MESSAGE_PASSER) return "L2ToL1MessagePasser"; - if (_addr == OPTIMISM_MINTABLE_ERC721_FACTORY) return "OptimismMintableERC721Factory"; - if (_addr == PROXY_ADMIN) return "L2ProxyAdmin"; - if (_addr == BASE_FEE_VAULT) return "BaseFeeVault"; - if (_addr == L1_FEE_VAULT) return "L1FeeVault"; - if (_addr == OPERATOR_FEE_VAULT) return "OperatorFeeVault"; - if (_addr == SCHEMA_REGISTRY) return "SchemaRegistry"; - if (_addr == EAS) return "EAS"; - if (_addr == GOVERNANCE_TOKEN) return "GovernanceToken"; - if (_addr == LEGACY_ERC20_ETH) return "LegacyERC20ETH"; - if (_addr == CROSS_L2_INBOX) return "CrossL2Inbox"; - if (_addr == L2_TO_L2_CROSS_DOMAIN_MESSENGER) return "L2ToL2CrossDomainMessenger"; - if (_addr == SUPERCHAIN_ETH_BRIDGE) return "SuperchainETHBridge"; - if (_addr == ETH_LIQUIDITY) return "ETHLiquidity"; - if (_addr == OPTIMISM_SUPERCHAIN_ERC20_FACTORY) return "OptimismSuperchainERC20Factory"; - if (_addr == OPTIMISM_SUPERCHAIN_ERC20_BEACON) return "OptimismSuperchainERC20Beacon"; - if (_addr == SUPERCHAIN_TOKEN_BRIDGE) return "SuperchainTokenBridge"; - if (_addr == LIQUIDITY_CONTROLLER) return "LiquidityController"; - if (_addr == NATIVE_ASSET_LIQUIDITY) return "NativeAssetLiquidity"; - if (_addr == FEE_SPLITTER) return "FeeSplitter"; - if (_addr == CONDITIONAL_DEPLOYER) return "ConditionalDeployer"; - if (_addr == L2_DEV_FEATURE_FLAGS) return "L2DevFeatureFlags"; + + // Get name from record + PredeployRecord[] memory records = getAllRecords(); + for (uint256 i = 0; i < records.length; i++) { + if (records[i].proxy == _addr) { + return records[i].name; + } + } revert("Predeploys: unnamed predeploy"); } @@ -175,51 +175,6 @@ library Predeploys { return _addr == GOVERNANCE_TOKEN || _addr == WETH; } - /// @notice Returns true if the address is a supported predeploy on this chain. - /// @param _addr The address of the predeploy to check. - /// @param _fork The fork number for which support is being checked. - /// @param _isCustomGasToken Whether the chain uses a custom gas token. Enables CGT-specific predeploys - /// (LiquidityController, NativeAssetLiquidity). - /// @param _useInterop Whether interop is enabled as a system configuration on this chain. - /// @param _devFeatureBitmap Per-chain dev feature bitmap stored in L2DevFeatureFlags. Controls conditional - /// predeploys still behind dev flags. - /// @return True if the predeploy is supported on this fork with the given feature flags. - function isSupportedPredeploy( - address _addr, - uint256 _fork, - bool _isCustomGasToken, - bool _useInterop, - bytes32 _devFeatureBitmap - ) - internal - pure - returns (bool) - { - bool _useL2CM = DevFeatures.isDevFeatureEnabled(_devFeatureBitmap, DevFeatures.L2CM); - bool _isInteropDevFeatureEnabled = - DevFeatures.isDevFeatureEnabled(_devFeatureBitmap, DevFeatures.OPTIMISM_PORTAL_INTEROP); - - return _addr == LEGACY_MESSAGE_PASSER || _addr == DEPLOYER_WHITELIST || _addr == WETH - || _addr == L2_CROSS_DOMAIN_MESSENGER || _addr == GAS_PRICE_ORACLE || _addr == L2_STANDARD_BRIDGE - || _addr == SEQUENCER_FEE_WALLET || _addr == OPTIMISM_MINTABLE_ERC20_FACTORY || _addr == L1_BLOCK_NUMBER - || _addr == L2_ERC721_BRIDGE || _addr == L1_BLOCK_ATTRIBUTES || _addr == L2_TO_L1_MESSAGE_PASSER - || _addr == OPTIMISM_MINTABLE_ERC721_FACTORY || _addr == PROXY_ADMIN || _addr == BASE_FEE_VAULT - || _addr == L1_FEE_VAULT || _addr == OPERATOR_FEE_VAULT || _addr == SCHEMA_REGISTRY || _addr == EAS - || _addr == GOVERNANCE_TOKEN || _addr == FEE_SPLITTER - || (_fork >= uint256(Fork.INTEROP) && _isInteropDevFeatureEnabled && _useInterop && _addr == CROSS_L2_INBOX) - || ( - _fork >= uint256(Fork.INTEROP) && _isInteropDevFeatureEnabled && _useInterop - && _addr == L2_TO_L2_CROSS_DOMAIN_MESSENGER - ) - || ( - _fork >= uint256(Fork.INTEROP) && _isInteropDevFeatureEnabled && _useInterop - && _addr == SUPERCHAIN_ETH_BRIDGE - ) || (_fork >= uint256(Fork.INTEROP) && _isInteropDevFeatureEnabled && _useInterop && _addr == ETH_LIQUIDITY) - || (_isCustomGasToken && _addr == LIQUIDITY_CONTROLLER) - || (_isCustomGasToken && _addr == NATIVE_ASSET_LIQUIDITY) || (_useL2CM && _addr == CONDITIONAL_DEPLOYER) - || (_useL2CM && _addr == L2_DEV_FEATURE_FLAGS); - } - /// @notice Returns true if the address is in the predeploy namespace. /// @param _addr The address to check. /// @return True if the address is in range 0x4200...0000 to 0x4200...07FF. @@ -246,41 +201,326 @@ library Predeploys { isUpgradeable_ = isPredeployNamespace(_proxy) && !notProxied(_proxy); } - /// @notice Returns all proxied predeploys that should be upgraded by L2CM. - /// This means that for each of these predeploys, isUpgradeable(predeploy) should return true if running on - /// a network that supports it. - /// @dev IMPORTANT: This is the SOURCE OF TRUTH for upgrade coverage. All proxied predeploys from - /// Predeploys library should be listed here. - /// Excludes: WETH, GOVERNANCE_TOKEN (not proxied), legacy predeploys (not upgraded). - function getUpgradeablePredeploys() internal pure returns (address[] memory predeploys_) { - predeploys_ = new address[](24); - // Core predeploys - predeploys_[0] = Predeploys.L2_CROSS_DOMAIN_MESSENGER; - predeploys_[1] = Predeploys.GAS_PRICE_ORACLE; - predeploys_[2] = Predeploys.L2_STANDARD_BRIDGE; - predeploys_[3] = Predeploys.SEQUENCER_FEE_WALLET; - predeploys_[4] = Predeploys.OPTIMISM_MINTABLE_ERC20_FACTORY; - predeploys_[5] = Predeploys.L2_ERC721_BRIDGE; - predeploys_[6] = Predeploys.L1_BLOCK_ATTRIBUTES; - predeploys_[7] = Predeploys.L2_TO_L1_MESSAGE_PASSER; - predeploys_[8] = Predeploys.OPTIMISM_MINTABLE_ERC721_FACTORY; - predeploys_[9] = Predeploys.PROXY_ADMIN; - predeploys_[10] = Predeploys.BASE_FEE_VAULT; - predeploys_[11] = Predeploys.L1_FEE_VAULT; - predeploys_[12] = Predeploys.OPERATOR_FEE_VAULT; - predeploys_[13] = Predeploys.SCHEMA_REGISTRY; - predeploys_[14] = Predeploys.EAS; - predeploys_[15] = Predeploys.FEE_SPLITTER; - predeploys_[16] = Predeploys.CONDITIONAL_DEPLOYER; - // Interop predeploys - predeploys_[17] = Predeploys.CROSS_L2_INBOX; - predeploys_[18] = Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER; - predeploys_[19] = Predeploys.SUPERCHAIN_ETH_BRIDGE; - predeploys_[20] = Predeploys.ETH_LIQUIDITY; - // CGT predeploys (conditionally deployed, but still must be included in the list) - predeploys_[21] = Predeploys.NATIVE_ASSET_LIQUIDITY; - predeploys_[22] = Predeploys.LIQUIDITY_CONTROLLER; - // Dev feature flags bitmap - predeploys_[23] = Predeploys.L2_DEV_FEATURE_FLAGS; + /// @notice Returns all predeploy implementation records. + /// @dev THE SINGLE SOURCE OF TRUTH for predeploy configuration. + /// Records are ordered to match the L2ContractsManagerTypes.Implementations struct field order. + /// Non-proxied records (isProxied = false) are appended at the end and must be skipped + /// by consumers that operate on proxy/implementation slots (NUT bundle, setPredeployProxies). + function getAllRecords() internal pure returns (PredeployRecord[] memory records_) { + records_ = new PredeployRecord[](28); + + // ── Core predeploys ──────────────────────────────────────────────────────────────── + // Gas profiling: 1,708,099 gas used → 2,562,148 recommended → 2.6M with safety margin + records_[0] = PredeployRecord({ + proxy: L2_CROSS_DOMAIN_MESSENGER, + name: "L2CrossDomainMessenger", + artifactPath: "L2CrossDomainMessenger.sol:L2CrossDomainMessenger", + deployGasLimit: 2_600_000, + devFeatureGate: bytes32(0), + sysFeatureGate: bytes32(0), + isProxied: true + }); + // Gas profiling: 1,681,024 gas used → 2,521,536 recommended → 2.6M with safety margin + records_[1] = PredeployRecord({ + proxy: GAS_PRICE_ORACLE, + name: "GasPriceOracle", + artifactPath: "GasPriceOracle.sol:GasPriceOracle", + deployGasLimit: 2_600_000, + devFeatureGate: bytes32(0), + sysFeatureGate: bytes32(0), + isProxied: true + }); + // Gas profiling: 2,358,092 gas used → 3,537,138 recommended → 3.6M with safety margin + records_[2] = PredeployRecord({ + proxy: L2_STANDARD_BRIDGE, + name: "L2StandardBridge", + artifactPath: "L2StandardBridge.sol:L2StandardBridge", + deployGasLimit: 3_600_000, + devFeatureGate: bytes32(0), + sysFeatureGate: bytes32(0), + isProxied: true + }); + // Gas profiling: 841,152 gas used → 1,261,728 recommended → 1.3M with safety margin + records_[3] = PredeployRecord({ + proxy: SEQUENCER_FEE_WALLET, + name: "SequencerFeeVault", + artifactPath: "SequencerFeeVault.sol:SequencerFeeVault", + deployGasLimit: 1_300_000, + devFeatureGate: bytes32(0), + sysFeatureGate: bytes32(0), + isProxied: true + }); + // Gas profiling: 2,347,504 gas used → 3,521,256 recommended → 3.6M with safety margin + records_[4] = PredeployRecord({ + proxy: OPTIMISM_MINTABLE_ERC20_FACTORY, + name: "OptimismMintableERC20Factory", + artifactPath: "OptimismMintableERC20Factory.sol:OptimismMintableERC20Factory", + deployGasLimit: 3_600_000, + devFeatureGate: bytes32(0), + sysFeatureGate: bytes32(0), + isProxied: true + }); + // Gas profiling: 1,242,108 gas used → 1,863,162 recommended → 1.9M with safety margin + records_[5] = PredeployRecord({ + proxy: L2_ERC721_BRIDGE, + name: "L2ERC721Bridge", + artifactPath: "L2ERC721Bridge.sol:L2ERC721Bridge", + deployGasLimit: 1_900_000, + devFeatureGate: bytes32(0), + sysFeatureGate: bytes32(0), + isProxied: true + }); + // Gas profiling: 707,557 gas used → 1,061,335 recommended → 1.1M with safety margin + // Standard variant — used on non-CGT chains. CGT variant follows immediately after. + records_[6] = PredeployRecord({ + proxy: L1_BLOCK_ATTRIBUTES, + name: "L1Block", + artifactPath: "L1Block.sol:L1Block", + deployGasLimit: 1_100_000, + devFeatureGate: bytes32(0), + sysFeatureGate: bytes32(0), + isProxied: true + }); + // Gas profiling: 710,257 gas used → 1,065,385 recommended → 1.1M with safety margin + // CGT variant — used on custom gas token chains. Same proxy as L1Block. + records_[7] = PredeployRecord({ + proxy: L1_BLOCK_ATTRIBUTES, + name: "L1BlockCGT", + artifactPath: "L1BlockCGT.sol:L1BlockCGT", + deployGasLimit: 1_100_000, + devFeatureGate: bytes32(0), + sysFeatureGate: Features.CUSTOM_GAS_TOKEN, + isProxied: true + }); + // Gas profiling: 400,911 gas used → 601,366 recommended → 650K with safety margin + // Standard variant — used on non-CGT chains. CGT variant follows immediately after. + records_[8] = PredeployRecord({ + proxy: L2_TO_L1_MESSAGE_PASSER, + name: "L2ToL1MessagePasser", + artifactPath: "L2ToL1MessagePasser.sol:L2ToL1MessagePasser", + deployGasLimit: 650_000, + devFeatureGate: bytes32(0), + sysFeatureGate: bytes32(0), + isProxied: true + }); + // Gas profiling: 484,560 gas used → 726,840 recommended → 750K with safety margin + // CGT variant — used on custom gas token chains. Same proxy as L2ToL1MessagePasser. + records_[9] = PredeployRecord({ + proxy: L2_TO_L1_MESSAGE_PASSER, + name: "L2ToL1MessagePasserCGT", + artifactPath: "L2ToL1MessagePasserCGT.sol:L2ToL1MessagePasserCGT", + deployGasLimit: 750_000, + devFeatureGate: bytes32(0), + sysFeatureGate: Features.CUSTOM_GAS_TOKEN, + isProxied: true + }); + // Gas profiling: 3,248,395 gas used → 4,872,592 recommended → 4.9M with safety margin + records_[10] = PredeployRecord({ + proxy: OPTIMISM_MINTABLE_ERC721_FACTORY, + name: "OptimismMintableERC721Factory", + artifactPath: "OptimismMintableERC721Factory.sol:OptimismMintableERC721Factory", + deployGasLimit: 4_900_000, + devFeatureGate: bytes32(0), + sysFeatureGate: bytes32(0), + isProxied: true + }); + // Gas profiling: 1,538,265 gas used → 2,307,397 recommended → 2.4M with safety margin + records_[11] = PredeployRecord({ + proxy: PROXY_ADMIN, + name: "L2ProxyAdmin", + artifactPath: "L2ProxyAdmin.sol:L2ProxyAdmin", + deployGasLimit: 2_400_000, + devFeatureGate: bytes32(0), + sysFeatureGate: bytes32(0), + isProxied: true + }); + // Gas profiling: 838,947 gas used → 1,258,420 recommended → 1.3M with safety margin + records_[12] = PredeployRecord({ + proxy: BASE_FEE_VAULT, + name: "BaseFeeVault", + artifactPath: "BaseFeeVault.sol:BaseFeeVault", + deployGasLimit: 1_300_000, + devFeatureGate: bytes32(0), + sysFeatureGate: bytes32(0), + isProxied: true + }); + // Gas profiling: 14,439 gas used → 21,658 recommended → 50K with safety margin + records_[13] = PredeployRecord({ + proxy: L1_FEE_VAULT, + name: "L1FeeVault", + artifactPath: "L1FeeVault.sol:L1FeeVault", + deployGasLimit: 50_000, + devFeatureGate: bytes32(0), + sysFeatureGate: bytes32(0), + isProxied: true + }); + // Gas profiling: 838,947 gas used → 1,258,420 recommended → 1.3M with safety margin + records_[14] = PredeployRecord({ + proxy: OPERATOR_FEE_VAULT, + name: "OperatorFeeVault", + artifactPath: "OperatorFeeVault.sol:OperatorFeeVault", + deployGasLimit: 1_300_000, + devFeatureGate: bytes32(0), + sysFeatureGate: bytes32(0), + isProxied: true + }); + // Gas profiling: 464,947 gas used → 697,420 recommended → 700K with safety margin + records_[15] = PredeployRecord({ + proxy: SCHEMA_REGISTRY, + name: "SchemaRegistry", + artifactPath: "SchemaRegistry.sol:SchemaRegistry", + deployGasLimit: 700_000, + devFeatureGate: bytes32(0), + sysFeatureGate: bytes32(0), + isProxied: true + }); + // Gas profiling: 3,820,943 gas used → 5,731,414 recommended → 5.8M with safety margin + records_[16] = PredeployRecord({ + proxy: EAS, + name: "EAS", + artifactPath: "EAS.sol:EAS", + deployGasLimit: 5_800_000, + devFeatureGate: bytes32(0), + sysFeatureGate: bytes32(0), + isProxied: true + }); + // Gas profiling: 1,077,380 gas used → 1,616,070 recommended → 1.7M with safety margin + records_[17] = PredeployRecord({ + proxy: FEE_SPLITTER, + name: "FeeSplitter", + artifactPath: "FeeSplitter.sol:FeeSplitter", + deployGasLimit: 1_700_000, + devFeatureGate: bytes32(0), + sysFeatureGate: bytes32(0), + isProxied: true + }); + + // ── Interop predeploys ───────────────────────────────────────────────────────────── + // Interop requires both the INTEROP sys feature and the OPTIMISM_PORTAL_INTEROP dev + // feature. Both gates mirror the full condition checked in L2Genesis. + // Gas profiling: 385,975 gas used → 578,962 recommended → 600K with safety margin + records_[18] = PredeployRecord({ + proxy: CROSS_L2_INBOX, + name: "CrossL2Inbox", + artifactPath: "CrossL2Inbox.sol:CrossL2Inbox", + deployGasLimit: 600_000, + devFeatureGate: DevFeatures.OPTIMISM_PORTAL_INTEROP, + sysFeatureGate: Features.INTEROP, + isProxied: true + }); + // Gas profiling: 965,734 gas used → 1,448,601 recommended → 1.5M with safety margin + records_[19] = PredeployRecord({ + proxy: L2_TO_L2_CROSS_DOMAIN_MESSENGER, + name: "L2ToL2CrossDomainMessenger", + artifactPath: "L2ToL2CrossDomainMessenger.sol:L2ToL2CrossDomainMessenger", + deployGasLimit: 1_500_000, + devFeatureGate: DevFeatures.OPTIMISM_PORTAL_INTEROP, + sysFeatureGate: Features.INTEROP, + isProxied: true + }); + // Gas profiling: 441,198 gas used → 661,797 recommended → 700K with safety margin + records_[20] = PredeployRecord({ + proxy: SUPERCHAIN_ETH_BRIDGE, + name: "SuperchainETHBridge", + artifactPath: "SuperchainETHBridge.sol:SuperchainETHBridge", + deployGasLimit: 700_000, + devFeatureGate: DevFeatures.OPTIMISM_PORTAL_INTEROP, + sysFeatureGate: Features.INTEROP, + isProxied: true + }); + // Gas profiling: 230,857 gas used → 346,285 recommended → 400K with safety margin + records_[21] = PredeployRecord({ + proxy: ETH_LIQUIDITY, + name: "ETHLiquidity", + artifactPath: "ETHLiquidity.sol:ETHLiquidity", + deployGasLimit: 400_000, + devFeatureGate: DevFeatures.OPTIMISM_PORTAL_INTEROP, + sysFeatureGate: Features.INTEROP, + isProxied: true + }); + + // ── CGT predeploys ───────────────────────────────────────────────────────────────── + // Gas profiling: 215,592 gas used → 323,388 recommended → 400K with safety margin + records_[22] = PredeployRecord({ + proxy: NATIVE_ASSET_LIQUIDITY, + name: "NativeAssetLiquidity", + artifactPath: "NativeAssetLiquidity.sol:NativeAssetLiquidity", + deployGasLimit: 400_000, + devFeatureGate: bytes32(0), + sysFeatureGate: Features.CUSTOM_GAS_TOKEN, + isProxied: true + }); + // Gas profiling: 914,648 gas used → 1,371,972 recommended → 1.4M with safety margin + records_[23] = PredeployRecord({ + proxy: LIQUIDITY_CONTROLLER, + name: "LiquidityController", + artifactPath: "LiquidityController.sol:LiquidityController", + deployGasLimit: 1_400_000, + devFeatureGate: bytes32(0), + sysFeatureGate: Features.CUSTOM_GAS_TOKEN, + isProxied: true + }); + + // ── L2CM predeploys ──────────────────────────────────────────────────────────────── + // Gas profiling: 339,403 gas used → 509,104 recommended → 600K with safety margin + records_[24] = PredeployRecord({ + proxy: CONDITIONAL_DEPLOYER, + name: "ConditionalDeployer", + artifactPath: "ConditionalDeployer.sol:ConditionalDeployer", + deployGasLimit: 600_000, + devFeatureGate: DevFeatures.L2CM, + sysFeatureGate: bytes32(0), + isProxied: true + }); + // Gas profiling: 167,063 gas used → 250,594 recommended → 260K with safety margin + records_[25] = PredeployRecord({ + proxy: L2_DEV_FEATURE_FLAGS, + name: "L2DevFeatureFlags", + artifactPath: "L2DevFeatureFlags.sol:L2DevFeatureFlags", + deployGasLimit: 260_000, + devFeatureGate: DevFeatures.L2CM, + sysFeatureGate: bytes32(0), + isProxied: true + }); + + // ── Non-proxied predeploys ───────────────────────────────────────────────────────── + // These are etched directly (no Proxy wrapper, no implementation slot). + // Excluded from NUT bundles and proxy setup. deployGasLimit is unused. + records_[26] = PredeployRecord({ + proxy: WETH, + name: "WETH9", + artifactPath: "WETH9.sol:WETH9", + deployGasLimit: 0, + devFeatureGate: bytes32(0), + sysFeatureGate: bytes32(0), + isProxied: false + }); + records_[27] = PredeployRecord({ + proxy: GOVERNANCE_TOKEN, + name: "GovernanceToken", + artifactPath: "GovernanceToken.sol:GovernanceToken", + deployGasLimit: 0, + devFeatureGate: bytes32(0), + sysFeatureGate: bytes32(0), + isProxied: false + }); + } + + /// @notice Asserts that the registry record for `_proxy` has the expected gate fields. + /// Reverts if no matching record is found or if the gates differ. + /// Called by L2Genesis setters to self-verify their own registry configuration, + /// catching any drift between a setter's assumed gates and the registry. + function assertGates(address _proxy, bytes32 _devGate, bytes32 _sysGate) internal pure { + PredeployRecord[] memory records = getAllRecords(); + for (uint256 i = 0; i < records.length; i++) { + if (records[i].proxy == _proxy) { + require( + records[i].devFeatureGate == _devGate && records[i].sysFeatureGate == _sysGate, + "Predeploys: gate mismatch" + ); + return; + } + } + revert("Predeploys: proxy not found"); } } diff --git a/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol b/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol index faf6ba5aba929..99dc87e3eaa76 100644 --- a/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol +++ b/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol @@ -801,9 +801,11 @@ contract L2ContractsManager_GetImplementations_Test is L2ContractsManager_Upgrad } /// @title L2ContractsManager_Upgrade_InteropFlag_Test -/// @notice Tests that interop predeploy upgrades are correctly gated behind the OPTIMISM_PORTAL_INTEROP dev feature -/// flag. +/// @notice Tests that interop predeploy upgrades are correctly gated behind both the INTEROP sys feature +/// (set on L1Block) and the OPTIMISM_PORTAL_INTEROP dev feature (must match for consistency). contract L2ContractsManager_Upgrade_InteropFlag_Test is L2ContractsManager_Upgrade_Test { + using stdStorage for StdStorage; + /// @notice The list of interop predeploy addresses. address[] internal interopPredeploys; @@ -815,10 +817,16 @@ contract L2ContractsManager_Upgrade_InteropFlag_Test is L2ContractsManager_Upgra interopPredeploys.push(Predeploys.ETH_LIQUIDITY); } - /// @notice Tests that all 4 interop predeploys are upgraded when OPTIMISM_PORTAL_INTEROP flag is enabled. + /// @notice Tests that all 4 interop predeploys are upgraded when the INTEROP sys feature is enabled + /// (which requires OPTIMISM_PORTAL_INTEROP dev feature to also be enabled for consistency). function test_upgradeUpgradesInteropPredeploys_whenInteropFlagEnabled_succeeds() public { skipIfDevFeatureDisabled(DevFeatures.OPTIMISM_PORTAL_INTEROP); + // Genesis runs without useInterop, so L1Block doesn't have the INTEROP sys feature set. + // Set it explicitly here — L2CM reads isFeatureEnabled(INTEROP) from L1Block to gate upgrades. + stdstore.target(Predeploys.L1_BLOCK_ATTRIBUTES).sig("isFeatureEnabled(bytes32)").with_key(Features.INTEROP) + .checked_write(true); + // Capture pre-upgrade implementations address[] memory preUpgradeImpls = new address[](interopPredeploys.length); for (uint256 i = 0; i < interopPredeploys.length; i++) { @@ -941,11 +949,27 @@ contract L2ContractsManager_Upgrade_Coverage_Test is L2ContractsManager_Upgrade_ return impl != address(0) && impl.code.length > 0; } - /// @notice Tests that all predeploys from Predeploys.sol receive the expected upgrade call. + /// @notice Tests that all predeploys from the registry receive the expected upgrade call. /// Uses vm.expectCall() to verify that upgradeTo or upgradeToAndCall is called. - /// @dev If L2CM misses a predeploy that exists in Predeploys.sol, this test will fail. + /// @dev If L2CM misses a predeploy that exists in PredeployRegistry, this test will fail. function test_allPredeploysReceiveUpgradeCall_succeeds() public { - address[] memory allPredeploys = Predeploys.getUpgradeablePredeploys(); + // Deduplicate proxy addresses (CGT variants share a proxy with the standard record). + Predeploys.PredeployRecord[] memory records = Predeploys.getAllRecords(); + address[] memory tmp = new address[](records.length); + uint256 count = 0; + for (uint256 i = 0; i < records.length; i++) { + if (!records[i].isProxied) continue; + + if ( + keccak256(abi.encodePacked(records[i].name)) == keccak256(abi.encodePacked("L1BlockCGT")) + || keccak256(abi.encodePacked(records[i].name)) == keccak256(abi.encodePacked("L2ToL1MessagePasserCGT")) + ) continue; + tmp[count++] = records[i].proxy; + } + address[] memory allPredeploys = new address[](count); + for (uint256 i = 0; i < count; i++) { + allPredeploys[i] = tmp[i]; + } bool interopEnabled = isDevFeatureEnabled(DevFeatures.OPTIMISM_PORTAL_INTEROP); for (uint256 i = 0; i < allPredeploys.length; i++) { diff --git a/packages/contracts-bedrock/test/L2/L2GenesisForkUpgrade.t.sol b/packages/contracts-bedrock/test/L2/L2GenesisForkUpgrade.t.sol index 81c6aeb7cbe8e..2ec6efa9dfc86 100644 --- a/packages/contracts-bedrock/test/L2/L2GenesisForkUpgrade.t.sol +++ b/packages/contracts-bedrock/test/L2/L2GenesisForkUpgrade.t.sol @@ -45,9 +45,11 @@ abstract contract L2GenesisForkUpgrade_TestInit is L2ForkUpgrade_TestInit { // Generate bundle generateScript.run(); - // Capture feature flags from deploy config (genesis state) - commonState.isInteropEnabled = - DevFeatures.isDevFeatureEnabled(deploy.cfg().devFeatureBitmap(), DevFeatures.OPTIMISM_PORTAL_INTEROP); + // Capture feature flags from deploy config (genesis state). + // Interop predeploys are upgraded only when BOTH the INTEROP sys feature (useInterop) AND + // the OPTIMISM_PORTAL_INTEROP dev feature are enabled — mirroring the L2CM gating logic. + commonState.isInteropEnabled = deploy.cfg().useInterop() + && DevFeatures.isDevFeatureEnabled(deploy.cfg().devFeatureBitmap(), DevFeatures.OPTIMISM_PORTAL_INTEROP); console.log("L2GenesisForkUpgrade isInteropEnabled", commonState.isInteropEnabled); commonState.isCustomGasToken = deploy.cfg().useCustomGasToken(); diff --git a/packages/contracts-bedrock/test/L2/fork/L2ForkUpgrade.t.sol b/packages/contracts-bedrock/test/L2/fork/L2ForkUpgrade.t.sol index 1a8c98204ce52..ee79216c82074 100644 --- a/packages/contracts-bedrock/test/L2/fork/L2ForkUpgrade.t.sol +++ b/packages/contracts-bedrock/test/L2/fork/L2ForkUpgrade.t.sol @@ -51,6 +51,12 @@ contract L2ForkUpgrade_TestInit is CommonTest { bool isCustomGasToken; } + /// @notice Struct to capture predeploy state for comparison. + struct PredeployState { + address predeploy; + string version; + } + function setUp() public virtual override { super.setUp(); @@ -119,17 +125,44 @@ contract L2ForkUpgrade_TestInit is CommonTest { expectedImpl_ = generateScript.findImplByName(_name); } } + + /// @notice Returns the active proxied predeploys with their pre-upgrade versions. + /// @dev Deduplicates proxies (CGT variants share one proxy), skips non-proxied predeploys, + /// and skips feature-gated predeploys that are disabled for the current chain config. + /// Disabled predeploys must be excluded before calling _getVersion: their proxy has an + /// implementation slot pointing to a code namespace with no code, so the delegatecall + /// returns empty bytes and Solidity's ABI decoder for `string` fails outside try/catch. + function _getPreUpgradePredeploys() internal view returns (PredeployState[] memory predeploys_) { + Predeploys.PredeployRecord[] memory records = Predeploys.getAllRecords(); + address[] memory tmp = new address[](records.length); + uint256 count = 0; + + for (uint256 i = 0; i < records.length; i++) { + if (!records[i].isProxied) continue; + if (_isFeaturePredeployAndDisabled(records[i].proxy)) continue; + tmp[count++] = records[i].proxy; + } + + predeploys_ = new PredeployState[](count); + for (uint256 i = 0; i < count; i++) { + predeploys_[i].predeploy = tmp[i]; + predeploys_[i].version = _getVersion(tmp[i]); + } + } + + /// @notice Helper to get version string from a contract. Returns "0.0.0" if not available. + function _getVersion(address _contract) internal view returns (string memory) { + try ISemver(_contract).version() returns (string memory ver_) { + return ver_; + } catch { + return "0.0.0"; + } + } } /// @title L2ForkUpgrade_Versions_Test /// @notice Tests that all predeploy versions are updated after the L2 fork upgrade. contract L2ForkUpgrade_Versions_Test is L2ForkUpgrade_TestInit { - /// @notice Struct to capture predeploy state for comparison. - struct PredeployState { - address predeploy; - string version; - } - /// @notice Struct to capture pre-upgrade version state for comparison. struct PreUpgradeVersionState { // Predeploy versions @@ -157,16 +190,6 @@ contract L2ForkUpgrade_Versions_Test is L2ForkUpgrade_TestInit { function _verifyAllVersionsUpdated(PreUpgradeVersionState memory _preState) internal view { uint256 length = _preState.preUpgradePredeploys.length; for (uint256 i = 0; i < length; i++) { - if (_isFeaturePredeployAndDisabled(_preState.preUpgradePredeploys[i].predeploy)) { - console.log( - "Skipping feature predeploy and disabled: ", - Predeploys.getName(_preState.preUpgradePredeploys[i].predeploy) - ); - console.log("isCustomGasToken: ", commonState.isCustomGasToken); - console.log("isInteropEnabled: ", commonState.isInteropEnabled); - continue; - } - string memory newVersion = _getVersion(_preState.preUpgradePredeploys[i].predeploy); string memory oldVersion = _preState.preUpgradePredeploys[i].version; assertTrue( @@ -182,24 +205,6 @@ contract L2ForkUpgrade_Versions_Test is L2ForkUpgrade_TestInit { ); } } - - /// @notice Helper to get pre-upgrade predeploy state. - function _getPreUpgradePredeploys() internal view returns (PredeployState[] memory predeploys_) { - predeploys_ = new PredeployState[](Predeploys.getUpgradeablePredeploys().length); - for (uint256 i = 0; i < Predeploys.getUpgradeablePredeploys().length; i++) { - predeploys_[i].predeploy = Predeploys.getUpgradeablePredeploys()[i]; - predeploys_[i].version = _getVersion(Predeploys.getUpgradeablePredeploys()[i]); - } - } - - /// @notice Helper to get version string from a contract. Returns "0.0.0" if not available. - function _getVersion(address _contract) internal view returns (string memory) { - try ISemver(_contract).version() returns (string memory ver_) { - return ver_; - } catch { - return "0.0.0"; - } - } } /// @title L2ForkUpgrade_Initialization_Test @@ -588,16 +593,12 @@ contract L2ForkUpgrade_Implementations_Test is L2ForkUpgrade_TestInit { // Execute upgrade executeScript.execute(); - // Get all upgradeable predeploys - address[] memory predeploys = Predeploys.getUpgradeablePredeploys(); + // Get active predeploys (non-proxied and disabled feature predeploys already filtered out) + PredeployState[] memory predeploys = _getPreUpgradePredeploys(); // Verify each predeploy's implementation for (uint256 i = 0; i < predeploys.length; i++) { - address predeploy = predeploys[i]; - - if (_isFeaturePredeployAndDisabled(predeploy)) { - continue; - } + address predeploy = predeploys[i].predeploy; // Get predeploy name string memory name = Predeploys.getName(predeploy); @@ -646,16 +647,12 @@ contract L2ForkUpgrade_Events_Test is L2ForkUpgrade_TestInit { // Get all recorded logs Vm.Log[] memory logs = vm.getRecordedLogs(); - // Get all upgradeable predeploys - address[] memory predeploys = Predeploys.getUpgradeablePredeploys(); + // Get active predeploys (non-proxied and disabled feature predeploys already filtered out) + PredeployState[] memory predeploys = _getPreUpgradePredeploys(); // Verify each predeploy emitted the Upgraded event for (uint256 i = 0; i < predeploys.length; i++) { - address predeploy = predeploys[i]; - - if (_isFeaturePredeployAndDisabled(predeploy)) { - continue; - } + address predeploy = predeploys[i].predeploy; // Get predeploy name string memory name = Predeploys.getName(predeploy); diff --git a/packages/contracts-bedrock/test/libraries/Predeploys.t.sol b/packages/contracts-bedrock/test/libraries/Predeploys.t.sol index a98b0da83b7a2..258d6003fc007 100644 --- a/packages/contracts-bedrock/test/libraries/Predeploys.t.sol +++ b/packages/contracts-bedrock/test/libraries/Predeploys.t.sol @@ -57,15 +57,35 @@ abstract contract Predeploys_TestInit is CommonTest { || _addr == Predeploys.GOVERNANCE_TOKEN; } + /// @notice Returns true if the record's feature gates are satisfied for the given fork/flags. + function _isRecordActive( + Predeploys.PredeployRecord memory _r, + Fork _fork, + bool _isCustomGasToken, + bool _isInterop + ) + internal + view + returns (bool) + { + if (_r.devFeatureGate != bytes32(0) && !DevFeatures.isDevFeatureEnabled(devFeatureBitmap, _r.devFeatureGate)) { + return false; + } + if (_r.sysFeatureGate == Features.INTEROP) { + return _isInterop && uint256(_fork) >= uint256(Fork.INTEROP); + } + if (_r.sysFeatureGate == Features.CUSTOM_GAS_TOKEN) return _isCustomGasToken; + return true; + } + /// @notice Internal test function for predeploys validation across different forks. function _test_predeploys(Fork _fork, bool _isCustomGasToken, bool _isInterop) internal { - uint256 count = 2048; - uint160 prefix = uint160(0x420) << 148; - bytes memory proxyCode = vm.getDeployedCode("Proxy.sol:Proxy"); + Predeploys.PredeployRecord[] memory records = Predeploys.getAllRecords(); + uint256 count = records.length; for (uint256 i = 0; i < count; i++) { - address addr = address(prefix | uint160(i)); + address addr = records[i].proxy; address implAddr = Predeploys.predeployToCodeNamespace(addr); if (_isOmitted(addr)) { @@ -73,8 +93,11 @@ abstract contract Predeploys_TestInit is CommonTest { continue; } - bool isPredeploy = - Predeploys.isSupportedPredeploy(addr, uint256(_fork), _isCustomGasToken, _isInterop, devFeatureBitmap); + if (!records[i].isProxied) { + continue; + } + + bool isPredeploy = _isRecordActive(records[i], _fork, _isCustomGasToken, _isInterop); bytes memory code = addr.code; if (isPredeploy) assertTrue(code.length > 0); diff --git a/packages/contracts-bedrock/test/scripts/GenerateNUTBundle.t.sol b/packages/contracts-bedrock/test/scripts/GenerateNUTBundle.t.sol index 3ba3608a0b8eb..dba6b8e482847 100644 --- a/packages/contracts-bedrock/test/scripts/GenerateNUTBundle.t.sol +++ b/packages/contracts-bedrock/test/scripts/GenerateNUTBundle.t.sol @@ -6,6 +6,7 @@ import { Test } from "test/setup/Test.sol"; // Scripts import { GenerateNUTBundle } from "scripts/upgrade/GenerateNUTBundle.s.sol"; +import { Predeploys } from "src/libraries/Predeploys.sol"; // Libraries import { NetworkUpgradeTxns } from "src/libraries/NetworkUpgradeTxns.sol"; @@ -128,21 +129,38 @@ contract GenerateNUTBundleTest is Test { } } - /// @notice Tests that the number of implementations in the deployment list matches the number of fields in the - /// Implementations struct. + /// @notice Tests that the implementation deployment list length matches the Implementations struct field count. + /// @dev The deployment list is: 1 StorageSetter + all registry records. + /// The Implementations struct has one field per record plus StorageSetter. + /// If these diverge, a new predeploy was added to one location but not the other. function test_implementationCount_matchesStructFields_succeeds() public { L2ContractsManagerTypes.Implementations memory emptyImpl; uint256 structFieldCount = abi.encode(emptyImpl).length / 32; - // Build implementation deployment configurations script._buildImplementationDeploymentConfigs(); - // Verify that the number of implementations in the deployment list matches the number of fields in the - // Implementations struct assertEq( script.implementationConfigs().length, structFieldCount, - "Deployment list must equal Implementations struct field count" + "Config count (registry records + StorageSetter) must equal Implementations struct field count" + ); + } + + /// @notice Tests that the registry record count matches the implementation config count. + /// @dev registry records + 1 StorageSetter = total implementation configs. + function test_registryRecordCount_matchesImplementationConfigs_succeeds() public { + script._buildImplementationDeploymentConfigs(); + // Only proxied records appear in the bundle; non-proxied (WETH, GovernanceToken) are skipped. + Predeploys.PredeployRecord[] memory records = Predeploys.getAllRecords(); + uint256 proxiedCount = 0; + for (uint256 i = 0; i < records.length; i++) { + if (records[i].isProxied) proxiedCount++; + } + // StorageSetter is always prepended as the first entry. + assertEq( + script.implementationConfigs().length, + proxiedCount + 1, + "Implementation configs must be proxied registry records + 1 StorageSetter" ); } } diff --git a/packages/contracts-bedrock/test/scripts/L2Genesis.t.sol b/packages/contracts-bedrock/test/scripts/L2Genesis.t.sol index b01aca6fd63fe..2f2ded425b849 100644 --- a/packages/contracts-bedrock/test/scripts/L2Genesis.t.sol +++ b/packages/contracts-bedrock/test/scripts/L2Genesis.t.sol @@ -56,37 +56,26 @@ abstract contract L2Genesis_TestInit is Test { } function testPredeploys() internal view { - uint160 prefix = uint160(0x420) << 148; + Predeploys.PredeployRecord[] memory records = Predeploys.getAllRecords(); - for (uint256 i = 0; i < Predeploys.PREDEPLOY_COUNT; i++) { - address addr = address(prefix | uint160(i)); - // If it's not proxied, skip next checks. - if (Predeploys.notProxied(addr)) { - continue; - } + for (uint256 i = 0; i < records.length; i++) { + if ( + keccak256(abi.encodePacked(records[i].name)) == keccak256(abi.encodePacked("L1BlockCGT")) + || keccak256(abi.encodePacked(records[i].name)) == keccak256(abi.encodePacked("L2ToL1MessagePasserCGT")) + ) continue; - // All predeploys should have code - assertGt(addr.code.length, 0); - // All proxied predeploys should have the 1967 admin slot set to the ProxyAdmin - assertEq(Predeploys.PROXY_ADMIN, EIP1967Helper.getAdmin(addr)); + address addr = records[i].proxy; + assertGt(addr.code.length, 0, string.concat("Predeploy has no code: ", records[i].name)); - // If it's not a supported predeploy, skip next checks. - if ( - !Predeploys.isSupportedPredeploy( - addr, uint256(LATEST_FORK), input.useCustomGasToken, input.useInterop, input.devFeatureBitmap - ) - ) { - continue; - } - - // All proxied predeploys should have the 1967 admin slot set to the ProxyAdmin - // predeploy - address impl = Predeploys.predeployToCodeNamespace(addr); - assertGt(impl.code.length, 0); - } + if (!records[i].isProxied) continue; - assertGt(Predeploys.WETH.code.length, 0); - assertGt(Predeploys.GOVERNANCE_TOKEN.code.length, 0); + // Proxied predeploys must have proxy admin set. + assertEq( + Predeploys.PROXY_ADMIN, + EIP1967Helper.getAdmin(addr), + string.concat("Proxy admin mismatch: ", records[i].name) + ); + } } function testVaultsWithoutRevenueShare() internal view { diff --git a/packages/contracts-bedrock/test/setup/Setup.sol b/packages/contracts-bedrock/test/setup/Setup.sol index 0882193995ac6..df536b5e43d8a 100644 --- a/packages/contracts-bedrock/test/setup/Setup.sol +++ b/packages/contracts-bedrock/test/setup/Setup.sol @@ -512,34 +512,22 @@ abstract contract Setup is FeatureFlags { vm.label(_addr, Preinstalls.getName(_addr)); } + /// @notice Labels all predeploys with their name. + /// @dev Iterates over all predeploy records and labels the proxy with the name. function _labelPredeploys() internal { - labelPredeploy(Predeploys.L2_STANDARD_BRIDGE); - labelPredeploy(Predeploys.L2_CROSS_DOMAIN_MESSENGER); - labelPredeploy(Predeploys.L2_TO_L1_MESSAGE_PASSER); - labelPredeploy(Predeploys.SEQUENCER_FEE_WALLET); - labelPredeploy(Predeploys.L2_ERC721_BRIDGE); - labelPredeploy(Predeploys.OPTIMISM_MINTABLE_ERC721_FACTORY); - labelPredeploy(Predeploys.PROXY_ADMIN); - labelPredeploy(Predeploys.BASE_FEE_VAULT); - labelPredeploy(Predeploys.L1_FEE_VAULT); - labelPredeploy(Predeploys.OPERATOR_FEE_VAULT); - labelPredeploy(Predeploys.L1_BLOCK_ATTRIBUTES); - labelPredeploy(Predeploys.GAS_PRICE_ORACLE); - labelPredeploy(Predeploys.LEGACY_MESSAGE_PASSER); - labelPredeploy(Predeploys.GOVERNANCE_TOKEN); - labelPredeploy(Predeploys.EAS); - labelPredeploy(Predeploys.SCHEMA_REGISTRY); - labelPredeploy(Predeploys.WETH); - labelPredeploy(Predeploys.SUPERCHAIN_ETH_BRIDGE); - labelPredeploy(Predeploys.ETH_LIQUIDITY); - labelPredeploy(Predeploys.OPTIMISM_SUPERCHAIN_ERC20_FACTORY); - labelPredeploy(Predeploys.OPTIMISM_SUPERCHAIN_ERC20_BEACON); - labelPredeploy(Predeploys.SUPERCHAIN_TOKEN_BRIDGE); - labelPredeploy(Predeploys.NATIVE_ASSET_LIQUIDITY); - labelPredeploy(Predeploys.LIQUIDITY_CONTROLLER); - labelPredeploy(Predeploys.FEE_SPLITTER); - labelPredeploy(Predeploys.CONDITIONAL_DEPLOYER); - labelPredeploy(Predeploys.L2_DEV_FEATURE_FLAGS); + Predeploys.PredeployRecord[] memory records = Predeploys.getAllRecords(); + for (uint256 i = 0; i < records.length; i++) { + // Default to normal for CGT variants + if (records[i].proxy == Predeploys.L1_BLOCK_NUMBER) { + vm.label(records[i].proxy, "L1Block"); + continue; + } + if (records[i].proxy == Predeploys.L2_TO_L1_MESSAGE_PASSER) { + vm.label(records[i].proxy, "L2ToL1MessagePasser"); + continue; + } + vm.label(records[i].proxy, records[i].name); + } } function _labelPreinstalls() internal { From 7cadd7e8bebbb0946005455672ce7ed79149a45d Mon Sep 17 00:00:00 2001 From: niha <205694301+0xniha@users.noreply.github.com> Date: Wed, 1 Apr 2026 10:57:06 -0300 Subject: [PATCH 03/15] fix: include deprecated predeploys deployments --- .../contracts-bedrock/scripts/L2Genesis.s.sol | 11 +- .../scripts/upgrade/GenerateNUTBundle.s.sol | 3 +- .../src/libraries/Predeploys.sol | 126 ++++++++++++++---- .../test/L2/L2ContractsManager.t.sol | 1 + .../test/L2/fork/L2ForkUpgrade.t.sol | 1 + .../test/libraries/Predeploys.t.sol | 3 + .../test/scripts/GenerateNUTBundle.t.sol | 4 +- .../test/scripts/L2Genesis.t.sol | 3 + .../contracts-bedrock/test/setup/Setup.sol | 3 + 9 files changed, 119 insertions(+), 36 deletions(-) diff --git a/packages/contracts-bedrock/scripts/L2Genesis.s.sol b/packages/contracts-bedrock/scripts/L2Genesis.s.sol index 4da7c3f2badeb..ad9015ca5bf9d 100644 --- a/packages/contracts-bedrock/scripts/L2Genesis.s.sol +++ b/packages/contracts-bedrock/scripts/L2Genesis.s.sol @@ -227,9 +227,12 @@ contract L2Genesis is Script { Predeploys.PredeployRecord[] memory records = Predeploys.getAllRecords(); for (uint256 i = 0; i < records.length; i++) { - // Non-proxied predeploys (WETH, GovernanceToken) are etched directly elsewhere. + // Non-proxied predeploys are excluded from proxy setup. if (!records[i].isProxied) continue; + // TODO: Remove tnhis once the deprecated predeploys are removed. + // if (records[i].isDeprecated) continue; + // Skip duplicates — CGT variant records share a proxy with their standard counterpart. if ( keccak256(abi.encodePacked(records[i].name)) == keccak256(abi.encodePacked("L1BlockCGT")) @@ -256,9 +259,9 @@ contract L2Genesis is Script { // Must be first: other contracts' initialize() calls assert _assertOnlyProxyAdminOrProxyAdminOwner(), // which reads L2ProxyAdmin.owner(). The owner slot must be set before any initializer runs. setL2ProxyAdmin(_input); // 18 - // setLegacyMessagePasser(); // 0: LEGACY_MESSAGE_PASSER is deprecated and not used in OP-Stack + setLegacyMessagePasser(); // 0: LEGACY_MESSAGE_PASSER is deprecated and not used in OP-Stack // 01: legacy, not used in OP-Stack - // setDeployerWhitelist(); // 2: DEPLOYER_WHITELIST is deprecated and not used in OP-Stack + setDeployerWhitelist(); // 2: DEPLOYER_WHITELIST is deprecated and not used in OP-Stack // 3,4,5: legacy, not used in OP-Stack. setWETH(); // 6: WETH (not behind a proxy) setL2CrossDomainMessenger(_input.l1CrossDomainMessengerProxy); // 7 @@ -267,7 +270,7 @@ contract L2Genesis is Script { setL2StandardBridge(_input.l1StandardBridgeProxy); // 10 setSequencerFeeVault(_input); // 11 setOptimismMintableERC20Factory(); // 12 - // setL1BlockNumber(); // 13: L1_BLOCK_NUMBER is deprecated and not used in OP-Stack + setL1BlockNumber(); // 13: L1_BLOCK_NUMBER is deprecated and not used in OP-Stack setL2ERC721Bridge(_input.l1ERC721BridgeProxy); // 14 setL1Block(_input); // 15 setL2ToL1MessagePasser(_input.useCustomGasToken); // 16 diff --git a/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol b/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol index 2697cfce7edf0..7f8c9dd09fe37 100644 --- a/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol +++ b/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol @@ -390,8 +390,9 @@ contract GenerateNUTBundle is Script { Predeploys.PredeployRecord[] memory records = Predeploys.getAllRecords(); for (uint256 i = 0; i < records.length; i++) { - // Non-proxied predeploys (WETH, GovernanceToken) are not deployed via NUT bundles. + // Non-proxied and deprecated predeploys are not deployed via NUT bundles. if (!records[i].isProxied) continue; + if (records[i].isDeprecated) continue; _implementationConfigs.push( _makeConfig(records[i].name, records[i].artifactPath, records[i].deployGasLimit) ); diff --git a/packages/contracts-bedrock/src/libraries/Predeploys.sol b/packages/contracts-bedrock/src/libraries/Predeploys.sol index ee58c1d74f6cb..8d7d05fc3b62f 100644 --- a/packages/contracts-bedrock/src/libraries/Predeploys.sol +++ b/packages/contracts-bedrock/src/libraries/Predeploys.sol @@ -142,6 +142,9 @@ library Predeploys { /// @param isProxied True if the predeploy uses a Proxy. Non-proxied predeploys /// (WETH, GovernanceToken) are etched directly without proxy or /// implementation slot setup, and are excluded from NUT bundles. + /// @param isDeprecated True if the predeploy is deprecated. Deprecated predeploys are + /// present on-chain for backwards compatibility but are excluded from + /// proxy setup loops, NUT bundles, and upgrade checks. struct PredeployRecord { address proxy; string name; @@ -150,6 +153,7 @@ library Predeploys { bytes32 devFeatureGate; bytes32 sysFeatureGate; bool isProxied; + bool isDeprecated; } /// @notice Returns the name of the predeploy at the given address. @@ -206,8 +210,10 @@ library Predeploys { /// Records are ordered to match the L2ContractsManagerTypes.Implementations struct field order. /// Non-proxied records (isProxied = false) are appended at the end and must be skipped /// by consumers that operate on proxy/implementation slots (NUT bundle, setPredeployProxies). + /// Deprecated records (isDeprecated = true) are appended after non-proxied records and must + /// be skipped by consumers that perform proxy setup, NUT bundles, or upgrade checks. function getAllRecords() internal pure returns (PredeployRecord[] memory records_) { - records_ = new PredeployRecord[](28); + records_ = new PredeployRecord[](31); // ── Core predeploys ──────────────────────────────────────────────────────────────── // Gas profiling: 1,708,099 gas used → 2,562,148 recommended → 2.6M with safety margin @@ -218,7 +224,8 @@ library Predeploys { deployGasLimit: 2_600_000, devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), - isProxied: true + isProxied: true, + isDeprecated: false }); // Gas profiling: 1,681,024 gas used → 2,521,536 recommended → 2.6M with safety margin records_[1] = PredeployRecord({ @@ -228,7 +235,8 @@ library Predeploys { deployGasLimit: 2_600_000, devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), - isProxied: true + isProxied: true, + isDeprecated: false }); // Gas profiling: 2,358,092 gas used → 3,537,138 recommended → 3.6M with safety margin records_[2] = PredeployRecord({ @@ -238,7 +246,8 @@ library Predeploys { deployGasLimit: 3_600_000, devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), - isProxied: true + isProxied: true, + isDeprecated: false }); // Gas profiling: 841,152 gas used → 1,261,728 recommended → 1.3M with safety margin records_[3] = PredeployRecord({ @@ -248,7 +257,8 @@ library Predeploys { deployGasLimit: 1_300_000, devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), - isProxied: true + isProxied: true, + isDeprecated: false }); // Gas profiling: 2,347,504 gas used → 3,521,256 recommended → 3.6M with safety margin records_[4] = PredeployRecord({ @@ -258,7 +268,8 @@ library Predeploys { deployGasLimit: 3_600_000, devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), - isProxied: true + isProxied: true, + isDeprecated: false }); // Gas profiling: 1,242,108 gas used → 1,863,162 recommended → 1.9M with safety margin records_[5] = PredeployRecord({ @@ -268,7 +279,8 @@ library Predeploys { deployGasLimit: 1_900_000, devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), - isProxied: true + isProxied: true, + isDeprecated: false }); // Gas profiling: 707,557 gas used → 1,061,335 recommended → 1.1M with safety margin // Standard variant — used on non-CGT chains. CGT variant follows immediately after. @@ -279,7 +291,8 @@ library Predeploys { deployGasLimit: 1_100_000, devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), - isProxied: true + isProxied: true, + isDeprecated: false }); // Gas profiling: 710,257 gas used → 1,065,385 recommended → 1.1M with safety margin // CGT variant — used on custom gas token chains. Same proxy as L1Block. @@ -290,7 +303,8 @@ library Predeploys { deployGasLimit: 1_100_000, devFeatureGate: bytes32(0), sysFeatureGate: Features.CUSTOM_GAS_TOKEN, - isProxied: true + isProxied: true, + isDeprecated: false }); // Gas profiling: 400,911 gas used → 601,366 recommended → 650K with safety margin // Standard variant — used on non-CGT chains. CGT variant follows immediately after. @@ -301,7 +315,8 @@ library Predeploys { deployGasLimit: 650_000, devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), - isProxied: true + isProxied: true, + isDeprecated: false }); // Gas profiling: 484,560 gas used → 726,840 recommended → 750K with safety margin // CGT variant — used on custom gas token chains. Same proxy as L2ToL1MessagePasser. @@ -312,7 +327,8 @@ library Predeploys { deployGasLimit: 750_000, devFeatureGate: bytes32(0), sysFeatureGate: Features.CUSTOM_GAS_TOKEN, - isProxied: true + isProxied: true, + isDeprecated: false }); // Gas profiling: 3,248,395 gas used → 4,872,592 recommended → 4.9M with safety margin records_[10] = PredeployRecord({ @@ -322,7 +338,8 @@ library Predeploys { deployGasLimit: 4_900_000, devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), - isProxied: true + isProxied: true, + isDeprecated: false }); // Gas profiling: 1,538,265 gas used → 2,307,397 recommended → 2.4M with safety margin records_[11] = PredeployRecord({ @@ -332,7 +349,8 @@ library Predeploys { deployGasLimit: 2_400_000, devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), - isProxied: true + isProxied: true, + isDeprecated: false }); // Gas profiling: 838,947 gas used → 1,258,420 recommended → 1.3M with safety margin records_[12] = PredeployRecord({ @@ -342,7 +360,8 @@ library Predeploys { deployGasLimit: 1_300_000, devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), - isProxied: true + isProxied: true, + isDeprecated: false }); // Gas profiling: 14,439 gas used → 21,658 recommended → 50K with safety margin records_[13] = PredeployRecord({ @@ -352,7 +371,8 @@ library Predeploys { deployGasLimit: 50_000, devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), - isProxied: true + isProxied: true, + isDeprecated: false }); // Gas profiling: 838,947 gas used → 1,258,420 recommended → 1.3M with safety margin records_[14] = PredeployRecord({ @@ -362,7 +382,8 @@ library Predeploys { deployGasLimit: 1_300_000, devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), - isProxied: true + isProxied: true, + isDeprecated: false }); // Gas profiling: 464,947 gas used → 697,420 recommended → 700K with safety margin records_[15] = PredeployRecord({ @@ -372,7 +393,8 @@ library Predeploys { deployGasLimit: 700_000, devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), - isProxied: true + isProxied: true, + isDeprecated: false }); // Gas profiling: 3,820,943 gas used → 5,731,414 recommended → 5.8M with safety margin records_[16] = PredeployRecord({ @@ -382,7 +404,8 @@ library Predeploys { deployGasLimit: 5_800_000, devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), - isProxied: true + isProxied: true, + isDeprecated: false }); // Gas profiling: 1,077,380 gas used → 1,616,070 recommended → 1.7M with safety margin records_[17] = PredeployRecord({ @@ -392,7 +415,8 @@ library Predeploys { deployGasLimit: 1_700_000, devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), - isProxied: true + isProxied: true, + isDeprecated: false }); // ── Interop predeploys ───────────────────────────────────────────────────────────── @@ -406,7 +430,8 @@ library Predeploys { deployGasLimit: 600_000, devFeatureGate: DevFeatures.OPTIMISM_PORTAL_INTEROP, sysFeatureGate: Features.INTEROP, - isProxied: true + isProxied: true, + isDeprecated: false }); // Gas profiling: 965,734 gas used → 1,448,601 recommended → 1.5M with safety margin records_[19] = PredeployRecord({ @@ -416,7 +441,8 @@ library Predeploys { deployGasLimit: 1_500_000, devFeatureGate: DevFeatures.OPTIMISM_PORTAL_INTEROP, sysFeatureGate: Features.INTEROP, - isProxied: true + isProxied: true, + isDeprecated: false }); // Gas profiling: 441,198 gas used → 661,797 recommended → 700K with safety margin records_[20] = PredeployRecord({ @@ -426,7 +452,8 @@ library Predeploys { deployGasLimit: 700_000, devFeatureGate: DevFeatures.OPTIMISM_PORTAL_INTEROP, sysFeatureGate: Features.INTEROP, - isProxied: true + isProxied: true, + isDeprecated: false }); // Gas profiling: 230,857 gas used → 346,285 recommended → 400K with safety margin records_[21] = PredeployRecord({ @@ -436,7 +463,8 @@ library Predeploys { deployGasLimit: 400_000, devFeatureGate: DevFeatures.OPTIMISM_PORTAL_INTEROP, sysFeatureGate: Features.INTEROP, - isProxied: true + isProxied: true, + isDeprecated: false }); // ── CGT predeploys ───────────────────────────────────────────────────────────────── @@ -448,7 +476,8 @@ library Predeploys { deployGasLimit: 400_000, devFeatureGate: bytes32(0), sysFeatureGate: Features.CUSTOM_GAS_TOKEN, - isProxied: true + isProxied: true, + isDeprecated: false }); // Gas profiling: 914,648 gas used → 1,371,972 recommended → 1.4M with safety margin records_[23] = PredeployRecord({ @@ -458,7 +487,8 @@ library Predeploys { deployGasLimit: 1_400_000, devFeatureGate: bytes32(0), sysFeatureGate: Features.CUSTOM_GAS_TOKEN, - isProxied: true + isProxied: true, + isDeprecated: false }); // ── L2CM predeploys ──────────────────────────────────────────────────────────────── @@ -470,7 +500,8 @@ library Predeploys { deployGasLimit: 600_000, devFeatureGate: DevFeatures.L2CM, sysFeatureGate: bytes32(0), - isProxied: true + isProxied: true, + isDeprecated: false }); // Gas profiling: 167,063 gas used → 250,594 recommended → 260K with safety margin records_[25] = PredeployRecord({ @@ -480,7 +511,8 @@ library Predeploys { deployGasLimit: 260_000, devFeatureGate: DevFeatures.L2CM, sysFeatureGate: bytes32(0), - isProxied: true + isProxied: true, + isDeprecated: false }); // ── Non-proxied predeploys ───────────────────────────────────────────────────────── @@ -493,7 +525,8 @@ library Predeploys { deployGasLimit: 0, devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), - isProxied: false + isProxied: false, + isDeprecated: false }); records_[27] = PredeployRecord({ proxy: GOVERNANCE_TOKEN, @@ -502,7 +535,42 @@ library Predeploys { deployGasLimit: 0, devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), - isProxied: false + isProxied: false, + isDeprecated: false + }); + + // ── Deprecated predeploys ────────────────────────────────────────────────────────── + // Present on-chain for backwards compatibility but excluded from proxy setup loops, + // NUT bundles, and upgrade checks. Handled by individual setters in L2Genesis. + records_[28] = PredeployRecord({ + proxy: LEGACY_MESSAGE_PASSER, + name: "LegacyMessagePasser", + artifactPath: "LegacyMessagePasser.sol:LegacyMessagePasser", + deployGasLimit: 0, + devFeatureGate: bytes32(0), + sysFeatureGate: bytes32(0), + isProxied: true, + isDeprecated: true + }); + records_[29] = PredeployRecord({ + proxy: DEPLOYER_WHITELIST, + name: "DeployerWhitelist", + artifactPath: "DeployerWhitelist.sol:DeployerWhitelist", + deployGasLimit: 0, + devFeatureGate: bytes32(0), + sysFeatureGate: bytes32(0), + isProxied: true, + isDeprecated: true + }); + records_[30] = PredeployRecord({ + proxy: L1_BLOCK_NUMBER, + name: "L1BlockNumber", + artifactPath: "L1BlockNumber.sol:L1BlockNumber", + deployGasLimit: 0, + devFeatureGate: bytes32(0), + sysFeatureGate: bytes32(0), + isProxied: true, + isDeprecated: true }); } diff --git a/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol b/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol index 99dc87e3eaa76..2736d059a9d86 100644 --- a/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol +++ b/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol @@ -959,6 +959,7 @@ contract L2ContractsManager_Upgrade_Coverage_Test is L2ContractsManager_Upgrade_ uint256 count = 0; for (uint256 i = 0; i < records.length; i++) { if (!records[i].isProxied) continue; + if (records[i].isDeprecated) continue; if ( keccak256(abi.encodePacked(records[i].name)) == keccak256(abi.encodePacked("L1BlockCGT")) diff --git a/packages/contracts-bedrock/test/L2/fork/L2ForkUpgrade.t.sol b/packages/contracts-bedrock/test/L2/fork/L2ForkUpgrade.t.sol index ee79216c82074..d5c460b3d3c13 100644 --- a/packages/contracts-bedrock/test/L2/fork/L2ForkUpgrade.t.sol +++ b/packages/contracts-bedrock/test/L2/fork/L2ForkUpgrade.t.sol @@ -139,6 +139,7 @@ contract L2ForkUpgrade_TestInit is CommonTest { for (uint256 i = 0; i < records.length; i++) { if (!records[i].isProxied) continue; + if (records[i].isDeprecated) continue; if (_isFeaturePredeployAndDisabled(records[i].proxy)) continue; tmp[count++] = records[i].proxy; } diff --git a/packages/contracts-bedrock/test/libraries/Predeploys.t.sol b/packages/contracts-bedrock/test/libraries/Predeploys.t.sol index 258d6003fc007..4704307d637d0 100644 --- a/packages/contracts-bedrock/test/libraries/Predeploys.t.sol +++ b/packages/contracts-bedrock/test/libraries/Predeploys.t.sol @@ -85,6 +85,9 @@ abstract contract Predeploys_TestInit is CommonTest { uint256 count = records.length; for (uint256 i = 0; i < count; i++) { + // TODO: Remove this once the deprecated predeploys are removed. + // if (records[i].isDeprecated) continue; + address addr = records[i].proxy; address implAddr = Predeploys.predeployToCodeNamespace(addr); diff --git a/packages/contracts-bedrock/test/scripts/GenerateNUTBundle.t.sol b/packages/contracts-bedrock/test/scripts/GenerateNUTBundle.t.sol index dba6b8e482847..3283debe6abec 100644 --- a/packages/contracts-bedrock/test/scripts/GenerateNUTBundle.t.sol +++ b/packages/contracts-bedrock/test/scripts/GenerateNUTBundle.t.sol @@ -150,11 +150,11 @@ contract GenerateNUTBundleTest is Test { /// @dev registry records + 1 StorageSetter = total implementation configs. function test_registryRecordCount_matchesImplementationConfigs_succeeds() public { script._buildImplementationDeploymentConfigs(); - // Only proxied records appear in the bundle; non-proxied (WETH, GovernanceToken) are skipped. + // Only proxied non-deprecated records appear in the bundle. Predeploys.PredeployRecord[] memory records = Predeploys.getAllRecords(); uint256 proxiedCount = 0; for (uint256 i = 0; i < records.length; i++) { - if (records[i].isProxied) proxiedCount++; + if (records[i].isProxied && !records[i].isDeprecated) proxiedCount++; } // StorageSetter is always prepended as the first entry. assertEq( diff --git a/packages/contracts-bedrock/test/scripts/L2Genesis.t.sol b/packages/contracts-bedrock/test/scripts/L2Genesis.t.sol index 2f2ded425b849..f8f2aab2f2912 100644 --- a/packages/contracts-bedrock/test/scripts/L2Genesis.t.sol +++ b/packages/contracts-bedrock/test/scripts/L2Genesis.t.sol @@ -59,6 +59,9 @@ abstract contract L2Genesis_TestInit is Test { Predeploys.PredeployRecord[] memory records = Predeploys.getAllRecords(); for (uint256 i = 0; i < records.length; i++) { + // TODO: Remove this once the deprecated predeploys are removed. + // if (records[i].isDeprecated) continue; + if ( keccak256(abi.encodePacked(records[i].name)) == keccak256(abi.encodePacked("L1BlockCGT")) || keccak256(abi.encodePacked(records[i].name)) == keccak256(abi.encodePacked("L2ToL1MessagePasserCGT")) diff --git a/packages/contracts-bedrock/test/setup/Setup.sol b/packages/contracts-bedrock/test/setup/Setup.sol index df536b5e43d8a..32224cd49eaac 100644 --- a/packages/contracts-bedrock/test/setup/Setup.sol +++ b/packages/contracts-bedrock/test/setup/Setup.sol @@ -517,6 +517,9 @@ abstract contract Setup is FeatureFlags { function _labelPredeploys() internal { Predeploys.PredeployRecord[] memory records = Predeploys.getAllRecords(); for (uint256 i = 0; i < records.length; i++) { + // TODO: Remove this once the deprecated predeploys are removed. + // if (records[i].isDeprecated) continue; + // Default to normal for CGT variants if (records[i].proxy == Predeploys.L1_BLOCK_NUMBER) { vm.label(records[i].proxy, "L1Block"); From cdcff62c8fc9db815cf52d7cbbb82dcc69830d48 Mon Sep 17 00:00:00 2001 From: niha <205694301+0xniha@users.noreply.github.com> Date: Wed, 1 Apr 2026 15:04:44 -0300 Subject: [PATCH 04/15] fix: proxy all predeploys --- .../contracts-bedrock/scripts/L2Genesis.s.sol | 32 ++++++----- .../src/libraries/Predeploys.sol | 53 ++++++++++++++++++- .../test/libraries/Predeploys.t.sol | 17 +++--- .../test/scripts/L2Genesis.t.sol | 46 +++++++++------- 4 files changed, 99 insertions(+), 49 deletions(-) diff --git a/packages/contracts-bedrock/scripts/L2Genesis.s.sol b/packages/contracts-bedrock/scripts/L2Genesis.s.sol index ad9015ca5bf9d..09aa4bdda930e 100644 --- a/packages/contracts-bedrock/scripts/L2Genesis.s.sol +++ b/packages/contracts-bedrock/scripts/L2Genesis.s.sol @@ -140,7 +140,7 @@ contract L2Genesis is Script { vm.chainId(_input.l2ChainID); dealEthToPrecompiles(); - setPredeployProxies(); + setPredeployProxies(_input); vm.stopPrank(); // Set L1 Block has its own pranking requirements which it handles internally @@ -222,29 +222,27 @@ contract L2Genesis is Script { /// to the expected nonce of 1 per EIP-161. This is because the legacy go genesis // script didn't set the nonce and we didn't want to change that behavior when /// migrating genesis generation to Solidity. - function setPredeployProxies() internal { + function setPredeployProxies(Input memory _input) internal { bytes memory code = vm.getDeployedCode("Proxy.sol:Proxy"); - Predeploys.PredeployRecord[] memory records = Predeploys.getAllRecords(); + uint160 prefix = uint160(0x420) << 148; - for (uint256 i = 0; i < records.length; i++) { - // Non-proxied predeploys are excluded from proxy setup. - if (!records[i].isProxied) continue; - - // TODO: Remove tnhis once the deprecated predeploys are removed. - // if (records[i].isDeprecated) continue; + for (uint256 i = 0; i < Predeploys.PREDEPLOY_COUNT; i++) { + address addr = address(prefix | uint160(i)); - // Skip duplicates — CGT variant records share a proxy with their standard counterpart. - if ( - keccak256(abi.encodePacked(records[i].name)) == keccak256(abi.encodePacked("L1BlockCGT")) - || keccak256(abi.encodePacked(records[i].name)) == keccak256(abi.encodePacked("L2ToL1MessagePasserCGT")) - ) continue; + // Non-proxied predeploys are excluded from proxy setup. + if (Predeploys.notProxied(addr)) continue; - address addr = records[i].proxy; vm.etch(addr, code); EIP1967Helper.setAdmin(addr, Predeploys.PROXY_ADMIN); - address implementation = Predeploys.predeployToCodeNamespace(addr); - EIP1967Helper.setImplementation(addr, implementation); + if ( + Predeploys.isSupportedPredeploy( + addr, _input.fork, _input.useCustomGasToken, _input.useInterop, _input.devFeatureBitmap + ) + ) { + address implementation = Predeploys.predeployToCodeNamespace(addr); + EIP1967Helper.setImplementation(addr, implementation); + } } } diff --git a/packages/contracts-bedrock/src/libraries/Predeploys.sol b/packages/contracts-bedrock/src/libraries/Predeploys.sol index 8d7d05fc3b62f..6decda962fb93 100644 --- a/packages/contracts-bedrock/src/libraries/Predeploys.sol +++ b/packages/contracts-bedrock/src/libraries/Predeploys.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.0; // Libraries +import { Fork } from "scripts/libraries/Config.sol"; import { DevFeatures } from "src/libraries/DevFeatures.sol"; import { Features } from "src/libraries/Features.sol"; @@ -520,8 +521,8 @@ library Predeploys { // Excluded from NUT bundles and proxy setup. deployGasLimit is unused. records_[26] = PredeployRecord({ proxy: WETH, - name: "WETH9", - artifactPath: "WETH9.sol:WETH9", + name: "WETH", + artifactPath: "WETH.sol:WETH", deployGasLimit: 0, devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), @@ -591,4 +592,52 @@ library Predeploys { } revert("Predeploys: proxy not found"); } + + function isSupportedPredeploy( + address _addr, + uint256 _fork, + bool _isCustomGasToken, + bool _useInterop, + bytes32 _devFeatureBitmap + ) + internal + pure + returns (bool) + { + // iterate over all records and check if the predeploy is supported based on the arguments + PredeployRecord[] memory records = getAllRecords(); + for (uint256 i = 0; i < records.length; i++) { + if (records[i].proxy == _addr) { + if (records[i].devFeatureGate != 0) { + // If the feature on the gate is not present on the bitmap, the predeploy is not supported. + if (!DevFeatures.isDevFeatureEnabled(_devFeatureBitmap, records[i].devFeatureGate)) { + return false; + } + // Additional conditions for interop + if (DevFeatures.isDevFeatureEnabled(records[i].devFeatureGate, DevFeatures.OPTIMISM_PORTAL_INTEROP)) + { + if (_fork < uint256(Fork.INTEROP) || !_useInterop) { + return false; + } + } + } + + if (records[i].sysFeatureGate != 0) { + // If the feature on the gate is not present on the bitmap, the predeploy is not supported. + if ( + DevFeatures.isDevFeatureEnabled(records[i].sysFeatureGate, Features.CUSTOM_GAS_TOKEN) + && !_isCustomGasToken + ) { + return false; + } + + if (DevFeatures.isDevFeatureEnabled(records[i].sysFeatureGate, Features.INTEROP) && !_useInterop) { + return false; + } + } + return true; + } + } + return false; + } } diff --git a/packages/contracts-bedrock/test/libraries/Predeploys.t.sol b/packages/contracts-bedrock/test/libraries/Predeploys.t.sol index 4704307d637d0..581ed3d5f6d0a 100644 --- a/packages/contracts-bedrock/test/libraries/Predeploys.t.sol +++ b/packages/contracts-bedrock/test/libraries/Predeploys.t.sol @@ -80,15 +80,13 @@ abstract contract Predeploys_TestInit is CommonTest { /// @notice Internal test function for predeploys validation across different forks. function _test_predeploys(Fork _fork, bool _isCustomGasToken, bool _isInterop) internal { + uint256 count = 2048; + uint160 prefix = uint160(0x420) << 148; + bytes memory proxyCode = vm.getDeployedCode("Proxy.sol:Proxy"); - Predeploys.PredeployRecord[] memory records = Predeploys.getAllRecords(); - uint256 count = records.length; for (uint256 i = 0; i < count; i++) { - // TODO: Remove this once the deprecated predeploys are removed. - // if (records[i].isDeprecated) continue; - - address addr = records[i].proxy; + address addr = address(prefix | uint160(i)); address implAddr = Predeploys.predeployToCodeNamespace(addr); if (_isOmitted(addr)) { @@ -96,11 +94,8 @@ abstract contract Predeploys_TestInit is CommonTest { continue; } - if (!records[i].isProxied) { - continue; - } - - bool isPredeploy = _isRecordActive(records[i], _fork, _isCustomGasToken, _isInterop); + bool isPredeploy = + Predeploys.isSupportedPredeploy(addr, uint256(_fork), _isCustomGasToken, _isInterop, devFeatureBitmap); bytes memory code = addr.code; if (isPredeploy) assertTrue(code.length > 0); diff --git a/packages/contracts-bedrock/test/scripts/L2Genesis.t.sol b/packages/contracts-bedrock/test/scripts/L2Genesis.t.sol index f8f2aab2f2912..b01aca6fd63fe 100644 --- a/packages/contracts-bedrock/test/scripts/L2Genesis.t.sol +++ b/packages/contracts-bedrock/test/scripts/L2Genesis.t.sol @@ -56,29 +56,37 @@ abstract contract L2Genesis_TestInit is Test { } function testPredeploys() internal view { - Predeploys.PredeployRecord[] memory records = Predeploys.getAllRecords(); + uint160 prefix = uint160(0x420) << 148; - for (uint256 i = 0; i < records.length; i++) { - // TODO: Remove this once the deprecated predeploys are removed. - // if (records[i].isDeprecated) continue; + for (uint256 i = 0; i < Predeploys.PREDEPLOY_COUNT; i++) { + address addr = address(prefix | uint160(i)); + // If it's not proxied, skip next checks. + if (Predeploys.notProxied(addr)) { + continue; + } - if ( - keccak256(abi.encodePacked(records[i].name)) == keccak256(abi.encodePacked("L1BlockCGT")) - || keccak256(abi.encodePacked(records[i].name)) == keccak256(abi.encodePacked("L2ToL1MessagePasserCGT")) - ) continue; - - address addr = records[i].proxy; - assertGt(addr.code.length, 0, string.concat("Predeploy has no code: ", records[i].name)); - - if (!records[i].isProxied) continue; + // All predeploys should have code + assertGt(addr.code.length, 0); + // All proxied predeploys should have the 1967 admin slot set to the ProxyAdmin + assertEq(Predeploys.PROXY_ADMIN, EIP1967Helper.getAdmin(addr)); - // Proxied predeploys must have proxy admin set. - assertEq( - Predeploys.PROXY_ADMIN, - EIP1967Helper.getAdmin(addr), - string.concat("Proxy admin mismatch: ", records[i].name) - ); + // If it's not a supported predeploy, skip next checks. + if ( + !Predeploys.isSupportedPredeploy( + addr, uint256(LATEST_FORK), input.useCustomGasToken, input.useInterop, input.devFeatureBitmap + ) + ) { + continue; + } + + // All proxied predeploys should have the 1967 admin slot set to the ProxyAdmin + // predeploy + address impl = Predeploys.predeployToCodeNamespace(addr); + assertGt(impl.code.length, 0); } + + assertGt(Predeploys.WETH.code.length, 0); + assertGt(Predeploys.GOVERNANCE_TOKEN.code.length, 0); } function testVaultsWithoutRevenueShare() internal view { From aa1db6ecec63309aeb413069ebb597f58aa2081a Mon Sep 17 00:00:00 2001 From: niha <205694301+0xniha@users.noreply.github.com> Date: Thu, 2 Apr 2026 10:22:57 -0300 Subject: [PATCH 05/15] refactor: use lib string to cmp strings --- .../contracts-bedrock/test/L2/L2ContractsManager.t.sol | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol b/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol index 2736d059a9d86..3c3e5e58f7397 100644 --- a/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol +++ b/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol @@ -15,6 +15,7 @@ import { Types } from "src/libraries/Types.sol"; import { Features } from "src/libraries/Features.sol"; import { Config } from "scripts/libraries/Config.sol"; import { stdStorage, StdStorage } from "forge-std/StdStorage.sol"; +import { LibString } from "lib/solady/src/utils/LibString.sol"; // Interfaces import { ICrossDomainMessenger } from "interfaces/universal/ICrossDomainMessenger.sol"; @@ -961,10 +962,10 @@ contract L2ContractsManager_Upgrade_Coverage_Test is L2ContractsManager_Upgrade_ if (!records[i].isProxied) continue; if (records[i].isDeprecated) continue; - if ( - keccak256(abi.encodePacked(records[i].name)) == keccak256(abi.encodePacked("L1BlockCGT")) - || keccak256(abi.encodePacked(records[i].name)) == keccak256(abi.encodePacked("L2ToL1MessagePasserCGT")) - ) continue; + if (LibString.eq(records[i].name, "L1BlockCGT") || LibString.eq(records[i].name, "L2ToL1MessagePasserCGT")) + { + continue; + } tmp[count++] = records[i].proxy; } address[] memory allPredeploys = new address[](count); From 22d651f164ed19fc8aad7bed3874e173661ec6ea Mon Sep 17 00:00:00 2001 From: niha <205694301+0xniha@users.noreply.github.com> Date: Thu, 2 Apr 2026 10:24:17 -0300 Subject: [PATCH 06/15] fix: argument order in ImplementationConfig --- .../scripts/upgrade/GenerateNUTBundle.s.sol | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol b/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol index 7f8c9dd09fe37..d6fdac25621e9 100644 --- a/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol +++ b/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol @@ -37,12 +37,10 @@ contract GenerateNUTBundle is Script { } /// @notice Configuration for a implementation contract deployment. - /// @param implementation Expected implementation address after deployment. /// @param deploymentGasLimit Gas limit for the deployment transaction. - /// @param artifactPath Forge artifact path (e.g., "MyContract.sol:MyContract"). + /// @param implementation Expected implementation address after deployment. /// @param name Human-readable name for the contract. - /// @param skipStandardDeploy If true, this implementation is excluded from the standard deployment - /// loop and must be deployed via a custom phase instead (e.g. Phase 1 for Karst). + /// @param artifactPath Forge artifact path (e.g., "MyContract.sol:MyContract"). struct ImplementationConfig { address implementation; uint64 deploymentGasLimit; From 53e72b42a0a249a71b785f34a3257c9d9820e5bf Mon Sep 17 00:00:00 2001 From: niha <205694301+0xniha@users.noreply.github.com> Date: Thu, 2 Apr 2026 11:11:49 -0300 Subject: [PATCH 07/15] refactor: add useInterop to L2CM tests --- .../test/L2/L2ContractsManager.t.sol | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol b/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol index 3c3e5e58f7397..f41a7d7b19794 100644 --- a/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol +++ b/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol @@ -801,17 +801,18 @@ contract L2ContractsManager_GetImplementations_Test is L2ContractsManager_Upgrad } } -/// @title L2ContractsManager_Upgrade_InteropFlag_Test -/// @notice Tests that interop predeploy upgrades are correctly gated behind both the INTEROP sys feature -/// (set on L1Block) and the OPTIMISM_PORTAL_INTEROP dev feature (must match for consistency). -contract L2ContractsManager_Upgrade_InteropFlag_Test is L2ContractsManager_Upgrade_Test { +/// @title L2ContractsManager_Upgrade_InteropFlagEnabled_Test +/// @notice Tests that interop predeploy upgrades are correctly gated behind the INTEROP sys feature (set on L1Block). +contract L2ContractsManager_Upgrade_InteropFlagEnabled_Test is L2ContractsManager_Upgrade_Test { using stdStorage for StdStorage; /// @notice The list of interop predeploy addresses. address[] internal interopPredeploys; function setUp() public override { + super.enableInterop(); super.setUp(); + skipIfDevFeatureDisabled(DevFeatures.OPTIMISM_PORTAL_INTEROP); interopPredeploys.push(Predeploys.CROSS_L2_INBOX); interopPredeploys.push(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER); interopPredeploys.push(Predeploys.SUPERCHAIN_ETH_BRIDGE); @@ -821,13 +822,6 @@ contract L2ContractsManager_Upgrade_InteropFlag_Test is L2ContractsManager_Upgra /// @notice Tests that all 4 interop predeploys are upgraded when the INTEROP sys feature is enabled /// (which requires OPTIMISM_PORTAL_INTEROP dev feature to also be enabled for consistency). function test_upgradeUpgradesInteropPredeploys_whenInteropFlagEnabled_succeeds() public { - skipIfDevFeatureDisabled(DevFeatures.OPTIMISM_PORTAL_INTEROP); - - // Genesis runs without useInterop, so L1Block doesn't have the INTEROP sys feature set. - // Set it explicitly here — L2CM reads isFeatureEnabled(INTEROP) from L1Block to gate upgrades. - stdstore.target(Predeploys.L1_BLOCK_ATTRIBUTES).sig("isFeatureEnabled(bytes32)").with_key(Features.INTEROP) - .checked_write(true); - // Capture pre-upgrade implementations address[] memory preUpgradeImpls = new address[](interopPredeploys.length); for (uint256 i = 0; i < interopPredeploys.length; i++) { @@ -858,12 +852,28 @@ contract L2ContractsManager_Upgrade_InteropFlag_Test is L2ContractsManager_Upgra "ETHLiquidity should be upgraded" ); } +} + +/// @title L2ContractsManager_Upgrade_InteropFlagDisabled_Test +/// @notice Tests that interop predeploy upgrades are skipped when the INTEROP sys feature is disabled. +contract L2ContractsManager_Upgrade_InteropFlagDisabled_Test is L2ContractsManager_Upgrade_Test { + using stdStorage for StdStorage; + + /// @notice The list of interop predeploy addresses. + address[] internal interopPredeploys; + + function setUp() public override { + super.setUp(); + skipIfDevFeatureEnabled(DevFeatures.OPTIMISM_PORTAL_INTEROP); + interopPredeploys.push(Predeploys.CROSS_L2_INBOX); + interopPredeploys.push(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER); + interopPredeploys.push(Predeploys.SUPERCHAIN_ETH_BRIDGE); + interopPredeploys.push(Predeploys.ETH_LIQUIDITY); + } /// @notice Tests that all 4 interop predeploys retain pre-upgrade implementations when OPTIMISM_PORTAL_INTEROP flag /// is disabled. function test_upgradeSkipsInteropPredeploys_whenInteropFlagDisabled_succeeds() public { - skipIfDevFeatureEnabled(DevFeatures.OPTIMISM_PORTAL_INTEROP); - // Capture pre-upgrade implementations address[] memory preUpgradeImpls = new address[](interopPredeploys.length); for (uint256 i = 0; i < interopPredeploys.length; i++) { From b18175acf0a6496ade69a05bed4fd2b0014598b5 Mon Sep 17 00:00:00 2001 From: niha <205694301+0xniha@users.noreply.github.com> Date: Thu, 2 Apr 2026 11:18:38 -0300 Subject: [PATCH 08/15] fix: remove skipStandardDeploy natspec --- .../contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol b/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol index d6fdac25621e9..60f7a9ca82f36 100644 --- a/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol +++ b/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol @@ -124,8 +124,6 @@ contract GenerateNUTBundle is Script { } /// @notice Returns the names of implementations scheduled for standard deployment. - /// @dev Excludes implementations with skipStandardDeploy = true. - /// Requires setUp() + _buildImplementationDeploymentConfigs() to have been called first. function getStandardDeploymentNames() public view returns (string[] memory names_) { uint256 count = _implementationConfigs.length; names_ = new string[](count); @@ -261,8 +259,6 @@ contract GenerateNUTBundle is Script { /// @notice Generates implementation deployment transactions for all the implementations to upgrade. /// @dev This function is called for all upgrades. It deploys implementation contracts /// via ConditionalDeployer.deploy(), which ensures idempotent deployments. - /// Implementations with skipStandardDeploy = true are skipped here and must be - /// deployed via a custom phase (e.g. _preImplementationDeployments for Karst). /// @dev IMPORTANT: Only modify this function if you need to add or modify a fixed implementation deployment. function _generateImplementationDeployments() internal { for (uint256 i = 0; i < _implementationConfigs.length; i++) { From 4e156167862ebdf87b5df606842a837e175272a0 Mon Sep 17 00:00:00 2001 From: niha <205694301+0xniha@users.noreply.github.com> Date: Thu, 2 Apr 2026 12:06:34 -0300 Subject: [PATCH 09/15] test: add cgt and interop tests for l2genesis fork upgrade --- .../test/L2/L2GenesisForkUpgrade.t.sol | 136 +++++++++++++++++- 1 file changed, 135 insertions(+), 1 deletion(-) diff --git a/packages/contracts-bedrock/test/L2/L2GenesisForkUpgrade.t.sol b/packages/contracts-bedrock/test/L2/L2GenesisForkUpgrade.t.sol index 2ec6efa9dfc86..723add88ce964 100644 --- a/packages/contracts-bedrock/test/L2/L2GenesisForkUpgrade.t.sol +++ b/packages/contracts-bedrock/test/L2/L2GenesisForkUpgrade.t.sol @@ -11,6 +11,7 @@ import { GenerateNUTBundle } from "scripts/upgrade/GenerateNUTBundle.s.sol"; // Libraries import { DevFeatures } from "src/libraries/DevFeatures.sol"; +import { Features } from "src/libraries/Features.sol"; // Reuse all test logic from L2ForkUpgrade — only setUp differs import { @@ -18,7 +19,8 @@ import { L2ForkUpgrade_Versions_Test, L2ForkUpgrade_Initialization_Test, L2ForkUpgrade_Implementations_Test, - L2ForkUpgrade_Events_Test + L2ForkUpgrade_Events_Test, + L2ForkUpgrade_GasProfile_Test } from "test/L2/fork/L2ForkUpgrade.t.sol"; /// @title L2GenesisForkUpgrade_TestInit @@ -94,3 +96,135 @@ contract L2GenesisForkUpgrade_Events_Test is L2GenesisForkUpgrade_TestInit, L2Fo L2GenesisForkUpgrade_TestInit.setUp(); } } + +/// @title L2GenesisForkUpgrade_GasProfile_Test +/// @notice Gas profiling test for the upgrade bundle from genesis state. +contract L2GenesisForkUpgrade_GasProfile_Test is L2GenesisForkUpgrade_TestInit, L2ForkUpgrade_GasProfile_Test { + function setUp() public override(L2GenesisForkUpgrade_TestInit, L2ForkUpgrade_TestInit) { + L2GenesisForkUpgrade_TestInit.setUp(); + } +} + +// ============================================================ +// Interop variant — genesis deployed with useInterop=true +// ============================================================ + +/// @title L2GenesisForkUpgrade_Interop_TestInit +/// @notice Same as L2GenesisForkUpgrade_TestInit but enables interop before genesis deployment. +/// Calling enableInterop() before CommonTest.setUp() causes L2Genesis to run with +/// useInterop=true, so L1Block gets the INTEROP sys feature. +abstract contract L2GenesisForkUpgrade_Interop_TestInit is L2GenesisForkUpgrade_TestInit { + function setUp() public virtual override { + super.enableInterop(); + L2GenesisForkUpgrade_TestInit.setUp(); + } +} + +/// @title L2GenesisForkUpgrade_Interop_Versions_Test +contract L2GenesisForkUpgrade_Interop_Versions_Test is + L2GenesisForkUpgrade_Interop_TestInit, + L2ForkUpgrade_Versions_Test +{ + function setUp() public override(L2GenesisForkUpgrade_Interop_TestInit, L2ForkUpgrade_TestInit) { + L2GenesisForkUpgrade_Interop_TestInit.setUp(); + } +} + +/// @title L2GenesisForkUpgrade_Interop_Initialization_Test +contract L2GenesisForkUpgrade_Interop_Initialization_Test is + L2GenesisForkUpgrade_Interop_TestInit, + L2ForkUpgrade_Initialization_Test +{ + function setUp() public override(L2GenesisForkUpgrade_Interop_TestInit, L2ForkUpgrade_TestInit) { + L2GenesisForkUpgrade_Interop_TestInit.setUp(); + } +} + +/// @title L2GenesisForkUpgrade_Interop_Implementations_Test +contract L2GenesisForkUpgrade_Interop_Implementations_Test is + L2GenesisForkUpgrade_Interop_TestInit, + L2ForkUpgrade_Implementations_Test +{ + function setUp() public override(L2GenesisForkUpgrade_Interop_TestInit, L2ForkUpgrade_TestInit) { + L2GenesisForkUpgrade_Interop_TestInit.setUp(); + } +} + +/// @title L2GenesisForkUpgrade_Interop_Events_Test +contract L2GenesisForkUpgrade_Interop_Events_Test is + L2GenesisForkUpgrade_Interop_TestInit, + L2ForkUpgrade_Events_Test +{ + function setUp() public override(L2GenesisForkUpgrade_Interop_TestInit, L2ForkUpgrade_TestInit) { + L2GenesisForkUpgrade_Interop_TestInit.setUp(); + } +} + +/// @title L2GenesisForkUpgrade_Interop_GasProfile_Test +contract L2GenesisForkUpgrade_Interop_GasProfile_Test is + L2GenesisForkUpgrade_Interop_TestInit, + L2ForkUpgrade_GasProfile_Test +{ + function setUp() public override(L2GenesisForkUpgrade_Interop_TestInit, L2ForkUpgrade_TestInit) { + L2GenesisForkUpgrade_Interop_TestInit.setUp(); + } +} + +// ============================================================ +// CGT variant — skips unless CUSTOM_GAS_TOKEN is active +// ============================================================ + +/// @title L2GenesisForkUpgrade_CGT_TestInit +/// @notice Same as L2GenesisForkUpgrade_TestInit but restricted to Custom Gas Token networks. +/// CGT is auto-configured from the CUSTOM_GAS_TOKEN env var inside CommonTest.setUp(), +/// so no programmatic enable is needed. +abstract contract L2GenesisForkUpgrade_CGT_TestInit is L2GenesisForkUpgrade_TestInit { + function setUp() public virtual override { + L2GenesisForkUpgrade_TestInit.setUp(); + skipIfSysFeatureDisabled(Features.CUSTOM_GAS_TOKEN); + } +} + +/// @title L2GenesisForkUpgrade_CGT_Versions_Test +contract L2GenesisForkUpgrade_CGT_Versions_Test is L2GenesisForkUpgrade_CGT_TestInit, L2ForkUpgrade_Versions_Test { + function setUp() public override(L2GenesisForkUpgrade_CGT_TestInit, L2ForkUpgrade_TestInit) { + L2GenesisForkUpgrade_CGT_TestInit.setUp(); + } +} + +/// @title L2GenesisForkUpgrade_CGT_Initialization_Test +contract L2GenesisForkUpgrade_CGT_Initialization_Test is + L2GenesisForkUpgrade_CGT_TestInit, + L2ForkUpgrade_Initialization_Test +{ + function setUp() public override(L2GenesisForkUpgrade_CGT_TestInit, L2ForkUpgrade_TestInit) { + L2GenesisForkUpgrade_CGT_TestInit.setUp(); + } +} + +/// @title L2GenesisForkUpgrade_CGT_Implementations_Test +contract L2GenesisForkUpgrade_CGT_Implementations_Test is + L2GenesisForkUpgrade_CGT_TestInit, + L2ForkUpgrade_Implementations_Test +{ + function setUp() public override(L2GenesisForkUpgrade_CGT_TestInit, L2ForkUpgrade_TestInit) { + L2GenesisForkUpgrade_CGT_TestInit.setUp(); + } +} + +/// @title L2GenesisForkUpgrade_CGT_Events_Test +contract L2GenesisForkUpgrade_CGT_Events_Test is L2GenesisForkUpgrade_CGT_TestInit, L2ForkUpgrade_Events_Test { + function setUp() public override(L2GenesisForkUpgrade_CGT_TestInit, L2ForkUpgrade_TestInit) { + L2GenesisForkUpgrade_CGT_TestInit.setUp(); + } +} + +/// @title L2GenesisForkUpgrade_CGT_GasProfile_Test +contract L2GenesisForkUpgrade_CGT_GasProfile_Test is + L2GenesisForkUpgrade_CGT_TestInit, + L2ForkUpgrade_GasProfile_Test +{ + function setUp() public override(L2GenesisForkUpgrade_CGT_TestInit, L2ForkUpgrade_TestInit) { + L2GenesisForkUpgrade_CGT_TestInit.setUp(); + } +} From bfc3b7ee91c39174b453013356b6b27d10172dad Mon Sep 17 00:00:00 2001 From: niha <205694301+0xniha@users.noreply.github.com> Date: Thu, 2 Apr 2026 12:10:57 -0300 Subject: [PATCH 10/15] fix: set correct name for l1 block attributes --- packages/contracts-bedrock/src/libraries/Predeploys.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/contracts-bedrock/src/libraries/Predeploys.sol b/packages/contracts-bedrock/src/libraries/Predeploys.sol index 6decda962fb93..b72d1a22aec32 100644 --- a/packages/contracts-bedrock/src/libraries/Predeploys.sol +++ b/packages/contracts-bedrock/src/libraries/Predeploys.sol @@ -162,7 +162,7 @@ library Predeploys { require(isPredeployNamespace(_addr), "Predeploys: address must be a predeploy"); // Get default name for CGT variants - if (_addr == L1_BLOCK_NUMBER) return "L1Block"; + if (_addr == L1_BLOCK_ATTRIBUTES) return "L1Block"; if (_addr == L2_TO_L1_MESSAGE_PASSER) return "L2ToL1MessagePasser"; // Get name from record From 6aabdb070ae945b94c4715bb92ec179c9a5961e8 Mon Sep 17 00:00:00 2001 From: niha <205694301+0xniha@users.noreply.github.com> Date: Thu, 2 Apr 2026 16:35:11 -0300 Subject: [PATCH 11/15] feat: add getUpgradeableRecords to predeploys lib --- .../scripts/upgrade/GenerateNUTBundle.s.sol | 5 +- .../src/libraries/Predeploys.sol | 114 +++++++++++++----- .../test/L2/L2ContractsManager.t.sol | 58 +++++---- .../test/L2/fork/L2ForkUpgrade.t.sol | 24 ++-- 4 files changed, 129 insertions(+), 72 deletions(-) diff --git a/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol b/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol index 60f7a9ca82f36..0ee3575ac7599 100644 --- a/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol +++ b/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol @@ -382,11 +382,8 @@ contract GenerateNUTBundle is Script { // Gas profiling: 280,600 gas used → 420,900 recommended → 500K with safety margin _implementationConfigs.push(_makeConfig("StorageSetter", "StorageSetter.sol:StorageSetter", 500_000)); - Predeploys.PredeployRecord[] memory records = Predeploys.getAllRecords(); + Predeploys.PredeployRecord[] memory records = Predeploys.getUpgradeableRecords(); for (uint256 i = 0; i < records.length; i++) { - // Non-proxied and deprecated predeploys are not deployed via NUT bundles. - if (!records[i].isProxied) continue; - if (records[i].isDeprecated) continue; _implementationConfigs.push( _makeConfig(records[i].name, records[i].artifactPath, records[i].deployGasLimit) ); diff --git a/packages/contracts-bedrock/src/libraries/Predeploys.sol b/packages/contracts-bedrock/src/libraries/Predeploys.sol index b72d1a22aec32..8d88b922974f0 100644 --- a/packages/contracts-bedrock/src/libraries/Predeploys.sol +++ b/packages/contracts-bedrock/src/libraries/Predeploys.sol @@ -146,6 +146,7 @@ library Predeploys { /// @param isDeprecated True if the predeploy is deprecated. Deprecated predeploys are /// present on-chain for backwards compatibility but are excluded from /// proxy setup loops, NUT bundles, and upgrade checks. + /// @param isVariant True for records that share a proxy address with another (primary) record. struct PredeployRecord { address proxy; string name; @@ -155,6 +156,7 @@ library Predeploys { bytes32 sysFeatureGate; bool isProxied; bool isDeprecated; + bool isVariant; } /// @notice Returns the name of the predeploy at the given address. @@ -226,7 +228,8 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // Gas profiling: 1,681,024 gas used → 2,521,536 recommended → 2.6M with safety margin records_[1] = PredeployRecord({ @@ -237,7 +240,8 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // Gas profiling: 2,358,092 gas used → 3,537,138 recommended → 3.6M with safety margin records_[2] = PredeployRecord({ @@ -248,7 +252,8 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // Gas profiling: 841,152 gas used → 1,261,728 recommended → 1.3M with safety margin records_[3] = PredeployRecord({ @@ -259,7 +264,8 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // Gas profiling: 2,347,504 gas used → 3,521,256 recommended → 3.6M with safety margin records_[4] = PredeployRecord({ @@ -270,7 +276,8 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // Gas profiling: 1,242,108 gas used → 1,863,162 recommended → 1.9M with safety margin records_[5] = PredeployRecord({ @@ -281,7 +288,8 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // Gas profiling: 707,557 gas used → 1,061,335 recommended → 1.1M with safety margin // Standard variant — used on non-CGT chains. CGT variant follows immediately after. @@ -293,7 +301,8 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // Gas profiling: 710,257 gas used → 1,065,385 recommended → 1.1M with safety margin // CGT variant — used on custom gas token chains. Same proxy as L1Block. @@ -305,7 +314,8 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: Features.CUSTOM_GAS_TOKEN, isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: true }); // Gas profiling: 400,911 gas used → 601,366 recommended → 650K with safety margin // Standard variant — used on non-CGT chains. CGT variant follows immediately after. @@ -317,7 +327,8 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // Gas profiling: 484,560 gas used → 726,840 recommended → 750K with safety margin // CGT variant — used on custom gas token chains. Same proxy as L2ToL1MessagePasser. @@ -329,7 +340,8 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: Features.CUSTOM_GAS_TOKEN, isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: true }); // Gas profiling: 3,248,395 gas used → 4,872,592 recommended → 4.9M with safety margin records_[10] = PredeployRecord({ @@ -340,7 +352,8 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // Gas profiling: 1,538,265 gas used → 2,307,397 recommended → 2.4M with safety margin records_[11] = PredeployRecord({ @@ -351,7 +364,8 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // Gas profiling: 838,947 gas used → 1,258,420 recommended → 1.3M with safety margin records_[12] = PredeployRecord({ @@ -362,7 +376,8 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // Gas profiling: 14,439 gas used → 21,658 recommended → 50K with safety margin records_[13] = PredeployRecord({ @@ -373,7 +388,8 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // Gas profiling: 838,947 gas used → 1,258,420 recommended → 1.3M with safety margin records_[14] = PredeployRecord({ @@ -384,7 +400,8 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // Gas profiling: 464,947 gas used → 697,420 recommended → 700K with safety margin records_[15] = PredeployRecord({ @@ -395,7 +412,8 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // Gas profiling: 3,820,943 gas used → 5,731,414 recommended → 5.8M with safety margin records_[16] = PredeployRecord({ @@ -406,7 +424,8 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // Gas profiling: 1,077,380 gas used → 1,616,070 recommended → 1.7M with safety margin records_[17] = PredeployRecord({ @@ -417,7 +436,8 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // ── Interop predeploys ───────────────────────────────────────────────────────────── @@ -432,7 +452,8 @@ library Predeploys { devFeatureGate: DevFeatures.OPTIMISM_PORTAL_INTEROP, sysFeatureGate: Features.INTEROP, isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // Gas profiling: 965,734 gas used → 1,448,601 recommended → 1.5M with safety margin records_[19] = PredeployRecord({ @@ -443,7 +464,8 @@ library Predeploys { devFeatureGate: DevFeatures.OPTIMISM_PORTAL_INTEROP, sysFeatureGate: Features.INTEROP, isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // Gas profiling: 441,198 gas used → 661,797 recommended → 700K with safety margin records_[20] = PredeployRecord({ @@ -454,7 +476,8 @@ library Predeploys { devFeatureGate: DevFeatures.OPTIMISM_PORTAL_INTEROP, sysFeatureGate: Features.INTEROP, isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // Gas profiling: 230,857 gas used → 346,285 recommended → 400K with safety margin records_[21] = PredeployRecord({ @@ -465,7 +488,8 @@ library Predeploys { devFeatureGate: DevFeatures.OPTIMISM_PORTAL_INTEROP, sysFeatureGate: Features.INTEROP, isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // ── CGT predeploys ───────────────────────────────────────────────────────────────── @@ -478,7 +502,8 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: Features.CUSTOM_GAS_TOKEN, isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // Gas profiling: 914,648 gas used → 1,371,972 recommended → 1.4M with safety margin records_[23] = PredeployRecord({ @@ -489,7 +514,8 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: Features.CUSTOM_GAS_TOKEN, isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // ── L2CM predeploys ──────────────────────────────────────────────────────────────── @@ -502,7 +528,8 @@ library Predeploys { devFeatureGate: DevFeatures.L2CM, sysFeatureGate: bytes32(0), isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // Gas profiling: 167,063 gas used → 250,594 recommended → 260K with safety margin records_[25] = PredeployRecord({ @@ -513,7 +540,8 @@ library Predeploys { devFeatureGate: DevFeatures.L2CM, sysFeatureGate: bytes32(0), isProxied: true, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // ── Non-proxied predeploys ───────────────────────────────────────────────────────── @@ -527,7 +555,8 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), isProxied: false, - isDeprecated: false + isDeprecated: false, + isVariant: false }); records_[27] = PredeployRecord({ proxy: GOVERNANCE_TOKEN, @@ -537,7 +566,8 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), isProxied: false, - isDeprecated: false + isDeprecated: false, + isVariant: false }); // ── Deprecated predeploys ────────────────────────────────────────────────────────── @@ -551,7 +581,8 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), isProxied: true, - isDeprecated: true + isDeprecated: true, + isVariant: false }); records_[29] = PredeployRecord({ proxy: DEPLOYER_WHITELIST, @@ -561,7 +592,8 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), isProxied: true, - isDeprecated: true + isDeprecated: true, + isVariant: false }); records_[30] = PredeployRecord({ proxy: L1_BLOCK_NUMBER, @@ -571,10 +603,30 @@ library Predeploys { devFeatureGate: bytes32(0), sysFeatureGate: bytes32(0), isProxied: true, - isDeprecated: true + isDeprecated: true, + isVariant: false }); } + /// @notice Returns all proxied, non-deprecated predeploy records, including variant records. + /// @dev Variant records (isVariant = true) share a proxy with a primary record (e.g. L1BlockCGT + /// shares the L1Block proxy). Callers that need one entry per proxy should skip variants. + function getUpgradeableRecords() internal pure returns (PredeployRecord[] memory records_) { + PredeployRecord[] memory all = getAllRecords(); + uint256 count = 0; + for (uint256 i = 0; i < all.length; i++) { + if (!all[i].isProxied || all[i].isDeprecated) continue; + count++; + } + // Create a new array with the proxied, non-deprecated records + records_ = new PredeployRecord[](count); + uint256 j = 0; + for (uint256 i = 0; i < all.length; i++) { + if (!all[i].isProxied || all[i].isDeprecated) continue; + records_[j++] = all[i]; + } + } + /// @notice Asserts that the registry record for `_proxy` has the expected gate fields. /// Reverts if no matching record is found or if the gates differ. /// Called by L2Genesis setters to self-verify their own registry configuration, diff --git a/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol b/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol index f41a7d7b19794..1e79389971c0b 100644 --- a/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol +++ b/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol @@ -15,7 +15,7 @@ import { Types } from "src/libraries/Types.sol"; import { Features } from "src/libraries/Features.sol"; import { Config } from "scripts/libraries/Config.sol"; import { stdStorage, StdStorage } from "forge-std/StdStorage.sol"; -import { LibString } from "lib/solady/src/utils/LibString.sol"; +import { console } from "forge-std/console.sol"; // Interfaces import { ICrossDomainMessenger } from "interfaces/universal/ICrossDomainMessenger.sol"; @@ -928,6 +928,13 @@ contract L2ContractsManager_Upgrade_FeatureFlagMismatch_Test is L2ContractsManag /// @notice Test that verifies all predeploys receive upgrade calls during L2CM upgrade. /// Uses Predeploys.sol as the source of truth for which predeploys should be upgraded. contract L2ContractsManager_Upgrade_Coverage_Test is L2ContractsManager_Upgrade_Test { + function setUp() public override { + super.setUp(); + // Skip interop since it requires to call useInterop() on setUp. + // The upgrade test for interop is in L2ContractsManager_Upgrade_InteropFlagEnabled_Test. + skipIfDevFeatureEnabled(DevFeatures.OPTIMISM_PORTAL_INTEROP); + } + /// @notice Checks if a predeploy is an interop predeploy gated behind the OPTIMISM_PORTAL_INTEROP dev feature flag. function _isInteropPredeploy(address _predeploy) internal pure returns (bool) { return _predeploy == Predeploys.CROSS_L2_INBOX || _predeploy == Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER @@ -960,38 +967,37 @@ contract L2ContractsManager_Upgrade_Coverage_Test is L2ContractsManager_Upgrade_ return impl != address(0) && impl.code.length > 0; } + /// @notice Returns true if a predeploy is a feature predeploy and is disabled. + /// @param _predeploy The predeploy to check. + /// @return True if the predeploy is a feature predeploy and feature is disabled, false otherwise. + function _isFeaturePredeployAndDisabled(address _predeploy) internal view returns (bool) { + if (!isSysFeatureEnabled(Features.CUSTOM_GAS_TOKEN)) { + if (_predeploy == Predeploys.NATIVE_ASSET_LIQUIDITY || _predeploy == Predeploys.LIQUIDITY_CONTROLLER) { + return true; + } + } + if (!isDevFeatureEnabled(DevFeatures.OPTIMISM_PORTAL_INTEROP) && _isInteropPredeploy(_predeploy)) { + return true; + } + return false; + } + /// @notice Tests that all predeploys from the registry receive the expected upgrade call. /// Uses vm.expectCall() to verify that upgradeTo or upgradeToAndCall is called. /// @dev If L2CM misses a predeploy that exists in PredeployRegistry, this test will fail. function test_allPredeploysReceiveUpgradeCall_succeeds() public { - // Deduplicate proxy addresses (CGT variants share a proxy with the standard record). - Predeploys.PredeployRecord[] memory records = Predeploys.getAllRecords(); - address[] memory tmp = new address[](records.length); - uint256 count = 0; - for (uint256 i = 0; i < records.length; i++) { - if (!records[i].isProxied) continue; - if (records[i].isDeprecated) continue; + Predeploys.PredeployRecord[] memory records = Predeploys.getUpgradeableRecords(); - if (LibString.eq(records[i].name, "L1BlockCGT") || LibString.eq(records[i].name, "L2ToL1MessagePasserCGT")) - { + for (uint256 i = 0; i < records.length; i++) { + if (records[i].isVariant) { + console.log("Skipping variant predeploy", records[i].name); continue; } - tmp[count++] = records[i].proxy; - } - address[] memory allPredeploys = new address[](count); - for (uint256 i = 0; i < count; i++) { - allPredeploys[i] = tmp[i]; - } - bool interopEnabled = isDevFeatureEnabled(DevFeatures.OPTIMISM_PORTAL_INTEROP); - - for (uint256 i = 0; i < allPredeploys.length; i++) { - address predeploy = allPredeploys[i]; - - // Skip predeploys that are not deployed on this chain (e.g., CGT-only, interop-only) - if (!_isPredeployUpgradeable(predeploy)) continue; - - // Skip interop predeploys when OPTIMISM_PORTAL_INTEROP flag is disabled - if (_isInteropPredeploy(predeploy) && !interopEnabled) continue; + if (_isFeaturePredeployAndDisabled(records[i].proxy)) { + console.log("Skipping feature predeploy and feature disabled", records[i].name); + continue; + } + address predeploy = records[i].proxy; // Expect the appropriate upgrade call based on whether initialization is required if (_requiresInitialization(predeploy)) { diff --git a/packages/contracts-bedrock/test/L2/fork/L2ForkUpgrade.t.sol b/packages/contracts-bedrock/test/L2/fork/L2ForkUpgrade.t.sol index d5c460b3d3c13..ac3a65c9dc4ac 100644 --- a/packages/contracts-bedrock/test/L2/fork/L2ForkUpgrade.t.sol +++ b/packages/contracts-bedrock/test/L2/fork/L2ForkUpgrade.t.sol @@ -127,27 +127,29 @@ contract L2ForkUpgrade_TestInit is CommonTest { } /// @notice Returns the active proxied predeploys with their pre-upgrade versions. - /// @dev Deduplicates proxies (CGT variants share one proxy), skips non-proxied predeploys, - /// and skips feature-gated predeploys that are disabled for the current chain config. + /// @dev Uses getUpgradeableRecords() which already filters non-proxied and deprecated records. + /// Variant records (isVariant = true, e.g. L1BlockCGT) are skipped so each proxy appears + /// once. Feature-gated predeploys disabled for the current chain config are also excluded. /// Disabled predeploys must be excluded before calling _getVersion: their proxy has an /// implementation slot pointing to a code namespace with no code, so the delegatecall /// returns empty bytes and Solidity's ABI decoder for `string` fails outside try/catch. function _getPreUpgradePredeploys() internal view returns (PredeployState[] memory predeploys_) { - Predeploys.PredeployRecord[] memory records = Predeploys.getAllRecords(); - address[] memory tmp = new address[](records.length); + Predeploys.PredeployRecord[] memory records = Predeploys.getUpgradeableRecords(); uint256 count = 0; - for (uint256 i = 0; i < records.length; i++) { - if (!records[i].isProxied) continue; - if (records[i].isDeprecated) continue; + if (records[i].isVariant) continue; if (_isFeaturePredeployAndDisabled(records[i].proxy)) continue; - tmp[count++] = records[i].proxy; + count++; } predeploys_ = new PredeployState[](count); - for (uint256 i = 0; i < count; i++) { - predeploys_[i].predeploy = tmp[i]; - predeploys_[i].version = _getVersion(tmp[i]); + uint256 j = 0; + for (uint256 i = 0; i < records.length; i++) { + if (records[i].isVariant) continue; + if (_isFeaturePredeployAndDisabled(records[i].proxy)) continue; + predeploys_[j].predeploy = records[i].proxy; + predeploys_[j].version = _getVersion(records[i].proxy); + j++; } } From cab510f84c845fcadd092d9865a31c09e051fa95 Mon Sep 17 00:00:00 2001 From: niha <205694301+0xniha@users.noreply.github.com> Date: Thu, 2 Apr 2026 16:36:59 -0300 Subject: [PATCH 12/15] feat: add L2CM feature to ci matrix --- .circleci/continue/main.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.circleci/continue/main.yml b/.circleci/continue/main.yml index 45eaed10819f0..d2ddc36e9824a 100644 --- a/.circleci/continue/main.yml +++ b/.circleci/continue/main.yml @@ -2444,6 +2444,9 @@ workflows: - OPCM_V2,OPTIMISM_PORTAL_INTEROP - OPCM_V2,ZK_DISPUTE_GAME - OPCM_V2,CANNON_KONA + - L2CM + - L2CM,CUSTOM_GAS_TOKEN + - L2CM,OPTIMISM_PORTAL_INTEROP context: - circleci-repo-readonly-authenticated-github-token - slack From 27187a9128da409c037a11aa8677d063eaf29032 Mon Sep 17 00:00:00 2001 From: niha <205694301+0xniha@users.noreply.github.com> Date: Thu, 2 Apr 2026 16:41:38 -0300 Subject: [PATCH 13/15] fix: deploy config comment --- packages/contracts-bedrock/test/L2/L2GenesisForkUpgrade.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/contracts-bedrock/test/L2/L2GenesisForkUpgrade.t.sol b/packages/contracts-bedrock/test/L2/L2GenesisForkUpgrade.t.sol index 723add88ce964..9e28062cbbf36 100644 --- a/packages/contracts-bedrock/test/L2/L2GenesisForkUpgrade.t.sol +++ b/packages/contracts-bedrock/test/L2/L2GenesisForkUpgrade.t.sol @@ -47,7 +47,7 @@ abstract contract L2GenesisForkUpgrade_TestInit is L2ForkUpgrade_TestInit { // Generate bundle generateScript.run(); - // Capture feature flags from deploy config (genesis state). + // Capture feature flags from deploy config. // Interop predeploys are upgraded only when BOTH the INTEROP sys feature (useInterop) AND // the OPTIMISM_PORTAL_INTEROP dev feature are enabled — mirroring the L2CM gating logic. commonState.isInteropEnabled = deploy.cfg().useInterop() From 65e137f43b826ef77286afec818b3a6749159186 Mon Sep 17 00:00:00 2001 From: niha <205694301+0xniha@users.noreply.github.com> Date: Thu, 2 Apr 2026 17:06:31 -0300 Subject: [PATCH 14/15] fix: remove l2cm from ci matrix --- .circleci/continue/main.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.circleci/continue/main.yml b/.circleci/continue/main.yml index c533fdf23e49d..0ff0402b5fcc2 100644 --- a/.circleci/continue/main.yml +++ b/.circleci/continue/main.yml @@ -2453,9 +2453,6 @@ workflows: - OPCM_V2,ZK_DISPUTE_GAME - OPCM_V2,CANNON_KONA - OPCM_V2,SUPER_ROOT_GAMES_MIGRATION - - L2CM - - L2CM,CUSTOM_GAS_TOKEN - - L2CM,OPTIMISM_PORTAL_INTEROP context: - circleci-repo-readonly-authenticated-github-token - slack From 7f71863b980bd7f0dd1578177094242d9c6b8045 Mon Sep 17 00:00:00 2001 From: niha <205694301+0xniha@users.noreply.github.com> Date: Thu, 2 Apr 2026 17:29:39 -0300 Subject: [PATCH 15/15] fix: update L2CM version --- packages/contracts-bedrock/snapshots/semver-lock.json | 4 ++-- .../snapshots/upgrades/current-upgrade-bundle.json | 4 ++-- packages/contracts-bedrock/src/L2/L2ContractsManager.sol | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/contracts-bedrock/snapshots/semver-lock.json b/packages/contracts-bedrock/snapshots/semver-lock.json index f402f3a0985f1..0f6d023373c5e 100644 --- a/packages/contracts-bedrock/snapshots/semver-lock.json +++ b/packages/contracts-bedrock/snapshots/semver-lock.json @@ -96,8 +96,8 @@ "sourceCodeHash": "0x7e438cbbe9a8248887b8c21f68c811f90a5cae4902cbbf7b0a1f6cd644dc42d9" }, "src/L2/L2ContractsManager.sol:L2ContractsManager": { - "initCodeHash": "0x0666c2038d401dd1bb9f3f45c8819aa11504b0196a7b325100f4be4940e9faa5", - "sourceCodeHash": "0xc99f67ba105b8d38c273743d65c69678e3ab9b32a08951a82e0e2e3c1a5be221" + "initCodeHash": "0x3c79f4619255691df7a2ad13b75a5469c4ba80ce2883269fec79045fd88f78f3", + "sourceCodeHash": "0xaabd4cb9dcdcdf7c599a8fdcceeea397b814f0286dbd69dd24f9fbf822a6d0cf" }, "src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger": { "initCodeHash": "0x76784e1bc7abe615094033f3eb16d3a6bd5caf28c2717377a3dd25e6825228f3", diff --git a/packages/contracts-bedrock/snapshots/upgrades/current-upgrade-bundle.json b/packages/contracts-bedrock/snapshots/upgrades/current-upgrade-bundle.json index d0bfce70afa00..92978366eff26 100644 --- a/packages/contracts-bedrock/snapshots/upgrades/current-upgrade-bundle.json +++ b/packages/contracts-bedrock/snapshots/upgrades/current-upgrade-bundle.json @@ -214,14 +214,14 @@ "to": "0x4200000000000000000000000000000000000018" }, { - "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000040216104006040523480156200001257600080fd5b5060405162003cc138038062003cc18339810160408190526200003591620001d4565b30608090815281516001600160a01b0390811660a09081526020840151821660e09081526040850151831660c0908152606086015184166101009081529486015184166101209081529286015184166101409081529086015184166101609081529186015184166101809081529486015184166101a09081529286015184166101c09081529086015184166101e09081529186015184166102009081529486015184166102209081529286015184166102409081529086015184166102609081529186015184166102809081529486015184166102a09081529286015184166102c09081529086015184166102e090815291860151841661030090815294860151841661032090815292860151841661034090815290860151841661036052908501518316610380529284015182166103a05283015181166103c052910151166103e05262000407565b60405161036081016001600160401b0381118282101715620001b157634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b0381168114620001cf57600080fd5b919050565b60006103608284031215620001e857600080fd5b620001f26200017f565b620001fd83620001b7565b81526200020d60208401620001b7565b60208201526200022060408401620001b7565b60408201526200023360608401620001b7565b60608201526200024660808401620001b7565b60808201526200025960a08401620001b7565b60a08201526200026c60c08401620001b7565b60c08201526200027f60e08401620001b7565b60e082015261010062000294818501620001b7565b90820152610120620002a8848201620001b7565b90820152610140620002bc848201620001b7565b90820152610160620002d0848201620001b7565b90820152610180620002e4848201620001b7565b908201526101a0620002f8848201620001b7565b908201526101c06200030c848201620001b7565b908201526101e062000320848201620001b7565b9082015261020062000334848201620001b7565b9082015261022062000348848201620001b7565b908201526102406200035c848201620001b7565b9082015261026062000370848201620001b7565b9082015261028062000384848201620001b7565b908201526102a062000398848201620001b7565b908201526102c0620003ac848201620001b7565b908201526102e0620003c0848201620001b7565b90820152610300620003d4848201620001b7565b90820152610320620003e8848201620001b7565b90820152610340620003fc848201620001b7565b908201529392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516103a0516103c0516103e0516136776200064a600039600081816104d80152611a080152600081816104af0152611bc5015260008181610486015261145301526000818161045d015261130501526000818161043401526113ec01526000818161040b0152611b0b0152600081816103e20152611acd0152600081816103b90152611a8f0152600081816103900152611a510152600081816103670152611b8701526000818161033e0152611b4901526000818161031501526116e90152600081816102ec01526116690152600081816102c301526115ea01526000818161029a01526119ca0152600081816102710152611205015260008181610248015261198c01526000818161021f01526119660152600081816101f601526117c00152600081816101ce015261179a0152600081816101a601526110e101526000818161017e015261116d01526000818161015601526114cd01526000818161012e0152610fdb01526000818160df0152610ed5015260008181610107015261175201526000818160ba01528181610ef701528181610ffd015281816111030152818161118f015281816112270152818161132701528181611475015281816114ef0152818161160c0152818161168b015261170b0152600061052b01526136776000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806354fd4d5014610046578063615f64fe14610098578063d55ec6971461050a575b600080fd5b6100826040518060400160405280600581526020017f312e352e3000000000000000000000000000000000000000000000000000000081525081565b60405161008f919061308a565b60405180910390f35b604080516103608101825273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811682527f0000000000000000000000000000000000000000000000000000000000000000811660208301527f00000000000000000000000000000000000000000000000000000000000000008116828401527f0000000000000000000000000000000000000000000000000000000000000000811660608301527f0000000000000000000000000000000000000000000000000000000000000000811660808301527f0000000000000000000000000000000000000000000000000000000000000000811660a08301527f0000000000000000000000000000000000000000000000000000000000000000811660c08301527f0000000000000000000000000000000000000000000000000000000000000000811660e08301527f000000000000000000000000000000000000000000000000000000000000000081166101008301527f000000000000000000000000000000000000000000000000000000000000000081166101208301527f000000000000000000000000000000000000000000000000000000000000000081166101408301527f000000000000000000000000000000000000000000000000000000000000000081166101608301527f000000000000000000000000000000000000000000000000000000000000000081166101808301527f000000000000000000000000000000000000000000000000000000000000000081166101a08301527f000000000000000000000000000000000000000000000000000000000000000081166101c08301527f000000000000000000000000000000000000000000000000000000000000000081166101e08301527f000000000000000000000000000000000000000000000000000000000000000081166102008301527f000000000000000000000000000000000000000000000000000000000000000081166102208301527f000000000000000000000000000000000000000000000000000000000000000081166102408301527f000000000000000000000000000000000000000000000000000000000000000081166102608301527f000000000000000000000000000000000000000000000000000000000000000081166102808301527f000000000000000000000000000000000000000000000000000000000000000081166102a08301527f000000000000000000000000000000000000000000000000000000000000000081166102c08301527f000000000000000000000000000000000000000000000000000000000000000081166102e08301527f000000000000000000000000000000000000000000000000000000000000000081166103008301527f000000000000000000000000000000000000000000000000000000000000000081166103208301527f000000000000000000000000000000000000000000000000000000000000000016610340820152905161008f919061309d565b610512610514565b005b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610583576040517fada337cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061058d61059b565b905061059881610e96565b50565b6105a3612ed4565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663213268496040518163ffffffff1660e01b8152600401602060405180830381865afa158015610602573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062691906132eb565b15156101608201526040517f47af267b0000000000000000000000000000000000000000000000000000000081527f494e5445524f50000000000000000000000000000000000000000000000000006004820152734200000000000000000000000000000000000015906347af267b90602401602060405180830381865afa9250505080156106f0575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526106ed918101906132eb565b60015b61070157600061018082015261070a565b15156101808201525b806101800151801561072357506107216001611be9565b155b1561075a576040517fa27dcc8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806020016040528073420000000000000000000000000000000000000773ffffffffffffffffffffffffffffffffffffffff16639fce812c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e8919061332f565b73ffffffffffffffffffffffffffffffffffffffff16905281526040805160208082018084527f7f46ddb200000000000000000000000000000000000000000000000000000000905291519091829173420000000000000000000000000000000000001091637f46ddb29160248086019291908187030181865afa158015610874573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610898919061332f565b73ffffffffffffffffffffffffffffffffffffffff168152508160200181905250604051806020016040528073420000000000000000000000000000000000001473ffffffffffffffffffffffffffffffffffffffff16637f46ddb26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610923573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610947919061332f565b73ffffffffffffffffffffffffffffffffffffffff168152508160400181905250604051806020016040528073420000000000000000000000000000000000001273ffffffffffffffffffffffffffffffffffffffff1663ee9a31a26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f6919061332f565b73ffffffffffffffffffffffffffffffffffffffff1690526060820152604080518082018083527fee9a31a2000000000000000000000000000000000000000000000000000000009052905181907342000000000000000000000000000000000000179063ee9a31a2906044808501916020918187030181865afa158015610a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa6919061332f565b73ffffffffffffffffffffffffffffffffffffffff16815260200173420000000000000000000000000000000000001773ffffffffffffffffffffffffffffffffffffffff16637d1d0c5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b44919061334c565b90526080820152610b68734200000000000000000000000000000000000011611d4c565b60a0820152610b8a734200000000000000000000000000000000000019611d4c565b60c0820152610bac73420000000000000000000000000000000000001a611d4c565b60e0820152610bce73420000000000000000000000000000000000001b611d4c565b61010082015261016081015115610dbe57600073420000000000000000000000000000000000002a905060405180606001604052808273ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c72919061332f565b73ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1663d84447156040518163ffffffff1660e01b8152600401600060405180830381865afa158015610cd8573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610d1e9190810190613426565b81526020018273ffffffffffffffffffffffffffffffffffffffff1663550fcdc96040518163ffffffff1660e01b8152600401600060405180830381865afa158015610d6e573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610db49190810190613426565b9052610120830152505b600073420000000000000000000000000000000000002b73ffffffffffffffffffffffffffffffffffffffff1663d61a398b6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610e59575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610e569181019061332f565b60015b610e6557506000610e68565b90505b604080516020810190915273ffffffffffffffffffffffffffffffffffffffff909116815261014082015290565b80515160405173ffffffffffffffffffffffffffffffffffffffff9091166024820152610f9990734200000000000000000000000000000000000007907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de80000000000000000000000000000000000000000000000000000000017905260006014611f2d565b60208101515160405173ffffffffffffffffffffffffffffffffffffffff909116602482015261109f90734200000000000000000000000000000000000010907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906044015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052600080611f2d565b60408082015151905173ffffffffffffffffffffffffffffffffffffffff909116602482015261112b90734200000000000000000000000000000000000014907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401611021565b60608101515160405173ffffffffffffffffffffffffffffffffffffffff90911660248201526111b790734200000000000000000000000000000000000012907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401611021565b6080810151805160209091015160405173ffffffffffffffffffffffffffffffffffffffff909216602483015260448201526112c990734200000000000000000000000000000000000017907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090606401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcd6dc6870000000000000000000000000000000000000000000000000000000017905260016000611f2d565b80610160015115611410576101208101518051602082015160409283015192516113d29373420000000000000000000000000000000000002a937f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000936113549390602401613477565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f9065714700000000000000000000000000000000000000000000000000000000179052600080611f2d565b6114107342000000000000000000000000000000000000297f0000000000000000000000000000000000000000000000000000000000000000612689565b6101408101515160405173ffffffffffffffffffffffffffffffffffffffff909116602482015261149d9073420000000000000000000000000000000000002b907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401611021565b60a08101518051602082015160409283015192516115ba93734200000000000000000000000000000000000011937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361151c93906024016134f1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb49dc741000000000000000000000000000000000000000000000000000000001790527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006000611f2d565b60c081015180516020820151604092830151925161163993734200000000000000000000000000000000000019937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361151c93906024016134f1565b60e08101518051602082015160409283015192516116b89373420000000000000000000000000000000000001a937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361151c93906024016134f1565b6101008101518051602082015160409283015192516117389373420000000000000000000000000000000000001b937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361151c93906024016134f1565b61177673420000000000000000000000000000000000000f7f0000000000000000000000000000000000000000000000000000000000000000612689565b6117e47342000000000000000000000000000000000000158261016001516117be577f0000000000000000000000000000000000000000000000000000000000000000612689565b7f0000000000000000000000000000000000000000000000000000000000000000612689565b806101600151801561189f57506040517f47af267b0000000000000000000000000000000000000000000000000000000081527f435553544f4d5f4741535f544f4b454e000000000000000000000000000000006004820152734200000000000000000000000000000000000015906347af267b90602401602060405180830381865afa158015611879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189d91906132eb565b155b15611942576040517f46a4d7800000000000000000000000000000000000000000000000000000000081527f435553544f4d5f4741535f544f4b454e000000000000000000000000000000006004820152734200000000000000000000000000000000000015906346a4d78090602401600060405180830381600087803b15801561192957600080fd5b505af115801561193d573d6000803e3d6000fd5b505050505b6119b073420000000000000000000000000000000000001682610160015161198a577f0000000000000000000000000000000000000000000000000000000000000000612689565b7f0000000000000000000000000000000000000000000000000000000000000000612689565b6119ee7342000000000000000000000000000000000000187f0000000000000000000000000000000000000000000000000000000000000000612689565b611a2c73420000000000000000000000000000000000002d7f0000000000000000000000000000000000000000000000000000000000000000612689565b80610180015115611b2f57611a757342000000000000000000000000000000000000227f0000000000000000000000000000000000000000000000000000000000000000612689565b611ab37342000000000000000000000000000000000000237f0000000000000000000000000000000000000000000000000000000000000000612689565b611af17342000000000000000000000000000000000000247f0000000000000000000000000000000000000000000000000000000000000000612689565b611b2f7342000000000000000000000000000000000000257f0000000000000000000000000000000000000000000000000000000000000000612689565b611b6d7342000000000000000000000000000000000000207f0000000000000000000000000000000000000000000000000000000000000000612689565b611bab7342000000000000000000000000000000000000217f0000000000000000000000000000000000000000000000000000000000000000612689565b61059873420000000000000000000000000000000000002c7f0000000000000000000000000000000000000000000000000000000000000000612689565b6040517f204e1c7a00000000000000000000000000000000000000000000000000000000815273420000000000000000000000000000000000002d600482015260009081907342000000000000000000000000000000000000189063204e1c7a90602401602060405180830381865afa158015611c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8e919061332f565b90508073ffffffffffffffffffffffffffffffffffffffff163b600003611cb85750600092915050565b6040517f78ecabce0000000000000000000000000000000000000000000000000000000081526004810184905273420000000000000000000000000000000000002d906378ecabce90602401602060405180830381865afa158015611d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4591906132eb565b9392505050565b611d6d60408051606081018252600080825260208201819052909182015290565b60008273ffffffffffffffffffffffffffffffffffffffff1663d0e12f906040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611df4575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611df19181019061355a565b60015b611e0057506000611e03565b90505b600083905060405180606001604052808273ffffffffffffffffffffffffffffffffffffffff16630d9019e16040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e82919061332f565b73ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1663d3e5792b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0c919061334c565b8152602001836001811115611f2357611f236134c2565b9052949350505050565b611f368661295c565b611f89576040517fc3fe4a6600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526024015b60405180910390fd5b6040517f204e1c7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526000907342000000000000000000000000000000000000189063204e1c7a90602401602060405180830381865afa15801561200a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202e919061332f565b905073ffffffffffffffffffffffffffffffffffffffff81163b1580159061217b575061217b8773ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa15801561209f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526120e59190810190613426565b8773ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa158015612130573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526121769190810190613426565b6129a5565b156121ca576040517ff8ce5d1600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88166004820152602401611f80565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152881690633659cfe690602401600060405180830381600087803b15801561223357600080fd5b505af1158015612247573d6000803e3d6000fd5b507ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0092505050838114801561227e575060ff831615155b156122b5576040517f10415a2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808414612449576040517fa6ed563e0000000000000000000000000000000000000000000000000000000081526004810185905260009073ffffffffffffffffffffffffffffffffffffffff8a169063a6ed563e90602401602060405180830381865afa15801561232a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234e919061334c565b905061235b8460016135aa565b6123699060ff1660086135cf565b81901c60ff16156123a6576040517fc996d78400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006123b660ff861660086135cf565b6040517f4e91db080000000000000000000000000000000000000000000000000000000081526004810188905260ff90911b198381166024830152915073ffffffffffffffffffffffffffffffffffffffff8b1690634e91db0890604401600060405180830381600087803b15801561242e57600080fd5b505af1158015612442573d6000803e3d6000fd5b5050505050505b6040517fa6ed563e0000000000000000000000000000000000000000000000000000000081526004810182905260009073ffffffffffffffffffffffffffffffffffffffff8a169063a6ed563e90602401602060405180830381865afa1580156124b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124db919061334c565b905060ff604082901c161561251c576040517fc996d78400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f4e91db08000000000000000000000000000000000000000000000000000000008152600481018390527fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008216602482015273ffffffffffffffffffffffffffffffffffffffff8a1690634e91db0890604401600060405180830381600087803b1580156125ac57600080fd5b505af11580156125c0573d6000803e3d6000fd5b50506040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c169250634f1ef2869150612618908b908a9060040161360c565b6000604051808303816000875af1158015612637573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261267d9190810190613426565b50505050505050505050565b6126928261295c565b6126e0576040517fc3fe4a6600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401611f80565b6040517f204e1c7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526000907342000000000000000000000000000000000000189063204e1c7a90602401602060405180830381865afa158015612761573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612785919061332f565b905073ffffffffffffffffffffffffffffffffffffffff81163b1580159061288757506128878373ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa1580156127f6573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261283c9190810190613426565b8373ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa158015612130573d6000803e3d6000fd5b156128d6576040517ff8ce5d1600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401611f80565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe690602401600060405180830381600087803b15801561293f57600080fd5b505af1158015612953573d6000803e3d6000fd5b50505050505050565b60007208400000000000000000000000000000000000600b83901c721fffffffffffffffffffffffffffffffffffff1614801561299f575061299d826129cb565b155b92915050565b60006129b18383612a33565b158015611d4557506129c38383612a83565b159392505050565b600073ffffffffffffffffffffffffffffffffffffffff8216734200000000000000000000000000000000000042148061299f575073ffffffffffffffffffffffffffffffffffffffff82167342000000000000000000000000000000000000061492915050565b600080612a3f84612af8565b90506000612a4c84612af8565b80518351919250148015612a67575080602001518260200151145b8015612a7a575080604001518260400151145b95945050505050565b600080612a8f84612af8565b90506000612a9c84612af8565b805183519192501180612ac2575080518251148015612ac2575080602001518260200151105b80612a7a575080518251148015612ae0575080602001518260200151145b8015612a7a5750604090810151910151109392505050565b612b1c60405180606001604052806000815260200160008152602001600081525090565b6000612b5d836040518060400160405280600181526020017f2e00000000000000000000000000000000000000000000000000000000000000815250612cc4565b9050600381511015612b9b576040517f9eda858c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612bf682600281518110612bb357612bb361363b565b60200260200101516040518060400160405280600181526020017f2d00000000000000000000000000000000000000000000000000000000000000815250612cc4565b90506000612c5382600081518110612c1057612c1061363b565b60200260200101516040518060400160405280600181526020017f2b00000000000000000000000000000000000000000000000000000000000000815250612cc4565b90506040518060600160405280612c8385600081518110612c7657612c7661363b565b6020026020010151612d6f565b8152602001612c9e85600181518110612c7657612c7661363b565b8152602001612cb983600081518110612c7657612c7661363b565b905295945050505050565b60606000612cd28484612de7565b9050601f1960208201600183510160051b81018651838201526001845101845260005b825160608452818114612d3a5760405182820380825286601f8201165b8b850181015183820152870180612d125750600082820160200152603f018616810160405284525b875160209490940193019050818310612cf557505050508091508251612d6857602081019150600281510382525b5092915050565b80516000907f1999999999999999999999999999999999999999999999999999999999999999825b600181019050603060ff82870151160382851185600a028281019650600983118188108317171586029550505050828110612d9757505080612de15763101827966000526004601cfd5b50919050565b606082518251818111612ecc576020850194506020840193506020604051019250846001828488010301600060208410612e2057508286205b601f841660200360031b87515b8951818118831c612e82578315612e605783878c2014612e605760018b019a50848b10612e5a5750612e91565b50612e2d565b858b038952998601996020909801978615612e8257848b10612e5a5750612e91565b5060018a019950838a10612e2d575b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08189030160051c8152602090970190525050505b505092915050565b604080516101c08101825260006101a08201818152825282516020808201855282825280840191909152835180820185528281528385015283518082018552828152606084015283518085019094528184528301529060808201908152602001612f5560408051606081018252600080825260208201819052909182015290565b8152602001612f7b60408051606081018252600080825260208201819052909182015290565b8152602001612fa160408051606081018252600080825260208201819052909182015290565b8152602001612fc760408051606081018252600080825260208201819052909182015290565b8152604080516060808201835260008252602082810182905292820152910190815260408051602081810190925260008152910190815260006020820181905260409091015290565b60005b8381101561302b578181015183820152602001613013565b8381111561303a576000848401525b50505050565b60008151808452613058816020860160208601613010565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611d456020830184613040565b815173ffffffffffffffffffffffffffffffffffffffff168152610360810160208301516130e3602084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604083015161310b604084018273ffffffffffffffffffffffffffffffffffffffff169052565b506060830151613133606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50608083015161315b608084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060a083015161318360a084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060c08301516131ab60c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060e08301516131d360e084018273ffffffffffffffffffffffffffffffffffffffff169052565b506101008381015173ffffffffffffffffffffffffffffffffffffffff90811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501518216908401526101e08085015182169084015261020080850151821690840152610220808501518216908401526102408085015182169084015261026080850151821690840152610280808501518216908401526102a0808501518216908401526102c0808501518216908401526102e0808501518216908401526103008085015182169084015261032080850151821690840152610340808501519182168185015290612ecc565b6000602082840312156132fd57600080fd5b81518015158114611d4557600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461059857600080fd5b60006020828403121561334157600080fd5b8151611d458161330d565b60006020828403121561335e57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff808411156133af576133af613365565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156133f5576133f5613365565b8160405280935085815286868601111561340e57600080fd5b61341c866020830187613010565b5050509392505050565b60006020828403121561343857600080fd5b815167ffffffffffffffff81111561344f57600080fd5b8201601f8101841361346057600080fd5b61346f84825160208401613394565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006134a66060830185613040565b82810360408401526134b88185613040565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8416815260208101839052606081016002831061354c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b826040830152949350505050565b60006020828403121561356c57600080fd5b815160028110611d4557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060ff821660ff84168060ff038211156135c7576135c761357b565b019392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156136075761360761357b565b500290565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600061346f6040830184613040565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080f000a0000000000000000000000002a5a3eabb9fd571a3af0299eebdf8eaafe29a914000000000000000000000000250af3f400cf8aac8d410c90f1ba3968dd87df96000000000000000000000000547d0fba434877d7237d511cf87fabe2ee26b152000000000000000000000000ac8538a2e6a1f5dfbb1c4b8bd97cefb2997824a8000000000000000000000000b178cdaa8336f25624a63c049edb5af7ca36c2da000000000000000000000000c053fc0155bf8bda5b568af53276e538f0ea4d58000000000000000000000000716ead0cf3e7ff86a02d4f8cb41a6d14922fa8330000000000000000000000006a97c5d55a21265326150efe12fc30fb21cbff56000000000000000000000000a0734858ba5085ff6db493021a0f8c54605c2cda00000000000000000000000027e51b2254433a3284d9ba73ea551c397db2a124000000000000000000000000a0f4ffff79a0a3e039fcbef738751efba8e84f96000000000000000000000000f43862b9d814bb4504158ceccb0b74b31265e4ee000000000000000000000000893c2ceeb71d38514daf67728d3ff1b213fc4b5f000000000000000000000000f7bed7215eef1003fac426682cf2edeb958569f7000000000000000000000000f7bed7215eef1003fac426682cf2edeb958569f7000000000000000000000000eddf416c7159387cc6df3015700f79cfb891137300000000000000000000000070de55bc0bfbc52c5d0cca1da5816c2428886a34000000000000000000000000bec660b456b84a081e90af29be43385bda5bf7b600000000000000000000000093a8a7a9c98cb998d88dba3373a6c7f8ee2e8a4600000000000000000000000037dc2fe754052a9fac35f17282599fafbeb9f423000000000000000000000000784f1fae11f1c3a9c413423fe1b370a3636b8d560000000000000000000000002f76618143d9d2731c56778192d3893864b423d7000000000000000000000000dda87ef358082ab3f4ba8982290c671efdc4d1590000000000000000000000008256398a687e740006098445b05d5ca46b7be21e0000000000000000000000008684ccc5bf484ec242dbc7119004a83533934a79000000000000000000000000906835344844979ffd3a752eaa23728d513db00b000000000000000000000000e35b194efc4907f383b7e3b87f4c2c339ce239f600000000000000000000000000000000000000000000000000000000000000", + "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000040216104006040523480156200001257600080fd5b5060405162003cc138038062003cc18339810160408190526200003591620001d4565b30608090815281516001600160a01b0390811660a09081526020840151821660e09081526040850151831660c0908152606086015184166101009081529486015184166101209081529286015184166101409081529086015184166101609081529186015184166101809081529486015184166101a09081529286015184166101c09081529086015184166101e09081529186015184166102009081529486015184166102209081529286015184166102409081529086015184166102609081529186015184166102809081529486015184166102a09081529286015184166102c09081529086015184166102e090815291860151841661030090815294860151841661032090815292860151841661034090815290860151841661036052908501518316610380529284015182166103a05283015181166103c052910151166103e05262000407565b60405161036081016001600160401b0381118282101715620001b157634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b0381168114620001cf57600080fd5b919050565b60006103608284031215620001e857600080fd5b620001f26200017f565b620001fd83620001b7565b81526200020d60208401620001b7565b60208201526200022060408401620001b7565b60408201526200023360608401620001b7565b60608201526200024660808401620001b7565b60808201526200025960a08401620001b7565b60a08201526200026c60c08401620001b7565b60c08201526200027f60e08401620001b7565b60e082015261010062000294818501620001b7565b90820152610120620002a8848201620001b7565b90820152610140620002bc848201620001b7565b90820152610160620002d0848201620001b7565b90820152610180620002e4848201620001b7565b908201526101a0620002f8848201620001b7565b908201526101c06200030c848201620001b7565b908201526101e062000320848201620001b7565b9082015261020062000334848201620001b7565b9082015261022062000348848201620001b7565b908201526102406200035c848201620001b7565b9082015261026062000370848201620001b7565b9082015261028062000384848201620001b7565b908201526102a062000398848201620001b7565b908201526102c0620003ac848201620001b7565b908201526102e0620003c0848201620001b7565b90820152610300620003d4848201620001b7565b90820152610320620003e8848201620001b7565b90820152610340620003fc848201620001b7565b908201529392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516103a0516103c0516103e0516136776200064a600039600081816104d80152611a080152600081816104af0152611bc5015260008181610486015261145301526000818161045d015261130501526000818161043401526113ec01526000818161040b0152611b0b0152600081816103e20152611acd0152600081816103b90152611a8f0152600081816103900152611a510152600081816103670152611b8701526000818161033e0152611b4901526000818161031501526116e90152600081816102ec01526116690152600081816102c301526115ea01526000818161029a01526119ca0152600081816102710152611205015260008181610248015261198c01526000818161021f01526119660152600081816101f601526117c00152600081816101ce015261179a0152600081816101a601526110e101526000818161017e015261116d01526000818161015601526114cd01526000818161012e0152610fdb01526000818160df0152610ed5015260008181610107015261175201526000818160ba01528181610ef701528181610ffd015281816111030152818161118f015281816112270152818161132701528181611475015281816114ef0152818161160c0152818161168b015261170b0152600061052b01526136776000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806354fd4d5014610046578063615f64fe14610098578063d55ec6971461050a575b600080fd5b6100826040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161008f919061308a565b60405180910390f35b604080516103608101825273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811682527f0000000000000000000000000000000000000000000000000000000000000000811660208301527f00000000000000000000000000000000000000000000000000000000000000008116828401527f0000000000000000000000000000000000000000000000000000000000000000811660608301527f0000000000000000000000000000000000000000000000000000000000000000811660808301527f0000000000000000000000000000000000000000000000000000000000000000811660a08301527f0000000000000000000000000000000000000000000000000000000000000000811660c08301527f0000000000000000000000000000000000000000000000000000000000000000811660e08301527f000000000000000000000000000000000000000000000000000000000000000081166101008301527f000000000000000000000000000000000000000000000000000000000000000081166101208301527f000000000000000000000000000000000000000000000000000000000000000081166101408301527f000000000000000000000000000000000000000000000000000000000000000081166101608301527f000000000000000000000000000000000000000000000000000000000000000081166101808301527f000000000000000000000000000000000000000000000000000000000000000081166101a08301527f000000000000000000000000000000000000000000000000000000000000000081166101c08301527f000000000000000000000000000000000000000000000000000000000000000081166101e08301527f000000000000000000000000000000000000000000000000000000000000000081166102008301527f000000000000000000000000000000000000000000000000000000000000000081166102208301527f000000000000000000000000000000000000000000000000000000000000000081166102408301527f000000000000000000000000000000000000000000000000000000000000000081166102608301527f000000000000000000000000000000000000000000000000000000000000000081166102808301527f000000000000000000000000000000000000000000000000000000000000000081166102a08301527f000000000000000000000000000000000000000000000000000000000000000081166102c08301527f000000000000000000000000000000000000000000000000000000000000000081166102e08301527f000000000000000000000000000000000000000000000000000000000000000081166103008301527f000000000000000000000000000000000000000000000000000000000000000081166103208301527f000000000000000000000000000000000000000000000000000000000000000016610340820152905161008f919061309d565b610512610514565b005b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610583576040517fada337cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061058d61059b565b905061059881610e96565b50565b6105a3612ed4565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663213268496040518163ffffffff1660e01b8152600401602060405180830381865afa158015610602573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062691906132eb565b15156101608201526040517f47af267b0000000000000000000000000000000000000000000000000000000081527f494e5445524f50000000000000000000000000000000000000000000000000006004820152734200000000000000000000000000000000000015906347af267b90602401602060405180830381865afa9250505080156106f0575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526106ed918101906132eb565b60015b61070157600061018082015261070a565b15156101808201525b806101800151801561072357506107216001611be9565b155b1561075a576040517fa27dcc8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806020016040528073420000000000000000000000000000000000000773ffffffffffffffffffffffffffffffffffffffff16639fce812c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e8919061332f565b73ffffffffffffffffffffffffffffffffffffffff16905281526040805160208082018084527f7f46ddb200000000000000000000000000000000000000000000000000000000905291519091829173420000000000000000000000000000000000001091637f46ddb29160248086019291908187030181865afa158015610874573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610898919061332f565b73ffffffffffffffffffffffffffffffffffffffff168152508160200181905250604051806020016040528073420000000000000000000000000000000000001473ffffffffffffffffffffffffffffffffffffffff16637f46ddb26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610923573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610947919061332f565b73ffffffffffffffffffffffffffffffffffffffff168152508160400181905250604051806020016040528073420000000000000000000000000000000000001273ffffffffffffffffffffffffffffffffffffffff1663ee9a31a26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f6919061332f565b73ffffffffffffffffffffffffffffffffffffffff1690526060820152604080518082018083527fee9a31a2000000000000000000000000000000000000000000000000000000009052905181907342000000000000000000000000000000000000179063ee9a31a2906044808501916020918187030181865afa158015610a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa6919061332f565b73ffffffffffffffffffffffffffffffffffffffff16815260200173420000000000000000000000000000000000001773ffffffffffffffffffffffffffffffffffffffff16637d1d0c5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b44919061334c565b90526080820152610b68734200000000000000000000000000000000000011611d4c565b60a0820152610b8a734200000000000000000000000000000000000019611d4c565b60c0820152610bac73420000000000000000000000000000000000001a611d4c565b60e0820152610bce73420000000000000000000000000000000000001b611d4c565b61010082015261016081015115610dbe57600073420000000000000000000000000000000000002a905060405180606001604052808273ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c72919061332f565b73ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1663d84447156040518163ffffffff1660e01b8152600401600060405180830381865afa158015610cd8573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610d1e9190810190613426565b81526020018273ffffffffffffffffffffffffffffffffffffffff1663550fcdc96040518163ffffffff1660e01b8152600401600060405180830381865afa158015610d6e573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610db49190810190613426565b9052610120830152505b600073420000000000000000000000000000000000002b73ffffffffffffffffffffffffffffffffffffffff1663d61a398b6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610e59575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610e569181019061332f565b60015b610e6557506000610e68565b90505b604080516020810190915273ffffffffffffffffffffffffffffffffffffffff909116815261014082015290565b80515160405173ffffffffffffffffffffffffffffffffffffffff9091166024820152610f9990734200000000000000000000000000000000000007907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de80000000000000000000000000000000000000000000000000000000017905260006014611f2d565b60208101515160405173ffffffffffffffffffffffffffffffffffffffff909116602482015261109f90734200000000000000000000000000000000000010907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906044015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052600080611f2d565b60408082015151905173ffffffffffffffffffffffffffffffffffffffff909116602482015261112b90734200000000000000000000000000000000000014907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401611021565b60608101515160405173ffffffffffffffffffffffffffffffffffffffff90911660248201526111b790734200000000000000000000000000000000000012907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401611021565b6080810151805160209091015160405173ffffffffffffffffffffffffffffffffffffffff909216602483015260448201526112c990734200000000000000000000000000000000000017907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090606401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcd6dc6870000000000000000000000000000000000000000000000000000000017905260016000611f2d565b80610160015115611410576101208101518051602082015160409283015192516113d29373420000000000000000000000000000000000002a937f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000936113549390602401613477565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f9065714700000000000000000000000000000000000000000000000000000000179052600080611f2d565b6114107342000000000000000000000000000000000000297f0000000000000000000000000000000000000000000000000000000000000000612689565b6101408101515160405173ffffffffffffffffffffffffffffffffffffffff909116602482015261149d9073420000000000000000000000000000000000002b907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401611021565b60a08101518051602082015160409283015192516115ba93734200000000000000000000000000000000000011937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361151c93906024016134f1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb49dc741000000000000000000000000000000000000000000000000000000001790527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006000611f2d565b60c081015180516020820151604092830151925161163993734200000000000000000000000000000000000019937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361151c93906024016134f1565b60e08101518051602082015160409283015192516116b89373420000000000000000000000000000000000001a937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361151c93906024016134f1565b6101008101518051602082015160409283015192516117389373420000000000000000000000000000000000001b937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361151c93906024016134f1565b61177673420000000000000000000000000000000000000f7f0000000000000000000000000000000000000000000000000000000000000000612689565b6117e47342000000000000000000000000000000000000158261016001516117be577f0000000000000000000000000000000000000000000000000000000000000000612689565b7f0000000000000000000000000000000000000000000000000000000000000000612689565b806101600151801561189f57506040517f47af267b0000000000000000000000000000000000000000000000000000000081527f435553544f4d5f4741535f544f4b454e000000000000000000000000000000006004820152734200000000000000000000000000000000000015906347af267b90602401602060405180830381865afa158015611879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189d91906132eb565b155b15611942576040517f46a4d7800000000000000000000000000000000000000000000000000000000081527f435553544f4d5f4741535f544f4b454e000000000000000000000000000000006004820152734200000000000000000000000000000000000015906346a4d78090602401600060405180830381600087803b15801561192957600080fd5b505af115801561193d573d6000803e3d6000fd5b505050505b6119b073420000000000000000000000000000000000001682610160015161198a577f0000000000000000000000000000000000000000000000000000000000000000612689565b7f0000000000000000000000000000000000000000000000000000000000000000612689565b6119ee7342000000000000000000000000000000000000187f0000000000000000000000000000000000000000000000000000000000000000612689565b611a2c73420000000000000000000000000000000000002d7f0000000000000000000000000000000000000000000000000000000000000000612689565b80610180015115611b2f57611a757342000000000000000000000000000000000000227f0000000000000000000000000000000000000000000000000000000000000000612689565b611ab37342000000000000000000000000000000000000237f0000000000000000000000000000000000000000000000000000000000000000612689565b611af17342000000000000000000000000000000000000247f0000000000000000000000000000000000000000000000000000000000000000612689565b611b2f7342000000000000000000000000000000000000257f0000000000000000000000000000000000000000000000000000000000000000612689565b611b6d7342000000000000000000000000000000000000207f0000000000000000000000000000000000000000000000000000000000000000612689565b611bab7342000000000000000000000000000000000000217f0000000000000000000000000000000000000000000000000000000000000000612689565b61059873420000000000000000000000000000000000002c7f0000000000000000000000000000000000000000000000000000000000000000612689565b6040517f204e1c7a00000000000000000000000000000000000000000000000000000000815273420000000000000000000000000000000000002d600482015260009081907342000000000000000000000000000000000000189063204e1c7a90602401602060405180830381865afa158015611c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8e919061332f565b90508073ffffffffffffffffffffffffffffffffffffffff163b600003611cb85750600092915050565b6040517f78ecabce0000000000000000000000000000000000000000000000000000000081526004810184905273420000000000000000000000000000000000002d906378ecabce90602401602060405180830381865afa158015611d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4591906132eb565b9392505050565b611d6d60408051606081018252600080825260208201819052909182015290565b60008273ffffffffffffffffffffffffffffffffffffffff1663d0e12f906040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611df4575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611df19181019061355a565b60015b611e0057506000611e03565b90505b600083905060405180606001604052808273ffffffffffffffffffffffffffffffffffffffff16630d9019e16040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e82919061332f565b73ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1663d3e5792b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0c919061334c565b8152602001836001811115611f2357611f236134c2565b9052949350505050565b611f368661295c565b611f89576040517fc3fe4a6600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526024015b60405180910390fd5b6040517f204e1c7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526000907342000000000000000000000000000000000000189063204e1c7a90602401602060405180830381865afa15801561200a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202e919061332f565b905073ffffffffffffffffffffffffffffffffffffffff81163b1580159061217b575061217b8773ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa15801561209f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526120e59190810190613426565b8773ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa158015612130573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526121769190810190613426565b6129a5565b156121ca576040517ff8ce5d1600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88166004820152602401611f80565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152881690633659cfe690602401600060405180830381600087803b15801561223357600080fd5b505af1158015612247573d6000803e3d6000fd5b507ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0092505050838114801561227e575060ff831615155b156122b5576040517f10415a2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808414612449576040517fa6ed563e0000000000000000000000000000000000000000000000000000000081526004810185905260009073ffffffffffffffffffffffffffffffffffffffff8a169063a6ed563e90602401602060405180830381865afa15801561232a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234e919061334c565b905061235b8460016135aa565b6123699060ff1660086135cf565b81901c60ff16156123a6576040517fc996d78400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006123b660ff861660086135cf565b6040517f4e91db080000000000000000000000000000000000000000000000000000000081526004810188905260ff90911b198381166024830152915073ffffffffffffffffffffffffffffffffffffffff8b1690634e91db0890604401600060405180830381600087803b15801561242e57600080fd5b505af1158015612442573d6000803e3d6000fd5b5050505050505b6040517fa6ed563e0000000000000000000000000000000000000000000000000000000081526004810182905260009073ffffffffffffffffffffffffffffffffffffffff8a169063a6ed563e90602401602060405180830381865afa1580156124b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124db919061334c565b905060ff604082901c161561251c576040517fc996d78400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f4e91db08000000000000000000000000000000000000000000000000000000008152600481018390527fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008216602482015273ffffffffffffffffffffffffffffffffffffffff8a1690634e91db0890604401600060405180830381600087803b1580156125ac57600080fd5b505af11580156125c0573d6000803e3d6000fd5b50506040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c169250634f1ef2869150612618908b908a9060040161360c565b6000604051808303816000875af1158015612637573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261267d9190810190613426565b50505050505050505050565b6126928261295c565b6126e0576040517fc3fe4a6600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401611f80565b6040517f204e1c7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526000907342000000000000000000000000000000000000189063204e1c7a90602401602060405180830381865afa158015612761573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612785919061332f565b905073ffffffffffffffffffffffffffffffffffffffff81163b1580159061288757506128878373ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa1580156127f6573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261283c9190810190613426565b8373ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa158015612130573d6000803e3d6000fd5b156128d6576040517ff8ce5d1600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401611f80565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe690602401600060405180830381600087803b15801561293f57600080fd5b505af1158015612953573d6000803e3d6000fd5b50505050505050565b60007208400000000000000000000000000000000000600b83901c721fffffffffffffffffffffffffffffffffffff1614801561299f575061299d826129cb565b155b92915050565b60006129b18383612a33565b158015611d4557506129c38383612a83565b159392505050565b600073ffffffffffffffffffffffffffffffffffffffff8216734200000000000000000000000000000000000042148061299f575073ffffffffffffffffffffffffffffffffffffffff82167342000000000000000000000000000000000000061492915050565b600080612a3f84612af8565b90506000612a4c84612af8565b80518351919250148015612a67575080602001518260200151145b8015612a7a575080604001518260400151145b95945050505050565b600080612a8f84612af8565b90506000612a9c84612af8565b805183519192501180612ac2575080518251148015612ac2575080602001518260200151105b80612a7a575080518251148015612ae0575080602001518260200151145b8015612a7a5750604090810151910151109392505050565b612b1c60405180606001604052806000815260200160008152602001600081525090565b6000612b5d836040518060400160405280600181526020017f2e00000000000000000000000000000000000000000000000000000000000000815250612cc4565b9050600381511015612b9b576040517f9eda858c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612bf682600281518110612bb357612bb361363b565b60200260200101516040518060400160405280600181526020017f2d00000000000000000000000000000000000000000000000000000000000000815250612cc4565b90506000612c5382600081518110612c1057612c1061363b565b60200260200101516040518060400160405280600181526020017f2b00000000000000000000000000000000000000000000000000000000000000815250612cc4565b90506040518060600160405280612c8385600081518110612c7657612c7661363b565b6020026020010151612d6f565b8152602001612c9e85600181518110612c7657612c7661363b565b8152602001612cb983600081518110612c7657612c7661363b565b905295945050505050565b60606000612cd28484612de7565b9050601f1960208201600183510160051b81018651838201526001845101845260005b825160608452818114612d3a5760405182820380825286601f8201165b8b850181015183820152870180612d125750600082820160200152603f018616810160405284525b875160209490940193019050818310612cf557505050508091508251612d6857602081019150600281510382525b5092915050565b80516000907f1999999999999999999999999999999999999999999999999999999999999999825b600181019050603060ff82870151160382851185600a028281019650600983118188108317171586029550505050828110612d9757505080612de15763101827966000526004601cfd5b50919050565b606082518251818111612ecc576020850194506020840193506020604051019250846001828488010301600060208410612e2057508286205b601f841660200360031b87515b8951818118831c612e82578315612e605783878c2014612e605760018b019a50848b10612e5a5750612e91565b50612e2d565b858b038952998601996020909801978615612e8257848b10612e5a5750612e91565b5060018a019950838a10612e2d575b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08189030160051c8152602090970190525050505b505092915050565b604080516101c08101825260006101a08201818152825282516020808201855282825280840191909152835180820185528281528385015283518082018552828152606084015283518085019094528184528301529060808201908152602001612f5560408051606081018252600080825260208201819052909182015290565b8152602001612f7b60408051606081018252600080825260208201819052909182015290565b8152602001612fa160408051606081018252600080825260208201819052909182015290565b8152602001612fc760408051606081018252600080825260208201819052909182015290565b8152604080516060808201835260008252602082810182905292820152910190815260408051602081810190925260008152910190815260006020820181905260409091015290565b60005b8381101561302b578181015183820152602001613013565b8381111561303a576000848401525b50505050565b60008151808452613058816020860160208601613010565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611d456020830184613040565b815173ffffffffffffffffffffffffffffffffffffffff168152610360810160208301516130e3602084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604083015161310b604084018273ffffffffffffffffffffffffffffffffffffffff169052565b506060830151613133606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50608083015161315b608084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060a083015161318360a084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060c08301516131ab60c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060e08301516131d360e084018273ffffffffffffffffffffffffffffffffffffffff169052565b506101008381015173ffffffffffffffffffffffffffffffffffffffff90811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501518216908401526101e08085015182169084015261020080850151821690840152610220808501518216908401526102408085015182169084015261026080850151821690840152610280808501518216908401526102a0808501518216908401526102c0808501518216908401526102e0808501518216908401526103008085015182169084015261032080850151821690840152610340808501519182168185015290612ecc565b6000602082840312156132fd57600080fd5b81518015158114611d4557600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461059857600080fd5b60006020828403121561334157600080fd5b8151611d458161330d565b60006020828403121561335e57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff808411156133af576133af613365565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156133f5576133f5613365565b8160405280935085815286868601111561340e57600080fd5b61341c866020830187613010565b5050509392505050565b60006020828403121561343857600080fd5b815167ffffffffffffffff81111561344f57600080fd5b8201601f8101841361346057600080fd5b61346f84825160208401613394565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006134a66060830185613040565b82810360408401526134b88185613040565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8416815260208101839052606081016002831061354c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b826040830152949350505050565b60006020828403121561356c57600080fd5b815160028110611d4557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060ff821660ff84168060ff038211156135c7576135c761357b565b019392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156136075761360761357b565b500290565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600061346f6040830184613040565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080f000a0000000000000000000000002a5a3eabb9fd571a3af0299eebdf8eaafe29a914000000000000000000000000250af3f400cf8aac8d410c90f1ba3968dd87df96000000000000000000000000547d0fba434877d7237d511cf87fabe2ee26b152000000000000000000000000ac8538a2e6a1f5dfbb1c4b8bd97cefb2997824a8000000000000000000000000b178cdaa8336f25624a63c049edb5af7ca36c2da000000000000000000000000c053fc0155bf8bda5b568af53276e538f0ea4d58000000000000000000000000716ead0cf3e7ff86a02d4f8cb41a6d14922fa8330000000000000000000000006a97c5d55a21265326150efe12fc30fb21cbff56000000000000000000000000a0734858ba5085ff6db493021a0f8c54605c2cda00000000000000000000000027e51b2254433a3284d9ba73ea551c397db2a124000000000000000000000000a0f4ffff79a0a3e039fcbef738751efba8e84f96000000000000000000000000f43862b9d814bb4504158ceccb0b74b31265e4ee000000000000000000000000893c2ceeb71d38514daf67728d3ff1b213fc4b5f000000000000000000000000f7bed7215eef1003fac426682cf2edeb958569f7000000000000000000000000f7bed7215eef1003fac426682cf2edeb958569f7000000000000000000000000eddf416c7159387cc6df3015700f79cfb891137300000000000000000000000070de55bc0bfbc52c5d0cca1da5816c2428886a34000000000000000000000000bec660b456b84a081e90af29be43385bda5bf7b600000000000000000000000093a8a7a9c98cb998d88dba3373a6c7f8ee2e8a4600000000000000000000000037dc2fe754052a9fac35f17282599fafbeb9f423000000000000000000000000784f1fae11f1c3a9c413423fe1b370a3636b8d560000000000000000000000002f76618143d9d2731c56778192d3893864b423d7000000000000000000000000dda87ef358082ab3f4ba8982290c671efdc4d1590000000000000000000000008256398a687e740006098445b05d5ca46b7be21e0000000000000000000000008684ccc5bf484ec242dbc7119004a83533934a79000000000000000000000000906835344844979ffd3a752eaa23728d513db00b000000000000000000000000e35b194efc4907f383b7e3b87f4c2c339ce239f600000000000000000000000000000000000000000000000000000000000000", "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", "gasLimit": 4500000, "intent": "Deploy L2ContractsManager Implementation", "to": "0x420000000000000000000000000000000000002C" }, { - "data": "0x7c36f37e000000000000000000000000df0d121c320033c374d353840ea383277cae0705", + "data": "0x7c36f37e000000000000000000000000cf5cf54c30461cc4447c5b6b058542947d6817b4", "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", "gasLimit": 3000000, "intent": "L2ProxyAdmin Upgrade Predeploys", diff --git a/packages/contracts-bedrock/src/L2/L2ContractsManager.sol b/packages/contracts-bedrock/src/L2/L2ContractsManager.sol index 4fa2d589c68f6..373fdfb8a8fe3 100644 --- a/packages/contracts-bedrock/src/L2/L2ContractsManager.sol +++ b/packages/contracts-bedrock/src/L2/L2ContractsManager.sol @@ -35,8 +35,8 @@ contract L2ContractsManager is ISemver { error L2ContractsManager_FeatureFlagMismatch(); /// @notice The semantic version of the L2ContractsManager contract. - /// @custom:semver 1.5.0 - string public constant version = "1.5.0"; + /// @custom:semver 1.6.0 + string public constant version = "1.6.0"; /// @notice The address of this contract. Used to enforce that the upgrade function is only /// called via DELEGATECALL.