From 36cd2871f6ab89ab54fb3cd6b7880435d321c86f Mon Sep 17 00:00:00 2001 From: leekt Date: Fri, 19 Jan 2024 21:25:44 +0900 Subject: [PATCH 1/3] restructured to seprate plugins folder --- foundry.toml | 37 +------ .../src/p256}/P256Validator.sol | 6 +- .../stealthAddressValidator/EllipticCurve.sol | 0 .../StealthAddressValidator.sol | 6 +- .../StealthAggreagteSignature.sol | 0 .../test}/P256Validator.t.sol | 8 +- .../test}/StealthAddressValidator.t.sol | 6 +- script/DeployDeterministic.s.sol | 5 +- script/DeployECDSAValidator.s.sol | 7 +- script/DeployKernel.s.sol | 23 ++-- script/DeployKernelInitial.s.sol | 13 +-- script/DeployKillSwitch.s.sol | 4 +- script/DeployMulticall.s.sol | 8 +- script/DeployRecovery.s.sol | 4 +- script/DeploySessionKey.s.sol | 5 +- script/DeployWeightedECDSA.s.sol | 4 +- script/StakeToFactory.s.sol | 4 +- .../deterministic/DeterministicDeploy.s.sol | 3 +- script/deterministic/ECDSAValidator.s.sol | 5 +- script/deterministic/Factory.s.sol | 8 +- script/deterministic/Factory_old.s.sol | 8 +- script/deterministic/Kernel2_2.s.sol | 10 +- script/deterministic/Kernel2_3.s.sol | 8 +- script/deterministic/SessionKey.s.sol | 6 +- tasks/test_userOp.ts | 102 ------------------ 25 files changed, 93 insertions(+), 197 deletions(-) rename {src/validator => plugins/src/p256}/P256Validator.sol (93%) rename {src/validator => plugins/src}/stealthAddressValidator/EllipticCurve.sol (100%) rename {src/validator => plugins/src}/stealthAddressValidator/StealthAddressValidator.sol (97%) rename {src/validator => plugins/src}/stealthAddressValidator/StealthAggreagteSignature.sol (100%) rename {test/foundry/validator => plugins/test}/P256Validator.t.sol (96%) rename {test/foundry/validator => plugins/test}/StealthAddressValidator.t.sol (98%) delete mode 100644 tasks/test_userOp.ts diff --git a/foundry.toml b/foundry.toml index b93f1c69..9757adcd 100644 --- a/foundry.toml +++ b/foundry.toml @@ -7,38 +7,11 @@ evm_version = 'paris' bytecode_hash = "none" cbor_metadata = false optimize = true -via-ir = true +via-ir = false runs = 1000000 -[fuzz] -runs = 1024 - -[etherscan] -mainnet = { key = "${ETHERSCAN_API_KEY}" } -goerli = { key = "${ETHERSCAN_API_KEY}" } -sepolia = { key = "${ETHERSCAN_API_KEY}" } - -polygon = { key = "${POLYGONSCAN_API_KEY}" } -mumbai = { key = "${POLYGONSCAN_API_KEY}" } - -base = { key = "${BASESCAN_API_KEY}" } -base-goerli = { key = "${BASESCAN_API_KEY}" } -base-sepolia = { key = "${BASESCAN_API_KEY}" } - -arbitrum = { key = "${ARBISCAN_API_KEY}" } -arbitrum-goerli = { key = "${ARBISCAN_API_KEY}" } -arbitrum-sepolia = { key = "${ARBISCAN_API_KEY}" } -optimism = { key = "${OPTIMISMSCAN_API_KEY}" } -optimism-goerli = { key = "${OPTIMISMSCAN_API_KEY}" } -optimism-sepolia = { key = "${OPTIMISMSCAN_API_KEY}" } - -avalanche = { key = "${AVALANCHE_API_KEY}" } -fuji = { key = "${AVALANCHE_API_KEY}" } - -linea = { key = "${LINEASCAN_API_KEY}" } -linea-testnet = { key = "${LINEASCAN_API_KEY}" } - -bsc = { key = "${BSCSCAN_API_KEY}" } -opbnb = { key = "${BSCSCAN_API_KEY}" } +[profile.deploy] +via-ir = true -# astar-testnet = { key = "${BSCSCAN_API_KEY}" } +[fuzz] +runs = 1024 diff --git a/src/validator/P256Validator.sol b/plugins/src/p256/P256Validator.sol similarity index 93% rename from src/validator/P256Validator.sol rename to plugins/src/p256/P256Validator.sol index fbbe7c1a..6fcc88c4 100644 --- a/src/validator/P256Validator.sol +++ b/plugins/src/p256/P256Validator.sol @@ -4,9 +4,9 @@ pragma solidity ^0.8.0; import {UserOperation} from "I4337/interfaces/UserOperation.sol"; import {ECDSA} from "solady/utils/ECDSA.sol"; -import {IKernelValidator} from "../interfaces/IKernelValidator.sol"; -import {ValidationData} from "../common/Types.sol"; -import {SIG_VALIDATION_FAILED} from "../common/Constants.sol"; +import {IKernelValidator} from "src/interfaces/IKernelValidator.sol"; +import {ValidationData} from "src/common/Types.sol"; +import {SIG_VALIDATION_FAILED} from "src/common/Constants.sol"; import {P256} from "p256-verifier/P256.sol"; /// @title P256Validator diff --git a/src/validator/stealthAddressValidator/EllipticCurve.sol b/plugins/src/stealthAddressValidator/EllipticCurve.sol similarity index 100% rename from src/validator/stealthAddressValidator/EllipticCurve.sol rename to plugins/src/stealthAddressValidator/EllipticCurve.sol diff --git a/src/validator/stealthAddressValidator/StealthAddressValidator.sol b/plugins/src/stealthAddressValidator/StealthAddressValidator.sol similarity index 97% rename from src/validator/stealthAddressValidator/StealthAddressValidator.sol rename to plugins/src/stealthAddressValidator/StealthAddressValidator.sol index efca0763..369a97b0 100644 --- a/src/validator/stealthAddressValidator/StealthAddressValidator.sol +++ b/plugins/src/stealthAddressValidator/StealthAddressValidator.sol @@ -5,9 +5,9 @@ import {UserOperation} from "I4337/interfaces/UserOperation.sol"; import {ECDSA} from "solady/utils/ECDSA.sol"; import {EIP712} from "solady/utils/EIP712.sol"; import {StealthAggreagteSignature} from "./StealthAggreagteSignature.sol"; -import {IKernelValidator} from "../../interfaces/IKernelValidator.sol"; -import {ValidationData} from "../../common/Types.sol"; -import {SIG_VALIDATION_FAILED} from "../../common/Constants.sol"; +import {IKernelValidator} from "src/interfaces/IKernelValidator.sol"; +import {ValidationData} from "src/common/Types.sol"; +import {SIG_VALIDATION_FAILED} from "src/common/Constants.sol"; /** * @dev Storage structure for Stealth Address Registry Module. diff --git a/src/validator/stealthAddressValidator/StealthAggreagteSignature.sol b/plugins/src/stealthAddressValidator/StealthAggreagteSignature.sol similarity index 100% rename from src/validator/stealthAddressValidator/StealthAggreagteSignature.sol rename to plugins/src/stealthAddressValidator/StealthAggreagteSignature.sol diff --git a/test/foundry/validator/P256Validator.t.sol b/plugins/test/P256Validator.t.sol similarity index 96% rename from test/foundry/validator/P256Validator.t.sol rename to plugins/test/P256Validator.t.sol index 4f731844..9d22e42b 100644 --- a/test/foundry/validator/P256Validator.t.sol +++ b/plugins/test/P256Validator.t.sol @@ -6,10 +6,10 @@ import "src/Kernel.sol"; // test artifacts // test utils import "forge-std/Test.sol"; -import {ERC4337Utils} from "../utils/ERC4337Utils.sol"; -import {KernelTestBase} from "../KernelTestBase.sol"; -import {TestExecutor} from "../mock/TestExecutor.sol"; -import {TestValidator} from "../mock/TestValidator.sol"; +import {ERC4337Utils} from "test/foundry/utils/ERC4337Utils.sol"; +import {KernelTestBase} from "test/foundry/KernelTestBase.sol"; +import {TestExecutor} from "test/foundry/mock/TestExecutor.sol"; +import {TestValidator} from "test/foundry/mock/TestValidator.sol"; import {P256Validator} from "src/validator/P256Validator.sol"; import {P256Verifier} from "p256-verifier/P256Verifier.sol"; import {P256} from "p256-verifier/P256.sol"; diff --git a/test/foundry/validator/StealthAddressValidator.t.sol b/plugins/test/StealthAddressValidator.t.sol similarity index 98% rename from test/foundry/validator/StealthAddressValidator.t.sol rename to plugins/test/StealthAddressValidator.t.sol index ed612038..c989f348 100644 --- a/test/foundry/validator/StealthAddressValidator.t.sol +++ b/plugins/test/StealthAddressValidator.t.sol @@ -7,9 +7,9 @@ import {EllipticCurve} from "src/validator/stealthAddressValidator/EllipticCurve import {IKernel} from "src/interfaces/IKernel.sol"; import {StealthAddressValidator} from "src/validator/stealthAddressValidator/StealthAddressValidator.sol"; // test utils -import {KernelTestBase} from "../KernelTestBase.sol"; -import {TestExecutor} from "../mock/TestExecutor.sol"; -import {TestValidator} from "../mock/TestValidator.sol"; +import {KernelTestBase} from "test/foundry/KernelTestBase.sol"; +import {TestExecutor} from "test/foundry/mock/TestExecutor.sol"; +import {TestValidator} from "test/foundry/mock/TestValidator.sol"; import "forge-std/Vm.sol"; struct StealthAddressKey { diff --git a/script/DeployDeterministic.s.sol b/script/DeployDeterministic.s.sol index 16d91abd..caae47ac 100644 --- a/script/DeployDeterministic.s.sol +++ b/script/DeployDeterministic.s.sol @@ -11,6 +11,7 @@ import "./deterministic/Kernel2_3.s.sol"; contract DeployDeterministic is Script { address constant DEPLOYER = 0x9775137314fE595c943712B0b336327dfa80aE8A; + function run() external { vm.startBroadcast(DEPLOYER); KernelFactory factory = KernelFactory(payable(FactoryDeploy.deploy())); @@ -28,10 +29,10 @@ contract DeployDeterministic is Script { //} (address k23, address k23lite) = Kernel_2_3_Deploy.deploy(); - if(!factory.isAllowedImplementation(k23)) { + if (!factory.isAllowedImplementation(k23)) { factory.setImplementation(k23, true); } - if(!factory.isAllowedImplementation(k23lite)) { + if (!factory.isAllowedImplementation(k23lite)) { factory.setImplementation(k23lite, true); } vm.stopBroadcast(); diff --git a/script/DeployECDSAValidator.s.sol b/script/DeployECDSAValidator.s.sol index 89774599..ad57c0bf 100644 --- a/script/DeployECDSAValidator.s.sol +++ b/script/DeployECDSAValidator.s.sol @@ -4,15 +4,17 @@ import "src/factory/KernelFactory.sol"; import "src/validator/ECDSAValidator.sol"; import "forge-std/Script.sol"; import "forge-std/console.sol"; + contract DeployKernel is Script { address constant DEPLOYER = 0x9775137314fE595c943712B0b336327dfa80aE8A; address constant ENTRYPOINT_0_6 = 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789; address constant EXPECTED_VALIDATOR_ADDRESS = 0xd9AB5096a832b9ce79914329DAEE236f8Eea0390; + function run() public { uint256 key = vm.envUint("DEPLOYER_PRIVATE_KEY"); vm.startBroadcast(key); - if(EXPECTED_VALIDATOR_ADDRESS.code.length == 0) { - ECDSAValidator validator = new ECDSAValidator{salt:0}(); + if (EXPECTED_VALIDATOR_ADDRESS.code.length == 0) { + ECDSAValidator validator = new ECDSAValidator{salt: 0}(); console.log("validator address: %s", address(validator)); } else { console.log("validator address: %s", EXPECTED_VALIDATOR_ADDRESS); @@ -20,4 +22,3 @@ contract DeployKernel is Script { vm.stopBroadcast(); } } - diff --git a/script/DeployKernel.s.sol b/script/DeployKernel.s.sol index 73d1737f..d46570bf 100644 --- a/script/DeployKernel.s.sol +++ b/script/DeployKernel.s.sol @@ -7,6 +7,7 @@ import "src/lite/KernelLiteECDSA.sol"; import "forge-std/Script.sol"; import "forge-std/console.sol"; import "src/validator/ECDSAValidator.sol"; + contract DeployKernel is Script { address constant DEPLOYER = 0x9775137314fE595c943712B0b336327dfa80aE8A; address constant ENTRYPOINT_0_6 = 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789; @@ -14,44 +15,44 @@ contract DeployKernel is Script { address constant EXPECTED_KERNEL_ADDRESS = 0x0DA6a956B9488eD4dd761E59f52FDc6c8068E6B5; address constant EXPECTED_KERNEL_LITE_ADDRESS = 0xbEdb61Be086F3f15eE911Cc9AB3EEa945DEbFa96; address payable constant EXPECTED_KERNEL_FACTORY_ADDRESS = payable(0x5de4839a76cf55d0c90e2061ef4386d962E15ae3); + function run() public { uint256 key = vm.envUint("DEPLOYER_PRIVATE_KEY"); vm.startBroadcast(key); KernelFactory factory; - if(EXPECTED_KERNEL_FACTORY_ADDRESS.code.length == 0){ - factory = new KernelFactory{salt:0}(DEPLOYER, IEntryPoint(ENTRYPOINT_0_6)); + if (EXPECTED_KERNEL_FACTORY_ADDRESS.code.length == 0) { + factory = new KernelFactory{salt: 0}(DEPLOYER, IEntryPoint(ENTRYPOINT_0_6)); console.log("KernelFactory address: %s", address(factory)); } else { factory = KernelFactory(EXPECTED_KERNEL_FACTORY_ADDRESS); } - if(EXPECTED_KERNEL_LITE_ADDRESS.code.length == 0) { - if(address(ECDSAVALIDATOR).code.length == 0) { + if (EXPECTED_KERNEL_LITE_ADDRESS.code.length == 0) { + if (address(ECDSAVALIDATOR).code.length == 0) { console.log("ECDSAVALIDATOR NOT DEPLOYED"); } else { KernelLiteECDSA kernellite; - kernellite = new KernelLiteECDSA{salt:0}(IEntryPoint(ENTRYPOINT_0_6), IKernelValidator(ECDSAVALIDATOR)); + kernellite = new KernelLiteECDSA{salt: 0}(IEntryPoint(ENTRYPOINT_0_6), IKernelValidator(ECDSAVALIDATOR)); console.log("Kernel Lite address: %s", address(kernellite)); } } - if(factory.isAllowedImplementation(EXPECTED_KERNEL_LITE_ADDRESS) == false) { + if (factory.isAllowedImplementation(EXPECTED_KERNEL_LITE_ADDRESS) == false) { console.log("Registering kernellite implementation"); factory.setImplementation(EXPECTED_KERNEL_LITE_ADDRESS, true); } - if(EXPECTED_KERNEL_ADDRESS.code.length == 0) { + if (EXPECTED_KERNEL_ADDRESS.code.length == 0) { Kernel kernel; - kernel = new Kernel{salt:0}(IEntryPoint(ENTRYPOINT_0_6)); + kernel = new Kernel{salt: 0}(IEntryPoint(ENTRYPOINT_0_6)); console.log("Kernel address: %s", address(kernel)); } - if(factory.isAllowedImplementation(EXPECTED_KERNEL_ADDRESS) == false) { + if (factory.isAllowedImplementation(EXPECTED_KERNEL_ADDRESS) == false) { console.log("Registering kernel implementation"); factory.setImplementation(EXPECTED_KERNEL_ADDRESS, true); } IEntryPoint entryPoint = IEntryPoint(ENTRYPOINT_0_6); IStakeManager.DepositInfo memory info = entryPoint.getDepositInfo(address(factory)); - if(info.stake == 0) { + if (info.stake == 0) { console.log("Need to stake to factory"); } vm.stopBroadcast(); } } - diff --git a/script/DeployKernelInitial.s.sol b/script/DeployKernelInitial.s.sol index b18e5683..e4579bb1 100644 --- a/script/DeployKernelInitial.s.sol +++ b/script/DeployKernelInitial.s.sol @@ -7,17 +7,19 @@ import "src/lite/KernelLiteECDSA.sol"; import "forge-std/Script.sol"; import "forge-std/console.sol"; import "src/validator/ECDSAValidator.sol"; + contract DeployKernelInitial is Script { address constant DEPLOYER = 0x9775137314fE595c943712B0b336327dfa80aE8A; address constant ENTRYPOINT_0_6 = 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789; address constant ECDSAVALIDATOR = 0xd9AB5096a832b9ce79914329DAEE236f8Eea0390; address payable constant EXPECTED_KERNEL_FACTORY_ADDRESS = payable(0x5de4839a76cf55d0c90e2061ef4386d962E15ae3); + function run() public { uint256 key = vm.envUint("DEPLOYER_PRIVATE_KEY"); vm.startBroadcast(key); KernelFactory factory; - if(EXPECTED_KERNEL_FACTORY_ADDRESS.code.length == 0){ - factory = new KernelFactory{salt:0}(DEPLOYER, IEntryPoint(ENTRYPOINT_0_6)); + if (EXPECTED_KERNEL_FACTORY_ADDRESS.code.length == 0) { + factory = new KernelFactory{salt: 0}(DEPLOYER, IEntryPoint(ENTRYPOINT_0_6)); console.log("KernelFactory address: %s", address(factory)); } else { factory = KernelFactory(EXPECTED_KERNEL_FACTORY_ADDRESS); @@ -34,18 +36,17 @@ contract DeployKernelInitial is Script { // } //} Kernel kernel; - kernel = new Kernel{salt:0}(IEntryPoint(ENTRYPOINT_0_6)); + kernel = new Kernel{salt: 0}(IEntryPoint(ENTRYPOINT_0_6)); console.log("Kernel address: %s", address(kernel)); - if(factory.isAllowedImplementation(address(kernel)) == false) { + if (factory.isAllowedImplementation(address(kernel)) == false) { console.log("Registering kernel implementation"); factory.setImplementation(address(kernel), true); } IEntryPoint entryPoint = IEntryPoint(ENTRYPOINT_0_6); IStakeManager.DepositInfo memory info = entryPoint.getDepositInfo(address(factory)); - if(info.stake == 0) { + if (info.stake == 0) { console.log("Need to stake to factory"); } vm.stopBroadcast(); } } - diff --git a/script/DeployKillSwitch.s.sol b/script/DeployKillSwitch.s.sol index 217cc61b..48aa6df9 100644 --- a/script/DeployKillSwitch.s.sol +++ b/script/DeployKillSwitch.s.sol @@ -15,7 +15,7 @@ contract DeployKillSwitch is Script { KillSwitchValidator validator; if (EXPECTED_ADDRESS_KILL_SWITCH_VALIDATOR.code.length == 0) { console.log("deploying KillSwitchValidator"); - validator = new KillSwitchValidator{salt:0}(); + validator = new KillSwitchValidator{salt: 0}(); console.log("validator address: %s", address(validator)); } else { validator = KillSwitchValidator(EXPECTED_ADDRESS_KILL_SWITCH_VALIDATOR); @@ -23,7 +23,7 @@ contract DeployKillSwitch is Script { } if (EXPECTED_ADDRESS_KILL_SWITCH_ACTION.code.length == 0) { console.log("deploying KillSwitchAction"); - KillSwitchAction action = new KillSwitchAction{salt:0}(validator); + KillSwitchAction action = new KillSwitchAction{salt: 0}(validator); console.log("KillSwitchAction address: %s", address(action)); } else { console.log("KillSwitchAction address: %s", address(EXPECTED_ADDRESS_KILL_SWITCH_ACTION)); diff --git a/script/DeployMulticall.s.sol b/script/DeployMulticall.s.sol index b4b063b9..6f94e870 100644 --- a/script/DeployMulticall.s.sol +++ b/script/DeployMulticall.s.sol @@ -6,15 +6,17 @@ contract DeployMultiCall is Script { address constant DEPLOYER = 0x9775137314fE595c943712B0b336327dfa80aE8A; address constant EXPECTED_MULTICALL_ADDRESS = 0x8ae01fCF7c655655fF2c6Ef907b8B4718Ab4e17c; address constant DETERMINISTIC_DEPLOYER = 0x4e59b44847b379578588920cA78FbF26c0B4956C; + function run() public { uint256 key = vm.envUint("DEPLOYER_PRIVATE_KEY"); vm.startBroadcast(key); - if(EXPECTED_MULTICALL_ADDRESS.code.length == 0) { - (bool success, bytes memory ret) = DETERMINISTIC_DEPLOYER.call(hex"000000000000000000000000000000000000000000000000000000000000000060a060405234801561001057600080fd5b50306080526080516102bd61002f6000396000604f01526102bd6000f3fe60806040526004361061001e5760003560e01c80638d80ff0a14610023575b600080fd5b6100366100313660046101b8565b610038565b005b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610101576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d756c746953656e642073686f756c64206f6e6c792062652063616c6c65642060448201527f7669612064656c656761746563616c6c00000000000000000000000000000000606482015260840160405180910390fd5b805160205b81811015610184578083015160f81c6001820184015160601c60158301850151603584018601516055850187016000856000811461014b576001811461015b57610166565b6000808585888a5af19150610166565b6000808585895af491505b508061017157600080fd5b5050806055018501945050505050610106565b505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156101ca57600080fd5b813567ffffffffffffffff808211156101e257600080fd5b818401915084601f8301126101f657600080fd5b81358181111561020857610208610189565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561024e5761024e610189565b8160405282815287602084870101111561026757600080fd5b82602086016020830137600092810160200192909252509594505050505056fea2646970667358221220aee0f2dd047c52784b9c7806e4078197141e146ec66587d8610576db5f8ad20e64736f6c634300080f0033"); + if (EXPECTED_MULTICALL_ADDRESS.code.length == 0) { + (bool success, bytes memory ret) = DETERMINISTIC_DEPLOYER.call( + hex"000000000000000000000000000000000000000000000000000000000000000060a060405234801561001057600080fd5b50306080526080516102bd61002f6000396000604f01526102bd6000f3fe60806040526004361061001e5760003560e01c80638d80ff0a14610023575b600080fd5b6100366100313660046101b8565b610038565b005b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610101576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d756c746953656e642073686f756c64206f6e6c792062652063616c6c65642060448201527f7669612064656c656761746563616c6c00000000000000000000000000000000606482015260840160405180910390fd5b805160205b81811015610184578083015160f81c6001820184015160601c60158301850151603584018601516055850187016000856000811461014b576001811461015b57610166565b6000808585888a5af19150610166565b6000808585895af491505b508061017157600080fd5b5050806055018501945050505050610106565b505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156101ca57600080fd5b813567ffffffffffffffff808211156101e257600080fd5b818401915084601f8301126101f657600080fd5b81358181111561020857610208610189565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561024e5761024e610189565b8160405282815287602084870101111561026757600080fd5b82602086016020830137600092810160200192909252509594505050505056fea2646970667358221220aee0f2dd047c52784b9c7806e4078197141e146ec66587d8610576db5f8ad20e64736f6c634300080f0033" + ); } else { console.log("validator address: %s", EXPECTED_MULTICALL_ADDRESS); } vm.stopBroadcast(); } } - diff --git a/script/DeployRecovery.s.sol b/script/DeployRecovery.s.sol index 1fc502e5..dbf9683a 100644 --- a/script/DeployRecovery.s.sol +++ b/script/DeployRecovery.s.sol @@ -5,14 +5,14 @@ import "src/executor/RecoveryAction.sol"; import "forge-std/Script.sol"; import "forge-std/console.sol"; -contract DeployRecovery is Script { +contract DeployRecovery is Script { function run() public { address deployer = vm.envAddress("DEPLOYER"); vm.startBroadcast(deployer); console.log("Deployer address: ", deployer); //RecoveryAction action = new RecoveryAction{salt:0}(); //console.log("Deploying RecoveryAction at address: ", address(action)); - WeightedECDSAValidator validator = new WeightedECDSAValidator{salt:0}(); + WeightedECDSAValidator validator = new WeightedECDSAValidator{salt: 0}(); console.log("Deploying WeightedECDSAValidator at address: ", address(validator)); vm.stopBroadcast(); } diff --git a/script/DeploySessionKey.s.sol b/script/DeploySessionKey.s.sol index c6a1daae..ae2f6129 100644 --- a/script/DeploySessionKey.s.sol +++ b/script/DeploySessionKey.s.sol @@ -3,15 +3,16 @@ pragma solidity ^0.8.0; import "src/validator/SessionKeyValidator.sol"; import "forge-std/Script.sol"; import "forge-std/console.sol"; + contract DeploySessionKey is Script { address constant EXPECTED_ADDRESS = 0x5C06CE2b673fD5E6e56076e40DD46aB67f5a72A5; + function run() public { address deployer = vm.envAddress("DEPLOYER"); vm.startBroadcast(deployer); console.log("deploying SessionKeyValidator"); - SessionKeyValidator validator = new SessionKeyValidator{salt:0}(); + SessionKeyValidator validator = new SessionKeyValidator{salt: 0}(); console.log("validator address: %s", address(validator)); vm.stopBroadcast(); } } - diff --git a/script/DeployWeightedECDSA.s.sol b/script/DeployWeightedECDSA.s.sol index 5be69942..1e7e6d13 100644 --- a/script/DeployWeightedECDSA.s.sol +++ b/script/DeployWeightedECDSA.s.sol @@ -14,14 +14,14 @@ contract DeployWeightedECDSA is Script { vm.startBroadcast(key); if (EXPECTED_ADDRESS_WEIGHTED_ECDSA_VALIDATOR.code.length == 0) { console.log("deploying WeightedECDSAValidator"); - WeightedECDSAValidator validator = new WeightedECDSAValidator{salt:0}(); + WeightedECDSAValidator validator = new WeightedECDSAValidator{salt: 0}(); console.log("validator address: %s", address(validator)); } else { console.log("validator address: %s", address(EXPECTED_ADDRESS_WEIGHTED_ECDSA_VALIDATOR)); } if (EXPECTED_ADDRESS_RECOVERY_ACTION.code.length == 0) { console.log("deploying RecoveryAction"); - RecoveryAction action = new RecoveryAction{salt:0}(); + RecoveryAction action = new RecoveryAction{salt: 0}(); console.log("RecoveryAction address: %s", address(action)); } else { console.log("RecoveryAction address: %s", address(EXPECTED_ADDRESS_RECOVERY_ACTION)); diff --git a/script/StakeToFactory.s.sol b/script/StakeToFactory.s.sol index 62a0f976..4a80a611 100644 --- a/script/StakeToFactory.s.sol +++ b/script/StakeToFactory.s.sol @@ -4,17 +4,19 @@ import "src/factory/KernelFactory.sol"; import "I4337/interfaces/IStakeManager.sol"; import "forge-std/Script.sol"; import "forge-std/console.sol"; + contract StakeToFactory is Script { address constant DEPLOYER = 0x9775137314fE595c943712B0b336327dfa80aE8A; address constant ENTRYPOINT_0_6 = 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789; address payable constant EXPECTED_KERNEL_ADDRESS = payable(0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb); address payable constant EXPECTED_KERNEL_FACTORY_ADDRESS = payable(0x5de4839a76cf55d0c90e2061ef4386d962E15ae3); + function run() public { vm.startBroadcast(DEPLOYER); KernelFactory factory = KernelFactory(EXPECTED_KERNEL_FACTORY_ADDRESS); IEntryPoint entryPoint = IEntryPoint(ENTRYPOINT_0_6); IStakeManager.DepositInfo memory info = entryPoint.getDepositInfo(address(factory)); - if(info.stake < 1e17) { + if (info.stake < 1e17) { factory.addStake{value: 1e17 - info.stake}(86400); } vm.stopBroadcast(); diff --git a/script/deterministic/DeterministicDeploy.s.sol b/script/deterministic/DeterministicDeploy.s.sol index 10ecdf96..53986845 100644 --- a/script/deterministic/DeterministicDeploy.s.sol +++ b/script/deterministic/DeterministicDeploy.s.sol @@ -4,8 +4,9 @@ import "forge-std/console.sol"; library DeterministicDeploy { address constant DETERMINISTIC_DEPLOYER = 0x4e59b44847b379578588920cA78FbF26c0B4956C; + function checkDeploy(string memory tag, address _expectedAddress, bytes memory _code) internal { - if(_expectedAddress.code.length == 0) { + if (_expectedAddress.code.length == 0) { (bool success, bytes memory addr) = DETERMINISTIC_DEPLOYER.call(_code); require(success, "DeterministicDeploy: failed to deploy"); require(address(bytes20(addr)) == _expectedAddress, "DeterministicDeploy: address mismatch"); diff --git a/script/deterministic/ECDSAValidator.s.sol b/script/deterministic/ECDSAValidator.s.sol index e235d477..a70f4df7 100644 --- a/script/deterministic/ECDSAValidator.s.sol +++ b/script/deterministic/ECDSAValidator.s.sol @@ -4,9 +4,10 @@ import "./DeterministicDeploy.s.sol"; library ECDSAValidatorDeploy { address constant EXPECTED_ECDSA_VALIDATOR_ADDRESS = 0xd9AB5096a832b9ce79914329DAEE236f8Eea0390; - bytes constant VALIDATOR_CODE = hex"000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056"; + bytes constant VALIDATOR_CODE = + hex"000000000000000000000000000000000000000000000000000000000000000060808060405234610016576104ee908161001c8239f35b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630c959556146101d557806320709efc1461019b578063333daf921461015b5780633a871cdd1461010d578381638fc925aa146100c85750639ea9bd591461006457600080fd5b346100c457806003193601126100c45761007c610296565b9160243567ffffffffffffffff81116100c057936100a08392602096369101610263565b5050338152808552205490516001600160a01b0392831691909216148152f35b8480fd5b8280fd5b92905060203660031901126101095780359067ffffffffffffffff8211610104576100f591369101610263565b50503382528160205281205580f35b505050fd5b5050fd5b50600319836060368301126101545783359167ffffffffffffffff831161015757610160908336030112610154575060209261014d916024359101610348565b9051908152f35b80fd5b5080fd5b5082346101545781600319360112610154576024359067ffffffffffffffff8211610154575060209261019461014d9236908301610263565b9135610464565b838234610157576020366003190112610157576020916001600160a01b03908290826101c5610296565b1681528085522054169051908152f35b509060203660031901126100c45780359067ffffffffffffffff821161025f5761020191369101610263565b6014116100c4573560601c90338352826020528220805490826bffffffffffffffffffffffff60a01b831617905560018060a01b0316337f381c0d11398486654573703c51ee8210ce9461764d133f9f0e53b6a5397053318480a480f35b8380fd5b9181601f840112156102915782359167ffffffffffffffff8311610291576020838186019501011161029157565b600080fd5b600435906001600160a01b038216820361029157565b903590601e1981360301821215610291570180359067ffffffffffffffff82116102915760200191813603831361029157565b92919267ffffffffffffffff918281116103325760405192601f8201601f19908116603f011684019081118482101761033257604052829481845281830111610291578281602093846000960137010152565b634e487b7160e01b600052604160045260246000fd5b600092916001600160a01b039084833583811690819003610157578152806020528260408220541693826020527b19457468657265756d205369676e6564204d6573736167653a0a33328252603c60042091846103be6101408401946103b86103b187876102ac565b36916102df565b906103ee565b1686146103e557506103b16103d793926103b8926102ac565b16036103df57565b60019150565b96505050505050565b60207f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a19392608060405193838301516040526040830151928360605260416000988995869485526060840151851a885210915114165afa508251923d1561045757606052604052565b638baa579f90526004601cfd5b3360009081526020819052604081205490936001600160a01b03918216939192836104996104933685876102df565b836103ee565b1685146104e6576104d7926103b8916020527b19457468657265756d205369676e6564204d6573736167653a0a33328752603c6004209236916102df565b16036104e05790565b50600190565b50505050509056"; - function deploy() internal returns(address) { + function deploy() internal returns (address) { DeterministicDeploy.checkDeploy("ECDSAValidator", EXPECTED_ECDSA_VALIDATOR_ADDRESS, VALIDATOR_CODE); return EXPECTED_ECDSA_VALIDATOR_ADDRESS; } diff --git a/script/deterministic/Factory.s.sol b/script/deterministic/Factory.s.sol index 4cf5a078..471e2c1a 100644 --- a/script/deterministic/Factory.s.sol +++ b/script/deterministic/Factory.s.sol @@ -4,9 +4,11 @@ import "./DeterministicDeploy.s.sol"; library FactoryDeploy { address payable constant EXPECTED_KERNEL_FACTORY_ADDRESS = payable(0x5de4839a76cf55d0c90e2061ef4386d962E15ae3); - bytes constant KERNEL_FACTORY_CODE = hex"00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789"; - function deploy() internal returns(address) { - DeterministicDeploy.checkDeploy("factory",EXPECTED_KERNEL_FACTORY_ADDRESS, KERNEL_FACTORY_CODE); + bytes constant KERNEL_FACTORY_CODE = + hex"00000000000000000000000000000000000000000000000000000000000000006080346100b257601f610b2d38819003918201601f19168301916001600160401b038311848410176100b75780849260409485528339810103126100b25780516001600160a01b0391828216918290036100b257602001519182168092036100b25780638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600080546001600160a01b031916919091179055604051610a5f90816100ce8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c9081630396cb60146107d45781632569296214610789578163296601cd1461059d5781634d6cb7001461052b5781635414dff0146104fa57816354d1f13d146104b4578163584465f2146104745781636544c82814610436578163715018a6146103f05781638da5cb5b146103c3578163b0d691fe1461039b578163bb30a9741461034557838263bb9fe6bf146102ec578263c23a5cea1461026157508163d7533f0214610243578163db4c545e14610219578163f04e283e14610199578163f2fde38b1461012c575063fee81cf4146100f657600080fd5b3461012857602036600319011261012857602091610112610845565b9063389a75e1600c525281600c20549051908152f35b5080fd5b8390602036600319011261012857610142610845565b9061014b61088e565b8160601b1561018e575060018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b83906020366003190112610128576101af610845565b906101b861088e565b63389a75e1600c528183526020600c20908154421161020e575082905560018060a01b0316638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188452601cfd5b5050346101285781600319360112610128576020906089601361023a6108d8565b01209051908152f35b505034610128578160031936011261012857602090516202a3008152f35b809184346102e85760203660031901126102e85781356001600160a01b0381811693918490036102e45761029361088e565b84541692833b156102e45760248592838551968794859363611d2e7560e11b85528401525af19081156102db57506102c85750f35b6102d190610a13565b6102d85780f35b80fd5b513d84823e3d90fd5b8480fd5b5050fd5b809184346102e857826003193601126102e85761030761088e565b82546001600160a01b031691823b1561034057815163bb9fe6bf60e01b81529284918491829084905af19081156102db57506102c85750f35b505050fd5b50503461012857806003193601126101285761035f610845565b90602435918215158093036103975761037661088e565b60018060a01b03168352600160205282209060ff8019835416911617905580f35b8380fd5b505034610128578160031936011261012857905490516001600160a01b039091168152602090f35b505034610128578160031936011261012857638b78c6d8195490516001600160a01b039091168152602090f35b83806003193601126102d85761040461088e565b80638b78c6d8198181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b5050346101285760203660031901126101285760209160ff9082906001600160a01b03610461610845565b1681526001855220541690519015158152f35b83903461012857602036600319011261012857356001600160a01b03811690819003610128576104a261088e565b81546001600160a01b03191617815580f35b83806003193601126102d85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b8284346102d85760203660031901126102d8575061051a602092356108ab565b90516001600160a01b039091168152f35b8284346102d857816003193601126102d85782359067ffffffffffffffff82116102d857506bffffffffffffffffffffffff61056f60209461051a93369101610860565b6105948580518381948a830196873781016024358a8201520388810184520182610a3d565b519020166108ab565b828460603660031901126102d8576105b3610845565b9160243567ffffffffffffffff8111610785576105d39036908601610860565b9360018060a01b039384821681526020966001885260ff858320541615610730576bffffffffffffffffffffffff8551898101908987833761062988828d8d82019060443590820152038d810184520182610a3d565b5190201696331560011715610724576106406108d8565b90601382019860898a2060ff86536035523060601b600152806015526055852099856035528a3b15610678575b8b8b8b8b5191168152f35b856089929394959697989b50f597881561071857918185939284938884527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8d85015289840137870190348a5af1156106fe57507f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20818692a3848080808080808061066d565b3d1561070d57503d81803e3d90fd5b63301164258252601cfd5b8363301164258652601cfd5b50632f6348368252601cfd5b845162461bcd60e51b8152908101889052602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608490fd5b8280fd5b83806003193601126102d85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b91905060203660031901126107855782823563ffffffff8116809103610128576107fc61088e565b81546001600160a01b031693843b156107855760249084519586938492621cb65b60e51b845283015234905af19081156102db5750610839575080f35b61084290610a13565b80f35b600435906001600160a01b038216820361085b57565b600080fd5b9181601f8401121561085b5782359167ffffffffffffffff831161085b576020838186019501011161085b57565b638b78c6d81954330361089d57565b6382b429006000526004601cfd5b608960136108b76108d8565b012060ff6000536035523060601b6001526015526055600020906000603552565b604051903060701c1561097c57666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d33738252565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d8252565b67ffffffffffffffff8111610a2757604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a2757604052560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789"; + + function deploy() internal returns (address) { + DeterministicDeploy.checkDeploy("factory", EXPECTED_KERNEL_FACTORY_ADDRESS, KERNEL_FACTORY_CODE); return EXPECTED_KERNEL_FACTORY_ADDRESS; } } diff --git a/script/deterministic/Factory_old.s.sol b/script/deterministic/Factory_old.s.sol index 41becba8..066e3004 100644 --- a/script/deterministic/Factory_old.s.sol +++ b/script/deterministic/Factory_old.s.sol @@ -2,12 +2,16 @@ pragma solidity ^0.8.0; import "./DeterministicDeploy.s.sol"; import "forge-std/Script.sol"; + contract Factory_old is Script { address constant DEPLOYER = 0x7A0D94F55792C434d74a40883C6ed8545E406D12; address constant EXPECTED_FACTORY = 0x5D006d3880645ec6e254E18C1F879DAC9Dd71A39; address constant EXPECTED_ECDSA_FACTORY = 0xD49a72cb78C44c6bfbf0d471581B7635cF62E81e; - bytes constant FACTORY_BYTECODE = hex"60e060405234801561001057600080fd5b50604051614de5380380614de583398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b8380610abe83390190565b6127a48061264183390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b83380380611b8383398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119c26101c160003960008181610347015261050c015260006110a6015260006110f5015260006110d001526000611029015260006110530152600061107d01526119c26000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161117d565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161117d565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c2929190611208565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061125e565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061125e565b60405180910390f35b34801561028657600080fd5b5061029a6102953660046112ba565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce366004611306565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b60405161027192919061135a565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c3660046113ae565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611429565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611465565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611488565b9050600061047482610ab8565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b60006105896101408601866114a1565b610598916004916000916114e8565b6105a191611512565b905060006105ae8661160f565b90506000806105c060608901896114a1565b6105cf916004916000916114e8565b6105d891611512565b90506001600160e01b03198416600003610670576105f58861160f565b92506106056101408901896114a1565b6106139160049082906114e8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a0576106936101408901896114a1565b6106a2916024916010916114e8565b6106ab9161171e565b60601c915036600081816106cc856106c76101408f018f6114a1565b610b29565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611751565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611765565b915050610842868280602001905181019061083d9190611488565b610f33565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611143565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611143565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d49190836118a2565b5060006109f686630c95955660e01b8686604051602401610417929190611751565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e90925090508082610ab05760405162461bcd60e51b8152600401610227919061125e565b509250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610af4575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b3e60586038898b6114e8565b610b4791611963565b905087605888610b578483611981565b92610b64939291906114e8565b909550935060008888610b78846058611981565b90610b84856078611981565b92610b91939291906114e8565b610b9a91611963565b60001c90506000610c7b7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bda939291906114e8565b610be391611963565b60001c8d8d602490603892610bfa939291906114e8565b610c039161171e565b60601c8b8b604051610c16929190611208565b604051908190038120610c6095949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fce565b90506000610cea610c8a6103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610cb48a6078611981565b9089610cc18c6078611981565b610ccb9190611981565b92610cd8939291906114e8565b60405160240161041793929190611465565b915050610d3a81806020019051810190610d049190611488565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d2b939291906114e8565b610d3491611963565b16610f33565b98508a8a84610d4a876078611981565b610d549190611981565b610d5f9282906114e8565b9550955060405180608001604052808c8c600490600a92610d82939291906114e8565b610d8b91611994565b60d01c65ffffffffffff1681526020018c8c600a90601092610daf939291906114e8565b610db891611994565b60d01c65ffffffffffff1681526020018c8c602490603892610ddc939291906114e8565b610de59161171e565b60601c6001600160a01b031681526020018c8c601090602492610e0a939291906114e8565b610e139161171e565b60601c9052610e206103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610ecb602460108c8e6114e8565b610ed49161171e565b60013090810180546001600160a01b03191660609390931c92909217909155600301610f01888a836118a2565b50888b60588c610f118883611981565b92610f1e939291906114e8565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f56575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f80578193505b8065ffffffffffff168365ffffffffffff161115610f9c578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fdb61101c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561107557507f000000000000000000000000000000000000000000000000000000000000000046145b1561109f57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061115757607f821691505b60208210810361117757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461119181611143565b808487015260406001808416600081146111b257600181146111cc576111fa565b60ff1985168984015283151560051b8901830195506111fa565b896000528660002060005b858110156111f25781548b82018601529083019088016111d7565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561123e57602081850181015186830182015201611222565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f86020830184611218565b60008083601f84011261128357600080fd5b50813567ffffffffffffffff81111561129b57600080fd5b6020830191508360208285010111156112b357600080fd5b9250929050565b6000806000604084860312156112cf57600080fd5b83359250602084013567ffffffffffffffff8111156112ed57600080fd5b6112f986828701611271565b9497909650939450505050565b60008060006060848603121561131b57600080fd5b833567ffffffffffffffff81111561133257600080fd5b8401610160818703121561134557600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061137e90830184611218565b949350505050565b6001600160a01b038116811461139b57600080fd5b50565b80356113a981611386565b919050565b600080600080606085870312156113c457600080fd5b84356113cf81611386565b935060208501356113df81611386565b9250604085013567ffffffffffffffff8111156113fb57600080fd5b61140787828801611271565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf611413565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061147f60408301848661143c565b95945050505050565b60006020828403121561149a57600080fd5b5051919050565b6000808335601e198436030181126114b857600080fd5b83018035915067ffffffffffffffff8211156114d357600080fd5b6020019150368190038213156112b357600080fd5b600080858511156114f857600080fd5b8386111561150557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561153a5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561157c5761157c611542565b60405290565b600082601f83011261159357600080fd5b813567ffffffffffffffff808211156115ae576115ae611542565b604051601f8301601f19908116603f011681019082821181831017156115d6576115d6611542565b816040528381528660208588010111156115ef57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561162257600080fd5b61162a611558565b6116338361139e565b815260208301356020820152604083013567ffffffffffffffff8082111561165a57600080fd5b61166636838701611582565b6040840152606085013591508082111561167f57600080fd5b61168b36838701611582565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116db57600080fd5b6116e736828801611582565b83850152506101409150818501358181111561170257600080fd5b61170e36828801611582565b8385015250505080915050919050565b6bffffffffffffffffffffffff19813581811691601485101561153a5760149490940360031b84901b1690921692915050565b60208152600061137e60208301848661143c565b6060815261177f6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117a76101c0850183611218565b91506060870151605f19808685030160c08701526117c58483611218565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526118218787611218565b9650808c0151955050505080868503016101a087015250506118438282611218565b602085019690965250505060400152919050565b601f82111561189d57600081815260208120601f850160051c8101602086101561187e5750805b601f850160051c820191505b81811015610a5b5782815560010161188a565b505050565b67ffffffffffffffff8311156118ba576118ba611542565b6118ce836118c88354611143565b83611857565b6000601f84116001811461190257600085156118ea5750838201355b600019600387901b1c1916600186901b17835561195c565b600083815260209020601f19861690835b828110156119335786850135825560209485019460019092019101611913565b50868210156119505760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf611413565b6001600160d01b0319813581811691600685101561153a5760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789"; - bytes constant ECDSA_FACTORY_BYTECODE = hex"60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b9392505050560000000000000000000000005d006d3880645ec6e254e18c1f879dac9dd71a39000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789"; + bytes constant FACTORY_BYTECODE = + hex"60e060405234801561001057600080fd5b50604051614de5380380614de583398101604081905261002f916100e1565b8060405161003c906100c7565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b03166080526040518190610083906100d4565b6001600160a01b039091168152602001604051809103906000f0801580156100af573d6000803e3d6000fd5b506001600160a01b0390811660a0521660c052610111565b611b8380610abe83390190565b6127a48061264183390190565b6000602082840312156100f357600080fd5b81516001600160a01b038116811461010a57600080fd5b9392505050565b60805160a05160c051610957610167600039600060f101526000818160ca01528181610191015281816102c3015261033701526000818160610152818161016f015281816102a1015261031501526109576000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063037637aa1461005c5780631bb12e691461009f578063296601cd146100b25780636c2f70fd146100c5578063b0d691fe146100ec575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100836100ad366004610471565b610113565b6100836100c0366004610471565b610243565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6000808585858560405160200161012d9493929190610508565b604051602081830303815290604052805190602001209050610237816040518060200161015990610464565b6020820181038252601f19601f820116604052507f0000000000000000000000000000000000000000000000000000000000000000897f00000000000000000000000000000000000000000000000000000000000000008a8a6040516024016101c5949392919061055e565b60408051601f19818403018152918152602080830180516001600160e01b031663cf7a1d7760e01b17905290516101fe939291016105b9565b60408051601f198184030181529082905261021c92916020016105fb565b60405160208183030381529060405280519060200120610426565b9150505b949350505050565b6000808585858560405160200161025d9493929190610508565b60405160208183030381529060405280519060200120905060006102f7826040518060200161028b90610464565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008a7f00000000000000000000000000000000000000000000000000000000000000008b8b6040516024016101c5949392919061055e565b90506001600160a01b0381163b1561031257915061023b9050565b817f0000000000000000000000000000000000000000000000000000000000000000887f0000000000000000000000000000000000000000000000000000000000000000898960405160240161036b949392919061055e565b60408051601f198184030181529181526020820180516001600160e01b031663cf7a1d7760e01b1790525161039f90610464565b6103aa9291906105b9565b8190604051809103906000f59050801580156103ca573d6000803e3d6000fd5b509250866001600160a01b0316836001600160a01b03167fa4ec333d142e947b3345528c6cbc210be703d984f8df2c3d589f2b3ea39f74378888886040516104149392919061062a565b60405180910390a35050949350505050565b600061043383833061043a565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6103088061064f83390190565b6000806000806060858703121561048757600080fd5b84356001600160a01b038116811461049e57600080fd5b9350602085013567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b95986020929092019750949560400135945092505050565b6bffffffffffffffffffffffff198560601b16815282846014830137601492019182015260340192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385811682528416602082015260606040820181905260009061058b9083018486610535565b9695505050505050565b60005b838110156105b0578181015183820152602001610598565b50506000910152565b60018060a01b038316815260406020820152600082518060408401526105e6816060850160208701610595565b601f01601f1916919091016060019392505050565b6000835161060d818460208801610595565b835190830190610621818360208801610595565b01949350505050565b60408152600061063e604083018587610535565b905082602083015294935050505056fe6080604052604051610308380380610308833981016040819052610022916101be565b6001600160a01b0382166100965760405162461bcd60e51b815260206004820152603060248201527f4549503139363750726f78793a20696d706c656d656e746174696f6e2069732060448201526f746865207a65726f206164647265737360801b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc82815581511561017c576000836001600160a01b0316836040516100db919061028c565b600060405180830381855af49150503d8060008114610116576040519150601f19603f3d011682016040523d82523d6000602084013e61011b565b606091505b505090508061017a5760405162461bcd60e51b815260206004820152602560248201527f4549503139363750726f78793a20636f6e7374727563746f722063616c6c2066604482015264185a5b195960da1b606482015260840161008d565b505b5050506102a8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101b557818101518382015260200161019d565b50506000910152565b600080604083850312156101d157600080fd5b82516001600160a01b03811681146101e857600080fd5b60208401519092506001600160401b038082111561020557600080fd5b818501915085601f83011261021957600080fd5b81518181111561022b5761022b610184565b604051601f8201601f19908116603f0116810190838211818310171561025357610253610184565b8160405282815288602084870101111561026c57600080fd5b61027d83602083016020880161019a565b80955050505050509250929050565b6000825161029e81846020870161019a565b9190910192915050565b6052806102b66000396000f3fe60806040526000602d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90503660008037600080366000845af43d6000803e808015604d573d6000f35b3d6000fd61016060405234801561001157600080fd5b50604051611b83380380611b8383398101604081905261003091610130565b604080518082018252600681526512d95c9b995b60d21b602080830191825283518085019094526005845264181718171960d91b908401528151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010f8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c05261012052505050506001600160a01b031661014052610160565b60006020828403121561014257600080fd5b81516001600160a01b038116811461015957600080fd5b9392505050565b60805160a05160c05160e0516101005161012051610140516119c26101c160003960008181610347015261050c015260006110a6015260006110f5015260006110d001526000611029015260006110530152600061107d01526119c26000f3fe6080604052600436106100745760003560e01c80634be5cd9f1161004e5780634be5cd9f146102e157806354fd4d5014610304578063b0d691fe14610335578063cf7a1d77146103815761007b565b806306fdde03146102325780631626ba7e1461027a5780633a871cdd146102b35761007b565b3661007b57005b3080546001600160a01b03167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560006100b56103a1565b6001015460405163064acaab60e11b8152600160501b9091046001600160a01b031691508190630c959556906100f290600288019060040161117d565b600060405180830381600087803b15801561010c57600080fd5b505af1158015610120573d6000803e3d6000fd5b50505050600061012d3090565b600101546001600160a01b0316905080156101a45760405163064acaab60e11b81526001600160a01b03821690630c9595569061017190600330019060040161117d565b600060405180830381600087803b15801561018b57600080fd5b505af115801561019f573d6000803e3d6000fd5b505050505b600080856001600160a01b03166000366040516101c2929190611208565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50915091508181906102305760405162461bcd60e51b8152600401610227919061125e565b60405180910390fd5b005b34801561023e57600080fd5b506102646040518060400160405280600681526020016512d95c9b995b60d21b81525081565b604051610271919061125e565b60405180910390f35b34801561028657600080fd5b5061029a6102953660046112ba565b6103d5565b6040516001600160e01b03199091168152602001610271565b3480156102bf57600080fd5b506102d36102ce366004611306565b6104ff565b604051908152602001610271565b3480156102ed57600080fd5b506102f661084f565b60405161027192919061135a565b34801561031057600080fd5b5061026460405180604001604052806005815260200164181718171960d91b81525081565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b34801561038d57600080fd5b5061023061039c3660046113ae565b6108f8565b6000806103cf60017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9611429565b92915050565b60008061044e6103e36103a1565b600101600a9054906101000a90046001600160a01b031663333daf9260e01b87878760405160240161041793929190611465565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610a63565b9150506000818060200190518101906104679190611488565b9050600061047482610ab8565b905042816020015165ffffffffffff16111561049e57506001600160e01b031992506104f8915050565b42816040015165ffffffffffff1610156104c657506001600160e01b031992506104f8915050565b80516001600160a01b0316156104ea57506001600160e01b031992506104f8915050565b50630b135d3f60e11b925050505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105795760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e74000000006044820152606401610227565b60006105896101408601866114a1565b610598916004916000916114e8565b6105a191611512565b905060006105ae8661160f565b90506000806105c060608901896114a1565b6105cf916004916000916114e8565b6105d891611512565b90506001600160e01b03198416600003610670576105f58861160f565b92506106056101408901896114a1565b6106139160049082906114e8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408401526106556103a1565b60010154600160501b90046001600160a01b031691506107ad565b6001600160e01b03198416600160e11b036107a0576106936101408901896114a1565b6106a2916024916010916114e8565b6106ab9161171e565b60601c915036600081816106cc856106c76101408f018f6114a1565b610b29565b604051949d50929750909550935091506000906106fe90889063064acaab60e11b906104179089908990602401611751565b509050806107595760405162461bcd60e51b815260206004820152602260248201527f6163636f756e743a20656e61626c65206d6f646520656e61626c65206661696c604482015261195960f21b6064820152608401610227565b82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140890152506107ad9350505050565b60019450505050506104f8565b85156107ff57604051600090339088908381818185875af1925050503d80600081146107f5576040519150601f19603f3d011682016040523d82523d6000602084013e6107fa565b606091505b505050505b600061082283633a871cdd60e01b868b8b60405160240161041793929190611765565b915050610842868280602001905181019061083d9190611488565b610f33565b9998505050505050505050565b3080546002820180546001600160a01b039092169260609290919061087390611143565b80601f016020809104026020016040519081016040528092919081815260200182805461089f90611143565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b50505050509150509091565b60006109026103a1565b6001810154909150600160501b90046001600160a01b0316156109675760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a6564000000006044820152606401610227565b6001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b03881602179055833080546001600160a01b0319166001600160a01b0392909216919091179055828230600201916109d49190836118a2565b5060006109f686630c95955660e01b8686604051602401610417929190611751565b50905080610a5b5760405162461bcd60e51b815260206004820152602c60248201527f6163636f756e743a20656e61626c65206661696c65642077697468206465666160448201526b3ab63a3b30b634b230ba37b960a11b6064820152608401610227565b505050505050565b600060606000808451602086016000885af260405160203d0181016040523d81523d6000602083013e90925090508082610ab05760405162461bcd60e51b8152600401610227919061125e565b509250929050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003610af4575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b60003681818180610b3e60586038898b6114e8565b610b4791611963565b905087605888610b578483611981565b92610b64939291906114e8565b909550935060008888610b78846058611981565b90610b84856078611981565b92610b91939291906114e8565b610b9a91611963565b60001c90506000610c7b7f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c600490602492610bda939291906114e8565b610be391611963565b60001c8d8d602490603892610bfa939291906114e8565b610c039161171e565b60601c8b8b604051610c16929190611208565b604051908190038120610c6095949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120610fce565b90506000610cea610c8a6103a1565b60010154600160501b90046001600160a01b031663199ed7c960e11b848e8e610cb48a6078611981565b9089610cc18c6078611981565b610ccb9190611981565b92610cd8939291906114e8565b60405160240161041793929190611465565b915050610d3a81806020019051810190610d049190611488565b60a06bffffffffffffffffffffffff8016901b8d8d600490602492610d2b939291906114e8565b610d3491611963565b16610f33565b98508a8a84610d4a876078611981565b610d549190611981565b610d5f9282906114e8565b9550955060405180608001604052808c8c600490600a92610d82939291906114e8565b610d8b91611994565b60d01c65ffffffffffff1681526020018c8c600a90601092610daf939291906114e8565b610db891611994565b60d01c65ffffffffffff1681526020018c8c602490603892610ddc939291906114e8565b610de59161171e565b60601c6001600160a01b031681526020018c8c601090602492610e0a939291906114e8565b610e139161171e565b60601c9052610e206103a1565b6001600160e01b03198e166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166bffffffffffffffffffffffff199094169390931766010000000000009190941602929092176bffffffffffffffffffffffff16600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055610ecb602460108c8e6114e8565b610ed49161171e565b60013090810180546001600160a01b03191660609390931c92909217909155600301610f01888a836118a2565b50888b60588c610f118883611981565b92610f1e939291906114e8565b98509850985050505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614610f56575060016103cf565b60a083811c9060d085811c9185901c9085901c65ffffffffffff8083169085161015610f80578193505b8065ffffffffffff168365ffffffffffff161115610f9c578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006103cf610fdb61101c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561107557507f000000000000000000000000000000000000000000000000000000000000000046145b1561109f57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600181811c9082168061115757607f821691505b60208210810361117757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845461119181611143565b808487015260406001808416600081146111b257600181146111cc576111fa565b60ff1985168984015283151560051b8901830195506111fa565b896000528660002060005b858110156111f25781548b82018601529083019088016111d7565b8a0184019650505b509398975050505050505050565b8183823760009101908152919050565b6000815180845260005b8181101561123e57602081850181015186830182015201611222565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006104f86020830184611218565b60008083601f84011261128357600080fd5b50813567ffffffffffffffff81111561129b57600080fd5b6020830191508360208285010111156112b357600080fd5b9250929050565b6000806000604084860312156112cf57600080fd5b83359250602084013567ffffffffffffffff8111156112ed57600080fd5b6112f986828701611271565b9497909650939450505050565b60008060006060848603121561131b57600080fd5b833567ffffffffffffffff81111561133257600080fd5b8401610160818703121561134557600080fd5b95602085013595506040909401359392505050565b6001600160a01b038316815260406020820181905260009061137e90830184611218565b949350505050565b6001600160a01b038116811461139b57600080fd5b50565b80356113a981611386565b919050565b600080600080606085870312156113c457600080fd5b84356113cf81611386565b935060208501356113df81611386565b9250604085013567ffffffffffffffff8111156113fb57600080fd5b61140787828801611271565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103cf576103cf611413565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061147f60408301848661143c565b95945050505050565b60006020828403121561149a57600080fd5b5051919050565b6000808335601e198436030181126114b857600080fd5b83018035915067ffffffffffffffff8211156114d357600080fd5b6020019150368190038213156112b357600080fd5b600080858511156114f857600080fd5b8386111561150557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561153a5780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff8111828210171561157c5761157c611542565b60405290565b600082601f83011261159357600080fd5b813567ffffffffffffffff808211156115ae576115ae611542565b604051601f8301601f19908116603f011681019082821181831017156115d6576115d6611542565b816040528381528660208588010111156115ef57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561162257600080fd5b61162a611558565b6116338361139e565b815260208301356020820152604083013567ffffffffffffffff8082111561165a57600080fd5b61166636838701611582565b6040840152606085013591508082111561167f57600080fd5b61168b36838701611582565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e084015261010091508185013582840152610120915081850135818111156116db57600080fd5b6116e736828801611582565b83850152506101409150818501358181111561170257600080fd5b61170e36828801611582565b8385015250505080915050919050565b6bffffffffffffffffffffffff19813581811691601485101561153a5760149490940360031b84901b1690921692915050565b60208152600061137e60208301848661143c565b6060815261177f6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526117a76101c0850183611218565b91506060870151605f19808685030160c08701526117c58483611218565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a01526118218787611218565b9650808c0151955050505080868503016101a087015250506118438282611218565b602085019690965250505060400152919050565b601f82111561189d57600081815260208120601f850160051c8101602086101561187e5750805b601f850160051c820191505b81811015610a5b5782815560010161188a565b505050565b67ffffffffffffffff8311156118ba576118ba611542565b6118ce836118c88354611143565b83611857565b6000601f84116001811461190257600085156118ea5750838201355b600019600387901b1c1916600186901b17835561195c565b600083815260209020601f19861690835b828110156119335786850135825560209485019460019092019101611913565b50868210156119505760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b803560208310156103cf57600019602084900360031b1b1692915050565b808201808211156103cf576103cf611413565b6001600160d01b0319813581811691600685101561153a5760069490940360031b84901b1690921692915050566101606040523480156200001257600080fd5b50604051620027a4380380620027a483398101604081905262000035916200018e565b604080518082018252600681526512d95c9b995b60d21b6020808301918252835180850185526005815264181718171960d91b908201529151902060e08190527fb30367effb941b728181f67f3bd24a38a4fff408ee7fb3b074425c9fb5e9be746101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c09384019096528051940193909320909252919052610120526001600160a01b038116610140528060016200012962000158565b600101600a6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050620001e2565b6000806200018860017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9620001c0565b92915050565b600060208284031215620001a157600080fd5b81516001600160a01b0381168114620001b957600080fd5b9392505050565b818103818111156200018857634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005161012051610140516125286200027c60003960008181610135015281816104af015281816106ff015281816108d30152818161098301528181610e5a01528181610f72015281816110ae0152818161123201526113a901526000611a4501526000611a9401526000611a6f015260006119c8015260006119f201526000611a1c01526125286000f3fe6080604052600436106101235760003560e01c806354fd4d50116100a0578063bc197c8111610064578063bc197c81146104d1578063d087d28814610500578063d1f5789414610515578063d541622114610535578063f23a6e61146105555761012a565b806354fd4d501461040b57806355b14f501461043c57806357b750471461045c57806388e7fd0614610471578063b0d691fe1461049d5761012a565b80633659cfe6116100e75780633659cfe6146103105780633a871cdd146103305780633e1b08121461035e57806351166ba01461037e57806351945447146103eb5761012a565b806306fdde03146102165780630b3dc3541461025e578063150b7a021461028b5780631626ba7e146102d057806329f8b174146102f05761012a565b3661012a57005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a75760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e740000000060448201526064015b60405180910390fd5b600080356001600160e01b031916905060006101c1610582565b6001600160e01b0319831660009081526002919091016020526040812054600160601b90046001600160a01b0316915036908037600080366000845af43d6000803e80801561020f573d6000f35b3d6000fd5b005b34801561022257600080fd5b506102486040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102559190611b28565b60405180910390f35b34801561026a57600080fd5b506102736105b6565b6040516001600160a01b039091168152602001610255565b34801561029757600080fd5b506102b76102a6366004611bab565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b3480156102dc57600080fd5b506102b76102eb366004611c1d565b6105d9565b3480156102fc57600080fd5b5061021461030b366004611c96565b6106f4565b34801561031c57600080fd5b5061021461032b366004611d30565b6108c8565b34801561033c57600080fd5b5061035061034b366004611d4d565b610976565b604051908152602001610255565b34801561036a57600080fd5b50610350610379366004611da0565b610e33565b34801561038a57600080fd5b5061039e610399366004611dc9565b610ecd565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b039081169282019290925260609283015190911691810191909152608001610255565b3480156103f757600080fd5b50610214610406366004611de4565b610f67565b34801561041757600080fd5b5061024860405180604001604052806005815260200164181718171960d91b81525081565b34801561044857600080fd5b50610214610457366004611e5b565b6110a3565b34801561046857600080fd5b506102b76111da565b34801561047d57600080fd5b506104866111f0565b60405165ffffffffffff9091168152602001610255565b3480156104a957600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506102b76104ec366004611eda565b63bc197c8160e01b98975050505050505050565b34801561050c57600080fd5b50610350611213565b34801561052157600080fd5b50610214610530366004611e5b565b6112aa565b34801561054157600080fd5b50610214610550366004611dc9565b61139e565b34801561056157600080fd5b506102b7610570366004611f98565b63f23a6e6160e01b9695505050505050565b6000806105b060017f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9612029565b92915050565b60006105c0610582565b60010154600160501b90046001600160a01b0316919050565b6000806105e4610582565b6001015460405163199ed7c960e11b8152600160501b9091046001600160a01b03169063333daf929061061f90889088908890600401612065565b602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190612088565b9050600061066d82611442565b905042816020015165ffffffffffff16111561069657506001600160e01b031991506106ed9050565b42816040015165ffffffffffff1610156106bd57506001600160e01b031991506106ed9050565b80516001600160a01b0316156106e057506001600160e01b031991506106ed9050565b50630b135d3f60e11b9150505b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061072a57503330145b6107465760405162461bcd60e51b815260040161019e906120a1565b60405180608001604052808565ffffffffffff1681526020018465ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b0316815250610791610582565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176001600160601b0316600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c9595569061084990859085906004016120ee565b600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108fe57503330145b61091a5760405162461bcd60e51b815260040161019e906120a1565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109f05760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279506f696e7400000000604482015260640161019e565b6000610a0061014086018661210a565b610a0f91600491600091612150565b610a189161217a565b9050610a22610582565b6001015460e01b81166001600160e01b03191615610a7a5760405162461bcd60e51b81526020600482015260156024820152741ad95c9b995b0e881b5bd91948191a5cd8589b1959605a1b604482015260640161019e565b6000610a8586612275565b9050600080610a97606089018961210a565b610aa691600491600091612150565b610aaf9161217a565b90506001600160e01b03198416600003610b4757610acc88612275565b9250610adc61014089018961210a565b610aea916004908290612150565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140840152610b2c610582565b60010154600160501b90046001600160a01b03169150610d59565b6001600160e01b03198416600160e01b03610c3d576000610b66610582565b6001600160e01b0319831660009081526002919091016020526040902060018101546001600160a01b03169350905082610bb957610ba2610582565b60010154600160501b90046001600160a01b031692505b610bc76101408a018a61210a565b610bd5916004908290612150565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101408501525460d081901b6001600160d01b031916600160301b90910460a01b65ffffffffffff60a01b16179450610d59565b6001600160e01b03198416600160e11b03610d4c57610c6061014089018961210a565b610c6f91602491601091612150565b610c7891612383565b60601c91503660008181610c9985610c946101408f018f61210a565b6114b3565b60405163064acaab60e11b8152949d50929750909550935091506001600160a01b03871690630c95955690610cd490879087906004016120ee565b600060405180830381600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b5050505081818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061014088015250610d5992505050565b60019450505050506106ed565b8515610dab57604051600090339088908381818185875af1925050503d8060008114610da1576040519150601f19603f3d011682016040523d82523d6000602084013e610da6565b606091505b505050505b610e2785836001600160a01b0316633a871cdd868b8b6040518463ffffffff1660e01b8152600401610ddf939291906123b1565b6020604051808303816000875af1158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190612088565b611864565b98975050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612088565b604080516080810182526000808252602082018190529181018290526060810191909152610ef9610582565b6001600160e01b0319909216600090815260029290920160209081526040928390208351608081018552815465ffffffffffff8082168352600160301b820416938201939093526001600160a01b03600160601b909304831694810194909452600101541660608301525090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdf5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e7400000000604482015260640161019e565b600060606001836001811115610ff757610ff76124a3565b036110465761103c8786868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118ff92505050565b909250905061108d565b611087878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061193592505050565b90925090505b8161109a57805160208201fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957503330145b6110f55760405162461bcd60e51b815260040161019e906120a1565b60006110ff610582565b60010154600160501b90046001600160a01b031690508361111e610582565b6001018054600160501b600160f01b031916600160501b6001600160a01b0393841602179055604051858216918316907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b600060405180830381600087803b1580156111bc57600080fd5b505af11580156111d0573d6000803e3d6000fd5b5050505050505050565b60006111e4610582565b6001015460e01b919050565b60006111fa610582565b60010154640100000000900465ffffffffffff16919050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190612088565b905090565b60006112b4610582565b6001810154909150600160501b90046001600160a01b0316156113195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a20616c726561647920696e697469616c697a656400000000604482015260640161019e565b600181018054600160501b600160f01b031916600160501b6001600160a01b038716908102919091179091556040516000907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c908290a360405163064acaab60e11b81526001600160a01b03851690630c959556906111a290869086906004016120ee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113d457503330145b6113f05760405162461bcd60e51b815260040161019e906120a1565b806113f9610582565b600101805463ffffffff191660e09290921c9190911790554261141a610582565b60010160046101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361147e575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600036818181806114c860586038898b612150565b6114d1916124b9565b9050876058886114e184836124d7565b926114ee93929190612150565b9095509350600088886115028460586124d7565b9061150e8560786124d7565b9261151b93929190612150565b611524916124b9565b60001c905060006116057f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641768c8c8c60049060249261156493929190612150565b61156d916124b9565b60001c8d8d60249060389261158493929190612150565b61158d91612383565b60601c8b8b6040516115a09291906124ea565b6040519081900381206115ea95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b6040516020818303038152906040528051906020012061196d565b90506116ed611612610582565b60010154600160501b90046001600160a01b031663333daf92838d8d6116398960786124d7565b90886116468b60786124d7565b61165091906124d7565b9261165d93929190612150565b6040518463ffffffff1660e01b815260040161167b93929190612065565b602060405180830381865afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bc9190612088565b60a06001600160601b038016901b8c8c6004906024926116de93929190612150565b6116e7916124b9565b16611864565b97508989836116fd8660786124d7565b61170791906124d7565b611712928290612150565b6040805160808101909152919650945080611731600a60048d8f612150565b61173a916124fa565b60d01c81526020016117506010600a8d8f612150565b611759916124fa565b60d01c815260200161176f603860248d8f612150565b61177891612383565b60601c815260200161178e602460108d8f612150565b61179791612383565b60601c90526117a4610582565b6001600160e01b03198d166000908152600291909101602090815260409182902083518154928501519385015165ffffffffffff9182166001600160601b031990941693909317600160301b9190941602929092176001600160601b0316600160601b6001600160a01b0392831602178255606090920151600190910180546001600160a01b03191691909216179055878a60588b61184387836124d7565b9261185093929190612150565b975097509750505050939792965093509350565b6000816001600160a01b0316836001600160a01b031614611887575060016105b0565b60a083811c9060d085811c9185901c9085901c65ffffffffffff80831690851610156118b1578193505b8065ffffffffffff168365ffffffffffff1611156118cd578092505b60d08365ffffffffffff16901b60a08565ffffffffffff16901b886001600160a01b0316171794505050505092915050565b60006060600080845160208601875af491503d604051602082018101604052818152816000602083013e80925050509250929050565b6000606060008084516020860187895af191503d604051602082018101604052818152816000602083013e8092505050935093915050565b60006105b061197a6119bb565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611a1457507f000000000000000000000000000000000000000000000000000000000000000046145b15611a3e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000815180845260005b81811015611b0857602081850181015186830182015201611aec565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006106ed6020830184611ae2565b6001600160a01b0381168114611b5057600080fd5b50565b8035611b5e81611b3b565b919050565b60008083601f840112611b7557600080fd5b5081356001600160401b03811115611b8c57600080fd5b602083019150836020828501011115611ba457600080fd5b9250929050565b600080600080600060808688031215611bc357600080fd5b8535611bce81611b3b565b94506020860135611bde81611b3b565b93506040860135925060608601356001600160401b03811115611c0057600080fd5b611c0c88828901611b63565b969995985093965092949392505050565b600080600060408486031215611c3257600080fd5b8335925060208401356001600160401b03811115611c4f57600080fd5b611c5b86828701611b63565b9497909650939450505050565b80356001600160e01b031981168114611b5e57600080fd5b803565ffffffffffff81168114611b5e57600080fd5b600080600080600080600060c0888a031215611cb157600080fd5b611cba88611c68565b96506020880135611cca81611b3b565b95506040880135611cda81611b3b565b9450611ce860608901611c80565b9350611cf660808901611c80565b925060a08801356001600160401b03811115611d1157600080fd5b611d1d8a828b01611b63565b989b979a50959850939692959293505050565b600060208284031215611d4257600080fd5b81356106ed81611b3b565b600080600060608486031215611d6257600080fd5b83356001600160401b03811115611d7857600080fd5b84016101608187031215611d8b57600080fd5b95602085013595506040909401359392505050565b600060208284031215611db257600080fd5b81356001600160c01b03811681146106ed57600080fd5b600060208284031215611ddb57600080fd5b6106ed82611c68565b600080600080600060808688031215611dfc57600080fd5b8535611e0781611b3b565b94506020860135935060408601356001600160401b03811115611e2957600080fd5b611e3588828901611b63565b909450925050606086013560028110611e4d57600080fd5b809150509295509295909350565b600080600060408486031215611e7057600080fd5b8335611e7b81611b3b565b925060208401356001600160401b03811115611c4f57600080fd5b60008083601f840112611ea857600080fd5b5081356001600160401b03811115611ebf57600080fd5b6020830191508360208260051b8501011115611ba457600080fd5b60008060008060008060008060a0898b031215611ef657600080fd5b8835611f0181611b3b565b97506020890135611f1181611b3b565b965060408901356001600160401b0380821115611f2d57600080fd5b611f398c838d01611e96565b909850965060608b0135915080821115611f5257600080fd5b611f5e8c838d01611e96565b909650945060808b0135915080821115611f7757600080fd5b50611f848b828c01611b63565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215611fb157600080fd5b8635611fbc81611b3b565b95506020870135611fcc81611b3b565b9450604087013593506060870135925060808701356001600160401b03811115611ff557600080fd5b61200189828a01611b63565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b0576105b0612013565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061207f60408301848661203c565b95945050505050565b60006020828403121561209a57600080fd5b5051919050565b6020808252602d908201527f6163636f756e743a206e6f742066726f6d20656e747279706f696e74206f722060408201526c37bbb732b91037b91039b2b63360991b606082015260800190565b60208152600061210260208301848661203c565b949350505050565b6000808335601e1984360301811261212157600080fd5b8301803591506001600160401b0382111561213b57600080fd5b602001915036819003821315611ba457600080fd5b6000808585111561216057600080fd5b8386111561216d57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156121a25780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156121e3576121e36121aa565b60405290565b600082601f8301126121fa57600080fd5b81356001600160401b0380821115612214576122146121aa565b604051601f8301601f19908116603f0116810190828211818310171561223c5761223c6121aa565b8160405283815286602085880101111561225557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610160823603121561228857600080fd5b6122906121c0565b61229983611b53565b81526020830135602082015260408301356001600160401b03808211156122bf57600080fd5b6122cb368387016121e9565b604084015260608501359150808211156122e457600080fd5b6122f0368387016121e9565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561234057600080fd5b61234c368288016121e9565b83850152506101409150818501358181111561236757600080fd5b612373368288016121e9565b8385015250505080915050919050565b6001600160601b031981358181169160148510156121a25760149490940360031b84901b1690921692915050565b606081526123cb6060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526123f36101c0850183611ae2565b91506060870151605f19808685030160c08701526124118483611ae2565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261246d8787611ae2565b9650808c0151955050505080868503016101a0870152505061248f8282611ae2565b602085019690965250505060400152919050565b634e487b7160e01b600052602160045260246000fd5b803560208310156105b057600019602084900360031b1b1692915050565b808201808211156105b0576105b0612013565b8183823760009101908152919050565b6001600160d01b031981358181169160068510156121a25760069490940360031b84901b1690921692915050560000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789"; + bytes constant ECDSA_FACTORY_BYTECODE = + hex"60e060405234801561001057600080fd5b5060405161048338038061048383398101604081905261002f91610064565b6001600160a01b0392831660805290821660a0521660c0526100b1565b6001600160a01b038116811461006157600080fd5b50565b60008060006060848603121561007957600080fd5b83516100848161004c565b60208501519093506100958161004c565b60408501519092506100a68161004c565b809150509250925092565b60805160a05160c05161038a6100f9600039600060ca015260008181609001528181610188015261027201526000818160f101528181610153015261023d015261038a6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d253d761461005c5780633a5381b51461008b5780635fbfb9cf146100b2578063b0d691fe146100c5578063bc10273e146100ec575b600080fd5b61006f61006a3660046102d5565b610113565b6040516001600160a01b03909116815260200160405180910390f35b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f6100c03660046102d5565b6101fd565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b61006f7f000000000000000000000000000000000000000000000000000000000000000081565b60408051606084901b6bffffffffffffffffffffffff19166020820152815160148183030181526034820192839052631bb12e6960e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb12e69906101b4907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b602060405180830381865afa1580156101d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f59190610366565b949350505050565b60408051606084901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263296601cd60e01b909252600091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063296601cd9061029e907f00000000000000000000000000000000000000000000000000000000000000009085908890603801610301565b6020604051808303816000875af11580156101d1573d6000803e3d6000fd5b6001600160a01b03811681146102d257600080fd5b50565b600080604083850312156102e857600080fd5b82356102f3816102bd565b946020939093013593505050565b60018060a01b038416815260006020606081840152845180606085015260005b8181101561033d57868101830151858201608001528201610321565b506000608082860101526080601f19601f83011685010192505050826040830152949350505050565b60006020828403121561037857600080fd5b8151610383816102bd565b9392505050560000000000000000000000005d006d3880645ec6e254e18c1f879dac9dd71a39000000000000000000000000180d6465f921c7e0dea0040107d342c87455fff50000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789"; + function run() external { address caller = 0x9775137314fE595c943712B0b336327dfa80aE8A; vm.startBroadcast(caller); diff --git a/script/deterministic/Kernel2_2.s.sol b/script/deterministic/Kernel2_2.s.sol index a58113e8..a2b41d29 100644 --- a/script/deterministic/Kernel2_2.s.sol +++ b/script/deterministic/Kernel2_2.s.sol @@ -1,12 +1,16 @@ pragma solidity ^0.8.0; + import "./DeterministicDeploy.s.sol"; library Kernel_2_2_Deploy { address constant EXPECTED_KERNEL_2_2_ADDRESS = 0x0DA6a956B9488eD4dd761E59f52FDc6c8068E6B5; - bytes constant KERNEL_2_2_CODE = hex"000000000000000000000000000000000000000000000000000000000000000061014034620001b757601f620021e238819003918201601f19168301916001600160401b03831184841017620001bc57808492602094604052833981010312620001b757516001600160a01b0381168103620001b757306080524660a05260a062000069620001d2565b600681526005602082016512d95c9b995b60d21b815260206200008b620001d2565b838152019264181719171960d91b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611fef9283620001f3843960805183611a6a015260a05183611a8d015260c05183611aff015260e05183611b2501525182611a490152518181816104db0152818161079a015281816108a701528181610a3201528181610b5a01528181610d5401528181610e7501528181610f740152818161109e01528181611147015261148e0152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001bc5760405256fe6080604052600436101561001d575b366110815761001b611ece565b005b60003560e01c806306fdde031461018d5780630b3dc35414610188578063150b7a02146101835780631626ba7e1461017e57806329f8b17414610179578063333daf921461017457806334fcd5be1461016f5780633659cfe61461016a5780633a871cdd146101655780633e1b08121461016057806351166ba01461015b578063519454471461015657806354fd4d501461015157806355b14f501461014c57806357b750471461014757806384b0196e1461014257806388e7fd061461013d578063b0d691fe14610138578063bc197c8114610133578063d087d2881461012e578063d1f5789414610129578063d5416221146101245763f23a6e610361000e57610fef565b610f5d565b610ec1565b610e42565b610db3565b610d3e565b610d09565b610c61565b610c2a565b610b44565b610af0565b6109eb565b610922565b61085e565b61081c565b610776565b610693565b61060e565b610466565b610413565b610386565b610307565b6102d3565b600091031261019d57565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101cb57604052565b6101a2565b606081019081106001600160401b038211176101cb57604052565b608081019081106001600160401b038211176101cb57604052565b604081019081106001600160401b038211176101cb57604052565b90601f801991011681019081106001600160401b038211176101cb57604052565b6040519061024f826101eb565b565b6040519061016082018281106001600160401b038211176101cb57604052565b6040519061027e82610206565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b8481106102bf575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161029e565b3461019d57600036600319011261019d576103036102ef610271565b604051918291602083526020830190610293565b0390f35b3461019d57600036600319011261019d576020600080516020611fcf8339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361019d57565b359061024f8261033d565b9181601f8401121561019d578235916001600160401b03831161019d576020838186019501011161019d57565b3461019d57608036600319011261019d576103a260043561033d565b6103ad60243561033d565b6064356001600160401b03811161019d576103cc903690600401610359565b5050604051630a85bd0160e11b8152602090f35b90604060031983011261019d5760043591602435906001600160401b03821161019d5761040f91600401610359565b9091565b3461019d57602061042c610426366103e0565b91611b5b565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361019d57565b65ffffffffffff81160361019d57565b60c036600319011261019d5761047a61043f565b602435906104878261033d565b604435906104948261033d565b6064356104a081610456565b608435936104ad85610456565b60a4356001600160401b03811161019d576104cc903690600401610359565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610604575b6105f25784926105396105659261052a61051c610242565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261056087611049565b61172b565b1693843b1561019d576040519063064acaab60e11b8252818061058f6000998a94600484016117de565b038183895af180156105ed576105d4575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b806105e16105e7926101b8565b80610192565b386105a0565b611475565b604051637046c88d60e01b8152600490fd5b5030331415610504565b3461019d576020610627610621366103e0565b91611e13565b604051908152f35b9291926001600160401b0382116101cb5760405191610658601f8201601f191660200184610221565b82948184528183011161019d578281602093846000960137010152565b9080601f8301121561019d578160206106909335910161062f565b90565b60208060031936011261019d576001600160401b0360043581811161019d573660238201121561019d578060040135918083116101cb578260051b906040908151946106e187850187610221565b855285850191602480948601019436861161019d57848101935b86851061070b5761001b88611144565b843584811161019d5782016060602319823603011261019d57835191610730836101d0565b8782013561073d8161033d565b835260448201358b84015260648201359286841161019d576107678c94938a869536920101610675565b868201528152019401936106fb565b602036600319011261019d5760043561078e8161033d565b6001600160a01b0390337f00000000000000000000000000000000000000000000000000000000000000008316141580610812575b6105f257807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b50303314156107c3565b60031960603682011261019d57600435906001600160401b03821161019d5761016090823603011261019d576106276020916044359060243590600401611481565b3461019d57602036600319011261019d576004356001600160c01b0381169081900361019d57604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156105ed57610303916000916108f4575b506040519081529081906020820190565b610915915060203d811161091b575b61090d8183610221565b810190611396565b386108e3565b503d610903565b3461019d57602036600319011261019d5761030361096761094161043f565b60006060604051610951816101eb565b8281528260208201528260408201520152611049565b60405190610974826101eb565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261019d57600435610a038161033d565b6044356001600160401b03811161019d57610a22903690600401610675565b90606435600281101561019d57337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac5575b80610ab0575b6105f257610a75816110fa565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b6040516367ce775960e01b8152600490fd5b50610ac0610abc611c13565b1590565b610a68565b5030331415610a62565b60405190610adc82610206565b6005825264181719171960d91b6020830152565b3461019d57600036600319011261019d576103036102ef610acf565b90604060031983011261019d57600435610b258161033d565b91602435906001600160401b03821161019d5761040f91600401610359565b610b4d36610b0c565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c20575b6105f25780600080516020611fcf8339815191525460501c1691610ba681611eff565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c1c578385610bfa819593829463064acaab60e11b8452600484016117de565b03925af180156105ed57610c0c575080f35b806105e1610c19926101b8565b80f35b8380fd5b5030331415610b83565b3461019d57600036600319011261019d576020600080516020611fcf8339815191525460e01b6040519063ffffffff60e01b168152f35b3461019d57600036600319011261019d57610cb7610c7d610271565b610c85610acf565b90604051928392600f60f81b8452610ca960209360e08587015260e0860190610293565b908482036040860152610293565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf257505050500390f35b835185528695509381019392810192600101610ce3565b3461019d57600036600319011261019d576020600080516020611fcf8339815191525465ffffffffffff60405191831c168152f35b3461019d57600036600319011261019d576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f8401121561019d578235916001600160401b03831161019d576020808501948460051b01011161019d57565b3461019d5760a036600319011261019d57610dcf60043561033d565b610dda60243561033d565b6001600160401b0360443581811161019d57610dfa903690600401610d83565b505060643581811161019d57610e14903690600401610d83565b505060843590811161019d57610e2e903690600401610359565b505060405163bc197c8160e01b8152602090f35b3461019d57600036600319011261019d57604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156105ed57610303916000916108f457506040519081529081906020820190565b610eca36610b0c565b600080516020611fcf83398151915254919290916001600160a01b03919060501c8216610f4c57610efa81611eff565b1691823b1561019d57610f2f926000928360405180968195829463064acaab60e11b84526020600485015260248401916117bd565b03925af180156105ed57610f3f57005b806105e161001b926101b8565b60405162dc149f60e41b8152600490fd5b602036600319011261019d57610f7161043f565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fe5575b6105f257600080516020611fcf83398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fa4565b3461019d5760a036600319011261019d5761100b60043561033d565b61101660243561033d565b6084356001600160401b03811161019d57611035903690600401610359565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109781356001600160e01b031916611049565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110eb575b6105f257818091368280378136915af43d82803e15610a9a573d90f35b506110f4611c13565b156110ce565b6002111561110457565b634e487b7160e01b600052602160045260246000fd5b805182101561112e5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806111d1575b6105f25780519060005b82811061118d57505050565b60008061119a838561111a565b5180516001600160a01b03166020916040838201519101519283519301915af13d6000803e156111cc57600101611181565b3d6000fd5b506111dd610abc611c13565b611177565b9060041161019d5790600490565b909291928360041161019d57831161019d57600401916003190190565b9060241161019d5760100190601490565b9060581161019d5760380190602090565b9060241161019d5760040190602090565b9060381161019d5760240190601490565b90600a1161019d5760040190600690565b9060101161019d57600a0190600690565b9093929384831161019d57841161019d578101920390565b6001600160e01b031990358181169392600481106112a857505050565b60040360031b82901b16169150565b91906101608382031261019d576112cc610251565b926112d68161034e565b8452602081013560208501526040810135916001600160401b039283811161019d5781611304918401610675565b6040860152606082013583811161019d5781611321918401610675565b60608601526080820135608086015260a082013560a086015260c082013560c086015260e082013560e086015261010080830135908601526101208083013584811161019d5782611373918501610675565b90860152610140928383013590811161019d576113909201610675565b90830152565b9081602091031261019d575190565b606080825282516001600160a01b0316908201529193929160409161146b9060208101516080840152838101516113ea610160918260a08701526101c0860190610293565b9061145861140a606085015193605f1994858983030160c08a0152610293565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610293565b92015190848303016101a0850152610293565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b039392917f00000000000000000000000000000000000000000000000000000000000000008516330361169f576004948535928361014481013501918760248401930135946114e06114da87866111e2565b9061128b565b926001600160e01b031980851691821561167c576114ff9036906112b7565b94611519600080516020611fcf8339815191525460e01b90565b1616156115315760405163fc2f51c560e01b81528a90fd5b97989697600160e01b810361162b575090602095966115bb61158961157061156b6114da87606460009901350160248782013591016111e2565b611049565b6001810154909a9081906001600160a01b0316986111f0565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617995b8b61161d575b369161062f565b6101408501526115df604051998a9788968794633a871cdd60e01b865285016113a5565b0393165af19081156105ed57610690926000926115fd575b50611f4c565b61161691925060203d811161091b5761090d8183610221565b90386115f7565b348080808f335af1506115b4565b9095939190600160e11b0361166f576116656115bb946000936116606114da8a606460209c01350160248d82013591016111e2565b6117ef565b91999296916115ae565b5050505050505050600190565b9697505050505050506106909394508215611d47573434343486335af150611d47565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff1990358181169392601481106116d357505050565b60140360031b82901b16169150565b3590602081106116f0575090565b6000199060200360031b1b1690565b6001600160d01b0319903581811693926006811061171c57505050565b60060360031b82901b16169150565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b90602091808252806000848401376000828201840152601f01601f1916010190565b908060209392818452848401376000828201840152601f01601f1916010190565b9160206106909381815201916117bd565b91906117fb828261120d565b611804916116b1565b60601c93611812838361121e565b61181b916116e2565b605883016078820194858360580190611835918388611273565b61183e916116e2565b611848828761122f565b611851916116e2565b61185b8388611240565b611864916116b1565b60601c61187236878761062f565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641769381019384526001600160e01b03198e169181019190915260608101949094526001600160a01b0392909216608084015260a080840192909252908252906118e860c082610221565b5190206118f490611a47565b9084019660788801611907918489611273565b9061191192611e13565b61191b828761122f565b6001600160a01b03199161192f91906116e2565b1661193991611f4c565b9660788688010196820360771901956119528382611251565b61195b916116ff565b60d01c926119698183611262565b611972916116ff565b60d01c916119808282611240565b611989916116b1565b60601c916119969161120d565b61199f916116b1565b60601c916119ab610242565b65ffffffffffff909516855265ffffffffffff1660208501526001600160a01b031660408401526001600160a01b031660608301526119e990611049565b906119f39161172b565b6001600160a01b03871691823b1561019d57611a29926000928360405180968195829463064acaab60e11b8452600484016117de565b03925af180156105ed57611a3a5750565b806105e161024f926101b8565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611ad4575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611ab5565b90611b669291611e13565b65ffffffffffff808260a01c16908115600114611bd1575b428360d01c11611bc15742911610611bb4576001600160a01b0316611ba857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b905080611b7e565b9081602091031261019d5751801515810361019d5790565b6001600160a01b0390911681526040602082018190526106909291019061179b565b611c1d3633611e7b565b611d4257611c366000356001600160e01b031916611049565b6001810154611c55906001600160a01b03165b6001600160a01b031690565b906001600160a01b03821615908115611d06575b8115611cdb575b5015611c7c5750600090565b60206040518092639ea9bd5960e01b82528180611c9d363360048401611bf1565b03915afa9081156105ed57600091611cb3575090565b610690915060203d8111611cd4575b611ccc8183610221565b810190611bd9565b503d611cc2565b54611cf5915065ffffffffffff165b65ffffffffffff1690565b65ffffffffffff4291161138611c70565b905065ffffffffffff611d26611cea835465ffffffffffff9060301c1690565b168015159081611d38575b5090611c69565b9050421138611d31565b600190565b9091611d5336836112b7565b610140928381013590601e198136030182121561019d5701938435946001600160401b03861161019d5760200193853603851361019d57611d9d6115b487611de5986020986111f0565b908301526000611dc7611c49600080516020611fcf8339815191525460501c60018060a01b031690565b9260405196879586948593633a871cdd60e01b8552600485016113a5565b03925af19081156105ed57600091611dfb575090565b610690915060203d811161091b5761090d8183610221565b600080516020611fcf833981519152546040805163199ed7c960e11b8152600481019390935260248301529092602092849260501c6001600160a01b03169183918291611e65916044840191906117bd565b03915afa9081156105ed57600091611dfb575090565b600080516020611fcf8339815191525460408051639ea9bd5960e01b81526001600160a01b039384166004820152602481019190915292602092849260501c169082908190611c9d90604483019061179b565b7f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460408051338152346020820152a1565b600080516020611fcf83398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611f67575050600190565b65ffffffffffff60a01b8181169265ffffffffffff60a01b1992831692811691908415611fc5575b81168015611fbe575b848110908518028085189414611fb6575b5081811190821802181790565b925038611fa9565b5080611f98565b93508093611f8f56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789"; + bytes constant KERNEL_2_2_CODE = + hex"000000000000000000000000000000000000000000000000000000000000000061014034620001b757601f620021e238819003918201601f19168301916001600160401b03831184841017620001bc57808492602094604052833981010312620001b757516001600160a01b0381168103620001b757306080524660a05260a062000069620001d2565b600681526005602082016512d95c9b995b60d21b815260206200008b620001d2565b838152019264181719171960d91b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b031982541617905560405190611fef9283620001f3843960805183611a6a015260a05183611a8d015260c05183611aff015260e05183611b2501525182611a490152518181816104db0152818161079a015281816108a701528181610a3201528181610b5a01528181610d5401528181610e7501528181610f740152818161109e01528181611147015261148e0152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001bc5760405256fe6080604052600436101561001d575b366110815761001b611ece565b005b60003560e01c806306fdde031461018d5780630b3dc35414610188578063150b7a02146101835780631626ba7e1461017e57806329f8b17414610179578063333daf921461017457806334fcd5be1461016f5780633659cfe61461016a5780633a871cdd146101655780633e1b08121461016057806351166ba01461015b578063519454471461015657806354fd4d501461015157806355b14f501461014c57806357b750471461014757806384b0196e1461014257806388e7fd061461013d578063b0d691fe14610138578063bc197c8114610133578063d087d2881461012e578063d1f5789414610129578063d5416221146101245763f23a6e610361000e57610fef565b610f5d565b610ec1565b610e42565b610db3565b610d3e565b610d09565b610c61565b610c2a565b610b44565b610af0565b6109eb565b610922565b61085e565b61081c565b610776565b610693565b61060e565b610466565b610413565b610386565b610307565b6102d3565b600091031261019d57565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101cb57604052565b6101a2565b606081019081106001600160401b038211176101cb57604052565b608081019081106001600160401b038211176101cb57604052565b604081019081106001600160401b038211176101cb57604052565b90601f801991011681019081106001600160401b038211176101cb57604052565b6040519061024f826101eb565b565b6040519061016082018281106001600160401b038211176101cb57604052565b6040519061027e82610206565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b8481106102bf575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161029e565b3461019d57600036600319011261019d576103036102ef610271565b604051918291602083526020830190610293565b0390f35b3461019d57600036600319011261019d576020600080516020611fcf8339815191525460501c6040519060018060a01b03168152f35b6001600160a01b0381160361019d57565b359061024f8261033d565b9181601f8401121561019d578235916001600160401b03831161019d576020838186019501011161019d57565b3461019d57608036600319011261019d576103a260043561033d565b6103ad60243561033d565b6064356001600160401b03811161019d576103cc903690600401610359565b5050604051630a85bd0160e11b8152602090f35b90604060031983011261019d5760043591602435906001600160401b03821161019d5761040f91600401610359565b9091565b3461019d57602061042c610426366103e0565b91611b5b565b6040516001600160e01b03199091168152f35b600435906001600160e01b03198216820361019d57565b65ffffffffffff81160361019d57565b60c036600319011261019d5761047a61043f565b602435906104878261033d565b604435906104948261033d565b6064356104a081610456565b608435936104ad85610456565b60a4356001600160401b03811161019d576104cc903690600401610359565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610604575b6105f25784926105396105659261052a61051c610242565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261056087611049565b61172b565b1693843b1561019d576040519063064acaab60e11b8252818061058f6000998a94600484016117de565b038183895af180156105ed576105d4575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b806105e16105e7926101b8565b80610192565b386105a0565b611475565b604051637046c88d60e01b8152600490fd5b5030331415610504565b3461019d576020610627610621366103e0565b91611e13565b604051908152f35b9291926001600160401b0382116101cb5760405191610658601f8201601f191660200184610221565b82948184528183011161019d578281602093846000960137010152565b9080601f8301121561019d578160206106909335910161062f565b90565b60208060031936011261019d576001600160401b0360043581811161019d573660238201121561019d578060040135918083116101cb578260051b906040908151946106e187850187610221565b855285850191602480948601019436861161019d57848101935b86851061070b5761001b88611144565b843584811161019d5782016060602319823603011261019d57835191610730836101d0565b8782013561073d8161033d565b835260448201358b84015260648201359286841161019d576107678c94938a869536920101610675565b868201528152019401936106fb565b602036600319011261019d5760043561078e8161033d565b6001600160a01b0390337f00000000000000000000000000000000000000000000000000000000000000008316141580610812575b6105f257807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b50303314156107c3565b60031960603682011261019d57600435906001600160401b03821161019d5761016090823603011261019d576106276020916044359060243590600401611481565b3461019d57602036600319011261019d576004356001600160c01b0381169081900361019d57604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156105ed57610303916000916108f4575b506040519081529081906020820190565b610915915060203d811161091b575b61090d8183610221565b810190611396565b386108e3565b503d610903565b3461019d57602036600319011261019d5761030361096761094161043f565b60006060604051610951816101eb565b8281528260208201528260408201520152611049565b60405190610974826101eb565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b608036600319011261019d57600435610a038161033d565b6044356001600160401b03811161019d57610a22903690600401610675565b90606435600281101561019d57337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ac5575b80610ab0575b6105f257610a75816110fa565b610a9e576000828193926020839451920190602435905af13d82803e15610a9a573d90f35b3d90fd5b6040516367ce775960e01b8152600490fd5b50610ac0610abc611c13565b1590565b610a68565b5030331415610a62565b60405190610adc82610206565b6005825264181719171960d91b6020830152565b3461019d57600036600319011261019d576103036102ef610acf565b90604060031983011261019d57600435610b258161033d565b91602435906001600160401b03821161019d5761040f91600401610359565b610b4d36610b0c565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c20575b6105f25780600080516020611fcf8339815191525460501c1691610ba681611eff565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c1c578385610bfa819593829463064acaab60e11b8452600484016117de565b03925af180156105ed57610c0c575080f35b806105e1610c19926101b8565b80f35b8380fd5b5030331415610b83565b3461019d57600036600319011261019d576020600080516020611fcf8339815191525460e01b6040519063ffffffff60e01b168152f35b3461019d57600036600319011261019d57610cb7610c7d610271565b610c85610acf565b90604051928392600f60f81b8452610ca960209360e08587015260e0860190610293565b908482036040860152610293565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cf257505050500390f35b835185528695509381019392810192600101610ce3565b3461019d57600036600319011261019d576020600080516020611fcf8339815191525465ffffffffffff60405191831c168152f35b3461019d57600036600319011261019d576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f8401121561019d578235916001600160401b03831161019d576020808501948460051b01011161019d57565b3461019d5760a036600319011261019d57610dcf60043561033d565b610dda60243561033d565b6001600160401b0360443581811161019d57610dfa903690600401610d83565b505060643581811161019d57610e14903690600401610d83565b505060843590811161019d57610e2e903690600401610359565b505060405163bc197c8160e01b8152602090f35b3461019d57600036600319011261019d57604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156105ed57610303916000916108f457506040519081529081906020820190565b610eca36610b0c565b600080516020611fcf83398151915254919290916001600160a01b03919060501c8216610f4c57610efa81611eff565b1691823b1561019d57610f2f926000928360405180968195829463064acaab60e11b84526020600485015260248401916117bd565b03925af180156105ed57610f3f57005b806105e161001b926101b8565b60405162dc149f60e41b8152600490fd5b602036600319011261019d57610f7161043f565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610fe5575b6105f257600080516020611fcf83398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415610fa4565b3461019d5760a036600319011261019d5761100b60043561033d565b61101660243561033d565b6084356001600160401b03811161019d57611035903690600401610359565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061109781356001600160e01b031916611049565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110eb575b6105f257818091368280378136915af43d82803e15610a9a573d90f35b506110f4611c13565b156110ce565b6002111561110457565b634e487b7160e01b600052602160045260246000fd5b805182101561112e5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806111d1575b6105f25780519060005b82811061118d57505050565b60008061119a838561111a565b5180516001600160a01b03166020916040838201519101519283519301915af13d6000803e156111cc57600101611181565b3d6000fd5b506111dd610abc611c13565b611177565b9060041161019d5790600490565b909291928360041161019d57831161019d57600401916003190190565b9060241161019d5760100190601490565b9060581161019d5760380190602090565b9060241161019d5760040190602090565b9060381161019d5760240190601490565b90600a1161019d5760040190600690565b9060101161019d57600a0190600690565b9093929384831161019d57841161019d578101920390565b6001600160e01b031990358181169392600481106112a857505050565b60040360031b82901b16169150565b91906101608382031261019d576112cc610251565b926112d68161034e565b8452602081013560208501526040810135916001600160401b039283811161019d5781611304918401610675565b6040860152606082013583811161019d5781611321918401610675565b60608601526080820135608086015260a082013560a086015260c082013560c086015260e082013560e086015261010080830135908601526101208083013584811161019d5782611373918501610675565b90860152610140928383013590811161019d576113909201610675565b90830152565b9081602091031261019d575190565b606080825282516001600160a01b0316908201529193929160409161146b9060208101516080840152838101516113ea610160918260a08701526101c0860190610293565b9061145861140a606085015193605f1994858983030160c08a0152610293565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b0152870151908901528501518488830301610180890152610293565b92015190848303016101a0850152610293565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b039392917f00000000000000000000000000000000000000000000000000000000000000008516330361169f576004948535928361014481013501918760248401930135946114e06114da87866111e2565b9061128b565b926001600160e01b031980851691821561167c576114ff9036906112b7565b94611519600080516020611fcf8339815191525460e01b90565b1616156115315760405163fc2f51c560e01b81528a90fd5b97989697600160e01b810361162b575090602095966115bb61158961157061156b6114da87606460009901350160248782013591016111e2565b611049565b6001810154909a9081906001600160a01b0316986111f0565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617995b8b61161d575b369161062f565b6101408501526115df604051998a9788968794633a871cdd60e01b865285016113a5565b0393165af19081156105ed57610690926000926115fd575b50611f4c565b61161691925060203d811161091b5761090d8183610221565b90386115f7565b348080808f335af1506115b4565b9095939190600160e11b0361166f576116656115bb946000936116606114da8a606460209c01350160248d82013591016111e2565b6117ef565b91999296916115ae565b5050505050505050600190565b9697505050505050506106909394508215611d47573434343486335af150611d47565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff1990358181169392601481106116d357505050565b60140360031b82901b16169150565b3590602081106116f0575090565b6000199060200360031b1b1690565b6001600160d01b0319903581811693926006811061171c57505050565b60060360031b82901b16169150565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b90602091808252806000848401376000828201840152601f01601f1916010190565b908060209392818452848401376000828201840152601f01601f1916010190565b9160206106909381815201916117bd565b91906117fb828261120d565b611804916116b1565b60601c93611812838361121e565b61181b916116e2565b605883016078820194858360580190611835918388611273565b61183e916116e2565b611848828761122f565b611851916116e2565b61185b8388611240565b611864916116b1565b60601c61187236878761062f565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641769381019384526001600160e01b03198e169181019190915260608101949094526001600160a01b0392909216608084015260a080840192909252908252906118e860c082610221565b5190206118f490611a47565b9084019660788801611907918489611273565b9061191192611e13565b61191b828761122f565b6001600160a01b03199161192f91906116e2565b1661193991611f4c565b9660788688010196820360771901956119528382611251565b61195b916116ff565b60d01c926119698183611262565b611972916116ff565b60d01c916119808282611240565b611989916116b1565b60601c916119969161120d565b61199f916116b1565b60601c916119ab610242565b65ffffffffffff909516855265ffffffffffff1660208501526001600160a01b031660408401526001600160a01b031660608301526119e990611049565b906119f39161172b565b6001600160a01b03871691823b1561019d57611a29926000928360405180968195829463064acaab60e11b8452600484016117de565b03925af180156105ed57611a3a5750565b806105e161024f926101b8565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611ad4575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611ab5565b90611b669291611e13565b65ffffffffffff808260a01c16908115600114611bd1575b428360d01c11611bc15742911610611bb4576001600160a01b0316611ba857630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b905080611b7e565b9081602091031261019d5751801515810361019d5790565b6001600160a01b0390911681526040602082018190526106909291019061179b565b611c1d3633611e7b565b611d4257611c366000356001600160e01b031916611049565b6001810154611c55906001600160a01b03165b6001600160a01b031690565b906001600160a01b03821615908115611d06575b8115611cdb575b5015611c7c5750600090565b60206040518092639ea9bd5960e01b82528180611c9d363360048401611bf1565b03915afa9081156105ed57600091611cb3575090565b610690915060203d8111611cd4575b611ccc8183610221565b810190611bd9565b503d611cc2565b54611cf5915065ffffffffffff165b65ffffffffffff1690565b65ffffffffffff4291161138611c70565b905065ffffffffffff611d26611cea835465ffffffffffff9060301c1690565b168015159081611d38575b5090611c69565b9050421138611d31565b600190565b9091611d5336836112b7565b610140928381013590601e198136030182121561019d5701938435946001600160401b03861161019d5760200193853603851361019d57611d9d6115b487611de5986020986111f0565b908301526000611dc7611c49600080516020611fcf8339815191525460501c60018060a01b031690565b9260405196879586948593633a871cdd60e01b8552600485016113a5565b03925af19081156105ed57600091611dfb575090565b610690915060203d811161091b5761090d8183610221565b600080516020611fcf833981519152546040805163199ed7c960e11b8152600481019390935260248301529092602092849260501c6001600160a01b03169183918291611e65916044840191906117bd565b03915afa9081156105ed57600091611dfb575090565b600080516020611fcf8339815191525460408051639ea9bd5960e01b81526001600160a01b039384166004820152602481019190915292602092849260501c169082908190611c9d90604483019061179b565b7f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460408051338152346020820152a1565b600080516020611fcf83398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8082186001600160a01b031615600114611f67575050600190565b65ffffffffffff60a01b8181169265ffffffffffff60a01b1992831692811691908415611fc5575b81168015611fbe575b848110908518028085189414611fb6575b5081811190821802181790565b925038611fa9565b5080611f98565b93508093611f8f56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789"; address constant EXPECTED_KERNEL_LITE_2_2_ADDRESS = 0xbEdb61Be086F3f15eE911Cc9AB3EEa945DEbFa96; - bytes constant KERNEL_LITE_2_2_CODE = hex"0000000000000000000000000000000000000000000000000000000000000000610160346200021357601f6200230b38819003918201601f19168301916001600160401b0383118484101762000218578084926040948552833981010312620002135780516001600160a01b039182821682036200021357602001519182168092036200021357306080524660a05260a06200007a6200022e565b600681526005602082016512d95c9b995b60d21b815260206200009c6200022e565b838152019264181719171960d91b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220916101009283526101209182527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b03198254161790556101409081527fdea7fea882fba743201b2aeb1babf326b8944488db560784858525d123ee7e976001808060a01b0319825416179055604051916120bc93846200024f853960805184611b7c015260a05184611b9f015260c05184611c11015260e05184611c3701525183611b5b0152518281816104fb015281816107ba015281816108c701528181610a5201528181610b7301528181610d1201528181610e780152818161101c01528181611114015281816111c40152818161126d01526115c2015251818181610e160152610ed90152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620002185760405256fe6080604052600436101561001d575b366111a75761001b611e6b565b005b60003560e01c806306fdde03146101ad5780630b3dc354146101a8578063150b7a02146101a35780631626ba7e1461019e57806329f8b17414610199578063333daf921461019457806334fcd5be1461018f5780633659cfe61461018a5780633a871cdd146101855780633e1b08121461018057806351166ba01461017b578063519454471461017657806354fd4d501461017157806355b14f501461016c57806357b750471461016757806384b0196e1461016257806388e7fd061461015d578063b0d691fe14610158578063bc197c8114610153578063cdaea3ed1461014e578063d087d28814610149578063d1f5789414610144578063d54162211461013f578063f23a6e611461013a5763f2fde38b0361000e576110f1565b611097565b611005565b610ec4565b610e45565b610e00565b610d71565b610cfc565b610cc7565b610c1f565b610be8565b610b64565b610b10565b610a0b565b610942565b61087e565b61083c565b610796565b6106b3565b61062e565b610486565b610433565b6103a6565b610327565b6102f3565b60009103126101bd57565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101eb57604052565b6101c2565b606081019081106001600160401b038211176101eb57604052565b608081019081106001600160401b038211176101eb57604052565b604081019081106001600160401b038211176101eb57604052565b90601f801991011681019081106001600160401b038211176101eb57604052565b6040519061026f8261020b565b565b6040519061016082018281106001600160401b038211176101eb57604052565b6040519061029e82610226565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b8481106102df575050826000602080949584010152601f8019910116010190565b6020818301810151848301820152016102be565b346101bd5760003660031901126101bd5761032361030f610291565b6040519182916020835260208301906102b3565b0390f35b346101bd5760003660031901126101bd57602060008051602061207c8339815191525460501c6040519060018060a01b03168152f35b6001600160a01b038116036101bd57565b359061026f8261035d565b9181601f840112156101bd578235916001600160401b0383116101bd57602083818601950101116101bd57565b346101bd5760803660031901126101bd576103c260043561035d565b6103cd60243561035d565b6064356001600160401b0381116101bd576103ec903690600401610379565b5050604051630a85bd0160e11b8152602090f35b9060406003198301126101bd5760043591602435906001600160401b0382116101bd5761042f91600401610379565b9091565b346101bd57602061044c61044636610400565b91611c6d565b6040516001600160e01b03199091168152f35b600435906001600160e01b0319821682036101bd57565b65ffffffffffff8116036101bd57565b60c03660031901126101bd5761049a61045f565b602435906104a78261035d565b604435906104b48261035d565b6064356104c081610476565b608435936104cd85610476565b60a4356001600160401b0381116101bd576104ec903690600401610379565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610624575b6106125784926105596105859261054a61053c610262565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105808761116f565b611869565b1693843b156101bd576040519063064acaab60e11b825281806105af6000998a94600484016118d9565b038183895af1801561060d576105f4575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b80610601610607926101d8565b806101b2565b386105c0565b6115a9565b604051637046c88d60e01b8152600490fd5b5030331415610524565b346101bd57602061064761064136610400565b91611f94565b604051908152f35b9291926001600160401b0382116101eb5760405191610678601f8201601f191660200184610241565b8294818452818301116101bd578281602093846000960137010152565b9080601f830112156101bd578160206106b09335910161064f565b90565b6020806003193601126101bd576001600160401b036004358181116101bd57366023820112156101bd578060040135918083116101eb578260051b9060409081519461070187850187610241565b85528585019160248094860101943686116101bd57848101935b86851061072b5761001b8861126a565b84358481116101bd578201606060231982360301126101bd57835191610750836101f0565b8782013561075d8161035d565b835260448201358b8401526064820135928684116101bd576107878c94938a869536920101610695565b8682015281520194019361071b565b60203660031901126101bd576004356107ae8161035d565b6001600160a01b0390337f00000000000000000000000000000000000000000000000000000000000000008316141580610832575b61061257807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b50303314156107e3565b6003196060368201126101bd57600435906001600160401b0382116101bd576101609082360301126101bd5761064760209160443590602435906004016115b5565b346101bd5760203660031901126101bd576004356001600160c01b038116908190036101bd57604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060d5761032391600091610914575b506040519081529081906020820190565b610935915060203d811161093b575b61092d8183610241565b8101906114ca565b38610903565b503d610923565b346101bd5760203660031901126101bd5761032361098761096161045f565b600060606040516109718161020b565b828152826020820152826040820152015261116f565b604051906109948261020b565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b60803660031901126101bd57600435610a238161035d565b6044356001600160401b0381116101bd57610a42903690600401610695565b9060643560028110156101bd57337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ae5575b80610ad0575b61061257610a9581611220565b610abe576000828193926020839451920190602435905af13d82803e15610aba573d90f35b3d90fd5b6040516367ce775960e01b8152600490fd5b50610ae0610adc611d3c565b1590565b610a88565b5030331415610a82565b60405190610afc82610226565b6005825264181719171960d91b6020830152565b346101bd5760003660031901126101bd5761032361030f610aef565b9060406003198301126101bd57600435610b458161035d565b91602435906001600160401b0382116101bd5761042f91600401610379565b610b6d36610b2c565b505050337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610bde575b6106125760405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b6044820152606490fd5b5030331415610ba3565b346101bd5760003660031901126101bd57602060008051602061207c8339815191525460e01b6040519063ffffffff60e01b168152f35b346101bd5760003660031901126101bd57610c75610c3b610291565b610c43610aef565b90604051928392600f60f81b8452610c6760209360e08587015260e08601906102b3565b9084820360408601526102b3565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cb057505050500390f35b835185528695509381019392810192600101610ca1565b346101bd5760003660031901126101bd57602060008051602061207c8339815191525465ffffffffffff60405191831c168152f35b346101bd5760003660031901126101bd576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f840112156101bd578235916001600160401b0383116101bd576020808501948460051b0101116101bd57565b346101bd5760a03660031901126101bd57610d8d60043561035d565b610d9860243561035d565b6001600160401b036044358181116101bd57610db8903690600401610d41565b50506064358181116101bd57610dd2903690600401610d41565b50506084359081116101bd57610dec903690600401610379565b505060405163bc197c8160e01b8152602090f35b346101bd5760003660031901126101bd576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101bd5760003660031901126101bd57604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060d576103239160009161091457506040519081529081906020820190565b610ecd36610b2c565b916001600160a01b03907f0000000000000000000000000000000000000000000000000000000000000000821690821603610fb55760008051602061209c8339815191525416610f6457610f30610f2a61001b93610f3693611308565b906117ef565b60601c90565b60008051602061209c83398151915280546001600160a01b0319166001600160a01b03909216919091179055565b60405162461bcd60e51b8152602060048201526024808201527f4b65726e656c4c69746545434453413a20616c726561647920696e697469616c6044820152631a5e995960e21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f4b65726e656c4c69746545434453413a20696e76616c69642076616c6964617460448201526137b960f11b6064820152608490fd5b60203660031901126101bd5761101961045f565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061108d575b6106125760008051602061207c83398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b503033141561104c565b346101bd5760a03660031901126101bd576110b360043561035d565b6110be60243561035d565b6084356001600160401b0381116101bd576110dd903690600401610379565b505060405163f23a6e6160e01b8152602090f35b60203660031901126101bd576004356111098161035d565b6001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580611165575b6106125760008051602061209c83398151915280546001600160a01b03191691909216179055005b503033141561113d565b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006111bd81356001600160e01b03191661116f565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611211575b61061257818091368280378136915af43d82803e15610aba573d90f35b5061121a611d3c565b156111f4565b6002111561122a57565b634e487b7160e01b600052602160045260246000fd5b80518210156112545760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806112f7575b6106125780519060005b8281106112b357505050565b6000806112c08385611240565b5180516001600160a01b03166020916040838201519101519283519301915af13d6000803e156112f2576001016112a7565b3d6000fd5b50611303610adc611d3c565b61129d565b906014116101bd5790601490565b906004116101bd5790600490565b90929192836004116101bd5783116101bd57600401916003190190565b906024116101bd5760100190601490565b906058116101bd5760380190602090565b906024116101bd5760040190602090565b906038116101bd5760240190601490565b90600a116101bd5760040190600690565b906010116101bd57600a0190600690565b909392938483116101bd5784116101bd578101920390565b6001600160e01b031990358181169392600481106113dc57505050565b60040360031b82901b16169150565b9190610160838203126101bd57611400610271565b9261140a8161036e565b8452602081013560208501526040810135916001600160401b03928381116101bd5781611438918401610695565b604086015260608201358381116101bd5781611455918401610695565b60608601526080820135608086015260a082013560a086015260c082013560c086015260e082013560e08601526101008083013590860152610120808301358481116101bd57826114a7918501610695565b9086015261014092838301359081116101bd576114c49201610695565b90830152565b908160209103126101bd575190565b606080825282516001600160a01b0316908201529193929160409161159f90602081015160808401528381015161151e610160918260a08701526101c08601906102b3565b9061158c61153e606085015193605f1994858983030160c08a01526102b3565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b01528701519089015285015184888303016101808901526102b3565b92015190848303016101a08501526102b3565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b039392917f0000000000000000000000000000000000000000000000000000000000000000851633036117dd5760049485359283610144810135019187602484019301359461161461160e8786611316565b906113bf565b926001600160e01b03198085169182156117b0576116339036906113eb565b9461164d60008051602061207c8339815191525460e01b90565b1616156116655760405163fc2f51c560e01b81528a90fd5b97989697600160e01b810361175f575090602095966116ef6116bd6116a461169f61160e8760646000990135016024878201359101611316565b61116f565b6001810154909a9081906001600160a01b031698611324565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617995b8b611751575b369161064f565b610140850152611713604051998a9788968794633a871cdd60e01b865285016114d9565b0393165af190811561060d576106b092600092611731575b50611ff9565b61174a91925060203d811161093b5761092d8183610241565b903861172b565b348080808f335af1506116e8565b9095939190600160e11b036117a3576117996116ef9460009361179461160e8a606460209c01350160248d8201359101611316565b611901565b91999296916116e2565b5050505050505050600190565b9750505050505050916106b0939450806117cb575b50611e9c565b3490349034903490335af150386117c5565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061181157505050565b60140360031b82901b16169150565b35906020811061182e575090565b6000199060200360031b1b1690565b6001600160d01b0319903581811693926006811061185a57505050565b60060360031b82901b16169150565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b90918060409360208452816020850152848401376000828201840152601f01601f1916010190565b919061190d8282611341565b611916916117ef565b60601c936119248383611352565b61192d91611820565b6058830160788201948583605801906119479183886113a7565b61195091611820565b61195a8287611363565b61196391611820565b61196d8388611374565b611976916117ef565b60601c61198436878761064f565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641769381019384526001600160e01b03198e169181019190915260608101949094526001600160a01b0392909216608084015260a080840192909252908252906119fa60c082610241565b519020611a0690611b59565b9084019660788801611a199184896113a7565b90611a2392611f94565b611a2d8287611363565b6001600160a01b031991611a419190611820565b16611a4b91611ff9565b966078868801019682036077190195611a648382611385565b611a6d9161183d565b60d01c92611a7b8183611396565b611a849161183d565b60d01c91611a928282611374565b611a9b916117ef565b60601c91611aa891611341565b611ab1916117ef565b60601c91611abd610262565b65ffffffffffff909516855265ffffffffffff1660208501526001600160a01b031660408401526001600160a01b03166060830152611afb9061116f565b90611b0591611869565b6001600160a01b03871691823b156101bd57611b3b926000928360405180968195829463064acaab60e11b8452600484016118d9565b03925af1801561060d57611b4c5750565b8061060161026f926101d8565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611be6575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611bc7565b90611c789291611f94565b65ffffffffffff808260a01c16908115600114611ce3575b428360d01c11611cd35742911610611cc6576001600160a01b0316611cba57630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b905080611c90565b908160209103126101bd575180151581036101bd5790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b60008051602061209c833981519152546001600160a01b039081163314611e6557611d726000356001600160e01b03191661116f565b60018101546001600160a01b031691821615908115611e29575b8115611dfe575b5015611d9f5750600090565b60206040518092639ea9bd5960e01b82528180611dc0363360048401611d03565b03915afa90811561060d57600091611dd6575090565b6106b0915060203d8111611df7575b611def8183610241565b810190611ceb565b503d611de5565b54611e18915065ffffffffffff165b65ffffffffffff1690565b65ffffffffffff4291161138611d93565b905065ffffffffffff611e49611e0d835465ffffffffffff9060301c1690565b168015159081611e5b575b5090611d8c565b9050421138611e54565b50600190565b7f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460408051338152346020820152a1565b90611ecc906020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042090565b9061014081013590601e19813603018212156101bd5701908135916001600160401b0383116101bd576020019180360383136101bd576116e881611f1392611f1995611324565b90611f45565b60008051602061209c833981519152546001600160a01b03908116911603611f4057600090565b600190565b6001608060006041602094969596604080519880519285526060810151851a88528781015182520151606052145afa51913d15611f86576000606052604052565b638baa579f6000526004601cfd5b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c600420611fcd9291611f139192369161064f565b60008051602061209c833981519152546001600160a01b03918216911614611ff457600190565b600090565b8082186001600160a01b031615600114612014575050600190565b65ffffffffffff60a01b8181169265ffffffffffff60a01b1992831692811691908415612072575b8116801561206b575b848110908518028085189414612063575b5081811190821802181790565b925038612056565b5080612045565b9350809361203c56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9dea7fea882fba743201b2aeb1babf326b8944488db560784858525d123ee7e970000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789000000000000000000000000d9ab5096a832b9ce79914329daee236f8eea0390"; - function deploy() internal returns(address, address) { + bytes constant KERNEL_LITE_2_2_CODE = + hex"0000000000000000000000000000000000000000000000000000000000000000610160346200021357601f6200230b38819003918201601f19168301916001600160401b0383118484101762000218578084926040948552833981010312620002135780516001600160a01b039182821682036200021357602001519182168092036200021357306080524660a05260a06200007a6200022e565b600681526005602082016512d95c9b995b60d21b815260206200009c6200022e565b838152019264181719171960d91b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220916101009283526101209182527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b03198254161790556101409081527fdea7fea882fba743201b2aeb1babf326b8944488db560784858525d123ee7e976001808060a01b0319825416179055604051916120bc93846200024f853960805184611b7c015260a05184611b9f015260c05184611c11015260e05184611c3701525183611b5b0152518281816104fb015281816107ba015281816108c701528181610a5201528181610b7301528181610d1201528181610e780152818161101c01528181611114015281816111c40152818161126d01526115c2015251818181610e160152610ed90152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620002185760405256fe6080604052600436101561001d575b366111a75761001b611e6b565b005b60003560e01c806306fdde03146101ad5780630b3dc354146101a8578063150b7a02146101a35780631626ba7e1461019e57806329f8b17414610199578063333daf921461019457806334fcd5be1461018f5780633659cfe61461018a5780633a871cdd146101855780633e1b08121461018057806351166ba01461017b578063519454471461017657806354fd4d501461017157806355b14f501461016c57806357b750471461016757806384b0196e1461016257806388e7fd061461015d578063b0d691fe14610158578063bc197c8114610153578063cdaea3ed1461014e578063d087d28814610149578063d1f5789414610144578063d54162211461013f578063f23a6e611461013a5763f2fde38b0361000e576110f1565b611097565b611005565b610ec4565b610e45565b610e00565b610d71565b610cfc565b610cc7565b610c1f565b610be8565b610b64565b610b10565b610a0b565b610942565b61087e565b61083c565b610796565b6106b3565b61062e565b610486565b610433565b6103a6565b610327565b6102f3565b60009103126101bd57565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101eb57604052565b6101c2565b606081019081106001600160401b038211176101eb57604052565b608081019081106001600160401b038211176101eb57604052565b604081019081106001600160401b038211176101eb57604052565b90601f801991011681019081106001600160401b038211176101eb57604052565b6040519061026f8261020b565b565b6040519061016082018281106001600160401b038211176101eb57604052565b6040519061029e82610226565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b8481106102df575050826000602080949584010152601f8019910116010190565b6020818301810151848301820152016102be565b346101bd5760003660031901126101bd5761032361030f610291565b6040519182916020835260208301906102b3565b0390f35b346101bd5760003660031901126101bd57602060008051602061207c8339815191525460501c6040519060018060a01b03168152f35b6001600160a01b038116036101bd57565b359061026f8261035d565b9181601f840112156101bd578235916001600160401b0383116101bd57602083818601950101116101bd57565b346101bd5760803660031901126101bd576103c260043561035d565b6103cd60243561035d565b6064356001600160401b0381116101bd576103ec903690600401610379565b5050604051630a85bd0160e11b8152602090f35b9060406003198301126101bd5760043591602435906001600160401b0382116101bd5761042f91600401610379565b9091565b346101bd57602061044c61044636610400565b91611c6d565b6040516001600160e01b03199091168152f35b600435906001600160e01b0319821682036101bd57565b65ffffffffffff8116036101bd57565b60c03660031901126101bd5761049a61045f565b602435906104a78261035d565b604435906104b48261035d565b6064356104c081610476565b608435936104cd85610476565b60a4356001600160401b0381116101bd576104ec903690600401610379565b9590946001600160a01b0393337f00000000000000000000000000000000000000000000000000000000000000008616141580610624575b6106125784926105596105859261054a61053c610262565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105808761116f565b611869565b1693843b156101bd576040519063064acaab60e11b825281806105af6000998a94600484016118d9565b038183895af1801561060d576105f4575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b80610601610607926101d8565b806101b2565b386105c0565b6115a9565b604051637046c88d60e01b8152600490fd5b5030331415610524565b346101bd57602061064761064136610400565b91611f94565b604051908152f35b9291926001600160401b0382116101eb5760405191610678601f8201601f191660200184610241565b8294818452818301116101bd578281602093846000960137010152565b9080601f830112156101bd578160206106b09335910161064f565b90565b6020806003193601126101bd576001600160401b036004358181116101bd57366023820112156101bd578060040135918083116101eb578260051b9060409081519461070187850187610241565b85528585019160248094860101943686116101bd57848101935b86851061072b5761001b8861126a565b84358481116101bd578201606060231982360301126101bd57835191610750836101f0565b8782013561075d8161035d565b835260448201358b8401526064820135928684116101bd576107878c94938a869536920101610695565b8682015281520194019361071b565b60203660031901126101bd576004356107ae8161035d565b6001600160a01b0390337f00000000000000000000000000000000000000000000000000000000000000008316141580610832575b61061257807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b50303314156107e3565b6003196060368201126101bd57600435906001600160401b0382116101bd576101609082360301126101bd5761064760209160443590602435906004016115b5565b346101bd5760203660031901126101bd576004356001600160c01b038116908190036101bd57604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060d5761032391600091610914575b506040519081529081906020820190565b610935915060203d811161093b575b61092d8183610241565b8101906114ca565b38610903565b503d610923565b346101bd5760203660031901126101bd5761032361098761096161045f565b600060606040516109718161020b565b828152826020820152826040820152015261116f565b604051906109948261020b565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b60803660031901126101bd57600435610a238161035d565b6044356001600160401b0381116101bd57610a42903690600401610695565b9060643560028110156101bd57337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ae5575b80610ad0575b61061257610a9581611220565b610abe576000828193926020839451920190602435905af13d82803e15610aba573d90f35b3d90fd5b6040516367ce775960e01b8152600490fd5b50610ae0610adc611d3c565b1590565b610a88565b5030331415610a82565b60405190610afc82610226565b6005825264181719171960d91b6020830152565b346101bd5760003660031901126101bd5761032361030f610aef565b9060406003198301126101bd57600435610b458161035d565b91602435906001600160401b0382116101bd5761042f91600401610379565b610b6d36610b2c565b505050337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610bde575b6106125760405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b6044820152606490fd5b5030331415610ba3565b346101bd5760003660031901126101bd57602060008051602061207c8339815191525460e01b6040519063ffffffff60e01b168152f35b346101bd5760003660031901126101bd57610c75610c3b610291565b610c43610aef565b90604051928392600f60f81b8452610c6760209360e08587015260e08601906102b3565b9084820360408601526102b3565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cb057505050500390f35b835185528695509381019392810192600101610ca1565b346101bd5760003660031901126101bd57602060008051602061207c8339815191525465ffffffffffff60405191831c168152f35b346101bd5760003660031901126101bd576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f840112156101bd578235916001600160401b0383116101bd576020808501948460051b0101116101bd57565b346101bd5760a03660031901126101bd57610d8d60043561035d565b610d9860243561035d565b6001600160401b036044358181116101bd57610db8903690600401610d41565b50506064358181116101bd57610dd2903690600401610d41565b50506084359081116101bd57610dec903690600401610379565b505060405163bc197c8160e01b8152602090f35b346101bd5760003660031901126101bd576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101bd5760003660031901126101bd57604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561060d576103239160009161091457506040519081529081906020820190565b610ecd36610b2c565b916001600160a01b03907f0000000000000000000000000000000000000000000000000000000000000000821690821603610fb55760008051602061209c8339815191525416610f6457610f30610f2a61001b93610f3693611308565b906117ef565b60601c90565b60008051602061209c83398151915280546001600160a01b0319166001600160a01b03909216919091179055565b60405162461bcd60e51b8152602060048201526024808201527f4b65726e656c4c69746545434453413a20616c726561647920696e697469616c6044820152631a5e995960e21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f4b65726e656c4c69746545434453413a20696e76616c69642076616c6964617460448201526137b960f11b6064820152608490fd5b60203660031901126101bd5761101961045f565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061108d575b6106125760008051602061207c83398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b503033141561104c565b346101bd5760a03660031901126101bd576110b360043561035d565b6110be60243561035d565b6084356001600160401b0381116101bd576110dd903690600401610379565b505060405163f23a6e6160e01b8152602090f35b60203660031901126101bd576004356111098161035d565b6001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580611165575b6106125760008051602061209c83398151915280546001600160a01b03191691909216179055005b503033141561113d565b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b60006111bd81356001600160e01b03191661116f565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611211575b61061257818091368280378136915af43d82803e15610aba573d90f35b5061121a611d3c565b156111f4565b6002111561122a57565b634e487b7160e01b600052602160045260246000fd5b80518210156112545760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806112f7575b6106125780519060005b8281106112b357505050565b6000806112c08385611240565b5180516001600160a01b03166020916040838201519101519283519301915af13d6000803e156112f2576001016112a7565b3d6000fd5b50611303610adc611d3c565b61129d565b906014116101bd5790601490565b906004116101bd5790600490565b90929192836004116101bd5783116101bd57600401916003190190565b906024116101bd5760100190601490565b906058116101bd5760380190602090565b906024116101bd5760040190602090565b906038116101bd5760240190601490565b90600a116101bd5760040190600690565b906010116101bd57600a0190600690565b909392938483116101bd5784116101bd578101920390565b6001600160e01b031990358181169392600481106113dc57505050565b60040360031b82901b16169150565b9190610160838203126101bd57611400610271565b9261140a8161036e565b8452602081013560208501526040810135916001600160401b03928381116101bd5781611438918401610695565b604086015260608201358381116101bd5781611455918401610695565b60608601526080820135608086015260a082013560a086015260c082013560c086015260e082013560e08601526101008083013590860152610120808301358481116101bd57826114a7918501610695565b9086015261014092838301359081116101bd576114c49201610695565b90830152565b908160209103126101bd575190565b606080825282516001600160a01b0316908201529193929160409161159f90602081015160808401528381015161151e610160918260a08701526101c08601906102b3565b9061158c61153e606085015193605f1994858983030160c08a01526102b3565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b01528701519089015285015184888303016101808901526102b3565b92015190848303016101a08501526102b3565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b039392917f0000000000000000000000000000000000000000000000000000000000000000851633036117dd5760049485359283610144810135019187602484019301359461161461160e8786611316565b906113bf565b926001600160e01b03198085169182156117b0576116339036906113eb565b9461164d60008051602061207c8339815191525460e01b90565b1616156116655760405163fc2f51c560e01b81528a90fd5b97989697600160e01b810361175f575090602095966116ef6116bd6116a461169f61160e8760646000990135016024878201359101611316565b61116f565b6001810154909a9081906001600160a01b031698611324565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617995b8b611751575b369161064f565b610140850152611713604051998a9788968794633a871cdd60e01b865285016114d9565b0393165af190811561060d576106b092600092611731575b50611ff9565b61174a91925060203d811161093b5761092d8183610241565b903861172b565b348080808f335af1506116e8565b9095939190600160e11b036117a3576117996116ef9460009361179461160e8a606460209c01350160248d8201359101611316565b611901565b91999296916116e2565b5050505050505050600190565b9750505050505050916106b0939450806117cb575b50611e9c565b3490349034903490335af150386117c5565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff19903581811693926014811061181157505050565b60140360031b82901b16169150565b35906020811061182e575090565b6000199060200360031b1b1690565b6001600160d01b0319903581811693926006811061185a57505050565b60060360031b82901b16169150565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b90918060409360208452816020850152848401376000828201840152601f01601f1916010190565b919061190d8282611341565b611916916117ef565b60601c936119248383611352565b61192d91611820565b6058830160788201948583605801906119479183886113a7565b61195091611820565b61195a8287611363565b61196391611820565b61196d8388611374565b611976916117ef565b60601c61198436878761064f565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641769381019384526001600160e01b03198e169181019190915260608101949094526001600160a01b0392909216608084015260a080840192909252908252906119fa60c082610241565b519020611a0690611b59565b9084019660788801611a199184896113a7565b90611a2392611f94565b611a2d8287611363565b6001600160a01b031991611a419190611820565b16611a4b91611ff9565b966078868801019682036077190195611a648382611385565b611a6d9161183d565b60d01c92611a7b8183611396565b611a849161183d565b60d01c91611a928282611374565b611a9b916117ef565b60601c91611aa891611341565b611ab1916117ef565b60601c91611abd610262565b65ffffffffffff909516855265ffffffffffff1660208501526001600160a01b031660408401526001600160a01b03166060830152611afb9061116f565b90611b0591611869565b6001600160a01b03871691823b156101bd57611b3b926000928360405180968195829463064acaab60e11b8452600484016118d9565b03925af1801561060d57611b4c5750565b8061060161026f926101d8565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611be6575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611bc7565b90611c789291611f94565b65ffffffffffff808260a01c16908115600114611ce3575b428360d01c11611cd35742911610611cc6576001600160a01b0316611cba57630b135d3f60e11b90565b6001600160e01b031990565b506001600160e01b031990565b506001600160e01b031992915050565b905080611c90565b908160209103126101bd575180151581036101bd5790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b60008051602061209c833981519152546001600160a01b039081163314611e6557611d726000356001600160e01b03191661116f565b60018101546001600160a01b031691821615908115611e29575b8115611dfe575b5015611d9f5750600090565b60206040518092639ea9bd5960e01b82528180611dc0363360048401611d03565b03915afa90811561060d57600091611dd6575090565b6106b0915060203d8111611df7575b611def8183610241565b810190611ceb565b503d611de5565b54611e18915065ffffffffffff165b65ffffffffffff1690565b65ffffffffffff4291161138611d93565b905065ffffffffffff611e49611e0d835465ffffffffffff9060301c1690565b168015159081611e5b575b5090611d8c565b9050421138611e54565b50600190565b7f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460408051338152346020820152a1565b90611ecc906020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042090565b9061014081013590601e19813603018212156101bd5701908135916001600160401b0383116101bd576020019180360383136101bd576116e881611f1392611f1995611324565b90611f45565b60008051602061209c833981519152546001600160a01b03908116911603611f4057600090565b600190565b6001608060006041602094969596604080519880519285526060810151851a88528781015182520151606052145afa51913d15611f86576000606052604052565b638baa579f6000526004601cfd5b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c600420611fcd9291611f139192369161064f565b60008051602061209c833981519152546001600160a01b03918216911614611ff457600190565b600090565b8082186001600160a01b031615600114612014575050600190565b65ffffffffffff60a01b8181169265ffffffffffff60a01b1992831692811691908415612072575b8116801561206b575b848110908518028085189414612063575b5081811190821802181790565b925038612056565b5080612045565b9350809361203c56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9dea7fea882fba743201b2aeb1babf326b8944488db560784858525d123ee7e970000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789000000000000000000000000d9ab5096a832b9ce79914329daee236f8eea0390"; + + function deploy() internal returns (address, address) { DeterministicDeploy.checkDeploy("Kernel 2.2", EXPECTED_KERNEL_2_2_ADDRESS, KERNEL_2_2_CODE); DeterministicDeploy.checkDeploy("Kernel lite 2.2", EXPECTED_KERNEL_LITE_2_2_ADDRESS, KERNEL_LITE_2_2_CODE); return (EXPECTED_KERNEL_2_2_ADDRESS, EXPECTED_KERNEL_LITE_2_2_ADDRESS); diff --git a/script/deterministic/Kernel2_3.s.sol b/script/deterministic/Kernel2_3.s.sol index 1bcf2928..fdac0b61 100644 --- a/script/deterministic/Kernel2_3.s.sol +++ b/script/deterministic/Kernel2_3.s.sol @@ -4,12 +4,14 @@ import "./DeterministicDeploy.s.sol"; library Kernel_2_3_Deploy { address constant EXPECTED_KERNEL_2_3_ADDRESS = 0xD3F582F6B4814E989Ee8E96bc3175320B5A540ab; - bytes constant KERNEL_2_3_CODE = hex"000000000000000000000000000000000000000000000000000000000000000061014034620001be57601f6200238b38819003918201601f19168301916001600160401b03831184841017620001c357808492602094604052833981010312620001be57516001600160a01b0381168103620001be57306080524660a05260a062000069620001d9565b600681526005602082016512d95c9b995b60d21b815260206200008b620001d9565b838152019264302e322e3360d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b0319825416179055604051906121919283620001fa843960805183611b42015260a05183611b65015260c05183611bd7015260e05183611bfd01525182611b21015251818181610506015281816107c5015281816108d201528181610a5d01528181610b8501528181610d7f01528181610de901528181610f4d0152818161104c015281816111760152818161121f01526115660152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001c35760405256fe6080604052600436101561001d575b366111595761001b612047565b005b60003560e01c806306fdde031461019d5780630b3dc35414610198578063150b7a02146101935780631626ba7e1461018e57806329f8b17414610189578063333daf921461018457806334fcd5be1461017f5780633659cfe61461017a5780633a871cdd146101755780633e1b08121461017057806351166ba01461016b578063519454471461016657806354fd4d501461016157806355b14f501461015c57806357b750471461015757806384b0196e1461015257806388e7fd061461014d578063b0d691fe14610148578063b68df16d14610143578063bc197c811461013e578063d087d28814610139578063d1f5789414610134578063d54162211461012f5763f23a6e610361000e576110c7565b611035565b610f99565b610f1a565b610e8b565b610dae565b610d69565b610d34565b610c8c565b610c55565b610b6f565b610b1b565b610a16565b61094d565b610889565b610847565b6107a1565b6106be565b610639565b610491565b61043e565b6103b1565b610332565b6102fe565b60009103126101ad57565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101db57604052565b6101b2565b606081019081106001600160401b038211176101db57604052565b608081019081106001600160401b038211176101db57604052565b604081019081106001600160401b038211176101db57604052565b60c081019081106001600160401b038211176101db57604052565b90601f801991011681019081106001600160401b038211176101db57604052565b6040519061027a826101fb565b565b6040519061016082018281106001600160401b038211176101db57604052565b604051906102a982610216565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b8481106102ea575050826000602080949584010152601f8019910116010190565b6020818301810151848301820152016102c9565b346101ad5760003660031901126101ad5761032e61031a61029c565b6040519182916020835260208301906102be565b0390f35b346101ad5760003660031901126101ad5760206000805160206121718339815191525460501c6040519060018060a01b03168152f35b6001600160a01b038116036101ad57565b359061027a82610368565b9181601f840112156101ad578235916001600160401b0383116101ad57602083818601950101116101ad57565b346101ad5760803660031901126101ad576103cd600435610368565b6103d8602435610368565b6064356001600160401b0381116101ad576103f7903690600401610384565b5050604051630a85bd0160e11b8152602090f35b9060406003198301126101ad5760043591602435906001600160401b0382116101ad5761043a91600401610384565b9091565b346101ad5760206104576104513661040b565b91611c33565b6040516001600160e01b03199091168152f35b600435906001600160e01b0319821682036101ad57565b65ffffffffffff8116036101ad57565b60c03660031901126101ad576104a561046a565b602435906104b282610368565b604435906104bf82610368565b6064356104cb81610481565b608435936104d885610481565b60a4356001600160401b0381116101ad576104f7903690600401610384565b9590946001600160a01b0393337f0000000000000000000000000000000000000000000000000000000000000000861614158061062f575b61061d5784926105646105909261055561054761026d565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261058b87611121565b611803565b1693843b156101ad576040519063064acaab60e11b825281806105ba6000998a94600484016118b6565b038183895af18015610618576105ff575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060c610612926101c8565b806101a2565b386105cb565b61154d565b604051637046c88d60e01b8152600490fd5b503033141561052f565b346101ad57602061065261064c3661040b565b91611f8c565b604051908152f35b9291926001600160401b0382116101db5760405191610683601f8201601f19166020018461024c565b8294818452818301116101ad578281602093846000960137010152565b9080601f830112156101ad578160206106bb9335910161065a565b90565b6020806003193601126101ad576001600160401b036004358181116101ad57366023820112156101ad578060040135918083116101db578260051b9060409081519461070c8785018761024c565b85528585019160248094860101943686116101ad57848101935b8685106107365761001b8861121c565b84358481116101ad578201606060231982360301126101ad5783519161075b836101e0565b8782013561076881610368565b835260448201358b8401526064820135928684116101ad576107928c94938a8695369201016106a0565b86820152815201940193610726565b60203660031901126101ad576004356107b981610368565b6001600160a01b0390337f0000000000000000000000000000000000000000000000000000000000000000831614158061083d575b61061d57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b50303314156107ee565b6003196060368201126101ad57600435906001600160401b0382116101ad576101609082360301126101ad576106526020916044359060243590600401611559565b346101ad5760203660031901126101ad576004356001600160c01b038116908190036101ad57604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156106185761032e9160009161091f575b506040519081529081906020820190565b610940915060203d8111610946575b610938818361024c565b81019061146e565b3861090e565b503d61092e565b346101ad5760203660031901126101ad5761032e61099261096c61046a565b6000606060405161097c816101fb565b8281528260208201528260408201520152611121565b6040519061099f826101fb565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b60803660031901126101ad57600435610a2e81610368565b6044356001600160401b0381116101ad57610a4d9036906004016106a0565b9060643560028110156101ad57337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610af0575b80610adb575b61061d57610aa0816111d2565b610ac9576000828193926020839451920190602435905af13d82803e15610ac5573d90f35b3d90fd5b6040516367ce775960e01b8152600490fd5b50610aeb610ae7611d8c565b1590565b610a93565b5030331415610a8d565b60405190610b0782610216565b6005825264302e322e3360d81b6020830152565b346101ad5760003660031901126101ad5761032e61031a610afa565b9060406003198301126101ad57600435610b5081610368565b91602435906001600160401b0382116101ad5761043a91600401610384565b610b7836610b37565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c4b575b61061d57806000805160206121718339815191525460501c1691610bd181612078565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c47578385610c25819593829463064acaab60e11b8452600484016118b6565b03925af1801561061857610c37575080f35b8061060c610c44926101c8565b80f35b8380fd5b5030331415610bae565b346101ad5760003660031901126101ad5760206000805160206121718339815191525460e01b6040519063ffffffff60e01b168152f35b346101ad5760003660031901126101ad57610ce2610ca861029c565b610cb0610afa565b90604051928392600f60f81b8452610cd460209360e08587015260e08601906102be565b9084820360408601526102be565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d1d57505050500390f35b835185528695509381019392810192600101610d0e565b346101ad5760003660031901126101ad5760206000805160206121718339815191525465ffffffffffff60405191831c168152f35b346101ad5760003660031901126101ad576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b60403660031901126101ad57600435610dc681610368565b6024356001600160401b0381116101ad57610de59036906004016106a0565b90337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610e51575b80610e40575b61061d5760008281939260208394519201905af43d82803e15610ac5573d90f35b50610e4c610ae7611d8c565b610e1f565b5030331415610e19565b9181601f840112156101ad578235916001600160401b0383116101ad576020808501948460051b0101116101ad57565b346101ad5760a03660031901126101ad57610ea7600435610368565b610eb2602435610368565b6001600160401b036044358181116101ad57610ed2903690600401610e5b565b50506064358181116101ad57610eec903690600401610e5b565b50506084359081116101ad57610f06903690600401610384565b505060405163bc197c8160e01b8152602090f35b346101ad5760003660031901126101ad57604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156106185761032e9160009161091f57506040519081529081906020820190565b610fa236610b37565b60008051602061217183398151915254919290916001600160a01b03919060501c821661102457610fd281612078565b1691823b156101ad57611007926000928360405180968195829463064acaab60e11b8452602060048501526024840191611895565b03925af180156106185761101757005b8061060c61001b926101c8565b60405162dc149f60e41b8152600490fd5b60203660031901126101ad5761104961046a565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110bd575b61061d5760008051602061217183398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b503033141561107c565b346101ad5760a03660031901126101ad576110e3600435610368565b6110ee602435610368565b6084356001600160401b0381116101ad5761110d903690600401610384565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061116f81356001600160e01b031916611121565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806111c3575b61061d57818091368280378136915af43d82803e15610ac5573d90f35b506111cc611d8c565b156111a6565b600211156111dc57565b634e487b7160e01b600052602160045260246000fd5b80518210156112065760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806112a9575b61061d5780519060005b82811061126557505050565b60008061127283856111f2565b5180516001600160a01b03166020916040838201519101519283519301915af13d6000803e156112a457600101611259565b3d6000fd5b506112b5610ae7611d8c565b61124f565b906004116101ad5790600490565b90929192836004116101ad5783116101ad57600401916003190190565b906024116101ad5760100190601490565b906058116101ad5760380190602090565b906024116101ad5760040190602090565b906038116101ad5760240190601490565b90600a116101ad5760040190600690565b906010116101ad57600a0190600690565b909392938483116101ad5784116101ad578101920390565b6001600160e01b0319903581811693926004811061138057505050565b60040360031b82901b16169150565b9190610160838203126101ad576113a461027c565b926113ae81610379565b8452602081013560208501526040810135916001600160401b03928381116101ad57816113dc9184016106a0565b604086015260608201358381116101ad57816113f99184016106a0565b60608601526080820135608086015260a082013560a086015260c082013560c086015260e082013560e08601526101008083013590860152610120808301358481116101ad578261144b9185016106a0565b9086015261014092838301359081116101ad5761146892016106a0565b90830152565b908160209103126101ad575190565b606080825282516001600160a01b031690820152919392916040916115439060208101516080840152838101516114c2610160918260a08701526101c08601906102be565b906115306114e2606085015193605f1994858983030160c08a01526102be565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b01528701519089015285015184888303016101808901526102be565b92015190848303016101a08501526102be565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b039392917f000000000000000000000000000000000000000000000000000000000000000085163303611777576004948535928361014481013501918760248401930135946115b86115b287866112ba565b90611363565b926001600160e01b0319808516918215611754576115d790369061138f565b946115f16000805160206121718339815191525460e01b90565b1616156116095760405163fc2f51c560e01b81528a90fd5b97989697600160e01b8103611703575090602095966116936116616116486116436115b287606460009901350160248782013591016112ba565b611121565b6001810154909a9081906001600160a01b0316986112c8565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617995b8b6116f5575b369161065a565b6101408501526116b7604051998a9788968794633a871cdd60e01b8652850161147d565b0393165af1908115610618576106bb926000926116d5575b506120ee565b6116ee91925060203d811161094657610938818361024c565b90386116cf565b348080808f335af15061168c565b9095939190600160e11b036117475761173d611693946000936117386115b28a606460209c01350160248d82013591016112ba565b6118c7565b9199929691611686565b5050505050505050600190565b9697505050505050506106bb9394508215611ec0573434343486335af150611ec0565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff1990358181169392601481106117ab57505050565b60140360031b82901b16169150565b3590602081106117c8575090565b6000199060200360031b1b1690565b6001600160d01b031990358181169392600681106117f457505050565b60060360031b82901b16169150565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b90602091808252806000848401376000828201840152601f01601f1916010190565b908060209392818452848401376000828201840152601f01601f1916010190565b9160206106bb938181520191611895565b91906118d382826112e5565b6118dc91611789565b60601c936118ea83836112f6565b6118f3916117ba565b60588301607882019485836058019061190d91838861134b565b611916916117ba565b6119208287611307565b611929916117ba565b6119338388611318565b61193c91611789565b60601c61194a36878761065a565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641769381019384526001600160e01b03198e169181019190915260608101949094526001600160a01b0392909216608084015260a080840192909252908252906119c060c08261024c565b5190206119cc90611b1f565b90840196607888016119df91848961134b565b906119e992611f8c565b6119f38287611307565b6001600160a01b031991611a0791906117ba565b16611a11916120ee565b966078868801019682036077190195611a2a8382611329565b611a33916117d7565b60d01c92611a41818361133a565b611a4a916117d7565b60d01c91611a588282611318565b611a6191611789565b60601c91611a6e916112e5565b611a7791611789565b60601c91611a8361026d565b65ffffffffffff909516855265ffffffffffff1660208501526001600160a01b031660408401526001600160a01b03166060830152611ac190611121565b90611acb91611803565b6001600160a01b03871691823b156101ad57611b01926000928360405180968195829463064acaab60e11b8452600484016118b6565b03925af1801561061857611b125750565b8061060c61027a926101c8565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611bac575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611b8d565b91611cf291611cf793611cdc611cea611c4a61029c565b611c52610afa565b906020815191012090602081519101206040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a08152611cb181610231565b51902092604051928391602083019586909160429261190160f01b8352600283015260228201520190565b03601f19810183528261024c565b519020611f8c565b6120c5565b9065ffffffffffff928342911611159283611d44575b505081611d32575b5015611d2657630b135d3f60e11b90565b6001600160e01b031990565b6001600160a01b031615905038611d15565b429116101591503880611d0d565b908160209103126101ad575180151581036101ad5790565b6001600160a01b0390911681526040602082018190526106bb92910190611873565b611d963633611ff4565b611ebb57611daf6000356001600160e01b031916611121565b6001810154611dce906001600160a01b03165b6001600160a01b031690565b906001600160a01b03821615908115611e7f575b8115611e54575b5015611df55750600090565b60206040518092639ea9bd5960e01b82528180611e16363360048401611d6a565b03915afa90811561061857600091611e2c575090565b6106bb915060203d8111611e4d575b611e45818361024c565b810190611d52565b503d611e3b565b54611e6e915065ffffffffffff165b65ffffffffffff1690565b65ffffffffffff4291161138611de9565b905065ffffffffffff611e9f611e63835465ffffffffffff9060301c1690565b168015159081611eb1575b5090611de2565b9050421138611eaa565b600190565b9091611ecc368361138f565b610140928381013590601e19813603018212156101ad5701938435946001600160401b0386116101ad576020019385360385136101ad57611f1661168c87611f5e986020986112c8565b908301526000611f40611dc26000805160206121718339815191525460501c60018060a01b031690565b9260405196879586948593633a871cdd60e01b85526004850161147d565b03925af190811561061857600091611f74575090565b6106bb915060203d811161094657610938818361024c565b600080516020612171833981519152546040805163199ed7c960e11b8152600481019390935260248301529092602092849260501c6001600160a01b03169183918291611fde91604484019190611895565b03915afa90811561061857600091611f74575090565b6000805160206121718339815191525460408051639ea9bd5960e01b81526001600160a01b039384166004820152602481019190915292602092849260501c169082908190611e16906044830190611873565b7f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460408051338152346020820152a1565b60008051602061217183398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c169283156001146120e6575b5060d01c92565b9250386120df565b8082186001600160a01b031615600114612109575050600190565b65ffffffffffff60a01b8181169265ffffffffffff60a01b1992831692811691908415612167575b81168015612160575b848110908518028085189414612158575b5081811190821802181790565b92503861214b565b508061213a565b9350809361213156fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789"; + bytes constant KERNEL_2_3_CODE = + hex"000000000000000000000000000000000000000000000000000000000000000061014034620001be57601f6200238b38819003918201601f19168301916001600160401b03831184841017620001c357808492602094604052833981010312620001be57516001600160a01b0381168103620001be57306080524660a05260a062000069620001d9565b600681526005602082016512d95c9b995b60d21b815260206200008b620001d9565b838152019264302e322e3360d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220906101009182526101209081527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b0319825416179055604051906121919283620001fa843960805183611b42015260a05183611b65015260c05183611bd7015260e05183611bfd01525182611b21015251818181610506015281816107c5015281816108d201528181610a5d01528181610b8501528181610d7f01528181610de901528181610f4d0152818161104c015281816111760152818161121f01526115660152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b03811183821017620001c35760405256fe6080604052600436101561001d575b366111595761001b612047565b005b60003560e01c806306fdde031461019d5780630b3dc35414610198578063150b7a02146101935780631626ba7e1461018e57806329f8b17414610189578063333daf921461018457806334fcd5be1461017f5780633659cfe61461017a5780633a871cdd146101755780633e1b08121461017057806351166ba01461016b578063519454471461016657806354fd4d501461016157806355b14f501461015c57806357b750471461015757806384b0196e1461015257806388e7fd061461014d578063b0d691fe14610148578063b68df16d14610143578063bc197c811461013e578063d087d28814610139578063d1f5789414610134578063d54162211461012f5763f23a6e610361000e576110c7565b611035565b610f99565b610f1a565b610e8b565b610dae565b610d69565b610d34565b610c8c565b610c55565b610b6f565b610b1b565b610a16565b61094d565b610889565b610847565b6107a1565b6106be565b610639565b610491565b61043e565b6103b1565b610332565b6102fe565b60009103126101ad57565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101db57604052565b6101b2565b606081019081106001600160401b038211176101db57604052565b608081019081106001600160401b038211176101db57604052565b604081019081106001600160401b038211176101db57604052565b60c081019081106001600160401b038211176101db57604052565b90601f801991011681019081106001600160401b038211176101db57604052565b6040519061027a826101fb565b565b6040519061016082018281106001600160401b038211176101db57604052565b604051906102a982610216565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b8481106102ea575050826000602080949584010152601f8019910116010190565b6020818301810151848301820152016102c9565b346101ad5760003660031901126101ad5761032e61031a61029c565b6040519182916020835260208301906102be565b0390f35b346101ad5760003660031901126101ad5760206000805160206121718339815191525460501c6040519060018060a01b03168152f35b6001600160a01b038116036101ad57565b359061027a82610368565b9181601f840112156101ad578235916001600160401b0383116101ad57602083818601950101116101ad57565b346101ad5760803660031901126101ad576103cd600435610368565b6103d8602435610368565b6064356001600160401b0381116101ad576103f7903690600401610384565b5050604051630a85bd0160e11b8152602090f35b9060406003198301126101ad5760043591602435906001600160401b0382116101ad5761043a91600401610384565b9091565b346101ad5760206104576104513661040b565b91611c33565b6040516001600160e01b03199091168152f35b600435906001600160e01b0319821682036101ad57565b65ffffffffffff8116036101ad57565b60c03660031901126101ad576104a561046a565b602435906104b282610368565b604435906104bf82610368565b6064356104cb81610481565b608435936104d885610481565b60a4356001600160401b0381116101ad576104f7903690600401610384565b9590946001600160a01b0393337f0000000000000000000000000000000000000000000000000000000000000000861614158061062f575b61061d5784926105646105909261055561054761026d565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b038316606082015261058b87611121565b611803565b1693843b156101ad576040519063064acaab60e11b825281806105ba6000998a94600484016118b6565b038183895af18015610618576105ff575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061060c610612926101c8565b806101a2565b386105cb565b61154d565b604051637046c88d60e01b8152600490fd5b503033141561052f565b346101ad57602061065261064c3661040b565b91611f8c565b604051908152f35b9291926001600160401b0382116101db5760405191610683601f8201601f19166020018461024c565b8294818452818301116101ad578281602093846000960137010152565b9080601f830112156101ad578160206106bb9335910161065a565b90565b6020806003193601126101ad576001600160401b036004358181116101ad57366023820112156101ad578060040135918083116101db578260051b9060409081519461070c8785018761024c565b85528585019160248094860101943686116101ad57848101935b8685106107365761001b8861121c565b84358481116101ad578201606060231982360301126101ad5783519161075b836101e0565b8782013561076881610368565b835260448201358b8401526064820135928684116101ad576107928c94938a8695369201016106a0565b86820152815201940193610726565b60203660031901126101ad576004356107b981610368565b6001600160a01b0390337f0000000000000000000000000000000000000000000000000000000000000000831614158061083d575b61061d57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b50303314156107ee565b6003196060368201126101ad57600435906001600160401b0382116101ad576101609082360301126101ad576106526020916044359060243590600401611559565b346101ad5760203660031901126101ad576004356001600160c01b038116908190036101ad57604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156106185761032e9160009161091f575b506040519081529081906020820190565b610940915060203d8111610946575b610938818361024c565b81019061146e565b3861090e565b503d61092e565b346101ad5760203660031901126101ad5761032e61099261096c61046a565b6000606060405161097c816101fb565b8281528260208201528260408201520152611121565b6040519061099f826101fb565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b60803660031901126101ad57600435610a2e81610368565b6044356001600160401b0381116101ad57610a4d9036906004016106a0565b9060643560028110156101ad57337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610af0575b80610adb575b61061d57610aa0816111d2565b610ac9576000828193926020839451920190602435905af13d82803e15610ac5573d90f35b3d90fd5b6040516367ce775960e01b8152600490fd5b50610aeb610ae7611d8c565b1590565b610a93565b5030331415610a8d565b60405190610b0782610216565b6005825264302e322e3360d81b6020830152565b346101ad5760003660031901126101ad5761032e61031a610afa565b9060406003198301126101ad57600435610b5081610368565b91602435906001600160401b0382116101ad5761043a91600401610384565b610b7836610b37565b90916001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216141580610c4b575b61061d57806000805160206121718339815191525460501c1691610bd181612078565b1692836040519360009586947fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c8680a3813b15610c47578385610c25819593829463064acaab60e11b8452600484016118b6565b03925af1801561061857610c37575080f35b8061060c610c44926101c8565b80f35b8380fd5b5030331415610bae565b346101ad5760003660031901126101ad5760206000805160206121718339815191525460e01b6040519063ffffffff60e01b168152f35b346101ad5760003660031901126101ad57610ce2610ca861029c565b610cb0610afa565b90604051928392600f60f81b8452610cd460209360e08587015260e08601906102be565b9084820360408601526102be565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610d1d57505050500390f35b835185528695509381019392810192600101610d0e565b346101ad5760003660031901126101ad5760206000805160206121718339815191525465ffffffffffff60405191831c168152f35b346101ad5760003660031901126101ad576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b60403660031901126101ad57600435610dc681610368565b6024356001600160401b0381116101ad57610de59036906004016106a0565b90337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610e51575b80610e40575b61061d5760008281939260208394519201905af43d82803e15610ac5573d90f35b50610e4c610ae7611d8c565b610e1f565b5030331415610e19565b9181601f840112156101ad578235916001600160401b0383116101ad576020808501948460051b0101116101ad57565b346101ad5760a03660031901126101ad57610ea7600435610368565b610eb2602435610368565b6001600160401b036044358181116101ad57610ed2903690600401610e5b565b50506064358181116101ad57610eec903690600401610e5b565b50506084359081116101ad57610f06903690600401610384565b505060405163bc197c8160e01b8152602090f35b346101ad5760003660031901126101ad57604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156106185761032e9160009161091f57506040519081529081906020820190565b610fa236610b37565b60008051602061217183398151915254919290916001600160a01b03919060501c821661102457610fd281612078565b1691823b156101ad57611007926000928360405180968195829463064acaab60e11b8452602060048501526024840191611895565b03925af180156106185761101757005b8061060c61001b926101c8565b60405162dc149f60e41b8152600490fd5b60203660031901126101ad5761104961046a565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806110bd575b61061d5760008051602061217183398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b503033141561107c565b346101ad5760a03660031901126101ad576110e3600435610368565b6110ee602435610368565b6084356001600160401b0381116101ad5761110d903690600401610384565b505060405163f23a6e6160e01b8152602090f35b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061116f81356001600160e01b031916611121565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806111c3575b61061d57818091368280378136915af43d82803e15610ac5573d90f35b506111cc611d8c565b156111a6565b600211156111dc57565b634e487b7160e01b600052602160045260246000fd5b80518210156112065760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806112a9575b61061d5780519060005b82811061126557505050565b60008061127283856111f2565b5180516001600160a01b03166020916040838201519101519283519301915af13d6000803e156112a457600101611259565b3d6000fd5b506112b5610ae7611d8c565b61124f565b906004116101ad5790600490565b90929192836004116101ad5783116101ad57600401916003190190565b906024116101ad5760100190601490565b906058116101ad5760380190602090565b906024116101ad5760040190602090565b906038116101ad5760240190601490565b90600a116101ad5760040190600690565b906010116101ad57600a0190600690565b909392938483116101ad5784116101ad578101920390565b6001600160e01b0319903581811693926004811061138057505050565b60040360031b82901b16169150565b9190610160838203126101ad576113a461027c565b926113ae81610379565b8452602081013560208501526040810135916001600160401b03928381116101ad57816113dc9184016106a0565b604086015260608201358381116101ad57816113f99184016106a0565b60608601526080820135608086015260a082013560a086015260c082013560c086015260e082013560e08601526101008083013590860152610120808301358481116101ad578261144b9185016106a0565b9086015261014092838301359081116101ad5761146892016106a0565b90830152565b908160209103126101ad575190565b606080825282516001600160a01b031690820152919392916040916115439060208101516080840152838101516114c2610160918260a08701526101c08601906102be565b906115306114e2606085015193605f1994858983030160c08a01526102be565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b01528701519089015285015184888303016101808901526102be565b92015190848303016101a08501526102be565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b039392917f000000000000000000000000000000000000000000000000000000000000000085163303611777576004948535928361014481013501918760248401930135946115b86115b287866112ba565b90611363565b926001600160e01b0319808516918215611754576115d790369061138f565b946115f16000805160206121718339815191525460e01b90565b1616156116095760405163fc2f51c560e01b81528a90fd5b97989697600160e01b8103611703575090602095966116936116616116486116436115b287606460009901350160248782013591016112ba565b611121565b6001810154909a9081906001600160a01b0316986112c8565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617995b8b6116f5575b369161065a565b6101408501526116b7604051998a9788968794633a871cdd60e01b8652850161147d565b0393165af1908115610618576106bb926000926116d5575b506120ee565b6116ee91925060203d811161094657610938818361024c565b90386116cf565b348080808f335af15061168c565b9095939190600160e11b036117475761173d611693946000936117386115b28a606460209c01350160248d82013591016112ba565b6118c7565b9199929691611686565b5050505050505050600190565b9697505050505050506106bb9394508215611ec0573434343486335af150611ec0565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff1990358181169392601481106117ab57505050565b60140360031b82901b16169150565b3590602081106117c8575090565b6000199060200360031b1b1690565b6001600160d01b031990358181169392600681106117f457505050565b60060360031b82901b16169150565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b90602091808252806000848401376000828201840152601f01601f1916010190565b908060209392818452848401376000828201840152601f01601f1916010190565b9160206106bb938181520191611895565b91906118d382826112e5565b6118dc91611789565b60601c936118ea83836112f6565b6118f3916117ba565b60588301607882019485836058019061190d91838861134b565b611916916117ba565b6119208287611307565b611929916117ba565b6119338388611318565b61193c91611789565b60601c61194a36878761065a565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641769381019384526001600160e01b03198e169181019190915260608101949094526001600160a01b0392909216608084015260a080840192909252908252906119c060c08261024c565b5190206119cc90611b1f565b90840196607888016119df91848961134b565b906119e992611f8c565b6119f38287611307565b6001600160a01b031991611a0791906117ba565b16611a11916120ee565b966078868801019682036077190195611a2a8382611329565b611a33916117d7565b60d01c92611a41818361133a565b611a4a916117d7565b60d01c91611a588282611318565b611a6191611789565b60601c91611a6e916112e5565b611a7791611789565b60601c91611a8361026d565b65ffffffffffff909516855265ffffffffffff1660208501526001600160a01b031660408401526001600160a01b03166060830152611ac190611121565b90611acb91611803565b6001600160a01b03871691823b156101ad57611b01926000928360405180968195829463064acaab60e11b8452600484016118b6565b03925af1801561061857611b125750565b8061060c61027a926101c8565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611bac575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611b8d565b91611cf291611cf793611cdc611cea611c4a61029c565b611c52610afa565b906020815191012090602081519101206040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a08152611cb181610231565b51902092604051928391602083019586909160429261190160f01b8352600283015260228201520190565b03601f19810183528261024c565b519020611f8c565b6120c5565b9065ffffffffffff928342911611159283611d44575b505081611d32575b5015611d2657630b135d3f60e11b90565b6001600160e01b031990565b6001600160a01b031615905038611d15565b429116101591503880611d0d565b908160209103126101ad575180151581036101ad5790565b6001600160a01b0390911681526040602082018190526106bb92910190611873565b611d963633611ff4565b611ebb57611daf6000356001600160e01b031916611121565b6001810154611dce906001600160a01b03165b6001600160a01b031690565b906001600160a01b03821615908115611e7f575b8115611e54575b5015611df55750600090565b60206040518092639ea9bd5960e01b82528180611e16363360048401611d6a565b03915afa90811561061857600091611e2c575090565b6106bb915060203d8111611e4d575b611e45818361024c565b810190611d52565b503d611e3b565b54611e6e915065ffffffffffff165b65ffffffffffff1690565b65ffffffffffff4291161138611de9565b905065ffffffffffff611e9f611e63835465ffffffffffff9060301c1690565b168015159081611eb1575b5090611de2565b9050421138611eaa565b600190565b9091611ecc368361138f565b610140928381013590601e19813603018212156101ad5701938435946001600160401b0386116101ad576020019385360385136101ad57611f1661168c87611f5e986020986112c8565b908301526000611f40611dc26000805160206121718339815191525460501c60018060a01b031690565b9260405196879586948593633a871cdd60e01b85526004850161147d565b03925af190811561061857600091611f74575090565b6106bb915060203d811161094657610938818361024c565b600080516020612171833981519152546040805163199ed7c960e11b8152600481019390935260248301529092602092849260501c6001600160a01b03169183918291611fde91604484019190611895565b03915afa90811561061857600091611f74575090565b6000805160206121718339815191525460408051639ea9bd5960e01b81526001600160a01b039384166004820152602481019190915292602092849260501c169082908190611e16906044830190611873565b7f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460408051338152346020820152a1565b60008051602061217183398151915280547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509290921b600160501b600160f01b0316919091179055565b8065ffffffffffff91828160a01c169283156001146120e6575b5060d01c92565b9250386120df565b8082186001600160a01b031615600114612109575050600190565b65ffffffffffff60a01b8181169265ffffffffffff60a01b1992831692811691908415612167575b81168015612160575b848110908518028085189414612158575b5081811190821802181790565b92503861214b565b508061213a565b9350809361213156fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789"; address constant EXPECTED_KERNEL_LITE_2_3_ADDRESS = 0x482EC42E88a781485E1B6A4f07a0C5479d183291; - bytes constant KERNEL_LITE_2_3_CODE = hex"0000000000000000000000000000000000000000000000000000000000000000610160346200021a57601f620024b438819003918201601f19168301916001600160401b038311848410176200021f5780849260409485528339810103126200021a5780516001600160a01b039182821682036200021a57602001519182168092036200021a57306080524660a05260a06200007a62000235565b600681526005602082016512d95c9b995b60d21b815260206200009c62000235565b838152019264302e322e3360d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220916101009283526101209182527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b03198254161790556101409081527fdea7fea882fba743201b2aeb1babf326b8944488db560784858525d123ee7e976001808060a01b03198254161790556040519161225e938462000256853960805184611c54015260a05184611c77015260c05184611ce9015260e05184611d0f01525183611c33015251828181610526015281816107e5015281816108f201528181610a7d01528181610b9e01528181610d3d01528181610da701528181610f50015281816110f4015281816111ec0152818161129c01528181611345015261169a015251818181610eee0152610fb10152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b038111838210176200021f5760405256fe6080604052600436101561001d575b3661127f5761001b611fe4565b005b60003560e01c806306fdde03146101bd5780630b3dc354146101b8578063150b7a02146101b35780631626ba7e146101ae57806329f8b174146101a9578063333daf92146101a457806334fcd5be1461019f5780633659cfe61461019a5780633a871cdd146101955780633e1b08121461019057806351166ba01461018b578063519454471461018657806354fd4d501461018157806355b14f501461017c57806357b750471461017757806384b0196e1461017257806388e7fd061461016d578063b0d691fe14610168578063b68df16d14610163578063bc197c811461015e578063cdaea3ed14610159578063d087d28814610154578063d1f578941461014f578063d54162211461014a578063f23a6e61146101455763f2fde38b0361000e576111c9565b61116f565b6110dd565b610f9c565b610f1d565b610ed8565b610e49565b610d6c565b610d27565b610cf2565b610c4a565b610c13565b610b8f565b610b3b565b610a36565b61096d565b6108a9565b610867565b6107c1565b6106de565b610659565b6104b1565b61045e565b6103d1565b610352565b61031e565b60009103126101cd57565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101fb57604052565b6101d2565b606081019081106001600160401b038211176101fb57604052565b608081019081106001600160401b038211176101fb57604052565b604081019081106001600160401b038211176101fb57604052565b60c081019081106001600160401b038211176101fb57604052565b90601f801991011681019081106001600160401b038211176101fb57604052565b6040519061029a8261021b565b565b6040519061016082018281106001600160401b038211176101fb57604052565b604051906102c982610236565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061030a575050826000602080949584010152601f8019910116010190565b6020818301810151848301820152016102e9565b346101cd5760003660031901126101cd5761034e61033a6102bc565b6040519182916020835260208301906102de565b0390f35b346101cd5760003660031901126101cd57602060008051602061221e8339815191525460501c6040519060018060a01b03168152f35b6001600160a01b038116036101cd57565b359061029a82610388565b9181601f840112156101cd578235916001600160401b0383116101cd57602083818601950101116101cd57565b346101cd5760803660031901126101cd576103ed600435610388565b6103f8602435610388565b6064356001600160401b0381116101cd576104179036906004016103a4565b5050604051630a85bd0160e11b8152602090f35b9060406003198301126101cd5760043591602435906001600160401b0382116101cd5761045a916004016103a4565b9091565b346101cd5760206104776104713661042b565b91611d45565b6040516001600160e01b03199091168152f35b600435906001600160e01b0319821682036101cd57565b65ffffffffffff8116036101cd57565b60c03660031901126101cd576104c561048a565b602435906104d282610388565b604435906104df82610388565b6064356104eb816104a1565b608435936104f8856104a1565b60a4356001600160401b0381116101cd576105179036906004016103a4565b9590946001600160a01b0393337f0000000000000000000000000000000000000000000000000000000000000000861614158061064f575b61063d5784926105846105b09261057561056761028d565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105ab87611247565b611941565b1693843b156101cd576040519063064acaab60e11b825281806105da6000998a94600484016119b1565b038183895af180156106385761061f575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061062c610632926101e8565b806101c2565b386105eb565b611681565b604051637046c88d60e01b8152600490fd5b503033141561054f565b346101cd57602061067261066c3661042b565b91612136565b604051908152f35b9291926001600160401b0382116101fb57604051916106a3601f8201601f19166020018461026c565b8294818452818301116101cd578281602093846000960137010152565b9080601f830112156101cd578160206106db9335910161067a565b90565b6020806003193601126101cd576001600160401b036004358181116101cd57366023820112156101cd578060040135918083116101fb578260051b9060409081519461072c8785018761026c565b85528585019160248094860101943686116101cd57848101935b8685106107565761001b88611342565b84358481116101cd578201606060231982360301126101cd5783519161077b83610200565b8782013561078881610388565b835260448201358b8401526064820135928684116101cd576107b28c94938a8695369201016106c0565b86820152815201940193610746565b60203660031901126101cd576004356107d981610388565b6001600160a01b0390337f0000000000000000000000000000000000000000000000000000000000000000831614158061085d575b61063d57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561080e565b6003196060368201126101cd57600435906001600160401b0382116101cd576101609082360301126101cd57610672602091604435906024359060040161168d565b346101cd5760203660031901126101cd576004356001600160c01b038116908190036101cd57604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156106385761034e9160009161093f575b506040519081529081906020820190565b610960915060203d8111610966575b610958818361026c565b8101906115a2565b3861092e565b503d61094e565b346101cd5760203660031901126101cd5761034e6109b261098c61048a565b6000606060405161099c8161021b565b8281528260208201528260408201520152611247565b604051906109bf8261021b565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b60803660031901126101cd57600435610a4e81610388565b6044356001600160401b0381116101cd57610a6d9036906004016106c0565b9060643560028110156101cd57337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610b10575b80610afb575b61063d57610ac0816112f8565b610ae9576000828193926020839451920190602435905af13d82803e15610ae5573d90f35b3d90fd5b6040516367ce775960e01b8152600490fd5b50610b0b610b07611eb5565b1590565b610ab3565b5030331415610aad565b60405190610b2782610236565b6005825264302e322e3360d81b6020830152565b346101cd5760003660031901126101cd5761034e61033a610b1a565b9060406003198301126101cd57600435610b7081610388565b91602435906001600160401b0382116101cd5761045a916004016103a4565b610b9836610b57565b505050337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610c09575b61063d5760405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b6044820152606490fd5b5030331415610bce565b346101cd5760003660031901126101cd57602060008051602061221e8339815191525460e01b6040519063ffffffff60e01b168152f35b346101cd5760003660031901126101cd57610ca0610c666102bc565b610c6e610b1a565b90604051928392600f60f81b8452610c9260209360e08587015260e08601906102de565b9084820360408601526102de565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cdb57505050500390f35b835185528695509381019392810192600101610ccc565b346101cd5760003660031901126101cd57602060008051602061221e8339815191525465ffffffffffff60405191831c168152f35b346101cd5760003660031901126101cd576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b60403660031901126101cd57600435610d8481610388565b6024356001600160401b0381116101cd57610da39036906004016106c0565b90337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610e0f575b80610dfe575b61063d5760008281939260208394519201905af43d82803e15610ae5573d90f35b50610e0a610b07611eb5565b610ddd565b5030331415610dd7565b9181601f840112156101cd578235916001600160401b0383116101cd576020808501948460051b0101116101cd57565b346101cd5760a03660031901126101cd57610e65600435610388565b610e70602435610388565b6001600160401b036044358181116101cd57610e90903690600401610e19565b50506064358181116101cd57610eaa903690600401610e19565b50506084359081116101cd57610ec49036906004016103a4565b505060405163bc197c8160e01b8152602090f35b346101cd5760003660031901126101cd576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101cd5760003660031901126101cd57604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156106385761034e9160009161093f57506040519081529081906020820190565b610fa536610b57565b916001600160a01b03907f000000000000000000000000000000000000000000000000000000000000000082169082160361108d5760008051602061223e833981519152541661103c5761100861100261001b9361100e936113e0565b906118c7565b60601c90565b60008051602061223e83398151915280546001600160a01b0319166001600160a01b03909216919091179055565b60405162461bcd60e51b8152602060048201526024808201527f4b65726e656c4c69746545434453413a20616c726561647920696e697469616c6044820152631a5e995960e21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f4b65726e656c4c69746545434453413a20696e76616c69642076616c6964617460448201526137b960f11b6064820152608490fd5b60203660031901126101cd576110f161048a565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611165575b61063d5760008051602061221e83398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415611124565b346101cd5760a03660031901126101cd5761118b600435610388565b611196602435610388565b6084356001600160401b0381116101cd576111b59036906004016103a4565b505060405163f23a6e6160e01b8152602090f35b60203660031901126101cd576004356111e181610388565b6001600160a01b03337f0000000000000000000000000000000000000000000000000000000000000000821614158061123d575b61063d5760008051602061223e83398151915280546001600160a01b03191691909216179055005b5030331415611215565b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061129581356001600160e01b031916611247565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806112e9575b61063d57818091368280378136915af43d82803e15610ae5573d90f35b506112f2611eb5565b156112cc565b6002111561130257565b634e487b7160e01b600052602160045260246000fd5b805182101561132c5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806113cf575b61063d5780519060005b82811061138b57505050565b6000806113988385611318565b5180516001600160a01b03166020916040838201519101519283519301915af13d6000803e156113ca5760010161137f565b3d6000fd5b506113db610b07611eb5565b611375565b906014116101cd5790601490565b906004116101cd5790600490565b90929192836004116101cd5783116101cd57600401916003190190565b906024116101cd5760100190601490565b906058116101cd5760380190602090565b906024116101cd5760040190602090565b906038116101cd5760240190601490565b90600a116101cd5760040190600690565b906010116101cd57600a0190600690565b909392938483116101cd5784116101cd578101920390565b6001600160e01b031990358181169392600481106114b457505050565b60040360031b82901b16169150565b9190610160838203126101cd576114d861029c565b926114e281610399565b8452602081013560208501526040810135916001600160401b03928381116101cd57816115109184016106c0565b604086015260608201358381116101cd578161152d9184016106c0565b60608601526080820135608086015260a082013560a086015260c082013560c086015260e082013560e08601526101008083013590860152610120808301358481116101cd578261157f9185016106c0565b9086015261014092838301359081116101cd5761159c92016106c0565b90830152565b908160209103126101cd575190565b606080825282516001600160a01b031690820152919392916040916116779060208101516080840152838101516115f6610160918260a08701526101c08601906102de565b90611664611616606085015193605f1994858983030160c08a01526102de565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b01528701519089015285015184888303016101808901526102de565b92015190848303016101a08501526102de565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b039392917f0000000000000000000000000000000000000000000000000000000000000000851633036118b5576004948535928361014481013501918760248401930135946116ec6116e687866113ee565b90611497565b926001600160e01b03198085169182156118885761170b9036906114c3565b9461172560008051602061221e8339815191525460e01b90565b16161561173d5760405163fc2f51c560e01b81528a90fd5b97989697600160e01b8103611837575090602095966117c761179561177c6117776116e687606460009901350160248782013591016113ee565b611247565b6001810154909a9081906001600160a01b0316986113fc565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617995b8b611829575b369161067a565b6101408501526117eb604051998a9788968794633a871cdd60e01b865285016115b1565b0393165af1908115610638576106db92600092611809575b5061219b565b61182291925060203d811161096657610958818361026c565b9038611803565b348080808f335af1506117c0565b9095939190600160e11b0361187b576118716117c79460009361186c6116e68a606460209c01350160248d82013591016113ee565b6119d9565b91999296916117ba565b5050505050505050600190565b9750505050505050916106db939450806118a3575b5061203e565b3490349034903490335af1503861189d565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff1990358181169392601481106118e957505050565b60140360031b82901b16169150565b359060208110611906575090565b6000199060200360031b1b1690565b6001600160d01b0319903581811693926006811061193257505050565b60060360031b82901b16169150565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b90918060409360208452816020850152848401376000828201840152601f01601f1916010190565b91906119e58282611419565b6119ee916118c7565b60601c936119fc838361142a565b611a05916118f8565b605883016078820194858360580190611a1f91838861147f565b611a28916118f8565b611a32828761143b565b611a3b916118f8565b611a45838861144c565b611a4e916118c7565b60601c611a5c36878761067a565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641769381019384526001600160e01b03198e169181019190915260608101949094526001600160a01b0392909216608084015260a08084019290925290825290611ad260c08261026c565b519020611ade90611c31565b9084019660788801611af191848961147f565b90611afb92612136565b611b05828761143b565b6001600160a01b031991611b1991906118f8565b16611b239161219b565b966078868801019682036077190195611b3c838261145d565b611b4591611915565b60d01c92611b53818361146e565b611b5c91611915565b60d01c91611b6a828261144c565b611b73916118c7565b60601c91611b8091611419565b611b89916118c7565b60601c91611b9561028d565b65ffffffffffff909516855265ffffffffffff1660208501526001600160a01b031660408401526001600160a01b03166060830152611bd390611247565b90611bdd91611941565b6001600160a01b03871691823b156101cd57611c13926000928360405180968195829463064acaab60e11b8452600484016119b1565b03925af1801561063857611c245750565b8061062c61029a926101e8565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611cbe575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611c9f565b91611e0491611e0993611dee611dfc611d5c6102bc565b611d64610b1a565b906020815191012090602081519101206040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a08152611dc381610251565b51902092604051928391602083019586909160429261190160f01b8352600283015260228201520190565b03601f19810183528261026c565b519020612136565b612015565b9065ffffffffffff928342911611159283611e56575b505081611e44575b5015611e3857630b135d3f60e11b90565b6001600160e01b031990565b6001600160a01b031615905038611e27565b429116101591503880611e1f565b908160209103126101cd575180151581036101cd5790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b60008051602061223e833981519152546001600160a01b039081163314611fde57611eeb6000356001600160e01b031916611247565b60018101546001600160a01b031691821615908115611fa2575b8115611f77575b5015611f185750600090565b60206040518092639ea9bd5960e01b82528180611f39363360048401611e7c565b03915afa90811561063857600091611f4f575090565b6106db915060203d8111611f70575b611f68818361026c565b810190611e64565b503d611f5e565b54611f91915065ffffffffffff165b65ffffffffffff1690565b65ffffffffffff4291161138611f0c565b905065ffffffffffff611fc2611f86835465ffffffffffff9060301c1690565b168015159081611fd4575b5090611f05565b9050421138611fcd565b50600190565b7f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460408051338152346020820152a1565b8065ffffffffffff91828160a01c16928315600114612036575b5060d01c92565b92503861202f565b9061206e906020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042090565b9061014081013590601e19813603018212156101cd5701908135916001600160401b0383116101cd576020019180360383136101cd576117c0816120b5926120bb956113fc565b906120e7565b60008051602061223e833981519152546001600160a01b039081169116036120e257600090565b600190565b6001608060006041602094969596604080519880519285526060810151851a88528781015182520151606052145afa51913d15612128576000606052604052565b638baa579f6000526004601cfd5b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042061216f92916120b59192369161067a565b60008051602061223e833981519152546001600160a01b0391821691161461219657600190565b600090565b8082186001600160a01b0316156001146121b6575050600190565b65ffffffffffff60a01b8181169265ffffffffffff60a01b1992831692811691908415612214575b8116801561220d575b848110908518028085189414612205575b5081811190821802181790565b9250386121f8565b50806121e7565b935080936121de56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9dea7fea882fba743201b2aeb1babf326b8944488db560784858525d123ee7e970000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789000000000000000000000000d9ab5096a832b9ce79914329daee236f8eea0390"; + bytes constant KERNEL_LITE_2_3_CODE = + hex"0000000000000000000000000000000000000000000000000000000000000000610160346200021a57601f620024b438819003918201601f19168301916001600160401b038311848410176200021f5780849260409485528339810103126200021a5780516001600160a01b039182821682036200021a57602001519182168092036200021a57306080524660a05260a06200007a62000235565b600681526005602082016512d95c9b995b60d21b815260206200009c62000235565b838152019264302e322e3360d81b845251902091208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83526020830152604082015246606082015230608082015220916101009283526101209182527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd96a010000000000000000000080600160f01b03198254161790556101409081527fdea7fea882fba743201b2aeb1babf326b8944488db560784858525d123ee7e976001808060a01b03198254161790556040519161225e938462000256853960805184611c54015260a05184611c77015260c05184611ce9015260e05184611d0f01525183611c33015251828181610526015281816107e5015281816108f201528181610a7d01528181610b9e01528181610d3d01528181610da701528181610f50015281816110f4015281816111ec0152818161129c01528181611345015261169a015251818181610eee0152610fb10152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408051919082016001600160401b038111838210176200021f5760405256fe6080604052600436101561001d575b3661127f5761001b611fe4565b005b60003560e01c806306fdde03146101bd5780630b3dc354146101b8578063150b7a02146101b35780631626ba7e146101ae57806329f8b174146101a9578063333daf92146101a457806334fcd5be1461019f5780633659cfe61461019a5780633a871cdd146101955780633e1b08121461019057806351166ba01461018b578063519454471461018657806354fd4d501461018157806355b14f501461017c57806357b750471461017757806384b0196e1461017257806388e7fd061461016d578063b0d691fe14610168578063b68df16d14610163578063bc197c811461015e578063cdaea3ed14610159578063d087d28814610154578063d1f578941461014f578063d54162211461014a578063f23a6e61146101455763f2fde38b0361000e576111c9565b61116f565b6110dd565b610f9c565b610f1d565b610ed8565b610e49565b610d6c565b610d27565b610cf2565b610c4a565b610c13565b610b8f565b610b3b565b610a36565b61096d565b6108a9565b610867565b6107c1565b6106de565b610659565b6104b1565b61045e565b6103d1565b610352565b61031e565b60009103126101cd57565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116101fb57604052565b6101d2565b606081019081106001600160401b038211176101fb57604052565b608081019081106001600160401b038211176101fb57604052565b604081019081106001600160401b038211176101fb57604052565b60c081019081106001600160401b038211176101fb57604052565b90601f801991011681019081106001600160401b038211176101fb57604052565b6040519061029a8261021b565b565b6040519061016082018281106001600160401b038211176101fb57604052565b604051906102c982610236565b600682526512d95c9b995b60d21b6020830152565b919082519283825260005b84811061030a575050826000602080949584010152601f8019910116010190565b6020818301810151848301820152016102e9565b346101cd5760003660031901126101cd5761034e61033a6102bc565b6040519182916020835260208301906102de565b0390f35b346101cd5760003660031901126101cd57602060008051602061221e8339815191525460501c6040519060018060a01b03168152f35b6001600160a01b038116036101cd57565b359061029a82610388565b9181601f840112156101cd578235916001600160401b0383116101cd57602083818601950101116101cd57565b346101cd5760803660031901126101cd576103ed600435610388565b6103f8602435610388565b6064356001600160401b0381116101cd576104179036906004016103a4565b5050604051630a85bd0160e11b8152602090f35b9060406003198301126101cd5760043591602435906001600160401b0382116101cd5761045a916004016103a4565b9091565b346101cd5760206104776104713661042b565b91611d45565b6040516001600160e01b03199091168152f35b600435906001600160e01b0319821682036101cd57565b65ffffffffffff8116036101cd57565b60c03660031901126101cd576104c561048a565b602435906104d282610388565b604435906104df82610388565b6064356104eb816104a1565b608435936104f8856104a1565b60a4356001600160401b0381116101cd576105179036906004016103a4565b9590946001600160a01b0393337f0000000000000000000000000000000000000000000000000000000000000000861614158061064f575b61063d5784926105846105b09261057561056761028d565b65ffffffffffff9094168452565b65ffffffffffff166020830152565b6001600160a01b03851660408201526001600160a01b03831660608201526105ab87611247565b611941565b1693843b156101cd576040519063064acaab60e11b825281806105da6000998a94600484016119b1565b038183895af180156106385761061f575b5016906001600160e01b0319167fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d3213538480a480f35b8061062c610632926101e8565b806101c2565b386105eb565b611681565b604051637046c88d60e01b8152600490fd5b503033141561054f565b346101cd57602061067261066c3661042b565b91612136565b604051908152f35b9291926001600160401b0382116101fb57604051916106a3601f8201601f19166020018461026c565b8294818452818301116101cd578281602093846000960137010152565b9080601f830112156101cd578160206106db9335910161067a565b90565b6020806003193601126101cd576001600160401b036004358181116101cd57366023820112156101cd578060040135918083116101fb578260051b9060409081519461072c8785018761026c565b85528585019160248094860101943686116101cd57848101935b8685106107565761001b88611342565b84358481116101cd578201606060231982360301126101cd5783519161077b83610200565b8782013561078881610388565b835260448201358b8401526064820135928684116101cd576107b28c94938a8695369201016106c0565b86820152815201940193610746565b60203660031901126101cd576004356107d981610388565b6001600160a01b0390337f0000000000000000000000000000000000000000000000000000000000000000831614158061085d575b61063d57807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2005b503033141561080e565b6003196060368201126101cd57600435906001600160401b0382116101cd576101609082360301126101cd57610672602091604435906024359060040161168d565b346101cd5760203660031901126101cd576004356001600160c01b038116908190036101cd57604051631aab3f0d60e11b815230600482015260248101919091526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156106385761034e9160009161093f575b506040519081529081906020820190565b610960915060203d8111610966575b610958818361026c565b8101906115a2565b3861092e565b503d61094e565b346101cd5760203660031901126101cd5761034e6109b261098c61048a565b6000606060405161099c8161021b565b8281528260208201528260408201520152611247565b604051906109bf8261021b565b805465ffffffffffff80821684528160301c16602084015260601c60408301526001808060a01b03910154166060820152604051918291829190916060608082019365ffffffffffff80825116845260208201511660208401528160018060a01b0391826040820151166040860152015116910152565b60803660031901126101cd57600435610a4e81610388565b6044356001600160401b0381116101cd57610a6d9036906004016106c0565b9060643560028110156101cd57337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610b10575b80610afb575b61063d57610ac0816112f8565b610ae9576000828193926020839451920190602435905af13d82803e15610ae5573d90f35b3d90fd5b6040516367ce775960e01b8152600490fd5b50610b0b610b07611eb5565b1590565b610ab3565b5030331415610aad565b60405190610b2782610236565b6005825264302e322e3360d81b6020830152565b346101cd5760003660031901126101cd5761034e61033a610b1a565b9060406003198301126101cd57600435610b7081610388565b91602435906001600160401b0382116101cd5761045a916004016103a4565b610b9836610b57565b505050337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610c09575b61063d5760405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b6044820152606490fd5b5030331415610bce565b346101cd5760003660031901126101cd57602060008051602061221e8339815191525460e01b6040519063ffffffff60e01b168152f35b346101cd5760003660031901126101cd57610ca0610c666102bc565b610c6e610b1a565b90604051928392600f60f81b8452610c9260209360e08587015260e08601906102de565b9084820360408601526102de565b90466060840152306080840152600060a084015282820360c08401528060605192838152019160809160005b828110610cdb57505050500390f35b835185528695509381019392810192600101610ccc565b346101cd5760003660031901126101cd57602060008051602061221e8339815191525465ffffffffffff60405191831c168152f35b346101cd5760003660031901126101cd576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b60403660031901126101cd57600435610d8481610388565b6024356001600160401b0381116101cd57610da39036906004016106c0565b90337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610e0f575b80610dfe575b61063d5760008281939260208394519201905af43d82803e15610ae5573d90f35b50610e0a610b07611eb5565b610ddd565b5030331415610dd7565b9181601f840112156101cd578235916001600160401b0383116101cd576020808501948460051b0101116101cd57565b346101cd5760a03660031901126101cd57610e65600435610388565b610e70602435610388565b6001600160401b036044358181116101cd57610e90903690600401610e19565b50506064358181116101cd57610eaa903690600401610e19565b50506084359081116101cd57610ec49036906004016103a4565b505060405163bc197c8160e01b8152602090f35b346101cd5760003660031901126101cd576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101cd5760003660031901126101cd57604051631aab3f0d60e11b8152306004820152600060248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156106385761034e9160009161093f57506040519081529081906020820190565b610fa536610b57565b916001600160a01b03907f000000000000000000000000000000000000000000000000000000000000000082169082160361108d5760008051602061223e833981519152541661103c5761100861100261001b9361100e936113e0565b906118c7565b60601c90565b60008051602061223e83398151915280546001600160a01b0319166001600160a01b03909216919091179055565b60405162461bcd60e51b8152602060048201526024808201527f4b65726e656c4c69746545434453413a20616c726561647920696e697469616c6044820152631a5e995960e21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f4b65726e656c4c69746545434453413a20696e76616c69642076616c6964617460448201526137b960f11b6064820152608490fd5b60203660031901126101cd576110f161048a565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611165575b61063d5760008051602061221e83398151915290815469ffffffffffff000000004260201b169160e01c9069ffffffffffffffffffff191617179055600080f35b5030331415611124565b346101cd5760a03660031901126101cd5761118b600435610388565b611196602435610388565b6084356001600160401b0381116101cd576111b59036906004016103a4565b505060405163f23a6e6160e01b8152602090f35b60203660031901126101cd576004356111e181610388565b6001600160a01b03337f0000000000000000000000000000000000000000000000000000000000000000821614158061123d575b61063d5760008051602061223e83398151915280546001600160a01b03191691909216179055005b5030331415611215565b63ffffffff60e01b166000527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda602052604060002090565b600061129581356001600160e01b031916611247565b5460601c337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806112e9575b61063d57818091368280378136915af43d82803e15610ae5573d90f35b506112f2611eb5565b156112cc565b6002111561130257565b634e487b7160e01b600052602160045260246000fd5b805182101561132c5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806113cf575b61063d5780519060005b82811061138b57505050565b6000806113988385611318565b5180516001600160a01b03166020916040838201519101519283519301915af13d6000803e156113ca5760010161137f565b3d6000fd5b506113db610b07611eb5565b611375565b906014116101cd5790601490565b906004116101cd5790600490565b90929192836004116101cd5783116101cd57600401916003190190565b906024116101cd5760100190601490565b906058116101cd5760380190602090565b906024116101cd5760040190602090565b906038116101cd5760240190601490565b90600a116101cd5760040190600690565b906010116101cd57600a0190600690565b909392938483116101cd5784116101cd578101920390565b6001600160e01b031990358181169392600481106114b457505050565b60040360031b82901b16169150565b9190610160838203126101cd576114d861029c565b926114e281610399565b8452602081013560208501526040810135916001600160401b03928381116101cd57816115109184016106c0565b604086015260608201358381116101cd578161152d9184016106c0565b60608601526080820135608086015260a082013560a086015260c082013560c086015260e082013560e08601526101008083013590860152610120808301358481116101cd578261157f9185016106c0565b9086015261014092838301359081116101cd5761159c92016106c0565b90830152565b908160209103126101cd575190565b606080825282516001600160a01b031690820152919392916040916116779060208101516080840152838101516115f6610160918260a08701526101c08601906102de565b90611664611616606085015193605f1994858983030160c08a01526102de565b608085015160e088015260a085015192610100938489015260c08601519061012091828a015260e08701519461014095868b01528701519089015285015184888303016101808901526102de565b92015190848303016101a08501526102de565b9460208201520152565b6040513d6000823e3d90fd5b6001600160a01b039392917f0000000000000000000000000000000000000000000000000000000000000000851633036118b5576004948535928361014481013501918760248401930135946116ec6116e687866113ee565b90611497565b926001600160e01b03198085169182156118885761170b9036906114c3565b9461172560008051602061221e8339815191525460e01b90565b16161561173d5760405163fc2f51c560e01b81528a90fd5b97989697600160e01b8103611837575090602095966117c761179561177c6117776116e687606460009901350160248782013591016113ee565b611247565b6001810154909a9081906001600160a01b0316986113fc565b995460d081901b6001600160d01b03191660709190911b65ffffffffffff60a01b1617995b8b611829575b369161067a565b6101408501526117eb604051998a9788968794633a871cdd60e01b865285016115b1565b0393165af1908115610638576106db92600092611809575b5061219b565b61182291925060203d811161096657610958818361026c565b9038611803565b348080808f335af1506117c0565b9095939190600160e11b0361187b576118716117c79460009361186c6116e68a606460209c01350160248d82013591016113ee565b6119d9565b91999296916117ba565b5050505050505050600190565b9750505050505050916106db939450806118a3575b5061203e565b3490349034903490335af1503861189d565b604051636b31ba1560e11b8152600490fd5b6bffffffffffffffffffffffff1990358181169392601481106118e957505050565b60140360031b82901b16169150565b359060208110611906575090565b6000199060200360031b1b1690565b6001600160d01b0319903581811693926006811061193257505050565b60060360031b82901b16169150565b81516020830151604084015160309190911b6bffffffffffff0000000000001665ffffffffffff9290921691909117606091821b6bffffffffffffffffffffffff19161782559091015160019190910180546001600160a01b0319166001600160a01b0392909216919091179055565b90918060409360208452816020850152848401376000828201840152601f01601f1916010190565b91906119e58282611419565b6119ee916118c7565b60601c936119fc838361142a565b611a05916118f8565b605883016078820194858360580190611a1f91838861147f565b611a28916118f8565b611a32828761143b565b611a3b916118f8565b611a45838861144c565b611a4e916118c7565b60601c611a5c36878761067a565b8051602091820120604080517f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee9641769381019384526001600160e01b03198e169181019190915260608101949094526001600160a01b0392909216608084015260a08084019290925290825290611ad260c08261026c565b519020611ade90611c31565b9084019660788801611af191848961147f565b90611afb92612136565b611b05828761143b565b6001600160a01b031991611b1991906118f8565b16611b239161219b565b966078868801019682036077190195611b3c838261145d565b611b4591611915565b60d01c92611b53818361146e565b611b5c91611915565b60d01c91611b6a828261144c565b611b73916118c7565b60601c91611b8091611419565b611b89916118c7565b60601c91611b9561028d565b65ffffffffffff909516855265ffffffffffff1660208501526001600160a01b031660408401526001600160a01b03166060830152611bd390611247565b90611bdd91611941565b6001600160a01b03871691823b156101cd57611c13926000928360405180968195829463064acaab60e11b8452600484016119b1565b03925af1801561063857611c245750565b8061062c61029a926101e8565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615611cbe575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220611c9f565b91611e0491611e0993611dee611dfc611d5c6102bc565b611d64610b1a565b906020815191012090602081519101206040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a08152611dc381610251565b51902092604051928391602083019586909160429261190160f01b8352600283015260228201520190565b03601f19810183528261026c565b519020612136565b612015565b9065ffffffffffff928342911611159283611e56575b505081611e44575b5015611e3857630b135d3f60e11b90565b6001600160e01b031990565b6001600160a01b031615905038611e27565b429116101591503880611e1f565b908160209103126101cd575180151581036101cd5790565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b60008051602061223e833981519152546001600160a01b039081163314611fde57611eeb6000356001600160e01b031916611247565b60018101546001600160a01b031691821615908115611fa2575b8115611f77575b5015611f185750600090565b60206040518092639ea9bd5960e01b82528180611f39363360048401611e7c565b03915afa90811561063857600091611f4f575090565b6106db915060203d8111611f70575b611f68818361026c565b810190611e64565b503d611f5e565b54611f91915065ffffffffffff165b65ffffffffffff1690565b65ffffffffffff4291161138611f0c565b905065ffffffffffff611fc2611f86835465ffffffffffff9060301c1690565b168015159081611fd4575b5090611f05565b9050421138611fcd565b50600190565b7f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460408051338152346020820152a1565b8065ffffffffffff91828160a01c16928315600114612036575b5060d01c92565b92503861202f565b9061206e906020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042090565b9061014081013590601e19813603018212156101cd5701908135916001600160401b0383116101cd576020019180360383136101cd576117c0816120b5926120bb956113fc565b906120e7565b60008051602061223e833981519152546001600160a01b039081169116036120e257600090565b600190565b6001608060006041602094969596604080519880519285526060810151851a88528781015182520151606052145afa51913d15612128576000606052604052565b638baa579f6000526004601cfd5b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042061216f92916120b59192369161067a565b60008051602061223e833981519152546001600160a01b0391821691161461219657600190565b600090565b8082186001600160a01b0316156001146121b6575050600190565b65ffffffffffff60a01b8181169265ffffffffffff60a01b1992831692811691908415612214575b8116801561220d575b848110908518028085189414612205575b5081811190821802181790565b9250386121f8565b50806121e7565b935080936121de56fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd9dea7fea882fba743201b2aeb1babf326b8944488db560784858525d123ee7e970000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789000000000000000000000000d9ab5096a832b9ce79914329daee236f8eea0390"; - function deploy() internal returns(address, address){ + function deploy() internal returns (address, address) { DeterministicDeploy.checkDeploy("Kernel 2.3", EXPECTED_KERNEL_2_3_ADDRESS, KERNEL_2_3_CODE); DeterministicDeploy.checkDeploy("Kernel Lite 2.3", EXPECTED_KERNEL_LITE_2_3_ADDRESS, KERNEL_LITE_2_3_CODE); return (EXPECTED_KERNEL_2_3_ADDRESS, EXPECTED_KERNEL_LITE_2_3_ADDRESS); diff --git a/script/deterministic/SessionKey.s.sol b/script/deterministic/SessionKey.s.sol index 14cc5468..157c855f 100644 --- a/script/deterministic/SessionKey.s.sol +++ b/script/deterministic/SessionKey.s.sol @@ -4,8 +4,10 @@ import "./DeterministicDeploy.s.sol"; library SessionKeyDeploy { address constant EXPECTED_SESSIONKEY_ADDRESS = 0xB8E3c4bEaACAd06f6092793012DA4a8cB23D6123; - bytes constant SESSIONKEY_CODE = hex"0000000000000000000000000000000000000000000000000000000000000000608080604052346100165761156e908161001c8239f35b600080fdfe60806040908082526004908136101561001757600080fd5b600092833560e01c9182630c9595561461034d57508163333daf921461031a5781633a871cdd146102d657816346585db21461027d57816352721fdd146102005781637ecebe00146101b8578382638fc925aa1461010b575081639ea9bd59146100bd575063dbba225d1461008b57600080fd5b346100b95760203660031901126100b957356001600160801b03811681036100b9576100b6906105d7565b80f35b5080fd5b905082346101085781600319360112610108576100d8610533565b50602435906001600160401b03821161010857506100f990369084016104eb565b50505163d623472560e01b8152fd5b80fd5b8091846020600319360112610170578035906001600160401b0382116101b357610137913691016104eb565b9091906014810361017457601411610170576002913560601c835260016020528083203384526020528220828155826001820155015580f35b5050fd5b9192506010820361019457506010116100b9576100b6903560801c6105d7565b6100b692506001600160801b03915033845283602052832054166105d7565b505050fd5b8390346100b95760203660031901126100b9579081906001600160a01b036101de610533565b1681528060205220548151906001600160801b038116825260801c6020820152f35b8390346100b957806003193601126100b9578060a09261021e610533565b61022661051d565b90600180871b03809116835260016020528383209116825260205220908154916002600182015491015491805193845265ffffffffffff80831660208601528260301c169084015260601c60608301526080820152f35b919050346102d257816003193601126102d25791819261029b61051d565b9035825260026020528282209060018060a01b03168252602052205481519065ffffffffffff90818116835260301c166020820152f35b8280fd5b91905060031992606084360112610108578135936001600160401b0385116100b95761016090853603011261010857506020926103139101610934565b9051908152f35b90508234610108578160031936011261010857602435906001600160401b03821161010857506100f990369084016104eb565b8492509060203660031901126102d2576001600160401b039184358381116104e35761037c90369087016104eb565b806014116104e757806034116104e75780603a116104e7578084116104e757806054116104e7576074116104e35760548101359360a08301908111838210176104d0579060029184526014810135835260208301603482013560d01c815284840190603a83013560d01c825261046160608601918785013560601c835260808701948986523560601c8a526001602052878a20338b52602052878a2096518755600187019365ffffffffffff8092511665ffffffffffff198654161785555116839065ffffffffffff60301b82549160301b169065ffffffffffff60301b1916179055565b516bffffffffffffffffffffffff82549181199060601b16911617905551910155826020528220908154916001600160801b038084168181146104bd576100b69596506001011680936001600160801b03191617905514610580565b634e487b7160e01b865260118752602486fd5b634e487b7160e01b865260418752602486fd5b8480fd5b8580fd5b9181601f84011215610518578235916001600160401b038311610518576020838186019501011161051857565b600080fd5b602435906001600160a01b038216820361051857565b600435906001600160a01b038216820361051857565b90601f801991011681019081106001600160401b0382111761056a57604052565b634e487b7160e01b600052604160045260246000fd5b1561058757565b60405162461bcd60e51b815260206004820152602260248201527f53657373696f6e4b657956616c696461746f723a20696e76616c6964206e6f6e604482015261636560f01b6064820152608490fd5b600033815280602052604080822054916105ff6001600160801b0385169360801c8411610580565b3381528060205220916001600160801b03199060801b16179055565b903590601e198136030182121561051857018035906001600160401b0382116105185760200191813603831361051857565b356001600160a01b03811681036105185790565b1561066857565b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b156106c057565b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b1561071e57565b60405162461bcd60e51b815260206004820152603360248201527f53657373696f6e4b657956616c696461746f723a207065726d697373696f6e206044820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b6064820152608490fd5b3563ffffffff811681036105185790565b359065ffffffffffff8216820361051857565b602091828252610120820190803563ffffffff81168091036105185784840152808401356001600160a01b038116949085900361051857604094858501528482013563ffffffff60e01b811680910361051857606090818601528083013560808601526080830135601e1984360301811215610518578301918083359301966001600160401b03841161051857828402360388136105185792919082610100968760a08a01525261014087019793600080925b8584106108a3575050505050505061089c60e065ffffffffffff928361087e60a08301610790565b1660c08701528361089160c08301610790565b168287015201610790565b1691015290565b909192939495998a358152818b013560068110156108da57828201528a840135848201528501998501959493600101929190610856565b8380fd5b9092916001600160401b03841161056a578360051b604051926020809461090782850182610549565b809781520191810192831161051857905b8282106109255750505050565b81358152908301908301610918565b6101408101610943818361061b565b601411610518573560601c90600082815260019360209085825260408084203385528352808420936002850180548286528383205460801c1015610d0b578886019687548060601c8b8114600014610c8757506109a461012087018761061b565b905015610c34575b875415610c10575060608501926109c3848761061b565b6004939193116100b95782356001600160e01b031916635194544760e01b8103610b7057506109f2908761061b565b6055959195116100b9576055850135850190605582019560758101350197610a1a828261061b565b6024116104e357610a53929190610a4e9060106001600160a01b03610a416075890161064d565b1691013560601c14610661565b61061b565b6044939193116101085750610a9685610ae994610a82610acc9795602460b5610a9b97013591013511156106b9565b604481013501602460048201359101611388565b610717565b54610aa58461077f565b855188810192835260e09190911b6001600160e01b03191660208301529283906024830190565b0392610ae0601f1994858101835282610549565b51902083610ed8565b96549465ffffffffffff9687871680898b1610610b66575b50610b2f610b4393610b4897969593610b2393549651938491820195866107a3565b03908101835282610549565b5190209236906075605582013591016108de565b610d64565b15610b5f57610b5c945060301c1691610dbb565b90565b5050505090565b9850610b2f610b01565b94509450949650945050631a7e6adf60e19896981b14600014610c0657610b97818561061b565b6055116102d25790816055610baf930135019461061b565b605592919211610108575090816075610be19493013501916075605584013593019160756055830135920190876110f7565b919091610bff575065ffffffffffff610b5c935460301c1691610dbb565b9250505090565b5050505091505090565b98975050505050505050610b5c925065ffffffffffff808360301c16921690610dbb565b845162461bcd60e51b815260048101889052602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610c93575b506109ac565b610ca161012088018861061b565b6014116104e7573560601c03610cb75738610c8d565b845162461bcd60e51b815260048101889052602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b825162461bcd60e51b815260048101869052602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b919091805180610d75575b50501490565b91906020908180820191600595861b0101925b81518111851b90815282825191185281604060002091019383851015610daf579390610d88565b50925050503880610d6f565b919091600435610144810135016024356020526000907b19457468657265756d205369676e6564204d6573736167653a0a33328252603c6004206040908151608081018181106001600160401b03821117610eb15783526041815260208101933660798201116104e75785604160209486600195836038608097018b3784606182015281519981519386526060820151861a89525182520151606052145afa51923d15610ea457606052526001600160a01b03908116911603610e9d5760d09190911b6001600160d01b03191660a09190911b65ffffffffffff60a01b161790565b5050600190565b638baa579f90526004601cfd5b634e487b7160e01b86526041600452602486fd5b3565ffffffffffff811681036105185790565b9065ffffffffffff60a0830160c0840182610ef282610ec5565b16610ff15750610f0360e091610ec5565b935b019181610f1184610ec5565b16610f1d575b50505090565b60009081526002602052604081203382526020526040812090600183835460301c160190838211610fdd575081546bffffffffffff000000000000191660309190911b65ffffffffffff60301b16178155610f7f9082905460301c1692610ec5565b1610610f8d57388080610f17565b60405162461bcd60e51b815260206004820152602260248201527f53657373696f6e4b657956616c696461746f723a2072756e7320657863656564604482015261195960f21b6064820152608490fd5b634e487b7160e01b81526011600452602490fd5b939082610ffd82610ec5565b161561107957600084815260026020526040812033825260205260408120918483549781891692831515600014611060575061103890610ec5565b160190848211610fdd5750908360e0939216955b65ffffffffffff1916868516179055610f05565b91505060e0949392506110739150610ec5565b9561104c565b60405162461bcd60e51b815260206004820152602b60248201527f53657373696f6e4b657956616c696461746f723a20696e76616c69642065786560448201526a637574696f6e2072756c6560a81b6064820152608490fd5b60001981146110e15760010190565b634e487b7160e01b600052601160045260246000fd5b94959391909160009560018060a01b03166000526001968760205260406000203360005260205260406000209365ffffffffffff89860154169560005b6004808401358401013581101561134857600483013583013681900360821901600583901b909101602401351215610518578181101561132a5760fe19863603018160051b870135121561051857611217610a9661120860248460051b600488013588010101356004870135870101606460248201916111e56111b68461064d565b8d6111d2602060018060a01b03928c60051b810135010161064d565b6001600160a01b03909216911614610661565b61120160608d8960051b810135010135604483013511156106b9565b019061061b565b8460051b8a01358a0191611388565b61127e600288015461125f61126d6112368560051b8b01358b0161077f565b604080516020810195865260e09290921b6001600160e01b031916908201529182906044820190565b03601f198101835282610549565b5190208260051b8801358801610ed8565b65ffffffffffff891665ffffffffffff821611611340575b508381101561132a578060051b850135601e19863603018112156105185785018035906001600160401b03821161051857602001908060051b360382136105185761130a91610b438a54918a6040516112ff8161125f60208201948b60051b81013501856107a3565b5190209336916108de565b1561131d57611318906110d2565b611134565b5095989750505050505050565b634e487b7160e01b600052603260045260246000fd5b975038611296565b505050505050509250565b903590601e198136030182121561051857018035906001600160401b0382116105185760200191606082023603831361051857565b600490828211610518576040908185013563ffffffff60e01b80821680920361051857823516036115645760005b608086016113c48188611353565b9050821015611558576113d79087611353565b821015611543576060820201803580860180871161152e57602480830180921161151b57508710610518578301850135602082013560068110156105185780158061150e575b1561143057505050505050505050600090565b6001811480611501575b1561144d57505050505050505050600090565b60028114806114f4575b1561146a57505050505050505050600090565b60038114806114e8575b1561148757505050505050505050600090565b868114806114dc575b156114a357505050505050505050600090565b600586911492836114cf575b5050506114c4576114bf906110d2565b6113b6565b505050505050600090565b01351490503884816114af565b50858301358211611490565b50858301358210611474565b5085830135821015611457565b508583013582111561143a565b508583013582141561141d565b634e487b7160e01b600090815260118952fd5b601187634e487b7160e01b6000525260246000fd5b603285634e487b7160e01b6000525260246000fd5b50505050505050600190565b505050505060009056"; - function deploy() internal returns(address) { + bytes constant SESSIONKEY_CODE = + hex"0000000000000000000000000000000000000000000000000000000000000000608080604052346100165761156e908161001c8239f35b600080fdfe60806040908082526004908136101561001757600080fd5b600092833560e01c9182630c9595561461034d57508163333daf921461031a5781633a871cdd146102d657816346585db21461027d57816352721fdd146102005781637ecebe00146101b8578382638fc925aa1461010b575081639ea9bd59146100bd575063dbba225d1461008b57600080fd5b346100b95760203660031901126100b957356001600160801b03811681036100b9576100b6906105d7565b80f35b5080fd5b905082346101085781600319360112610108576100d8610533565b50602435906001600160401b03821161010857506100f990369084016104eb565b50505163d623472560e01b8152fd5b80fd5b8091846020600319360112610170578035906001600160401b0382116101b357610137913691016104eb565b9091906014810361017457601411610170576002913560601c835260016020528083203384526020528220828155826001820155015580f35b5050fd5b9192506010820361019457506010116100b9576100b6903560801c6105d7565b6100b692506001600160801b03915033845283602052832054166105d7565b505050fd5b8390346100b95760203660031901126100b9579081906001600160a01b036101de610533565b1681528060205220548151906001600160801b038116825260801c6020820152f35b8390346100b957806003193601126100b9578060a09261021e610533565b61022661051d565b90600180871b03809116835260016020528383209116825260205220908154916002600182015491015491805193845265ffffffffffff80831660208601528260301c169084015260601c60608301526080820152f35b919050346102d257816003193601126102d25791819261029b61051d565b9035825260026020528282209060018060a01b03168252602052205481519065ffffffffffff90818116835260301c166020820152f35b8280fd5b91905060031992606084360112610108578135936001600160401b0385116100b95761016090853603011261010857506020926103139101610934565b9051908152f35b90508234610108578160031936011261010857602435906001600160401b03821161010857506100f990369084016104eb565b8492509060203660031901126102d2576001600160401b039184358381116104e35761037c90369087016104eb565b806014116104e757806034116104e75780603a116104e7578084116104e757806054116104e7576074116104e35760548101359360a08301908111838210176104d0579060029184526014810135835260208301603482013560d01c815284840190603a83013560d01c825261046160608601918785013560601c835260808701948986523560601c8a526001602052878a20338b52602052878a2096518755600187019365ffffffffffff8092511665ffffffffffff198654161785555116839065ffffffffffff60301b82549160301b169065ffffffffffff60301b1916179055565b516bffffffffffffffffffffffff82549181199060601b16911617905551910155826020528220908154916001600160801b038084168181146104bd576100b69596506001011680936001600160801b03191617905514610580565b634e487b7160e01b865260118752602486fd5b634e487b7160e01b865260418752602486fd5b8480fd5b8580fd5b9181601f84011215610518578235916001600160401b038311610518576020838186019501011161051857565b600080fd5b602435906001600160a01b038216820361051857565b600435906001600160a01b038216820361051857565b90601f801991011681019081106001600160401b0382111761056a57604052565b634e487b7160e01b600052604160045260246000fd5b1561058757565b60405162461bcd60e51b815260206004820152602260248201527f53657373696f6e4b657956616c696461746f723a20696e76616c6964206e6f6e604482015261636560f01b6064820152608490fd5b600033815280602052604080822054916105ff6001600160801b0385169360801c8411610580565b3381528060205220916001600160801b03199060801b16179055565b903590601e198136030182121561051857018035906001600160401b0382116105185760200191813603831361051857565b356001600160a01b03811681036105185790565b1561066857565b60405162461bcd60e51b8152602060048201526024808201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6044820152630c2e8c6d60e31b6064820152608490fd5b156106c057565b60405162461bcd60e51b815260206004820152602960248201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460448201526808195e18d95959195960ba1b6064820152608490fd5b1561071e57565b60405162461bcd60e51b815260206004820152603360248201527f53657373696f6e4b657956616c696461746f723a207065726d697373696f6e206044820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b6064820152608490fd5b3563ffffffff811681036105185790565b359065ffffffffffff8216820361051857565b602091828252610120820190803563ffffffff81168091036105185784840152808401356001600160a01b038116949085900361051857604094858501528482013563ffffffff60e01b811680910361051857606090818601528083013560808601526080830135601e1984360301811215610518578301918083359301966001600160401b03841161051857828402360388136105185792919082610100968760a08a01525261014087019793600080925b8584106108a3575050505050505061089c60e065ffffffffffff928361087e60a08301610790565b1660c08701528361089160c08301610790565b168287015201610790565b1691015290565b909192939495998a358152818b013560068110156108da57828201528a840135848201528501998501959493600101929190610856565b8380fd5b9092916001600160401b03841161056a578360051b604051926020809461090782850182610549565b809781520191810192831161051857905b8282106109255750505050565b81358152908301908301610918565b6101408101610943818361061b565b601411610518573560601c90600082815260019360209085825260408084203385528352808420936002850180548286528383205460801c1015610d0b578886019687548060601c8b8114600014610c8757506109a461012087018761061b565b905015610c34575b875415610c10575060608501926109c3848761061b565b6004939193116100b95782356001600160e01b031916635194544760e01b8103610b7057506109f2908761061b565b6055959195116100b9576055850135850190605582019560758101350197610a1a828261061b565b6024116104e357610a53929190610a4e9060106001600160a01b03610a416075890161064d565b1691013560601c14610661565b61061b565b6044939193116101085750610a9685610ae994610a82610acc9795602460b5610a9b97013591013511156106b9565b604481013501602460048201359101611388565b610717565b54610aa58461077f565b855188810192835260e09190911b6001600160e01b03191660208301529283906024830190565b0392610ae0601f1994858101835282610549565b51902083610ed8565b96549465ffffffffffff9687871680898b1610610b66575b50610b2f610b4393610b4897969593610b2393549651938491820195866107a3565b03908101835282610549565b5190209236906075605582013591016108de565b610d64565b15610b5f57610b5c945060301c1691610dbb565b90565b5050505090565b9850610b2f610b01565b94509450949650945050631a7e6adf60e19896981b14600014610c0657610b97818561061b565b6055116102d25790816055610baf930135019461061b565b605592919211610108575090816075610be19493013501916075605584013593019160756055830135920190876110f7565b919091610bff575065ffffffffffff610b5c935460301c1691610dbb565b9250505090565b5050505091505090565b98975050505050505050610b5c925065ffffffffffff808360301c16921690610dbb565b845162461bcd60e51b815260048101889052602660248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206e6044820152651bdd081cd95d60d21b6064820152608490fd5b80610c93575b506109ac565b610ca161012088018861061b565b6014116104e7573560601c03610cb75738610c8d565b845162461bcd60e51b815260048101889052602760248201527f53657373696f6e4b657956616c696461746f723a207061796d6173746572206d6044820152660d2e6dac2e8c6d60cb1b6064820152608490fd5b825162461bcd60e51b815260048101869052602c60248201527f53657373696f6e4b657956616c696461746f723a2073657373696f6e206b657960448201526b081b9bdd08195b98589b195960a21b6064820152608490fd5b919091805180610d75575b50501490565b91906020908180820191600595861b0101925b81518111851b90815282825191185281604060002091019383851015610daf579390610d88565b50925050503880610d6f565b919091600435610144810135016024356020526000907b19457468657265756d205369676e6564204d6573736167653a0a33328252603c6004206040908151608081018181106001600160401b03821117610eb15783526041815260208101933660798201116104e75785604160209486600195836038608097018b3784606182015281519981519386526060820151861a89525182520151606052145afa51923d15610ea457606052526001600160a01b03908116911603610e9d5760d09190911b6001600160d01b03191660a09190911b65ffffffffffff60a01b161790565b5050600190565b638baa579f90526004601cfd5b634e487b7160e01b86526041600452602486fd5b3565ffffffffffff811681036105185790565b9065ffffffffffff60a0830160c0840182610ef282610ec5565b16610ff15750610f0360e091610ec5565b935b019181610f1184610ec5565b16610f1d575b50505090565b60009081526002602052604081203382526020526040812090600183835460301c160190838211610fdd575081546bffffffffffff000000000000191660309190911b65ffffffffffff60301b16178155610f7f9082905460301c1692610ec5565b1610610f8d57388080610f17565b60405162461bcd60e51b815260206004820152602260248201527f53657373696f6e4b657956616c696461746f723a2072756e7320657863656564604482015261195960f21b6064820152608490fd5b634e487b7160e01b81526011600452602490fd5b939082610ffd82610ec5565b161561107957600084815260026020526040812033825260205260408120918483549781891692831515600014611060575061103890610ec5565b160190848211610fdd5750908360e0939216955b65ffffffffffff1916868516179055610f05565b91505060e0949392506110739150610ec5565b9561104c565b60405162461bcd60e51b815260206004820152602b60248201527f53657373696f6e4b657956616c696461746f723a20696e76616c69642065786560448201526a637574696f6e2072756c6560a81b6064820152608490fd5b60001981146110e15760010190565b634e487b7160e01b600052601160045260246000fd5b94959391909160009560018060a01b03166000526001968760205260406000203360005260205260406000209365ffffffffffff89860154169560005b6004808401358401013581101561134857600483013583013681900360821901600583901b909101602401351215610518578181101561132a5760fe19863603018160051b870135121561051857611217610a9661120860248460051b600488013588010101356004870135870101606460248201916111e56111b68461064d565b8d6111d2602060018060a01b03928c60051b810135010161064d565b6001600160a01b03909216911614610661565b61120160608d8960051b810135010135604483013511156106b9565b019061061b565b8460051b8a01358a0191611388565b61127e600288015461125f61126d6112368560051b8b01358b0161077f565b604080516020810195865260e09290921b6001600160e01b031916908201529182906044820190565b03601f198101835282610549565b5190208260051b8801358801610ed8565b65ffffffffffff891665ffffffffffff821611611340575b508381101561132a578060051b850135601e19863603018112156105185785018035906001600160401b03821161051857602001908060051b360382136105185761130a91610b438a54918a6040516112ff8161125f60208201948b60051b81013501856107a3565b5190209336916108de565b1561131d57611318906110d2565b611134565b5095989750505050505050565b634e487b7160e01b600052603260045260246000fd5b975038611296565b505050505050509250565b903590601e198136030182121561051857018035906001600160401b0382116105185760200191606082023603831361051857565b600490828211610518576040908185013563ffffffff60e01b80821680920361051857823516036115645760005b608086016113c48188611353565b9050821015611558576113d79087611353565b821015611543576060820201803580860180871161152e57602480830180921161151b57508710610518578301850135602082013560068110156105185780158061150e575b1561143057505050505050505050600090565b6001811480611501575b1561144d57505050505050505050600090565b60028114806114f4575b1561146a57505050505050505050600090565b60038114806114e8575b1561148757505050505050505050600090565b868114806114dc575b156114a357505050505050505050600090565b600586911492836114cf575b5050506114c4576114bf906110d2565b6113b6565b505050505050600090565b01351490503884816114af565b50858301358211611490565b50858301358210611474565b5085830135821015611457565b508583013582111561143a565b508583013582141561141d565b634e487b7160e01b600090815260118952fd5b601187634e487b7160e01b6000525260246000fd5b603285634e487b7160e01b6000525260246000fd5b50505050505050600190565b505050505060009056"; + + function deploy() internal returns (address) { DeterministicDeploy.checkDeploy("SessionKey", EXPECTED_SESSIONKEY_ADDRESS, SESSIONKEY_CODE); return EXPECTED_SESSIONKEY_ADDRESS; } diff --git a/tasks/test_userOp.ts b/tasks/test_userOp.ts deleted file mode 100644 index 46a1b5cc..00000000 --- a/tasks/test_userOp.ts +++ /dev/null @@ -1,102 +0,0 @@ - -import { task } from "hardhat/config" -import { hexConcat, arrayify, hexZeroPad } from "ethers/lib/utils" - -const STACKUP = "https://api.stackup.sh/v1/node/65bdd496f420d5610b504691af2787cda9a580cd2be7d3fb64a78fc17bc65c42" - -task("test-userop-initcode", "deploy erc20 paymaster") - .setAction(async (taskArgs, hre) => { - const signer = (await hre.ethers.getSigners())[0]; - const addr = await signer.getAddress(); - console.log("signer address: ", addr); - const entrypoint = await hre.ethers.getContractAt("EntryPoint", "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"); - const ecdsaFactory = await hre.ethers.getContractAt("ECDSAKernelFactory", "0x08e627ca6a0593c807091726a7fbb2887a1cb556"); - const account = await ecdsaFactory.getAccountAddress(addr, 3); - const kernel = await hre.ethers.getContractAt("Kernel", account); - console.log("maxFeePerGas : ", await hre.ethers.provider.getGasPrice()); - const userOp = { - sender : account, - nonce : 0, - initCode : hexConcat([ecdsaFactory.address, ecdsaFactory.interface.encodeFunctionData("createAccount", [addr, 3])]), - callData : kernel.interface.encodeFunctionData("execute", [addr,0,"0x",0]), - callGasLimit : 100000, - verificationGasLimit : 300000, - preVerificationGas : 300000, - maxFeePerGas: (await hre.ethers.provider.getGasPrice()).toHexString(), - maxPriorityFeePerGas: 1000000000, - paymasterAndData: "0x", - signature: "0x" - } - if((await hre.ethers.provider.getBalance(account)).lt(hre.ethers.BigNumber.from("100000000000000000"))) { - console.log("insufficient balance"); - await signer.sendTransaction({ - to: account, - value: hre.ethers.BigNumber.from("100000000000000000") - }) - } - - const stackup = new hre.ethers.providers.JsonRpcProvider(STACKUP); - userOp.signature = hexConcat(["0x00000000", hexZeroPad("0xb1", 65)]) - const gas = await stackup.send("eth_estimateUserOperationGas", [userOp, entrypoint.address]); - console.log("gas: ", gas); - userOp.callGasLimit = gas.callGasLimit; - userOp.verificationGasLimit = gas.verificationGas; - userOp.preVerificationGas = gas.preVerificationGas; - const userOpHash = await entrypoint.getUserOpHash(userOp); - const userOpHashHex = arrayify(userOpHash); - const userOpSig = await signer.signMessage(userOpHashHex); - - console.log("userOpSig: ", userOpSig); - userOp.signature = hexConcat(["0x00000000", userOpSig]) - const receipt = await stackup.send("eth_sendUserOperation", [userOp, entrypoint.address]); - }) - -task("test-userop", "test userop") - .setAction(async (taskArgs, hre) => { - const kernel_id = 3; - const signer = (await hre.ethers.getSigners())[0]; - const addr = await signer.getAddress(); - console.log("signer address: ", addr); - const entrypoint = await hre.ethers.getContractAt("EntryPoint", "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"); - const ecdsaFactory = await hre.ethers.getContractAt("ECDSAKernelFactory", "0x08e627ca6a0593c807091726a7fbb2887a1cb556"); - const account = await ecdsaFactory.getAccountAddress(addr, kernel_id); - //await ecdsaFactory.createAccount(addr, kernel_id); - const kernel = await hre.ethers.getContractAt("Kernel", account); - console.log("maxFeePerGas : ", await hre.ethers.provider.getGasPrice()); - const userOp = { - sender : account, - nonce : (await entrypoint.getNonce(account,0)).toHexString(), - initCode : "0x", - callData : kernel.interface.encodeFunctionData("execute", [addr,0,"0x",0]), - callGasLimit : 100000, - verificationGasLimit : 300000, - preVerificationGas : 45100, - maxFeePerGas: (await hre.ethers.provider.getGasPrice()).toHexString(), - maxPriorityFeePerGas: 1000000000, - paymasterAndData: "0x", - signature: "0x" - } - if((await hre.ethers.provider.getBalance(account)).lt(hre.ethers.BigNumber.from("100000000000000000"))) { - console.log("insufficient balance"); - await signer.sendTransaction({ - to: account, - value: hre.ethers.BigNumber.from("100000000000000000") - }) - } - - const stackup = new hre.ethers.providers.JsonRpcProvider(STACKUP); - userOp.signature = hexConcat(["0x00000000", hexZeroPad("0x8f51af942b92e95ec77b4ae8b4197ca94373be26205746c506997587d0fd5efe6f5ea33ea7fcf09c9cd38216837c4739a8283d6f97e9977aa1f102fee5d0516b1b", 65)]) - const gas = await stackup.send("eth_estimateUserOperationGas", [userOp, entrypoint.address]); - console.log("gas: ", gas); - userOp.callGasLimit = gas.callGasLimit; - userOp.verificationGasLimit = gas.verificationGas; - userOp.preVerificationGas = gas.preVerificationGas; - const userOpHash = await entrypoint.getUserOpHash(userOp); - const userOpHashHex = arrayify(userOpHash); - const userOpSig = await signer.signMessage(userOpHashHex); - - console.log("userOpSig: ", userOpSig); - userOp.signature = hexConcat(["0x00000000", userOpSig]) - const receipt = await stackup.send("eth_sendUserOperation", [userOp, entrypoint.address]); - }) - From 8dc89c3c1348a31ffbbf026d7e40cc25d536549d Mon Sep 17 00:00:00 2001 From: leekt Date: Mon, 22 Jan 2024 14:43:13 +0900 Subject: [PATCH 2/3] removed via-ir based plugins, todo: remove all plugins to kernel-plugins --- .gitmodules | 6 - lib/FreshCryptoLib | 1 - lib/p256-verifier | 1 - plugins/src/p256/P256Validator.sol | 83 ----- .../stealthAddressValidator/EllipticCurve.sol | 328 ------------------ .../StealthAddressValidator.sol | 182 ---------- .../StealthAggreagteSignature.sol | 47 --- plugins/test/P256Validator.t.sol | 207 ----------- plugins/test/StealthAddressValidator.t.sol | 311 ----------------- 9 files changed, 1166 deletions(-) delete mode 160000 lib/FreshCryptoLib delete mode 160000 lib/p256-verifier delete mode 100644 plugins/src/p256/P256Validator.sol delete mode 100644 plugins/src/stealthAddressValidator/EllipticCurve.sol delete mode 100644 plugins/src/stealthAddressValidator/StealthAddressValidator.sol delete mode 100644 plugins/src/stealthAddressValidator/StealthAggreagteSignature.sol delete mode 100644 plugins/test/P256Validator.t.sol delete mode 100644 plugins/test/StealthAddressValidator.t.sol diff --git a/.gitmodules b/.gitmodules index d2bb2da1..744ac54b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,9 +7,3 @@ [submodule "lib/I4337"] path = lib/I4337 url = https://github.com/leekt/I4337 -[submodule "lib/p256-verifier"] - path = lib/p256-verifier - url = https://github.com/daimo-eth/p256-verifier -[submodule "lib/FreshCryptoLib"] - path = lib/FreshCryptoLib - url = https://github.com/rdubois-crypto/FreshCryptoLib diff --git a/lib/FreshCryptoLib b/lib/FreshCryptoLib deleted file mode 160000 index e2830cb5..00000000 --- a/lib/FreshCryptoLib +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e2830cb5d7b0f6ae35b5800287c0f5c92388070b diff --git a/lib/p256-verifier b/lib/p256-verifier deleted file mode 160000 index 29475ae3..00000000 --- a/lib/p256-verifier +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 29475ae300ec95d98d5c7cc34c094846f0aa2dcd diff --git a/plugins/src/p256/P256Validator.sol b/plugins/src/p256/P256Validator.sol deleted file mode 100644 index 6fcc88c4..00000000 --- a/plugins/src/p256/P256Validator.sol +++ /dev/null @@ -1,83 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import {UserOperation} from "I4337/interfaces/UserOperation.sol"; -import {ECDSA} from "solady/utils/ECDSA.sol"; -import {IKernelValidator} from "src/interfaces/IKernelValidator.sol"; -import {ValidationData} from "src/common/Types.sol"; -import {SIG_VALIDATION_FAILED} from "src/common/Constants.sol"; -import {P256} from "p256-verifier/P256.sol"; - -/// @title P256Validator -/// @notice This validator uses the P256 curve to validate signatures. -contract P256Validator is IKernelValidator { - /// @notice Emitted when a bad key is provided. - error BadKey(); - - /// @notice Emitted when the public key of a kernel is changed. - event P256PublicKeysChanged(address indexed kernel, PublicKey newKeys); - - /// @notice The P256 public key of a kernel. - struct PublicKey { - uint256 x; - uint256 y; - } - - /// @notice The P256 public keys of a kernel. - mapping(address kernel => PublicKey PublicKey) public p256PublicKey; - - /// @notice Enable this validator for a kernel account. - /// @dev The kernel account need to be the `msg.sender`. - /// @dev The public key is encoded as `abi.encode(PublicKey)` inside the data, so (uint256,uint256). - function enable(bytes calldata _data) external payable override { - PublicKey memory key = abi.decode(_data, (PublicKey)); - if (key.x == 0 || key.y == 0) { - revert BadKey(); - } - // Update the key (so a sstore) - p256PublicKey[msg.sender] = key; - // And emit the event - emit P256PublicKeysChanged(msg.sender, key); - } - - /// @notice Disable this validator for a kernel account. - /// @dev The kernel account need to be the `msg.sender`. - function disable(bytes calldata) external payable override { - delete p256PublicKey[msg.sender]; - } - - /// @notice Validate a user operation. - function validateUserOp(UserOperation calldata _userOp, bytes32 _userOpHash, uint256) - external - payable - override - returns (ValidationData validationData) - { - (uint256 r, uint256 s) = abi.decode(_userOp.signature, (uint256, uint256)); - PublicKey memory key = p256PublicKey[_userOp.sender]; - if (P256.verifySignature(_userOpHash, r, s, key.x, key.y)) { - return ValidationData.wrap(0); - } - return SIG_VALIDATION_FAILED; - } - - /// @notice Validate a signature. - function validateSignature(bytes32 hash, bytes calldata signature) - external - view - override - returns (ValidationData) - { - (uint256 r, uint256 s) = abi.decode(signature, (uint256, uint256)); - PublicKey memory key = p256PublicKey[msg.sender]; - if (P256.verifySignature(hash, r, s, key.x, key.y)) { - return ValidationData.wrap(0); - } - return SIG_VALIDATION_FAILED; - } - - function validCaller(address _caller, bytes calldata) external view override returns (bool) { - revert NotImplemented(); - } -} diff --git a/plugins/src/stealthAddressValidator/EllipticCurve.sol b/plugins/src/stealthAddressValidator/EllipticCurve.sol deleted file mode 100644 index 94a8eedf..00000000 --- a/plugins/src/stealthAddressValidator/EllipticCurve.sol +++ /dev/null @@ -1,328 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -/** - * @title Elliptic Curve Library - * @dev Library providing arithmetic operations over elliptic curves. - * This library does not check whether the inserted points belong to the curve - * `isOnCurve` function should be used by the library user to check the aforementioned statement. - * @author Witnet Foundation - */ -library EllipticCurve { - // Pre-computed constant for 2 ** 255 - uint256 private constant U255_MAX_PLUS_1 = - 57896044618658097711785492504343953926634992332820282019728792003956564819968; - - /// @dev Modular euclidean inverse of a number (mod p). - /// @param _x The number - /// @param _pp The modulus - /// @return q such that x*q = 1 (mod _pp) - function invMod(uint256 _x, uint256 _pp) internal pure returns (uint256) { - require(_x != 0 && _x != _pp && _pp != 0, "Invalid number"); - uint256 q = 0; - uint256 newT = 1; - uint256 r = _pp; - uint256 t; - while (_x != 0) { - t = r / _x; - (q, newT) = (newT, addmod(q, (_pp - mulmod(t, newT, _pp)), _pp)); - (r, _x) = (_x, r - t * _x); - } - - return q; - } - - /// @dev Modular exponentiation, b^e % _pp. - /// Source: https://github.com/androlo/standard-contracts/blob/master/contracts/src/crypto/ECCMath.sol - /// @param _base base - /// @param _exp exponent - /// @param _pp modulus - /// @return r such that r = b**e (mod _pp) - function expMod(uint256 _base, uint256 _exp, uint256 _pp) internal pure returns (uint256) { - require(_pp != 0, "EllipticCurve: modulus is zero"); - - if (_base == 0) return 0; - if (_exp == 0) return 1; - - uint256 r = 1; - uint256 bit = U255_MAX_PLUS_1; - assembly { - for {} gt(bit, 0) {} { - r := mulmod(mulmod(r, r, _pp), exp(_base, iszero(iszero(and(_exp, bit)))), _pp) - r := mulmod(mulmod(r, r, _pp), exp(_base, iszero(iszero(and(_exp, div(bit, 2))))), _pp) - r := mulmod(mulmod(r, r, _pp), exp(_base, iszero(iszero(and(_exp, div(bit, 4))))), _pp) - r := mulmod(mulmod(r, r, _pp), exp(_base, iszero(iszero(and(_exp, div(bit, 8))))), _pp) - bit := div(bit, 16) - } - } - - return r; - } - - /// @dev Converts a point (x, y, z) expressed in Jacobian coordinates to affine coordinates (x', y', 1). - /// @param _x coordinate x - /// @param _y coordinate y - /// @param _z coordinate z - /// @param _pp the modulus - /// @return (x', y') affine coordinates - function toAffine(uint256 _x, uint256 _y, uint256 _z, uint256 _pp) internal pure returns (uint256, uint256) { - uint256 zInv = invMod(_z, _pp); - uint256 zInv2 = mulmod(zInv, zInv, _pp); - uint256 x2 = mulmod(_x, zInv2, _pp); - uint256 y2 = mulmod(_y, mulmod(zInv, zInv2, _pp), _pp); - - return (x2, y2); - } - - /// @dev Derives the y coordinate from a compressed-format point x [[SEC-1]](https://www.secg.org/SEC1-Ver-1.0.pdf). - /// @param _prefix parity byte (0x02 even, 0x03 odd) - /// @param _x coordinate x - /// @param _aa constant of curve - /// @param _bb constant of curve - /// @param _pp the modulus - /// @return y coordinate y - function deriveY(uint8 _prefix, uint256 _x, uint256 _aa, uint256 _bb, uint256 _pp) - internal - pure - returns (uint256) - { - require(_prefix == 0x02 || _prefix == 0x03, "EllipticCurve:innvalid compressed EC point prefix"); - - // x^3 + ax + b - uint256 y2 = addmod(mulmod(_x, mulmod(_x, _x, _pp), _pp), addmod(mulmod(_x, _aa, _pp), _bb, _pp), _pp); - y2 = expMod(y2, (_pp + 1) / 4, _pp); - // uint256 cmp = yBit ^ y_ & 1; - uint256 y = (y2 + _prefix) % 2 == 0 ? y2 : _pp - y2; - - return y; - } - - /// @dev Check whether point (x,y) is on curve defined by a, b, and _pp. - /// @param _x coordinate x of P1 - /// @param _y coordinate y of P1 - /// @param _aa constant of curve - /// @param _bb constant of curve - /// @param _pp the modulus - /// @return true if x,y in the curve, false else - function isOnCurve(uint256 _x, uint256 _y, uint256 _aa, uint256 _bb, uint256 _pp) internal pure returns (bool) { - if (0 == _x || _x >= _pp || 0 == _y || _y >= _pp) { - return false; - } - // y^2 - uint256 lhs = mulmod(_y, _y, _pp); - // x^3 - uint256 rhs = mulmod(mulmod(_x, _x, _pp), _x, _pp); - if (_aa != 0) { - // x^3 + a*x - rhs = addmod(rhs, mulmod(_x, _aa, _pp), _pp); - } - if (_bb != 0) { - // x^3 + a*x + b - rhs = addmod(rhs, _bb, _pp); - } - - return lhs == rhs; - } - - /// @dev Calculate inverse (x, -y) of point (x, y). - /// @param _x coordinate x of P1 - /// @param _y coordinate y of P1 - /// @param _pp the modulus - /// @return (x, -y) - function ecInv(uint256 _x, uint256 _y, uint256 _pp) internal pure returns (uint256, uint256) { - return (_x, (_pp - _y) % _pp); - } - - /// @dev Add two points (x1, y1) and (x2, y2) in affine coordinates. - /// @param _x1 coordinate x of P1 - /// @param _y1 coordinate y of P1 - /// @param _x2 coordinate x of P2 - /// @param _y2 coordinate y of P2 - /// @param _aa constant of the curve - /// @param _pp the modulus - /// @return (qx, qy) = P1+P2 in affine coordinates - function ecAdd(uint256 _x1, uint256 _y1, uint256 _x2, uint256 _y2, uint256 _aa, uint256 _pp) - internal - pure - returns (uint256, uint256) - { - uint256 x = 0; - uint256 y = 0; - uint256 z = 0; - - // Double if x1==x2 else add - if (_x1 == _x2) { - // y1 = -y2 mod p - if (addmod(_y1, _y2, _pp) == 0) { - return (0, 0); - } else { - // P1 = P2 - (x, y, z) = jacDouble(_x1, _y1, 1, _aa, _pp); - } - } else { - (x, y, z) = jacAdd(_x1, _y1, 1, _x2, _y2, 1, _pp); - } - // Get back to affine - return toAffine(x, y, z, _pp); - } - - /// @dev Substract two points (x1, y1) and (x2, y2) in affine coordinates. - /// @param _x1 coordinate x of P1 - /// @param _y1 coordinate y of P1 - /// @param _x2 coordinate x of P2 - /// @param _y2 coordinate y of P2 - /// @param _aa constant of the curve - /// @param _pp the modulus - /// @return (qx, qy) = P1-P2 in affine coordinates - function ecSub(uint256 _x1, uint256 _y1, uint256 _x2, uint256 _y2, uint256 _aa, uint256 _pp) - internal - pure - returns (uint256, uint256) - { - // invert square - (uint256 x, uint256 y) = ecInv(_x2, _y2, _pp); - // P1-square - return ecAdd(_x1, _y1, x, y, _aa, _pp); - } - - /// @dev Multiply point (x1, y1, z1) times d in affine coordinates. - /// @param _k scalar to multiply - /// @param _x coordinate x of P1 - /// @param _y coordinate y of P1 - /// @param _aa constant of the curve - /// @param _pp the modulus - /// @return (qx, qy) = d*P in affine coordinates - function ecMul(uint256 _k, uint256 _x, uint256 _y, uint256 _aa, uint256 _pp) - internal - pure - returns (uint256, uint256) - { - // Jacobian multiplication - (uint256 x1, uint256 y1, uint256 z1) = jacMul(_k, _x, _y, 1, _aa, _pp); - // Get back to affine - return toAffine(x1, y1, z1, _pp); - } - - /// @dev Adds two points (x1, y1, z1) and (x2 y2, z2). - /// @param _x1 coordinate x of P1 - /// @param _y1 coordinate y of P1 - /// @param _z1 coordinate z of P1 - /// @param _x2 coordinate x of square - /// @param _y2 coordinate y of square - /// @param _z2 coordinate z of square - /// @param _pp the modulus - /// @return (qx, qy, qz) P1+square in Jacobian - function jacAdd(uint256 _x1, uint256 _y1, uint256 _z1, uint256 _x2, uint256 _y2, uint256 _z2, uint256 _pp) - internal - pure - returns (uint256, uint256, uint256) - { - if (_x1 == 0 && _y1 == 0) return (_x2, _y2, _z2); - if (_x2 == 0 && _y2 == 0) return (_x1, _y1, _z1); - - // We follow the equations described in https://pdfs.semanticscholar.org/5c64/29952e08025a9649c2b0ba32518e9a7fb5c2.pdf Section 5 - uint256[4] memory zs; // z1^2, z1^3, z2^2, z2^3 - zs[0] = mulmod(_z1, _z1, _pp); - zs[1] = mulmod(_z1, zs[0], _pp); - zs[2] = mulmod(_z2, _z2, _pp); - zs[3] = mulmod(_z2, zs[2], _pp); - - // u1, s1, u2, s2 - zs = [mulmod(_x1, zs[2], _pp), mulmod(_y1, zs[3], _pp), mulmod(_x2, zs[0], _pp), mulmod(_y2, zs[1], _pp)]; - - // In case of zs[0] == zs[2] && zs[1] == zs[3], double function should be used - require(zs[0] != zs[2] || zs[1] != zs[3], "Use jacDouble function instead"); - - uint256[4] memory hr; - //h - hr[0] = addmod(zs[2], _pp - zs[0], _pp); - //r - hr[1] = addmod(zs[3], _pp - zs[1], _pp); - //h^2 - hr[2] = mulmod(hr[0], hr[0], _pp); - // h^3 - hr[3] = mulmod(hr[2], hr[0], _pp); - // qx = -h^3 -2u1h^2+r^2 - uint256 qx = addmod(mulmod(hr[1], hr[1], _pp), _pp - hr[3], _pp); - qx = addmod(qx, _pp - mulmod(2, mulmod(zs[0], hr[2], _pp), _pp), _pp); - // qy = -s1*z1*h^3+r(u1*h^2 -x^3) - uint256 qy = mulmod(hr[1], addmod(mulmod(zs[0], hr[2], _pp), _pp - qx, _pp), _pp); - qy = addmod(qy, _pp - mulmod(zs[1], hr[3], _pp), _pp); - // qz = h*z1*z2 - uint256 qz = mulmod(hr[0], mulmod(_z1, _z2, _pp), _pp); - return (qx, qy, qz); - } - - /// @dev Doubles a points (x, y, z). - /// @param _x coordinate x of P1 - /// @param _y coordinate y of P1 - /// @param _z coordinate z of P1 - /// @param _aa the a scalar in the curve equation - /// @param _pp the modulus - /// @return (qx, qy, qz) 2P in Jacobian - function jacDouble(uint256 _x, uint256 _y, uint256 _z, uint256 _aa, uint256 _pp) - internal - pure - returns (uint256, uint256, uint256) - { - if (_z == 0) return (_x, _y, _z); - - // We follow the equations described in https://pdfs.semanticscholar.org/5c64/29952e08025a9649c2b0ba32518e9a7fb5c2.pdf Section 5 - // Note: there is a bug in the paper regarding the m parameter, M=3*(x1^2)+a*(z1^4) - // x, y, z at this point represent the squares of _x, _y, _z - uint256 x = mulmod(_x, _x, _pp); //x1^2 - uint256 y = mulmod(_y, _y, _pp); //y1^2 - uint256 z = mulmod(_z, _z, _pp); //z1^2 - - // s - uint256 s = mulmod(4, mulmod(_x, y, _pp), _pp); - // m - uint256 m = addmod(mulmod(3, x, _pp), mulmod(_aa, mulmod(z, z, _pp), _pp), _pp); - - // x, y, z at this point will be reassigned and rather represent qx, qy, qz from the paper - // This allows to reduce the gas cost and stack footprint of the algorithm - // qx - x = addmod(mulmod(m, m, _pp), _pp - addmod(s, s, _pp), _pp); - // qy = -8*y1^4 + M(S-T) - y = addmod(mulmod(m, addmod(s, _pp - x, _pp), _pp), _pp - mulmod(8, mulmod(y, y, _pp), _pp), _pp); - // qz = 2*y1*z1 - z = mulmod(2, mulmod(_y, _z, _pp), _pp); - - return (x, y, z); - } - - /// @dev Multiply point (x, y, z) times d. - /// @param _d scalar to multiply - /// @param _x coordinate x of P1 - /// @param _y coordinate y of P1 - /// @param _z coordinate z of P1 - /// @param _aa constant of curve - /// @param _pp the modulus - /// @return (qx, qy, qz) d*P1 in Jacobian - function jacMul(uint256 _d, uint256 _x, uint256 _y, uint256 _z, uint256 _aa, uint256 _pp) - internal - pure - returns (uint256, uint256, uint256) - { - // Early return in case that `_d == 0` - if (_d == 0) { - return (_x, _y, _z); - } - - uint256 remaining = _d; - uint256 qx = 0; - uint256 qy = 0; - uint256 qz = 1; - - // Double and add algorithm - while (remaining != 0) { - if ((remaining & 1) != 0) { - (qx, qy, qz) = jacAdd(qx, qy, qz, _x, _y, _z, _pp); - } - remaining = remaining / 2; - (_x, _y, _z) = jacDouble(_x, _y, _z, _aa, _pp); - } - return (qx, qy, qz); - } -} diff --git a/plugins/src/stealthAddressValidator/StealthAddressValidator.sol b/plugins/src/stealthAddressValidator/StealthAddressValidator.sol deleted file mode 100644 index 369a97b0..00000000 --- a/plugins/src/stealthAddressValidator/StealthAddressValidator.sol +++ /dev/null @@ -1,182 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {UserOperation} from "I4337/interfaces/UserOperation.sol"; -import {ECDSA} from "solady/utils/ECDSA.sol"; -import {EIP712} from "solady/utils/EIP712.sol"; -import {StealthAggreagteSignature} from "./StealthAggreagteSignature.sol"; -import {IKernelValidator} from "src/interfaces/IKernelValidator.sol"; -import {ValidationData} from "src/common/Types.sol"; -import {SIG_VALIDATION_FAILED} from "src/common/Constants.sol"; - -/** - * @dev Storage structure for Stealth Address Registry Module. - * StealthPubkey, dhkey are used in aggregated signature. - * EphemeralPubkey is used to recover private key of stealth address. - */ -struct StealthAddressValidatorStorage { - uint256 stealthPubkey; - uint256 dhkey; - uint256 ephemeralPubkey; - address stealthAddress; - uint8 stealthPubkeyPrefix; - uint8 dhkeyPrefix; - uint8 ephemeralPrefix; -} - -/** - * @author Justin Zen - - * @title Stealth Address Validator for ZeroDev Kernel. - * @notice This validator uses the Stealth address to validate signatures. - */ -contract StealthAddressValidator is IKernelValidator, EIP712 { - /// @notice The type hash used for kernel user op validation - bytes32 constant USER_OP_TYPEHASH = - keccak256("AllowUserOp(address owner,address kernelWallet,bytes32 userOpHash)"); - /// @notice The type hash used for kernel signature validation - bytes32 constant SIGNATURE_TYPEHASH = - keccak256("KernelSignature(address owner,address kernelWallet,bytes32 hash)"); - - /// @notice Emitted when the stealth address of a kernel is changed. - event StealthAddressChanged( - address indexed kernel, address indexed oldStealthAddress, address indexed newStealthAddress - ); - - /* -------------------------------------------------------------------------- */ - /* Storage */ - /* -------------------------------------------------------------------------- */ - mapping(address => StealthAddressValidatorStorage) public stealthAddressValidatorStorage; - - /* -------------------------------------------------------------------------- */ - /* EIP-712 Methods */ - /* -------------------------------------------------------------------------- */ - - /// @dev Get the current name & version of the validator, used for the EIP-712 domain separator from Solady - function _domainNameAndVersion() internal pure override returns (string memory, string memory) { - return ("Kernel:StealthAddressValidator", "1.0.0"); - } - - /// @dev Tell to solady that the current name & version of the validator won't change, so no need to recompute the eip-712 domain separator - function _domainNameAndVersionMayChange() internal pure override returns (bool) { - return false; - } - - /// @dev Export the current domain seperator - function getDomainSeperator() public view returns (bytes32) { - return _domainSeparator(); - } - - /* -------------------------------------------------------------------------- */ - /* Kernel validator Methods */ - /* -------------------------------------------------------------------------- */ - - /// @dev Enable this validator for a given `kernel` (msg.sender) - function enable(bytes calldata _data) external payable override { - address stealthAddress = address(bytes20(_data[0:20])); - uint256 stealthAddressPubkey = uint256(bytes32(_data[20:52])); - uint256 stealthAddressDhkey = uint256(bytes32(_data[52:84])); - uint8 stealthAddressPubkeyPrefix = uint8(_data[84]); - uint8 stealthAddressDhkeyPrefix = uint8(_data[85]); - uint256 ephemeralPubkey = uint256(bytes32(_data[86:118])); - uint8 ephemeralPrefix = uint8(_data[118]); - - address oldStealthAddress = stealthAddressValidatorStorage[msg.sender].stealthAddress; - stealthAddressValidatorStorage[msg.sender] = StealthAddressValidatorStorage({ - stealthPubkey: stealthAddressPubkey, - dhkey: stealthAddressDhkey, - ephemeralPubkey: ephemeralPubkey, - stealthAddress: stealthAddress, - stealthPubkeyPrefix: stealthAddressPubkeyPrefix, - dhkeyPrefix: stealthAddressDhkeyPrefix, - ephemeralPrefix: ephemeralPrefix - }); - emit StealthAddressChanged(msg.sender, oldStealthAddress, stealthAddress); - } - - /// @dev Disable this validator for a given `kernel` (msg.sender) - function disable(bytes calldata) external payable override { - address stealthAddress; - delete stealthAddressValidatorStorage[msg.sender]; - emit StealthAddressChanged(msg.sender, stealthAddress, address(0)); - } - - /// @dev Validate a `_userOp` using a EIP-712 signature, signed by the owner of the kernel account who is the `_userOp` sender - function validateUserOp(UserOperation calldata _userOp, bytes32 _userOpHash, uint256) - external - payable - override - returns (ValidationData validationData) - { - bytes1 mode = _userOp.signature[0]; - StealthAddressValidatorStorage storage stealthData = stealthAddressValidatorStorage[_userOp.sender]; - address stealthAddress = stealthData.stealthAddress; - bytes32 typedDataHash = - _hashTypedData(keccak256(abi.encode(USER_OP_TYPEHASH, stealthAddress, _userOp.sender, _userOpHash))); - - // 0x00: signature from spending key - // 0x01: aggregated signature from owner and shared secret - if (mode == 0x00) { - return stealthAddress == ECDSA.recover(typedDataHash, _userOp.signature[1:]) - ? ValidationData.wrap(0) - : SIG_VALIDATION_FAILED; - } else if (mode == 0x01) { - return StealthAggreagteSignature.validateAggregatedSignature( - stealthData.stealthPubkey, - stealthData.dhkey, - stealthData.stealthPubkeyPrefix, - stealthData.dhkeyPrefix, - typedDataHash, - _userOp.signature[1:] - ) ? ValidationData.wrap(0) : SIG_VALIDATION_FAILED; - } else { - return SIG_VALIDATION_FAILED; - } - } - - /// @dev Validate a `_signature` of the `_hash` ofor the given `kernel` (msg.sender) - function validateSignature(bytes32 _hash, bytes calldata _signature) - external - view - override - returns (ValidationData validationData) - { - bytes1 mode = _signature[0]; - StealthAddressValidatorStorage storage stealthData = stealthAddressValidatorStorage[msg.sender]; - address stealthAddress = stealthData.stealthAddress; - bytes32 typedDataHash = - _hashTypedData(keccak256(abi.encode(SIGNATURE_TYPEHASH, stealthAddress, msg.sender, _hash))); - - // 0x00: signature from spending key - // 0x01: aggregated signature from owner and shared secret - if (mode == 0x00) { - return stealthAddress == ECDSA.recover(typedDataHash, _signature[1:]) - ? ValidationData.wrap(0) - : SIG_VALIDATION_FAILED; - } else if (mode == 0x01) { - return StealthAggreagteSignature.validateAggregatedSignature( - stealthData.stealthPubkey, - stealthData.dhkey, - stealthData.stealthPubkeyPrefix, - stealthData.dhkeyPrefix, - typedDataHash, - _signature[1:] - ) ? ValidationData.wrap(0) : SIG_VALIDATION_FAILED; - } else { - return SIG_VALIDATION_FAILED; - } - } - - /// @dev Check if the caller is a valid signer for this kernel account - function validCaller(address _caller, bytes calldata) external view override returns (bool) { - return stealthAddressValidatorStorage[msg.sender].stealthAddress == _caller; - } - - /* -------------------------------------------------------------------------- */ - /* Public view methods */ - /* -------------------------------------------------------------------------- */ - - /// @dev Get the owner of a given `kernel` - function getOwner(address _kernel) public view returns (address) { - return stealthAddressValidatorStorage[_kernel].stealthAddress; - } -} diff --git a/plugins/src/stealthAddressValidator/StealthAggreagteSignature.sol b/plugins/src/stealthAddressValidator/StealthAggreagteSignature.sol deleted file mode 100644 index d184a5f7..00000000 --- a/plugins/src/stealthAddressValidator/StealthAggreagteSignature.sol +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {EllipticCurve} from "./EllipticCurve.sol"; - -library StealthAggreagteSignature { - uint256 public constant GX = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798; - uint256 public constant GY = 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8; - uint256 public constant AA = 0; - uint256 public constant BB = 7; - uint256 public constant PP = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F; - uint256 public constant N = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141; - - function validateAggregatedSignature( - uint256 _pubkey, - uint256 _dhkey, - uint8 _pubkeyPrefix, - uint8 _dhkeyPrefix, - bytes32 _message, - bytes calldata _signature - ) external pure returns (bool) { - uint256 aggh2; - uint256 aggpb; - uint256 aggdh; - - uint256 sigr = uint256(bytes32(_signature[0:32])); - uint256 sigs = uint256(bytes32(_signature[32:64])); - uint256 sinv = EllipticCurve.invMod(sigs, N); - uint256 num_message = uint256(_message); - - assembly { - aggh2 := mulmod(mulmod(sinv, num_message, N), num_message, N) - aggpb := mulmod(mulmod(sinv, sigr, N), num_message, N) - aggdh := mulmod(mulmod(sinv, sigr, N), sigr, N) - } - (uint256 p1x, uint256 p1y) = EllipticCurve.ecMul(aggh2, GX, GY, AA, PP); - uint256 pubY = EllipticCurve.deriveY(_pubkeyPrefix, _pubkey, AA, BB, PP); - uint256 pubdhY = EllipticCurve.deriveY(_dhkeyPrefix, _dhkey, AA, BB, PP); - - (uint256 p2x, uint256 p2y) = EllipticCurve.ecMul(aggpb, _pubkey, pubY, AA, PP); - (uint256 p3x, uint256 p3y) = EllipticCurve.ecMul(aggdh, _dhkey, pubdhY, AA, PP); - (uint256 aggp1x, uint256 aggp1y) = EllipticCurve.ecAdd(p1x, p1y, p2x, p2y, AA, PP); - (uint256 aggpx,) = EllipticCurve.ecAdd(aggp1x, aggp1y, p3x, p3y, AA, PP); - - return aggpx % N == sigr; - } -} diff --git a/plugins/test/P256Validator.t.sol b/plugins/test/P256Validator.t.sol deleted file mode 100644 index 9d22e42b..00000000 --- a/plugins/test/P256Validator.t.sol +++ /dev/null @@ -1,207 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IEntryPoint} from "I4337/interfaces/IEntryPoint.sol"; -import "src/Kernel.sol"; -// test artifacts -// test utils -import "forge-std/Test.sol"; -import {ERC4337Utils} from "test/foundry/utils/ERC4337Utils.sol"; -import {KernelTestBase} from "test/foundry/KernelTestBase.sol"; -import {TestExecutor} from "test/foundry/mock/TestExecutor.sol"; -import {TestValidator} from "test/foundry/mock/TestValidator.sol"; -import {P256Validator} from "src/validator/P256Validator.sol"; -import {P256Verifier} from "p256-verifier/P256Verifier.sol"; -import {P256} from "p256-verifier/P256.sol"; -import {FCL_ecdsa_utils} from "FreshCryptoLib/FCL_ecdsa_utils.sol"; -import {IKernel} from "src/interfaces/IKernel.sol"; - -using ERC4337Utils for IEntryPoint; - -contract P256ValidatorTest is KernelTestBase { - P256Verifier p256Verifier; - P256Validator p256Validator; - - // Curve order (number of points) - uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551; - - uint256 x; - uint256 y; - - function setUp() public { - p256Validator = new P256Validator(); - p256Verifier = new P256Verifier(); - - vm.etch(0xc2b78104907F722DABAc4C69f826a522B2754De4, address(p256Verifier).code); - - _initialize(); - (x, y) = generatePublicKey(ownerKey); - _setAddress(); - _setExecutionDetail(); - } - - function _setExecutionDetail() internal virtual override { - executionDetail.executor = address(new TestExecutor()); - executionSig = TestExecutor.doNothing.selector; - executionDetail.validator = new TestValidator(); - } - - function getValidatorSignature(UserOperation memory _op) internal view virtual override returns (bytes memory) { - bytes32 hash = entryPoint.getUserOpHash(_op); - (uint256 r, uint256 s) = generateSignature(ownerKey, ECDSA.toEthSignedMessageHash(hash)); - return abi.encodePacked(bytes4(0x00000000), abi.encode(r, s)); - } - - function getOwners() internal virtual override returns (address[] memory _owners) { - _owners = new address[](1); - _owners[0] = address(0); - return _owners; - } - - function getEnableData() internal view virtual override returns (bytes memory) { - return ""; - } - - function getInitializeData() internal view override returns (bytes memory) { - return abi.encodeWithSelector(KernelStorage.initialize.selector, p256Validator, abi.encode(x, y)); - } - - function test_default_validator_enable() external override { - UserOperation memory op = buildUserOperation( - abi.encodeWithSelector( - IKernel.execute.selector, - address(p256Validator), - 0, - abi.encodeWithSelector(P256Validator.enable.selector, abi.encode(x, y)), - Operation.Call - ) - ); - performUserOperationWithSig(op); - (uint256 x2, uint256 y2) = P256Validator(address(p256Validator)).p256PublicKey(address(kernel)); - verifyPublicKey(x2, y2, x, y); - } - - function test_default_validator_disable() external override { - UserOperation memory op = buildUserOperation( - abi.encodeWithSelector( - IKernel.execute.selector, - address(p256Validator), - 0, - abi.encodeWithSelector(P256Validator.disable.selector, ""), - Operation.Call - ) - ); - performUserOperationWithSig(op); - (uint256 x2, uint256 y2) = P256Validator(address(p256Validator)).p256PublicKey(address(kernel)); - verifyPublicKey(x2, y2, 0, 0); - } - - function test_external_call_batch_execute_success() external override { - vm.skip(true); - } - - function test_external_call_execute_success() external override { - vm.skip(true); - } - - function test_external_call_execute_delegatecall_success() external override { - vm.skip(true); - } - - function test_external_call_execute_delegatecall_fail() external override { - vm.skip(true); - } - - function test_external_call_default() external override { - vm.skip(true); - } - - function test_external_call_execution() external override { - vm.skip(true); - } - - function generatePublicKey(uint256 privateKey) internal view returns (uint256, uint256) { - return FCL_ecdsa_utils.ecdsa_derivKpub(privateKey); - } - - function generateSignature(uint256 privateKey, bytes32 hash) internal view returns (uint256 r, uint256 s) { - // Securely generate a random k value for each signature - uint256 k = uint256(keccak256(abi.encodePacked(hash, block.timestamp, block.difficulty, privateKey))) % n; - while (k == 0) { - k = uint256(keccak256(abi.encodePacked(k))) % n; - } - - // Generate the signature using the k value and the private key - (r, s) = FCL_ecdsa_utils.ecdsa_sign(hash, k, privateKey); - - // Ensure that s is in the lower half of the range [1, n-1] - if (r == 0 || s == 0 || s > P256.P256_N_DIV_2) { - s = n - s; // If s is in the upper half, use n - s instead - } - - return (r, s); - } - - function test_utils(uint256 privateKey, bytes32 hash) external { - vm.assume(hash != 0); - vm.assume(privateKey != 0); - (uint256 x1, uint256 y1) = generatePublicKey(privateKey); - (uint256 r, uint256 s) = generateSignature(privateKey, hash); - - vm.assume(x1 != 0); - vm.assume(y1 != 0); - vm.assume(r != 0); - vm.assume(s < P256.P256_N_DIV_2); - assertEq(P256.verifySignature(hash, r, s, x1, y1), true); - } - - function test_validate_signature() external override { - Kernel kernel2 = Kernel(payable(factory.createAccount(address(kernelImpl), getInitializeData(), 3))); - bytes32 hash = keccak256(abi.encodePacked("hello world")); - - bytes32 digest = keccak256( - abi.encodePacked( - "\x19\x01", ERC4337Utils._buildDomainSeparator(KERNEL_NAME, KERNEL_VERSION, address(kernel)), hash - ) - ); - - (uint256 r, uint256 s) = generateSignature(ownerKey, digest); - - assertEq(kernel.isValidSignature(hash, abi.encode(r, s)), Kernel.isValidSignature.selector); - assertEq(kernel2.isValidSignature(hash, abi.encode(r, s)), bytes4(0xffffffff)); - } - - function test_fail_validate_wrongsignature() external override { - bytes32 hash = keccak256(abi.encodePacked("hello world")); - bytes memory sig = getWrongSignature(hash); - assertEq(kernel.isValidSignature(hash, sig), bytes4(0xffffffff)); - } - - function signUserOp(UserOperation memory op) internal view override returns (bytes memory) { - bytes32 hash = entryPoint.getUserOpHash(op); - (uint256 r, uint256 s) = generateSignature(ownerKey, hash); - return abi.encodePacked(bytes4(0x00000000), abi.encode(r, s)); - } - - function getWrongSignature(UserOperation memory op) internal view override returns (bytes memory) { - bytes32 hash = entryPoint.getUserOpHash(op); - (uint256 r, uint256 s) = generateSignature(ownerKey + 1, hash); - return abi.encodePacked(bytes4(0x00000000), abi.encode(r, s)); - } - - function signHash(bytes32 hash) internal view override returns (bytes memory) { - (uint256 r, uint256 s) = generateSignature(ownerKey, hash); - - return abi.encode(r, s); - } - - function getWrongSignature(bytes32 hash) internal view override returns (bytes memory) { - (uint256 r, uint256 s) = generateSignature(ownerKey + 1, ECDSA.toEthSignedMessageHash(hash)); - return abi.encode(r, s); - } - - function verifyPublicKey(uint256 actualX, uint256 actualY, uint256 expectedX, uint256 expectedY) internal { - assertEq(actualX, expectedX, "Public key X component mismatch"); - assertEq(actualY, expectedY, "Public key Y component mismatch"); - } -} diff --git a/plugins/test/StealthAddressValidator.t.sol b/plugins/test/StealthAddressValidator.t.sol deleted file mode 100644 index c989f348..00000000 --- a/plugins/test/StealthAddressValidator.t.sol +++ /dev/null @@ -1,311 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {FixedPointMathLib} from "solady/utils/FixedPointMathLib.sol"; -import "src/Kernel.sol"; -import {EllipticCurve} from "src/validator/stealthAddressValidator/EllipticCurve.sol"; -import {IKernel} from "src/interfaces/IKernel.sol"; -import {StealthAddressValidator} from "src/validator/stealthAddressValidator/StealthAddressValidator.sol"; -// test utils -import {KernelTestBase} from "test/foundry/KernelTestBase.sol"; -import {TestExecutor} from "test/foundry/mock/TestExecutor.sol"; -import {TestValidator} from "test/foundry/mock/TestValidator.sol"; -import "forge-std/Vm.sol"; - -struct StealthAddressKey { - address stealthAddress; - uint256 stealthPub; - uint256 dhPub; - uint8 stealthPrefix; - uint8 dhPrefix; - uint256 ephemeralPub; - uint8 ephemeralPrefix; - uint256 hashSecret; - uint256 stealthPrivate; -} - -contract StealthAddressValidatorTest is KernelTestBase { - StealthAddressValidator private stealthAddressValidator; - VmSafe.Wallet private wallet; - VmSafe.Wallet private ephemeralWallet; - uint256 private stealthPrivateKey; - - function setUp() public { - _initialize(); - wallet = vm.createWallet(uint256(keccak256(bytes("owner")))); - ephemeralWallet = vm.createWallet(uint256(keccak256(bytes("ephemeral")))); - - StealthAddressKey memory stealthAddressKey = getStealthAddress(wallet, ephemeralWallet); - owner = stealthAddressKey.stealthAddress; - ownerKey = stealthAddressKey.stealthPrivate; - stealthAddressValidator = new StealthAddressValidator(); - defaultValidator = stealthAddressValidator; - _setAddress(); - _setExecutionDetail(); - } - - function _setExecutionDetail() internal virtual override { - executionDetail.executor = address(new TestExecutor()); - executionSig = TestExecutor.doNothing.selector; - executionDetail.validator = new TestValidator(); - } - - function getEnableData() internal view virtual override returns (bytes memory) { - return ""; - } - - function getValidatorSignature(UserOperation memory) internal view virtual override returns (bytes memory) { - return ""; - } - - function getOwners() internal view override returns (address[] memory) { - address[] memory owners = new address[](1); - owners[0] = owner; - return owners; - } - - function getInitializeData() internal view override returns (bytes memory) { - StealthAddressKey memory stealthAddressKey = getStealthAddress(wallet, ephemeralWallet); - return abi.encodeWithSelector( - KernelStorage.initialize.selector, - defaultValidator, - abi.encodePacked( - stealthAddressKey.stealthAddress, - stealthAddressKey.stealthPub, - stealthAddressKey.dhPub, - stealthAddressKey.stealthPrefix, - stealthAddressKey.dhPrefix, - stealthAddressKey.ephemeralPub, - stealthAddressKey.ephemeralPrefix - ) - ); - } - - function signUserOp(UserOperation memory op) internal view override returns (bytes memory) { - StealthAddressKey memory stealthAddressKey = getStealthAddress(wallet, ephemeralWallet); - return abi.encodePacked( - bytes4(0x00000000), bytes1(0x00), _generateUserOpSignature(entryPoint, op, stealthAddressKey.stealthPrivate) - ); - } - - function getWrongSignature(UserOperation memory op) internal view override returns (bytes memory) { - StealthAddressKey memory stealthAddressKey = getStealthAddress(wallet, ephemeralWallet); - return abi.encodePacked( - bytes4(0x00000000), - bytes1(0x00), - _generateUserOpSignature(entryPoint, op, stealthAddressKey.stealthPrivate + 1) - ); - } - - function signHash(bytes32 _hash) internal view override returns (bytes memory) { - StealthAddressKey memory stealthAddressKey = getStealthAddress(wallet, ephemeralWallet); - return _generateHashSignature(_hash, address(kernel), stealthAddressKey.stealthPrivate); - } - - function getWrongSignature(bytes32 _hash) internal view override returns (bytes memory) { - StealthAddressKey memory stealthAddressKey = getStealthAddress(wallet, ephemeralWallet); - return _generateHashSignature(_hash, address(kernel), stealthAddressKey.stealthPrivate + 1); - } - - function test_default_validator_enable() external override { - StealthAddressKey memory stealthAddressKey = getStealthAddress(wallet, ephemeralWallet); - - UserOperation memory op = buildUserOperation( - abi.encodeWithSelector( - IKernel.execute.selector, - address(defaultValidator), - 0, - abi.encodeWithSelector( - StealthAddressValidator.enable.selector, - abi.encodePacked( - stealthAddressKey.stealthAddress, - stealthAddressKey.stealthPub, - stealthAddressKey.dhPub, - stealthAddressKey.stealthPrefix, - stealthAddressKey.dhPrefix, - stealthAddressKey.ephemeralPub, - stealthAddressKey.ephemeralPrefix - ) - ), - Operation.Call - ) - ); - performUserOperationWithSig(op); - address owner = stealthAddressValidator.getOwner(address(kernel)); - assertEq(owner, stealthAddressKey.stealthAddress, "owner should be stealthAddress"); - } - - function test_default_validator_disable() external override { - UserOperation memory op = buildUserOperation( - abi.encodeWithSelector( - IKernel.execute.selector, - address(defaultValidator), - 0, - abi.encodeWithSelector(StealthAddressValidator.disable.selector, ""), - Operation.Call - ) - ); - performUserOperationWithSig(op); - address owner = stealthAddressValidator.getOwner(address(kernel)); - assertEq(owner, address(0), "owner should be 0"); - } - - function test_stealth_validate_userop_aggsig() external { - UserOperation memory userOp = UserOperation({ - sender: address(kernel), - nonce: 0, - initCode: bytes(""), - callData: bytes(""), - callGasLimit: 1, - verificationGasLimit: 1, - preVerificationGas: 1, - maxFeePerGas: 1, - maxPriorityFeePerGas: 1, - paymasterAndData: bytes(""), - signature: bytes("") - }); - bytes32 userOpHash = entryPoint.getUserOpHash(userOp); - - // Get the validator domain separator - bytes32 domainSeparator = stealthAddressValidator.getDomainSeperator(); - bytes32 typedMsgHash = keccak256( - abi.encodePacked( - "\x19\x01", domainSeparator, keccak256(abi.encode(USER_OP_TYPEHASH, owner, address(kernel), userOpHash)) - ) - ); - bytes memory aggregatedSignature = getAggregatedSignature(typedMsgHash, wallet); - userOp.signature = aggregatedSignature; - - (,, address result) = parseValidationData(defaultValidator.validateUserOp(userOp, userOpHash, 0)); - assertEq(result, address(0)); - } - - function test_stealth_validate_sig_aggsig() external { - bytes32 message = bytes32(uint256(0x102030405060708090a)); - - // Get the validator domain separator - bytes32 domainSeparator = stealthAddressValidator.getDomainSeperator(); - bytes32 typedMsgHash = keccak256( - abi.encodePacked( - "\x19\x01", domainSeparator, keccak256(abi.encode(SIGNATURE_TYPEHASH, owner, address(kernel), message)) - ) - ); - bytes memory aggregatedSignature = getAggregatedSignature(typedMsgHash, wallet); - - vm.prank(address(kernel)); - (,, address result) = parseValidationData(defaultValidator.validateSignature(message, aggregatedSignature)); - assertEq(result, address(0)); - } - - /* -------------------------------------------------------------------------- */ - /* Helper methods */ - /* -------------------------------------------------------------------------- */ - - /// @notice The type hash used for kernel user op validation - bytes32 constant USER_OP_TYPEHASH = keccak256("AllowUserOp(address owner,address kernelWallet,bytes32 userOpHash)"); - - /// @dev Generate the signature for a user op - function _generateUserOpSignature(IEntryPoint _entryPoint, UserOperation memory _op, uint256 _privateKey) - internal - view - returns (bytes memory) - { - // Get the kernel private key owner address - address owner = vm.addr(_privateKey); - - // Get the user op hash - bytes32 userOpHash = _entryPoint.getUserOpHash(_op); - // Get the validator domain separator - bytes32 domainSeparator = stealthAddressValidator.getDomainSeperator(); - bytes32 typedMsgHash = keccak256( - abi.encodePacked( - "\x19\x01", domainSeparator, keccak256(abi.encode(USER_OP_TYPEHASH, owner, _op.sender, userOpHash)) - ) - ); - (uint8 v, bytes32 r, bytes32 s) = vm.sign(_privateKey, typedMsgHash); - return abi.encodePacked(r, s, v); - } - - /// @notice The type hash used for kernel signature validation - bytes32 constant SIGNATURE_TYPEHASH = keccak256("KernelSignature(address owner,address kernelWallet,bytes32 hash)"); - - /// @dev Generate the signature for a given hash for a kernel account - function _generateHashSignature(bytes32 _hash, address _kernel, uint256 _privateKey) - internal - view - returns (bytes memory) - { - // Get the kernel private key owner address - address owner = vm.addr(_privateKey); - - // Get the validator domain separator - bytes32 domainSeparator = stealthAddressValidator.getDomainSeperator(); - bytes32 typedMsgHash = keccak256( - abi.encodePacked( - "\x19\x01", domainSeparator, keccak256(abi.encode(SIGNATURE_TYPEHASH, owner, _kernel, _hash)) - ) - ); - - (uint8 v, bytes32 r, bytes32 s) = vm.sign(_privateKey, typedMsgHash); - return abi.encodePacked(bytes1(0), r, s, v); - } - - /// @notice The parameter used in the elliptic curve - uint256 GX = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798; - uint256 GY = 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8; - uint256 AA = 0; - uint256 PP = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F; - uint256 N = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141; - - /// @dev Generate stealth address - function getStealthAddress(VmSafe.Wallet memory _ownerWallet, VmSafe.Wallet memory _ephemeralWallet) - public - view - returns (StealthAddressKey memory) - { - (uint256 ephemeralPub, uint256 ephemeralPrefix) = - (_ephemeralWallet.publicKeyX, _ephemeralWallet.publicKeyY % 2 + 2); - - (uint256 sharedSecretX, uint256 sharedSecretY) = - EllipticCurve.ecMul(_ephemeralWallet.privateKey, _ownerWallet.publicKeyX, _ownerWallet.publicKeyY, AA, PP); - uint256 hashSecret = uint256(keccak256(abi.encode(sharedSecretX, sharedSecretY))); - (uint256 pubX, uint256 pubY) = EllipticCurve.ecMul(hashSecret, GX, GY, AA, PP); - uint256 stealthPrivate = _ownerWallet.privateKey + hashSecret % N; - (uint256 stealthPubX, uint256 stealthPubY) = - EllipticCurve.ecAdd(_ownerWallet.publicKeyX, _ownerWallet.publicKeyY, pubX, pubY, AA, PP); - address stealthAddress = address(uint160(uint256(keccak256(abi.encode(stealthPubX, stealthPubY))))); - (uint256 dhkx, uint256 dhky) = - EllipticCurve.ecMul(hashSecret, _ownerWallet.publicKeyX, _ownerWallet.publicKeyY, AA, PP); - return StealthAddressKey( - stealthAddress, - stealthPubX, - dhkx, - uint8(stealthPubY % 2 + 2), - uint8(dhky % 2 + 2), - ephemeralPub, - uint8(ephemeralPrefix), - hashSecret, - stealthPrivate - ); - } - - function getAggregatedSignature(bytes32 _hash, Vm.Wallet memory _wallet) internal view returns (bytes memory) { - StealthAddressKey memory stelathAddressKey = getStealthAddress(_wallet, ephemeralWallet); - (, bytes32 r, bytes32 s) = vm.sign(_wallet.privateKey, _hash); - uint256 numR = uint256(r); - uint256 numS = uint256(s); - - // aggregatedSig = numS * (stelathAddressKey.hashSecret * numR + typedMsgHash) - bytes32 aggregatedSig = bytes32( - FixedPointMathLib.rawMulMod( - FixedPointMathLib.rawAddMod( - FixedPointMathLib.rawMulMod(stelathAddressKey.hashSecret, numR, N), uint256(_hash), N - ), - numS, - N - ) - ); - - return abi.encodePacked(bytes1(uint8(1)), r, aggregatedSig); - } -} From 554e42c439d7bbfafb05b2b90a764bceaa1545ef Mon Sep 17 00:00:00 2001 From: leekt Date: Mon, 22 Jan 2024 16:28:33 +0900 Subject: [PATCH 3/3] fix: import path fix for kerneltestbase --- src/factory/AdminLessERC1967Factory.sol | 1 - {test/foundry => src}/mock/TestCallee.sol | 0 {test/foundry => src}/mock/TestCounter.sol | 0 {test/foundry => src}/mock/TestERC1155.sol | 0 {test/foundry => src}/mock/TestERC20.sol | 0 {test/foundry => src}/mock/TestERC721.sol | 0 {test/foundry => src}/mock/TestExecutor.sol | 0 {test/foundry => src}/mock/TestKernel.sol | 2 +- {test/foundry => src}/mock/TestPaymaster.sol | 0 {test/foundry => src}/mock/TestValidator.sol | 8 ++--- {test/foundry => src}/utils/ERC4337Utils.sol | 0 .../foundry => src/utils}/KernelTestBase.sol | 32 +++++++++---------- test/foundry/KernelECDSA.t.sol | 8 ++--- test/foundry/KernelLiteECDSA.t.sol | 8 ++--- test/foundry/validator/KernelECDSATyped.t.sol | 11 +++---- .../validator/KillSwitchValidator.t.sol | 4 +-- .../validator/SessionKeyValidator.t.sol | 16 +++++----- 17 files changed, 43 insertions(+), 47 deletions(-) rename {test/foundry => src}/mock/TestCallee.sol (100%) rename {test/foundry => src}/mock/TestCounter.sol (100%) rename {test/foundry => src}/mock/TestERC1155.sol (100%) rename {test/foundry => src}/mock/TestERC20.sol (100%) rename {test/foundry => src}/mock/TestERC721.sol (100%) rename {test/foundry => src}/mock/TestExecutor.sol (100%) rename {test/foundry => src}/mock/TestKernel.sol (95%) rename {test/foundry => src}/mock/TestPaymaster.sol (100%) rename {test/foundry => src}/mock/TestValidator.sol (90%) rename {test/foundry => src}/utils/ERC4337Utils.sol (100%) rename {test/foundry => src/utils}/KernelTestBase.sol (95%) diff --git a/src/factory/AdminLessERC1967Factory.sol b/src/factory/AdminLessERC1967Factory.sol index 2587d1c5..5d3fa3c9 100644 --- a/src/factory/AdminLessERC1967Factory.sol +++ b/src/factory/AdminLessERC1967Factory.sol @@ -249,7 +249,6 @@ contract AdminLessERC1967Factory { * fd | REVERT | | [0..returndatasize): returndata | * -------------------------------------------------------------------------------------+ */ - m := mload(0x40) // forgefmt: disable-start switch shr(112, address()) diff --git a/test/foundry/mock/TestCallee.sol b/src/mock/TestCallee.sol similarity index 100% rename from test/foundry/mock/TestCallee.sol rename to src/mock/TestCallee.sol diff --git a/test/foundry/mock/TestCounter.sol b/src/mock/TestCounter.sol similarity index 100% rename from test/foundry/mock/TestCounter.sol rename to src/mock/TestCounter.sol diff --git a/test/foundry/mock/TestERC1155.sol b/src/mock/TestERC1155.sol similarity index 100% rename from test/foundry/mock/TestERC1155.sol rename to src/mock/TestERC1155.sol diff --git a/test/foundry/mock/TestERC20.sol b/src/mock/TestERC20.sol similarity index 100% rename from test/foundry/mock/TestERC20.sol rename to src/mock/TestERC20.sol diff --git a/test/foundry/mock/TestERC721.sol b/src/mock/TestERC721.sol similarity index 100% rename from test/foundry/mock/TestERC721.sol rename to src/mock/TestERC721.sol diff --git a/test/foundry/mock/TestExecutor.sol b/src/mock/TestExecutor.sol similarity index 100% rename from test/foundry/mock/TestExecutor.sol rename to src/mock/TestExecutor.sol diff --git a/test/foundry/mock/TestKernel.sol b/src/mock/TestKernel.sol similarity index 95% rename from test/foundry/mock/TestKernel.sol rename to src/mock/TestKernel.sol index ce270c2c..48a04ad1 100644 --- a/test/foundry/mock/TestKernel.sol +++ b/src/mock/TestKernel.sol @@ -1,6 +1,6 @@ pragma solidity ^0.8.0; -import "src/Kernel.sol"; +import "../Kernel.sol"; contract TestKernel is Kernel { constructor(IEntryPoint _entryPoint) Kernel(_entryPoint) {} diff --git a/test/foundry/mock/TestPaymaster.sol b/src/mock/TestPaymaster.sol similarity index 100% rename from test/foundry/mock/TestPaymaster.sol rename to src/mock/TestPaymaster.sol diff --git a/test/foundry/mock/TestValidator.sol b/src/mock/TestValidator.sol similarity index 90% rename from test/foundry/mock/TestValidator.sol rename to src/mock/TestValidator.sol index f34c5ef2..dad5d27e 100644 --- a/test/foundry/mock/TestValidator.sol +++ b/src/mock/TestValidator.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import "src/interfaces/IKernelValidator.sol"; -import "src/common/Types.sol"; -import "src/utils/KernelHelper.sol"; -import "src/common/Constants.sol"; +import "../interfaces/IKernelValidator.sol"; +import "../common/Types.sol"; +import "../utils/KernelHelper.sol"; +import "../common/Constants.sol"; contract TestValidator is IKernelValidator { event TestValidateUserOp(bytes32 indexed opHash); diff --git a/test/foundry/utils/ERC4337Utils.sol b/src/utils/ERC4337Utils.sol similarity index 100% rename from test/foundry/utils/ERC4337Utils.sol rename to src/utils/ERC4337Utils.sol diff --git a/test/foundry/KernelTestBase.sol b/src/utils/KernelTestBase.sol similarity index 95% rename from test/foundry/KernelTestBase.sol rename to src/utils/KernelTestBase.sol index 366761c8..1a669ced 100644 --- a/test/foundry/KernelTestBase.sol +++ b/src/utils/KernelTestBase.sol @@ -5,24 +5,24 @@ import {IEntryPoint} from "I4337/interfaces/IEntryPoint.sol"; import {ENTRYPOINT_0_6_ADDRESS, ENTRYPOINT_0_6_BYTECODE} from "I4337/artifacts/EntryPoint_0_6.sol"; import {CREATOR_0_6_BYTECODE, CREATOR_0_6_ADDRESS} from "I4337/artifacts/EntryPoint_0_6.sol"; import {UserOperation} from "I4337/interfaces/UserOperation.sol"; -import {Kernel} from "src/Kernel.sol"; -import {Operation} from "src/common/Enums.sol"; -import {Compatibility} from "src/abstract/Compatibility.sol"; -import {IKernel} from "src/interfaces/IKernel.sol"; -import {KernelFactory} from "src/factory/KernelFactory.sol"; -import {IKernelValidator} from "src/interfaces/IKernelValidator.sol"; - -import {Call, ExecutionDetail} from "src/common/Structs.sol"; -import {ValidationData, ValidUntil, ValidAfter} from "src/common/Types.sol"; -import {KERNEL_VERSION, KERNEL_NAME} from "src/common/Constants.sol"; - -import {ERC4337Utils} from "test/foundry/utils/ERC4337Utils.sol"; +import {Kernel} from "../Kernel.sol"; +import {Operation} from "../common/Enums.sol"; +import {Compatibility} from "../abstract/Compatibility.sol"; +import {IKernel} from "../interfaces/IKernel.sol"; +import {KernelFactory} from "../factory/KernelFactory.sol"; +import {IKernelValidator} from "../interfaces/IKernelValidator.sol"; + +import {Call, ExecutionDetail} from "../common/Structs.sol"; +import {ValidationData, ValidUntil, ValidAfter} from "../common/Types.sol"; +import {KERNEL_VERSION, KERNEL_NAME} from "../common/Constants.sol"; + +import {ERC4337Utils} from "./ERC4337Utils.sol"; import {Test} from "forge-std/Test.sol"; import {console} from "forge-std/Console.sol"; -import {TestValidator} from "./mock/TestValidator.sol"; -import {TestExecutor} from "./mock/TestExecutor.sol"; -import {TestERC721} from "./mock/TestERC721.sol"; -import {TestERC1155} from "./mock/TestERC1155.sol"; +import {TestValidator} from "../mock/TestValidator.sol"; +import {TestExecutor} from "../mock/TestExecutor.sol"; +import {TestERC721} from "../mock/TestERC721.sol"; +import {TestERC1155} from "../mock/TestERC1155.sol"; using ERC4337Utils for IEntryPoint; diff --git a/test/foundry/KernelECDSA.t.sol b/test/foundry/KernelECDSA.t.sol index 8d68abce..4ebe58ca 100644 --- a/test/foundry/KernelECDSA.t.sol +++ b/test/foundry/KernelECDSA.t.sol @@ -7,10 +7,10 @@ import "src/validator/ECDSAValidator.sol"; // test artifacts // test utils import "forge-std/Test.sol"; -import {ERC4337Utils} from "./utils/ERC4337Utils.sol"; -import {KernelTestBase} from "./KernelTestBase.sol"; -import {TestExecutor} from "./mock/TestExecutor.sol"; -import {TestValidator} from "./mock/TestValidator.sol"; +import {ERC4337Utils} from "src/utils/ERC4337Utils.sol"; +import {KernelTestBase} from "src/utils/KernelTestBase.sol"; +import {TestExecutor} from "src/mock/TestExecutor.sol"; +import {TestValidator} from "src/mock/TestValidator.sol"; import {IKernel} from "src/interfaces/IKernel.sol"; using ERC4337Utils for IEntryPoint; diff --git a/test/foundry/KernelLiteECDSA.t.sol b/test/foundry/KernelLiteECDSA.t.sol index 8979958c..70a71daf 100644 --- a/test/foundry/KernelLiteECDSA.t.sol +++ b/test/foundry/KernelLiteECDSA.t.sol @@ -7,10 +7,10 @@ import "src/lite/KernelLiteECDSA.sol"; // test artifacts // test utils import "forge-std/Test.sol"; -import {ERC4337Utils} from "./utils/ERC4337Utils.sol"; -import {KernelTestBase} from "./KernelTestBase.sol"; -import {TestExecutor} from "./mock/TestExecutor.sol"; -import {TestValidator} from "./mock/TestValidator.sol"; +import {ERC4337Utils} from "src/utils/ERC4337Utils.sol"; +import {KernelTestBase} from "src/utils/KernelTestBase.sol"; +import {TestExecutor} from "src/mock/TestExecutor.sol"; +import {TestValidator} from "src/mock/TestValidator.sol"; import {ECDSAValidator} from "src/validator/ECDSAValidator.sol"; using ERC4337Utils for IEntryPoint; diff --git a/test/foundry/validator/KernelECDSATyped.t.sol b/test/foundry/validator/KernelECDSATyped.t.sol index cfe3eca5..4fd6bf44 100644 --- a/test/foundry/validator/KernelECDSATyped.t.sol +++ b/test/foundry/validator/KernelECDSATyped.t.sol @@ -7,10 +7,10 @@ import "src/validator/ECDSATypedValidator.sol"; // test artifacts // test utils import "forge-std/Test.sol"; -import {ERC4337Utils} from "../utils/ERC4337Utils.sol"; -import {KernelTestBase} from "../KernelTestBase.sol"; -import {TestExecutor} from "../mock/TestExecutor.sol"; -import {TestValidator} from "../mock/TestValidator.sol"; +import {ERC4337Utils} from "src/utils/ERC4337Utils.sol"; +import {KernelTestBase} from "src/utils/KernelTestBase.sol"; +import {TestExecutor} from "src/mock/TestExecutor.sol"; +import {TestValidator} from "src/mock/TestValidator.sol"; import {IKernel} from "src/interfaces/IKernel.sol"; using ERC4337Utils for IEntryPoint; @@ -140,9 +140,6 @@ contract KernelECDSATypedTest is KernelTestBase { view returns (bytes memory) { - // Get the kernel private key owner address - address owner = vm.addr(_privateKey); - // Get the validator domain separator bytes32 domainSeparator = ecdsaTypedValidator.getDomainSeperator(); bytes32 typedMsgHash = keccak256( diff --git a/test/foundry/validator/KillSwitchValidator.t.sol b/test/foundry/validator/KillSwitchValidator.t.sol index 8a3861fb..3ab45b14 100644 --- a/test/foundry/validator/KillSwitchValidator.t.sol +++ b/test/foundry/validator/KillSwitchValidator.t.sol @@ -8,8 +8,8 @@ import "src/validator/KillSwitchValidator.sol"; import "src/executor/KillSwitchAction.sol"; // test utils import "forge-std/Test.sol"; -import "../utils/ERC4337Utils.sol"; -import {KernelTestBase} from "../KernelTestBase.sol"; +import "src/utils/ERC4337Utils.sol"; +import {KernelTestBase} from "src/utils/KernelTestBase.sol"; import {KernelECDSATest} from "../KernelECDSA.t.sol"; using ERC4337Utils for IEntryPoint; diff --git a/test/foundry/validator/SessionKeyValidator.t.sol b/test/foundry/validator/SessionKeyValidator.t.sol index e9b75105..e231c1d4 100644 --- a/test/foundry/validator/SessionKeyValidator.t.sol +++ b/test/foundry/validator/SessionKeyValidator.t.sol @@ -7,21 +7,21 @@ import "src/validator/ECDSAValidator.sol"; import "src/factory/KernelFactory.sol"; import {Call} from "src/common/Structs.sol"; // test artifacts -import "../mock/TestValidator.sol"; -import "../mock/TestExecutor.sol"; -import "../mock/TestERC721.sol"; -import "../mock/TestERC20.sol"; -import "../mock/TestPaymaster.sol"; +import "src/mock/TestValidator.sol"; +import "src/mock/TestExecutor.sol"; +import "src/mock/TestERC721.sol"; +import "src/mock/TestERC20.sol"; +import "src/mock/TestPaymaster.sol"; // test utils import "forge-std/Test.sol"; -import "../utils/ERC4337Utils.sol"; +import "src/utils/ERC4337Utils.sol"; import "../utils/Merkle.sol"; // test actions/validators import "src/validator/SessionKeyValidator.sol"; import {KernelECDSATest} from "../KernelECDSA.t.sol"; -import "../mock/TestCallee.sol"; -import "../mock/TestERC20.sol"; +import "src/mock/TestCallee.sol"; +import "src/mock/TestERC20.sol"; using ERC4337Utils for IEntryPoint;