diff --git a/packages/contracts-bedrock/scripts/L2Genesis.s.sol b/packages/contracts-bedrock/scripts/L2Genesis.s.sol index f85e2a91f8c16..09aa4bdda930e 100644 --- a/packages/contracts-bedrock/scripts/L2Genesis.s.sol +++ b/packages/contracts-bedrock/scripts/L2Genesis.s.sol @@ -228,9 +228,9 @@ contract L2Genesis is Script { for (uint256 i = 0; i < Predeploys.PREDEPLOY_COUNT; i++) { address addr = address(prefix | uint160(i)); - if (Predeploys.notProxied(addr)) { - continue; - } + + // Non-proxied predeploys are excluded from proxy setup. + if (Predeploys.notProxied(addr)) continue; vm.etch(addr, code); EIP1967Helper.setAdmin(addr, Predeploys.PROXY_ADMIN); @@ -257,9 +257,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 +268,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 +533,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 +557,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 +584,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 +603,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 +617,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/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..0ee3575ac7599 100644 --- a/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol +++ b/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol @@ -37,11 +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 args ABI-encoded constructor arguments. + /// @param artifactPath Forge artifact path (e.g., "MyContract.sol:MyContract"). struct ImplementationConfig { address implementation; uint64 deploymentGasLimit; @@ -55,16 +54,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 +109,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 +120,33 @@ 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. + 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 +218,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 +230,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 +245,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 ) @@ -243,16 +261,12 @@ contract GenerateNUTBundle is Script { /// via ConditionalDeployer.deploy(), which ensures idempotent deployments. /// @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 +280,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 +305,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 +320,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,265 +344,78 @@ 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") }); } - /// @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. - function _buildImplementationDeploymentConfigs() internal { + /// @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["StorageSetter"] = 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 - ) - }); - // 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 - ) - }); - // 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 - ) - }); - // 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 - ) - }); - // 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 - ) - }); - // 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) - }); - // 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) - }); - // 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 - ) - }); - // 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(_makeConfig("StorageSetter", "StorageSetter.sol:StorageSetter", 500_000)); - // 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 - ) - }); - // 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) - }); - // 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) - }); - // 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) - }); - // 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 - ) - }); - // 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 - ) - }); - // 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) - }); - // 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) - }); - // 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 - ) - }); - // 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 - ) - }); - // 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) - }); - // 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 - ) - }); - // 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 - ) - }); - // 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) - }); - // 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 - ) + Predeploys.PredeployRecord[] memory records = Predeploys.getUpgradeableRecords(); + for (uint256 i = 0; i < records.length; i++) { + _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. + /// @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/semver-lock.json b/packages/contracts-bedrock/snapshots/semver-lock.json index fd36e74fa98d8..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": "0xc10e87311ed3cc3ffa1bfe65d9612a668b6fb3c1236d2cc6d792b8b628c61d6b", - "sourceCodeHash": "0xcfb64a58770d22187781a271f078fe1080ad43d4229ff4dd132f0db3fe9b86b3" + "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 9a75d36666995..92978366eff26 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", @@ -136,20 +150,6 @@ "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 +179,31 @@ "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": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000005d8608060405234801561001057600080fd5b506105b8806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806354fd4d5014610046578063cdcb760a14610098578063e0145f5c146100d0575b600080fd5b6100826040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161008f91906103f7565b60405180910390f35b6100ab6100a6366004610440565b6100ea565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161008f565b734e59b44847b379578588920ca78fbf26c0b4956c6100ab565b8051602080830191909120604080517fff00000000000000000000000000000000000000000000000000000000000000818501527f4e59b44847b379578588920ca78fbf26c0b4956c000000000000000000000000602182015260358101869052605580820184905282518083039091018152607590910190915280519201919091206000919073ffffffffffffffffffffffffffffffffffffffff81163b156101d85760405173ffffffffffffffffffffffffffffffffffffffff8216907ffbe57d889a7f75a4e0c7da304cd158fcaddc4b925cdd9f4cfb115c0f9e48009b90600090a291506103779050565b600080734e59b44847b379578588920ca78fbf26c0b4956c73ffffffffffffffffffffffffffffffffffffffff168787604051602001610219929190610519565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526102519161053f565b6000604051808303816000865af19150503d806000811461028e576040519150601f19603f3d011682016040523d82523d6000602084013e610293565b606091505b5091509150806102a29061055b565b60601c94508115806102e057508273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561032257806040517fcb0fc6f700000000000000000000000000000000000000000000000000000000815260040161031991906103f7565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff167f9b7318127ed899f286ea9ddd7925ed8ad24a682b6a825c3b5b3d88a3f00bc1d28860405161036a91815260200190565b60405180910390a2505050505b92915050565b60005b83811015610398578181015183820152602001610380565b838111156103a7576000848401525b50505050565b600081518084526103c581602086016020860161037d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061040a60208301846103ad565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561045357600080fd5b82359150602083013567ffffffffffffffff8082111561047257600080fd5b818501915085601f83011261048657600080fd5b81358181111561049857610498610411565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104de576104de610411565b816040528281528860208487010111156104f757600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b8281526000825161053181602085016020870161037d565b919091016020019392505050565b6000825161055181846020870161037d565b9190910192915050565b6000815160208301517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808216935060148310156105a35780818460140360031b1b83161693505b50505091905056fea164736f6c634300080f000a0000000000000000", "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", - "gasLimit": 1400000, - "intent": "Deploy LiquidityController Implementation", + "gasLimit": 600000, + "intent": "Deploy ConditionalDeployer Implementation", "to": "0x420000000000000000000000000000000000002C" }, { - "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca40000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000036d608060405234801561001057600080fd5b5061034d806100206000396000f3fe6080604052600436106100345760003560e01c80632e1a7d4d1461003957806354fd4d501461005b578063d0e30db0146100ba575b600080fd5b34801561004557600080fd5b5061005961005436600461025b565b6100c2565b005b34801561006757600080fd5b506100a46040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100b19190610274565b60405180910390f35b6100596101cb565b3373420000000000000000000000000000000000002a1461010f576040517f565369fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b47811115610149576040517f7b7f21e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80336040516101579061024f565b73ffffffffffffffffffffffffffffffffffffffff90911681526020016040518091039082f0905080158015610191573d6000803e3d6000fd5b505060405181815233907fb1cce8684b4ffa8667b4577654e61ee3480d661ee9c27522ac80e211f6bd4d259060200160405180910390a250565b3373420000000000000000000000000000000000002a14610218576040517f565369fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405134815233907f7ff07ce9a287649537e4b012e45cf012d90228b12e2b56bb03515a6b5436fcdf9060200160405180910390a2565b6059806102e883390190565b60006020828403121561026d57600080fd5b5035919050565b600060208083528351808285015260005b818110156102a157858101830151858201604001528201610285565b818111156102b3576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01692909201604001939250505056fe608060405260405160593803806059833981016040819052601e91602a565b806001600160a01b0316ff5b600060208284031215603b57600080fd5b81516001600160a01b0381168114605157600080fd5b939250505056fea164736f6c634300080f000a00000000000000000000000000000000000000", + "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000283608060405234801561001057600080fd5b50610263806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80631bec9d65146100515780631d8a4e921461006657806354fd4d501461009b57806378ecabce146100e4575b600080fd5b61006461005f3660046101ca565b610107565b005b7fc8bc8f9195cfb2d040744aac63412d02ffc186ea9bd519039edc4666ee9032bc546040519081526020015b60405180910390f35b6100d76040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161009291906101e3565b6100f76100f23660046101ca565b610178565b6040519015158152602001610092565b3373deaddeaddeaddeaddeaddeaddeaddeaddead000114610154576040517fee37fa8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8bc8f9195cfb2d040744aac63412d02ffc186ea9bd519039edc4666ee9032bc55565b60006101ab6101a57fc8bc8f9195cfb2d040744aac63412d02ffc186ea9bd519039edc4666ee9032bc5490565b836101b1565b92915050565b600081158015906101c3575081828416145b9392505050565b6000602082840312156101dc57600080fd5b5035919050565b600060208083528351808285015260005b81811015610210578581018301518582016040015282016101f4565b81811115610222576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01692909201604001939250505056fea164736f6c634300080f000a0000000000000000000000000000000000000000000000000000000000", "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", - "gasLimit": 400000, - "intent": "Deploy NativeAssetLiquidity Implementation", + "gasLimit": 260000, + "intent": "Deploy L2DevFeatureFlags Implementation", "to": "0x420000000000000000000000000000000000002C" }, { @@ -214,14 +214,14 @@ "to": "0x4200000000000000000000000000000000000018" }, { - "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000003f6c6104006040523480156200001257600080fd5b5060405162003c0c38038062003c0c8339810160408190526200003591620001d4565b30608090815281516001600160a01b0390811660a09081526020840151821660e09081526040850151831660c0908152606086015184166101009081529486015184166101209081529286015184166101409081529086015184166101609081529186015184166101809081529486015184166101a09081529286015184166101c09081529086015184166101e09081529186015184166102009081529486015184166102209081529286015184166102409081529086015184166102609081529186015184166102809081529486015184166102a09081529286015184166102c09081529086015184166102e090815291860151841661030090815294860151841661032090815292860151841661034090815290860151841661036052908501518316610380529284015182166103a05283015181166103c052910151166103e05262000407565b60405161036081016001600160401b0381118282101715620001b157634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b0381168114620001cf57600080fd5b919050565b60006103608284031215620001e857600080fd5b620001f26200017f565b620001fd83620001b7565b81526200020d60208401620001b7565b60208201526200022060408401620001b7565b60408201526200023360608401620001b7565b60608201526200024660808401620001b7565b60808201526200025960a08401620001b7565b60a08201526200026c60c08401620001b7565b60c08201526200027f60e08401620001b7565b60e082015261010062000294818501620001b7565b90820152610120620002a8848201620001b7565b90820152610140620002bc848201620001b7565b90820152610160620002d0848201620001b7565b90820152610180620002e4848201620001b7565b908201526101a0620002f8848201620001b7565b908201526101c06200030c848201620001b7565b908201526101e062000320848201620001b7565b9082015261020062000334848201620001b7565b9082015261022062000348848201620001b7565b908201526102406200035c848201620001b7565b9082015261026062000370848201620001b7565b9082015261028062000384848201620001b7565b908201526102a062000398848201620001b7565b908201526102c0620003ac848201620001b7565b908201526102e0620003c0848201620001b7565b90820152610300620003d4848201620001b7565b90820152610320620003e8848201620001b7565b90820152610340620003fc848201620001b7565b908201529392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516103a0516103c0516103e0516135c26200064a600039600081816104d801526119530152600081816104af0152611b10015260008181610486015261145301526000818161045d015261130501526000818161043401526113ec01526000818161040b0152611a560152600081816103e20152611a180152600081816103b901526119da015260008181610390015261199c0152600081816103670152611ad201526000818161033e0152611a9401526000818161031501526116e90152600081816102ec01526116690152600081816102c301526115ea01526000818161029a0152611915015260008181610271015261120501526000818161024801526118d701526000818161021f01526118b10152600081816101f601526117c00152600081816101ce015261179a0152600081816101a601526110e101526000818161017e015261116d01526000818161015601526114cd01526000818161012e0152610fdb01526000818160df0152610ed5015260008181610107015261175201526000818160ba01528181610ef701528181610ffd015281816111030152818161118f015281816112270152818161132701528181611475015281816114ef0152818161160c0152818161168b015261170b0152600061052b01526135c26000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806354fd4d5014610046578063615f64fe14610098578063d55ec6971461050a575b600080fd5b6100826040518060400160405280600581526020017f312e352e3000000000000000000000000000000000000000000000000000000081525081565b60405161008f9190612fd5565b60405180910390f35b604080516103608101825273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811682527f0000000000000000000000000000000000000000000000000000000000000000811660208301527f00000000000000000000000000000000000000000000000000000000000000008116828401527f0000000000000000000000000000000000000000000000000000000000000000811660608301527f0000000000000000000000000000000000000000000000000000000000000000811660808301527f0000000000000000000000000000000000000000000000000000000000000000811660a08301527f0000000000000000000000000000000000000000000000000000000000000000811660c08301527f0000000000000000000000000000000000000000000000000000000000000000811660e08301527f000000000000000000000000000000000000000000000000000000000000000081166101008301527f000000000000000000000000000000000000000000000000000000000000000081166101208301527f000000000000000000000000000000000000000000000000000000000000000081166101408301527f000000000000000000000000000000000000000000000000000000000000000081166101608301527f000000000000000000000000000000000000000000000000000000000000000081166101808301527f000000000000000000000000000000000000000000000000000000000000000081166101a08301527f000000000000000000000000000000000000000000000000000000000000000081166101c08301527f000000000000000000000000000000000000000000000000000000000000000081166101e08301527f000000000000000000000000000000000000000000000000000000000000000081166102008301527f000000000000000000000000000000000000000000000000000000000000000081166102208301527f000000000000000000000000000000000000000000000000000000000000000081166102408301527f000000000000000000000000000000000000000000000000000000000000000081166102608301527f000000000000000000000000000000000000000000000000000000000000000081166102808301527f000000000000000000000000000000000000000000000000000000000000000081166102a08301527f000000000000000000000000000000000000000000000000000000000000000081166102c08301527f000000000000000000000000000000000000000000000000000000000000000081166102e08301527f000000000000000000000000000000000000000000000000000000000000000081166103008301527f000000000000000000000000000000000000000000000000000000000000000081166103208301527f000000000000000000000000000000000000000000000000000000000000000016610340820152905161008f9190612fe8565b610512610514565b005b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610583576040517fada337cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061058d61059b565b905061059881610e96565b50565b6105a3612e1f565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663213268496040518163ffffffff1660e01b8152600401602060405180830381865afa158015610602573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106269190613236565b15156101608201526040517f47af267b0000000000000000000000000000000000000000000000000000000081527f494e5445524f50000000000000000000000000000000000000000000000000006004820152734200000000000000000000000000000000000015906347af267b90602401602060405180830381865afa9250505080156106f0575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526106ed91810190613236565b60015b61070157600061018082015261070a565b15156101808201525b806101800151801561072357506107216001611b34565b155b1561075a576040517fa27dcc8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806020016040528073420000000000000000000000000000000000000773ffffffffffffffffffffffffffffffffffffffff16639fce812c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e8919061327a565b73ffffffffffffffffffffffffffffffffffffffff16905281526040805160208082018084527f7f46ddb200000000000000000000000000000000000000000000000000000000905291519091829173420000000000000000000000000000000000001091637f46ddb29160248086019291908187030181865afa158015610874573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610898919061327a565b73ffffffffffffffffffffffffffffffffffffffff168152508160200181905250604051806020016040528073420000000000000000000000000000000000001473ffffffffffffffffffffffffffffffffffffffff16637f46ddb26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610923573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610947919061327a565b73ffffffffffffffffffffffffffffffffffffffff168152508160400181905250604051806020016040528073420000000000000000000000000000000000001273ffffffffffffffffffffffffffffffffffffffff1663ee9a31a26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f6919061327a565b73ffffffffffffffffffffffffffffffffffffffff1690526060820152604080518082018083527fee9a31a2000000000000000000000000000000000000000000000000000000009052905181907342000000000000000000000000000000000000179063ee9a31a2906044808501916020918187030181865afa158015610a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa6919061327a565b73ffffffffffffffffffffffffffffffffffffffff16815260200173420000000000000000000000000000000000001773ffffffffffffffffffffffffffffffffffffffff16637d1d0c5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b449190613297565b90526080820152610b68734200000000000000000000000000000000000011611c97565b60a0820152610b8a734200000000000000000000000000000000000019611c97565b60c0820152610bac73420000000000000000000000000000000000001a611c97565b60e0820152610bce73420000000000000000000000000000000000001b611c97565b61010082015261016081015115610dbe57600073420000000000000000000000000000000000002a905060405180606001604052808273ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c72919061327a565b73ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1663d84447156040518163ffffffff1660e01b8152600401600060405180830381865afa158015610cd8573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610d1e9190810190613371565b81526020018273ffffffffffffffffffffffffffffffffffffffff1663550fcdc96040518163ffffffff1660e01b8152600401600060405180830381865afa158015610d6e573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610db49190810190613371565b9052610120830152505b600073420000000000000000000000000000000000002b73ffffffffffffffffffffffffffffffffffffffff1663d61a398b6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610e59575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610e569181019061327a565b60015b610e6557506000610e68565b90505b604080516020810190915273ffffffffffffffffffffffffffffffffffffffff909116815261014082015290565b80515160405173ffffffffffffffffffffffffffffffffffffffff9091166024820152610f9990734200000000000000000000000000000000000007907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de80000000000000000000000000000000000000000000000000000000017905260006014611e78565b60208101515160405173ffffffffffffffffffffffffffffffffffffffff909116602482015261109f90734200000000000000000000000000000000000010907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906044015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052600080611e78565b60408082015151905173ffffffffffffffffffffffffffffffffffffffff909116602482015261112b90734200000000000000000000000000000000000014907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401611021565b60608101515160405173ffffffffffffffffffffffffffffffffffffffff90911660248201526111b790734200000000000000000000000000000000000012907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401611021565b6080810151805160209091015160405173ffffffffffffffffffffffffffffffffffffffff909216602483015260448201526112c990734200000000000000000000000000000000000017907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090606401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcd6dc6870000000000000000000000000000000000000000000000000000000017905260016000611e78565b80610160015115611410576101208101518051602082015160409283015192516113d29373420000000000000000000000000000000000002a937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361135493906024016133c2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f9065714700000000000000000000000000000000000000000000000000000000179052600080611e78565b6114107342000000000000000000000000000000000000297f00000000000000000000000000000000000000000000000000000000000000006125d4565b6101408101515160405173ffffffffffffffffffffffffffffffffffffffff909116602482015261149d9073420000000000000000000000000000000000002b907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401611021565b60a08101518051602082015160409283015192516115ba93734200000000000000000000000000000000000011937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361151c939060240161343c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb49dc741000000000000000000000000000000000000000000000000000000001790527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006000611e78565b60c081015180516020820151604092830151925161163993734200000000000000000000000000000000000019937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361151c939060240161343c565b60e08101518051602082015160409283015192516116b89373420000000000000000000000000000000000001a937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361151c939060240161343c565b6101008101518051602082015160409283015192516117389373420000000000000000000000000000000000001b937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361151c939060240161343c565b61177673420000000000000000000000000000000000000f7f00000000000000000000000000000000000000000000000000000000000000006125d4565b6117e47342000000000000000000000000000000000000158261016001516117be577f00000000000000000000000000000000000000000000000000000000000000006125d4565b7f00000000000000000000000000000000000000000000000000000000000000006125d4565b8061016001511561188d576040517f46a4d7800000000000000000000000000000000000000000000000000000000081527f435553544f4d5f4741535f544f4b454e000000000000000000000000000000006004820152734200000000000000000000000000000000000015906346a4d78090602401600060405180830381600087803b15801561187457600080fd5b505af1158015611888573d6000803e3d6000fd5b505050505b6118fb7342000000000000000000000000000000000000168261016001516118d5577f00000000000000000000000000000000000000000000000000000000000000006125d4565b7f00000000000000000000000000000000000000000000000000000000000000006125d4565b6119397342000000000000000000000000000000000000187f00000000000000000000000000000000000000000000000000000000000000006125d4565b61197773420000000000000000000000000000000000002d7f00000000000000000000000000000000000000000000000000000000000000006125d4565b80610180015115611a7a576119c07342000000000000000000000000000000000000227f00000000000000000000000000000000000000000000000000000000000000006125d4565b6119fe7342000000000000000000000000000000000000237f00000000000000000000000000000000000000000000000000000000000000006125d4565b611a3c7342000000000000000000000000000000000000247f00000000000000000000000000000000000000000000000000000000000000006125d4565b611a7a7342000000000000000000000000000000000000257f00000000000000000000000000000000000000000000000000000000000000006125d4565b611ab87342000000000000000000000000000000000000207f00000000000000000000000000000000000000000000000000000000000000006125d4565b611af67342000000000000000000000000000000000000217f00000000000000000000000000000000000000000000000000000000000000006125d4565b61059873420000000000000000000000000000000000002c7f00000000000000000000000000000000000000000000000000000000000000006125d4565b6040517f204e1c7a00000000000000000000000000000000000000000000000000000000815273420000000000000000000000000000000000002d600482015260009081907342000000000000000000000000000000000000189063204e1c7a90602401602060405180830381865afa158015611bb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd9919061327a565b90508073ffffffffffffffffffffffffffffffffffffffff163b600003611c035750600092915050565b6040517f78ecabce0000000000000000000000000000000000000000000000000000000081526004810184905273420000000000000000000000000000000000002d906378ecabce90602401602060405180830381865afa158015611c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c909190613236565b9392505050565b611cb860408051606081018252600080825260208201819052909182015290565b60008273ffffffffffffffffffffffffffffffffffffffff1663d0e12f906040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611d3f575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611d3c918101906134a5565b60015b611d4b57506000611d4e565b90505b600083905060405180606001604052808273ffffffffffffffffffffffffffffffffffffffff16630d9019e16040518163ffffffff1660e01b8152600401602060405180830381865afa158015611da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dcd919061327a565b73ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1663d3e5792b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e579190613297565b8152602001836001811115611e6e57611e6e61340d565b9052949350505050565b611e81866128a7565b611ed4576040517fc3fe4a6600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526024015b60405180910390fd5b6040517f204e1c7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526000907342000000000000000000000000000000000000189063204e1c7a90602401602060405180830381865afa158015611f55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f79919061327a565b905073ffffffffffffffffffffffffffffffffffffffff81163b158015906120c657506120c68773ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa158015611fea573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526120309190810190613371565b8773ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa15801561207b573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526120c19190810190613371565b6128f0565b15612115576040517ff8ce5d1600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88166004820152602401611ecb565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152881690633659cfe690602401600060405180830381600087803b15801561217e57600080fd5b505af1158015612192573d6000803e3d6000fd5b507ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009250505083811480156121c9575060ff831615155b15612200576040517f10415a2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808414612394576040517fa6ed563e0000000000000000000000000000000000000000000000000000000081526004810185905260009073ffffffffffffffffffffffffffffffffffffffff8a169063a6ed563e90602401602060405180830381865afa158015612275573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122999190613297565b90506122a68460016134f5565b6122b49060ff16600861351a565b81901c60ff16156122f1576040517fc996d78400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061230160ff8616600861351a565b6040517f4e91db080000000000000000000000000000000000000000000000000000000081526004810188905260ff90911b198381166024830152915073ffffffffffffffffffffffffffffffffffffffff8b1690634e91db0890604401600060405180830381600087803b15801561237957600080fd5b505af115801561238d573d6000803e3d6000fd5b5050505050505b6040517fa6ed563e0000000000000000000000000000000000000000000000000000000081526004810182905260009073ffffffffffffffffffffffffffffffffffffffff8a169063a6ed563e90602401602060405180830381865afa158015612402573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124269190613297565b905060ff604082901c1615612467576040517fc996d78400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f4e91db08000000000000000000000000000000000000000000000000000000008152600481018390527fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008216602482015273ffffffffffffffffffffffffffffffffffffffff8a1690634e91db0890604401600060405180830381600087803b1580156124f757600080fd5b505af115801561250b573d6000803e3d6000fd5b50506040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c169250634f1ef2869150612563908b908a90600401613557565b6000604051808303816000875af1158015612582573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526125c89190810190613371565b50505050505050505050565b6125dd826128a7565b61262b576040517fc3fe4a6600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401611ecb565b6040517f204e1c7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526000907342000000000000000000000000000000000000189063204e1c7a90602401602060405180830381865afa1580156126ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d0919061327a565b905073ffffffffffffffffffffffffffffffffffffffff81163b158015906127d257506127d28373ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa158015612741573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526127879190810190613371565b8373ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa15801561207b573d6000803e3d6000fd5b15612821576040517ff8ce5d1600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401611ecb565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe690602401600060405180830381600087803b15801561288a57600080fd5b505af115801561289e573d6000803e3d6000fd5b50505050505050565b60007208400000000000000000000000000000000000600b83901c721fffffffffffffffffffffffffffffffffffff161480156128ea57506128e882612916565b155b92915050565b60006128fc838361297e565b158015611c90575061290e83836129ce565b159392505050565b600073ffffffffffffffffffffffffffffffffffffffff821673420000000000000000000000000000000000004214806128ea575073ffffffffffffffffffffffffffffffffffffffff82167342000000000000000000000000000000000000061492915050565b60008061298a84612a43565b9050600061299784612a43565b805183519192501480156129b2575080602001518260200151145b80156129c5575080604001518260400151145b95945050505050565b6000806129da84612a43565b905060006129e784612a43565b805183519192501180612a0d575080518251148015612a0d575080602001518260200151105b806129c5575080518251148015612a2b575080602001518260200151145b80156129c55750604090810151910151109392505050565b612a6760405180606001604052806000815260200160008152602001600081525090565b6000612aa8836040518060400160405280600181526020017f2e00000000000000000000000000000000000000000000000000000000000000815250612c0f565b9050600381511015612ae6576040517f9eda858c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612b4182600281518110612afe57612afe613586565b60200260200101516040518060400160405280600181526020017f2d00000000000000000000000000000000000000000000000000000000000000815250612c0f565b90506000612b9e82600081518110612b5b57612b5b613586565b60200260200101516040518060400160405280600181526020017f2b00000000000000000000000000000000000000000000000000000000000000815250612c0f565b90506040518060600160405280612bce85600081518110612bc157612bc1613586565b6020026020010151612cba565b8152602001612be985600181518110612bc157612bc1613586565b8152602001612c0483600081518110612bc157612bc1613586565b905295945050505050565b60606000612c1d8484612d32565b9050601f1960208201600183510160051b81018651838201526001845101845260005b825160608452818114612c855760405182820380825286601f8201165b8b850181015183820152870180612c5d5750600082820160200152603f018616810160405284525b875160209490940193019050818310612c4057505050508091508251612cb357602081019150600281510382525b5092915050565b80516000907f1999999999999999999999999999999999999999999999999999999999999999825b600181019050603060ff82870151160382851185600a028281019650600983118188108317171586029550505050828110612ce257505080612d2c5763101827966000526004601cfd5b50919050565b606082518251818111612e17576020850194506020840193506020604051019250846001828488010301600060208410612d6b57508286205b601f841660200360031b87515b8951818118831c612dcd578315612dab5783878c2014612dab5760018b019a50848b10612da55750612ddc565b50612d78565b858b038952998601996020909801978615612dcd57848b10612da55750612ddc565b5060018a019950838a10612d78575b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08189030160051c8152602090970190525050505b505092915050565b604080516101c08101825260006101a08201818152825282516020808201855282825280840191909152835180820185528281528385015283518082018552828152606084015283518085019094528184528301529060808201908152602001612ea060408051606081018252600080825260208201819052909182015290565b8152602001612ec660408051606081018252600080825260208201819052909182015290565b8152602001612eec60408051606081018252600080825260208201819052909182015290565b8152602001612f1260408051606081018252600080825260208201819052909182015290565b8152604080516060808201835260008252602082810182905292820152910190815260408051602081810190925260008152910190815260006020820181905260409091015290565b60005b83811015612f76578181015183820152602001612f5e565b83811115612f85576000848401525b50505050565b60008151808452612fa3816020860160208601612f5b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611c906020830184612f8b565b815173ffffffffffffffffffffffffffffffffffffffff1681526103608101602083015161302e602084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040830151613056604084018273ffffffffffffffffffffffffffffffffffffffff169052565b50606083015161307e606084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060808301516130a6608084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060a08301516130ce60a084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060c08301516130f660c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060e083015161311e60e084018273ffffffffffffffffffffffffffffffffffffffff169052565b506101008381015173ffffffffffffffffffffffffffffffffffffffff90811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501518216908401526101e08085015182169084015261020080850151821690840152610220808501518216908401526102408085015182169084015261026080850151821690840152610280808501518216908401526102a0808501518216908401526102c0808501518216908401526102e0808501518216908401526103008085015182169084015261032080850151821690840152610340808501519182168185015290612e17565b60006020828403121561324857600080fd5b81518015158114611c9057600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461059857600080fd5b60006020828403121561328c57600080fd5b8151611c9081613258565b6000602082840312156132a957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff808411156132fa576132fa6132b0565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715613340576133406132b0565b8160405280935085815286868601111561335957600080fd5b613367866020830187612f5b565b5050509392505050565b60006020828403121561338357600080fd5b815167ffffffffffffffff81111561339a57600080fd5b8201601f810184136133ab57600080fd5b6133ba848251602084016132df565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006133f16060830185612f8b565b82810360408401526134038185612f8b565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff84168152602081018390526060810160028310613497577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b826040830152949350505050565b6000602082840312156134b757600080fd5b815160028110611c9057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060ff821660ff84168060ff03821115613512576135126134c6565b019392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613552576135526134c6565b500290565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015260006133ba6040830184612f8b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080f000a0000000000000000000000002a5a3eabb9fd571a3af0299eebdf8eaafe29a914000000000000000000000000250af3f400cf8aac8d410c90f1ba3968dd87df96000000000000000000000000547d0fba434877d7237d511cf87fabe2ee26b152000000000000000000000000ac8538a2e6a1f5dfbb1c4b8bd97cefb2997824a8000000000000000000000000b178cdaa8336f25624a63c049edb5af7ca36c2da000000000000000000000000c053fc0155bf8bda5b568af53276e538f0ea4d58000000000000000000000000716ead0cf3e7ff86a02d4f8cb41a6d14922fa8330000000000000000000000006a97c5d55a21265326150efe12fc30fb21cbff56000000000000000000000000a0734858ba5085ff6db493021a0f8c54605c2cda00000000000000000000000027e51b2254433a3284d9ba73ea551c397db2a124000000000000000000000000a0f4ffff79a0a3e039fcbef738751efba8e84f96000000000000000000000000f43862b9d814bb4504158ceccb0b74b31265e4ee000000000000000000000000893c2ceeb71d38514daf67728d3ff1b213fc4b5f000000000000000000000000f7bed7215eef1003fac426682cf2edeb958569f7000000000000000000000000f7bed7215eef1003fac426682cf2edeb958569f7000000000000000000000000eddf416c7159387cc6df3015700f79cfb891137300000000000000000000000070de55bc0bfbc52c5d0cca1da5816c2428886a34000000000000000000000000bec660b456b84a081e90af29be43385bda5bf7b600000000000000000000000093a8a7a9c98cb998d88dba3373a6c7f8ee2e8a4600000000000000000000000037dc2fe754052a9fac35f17282599fafbeb9f423000000000000000000000000784f1fae11f1c3a9c413423fe1b370a3636b8d560000000000000000000000002f76618143d9d2731c56778192d3893864b423d7000000000000000000000000dda87ef358082ab3f4ba8982290c671efdc4d1590000000000000000000000008256398a687e740006098445b05d5ca46b7be21e0000000000000000000000008684ccc5bf484ec242dbc7119004a83533934a79000000000000000000000000906835344844979ffd3a752eaa23728d513db00b000000000000000000000000e35b194efc4907f383b7e3b87f4c2c339ce239f60000000000000000000000000000000000000000", + "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000040216104006040523480156200001257600080fd5b5060405162003cc138038062003cc18339810160408190526200003591620001d4565b30608090815281516001600160a01b0390811660a09081526020840151821660e09081526040850151831660c0908152606086015184166101009081529486015184166101209081529286015184166101409081529086015184166101609081529186015184166101809081529486015184166101a09081529286015184166101c09081529086015184166101e09081529186015184166102009081529486015184166102209081529286015184166102409081529086015184166102609081529186015184166102809081529486015184166102a09081529286015184166102c09081529086015184166102e090815291860151841661030090815294860151841661032090815292860151841661034090815290860151841661036052908501518316610380529284015182166103a05283015181166103c052910151166103e05262000407565b60405161036081016001600160401b0381118282101715620001b157634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b0381168114620001cf57600080fd5b919050565b60006103608284031215620001e857600080fd5b620001f26200017f565b620001fd83620001b7565b81526200020d60208401620001b7565b60208201526200022060408401620001b7565b60408201526200023360608401620001b7565b60608201526200024660808401620001b7565b60808201526200025960a08401620001b7565b60a08201526200026c60c08401620001b7565b60c08201526200027f60e08401620001b7565b60e082015261010062000294818501620001b7565b90820152610120620002a8848201620001b7565b90820152610140620002bc848201620001b7565b90820152610160620002d0848201620001b7565b90820152610180620002e4848201620001b7565b908201526101a0620002f8848201620001b7565b908201526101c06200030c848201620001b7565b908201526101e062000320848201620001b7565b9082015261020062000334848201620001b7565b9082015261022062000348848201620001b7565b908201526102406200035c848201620001b7565b9082015261026062000370848201620001b7565b9082015261028062000384848201620001b7565b908201526102a062000398848201620001b7565b908201526102c0620003ac848201620001b7565b908201526102e0620003c0848201620001b7565b90820152610300620003d4848201620001b7565b90820152610320620003e8848201620001b7565b90820152610340620003fc848201620001b7565b908201529392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516103a0516103c0516103e0516136776200064a600039600081816104d80152611a080152600081816104af0152611bc5015260008181610486015261145301526000818161045d015261130501526000818161043401526113ec01526000818161040b0152611b0b0152600081816103e20152611acd0152600081816103b90152611a8f0152600081816103900152611a510152600081816103670152611b8701526000818161033e0152611b4901526000818161031501526116e90152600081816102ec01526116690152600081816102c301526115ea01526000818161029a01526119ca0152600081816102710152611205015260008181610248015261198c01526000818161021f01526119660152600081816101f601526117c00152600081816101ce015261179a0152600081816101a601526110e101526000818161017e015261116d01526000818161015601526114cd01526000818161012e0152610fdb01526000818160df0152610ed5015260008181610107015261175201526000818160ba01528181610ef701528181610ffd015281816111030152818161118f015281816112270152818161132701528181611475015281816114ef0152818161160c0152818161168b015261170b0152600061052b01526136776000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806354fd4d5014610046578063615f64fe14610098578063d55ec6971461050a575b600080fd5b6100826040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161008f919061308a565b60405180910390f35b604080516103608101825273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811682527f0000000000000000000000000000000000000000000000000000000000000000811660208301527f00000000000000000000000000000000000000000000000000000000000000008116828401527f0000000000000000000000000000000000000000000000000000000000000000811660608301527f0000000000000000000000000000000000000000000000000000000000000000811660808301527f0000000000000000000000000000000000000000000000000000000000000000811660a08301527f0000000000000000000000000000000000000000000000000000000000000000811660c08301527f0000000000000000000000000000000000000000000000000000000000000000811660e08301527f000000000000000000000000000000000000000000000000000000000000000081166101008301527f000000000000000000000000000000000000000000000000000000000000000081166101208301527f000000000000000000000000000000000000000000000000000000000000000081166101408301527f000000000000000000000000000000000000000000000000000000000000000081166101608301527f000000000000000000000000000000000000000000000000000000000000000081166101808301527f000000000000000000000000000000000000000000000000000000000000000081166101a08301527f000000000000000000000000000000000000000000000000000000000000000081166101c08301527f000000000000000000000000000000000000000000000000000000000000000081166101e08301527f000000000000000000000000000000000000000000000000000000000000000081166102008301527f000000000000000000000000000000000000000000000000000000000000000081166102208301527f000000000000000000000000000000000000000000000000000000000000000081166102408301527f000000000000000000000000000000000000000000000000000000000000000081166102608301527f000000000000000000000000000000000000000000000000000000000000000081166102808301527f000000000000000000000000000000000000000000000000000000000000000081166102a08301527f000000000000000000000000000000000000000000000000000000000000000081166102c08301527f000000000000000000000000000000000000000000000000000000000000000081166102e08301527f000000000000000000000000000000000000000000000000000000000000000081166103008301527f000000000000000000000000000000000000000000000000000000000000000081166103208301527f000000000000000000000000000000000000000000000000000000000000000016610340820152905161008f919061309d565b610512610514565b005b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610583576040517fada337cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061058d61059b565b905061059881610e96565b50565b6105a3612ed4565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663213268496040518163ffffffff1660e01b8152600401602060405180830381865afa158015610602573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062691906132eb565b15156101608201526040517f47af267b0000000000000000000000000000000000000000000000000000000081527f494e5445524f50000000000000000000000000000000000000000000000000006004820152734200000000000000000000000000000000000015906347af267b90602401602060405180830381865afa9250505080156106f0575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526106ed918101906132eb565b60015b61070157600061018082015261070a565b15156101808201525b806101800151801561072357506107216001611be9565b155b1561075a576040517fa27dcc8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806020016040528073420000000000000000000000000000000000000773ffffffffffffffffffffffffffffffffffffffff16639fce812c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e8919061332f565b73ffffffffffffffffffffffffffffffffffffffff16905281526040805160208082018084527f7f46ddb200000000000000000000000000000000000000000000000000000000905291519091829173420000000000000000000000000000000000001091637f46ddb29160248086019291908187030181865afa158015610874573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610898919061332f565b73ffffffffffffffffffffffffffffffffffffffff168152508160200181905250604051806020016040528073420000000000000000000000000000000000001473ffffffffffffffffffffffffffffffffffffffff16637f46ddb26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610923573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610947919061332f565b73ffffffffffffffffffffffffffffffffffffffff168152508160400181905250604051806020016040528073420000000000000000000000000000000000001273ffffffffffffffffffffffffffffffffffffffff1663ee9a31a26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f6919061332f565b73ffffffffffffffffffffffffffffffffffffffff1690526060820152604080518082018083527fee9a31a2000000000000000000000000000000000000000000000000000000009052905181907342000000000000000000000000000000000000179063ee9a31a2906044808501916020918187030181865afa158015610a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa6919061332f565b73ffffffffffffffffffffffffffffffffffffffff16815260200173420000000000000000000000000000000000001773ffffffffffffffffffffffffffffffffffffffff16637d1d0c5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b44919061334c565b90526080820152610b68734200000000000000000000000000000000000011611d4c565b60a0820152610b8a734200000000000000000000000000000000000019611d4c565b60c0820152610bac73420000000000000000000000000000000000001a611d4c565b60e0820152610bce73420000000000000000000000000000000000001b611d4c565b61010082015261016081015115610dbe57600073420000000000000000000000000000000000002a905060405180606001604052808273ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c72919061332f565b73ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1663d84447156040518163ffffffff1660e01b8152600401600060405180830381865afa158015610cd8573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610d1e9190810190613426565b81526020018273ffffffffffffffffffffffffffffffffffffffff1663550fcdc96040518163ffffffff1660e01b8152600401600060405180830381865afa158015610d6e573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610db49190810190613426565b9052610120830152505b600073420000000000000000000000000000000000002b73ffffffffffffffffffffffffffffffffffffffff1663d61a398b6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610e59575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610e569181019061332f565b60015b610e6557506000610e68565b90505b604080516020810190915273ffffffffffffffffffffffffffffffffffffffff909116815261014082015290565b80515160405173ffffffffffffffffffffffffffffffffffffffff9091166024820152610f9990734200000000000000000000000000000000000007907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de80000000000000000000000000000000000000000000000000000000017905260006014611f2d565b60208101515160405173ffffffffffffffffffffffffffffffffffffffff909116602482015261109f90734200000000000000000000000000000000000010907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906044015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052600080611f2d565b60408082015151905173ffffffffffffffffffffffffffffffffffffffff909116602482015261112b90734200000000000000000000000000000000000014907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401611021565b60608101515160405173ffffffffffffffffffffffffffffffffffffffff90911660248201526111b790734200000000000000000000000000000000000012907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401611021565b6080810151805160209091015160405173ffffffffffffffffffffffffffffffffffffffff909216602483015260448201526112c990734200000000000000000000000000000000000017907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090606401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcd6dc6870000000000000000000000000000000000000000000000000000000017905260016000611f2d565b80610160015115611410576101208101518051602082015160409283015192516113d29373420000000000000000000000000000000000002a937f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000936113549390602401613477565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f9065714700000000000000000000000000000000000000000000000000000000179052600080611f2d565b6114107342000000000000000000000000000000000000297f0000000000000000000000000000000000000000000000000000000000000000612689565b6101408101515160405173ffffffffffffffffffffffffffffffffffffffff909116602482015261149d9073420000000000000000000000000000000000002b907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401611021565b60a08101518051602082015160409283015192516115ba93734200000000000000000000000000000000000011937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361151c93906024016134f1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb49dc741000000000000000000000000000000000000000000000000000000001790527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006000611f2d565b60c081015180516020820151604092830151925161163993734200000000000000000000000000000000000019937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361151c93906024016134f1565b60e08101518051602082015160409283015192516116b89373420000000000000000000000000000000000001a937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361151c93906024016134f1565b6101008101518051602082015160409283015192516117389373420000000000000000000000000000000000001b937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361151c93906024016134f1565b61177673420000000000000000000000000000000000000f7f0000000000000000000000000000000000000000000000000000000000000000612689565b6117e47342000000000000000000000000000000000000158261016001516117be577f0000000000000000000000000000000000000000000000000000000000000000612689565b7f0000000000000000000000000000000000000000000000000000000000000000612689565b806101600151801561189f57506040517f47af267b0000000000000000000000000000000000000000000000000000000081527f435553544f4d5f4741535f544f4b454e000000000000000000000000000000006004820152734200000000000000000000000000000000000015906347af267b90602401602060405180830381865afa158015611879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189d91906132eb565b155b15611942576040517f46a4d7800000000000000000000000000000000000000000000000000000000081527f435553544f4d5f4741535f544f4b454e000000000000000000000000000000006004820152734200000000000000000000000000000000000015906346a4d78090602401600060405180830381600087803b15801561192957600080fd5b505af115801561193d573d6000803e3d6000fd5b505050505b6119b073420000000000000000000000000000000000001682610160015161198a577f0000000000000000000000000000000000000000000000000000000000000000612689565b7f0000000000000000000000000000000000000000000000000000000000000000612689565b6119ee7342000000000000000000000000000000000000187f0000000000000000000000000000000000000000000000000000000000000000612689565b611a2c73420000000000000000000000000000000000002d7f0000000000000000000000000000000000000000000000000000000000000000612689565b80610180015115611b2f57611a757342000000000000000000000000000000000000227f0000000000000000000000000000000000000000000000000000000000000000612689565b611ab37342000000000000000000000000000000000000237f0000000000000000000000000000000000000000000000000000000000000000612689565b611af17342000000000000000000000000000000000000247f0000000000000000000000000000000000000000000000000000000000000000612689565b611b2f7342000000000000000000000000000000000000257f0000000000000000000000000000000000000000000000000000000000000000612689565b611b6d7342000000000000000000000000000000000000207f0000000000000000000000000000000000000000000000000000000000000000612689565b611bab7342000000000000000000000000000000000000217f0000000000000000000000000000000000000000000000000000000000000000612689565b61059873420000000000000000000000000000000000002c7f0000000000000000000000000000000000000000000000000000000000000000612689565b6040517f204e1c7a00000000000000000000000000000000000000000000000000000000815273420000000000000000000000000000000000002d600482015260009081907342000000000000000000000000000000000000189063204e1c7a90602401602060405180830381865afa158015611c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8e919061332f565b90508073ffffffffffffffffffffffffffffffffffffffff163b600003611cb85750600092915050565b6040517f78ecabce0000000000000000000000000000000000000000000000000000000081526004810184905273420000000000000000000000000000000000002d906378ecabce90602401602060405180830381865afa158015611d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4591906132eb565b9392505050565b611d6d60408051606081018252600080825260208201819052909182015290565b60008273ffffffffffffffffffffffffffffffffffffffff1663d0e12f906040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611df4575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611df19181019061355a565b60015b611e0057506000611e03565b90505b600083905060405180606001604052808273ffffffffffffffffffffffffffffffffffffffff16630d9019e16040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e82919061332f565b73ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1663d3e5792b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0c919061334c565b8152602001836001811115611f2357611f236134c2565b9052949350505050565b611f368661295c565b611f89576040517fc3fe4a6600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526024015b60405180910390fd5b6040517f204e1c7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526000907342000000000000000000000000000000000000189063204e1c7a90602401602060405180830381865afa15801561200a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202e919061332f565b905073ffffffffffffffffffffffffffffffffffffffff81163b1580159061217b575061217b8773ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa15801561209f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526120e59190810190613426565b8773ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa158015612130573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526121769190810190613426565b6129a5565b156121ca576040517ff8ce5d1600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88166004820152602401611f80565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152881690633659cfe690602401600060405180830381600087803b15801561223357600080fd5b505af1158015612247573d6000803e3d6000fd5b507ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0092505050838114801561227e575060ff831615155b156122b5576040517f10415a2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808414612449576040517fa6ed563e0000000000000000000000000000000000000000000000000000000081526004810185905260009073ffffffffffffffffffffffffffffffffffffffff8a169063a6ed563e90602401602060405180830381865afa15801561232a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234e919061334c565b905061235b8460016135aa565b6123699060ff1660086135cf565b81901c60ff16156123a6576040517fc996d78400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006123b660ff861660086135cf565b6040517f4e91db080000000000000000000000000000000000000000000000000000000081526004810188905260ff90911b198381166024830152915073ffffffffffffffffffffffffffffffffffffffff8b1690634e91db0890604401600060405180830381600087803b15801561242e57600080fd5b505af1158015612442573d6000803e3d6000fd5b5050505050505b6040517fa6ed563e0000000000000000000000000000000000000000000000000000000081526004810182905260009073ffffffffffffffffffffffffffffffffffffffff8a169063a6ed563e90602401602060405180830381865afa1580156124b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124db919061334c565b905060ff604082901c161561251c576040517fc996d78400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f4e91db08000000000000000000000000000000000000000000000000000000008152600481018390527fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008216602482015273ffffffffffffffffffffffffffffffffffffffff8a1690634e91db0890604401600060405180830381600087803b1580156125ac57600080fd5b505af11580156125c0573d6000803e3d6000fd5b50506040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c169250634f1ef2869150612618908b908a9060040161360c565b6000604051808303816000875af1158015612637573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261267d9190810190613426565b50505050505050505050565b6126928261295c565b6126e0576040517fc3fe4a6600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401611f80565b6040517f204e1c7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526000907342000000000000000000000000000000000000189063204e1c7a90602401602060405180830381865afa158015612761573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612785919061332f565b905073ffffffffffffffffffffffffffffffffffffffff81163b1580159061288757506128878373ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa1580156127f6573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261283c9190810190613426565b8373ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa158015612130573d6000803e3d6000fd5b156128d6576040517ff8ce5d1600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401611f80565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe690602401600060405180830381600087803b15801561293f57600080fd5b505af1158015612953573d6000803e3d6000fd5b50505050505050565b60007208400000000000000000000000000000000000600b83901c721fffffffffffffffffffffffffffffffffffff1614801561299f575061299d826129cb565b155b92915050565b60006129b18383612a33565b158015611d4557506129c38383612a83565b159392505050565b600073ffffffffffffffffffffffffffffffffffffffff8216734200000000000000000000000000000000000042148061299f575073ffffffffffffffffffffffffffffffffffffffff82167342000000000000000000000000000000000000061492915050565b600080612a3f84612af8565b90506000612a4c84612af8565b80518351919250148015612a67575080602001518260200151145b8015612a7a575080604001518260400151145b95945050505050565b600080612a8f84612af8565b90506000612a9c84612af8565b805183519192501180612ac2575080518251148015612ac2575080602001518260200151105b80612a7a575080518251148015612ae0575080602001518260200151145b8015612a7a5750604090810151910151109392505050565b612b1c60405180606001604052806000815260200160008152602001600081525090565b6000612b5d836040518060400160405280600181526020017f2e00000000000000000000000000000000000000000000000000000000000000815250612cc4565b9050600381511015612b9b576040517f9eda858c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612bf682600281518110612bb357612bb361363b565b60200260200101516040518060400160405280600181526020017f2d00000000000000000000000000000000000000000000000000000000000000815250612cc4565b90506000612c5382600081518110612c1057612c1061363b565b60200260200101516040518060400160405280600181526020017f2b00000000000000000000000000000000000000000000000000000000000000815250612cc4565b90506040518060600160405280612c8385600081518110612c7657612c7661363b565b6020026020010151612d6f565b8152602001612c9e85600181518110612c7657612c7661363b565b8152602001612cb983600081518110612c7657612c7661363b565b905295945050505050565b60606000612cd28484612de7565b9050601f1960208201600183510160051b81018651838201526001845101845260005b825160608452818114612d3a5760405182820380825286601f8201165b8b850181015183820152870180612d125750600082820160200152603f018616810160405284525b875160209490940193019050818310612cf557505050508091508251612d6857602081019150600281510382525b5092915050565b80516000907f1999999999999999999999999999999999999999999999999999999999999999825b600181019050603060ff82870151160382851185600a028281019650600983118188108317171586029550505050828110612d9757505080612de15763101827966000526004601cfd5b50919050565b606082518251818111612ecc576020850194506020840193506020604051019250846001828488010301600060208410612e2057508286205b601f841660200360031b87515b8951818118831c612e82578315612e605783878c2014612e605760018b019a50848b10612e5a5750612e91565b50612e2d565b858b038952998601996020909801978615612e8257848b10612e5a5750612e91565b5060018a019950838a10612e2d575b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08189030160051c8152602090970190525050505b505092915050565b604080516101c08101825260006101a08201818152825282516020808201855282825280840191909152835180820185528281528385015283518082018552828152606084015283518085019094528184528301529060808201908152602001612f5560408051606081018252600080825260208201819052909182015290565b8152602001612f7b60408051606081018252600080825260208201819052909182015290565b8152602001612fa160408051606081018252600080825260208201819052909182015290565b8152602001612fc760408051606081018252600080825260208201819052909182015290565b8152604080516060808201835260008252602082810182905292820152910190815260408051602081810190925260008152910190815260006020820181905260409091015290565b60005b8381101561302b578181015183820152602001613013565b8381111561303a576000848401525b50505050565b60008151808452613058816020860160208601613010565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611d456020830184613040565b815173ffffffffffffffffffffffffffffffffffffffff168152610360810160208301516130e3602084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604083015161310b604084018273ffffffffffffffffffffffffffffffffffffffff169052565b506060830151613133606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50608083015161315b608084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060a083015161318360a084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060c08301516131ab60c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060e08301516131d360e084018273ffffffffffffffffffffffffffffffffffffffff169052565b506101008381015173ffffffffffffffffffffffffffffffffffffffff90811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501518216908401526101e08085015182169084015261020080850151821690840152610220808501518216908401526102408085015182169084015261026080850151821690840152610280808501518216908401526102a0808501518216908401526102c0808501518216908401526102e0808501518216908401526103008085015182169084015261032080850151821690840152610340808501519182168185015290612ecc565b6000602082840312156132fd57600080fd5b81518015158114611d4557600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461059857600080fd5b60006020828403121561334157600080fd5b8151611d458161330d565b60006020828403121561335e57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff808411156133af576133af613365565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156133f5576133f5613365565b8160405280935085815286868601111561340e57600080fd5b61341c866020830187613010565b5050509392505050565b60006020828403121561343857600080fd5b815167ffffffffffffffff81111561344f57600080fd5b8201601f8101841361346057600080fd5b61346f84825160208401613394565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006134a66060830185613040565b82810360408401526134b88185613040565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8416815260208101839052606081016002831061354c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b826040830152949350505050565b60006020828403121561356c57600080fd5b815160028110611d4557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060ff821660ff84168060ff038211156135c7576135c761357b565b019392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156136075761360761357b565b500290565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600061346f6040830184613040565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080f000a0000000000000000000000002a5a3eabb9fd571a3af0299eebdf8eaafe29a914000000000000000000000000250af3f400cf8aac8d410c90f1ba3968dd87df96000000000000000000000000547d0fba434877d7237d511cf87fabe2ee26b152000000000000000000000000ac8538a2e6a1f5dfbb1c4b8bd97cefb2997824a8000000000000000000000000b178cdaa8336f25624a63c049edb5af7ca36c2da000000000000000000000000c053fc0155bf8bda5b568af53276e538f0ea4d58000000000000000000000000716ead0cf3e7ff86a02d4f8cb41a6d14922fa8330000000000000000000000006a97c5d55a21265326150efe12fc30fb21cbff56000000000000000000000000a0734858ba5085ff6db493021a0f8c54605c2cda00000000000000000000000027e51b2254433a3284d9ba73ea551c397db2a124000000000000000000000000a0f4ffff79a0a3e039fcbef738751efba8e84f96000000000000000000000000f43862b9d814bb4504158ceccb0b74b31265e4ee000000000000000000000000893c2ceeb71d38514daf67728d3ff1b213fc4b5f000000000000000000000000f7bed7215eef1003fac426682cf2edeb958569f7000000000000000000000000f7bed7215eef1003fac426682cf2edeb958569f7000000000000000000000000eddf416c7159387cc6df3015700f79cfb891137300000000000000000000000070de55bc0bfbc52c5d0cca1da5816c2428886a34000000000000000000000000bec660b456b84a081e90af29be43385bda5bf7b600000000000000000000000093a8a7a9c98cb998d88dba3373a6c7f8ee2e8a4600000000000000000000000037dc2fe754052a9fac35f17282599fafbeb9f423000000000000000000000000784f1fae11f1c3a9c413423fe1b370a3636b8d560000000000000000000000002f76618143d9d2731c56778192d3893864b423d7000000000000000000000000dda87ef358082ab3f4ba8982290c671efdc4d1590000000000000000000000008256398a687e740006098445b05d5ca46b7be21e0000000000000000000000008684ccc5bf484ec242dbc7119004a83533934a79000000000000000000000000906835344844979ffd3a752eaa23728d513db00b000000000000000000000000e35b194efc4907f383b7e3b87f4c2c339ce239f600000000000000000000000000000000000000000000000000000000000000", "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", "gasLimit": 4500000, "intent": "Deploy L2ContractsManager Implementation", "to": "0x420000000000000000000000000000000000002C" }, { - "data": "0x7c36f37e000000000000000000000000a723d436b320015ebead5e589c49e03131b80ee3", + "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 d0699ab861d1e..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. @@ -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..8d88b922974f0 100644 --- a/packages/contracts-bedrock/src/libraries/Predeploys.sol +++ b/packages/contracts-bedrock/src/libraries/Predeploys.sol @@ -4,6 +4,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"; /// @title Predeploys /// @notice Contains constant addresses for protocol contracts that are pre-deployed to the L2 system. @@ -130,43 +131,49 @@ 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. + /// @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; + string artifactPath; + uint64 deployGasLimit; + bytes32 devFeatureGate; + bytes32 sysFeatureGate; + bool isProxied; + bool isDeprecated; + bool isVariant; + } + /// @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"; + + // Get default name for CGT variants if (_addr == L1_BLOCK_ATTRIBUTES) 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 +182,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 +208,488 @@ 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). + /// 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[](31); + + // ── 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, + isDeprecated: false, + isVariant: false + }); + // 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, + isDeprecated: false, + isVariant: false + }); + // 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, + isDeprecated: false, + isVariant: false + }); + // 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, + isDeprecated: false, + isVariant: false + }); + // 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, + isDeprecated: false, + isVariant: false + }); + // 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, + 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. + 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, + 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. + 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, + 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. + 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, + 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. + 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, + isDeprecated: false, + isVariant: 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, + isDeprecated: false, + isVariant: false + }); + // 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, + isDeprecated: false, + isVariant: false + }); + // 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, + isDeprecated: false, + isVariant: false + }); + // 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, + isDeprecated: false, + isVariant: false + }); + // 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, + isDeprecated: false, + isVariant: false + }); + // 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, + isDeprecated: false, + isVariant: false + }); + // 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, + isDeprecated: false, + isVariant: false + }); + // 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, + isDeprecated: false, + isVariant: false + }); + + // ── 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, + isDeprecated: false, + isVariant: false + }); + // 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, + isDeprecated: false, + isVariant: false + }); + // 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, + isDeprecated: false, + isVariant: false + }); + // 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, + isDeprecated: false, + isVariant: false + }); + + // ── 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, + isDeprecated: false, + isVariant: false + }); + // 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, + isDeprecated: false, + isVariant: false + }); + + // ── 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, + isDeprecated: false, + isVariant: false + }); + // 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, + isDeprecated: false, + isVariant: false + }); + + // ── 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: "WETH", + artifactPath: "WETH.sol:WETH", + deployGasLimit: 0, + devFeatureGate: bytes32(0), + sysFeatureGate: bytes32(0), + isProxied: false, + isDeprecated: false, + isVariant: false + }); + records_[27] = PredeployRecord({ + proxy: GOVERNANCE_TOKEN, + name: "GovernanceToken", + artifactPath: "GovernanceToken.sol:GovernanceToken", + deployGasLimit: 0, + devFeatureGate: bytes32(0), + sysFeatureGate: bytes32(0), + isProxied: false, + isDeprecated: false, + isVariant: 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, + isVariant: false + }); + records_[29] = PredeployRecord({ + proxy: DEPLOYER_WHITELIST, + name: "DeployerWhitelist", + artifactPath: "DeployerWhitelist.sol:DeployerWhitelist", + deployGasLimit: 0, + devFeatureGate: bytes32(0), + sysFeatureGate: bytes32(0), + isProxied: true, + isDeprecated: true, + isVariant: false + }); + 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, + 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, + /// 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"); + } + + 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/L2/L2ContractsManager.t.sol b/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol index faf6ba5aba929..1e79389971c0b 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 { console } from "forge-std/console.sol"; // Interfaces import { ICrossDomainMessenger } from "interfaces/universal/ICrossDomainMessenger.sol"; @@ -800,25 +801,27 @@ 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. -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); 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); - // Capture pre-upgrade implementations address[] memory preUpgradeImpls = new address[](interopPredeploys.length); for (uint256 i = 0; i < interopPredeploys.length; i++) { @@ -849,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++) { @@ -909,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 @@ -941,21 +967,37 @@ 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 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 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(); - bool interopEnabled = isDevFeatureEnabled(DevFeatures.OPTIMISM_PORTAL_INTEROP); + Predeploys.PredeployRecord[] memory records = Predeploys.getUpgradeableRecords(); - 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; + for (uint256 i = 0; i < records.length; i++) { + if (records[i].isVariant) { + console.log("Skipping variant predeploy", records[i].name); + 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/L2GenesisForkUpgrade.t.sol b/packages/contracts-bedrock/test/L2/L2GenesisForkUpgrade.t.sol index 81c6aeb7cbe8e..9e28062cbbf36 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 @@ -45,9 +47,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. + // 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(); @@ -92,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(); + } +} diff --git a/packages/contracts-bedrock/test/L2/fork/L2ForkUpgrade.t.sol b/packages/contracts-bedrock/test/L2/fork/L2ForkUpgrade.t.sol index 85812e2c76e53..ac3a65c9dc4ac 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(); @@ -109,14 +115,50 @@ 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); + } + } + + /// @notice Returns the active proxied predeploys with their pre-upgrade versions. + /// @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.getUpgradeableRecords(); + uint256 count = 0; + for (uint256 i = 0; i < records.length; i++) { + if (records[i].isVariant) continue; + if (_isFeaturePredeployAndDisabled(records[i].proxy)) continue; + count++; + } + + predeploys_ = new PredeployState[](count); + 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++; + } + } + + /// @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"; } } } @@ -124,12 +166,6 @@ contract L2ForkUpgrade_TestInit is CommonTest { /// @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 +193,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 +208,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 +596,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); @@ -635,7 +639,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(); @@ -646,16 +650,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..581ed3d5f6d0a 100644 --- a/packages/contracts-bedrock/test/libraries/Predeploys.t.sol +++ b/packages/contracts-bedrock/test/libraries/Predeploys.t.sol @@ -57,6 +57,27 @@ 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; diff --git a/packages/contracts-bedrock/test/scripts/GenerateNUTBundle.t.sol b/packages/contracts-bedrock/test/scripts/GenerateNUTBundle.t.sol index 951a5ed25385f..3283debe6abec 100644 --- a/packages/contracts-bedrock/test/scripts/GenerateNUTBundle.t.sol +++ b/packages/contracts-bedrock/test/scripts/GenerateNUTBundle.t.sol @@ -6,10 +6,10 @@ 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"; -import { UpgradeUtils } from "scripts/libraries/UpgradeUtils.sol"; import { Constants } from "src/libraries/Constants.sol"; import { L2ContractsManagerTypes } from "src/libraries/L2ContractsManagerTypes.sol"; @@ -71,7 +71,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, @@ -129,12 +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. - function test_implementationCount_matchesStructFields_succeeds() public pure { + /// @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; - string[] memory names = UpgradeUtils.getImplementationsNamesToUpgrade(); - assertEq(names.length, structFieldCount, "Deployment list must equal Implementations struct field count"); + + script._buildImplementationDeploymentConfigs(); + + assertEq( + script.implementationConfigs().length, + structFieldCount, + "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 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 && !records[i].isDeprecated) 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/setup/Setup.sol b/packages/contracts-bedrock/test/setup/Setup.sol index 0882193995ac6..32224cd49eaac 100644 --- a/packages/contracts-bedrock/test/setup/Setup.sol +++ b/packages/contracts-bedrock/test/setup/Setup.sol @@ -512,34 +512,25 @@ 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++) { + // 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"); + 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 {