From a8052ea49f4bf3c08f549b2b4891f229e5d7b6ad Mon Sep 17 00:00:00 2001 From: leekt Date: Thu, 6 Feb 2025 14:28:48 +0900 Subject: [PATCH 01/14] 7702 implemented --- src/Kernel.sol | 43 +- src/core/ValidationManager.sol | 16 +- src/types/Constants.sol | 1 + test/ECDSAValidator.t.sol | 2 +- test/Kernel.t.sol | 2 +- test/Permission.t.sol | 53 +- test/base/Kernel7702TestBase.sol | 1176 +++++++++++++++++ {src/sdk => test/base}/KernelTestBase.sol | 36 +- .../TestBase => test/base}/erc4337Util.sol | 0 {src => test}/mock/MockAction.sol | 0 test/mock/MockCallee.sol | 22 + {src => test}/mock/MockERC1155.sol | 0 {src => test}/mock/MockERC20.sol | 0 {src => test}/mock/MockERC721.sol | 0 {src => test}/mock/MockExecutor.sol | 4 +- {src => test}/mock/MockFallback.sol | 10 +- {src => test}/mock/MockHook.sol | 2 +- {src => test}/mock/MockPolicy.sol | 4 +- {src => test}/mock/MockSigner.sol | 2 +- {src => test}/mock/MockValidator.sol | 2 +- test/mock/MockValidatorLib.sol | 56 + 21 files changed, 1322 insertions(+), 109 deletions(-) create mode 100644 test/base/Kernel7702TestBase.sol rename {src/sdk => test/base}/KernelTestBase.sol (98%) rename {src/sdk/TestBase => test/base}/erc4337Util.sol (100%) rename {src => test}/mock/MockAction.sol (100%) create mode 100644 test/mock/MockCallee.sol rename {src => test}/mock/MockERC1155.sol (100%) rename {src => test}/mock/MockERC20.sol (100%) rename {src => test}/mock/MockERC721.sol (100%) rename {src => test}/mock/MockExecutor.sol (85%) rename {src => test}/mock/MockFallback.sol (85%) rename {src => test}/mock/MockHook.sol (95%) rename {src => test}/mock/MockPolicy.sol (91%) rename {src => test}/mock/MockSigner.sol (97%) rename {src => test}/mock/MockValidator.sol (97%) create mode 100644 test/mock/MockValidatorLib.sol diff --git a/src/Kernel.sol b/src/Kernel.sol index 28b2e63a..ef78b381 100644 --- a/src/Kernel.sol +++ b/src/Kernel.sol @@ -28,6 +28,7 @@ import { VALIDATION_TYPE_ROOT, VALIDATION_TYPE_VALIDATOR, VALIDATION_TYPE_PERMISSION, + VALIDATION_TYPE_7702, MODULE_TYPE_VALIDATOR, MODULE_TYPE_EXECUTOR, MODULE_TYPE_FALLBACK, @@ -41,11 +42,17 @@ import { CALLTYPE_SINGLE, CALLTYPE_BATCH, CALLTYPE_STATIC, - MAGIC_VALUE_SIG_REPLAYABLE + MAGIC_VALUE_SIG_REPLAYABLE, + ERC1271_INVALID, + ERC1271_MAGICVALUE } from "./types/Constants.sol"; import {InstallExecutorDataFormat, InstallFallbackDataFormat, InstallValidatorDataFormat} from "./types/Structs.sol"; +import {ECDSA} from "solady/utils/ECDSA.sol"; + +import "forge-std/console.sol"; + contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager { error ExecutionReverted(); error InvalidExecutor(); @@ -94,6 +101,10 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager } } + function mockCode() external { + console.logBytes(address(this).code); + } + function initialize( ValidationId _rootValidator, IHook hook, @@ -102,7 +113,10 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager bytes[] calldata initConfig ) external { ValidationStorage storage vs = _validationStorage(); - require(ValidationId.unwrap(vs.rootValidator) == bytes21(0), "already initialized"); + require( + ValidationId.unwrap(vs.rootValidator) == bytes21(0) && bytes2(address(this).code) != 0xef01, + "already initialized" + ); if (ValidationId.unwrap(_rootValidator) == bytes21(0)) { revert InvalidValidator(); } @@ -242,12 +256,12 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager revert InvalidNonce(); } IHook execHook = vc.hook; - if (address(execHook) == address(0)) { + if (address(execHook) == address(0) && vType != VALIDATION_TYPE_ROOT) { revert InvalidValidator(); } executionHook[userOpHash] = execHook; - if (address(execHook) == address(1)) { + if (address(execHook) == address(1) || address(execHook) == address(0)) { // does not require hook if (vType != VALIDATION_TYPE_ROOT && !vs.allowedSelectors[vId][bytes4(userOp.callData[0:4])]) { revert InvalidValidator(); @@ -326,19 +340,26 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager if (isReplayable) { sig = sig[32:]; } - if (address(vs.validationConfig[vId].hook) == address(0)) { + ValidationType vType = ValidatorLib.getType(vId); + if (address(vs.validationConfig[vId].hook) == address(0) && vType != VALIDATION_TYPE_7702) { revert InvalidValidator(); } - if (ValidatorLib.getType(vId) == VALIDATION_TYPE_VALIDATOR) { + if (vType == VALIDATION_TYPE_VALIDATOR) { IValidator validator = ValidatorLib.getValidator(vId); return validator.isValidSignatureWithSender(msg.sender, _toWrappedHash(hash, isReplayable), sig); - } else { + } else if (vType == VALIDATION_TYPE_PERMISSION) { PermissionId pId = ValidatorLib.getPermissionId(vId); PassFlag permissionFlag = vs.permissionConfig[pId].permissionFlag; if (PassFlag.unwrap(permissionFlag) & PassFlag.unwrap(SKIP_SIGNATURE) != 0) { revert PermissionNotAlllowedForSignature(); } return _checkPermissionSignature(pId, msg.sender, hash, sig, isReplayable); + } else if (vType == VALIDATION_TYPE_7702) { + return ECDSA.recover(_toWrappedHash(hash, isReplayable), sig) == address(this) + ? ERC1271_MAGICVALUE + : ERC1271_INVALID; + } else { + revert InvalidValidationType(); } } @@ -388,24 +409,22 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager // NOTE: for hook, kernel does not support independent hook install, // hook is expected to be paired with proper validator/executor/selector IHook(module).onInstall(initData); - emit ModuleInstalled(moduleType, module); } else if (moduleType == MODULE_TYPE_POLICY) { // force call onInstall for policy // NOTE: for policy, kernel does not support independent policy install, // policy is expected to be paired with proper permissionId // to "ADD" permission, use "installValidations()" function IPolicy(module).onInstall(initData); - emit ModuleInstalled(moduleType, module); } else if (moduleType == MODULE_TYPE_SIGNER) { // force call onInstall for signer // NOTE: for signer, kernel does not support independent signer install, // signer is expected to be paired with proper permissionId // to "ADD" permission, use "installValidations()" function ISigner(module).onInstall(initData); - emit ModuleInstalled(moduleType, module); } else { revert InvalidModuleType(); } + emit ModuleInstalled(moduleType, module); } function installValidations( @@ -455,7 +474,6 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager // NOTE: for hook, kernel does not support independent hook install, // hook is expected to be paired with proper validator/executor/selector ModuleLib.uninstallModule(module, deInitData); - emit ModuleUninstalled(moduleType, module); } else if (moduleType == 5) { ValidationId rootValidator = _validationStorage().rootValidator; bytes32 permissionId = bytes32(deInitData[0:32]); @@ -469,7 +487,6 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager // policy is expected to be paired with proper permissionId // to "REMOVE" permission, use "uninstallValidation()" function ModuleLib.uninstallModule(module, deInitData); - emit ModuleUninstalled(moduleType, module); } else if (moduleType == 6) { ValidationId rootValidator = _validationStorage().rootValidator; bytes32 permissionId = bytes32(deInitData[0:32]); @@ -483,10 +500,10 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager // signer is expected to be paired with proper permissionId // to "REMOVE" permission, use "uninstallValidation()" function ModuleLib.uninstallModule(module, deInitData); - emit ModuleUninstalled(moduleType, module); } else { revert InvalidModuleType(); } + emit ModuleUninstalled(moduleType, module); } function supportsModule(uint256 moduleTypeId) external pure override returns (bool) { diff --git a/src/core/ValidationManager.sol b/src/core/ValidationManager.sol index 6c5fd76b..958e7c0e 100644 --- a/src/core/ValidationManager.sol +++ b/src/core/ValidationManager.sol @@ -40,6 +40,7 @@ import { VALIDATION_TYPE_ROOT, VALIDATION_TYPE_VALIDATOR, VALIDATION_TYPE_PERMISSION, + VALIDATION_TYPE_7702, SKIP_USEROP, SKIP_SIGNATURE, VALIDATION_MANAGER_STORAGE_SLOT, @@ -49,6 +50,8 @@ import { MAGIC_VALUE_SIG_REPLAYABLE } from "../types/Constants.sol"; +import {ECDSA} from "solady/utils/ECDSA.sol"; + abstract contract ValidationManager is EIP712, SelectorManager, HookManager, ExecutorManager { event RootValidatorUpdated(ValidationId rootValidator); event ValidatorInstalled(IValidator validator, uint32 nonce); @@ -322,7 +325,7 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe validationData, ValidationData.wrap(ValidatorLib.getValidator(vId).validateUserOp(userOp, userOpHash)) ); - } else { + } else if (vType == VALIDATION_TYPE_PERMISSION) { PermissionId pId = ValidatorLib.getPermissionId(vId); if (PassFlag.unwrap(state.permissionConfig[pId].permissionFlag) & PassFlag.unwrap(SKIP_USEROP) != 0) { revert PermissionNotAlllowedForUserOp(); @@ -335,6 +338,12 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe signer.checkUserOpSignature(bytes32(PermissionId.unwrap(pId)), userOp, userOpHash) ) ); + } else if (vType == VALIDATION_TYPE_7702) { + validationData = ECDSA.recover(userOpHash, userOpSig) == address(this) + ? ValidationData.wrap(0) + : ValidationData.wrap(1); + } else { + revert InvalidValidationType(); } } } @@ -416,6 +425,8 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe ISigner signer; (signer, validationData, enableSig) = _checkSignaturePolicy(pId, address(this), digest, enableSig); result = signer.checkSignature(bytes32(PermissionId.unwrap(pId)), address(this), digest, enableSig); + } else if (vType == VALIDATION_TYPE_7702) { + result = ECDSA.recover(digest, enableSig) == address(this) ? bytes4(0x1626ba7e) : bytes4(0xffffffff); } else { revert InvalidValidationType(); } @@ -470,7 +481,8 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe ) internal view returns (ValidationConfig memory config, bytes32 digest) { ValidationStorage storage state = _validationStorage(); config.hook = IHook(hook); - config.nonce = state.currentNonce; + config.nonce = + state.validationConfig[vId].nonce == state.currentNonce ? state.currentNonce + 1 : state.currentNonce; bytes32 structHash = keccak256( abi.encode( diff --git a/src/types/Constants.sol b/src/types/Constants.sol index df9d7487..dd5930b0 100644 --- a/src/types/Constants.sol +++ b/src/types/Constants.sol @@ -38,6 +38,7 @@ ValidationMode constant VALIDATION_MODE_INSTALL = ValidationMode.wrap(0x02); // --- Kernel validation types --- ValidationType constant VALIDATION_TYPE_ROOT = ValidationType.wrap(0x00); +ValidationType constant VALIDATION_TYPE_7702 = ValidationType.wrap(0x00); ValidationType constant VALIDATION_TYPE_VALIDATOR = ValidationType.wrap(0x01); ValidationType constant VALIDATION_TYPE_PERMISSION = ValidationType.wrap(0x02); diff --git a/test/ECDSAValidator.t.sol b/test/ECDSAValidator.t.sol index 56955bd2..b0087c29 100644 --- a/test/ECDSAValidator.t.sol +++ b/test/ECDSAValidator.t.sol @@ -1,7 +1,7 @@ pragma solidity ^0.8.0; import {ECDSAValidator} from "../src/validator/ECDSAValidator.sol"; -import {MockCallee, KernelTestBase} from "../src/sdk/KernelTestBase.sol"; +import {MockCallee, KernelTestBase} from "./base/KernelTestBase.sol"; import {ECDSA} from "solady/utils/ECDSA.sol"; import {PackedUserOperation} from "../src/interfaces/PackedUserOperation.sol"; import {ValidatorLib} from "../src/utils/ValidationTypeLib.sol"; diff --git a/test/Kernel.t.sol b/test/Kernel.t.sol index 7a85adc6..f9eade38 100644 --- a/test/Kernel.t.sol +++ b/test/Kernel.t.sol @@ -1,5 +1,5 @@ pragma solidity ^0.8.0; -import {KernelTestBase} from "../src/sdk/KernelTestBase.sol"; +import {KernelTestBase} from "./base/KernelTestBase.sol"; contract KernelTest is KernelTestBase {} diff --git a/test/Permission.t.sol b/test/Permission.t.sol index 832cfb6f..fa6b908a 100644 --- a/test/Permission.t.sol +++ b/test/Permission.t.sol @@ -2,60 +2,9 @@ pragma solidity ^0.8.0; import "../src/core/ValidationManager.sol"; +import "./mock/MockValidatorLib.sol"; import "forge-std/Test.sol"; -contract MockValidatorLib { - function encodeFlag(bool skipUserOp, bool skipSignature) external pure returns (PassFlag flag) { - return ValidatorLib.encodeFlag(skipUserOp, skipSignature); - } - - function encodeAsNonce( - bytes1 mode, - bytes1 vType, - bytes20 validatorIdentifierWithoutType, - uint16 nonceKey, - uint64 nonce - ) external pure returns (uint256 res) { - return ValidatorLib.encodeAsNonce(mode, vType, validatorIdentifierWithoutType, nonceKey, nonce); - } - - function encodeAsNonceKey(bytes1 mode, bytes1 vType, bytes20 validatorIdentifierWithoutType, uint16 nonceKey) - external - pure - returns (uint192 res) - { - return ValidatorLib.encodeAsNonceKey(mode, vType, validatorIdentifierWithoutType, nonceKey); - } - - function decodeNonce(uint256 nonce) - external - pure - returns (ValidationMode mode, ValidationType vType, ValidationId identifier) - { - return ValidatorLib.decodeNonce(nonce); - } - - function validatorToIdentifier(IValidator validator) external pure returns (ValidationId vId) { - return ValidatorLib.validatorToIdentifier(validator); - } - - function getType(ValidationId validator) external pure returns (ValidationType vType) { - return ValidatorLib.getType(validator); - } - - function getValidator(ValidationId validator) external pure returns (IValidator v) { - return ValidatorLib.getValidator(validator); - } - - function getPolicy(PolicyData data) external pure returns (IPolicy vId) { - return ValidatorLib.getPolicy(data); - } - - function getPermissionId(ValidationId validation) external pure returns (PermissionId vId) { - return ValidatorLib.getPermissionId(validation); - } -} - contract PermissionTest is Test { MockValidatorLib validatorLib; diff --git a/test/base/Kernel7702TestBase.sol b/test/base/Kernel7702TestBase.sol new file mode 100644 index 00000000..efb8422f --- /dev/null +++ b/test/base/Kernel7702TestBase.sol @@ -0,0 +1,1176 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "src/Kernel.sol"; +import "src/factory/KernelFactory.sol"; +import "src/factory/FactoryStaker.sol"; +import "solady_test/utils/TestPlus.sol"; +import "forge-std/Test.sol"; +import "../mock/MockCallee.sol"; +import "../mock/MockValidator.sol"; +import "../mock/MockPolicy.sol"; +import "../mock/MockSigner.sol"; +import "../mock/MockAction.sol"; +import "../mock/MockHook.sol"; +import "../mock/MockExecutor.sol"; +import "../mock/MockFallback.sol"; +import "../mock/MockERC20.sol"; +import "../mock/MockERC721.sol"; +import "../mock/MockERC1155.sol"; +import "src/core/ValidationManager.sol"; +import "./erc4337Util.sol"; +import "src/types/Types.sol"; +import "src/types/Structs.sol"; +import "solady/accounts/LibERC7579.sol"; + +contract Kernel7702TestBase is TestPlus, Test { + Kernel kernel; + uint256 privateKey; + IEntryPoint entrypoint; + ValidationId rootValidation; + + struct RootValidationConfig { + IHook hook; + bytes validatorData; + bytes hookData; + } + + RootValidationConfig rootValidationConfig; + MockValidator mockValidator; + MockCallee callee; + MockHook mockHook; + MockFallback mockFallback; + MockExecutor mockExecutor; + MockERC20 mockERC20; + MockERC721 mockERC721; + MockERC1155 mockERC1155; + + IValidator enabledValidator; + EnableValidatorConfig validationConfig; + + struct EnableValidatorConfig { + IHook hook; + bytes hookData; + bytes validatorData; + } + + PermissionId enabledPermission; + EnablePermissionConfig permissionConfig; + + struct EnablePermissionConfig { + IHook hook; + bytes hookData; + IPolicy[] policies; + bytes[] policyData; + ISigner signer; + bytes signerData; + } + + modifier whenInitialized() { + assertEq(kernel.currentNonce(), 0); + _; + } + + modifier whenValidatorEnabled(bool useFallback, bool isExecutor) { + PackedUserOperation[] memory ops = new PackedUserOperation[](1); + ops[0] = _prepareUserOp( + VALIDATION_TYPE_VALIDATOR, + useFallback, + isExecutor, + encodeExecute(address(callee), 0, abi.encodeWithSelector(callee.setValue.selector, 123)), + true, + true, + false + ); + entrypoint.handleOps(ops, payable(address(0xdeadbeef))); + _; + } + + modifier whenPermissionEnabled(bool useFallback, bool isExecutor) { + _; + } + + function needEnable(ValidationType vType) internal view returns (bool) { + if (vType == VALIDATION_TYPE_VALIDATOR) { + if ( + address(kernel.validationConfig(ValidatorLib.validatorToIdentifier(enabledValidator)).hook) + == address(0) + ) { + return true; + } + return false; + } else if (vType == VALIDATION_TYPE_PERMISSION) { + return address(kernel.validationConfig(ValidatorLib.permissionToIdentifier(enabledPermission)).hook) + == address(0); + } else if (vType == VALIDATION_TYPE_ROOT) { + return false; + } else { + revert("Invalid validation type"); + } + } + + function encodeNonce(ValidationType vType, bool enable) internal view returns (uint256 nonce) { + uint192 nonceKey = 0; + if (vType == VALIDATION_TYPE_ROOT) { + nonceKey = 0; + } else if (vType == VALIDATION_TYPE_VALIDATOR) { + ValidationMode mode = VALIDATION_MODE_DEFAULT; + if (enable) { + mode = VALIDATION_MODE_ENABLE; + } + nonceKey = ValidatorLib.encodeAsNonceKey( + ValidationMode.unwrap(mode), + ValidationType.unwrap(vType), + bytes20(address(enabledValidator)), + 0 // parallel key + ); + } else if (vType == VALIDATION_TYPE_PERMISSION) { + ValidationMode mode = VALIDATION_MODE_DEFAULT; + if (enable) { + mode = VALIDATION_MODE_ENABLE; + } + nonceKey = ValidatorLib.encodeAsNonceKey( + ValidationMode.unwrap(VALIDATION_MODE_ENABLE), + ValidationType.unwrap(vType), + bytes20(PermissionId.unwrap(enabledPermission)), // permission id + 0 + ); + } else { + revert("Invalid validation type"); + } + return entrypoint.getNonce(address(kernel), nonceKey); + } + + function getEnableDigest( + ValidationType vType, + bool overrideValidation, + bytes memory selectorData, + bool isReplayable + ) internal view returns (bytes32) { + uint32 nonce = kernel.currentNonce(); + ValidationId vId; + IHook hook; + bytes memory validatorData; + bytes memory hookData; + if (vType == VALIDATION_TYPE_VALIDATOR) { + vId = ValidatorLib.validatorToIdentifier(enabledValidator); + hook = validationConfig.hook; + validatorData = validationConfig.validatorData; + hookData = validationConfig.hookData; + } else if (vType == VALIDATION_TYPE_PERMISSION) { + vId = ValidatorLib.permissionToIdentifier(enabledPermission); + hook = permissionConfig.hook; + validatorData = encodePermissionsEnableData(); + hookData = permissionConfig.hookData; + } else { + revert("Invalid validation type"); + } + ValidationManager.ValidationConfig memory config = kernel.validationConfig(vId); + if (overrideValidation || nonce == config.nonce) { + nonce = nonce + 1; + } + + bytes32 hash = keccak256( + abi.encode( + keccak256( + "Enable(bytes21 validationId,uint32 nonce,address hook,bytes validatorData,bytes hookData,bytes selectorData)" + ), + ValidationId.unwrap(vId), + uint256(nonce), + hook, + keccak256(validatorData), + keccak256(abi.encodePacked(hex"ff", hookData)), + keccak256(selectorData) + ) + ); + + bytes32 digest; + if (isReplayable) { + digest = chainAgnosticHashTypedData(address(kernel), "Kernel", "0.3.2", hash); + } else { + digest = + keccak256(abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.2", address(kernel)), hash)); + } + + return digest; + } + + function encodeSelectorData(bool isFallback, bool isExecutor) internal view returns (bytes memory) { + if (isFallback && isExecutor) { + return abi.encodePacked( + MockFallback.setData.selector, + address(mockFallback), + address(1), + abi.encode(abi.encodePacked(hex"00", "MockFallbackInit"), hex"", abi.encodePacked(address(0))) // TODO add executor hook test + ); + } else if (isFallback) { + return abi.encodePacked( + MockFallback.setData.selector, + address(mockFallback), + address(1), + abi.encode(abi.encodePacked(hex"00", "MockFallbackInit"), hex"") + ); + } else if (!isFallback && !isExecutor) { + return abi.encodePacked(Kernel.execute.selector); + } else { + revert("Invalid selector data"); + } + } + + function getValidationId(ValidationType vType) internal view returns (ValidationId) { + if (vType == VALIDATION_TYPE_VALIDATOR) { + return ValidatorLib.validatorToIdentifier(enabledValidator); + } else if (vType == VALIDATION_TYPE_PERMISSION) { + return ValidatorLib.permissionToIdentifier(enabledPermission); + } else { + revert("Invalid validation type"); + } + } + + function getEnableSignature( + ValidationType vType, + bytes32 digest, + bytes memory selectorData, + PackedUserOperation memory op, + bool successEnable, + bool successUserOp, + bool isReplayable + ) internal returns (bytes memory) { + bytes memory enableSig = _rootSignDigest(digest, successEnable); + bytes memory userOpSig = _signUserOp(vType, op, successUserOp, isReplayable); + IHook hook; + bytes memory validatorData; + bytes memory hookData; + if (vType == VALIDATION_TYPE_VALIDATOR) { + hook = validationConfig.hook; + validatorData = validationConfig.validatorData; + hookData = validationConfig.hookData; + } else if (vType == VALIDATION_TYPE_PERMISSION) { + hook = permissionConfig.hook; + validatorData = encodePermissionsEnableData(); + hookData = permissionConfig.hookData; + } else { + revert("Invalid validation type"); + } + return encodeEnableSignature( + hook, validatorData, abi.encodePacked(hex"ff", hookData), selectorData, enableSig, userOpSig, isReplayable + ); + } + + function _prepareUserOp( + ValidationType vType, + bool isFallback, + bool isExecutor, + bytes memory callData, + bool successEnable, + bool successUserOp, + bool isReplayable + ) internal returns (PackedUserOperation memory op) { + if (isFallback && isExecutor) { + mockFallback.setExecutorMode(true); + } + bool enable = needEnable(vType); + op = PackedUserOperation({ + sender: address(kernel), + nonce: encodeNonce(vType, enable), + initCode: abi.encodePacked(hex""), + callData: callData, + accountGasLimits: bytes32(abi.encodePacked(uint128(1000000), uint128(1000000))), // TODO make this dynamic + preVerificationGas: 1000000, + gasFees: bytes32(abi.encodePacked(uint128(1), uint128(1))), + paymasterAndData: hex"", // TODO have paymaster test cases + signature: hex"" + }); + if (enable) { + bytes memory selectorData = encodeSelectorData(isFallback, isExecutor); + bytes32 digest = getEnableDigest(vType, false, selectorData, isReplayable); + op.signature = + getEnableSignature(vType, digest, selectorData, op, successEnable, successUserOp, isReplayable); + } else { + op.signature = _signUserOp(vType, op, successUserOp, isReplayable); + } + if (isReplayable) { + op.signature = abi.encodePacked(MAGIC_VALUE_SIG_REPLAYABLE, op.signature); + } + } + + function setUp() public { + enabledPermission = PermissionId.wrap(bytes4(0xdeadbeef)); + entrypoint = IEntryPoint(EntryPointLib.deploy()); + Kernel impl = new Kernel(entrypoint); + callee = new MockCallee(); + mockHook = new MockHook(); + mockFallback = new MockFallback(); + mockExecutor = new MockExecutor(); + mockERC20 = new MockERC20(); + mockERC721 = new MockERC721(); + mockERC1155 = new MockERC1155(); + _setRootValidationConfig(); + _setEnableValidatorConfig(); + _setEnablePermissionConfig(); + (address acc, uint256 pk) = makeAddrAndKey("Account"); + kernel = Kernel(payable(acc)); + privateKey = pk; + vm.signAndAttachDelegation(address(impl), privateKey); + } + + function testDeployWithFactory() external { + vm.deal(address(kernel), 1e18); + PackedUserOperation[] memory ops = new PackedUserOperation[](1); + ops[0] = _prepareUserOp(VALIDATION_TYPE_ROOT, false, false, hex"", true, true, false); + // _prepareRootUserOp(hex"", true); + entrypoint.handleOps(ops, payable(address(0xdeadbeef))); + } + + function test_receive() external whenInitialized { + vm.expectEmit(false, false, false, true, address(kernel)); + emit Kernel.Received(address(this), 1); + (bool success,) = address(kernel).call{value: 1}(hex""); + require(success, "eth transfer failed"); + + mockERC721.mint(address(kernel), 100); + mockERC721.safeMint(address(kernel), 999); + + mockERC1155.mint(address(kernel), 100, 1, hex""); + uint256[] memory ids = new uint256[](2); + uint256[] memory amounts = new uint256[](2); + ids[0] = 200; + ids[1] = 201; + amounts[0] = 1; + amounts[1] = 1000; + mockERC1155.batchMint(address(kernel), ids, amounts, hex""); + } + + function testInitializeReverts() external whenInitialized { + bytes[] memory configs = new bytes[](0); + vm.expectRevert(); + kernel.initialize( + ValidatorLib.validatorToIdentifier(IValidator(address(1))), IHook(address(0)), hex"", hex"", configs + ); + } + + function encodeEnableSignature( + IHook hook, + bytes memory validatorData, + bytes memory hookData, + bytes memory selectorData, + bytes memory enableSig, + bytes memory userOpSig, + bool isReplayable + ) internal pure returns (bytes memory) { + return abi.encodePacked( + abi.encodePacked(hook), abi.encode(validatorData, hookData, selectorData, enableSig, userOpSig) + ); + } + + // things to override on test + function _setRootValidationConfig() internal virtual { + mockValidator = new MockValidator(); + rootValidation = ValidatorLib.validatorToIdentifier(mockValidator); + } + + function _setEnableValidatorConfig() internal virtual { + enabledValidator = new MockValidator(); + } + + function _setEnablePermissionConfig() internal virtual { + IPolicy[] memory policies = new IPolicy[](2); + MockPolicy mockPolicy = new MockPolicy(); + MockPolicy mockPolicy2 = new MockPolicy(); + policies[0] = mockPolicy; + policies[1] = mockPolicy2; + bytes[] memory policyData = new bytes[](2); + policyData[0] = "policy1"; + policyData[1] = "policy2"; + MockSigner mockSigner = new MockSigner(); + + permissionConfig.policies = policies; + permissionConfig.signer = mockSigner; + permissionConfig.policyData = policyData; + permissionConfig.signerData = "signer"; + } + + // root validator cases + function _rootValidatorSuccessCheck() internal virtual { + assertEq(123, callee.value()); + } + + function _rootValidatorFailureCheck() internal virtual { + assertEq(0, callee.value()); + } + + function _rootSignDigest(bytes32 digest, bool success) internal virtual returns (bytes memory data) { + if (success) { + (uint8 v, bytes32 r, bytes32 s) = vm.sign(privateKey, digest); + return abi.encodePacked(r, s, v); + } else { + (uint8 v, bytes32 r, bytes32 s) = vm.sign(privateKey + 1, digest); + return abi.encodePacked(r, s, v); + } + } + + function _signUserOp(ValidationType vType, PackedUserOperation memory op, bool success, bool isReplayable) + internal + virtual + returns (bytes memory sig) + { + bytes32 userOpHash = entrypoint.getUserOpHash(op); + if (isReplayable) { + userOpHash = kernel.replayableUserOpHash(op, address(entrypoint)); + } + if (vType == VALIDATION_TYPE_VALIDATOR) { + sig = _validatorSignUserOp(op, userOpHash, success); + } else if (vType == VALIDATION_TYPE_PERMISSION) { + sig = _permissionSignUserOp(op, userOpHash, success); + } else if (vType == VALIDATION_TYPE_ROOT) { + sig = _rootSignUserOp(op, userOpHash, success); + } else { + revert("Invalid validation type"); + } + } + + function _rootSignUserOp(PackedUserOperation memory op, bytes32 userOpHash, bool success) + internal + virtual + returns (bytes memory) + { + return _rootSignDigest(userOpHash, success); + } + + function _validatorSignUserOp(PackedUserOperation memory, bytes32 userOpHash, bool success) + internal + virtual + returns (bytes memory data) + { + MockValidator(address(enabledValidator)).sudoSetSuccess(success); + if (success) { + return "userOpSig"; + } else { + return "failUserOpSig"; + } + } + + function _validatorSignDigest(bytes32 digest, bool success) internal virtual returns (bytes memory data) { + if (success) { + data = "enableSig"; + MockValidator(address(enabledValidator)).sudoSetValidSig(data); + } else { + data = "failEnableSig"; + } + } + + function _permissionSignUserOp(PackedUserOperation memory op, bytes32 userOpHash, bool success) + internal + virtual + returns (bytes memory data) + { + MockPolicy(address(permissionConfig.policies[0])).sudoSetValidSig( + address(kernel), bytes32(PermissionId.unwrap(enabledPermission)), "policy1" + ); + MockPolicy(address(permissionConfig.policies[1])).sudoSetValidSig( + address(kernel), bytes32(PermissionId.unwrap(enabledPermission)), "policy2" + ); + MockSigner(address(permissionConfig.signer)).sudoSetValidSig( + address(kernel), + bytes32(PermissionId.unwrap(enabledPermission)), + success ? abi.encodePacked("userOpSig") : abi.encodePacked("NO") + ); + bytes[] memory sigs = _getPolicyAndSignerSig(op, success); + for (uint8 i = 0; i < sigs.length - 1; i++) { + if (sigs[i].length > 0) { + data = abi.encodePacked(data, bytes1(i), bytes8(uint64(sigs[i].length)), sigs[i]); + } + } + data = abi.encodePacked(data, bytes1(0xff), sigs[sigs.length - 1]); + } + + function _permissionSignDigest(bytes32 digest, bool success) internal virtual returns (bytes memory data) { + MockPolicy(address(permissionConfig.policies[0])).sudoSetPass( + address(kernel), bytes32(PermissionId.unwrap(enabledPermission)), true + ); + MockPolicy(address(permissionConfig.policies[1])).sudoSetPass( + address(kernel), bytes32(PermissionId.unwrap(enabledPermission)), true + ); + MockSigner(address(permissionConfig.signer)).sudoSetPass( + address(kernel), bytes32(PermissionId.unwrap(enabledPermission)), success + ); + return "hello world"; + } + + function _getPolicyAndSignerSig(PackedUserOperation memory op, bool success) + internal + returns (bytes[] memory data) + { + data = new bytes[](3); + data[0] = "policy1"; + data[1] = "policy2"; + data[2] = "userOpSig"; + } + + // --- Root validator cases, no need to enable --- + function testRootValidateUser(bool success) external whenInitialized { + vm.deal(address(kernel), 1e18); + PackedUserOperation[] memory ops = new PackedUserOperation[](1); + ops[0] = _prepareUserOp( + VALIDATION_TYPE_ROOT, + false, + false, + encodeExecute(address(callee), 0, abi.encodeWithSelector(callee.setValue.selector, 123)), + true, + success, + false + ); + if (!success) { + vm.expectRevert(abi.encodeWithSelector(IEntryPoint.FailedOp.selector, 0, "AA24 signature error")); + } + entrypoint.handleOps(ops, payable(address(0xdeadbeef))); + if (success) { + _rootValidatorSuccessCheck(); + } + } + + function testRootValidateUserReplayable(bool success) external whenInitialized { + vm.deal(address(kernel), 1e18); + PackedUserOperation[] memory ops = new PackedUserOperation[](1); + ops[0] = _prepareUserOp( + VALIDATION_TYPE_ROOT, + false, + false, + encodeExecute(address(callee), 0, abi.encodeWithSelector(callee.setValue.selector, 123)), + true, + success, + true + ); + if (!success) { + vm.expectRevert(abi.encodeWithSelector(IEntryPoint.FailedOp.selector, 0, "AA24 signature error")); + } + entrypoint.handleOps(ops, payable(address(0xdeadbeef))); + if (success) { + _rootValidatorSuccessCheck(); + } + } + + function _buildDomainSeparator(string memory name, string memory version, address verifyingContract) + internal + view + returns (bytes32) + { + bytes32 hashedName = keccak256(bytes(name)); + bytes32 hashedVersion = keccak256(bytes(version)); + bytes32 typeHash = + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); + + return keccak256(abi.encode(typeHash, hashedName, hashedVersion, block.chainid, address(verifyingContract))); + } + + function encodeExecute(address _to, uint256 _amount, bytes memory _data) internal view returns (bytes memory) { + return abi.encodeWithSelector(kernel.execute.selector, bytes32(0), ExecLib.encodeSingle(_to, _amount, _data)); + } + + function encodeBatchExecute(Execution[] memory execs) internal view returns (bytes memory) { + return abi.encodeWithSelector( + kernel.execute.selector, + LibERC7579.encodeMode(bytes1(0x01), bytes1(0x00), bytes4(0), bytes22(0)), + abi.encode(execs) + ); + } + + function testInvalidateNonce(uint32 nonce) external whenInitialized { + uint32 kernelNonce = kernel.currentNonce(); + bytes memory errorMsg; + if (nonce <= kernelNonce) { + errorMsg = abi.encodeWithSelector(ValidationManager.InvalidNonce.selector); + } else if (nonce > kernelNonce + MAX_NONCE_INCREMENT_SIZE) { + errorMsg = abi.encodeWithSelector(ValidationManager.NonceInvalidationError.selector); + } + if (errorMsg.length > 0) { + vm.expectRevert(errorMsg); + } + vm.prank(address(kernel)); + kernel.invalidateNonce(nonce); + if (errorMsg.length > 0) { + assertEq(kernel.currentNonce(), kernelNonce); + } else { + assertEq(kernel.currentNonce(), nonce); + assertEq(kernel.validNonceFrom(), nonce); + } + } + + function testValidateUserOpWithEnable( + ValidationType vType, + bool useFallback, + bool isExecutor, + bool enableSuccess, + bool userOpSuccess, + bool replayable + ) external whenInitialized { + vm.assume(vType == VALIDATION_TYPE_VALIDATOR || vType == VALIDATION_TYPE_PERMISSION); + if (useFallback == false && isExecutor == true) { + isExecutor = false; + } + vm.deal(address(kernel), 1e18); + PackedUserOperation[] memory ops = new PackedUserOperation[](1); + ops[0] = _prepareUserOp( + vType, + useFallback, + isExecutor, + useFallback + ? abi.encodeWithSelector(MockFallback.setData.selector, 123456) + : encodeExecute(address(callee), 0, abi.encodeWithSelector(callee.setValue.selector, 123)), + enableSuccess, + userOpSuccess, + replayable + ); + if (!enableSuccess) { + vm.expectRevert( + abi.encodeWithSelector( + IEntryPoint.FailedOpWithRevert.selector, + 0, + "AA23 reverted", + abi.encodePacked(ValidationManager.EnableNotApproved.selector) + ) + ); + } else if (!userOpSuccess) { + vm.expectRevert(abi.encodeWithSelector(IEntryPoint.FailedOp.selector, 0, "AA24 signature error")); + } + entrypoint.handleOps(ops, payable(address(0xdeadbeef))); + if (enableSuccess && userOpSuccess) { + ValidationManager.ValidationConfig memory config = kernel.validationConfig(getValidationId(vType)); + assertEq(config.nonce, 1); + assertEq(address(config.hook), address(1)); + assertEq(kernel.currentNonce(), 1); + if (vType == VALIDATION_TYPE_PERMISSION) { + ValidationManager.PermissionConfig memory pConfig = kernel.permissionConfig(enabledPermission); + pConfig.signer = permissionConfig.signer; + } + if (useFallback) { + assertEq(kernel.isAllowedSelector(getValidationId(vType), MockFallback.setData.selector), true); + assertEq(mockFallback.valueStored(), 123456); + Callee callee1 = mockFallback.callee(); + if (isExecutor) { + assertEq(callee1.lastCaller(), address(kernel)); + } else { + assertEq(callee1.lastCaller(), address(0)); + } + } else { + assertEq(kernel.isAllowedSelector(getValidationId(vType), Kernel.execute.selector), true); + assertEq(callee.value(), 123); + } + } + } + + function encodePermissionsEnableData() internal view returns (bytes memory) { + bytes[] memory permissions = new bytes[](permissionConfig.policies.length + 1); + for (uint256 i = 0; i < permissions.length - 1; i++) { + permissions[i] = abi.encodePacked( + PolicyData.unwrap(ValidatorLib.encodePolicyData(false, false, address(permissionConfig.policies[i]))), + permissionConfig.policyData[i] + ); + } + permissions[permissions.length - 1] = abi.encodePacked( + PolicyData.unwrap(ValidatorLib.encodePolicyData(false, false, address(permissionConfig.signer))), + permissionConfig.signerData + ); + return abi.encode(permissions); + } + + enum HookInfo { + NoHook, + DefaultHook, + WithHook + } + + function _installValidator(IValidator validator) internal { + vm.deal(address(kernel), 1e18); + PackedUserOperation[] memory ops = new PackedUserOperation[](1); + ops[0] = _prepareUserOp( + VALIDATION_TYPE_ROOT, + false, + false, + abi.encodeWithSelector( + kernel.installModule.selector, + 1, + address(validator), + abi.encodePacked( + address(0), // Hook + abi.encode( + hex"", // validator data + hex"", // hook data + hex"" // selector data + ) + ) + ), + true, + true, + false + ); + entrypoint.handleOps(ops, payable(address(0xdeadbeef))); + } + + function _uninstallValidator(IValidator validator) internal { + vm.deal(address(kernel), 1e18); + PackedUserOperation[] memory ops = new PackedUserOperation[](1); + ops[0] = _prepareUserOp( + VALIDATION_TYPE_ROOT, + false, + false, + abi.encodeWithSelector(kernel.uninstallModule.selector, 1, address(validator), hex""), + true, + true, + false + ); + entrypoint.handleOps(ops, payable(address(0xdeadbeef))); + } + + function testValidatorInstall() external whenInitialized { + MockValidator mv = new MockValidator(); + _installValidator(mv); + ValidationManager.ValidationConfig memory config = + kernel.validationConfig(ValidatorLib.validatorToIdentifier(mv)); + assertEq(config.nonce, 1); + assertEq(address(config.hook), address(1)); + _uninstallValidator(mv); + config = kernel.validationConfig(ValidatorLib.validatorToIdentifier(mv)); + assertEq(config.nonce, 1); + assertEq(address(config.hook), address(0)); + _installValidator(mv); + config = kernel.validationConfig(ValidatorLib.validatorToIdentifier(mv)); + assertEq(config.nonce, 2); + assertEq(address(config.hook), address(1)); + } + + function _installAction(HookInfo withHook) internal { + vm.deal(address(kernel), 1e18); + MockAction mockAction = new MockAction(); + PackedUserOperation[] memory ops = new PackedUserOperation[](1); + ops[0] = _prepareUserOp( + VALIDATION_TYPE_ROOT, + false, + false, + abi.encodeWithSelector( + kernel.installModule.selector, + 3, + address(mockAction), + abi.encodePacked( + MockAction.doSomething.selector, + withHook == HookInfo.WithHook + ? address(mockHook) + : withHook == HookInfo.NoHook ? address(1) : address(0), + withHook == HookInfo.WithHook + ? abi.encode(hex"ff", abi.encodePacked(bytes1(0xff), "hookData")) + : abi.encode(hex"ff", hex"") + ) + ), + true, + true, + false + ); + entrypoint.handleOps(ops, payable(address(0xdeadbeef))); + } + + function testActionInstall(uint8 hookUint) external whenInitialized { + vm.assume(uint8(hookUint) < 3); + HookInfo withHook = HookInfo(hookUint); + _installAction(withHook); + SelectorManager.SelectorConfig memory config = kernel.selectorConfig(MockAction.doSomething.selector); + assertEq( + address(config.hook), + withHook == HookInfo.WithHook + ? address(mockHook) + : withHook == HookInfo.NoHook ? address(1) : address(0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF) + ); + if (withHook != HookInfo.DefaultHook) { + vm.expectEmit(address(kernel)); + emit MockAction.MockActionEvent(address(kernel)); + MockAction(address(kernel)).doSomething(); + } else { + vm.expectRevert(); + MockAction(address(kernel)).doSomething(); + PackedUserOperation memory op = _prepareUserOp( + VALIDATION_TYPE_ROOT, + false, + false, + abi.encodeWithSelector(MockAction.doSomething.selector), + true, + true, + false + ); + PackedUserOperation[] memory ops = new PackedUserOperation[](1); + ops[0] = op; + vm.expectEmit(address(kernel)); + emit MockAction.MockActionEvent(address(kernel)); + entrypoint.handleOps(ops, payable(address(0xdeadbeef))); + } + + if (withHook == HookInfo.WithHook) { + assertEq(mockHook.data(address(kernel)), abi.encodePacked("hookData")); + assertEq( + mockHook.preHookData(address(kernel)), abi.encodePacked(address(this), MockAction.doSomething.selector) + ); + assertEq(mockHook.postHookData(address(kernel)), abi.encodePacked("hookData")); + } + } + + function testActionUninstall(uint8 hookUint) external whenInitialized { + vm.assume(uint8(hookUint) < 3); + HookInfo withHook = HookInfo(hookUint); + _installAction(withHook); + PackedUserOperation[] memory ops = new PackedUserOperation[](1); + ops[0] = _prepareUserOp( + VALIDATION_TYPE_ROOT, + false, + false, + abi.encodeWithSelector( + kernel.uninstallModule.selector, + 3, + address(mockFallback), + abi.encodePacked(MockAction.doSomething.selector) + ), + true, + true, + false + ); + entrypoint.handleOps(ops, payable(address(0xdeadbeef))); + + SelectorManager.SelectorConfig memory config = kernel.selectorConfig(MockAction.doSomething.selector); + assertEq(address(config.hook), address(0)); + assertEq(address(config.target), address(0)); + } + + function _installFallback(HookInfo withHook) internal { + vm.deal(address(kernel), 1e18); + PackedUserOperation[] memory ops = new PackedUserOperation[](1); + ops[0] = _prepareUserOp( + VALIDATION_TYPE_ROOT, + false, + false, + abi.encodeWithSelector( + kernel.installModule.selector, + 3, + address(mockFallback), + abi.encodePacked( + MockFallback.fallbackFunction.selector, + withHook == HookInfo.WithHook + ? address(mockHook) + : withHook == HookInfo.NoHook ? address(1) : address(0), + withHook == HookInfo.WithHook + ? abi.encode(abi.encodePacked(hex"00", "fallbackData"), abi.encodePacked(bytes1(0xff), "hookData")) + : abi.encode(abi.encodePacked(hex"00", "fallbackData"), abi.encodePacked("")) + ) + ), + true, + true, + false + ); + entrypoint.handleOps(ops, payable(address(0xdeadbeef))); + } + + function testFallbackInstall(uint8 hookUint) external whenInitialized { + vm.assume(uint8(hookUint) < 3); + HookInfo withHook = HookInfo(hookUint); + _installFallback(withHook); + assertEq(mockFallback.data(address(kernel)), abi.encodePacked("fallbackData")); + + SelectorManager.SelectorConfig memory config = kernel.selectorConfig(MockFallback.fallbackFunction.selector); + assertEq( + address(config.hook), + withHook == HookInfo.WithHook + ? address(mockHook) + : withHook == HookInfo.NoHook ? address(1) : address(0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF) + ); + assertEq(address(config.target), address(mockFallback)); + if (withHook != HookInfo.DefaultHook) { + (bool success, bytes memory result) = + address(kernel).call(abi.encodeWithSelector(MockFallback.fallbackFunction.selector, uint256(10))); + assertTrue(success); + (uint256 res) = abi.decode(result, (uint256)); + assertEq(res, 100); + } else { + (bool success, bytes memory result) = + address(kernel).call(abi.encodeWithSelector(MockFallback.fallbackFunction.selector, uint256(10))); + assertFalse(success); + PackedUserOperation memory op = _prepareUserOp( + VALIDATION_TYPE_ROOT, + false, + false, + abi.encodeWithSelector(MockFallback.fallbackFunction.selector, uint256(10)), + true, + true, + false + ); + PackedUserOperation[] memory ops = new PackedUserOperation[](1); + ops[0] = op; + entrypoint.handleOps(ops, payable(address(0xdeadbeef))); + } + if (withHook == HookInfo.WithHook) { + assertEq(mockHook.data(address(kernel)), abi.encodePacked("hookData")); + assertEq( + mockHook.preHookData(address(kernel)), + abi.encodePacked(address(this), MockFallback.fallbackFunction.selector, uint256(10)) + ); + assertEq(mockHook.postHookData(address(kernel)), abi.encodePacked("hookData")); + } + } + + function testFallbackUninstall(uint8 hookUint) external whenInitialized { + vm.assume(uint8(hookUint) < 3); + HookInfo withHook = HookInfo(hookUint); + _installFallback(withHook); + PackedUserOperation[] memory ops = new PackedUserOperation[](1); + ops[0] = _prepareUserOp( + VALIDATION_TYPE_ROOT, + false, + false, + abi.encodeWithSelector( + kernel.uninstallModule.selector, + 3, + address(mockFallback), + abi.encodePacked(MockFallback.fallbackFunction.selector) + ), + true, + true, + false + ); + entrypoint.handleOps(ops, payable(address(0xdeadbeef))); + SelectorManager.SelectorConfig memory config = kernel.selectorConfig(MockFallback.fallbackFunction.selector); + assertEq(address(config.hook), address(0)); + assertEq(address(config.target), address(0)); + } + + function _installExecutor(bool withHook) internal { + vm.deal(address(kernel), 1e18); + PackedUserOperation[] memory ops = new PackedUserOperation[](1); + ops[0] = _prepareUserOp( + VALIDATION_TYPE_ROOT, + false, + false, + abi.encodeWithSelector( + kernel.installModule.selector, + 2, + address(mockExecutor), + abi.encodePacked( + withHook ? address(mockHook) : address(0), + withHook + ? abi.encode(abi.encodePacked("executorData"), abi.encodePacked(bytes1(0xff), "hookData")) + : abi.encode(abi.encodePacked("executorData"), abi.encodePacked("")) + ) + ), + true, + true, + false + ); + entrypoint.handleOps(ops, payable(address(0xdeadbeef))); + } + + function testExecute(CallType callType, ExecType execType, bool shouldFail) external whenInitialized { + unchecked { + vm.assume(uint8(CallType.unwrap(callType)) + 1 < 3); //only call/batch/delegatecall + vm.assume(uint8(ExecType.unwrap(execType)) < 2); + } + vm.startPrank(address(entrypoint)); + ExecMode code = ExecLib.encode(callType, execType, ExecModeSelector.wrap(0x00), ExecModePayload.wrap(0x00)); + if (callType == CALLTYPE_BATCH) { + Execution[] memory execs = new Execution[](1); + execs[0] = Execution({ + target: address(callee), + value: 0, + callData: abi.encodeWithSelector(MockCallee.emitEvent.selector, shouldFail) + }); + bytes memory data = ExecLib.encodeBatch(execs); + if (execType == EXECTYPE_DEFAULT && shouldFail) { + vm.expectRevert(); + } + kernel.execute(code, data); + } else if (callType == CALLTYPE_SINGLE) { + if (execType == EXECTYPE_DEFAULT && shouldFail) { + vm.expectRevert(); + } + kernel.execute( + code, + abi.encodePacked( + address(callee), uint256(0), abi.encodeWithSelector(MockCallee.emitEvent.selector, shouldFail) + ) + ); + } else { + if (execType == EXECTYPE_DEFAULT && shouldFail) { + vm.expectRevert(); + } + kernel.execute( + code, + abi.encodePacked(address(callee), abi.encodeWithSelector(MockCallee.emitEvent.selector, shouldFail)) + ); + } + } + + function testExecutorInstall(bool withHook) external whenInitialized { + _installExecutor(withHook); + assertEq(mockExecutor.data(address(kernel)), abi.encodePacked("executorData")); + ExecutorManager.ExecutorConfig memory config = kernel.executorConfig(mockExecutor); + assertEq(address(config.hook), withHook ? address(mockHook) : address(1)); + + ExecMode mode = ExecMode.wrap(bytes32(0)); + bytes memory data = + ExecLib.encodeSingle(address(callee), 0, abi.encodeWithSelector(MockCallee.setValue.selector, 123)); + mockExecutor.sudoDoExec(IERC7579Account(kernel), mode, data); + assertEq(callee.value(), 123); + if (withHook) { + assertEq(mockHook.data(address(kernel)), abi.encodePacked("hookData")); + assertEq(mockHook.data(address(kernel)), abi.encodePacked("hookData")); + } + } + + function testExecutorUninstall(bool withHook) external whenInitialized { + _installExecutor(withHook); + PackedUserOperation[] memory ops = new PackedUserOperation[](1); + ops[0] = _prepareUserOp( + VALIDATION_TYPE_ROOT, + false, + false, + abi.encodeWithSelector(kernel.uninstallModule.selector, 2, address(mockExecutor), hex""), + true, + true, + false + ); + entrypoint.handleOps(ops, payable(address(0xdeadbeef))); + ExecutorManager.ExecutorConfig memory config = kernel.executorConfig(mockExecutor); + assertEq(address(config.hook), address(0)); + vm.expectRevert(abi.encodeWithSelector(Kernel.InvalidExecutor.selector)); + vm.startPrank(address(mockExecutor)); + kernel.executeFromExecutor( + ExecMode.wrap(bytes32(0)), + ExecLib.encodeSingle(address(callee), 0, abi.encodeWithSelector(MockCallee.setValue.selector, 123)) + ); + vm.stopPrank(); + } + + function testSignatureRoot(bytes32 hash) external whenInitialized { + bytes32 wrappedHash = keccak256(abi.encode(keccak256("Kernel(bytes32 hash)"), hash)); + bytes32 digest = keccak256( + abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.2", address(kernel)), wrappedHash) + ); + bytes memory sig = _rootSignDigest(digest, true); + sig = abi.encodePacked(hex"00", sig); + bytes4 res = kernel.isValidSignature(hash, sig); + assertEq(res, bytes4(0x1626ba7e)); + } + + function testSignatureValidator(bytes32 hash) external whenInitialized { + vm.deal(address(kernel), 1e18); + PackedUserOperation[] memory ops = new PackedUserOperation[](1); + ops[0] = _prepareUserOp( + VALIDATION_TYPE_VALIDATOR, + false, + false, + encodeExecute(address(callee), 0, abi.encodeWithSelector(callee.setValue.selector, 123)), + true, + true, + false + ); + entrypoint.handleOps(ops, payable(address(0xdeadbeef))); + ValidationManager.ValidationConfig memory config = + kernel.validationConfig(ValidatorLib.validatorToIdentifier(enabledValidator)); + assertEq(config.nonce, 1); + assertEq(address(config.hook), address(1)); + assertEq(kernel.currentNonce(), 1); + + bytes32 wrappedHash = keccak256(abi.encode(keccak256("Kernel(bytes32 hash)"), hash)); + bytes32 digest = keccak256( + abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.2", address(kernel)), wrappedHash) + ); + bytes memory sig = _validatorSignDigest(digest, true); + sig = abi.encodePacked(hex"01", address(enabledValidator), sig); + bytes4 res = kernel.isValidSignature(hash, sig); + assertEq(res, bytes4(0x1626ba7e)); + } + + function testSignaturePermission(bytes32 hash) external whenInitialized { + vm.deal(address(kernel), 1e18); + PackedUserOperation[] memory ops = new PackedUserOperation[](1); + ops[0] = _prepareUserOp( + VALIDATION_TYPE_PERMISSION, + false, + false, + encodeExecute(address(callee), 0, abi.encodeWithSelector(callee.setValue.selector, 123)), + true, + true, + false + ); + entrypoint.handleOps(ops, payable(address(0xdeadbeef))); + assertEq(kernel.currentNonce(), 1); + assertEq( + MockSigner(address(permissionConfig.signer)).data(address(kernel)), + abi.encodePacked(bytes32(bytes4(0xdeadbeef)), "signer") + ); + bytes32 wrappedHash = keccak256(abi.encode(keccak256("Kernel(bytes32 hash)"), hash)); + bytes32 digest = keccak256( + abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.2", address(kernel)), wrappedHash) + ); + bytes memory sig = _permissionSignDigest(digest, true); + sig = abi.encodePacked(hex"02", PermissionId.unwrap(enabledPermission), hex"ff", sig); + bytes4 res = kernel.isValidSignature(hash, sig); + assertEq(res, bytes4(0x1626ba7e)); + } + + function testExecuteBatch(uint8 length) external whenInitialized { + vm.startPrank(address(entrypoint)); + ExecMode mode = ExecMode.wrap(LibERC7579.encodeMode(bytes1(0x01), bytes1(0x00), bytes4(0), bytes22(0))); + Execution[] memory execs = new Execution[](length); + uint256 sum = 0; + for (uint256 i = 0; i < length; i++) { + uint256 random = _random() % 10000; + sum += random; + execs[i] = Execution({ + target: address(callee), + value: 0, + callData: abi.encodeWithSelector(MockCallee.addValue.selector, random) + }); + } + bytes memory data = abi.encode(execs); + kernel.execute(mode, data); + assertEq(callee.value(), sum); + } + + /// @dev Returns the EIP-712 domain separator. + function buildChainAgnosticDomainSeparator(address addr, string memory name, string memory version) + private + view + returns (bytes32 separator) + { + // We will use `separator` to store the name hash to save a bit of gas. + bytes32 versionHash; + separator = keccak256(bytes(name)); + versionHash = keccak256(bytes(version)); + bytes32 typeHash = + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); + /// @solidity memory-safe-assembly + assembly { + let m := mload(0x40) // Load the free memory pointer. + mstore(m, typeHash) + mstore(add(m, 0x20), separator) // Name hash. + mstore(add(m, 0x40), versionHash) + mstore(add(m, 0x60), 0x00) // NOTE : user chainId == 0 as eip 7702 did + mstore(add(m, 0x80), addr) + separator := keccak256(m, 0xa0) + } + } + + function chainAgnosticHashTypedData(address addr, string memory name, string memory version, bytes32 structHash) + internal + view + virtual + returns (bytes32 digest) + { + // we don't do cache stuff here + digest = buildChainAgnosticDomainSeparator(addr, name, version); + /// @solidity memory-safe-assembly + assembly { + // Compute the digest. + mstore(0x00, 0x1901000000000000) // Store "\x19\x01". + mstore(0x1a, digest) // Store the domain separator. + mstore(0x3a, structHash) // Store the struct hash. + digest := keccak256(0x18, 0x42) + // Restore the part of the free memory slot that was overwritten. + mstore(0x3a, 0) + } + } +} diff --git a/src/sdk/KernelTestBase.sol b/test/base/KernelTestBase.sol similarity index 98% rename from src/sdk/KernelTestBase.sol rename to test/base/KernelTestBase.sol index ace0fc65..7c53a6cd 100644 --- a/src/sdk/KernelTestBase.sol +++ b/test/base/KernelTestBase.sol @@ -1,11 +1,12 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import "../Kernel.sol"; -import "../factory/KernelFactory.sol"; -import "../factory/FactoryStaker.sol"; +import "src/Kernel.sol"; +import "src/factory/KernelFactory.sol"; +import "src/factory/FactoryStaker.sol"; import "solady_test/utils/TestPlus.sol"; import "forge-std/Test.sol"; +import "../mock/MockCallee.sol"; import "../mock/MockValidator.sol"; import "../mock/MockPolicy.sol"; import "../mock/MockSigner.sol"; @@ -16,33 +17,12 @@ import "../mock/MockFallback.sol"; import "../mock/MockERC20.sol"; import "../mock/MockERC721.sol"; import "../mock/MockERC1155.sol"; -import "../core/ValidationManager.sol"; -import "./TestBase/erc4337Util.sol"; -import "../types/Types.sol"; -import "../types/Structs.sol"; +import "src/core/ValidationManager.sol"; +import "./erc4337Util.sol"; +import "src/types/Types.sol"; +import "src/types/Structs.sol"; import "solady/accounts/LibERC7579.sol"; -contract MockCallee { - uint256 public value; - - event MockEvent(address indexed caller, address indexed here); - - function setValue(uint256 _value) public { - value = _value; - } - - function addValue(uint256 _value) public { - value += _value; - } - - function emitEvent(bool shouldFail) public { - if (shouldFail) { - revert("Hello"); - } - emit MockEvent(msg.sender, address(this)); - } -} - abstract contract KernelTestBase is TestPlus, Test { address stakerOwner; Kernel kernel; diff --git a/src/sdk/TestBase/erc4337Util.sol b/test/base/erc4337Util.sol similarity index 100% rename from src/sdk/TestBase/erc4337Util.sol rename to test/base/erc4337Util.sol diff --git a/src/mock/MockAction.sol b/test/mock/MockAction.sol similarity index 100% rename from src/mock/MockAction.sol rename to test/mock/MockAction.sol diff --git a/test/mock/MockCallee.sol b/test/mock/MockCallee.sol new file mode 100644 index 00000000..edcc99e4 --- /dev/null +++ b/test/mock/MockCallee.sol @@ -0,0 +1,22 @@ +pragma solidity ^0.8.0; + +contract MockCallee { + uint256 public value; + + event MockEvent(address indexed caller, address indexed here); + + function setValue(uint256 _value) public { + value = _value; + } + + function addValue(uint256 _value) public { + value += _value; + } + + function emitEvent(bool shouldFail) public { + if (shouldFail) { + revert("Hello"); + } + emit MockEvent(msg.sender, address(this)); + } +} diff --git a/src/mock/MockERC1155.sol b/test/mock/MockERC1155.sol similarity index 100% rename from src/mock/MockERC1155.sol rename to test/mock/MockERC1155.sol diff --git a/src/mock/MockERC20.sol b/test/mock/MockERC20.sol similarity index 100% rename from src/mock/MockERC20.sol rename to test/mock/MockERC20.sol diff --git a/src/mock/MockERC721.sol b/test/mock/MockERC721.sol similarity index 100% rename from src/mock/MockERC721.sol rename to test/mock/MockERC721.sol diff --git a/src/mock/MockExecutor.sol b/test/mock/MockExecutor.sol similarity index 85% rename from src/mock/MockExecutor.sol rename to test/mock/MockExecutor.sol index 7f286e37..abc46782 100644 --- a/src/mock/MockExecutor.sol +++ b/test/mock/MockExecutor.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {IExecutor} from "../interfaces/IERC7579Modules.sol"; -import {IERC7579Account, ExecMode} from "../interfaces/IERC7579Account.sol"; +import {IExecutor} from "src/interfaces/IERC7579Modules.sol"; +import {IERC7579Account, ExecMode} from "src/interfaces/IERC7579Account.sol"; contract MockExecutor is IExecutor { mapping(address => bytes) public data; diff --git a/src/mock/MockFallback.sol b/test/mock/MockFallback.sol similarity index 85% rename from src/mock/MockFallback.sol rename to test/mock/MockFallback.sol index 167dddab..a154d3b8 100644 --- a/src/mock/MockFallback.sol +++ b/test/mock/MockFallback.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {IERC7579Account} from "../interfaces/IERC7579Account.sol"; -import {IFallback} from "../interfaces/IERC7579Modules.sol"; -import {CallType, ExecType, ExecMode} from "../types/Types.sol"; -import {ExecLib} from "../utils/ExecLib.sol"; -import {EXEC_MODE_DEFAULT} from "../types/Constants.sol"; +import {IERC7579Account} from "src/interfaces/IERC7579Account.sol"; +import {IFallback} from "src/interfaces/IERC7579Modules.sol"; +import {CallType, ExecType, ExecMode} from "src/types/Types.sol"; +import {ExecLib} from "src/utils/ExecLib.sol"; +import {EXEC_MODE_DEFAULT} from "src/types/Constants.sol"; contract Callee { address public lastCaller; diff --git a/src/mock/MockHook.sol b/test/mock/MockHook.sol similarity index 95% rename from src/mock/MockHook.sol rename to test/mock/MockHook.sol index 912c7c76..da2fb400 100644 --- a/src/mock/MockHook.sol +++ b/test/mock/MockHook.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {IHook} from "../interfaces/IERC7579Modules.sol"; +import {IHook} from "src/interfaces/IERC7579Modules.sol"; contract MockHook is IHook { mapping(address => bytes) public data; diff --git a/src/mock/MockPolicy.sol b/test/mock/MockPolicy.sol similarity index 91% rename from src/mock/MockPolicy.sol rename to test/mock/MockPolicy.sol index a4a9fdd8..9108ec5a 100644 --- a/src/mock/MockPolicy.sol +++ b/test/mock/MockPolicy.sol @@ -2,8 +2,8 @@ pragma solidity ^0.8.0; -import {IPolicy} from "../interfaces/IERC7579Modules.sol"; -import {PackedUserOperation} from "../interfaces/PackedUserOperation.sol"; +import {IPolicy} from "src/interfaces/IERC7579Modules.sol"; +import {PackedUserOperation} from "src/interfaces/PackedUserOperation.sol"; import "forge-std/console.sol"; contract MockPolicy is IPolicy { diff --git a/src/mock/MockSigner.sol b/test/mock/MockSigner.sol similarity index 97% rename from src/mock/MockSigner.sol rename to test/mock/MockSigner.sol index f082a330..5d76f18b 100644 --- a/src/mock/MockSigner.sol +++ b/test/mock/MockSigner.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; -import "../interfaces/IERC7579Modules.sol"; +import "src/interfaces/IERC7579Modules.sol"; contract MockSigner is ISigner { mapping(address wallet => bytes) public data; diff --git a/src/mock/MockValidator.sol b/test/mock/MockValidator.sol similarity index 97% rename from src/mock/MockValidator.sol rename to test/mock/MockValidator.sol index 96677dca..997fb4ff 100644 --- a/src/mock/MockValidator.sol +++ b/test/mock/MockValidator.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; -import "../interfaces/IERC7579Modules.sol"; +import "src/interfaces/IERC7579Modules.sol"; contract MockValidator is IValidator, IHook { mapping(address => bool) public initialized; diff --git a/test/mock/MockValidatorLib.sol b/test/mock/MockValidatorLib.sol new file mode 100644 index 00000000..797caacc --- /dev/null +++ b/test/mock/MockValidatorLib.sol @@ -0,0 +1,56 @@ +pragma solidity ^0.8.0; + +import "../../src/core/ValidationManager.sol"; +import "forge-std/Test.sol"; + +contract MockValidatorLib { + function encodeFlag(bool skipUserOp, bool skipSignature) external pure returns (PassFlag flag) { + return ValidatorLib.encodeFlag(skipUserOp, skipSignature); + } + + function encodeAsNonce( + bytes1 mode, + bytes1 vType, + bytes20 validatorIdentifierWithoutType, + uint16 nonceKey, + uint64 nonce + ) external pure returns (uint256 res) { + return ValidatorLib.encodeAsNonce(mode, vType, validatorIdentifierWithoutType, nonceKey, nonce); + } + + function encodeAsNonceKey(bytes1 mode, bytes1 vType, bytes20 validatorIdentifierWithoutType, uint16 nonceKey) + external + pure + returns (uint192 res) + { + return ValidatorLib.encodeAsNonceKey(mode, vType, validatorIdentifierWithoutType, nonceKey); + } + + function decodeNonce(uint256 nonce) + external + pure + returns (ValidationMode mode, ValidationType vType, ValidationId identifier) + { + return ValidatorLib.decodeNonce(nonce); + } + + function validatorToIdentifier(IValidator validator) external pure returns (ValidationId vId) { + return ValidatorLib.validatorToIdentifier(validator); + } + + function getType(ValidationId validator) external pure returns (ValidationType vType) { + return ValidatorLib.getType(validator); + } + + function getValidator(ValidationId validator) external pure returns (IValidator v) { + return ValidatorLib.getValidator(validator); + } + + function getPolicy(PolicyData data) external pure returns (IPolicy vId) { + return ValidatorLib.getPolicy(data); + } + + function getPermissionId(ValidationId validation) external pure returns (PermissionId vId) { + return ValidatorLib.getPermissionId(validation); + } +} From 88d20d3e777674455e2f09f135991c18c1f3c65d Mon Sep 17 00:00:00 2001 From: leekt Date: Thu, 6 Feb 2025 14:30:22 +0900 Subject: [PATCH 02/14] removed console --- src/Kernel.sol | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/Kernel.sol b/src/Kernel.sol index ef78b381..3f4f9d44 100644 --- a/src/Kernel.sol +++ b/src/Kernel.sol @@ -51,8 +51,6 @@ import {InstallExecutorDataFormat, InstallFallbackDataFormat, InstallValidatorDa import {ECDSA} from "solady/utils/ECDSA.sol"; -import "forge-std/console.sol"; - contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager { error ExecutionReverted(); error InvalidExecutor(); @@ -101,10 +99,6 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager } } - function mockCode() external { - console.logBytes(address(this).code); - } - function initialize( ValidationId _rootValidator, IHook hook, From 234e3b660d4e4ae5d9af1e4932af7496894d58a7 Mon Sep 17 00:00:00 2001 From: leekt Date: Fri, 7 Feb 2025 20:26:29 +0900 Subject: [PATCH 03/14] optimizing code size --- .../DeployKernel.s.sol/911867/run-latest.json | 75 +++++++++++++++++++ foundry.toml | 4 +- src/Kernel.sol | 27 ++----- src/core/ValidationManager.sol | 14 +++- test/base/Kernel7702TestBase.sol | 8 -- 5 files changed, 95 insertions(+), 33 deletions(-) create mode 100644 broadcast/DeployKernel.s.sol/911867/run-latest.json diff --git a/broadcast/DeployKernel.s.sol/911867/run-latest.json b/broadcast/DeployKernel.s.sol/911867/run-latest.json new file mode 100644 index 00000000..1771d650 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/911867/run-latest.json @@ -0,0 +1,75 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0x8768fa84bd76610acc6af35b578fe847e1cff0ca", + "function": null, + "arguments": [ + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x706a31", + "value": "0x0", + "input": "0x00000000000000000000000000000000000000000000000000000000000000006101408060405234610203576020816160f580380380916100208285610207565b83398101031261020357516001600160a01b038116810361020357306080524660a05260a0604051610053604082610207565b6006815260208101906512d95c9b995b60d21b825260405191610077604084610207565b60058352602083019164181719971960d91b8352519020915190208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260208301526040820152466060820152306080820152206101005261012052604051602081019063deadbeef60e01b825260048152610101602482610207565b5190516001600160581b031981169190601582106101e3575b7f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f80546001600160a81b031916605885901c179055604051615eb6908161023f823960805181614873015260a05181614896015260c05181614906015260e0518161492c015261010051816148520152610120518181816103b4015281816106bd0152818161086301528181610abf01528181610e3e01528181611156015281816112ca015281816113200152818161184d0152818161197d015281816126b901526131300152f35b6001600160581b031960159290920360031b82901b161690505f8061011a565b5f80fd5b601f909101601f19168101906001600160401b0382119082101761022a57604052565b634e487b7160e01b5f52604160045260245ffdfe6080604052600436101561001d575b36612fde5761001b612fad565b005b5f3560e01c8063112d3a7d1461020c578063150b7a02146102075780631626ba7e1461020257806319822f7c146101fd5780631f1b92e3146101f85780633659cfe6146101f35780633c3b752b146101ee57806352141cd9146101e957806357b3a5f4146101e45780636e6fa0c6146101df578063721e67f4146101da57806384b0196e146101d55780638dd7712f146101d057806390ef8862146101cb5780639198bdf5146101c65780639517e29f146101c15780639cfd7cff146101bc578063a65d69d4146101b7578063a71763a8146101b2578063adb610a3146101ad578063b8afe17d146101a8578063bc197c81146101a3578063c3e589781461019e578063d03c791414610199578063d691c96414610194578063e6f3d50a1461018f578063e9ae5c531461018a578063f1f7f0f914610185578063f23a6e6114610180578063f2dc691d1461017b5763fc9c5dec0361000e57611b32565b611b14565b611aba565b611a84565b611956565b6117d8565b6116f6565b6116a9565b6115d6565b6114c5565b611459565b611427565b6112f9565b6112b5565b61125d565b61112f565b611018565b610f09565b610e0e565b610d70565b610cea565b610c8f565b610bdc565b610a3e565b6109a8565b61082d565b610685565b610380565b61031f565b6102c5565b61029f565b6001600160a01b0381160361022257565b5f80fd5b359061023182610211565b565b9181601f84011215610222578235916001600160401b038311610222576020838186019501011161022257565b6060600319820112610222576004359160243561027c81610211565b91604435906001600160401b0382116102225761029b91600401610233565b9091565b346102225760206102bb6102b236610260565b92919091611d85565b6040519015158152f35b34610222576080366003190112610222576102e1600435610211565b6102ec602435610211565b6064356001600160401b0381116102225761030b903690600401610233565b5050604051630a85bd0160e11b8152602090f35b34610222576040366003190112610222576004356024356001600160401b0381116102225760209161035861035e923690600401610233565b91611f4a565b6040516001600160e01b03199091168152f35b90816101209103126102225790565b6060366003190112610222576004356001600160401b038111610222576103ab903690600401610371565b602435604435917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610652576103ef6020820135613408565b9092919084836001600160f81b0319861615610639575b826104119394613601565b9361043661042661042184611d17565b61214e565b946001600160f81b031916151590565b9384806105f8575b6105e957602001516001600160a01b0316801591819083806105e2575b6104e257600192610476610495925f525f60205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b149081156105da575b501561054d57826104f1575b50506104e257816104cc925b6104d0575b506040519081529081906020820190565b0390f35b3490349034903490335af1505f6104bb565b631a0a9b9f60e21b5f5260045ffd5b61054692506105429161052661052061051a61050f61053b95611d4e565b93606081019061217a565b90611b92565b90611ce1565b63ffffffff60e01b165f5260205260405f2090565b5460ff1690565b1590565b5f806104aa565b829192916105a7575b506104e25761051a81606061056c93019061217a565b638dd7712f60e01b916001600160e01b03199161058891611ce1565b160361059857816104cc926104b6565b63dbbb044b60e01b5f5260045ffd5b6105d4915061053b6105bb61054292611d4e565b6105266105206105ce606088018861217a565b90611b81565b5f610556565b90505f61049e565b508661045b565b633ab3447f60e11b5f5260045ffd5b50805163ffffffff1663ffffffff6106316106285f516020615e965f395f51905f525463ffffffff9060c81c1690565b63ffffffff1690565b91161061043e565b5f516020615e965f395f51905f525460581b9250610406565b6348f5c3ed60e01b5f5260045ffd5b6004359063ffffffff8216820361022257565b359063ffffffff8216820361022257565b602036600319011261022257610699610661565b6106ba6106b45f516020615e965f395f51905f525460581b90565b60581c90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610823575b156108195760405163ecd0596160e01b81526004808201526001600160a01b039190911690602081602481855afa9081156107bd575f916107ea575b50156106525760405163d68f602560e01b8152915f838061074f36343360048501612241565b038183865af19283156107bd575f936107c2575b5061076d9061389c565b803b1561022257604051630b9dfbed60e11b8152915f9183918290849082906107999060048301612266565b03925af180156107bd576107a957005b806107b75f61001b93610fc1565b80610d42565b611f3f565b61076d9193506107e3903d805f833e6107db8183610fc1565b8101906121df565b9290610763565b61080c915060203d602011610812575b6108048183610fc1565b8101906121ac565b5f610729565b503d6107fa565b5061001b9061389c565b50303314156106ed565b60203660031901126102225760043561084581610211565b6108606106b45f516020615e965f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061095c575b156109525760405163ecd0596160e01b81526004808201526001600160a01b039190911690602081602481855afa9081156107bd575f91610933575b50156106525760405163d68f602560e01b8152915f83806108f536343360048501612241565b038183865af19283156107bd575f93610913575b5061076d90612277565b61076d91935061092c903d805f833e6107db8183610fc1565b9290610909565b61094c915060203d602011610812576108048183610fc1565b5f6108cf565b5061001b90612277565b5030331415610893565b6001600160581b031981160361022257565b9181601f84011215610222578235916001600160401b038311610222576020808501948460051b01011161022257565b346102225760a0366003190112610222576004356109c581610966565b6024356109d181610211565b6044356001600160401b038111610222576109f0903690600401610233565b6064939193356001600160401b03811161022257610a12903690600401610233565b91608435956001600160401b03871161022257610a3661001b973690600401610978565b969095612420565b608036600319011261022257600435610a5681610966565b602435610a6281610211565b6044356001600160401b03811161022257610a81903690600401610233565b6064356001600160401b03811161022257610aa0903690600401610233565b91610abc6106b45f516020615e965f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610bc0575b15610bb15760405163ecd0596160e01b81526004808201526001600160a01b03919091169490602081602481895afa9081156107bd575f91610b92575b50156106525760405163d68f602560e01b8152955f8780610b5236343360048501612241565b0381838a5af19687156107bd575f97610b72575b5061076d95969761258f565b61076d969750610b8b903d805f833e6107db8183610fc1565b9695610b66565b610bab915060203d602011610812576108048183610fc1565b5f610b2c565b50919361001b9593919361258f565b5030331415610aef565b6001600160e01b031981160361022257565b34610222576020366003190112610222576104cc610c1d600435610bff81610bca565b5f60408051610c0d81610f4f565b8281528260208201520152611e77565b600160405191610c2c83610f4f565b805460a083901b839003168084529101546001600160a01b0380821660208086019182526001600160f81b031960589490941b84166040968701908152865195841686529151909216918401919091525116918101919091529081906060820190565b3461022257604036600319011261022257602060ff610cde600435610cb381610966565b610cc860243591610cc383610bca565b611d4e565b9063ffffffff60e01b165f5260205260405f2090565b54166040519015158152f35b34610222576020366003190112610222576020610d1f600435610d0c81610211565b5f604051610d1981610f6f565b5261318c565b60405190610d2c82610f6f565b546001600160a01b031690819052604051908152f35b5f91031261022257565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b34610222575f36600319011261022257610daf610dbd610d8e613bce565b604092919251938493600f60f81b855260e0602086015260e0850190610d4c565b908382036040850152610d4c565b4660608301523060808301525f60a083015281810360c083015260206060519182815201906080905f5b818110610df5575050500390f35b8251845285945060209384019390920191600101610de7565b6040366003190112610222576004356001600160401b03811161022257610e39903690600401610371565b6024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610652575f908152602081905260409020546001600160a01b03169060609060018314159081610ed9575b610eae610ea7826060610eb594019061217a565b8091611ba0565b9030613cb6565b5015610eca57610ec157005b61001b91613cdb565b63f21e646b60e01b5f5260045ffd5b9150610eb5610eae610ea7610eff610ef7610ea7606088018861217a565b903489613c6b565b9492505050610e93565b34610222575f36600319011261022257602063ffffffff5f516020615e965f395f51905f525460c81c16604051908152f35b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b03821117610f6a57604052565b610f3b565b602081019081106001600160401b03821117610f6a57604052565b604081019081106001600160401b03821117610f6a57604052565b61012081019081106001600160401b03821117610f6a57604052565b90601f801991011681019081106001600160401b03821117610f6a57604052565b60405190610231604083610fc1565b6040519061023161012083610fc1565b6001600160401b038111610f6a5760051b60200190565b6080366003190112610222576004356001600160401b03811161022257611043903690600401610978565b602435916001600160401b038311610222573660238401121561022257826004013561106e81611001565b9361107c6040519586610fc1565b8185526024602086019260061b8201019036821161022257602401915b8183106110ee575050506044356001600160401b038111610222576110c2903690600401610978565b90606435946001600160401b038611610222576110e661001b963690600401610978565b959094612694565b604083360312610222576020604091825161110881610f8a565b61111186610674565b81528286013561112081610211565b83820152815201920191611099565b61113836610260565b6111536106b45f516020615e965f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611253575b156112485760405163ecd0596160e01b81526004808201526001600160a01b03919091169290602081602481875afa9081156107bd575f91611229575b50156106525760405163d68f602560e01b8152935f85806111e936343360048501612241565b038183885af19485156107bd575f95611209575b5061076d939495612861565b61076d949550611222903d805f833e6107db8183610fc1565b94936111fd565b611242915060203d602011610812576108048183610fc1565b5f6111c3565b509161001b93612861565b5030331415611186565b34610222575f366003190112610222576104cc60405161127e604082610fc1565b601681527535b2b93732b61730b23b30b731b2b2173b181719971960511b6020820152604051918291602083526020830190610d4c565b34610222575f366003190112610222576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b61130236610260565b61131d6106b45f516020615e965f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061141d575b156114125760405163ecd0596160e01b81526004808201526001600160a01b03919091169290602081602481875afa9081156107bd575f916113f3575b50156106525760405163d68f602560e01b8152935f85806113b336343360048501612241565b038183885af19485156107bd575f956113d3575b5061076d939495612b99565b61076d9495506113ec903d805f833e6107db8183610fc1565b94936113c7565b61140c915060203d602011610812576108048183610fc1565b5f61138d565b509161001b93612b99565b5030331415611350565b34610222575f36600319011261022257602063ffffffff5f516020615e965f395f51905f525460a81c16604051908152f35b3461022257602036600319011261022257604061148960043561147b81610966565b611483612d92565b50611d17565b81519061149582610f8a565b5463ffffffff81168083526001600160a01b03602092831c81169383019384528451918252925190921690820152f35b346102225760a0366003190112610222576114e1600435610211565b6114ec602435610211565b6044356001600160401b0381116102225761150b903690600401610978565b50506064356001600160401b0381116102225761152c903690600401610978565b50506084356001600160401b0381116102225761154d903690600401610233565b505060405163bc197c8160e01b8152602090f35b602080825282516001600160f01b03191681830152808301516001600160a01b03166040808401919091529092015160608083015280516080830181905260a09092019201905f5b8181106115b65750505090565b82516001600160501b0319168452602093840193909201916001016115a9565b34610222576020366003190112610222576116156004356115f681610bca565b60606040805161160581610f4f565b5f81525f60208201520152611ead565b60016040519161162483610f4f565b805461ffff60f01b8160f01b168452828060a01b039060101c16602084015201906040519182602082549182815201915f5260205f20905f5b818110611686576104cc858761167581880382610fc1565b604082015260405191829182611561565b825460501b6001600160501b03191684526020909301926001928301920161165d565b346102225760203660031901126102225760206102bb600435612daa565b9060406003198301126102225760043591602435906001600160401b0382116102225761029b91600401610233565b6116ff366116c7565b90916001600160a01b036117123361318c565b54169182156117c957606090600184141594856117b2575b6117349293614552565b926117a2575b50506040518091602082016020835281518091526040830190602060408260051b8601019301915f905b82821061177357505050500390f35b919360019193955060206117928192603f198a82030186528851610d4c565b9601920192018594939192611764565b6117ab91613cdb565b5f8061173a565b61173492506117c2363487613c12565b925061172a565b63710c949760e01b5f5260045ffd5b6060366003190112610222576004356117f081610966565b6024356001600160401b0381116102225761180f903690600401610233565b6044356001600160401b0381116102225761182e903690600401610233565b9061184a6106b45f516020615e965f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061194c575b1561193f5760405163ecd0596160e01b81526004808201526001600160a01b03919091169390602081602481885afa9081156107bd575f91611920575b50156106525760405163d68f602560e01b8152945f86806118e036343360048501612241565b038183895af19586156107bd575f96611900575b5061076d949596612e82565b61076d959650611919903d805f833e6107db8183610fc1565b95946118f4565b611939915060203d602011610812576108048183610fc1565b5f6118ba565b5091909261001b94612e82565b503033141561187d565b61195f366116c7565b61197a6106b45f516020615e965f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611a7a575b15611a6f5760405163ecd0596160e01b81526004808201526001600160a01b03919091169190602081602481865afa9081156107bd575f91611a50575b50156106525760405163d68f602560e01b8152925f8480611a1036343360048501612241565b038183875af19384156107bd575f94611a30575b5061076d929394612e97565b61076d939450611a49903d805f833e6107db8183610fc1565b9392611a24565b611a69915060203d602011610812576108048183610fc1565b5f6119ea565b509061001b92612e97565b50303314156119ad565b34610222575f3660031901126102225760205f516020615e965f395f51905f525460581b604051906001600160581b0319168152f35b346102225760a036600319011261022257611ad6600435610211565b611ae1602435610211565b6084356001600160401b03811161022257611b00903690600401610233565b505060405163f23a6e6160e01b8152602090f35b346102225760203660031901126102225760206102bb600435612ea2565b34610222576040366003190112610222576004356001600160401b03811161022257611b79611b676020923690600401610371565b60243590611b7482610211565b612eaf565b604051908152f35b906008116102225760040190600490565b906004116102225790600490565b909291928360041161022257831161022257600401916003190190565b906020116102225790602090565b90929192836020116102225783116102225760200191601f190190565b906018116102225760040190601490565b906014116102225790601490565b909291928360011161022257831161022257600101915f190190565b906009116102225760010190600890565b909291928360091161022257831161022257600901916008190190565b906016116102225790601690565b906016116102225760020190601490565b909291928360161161022257831161022257601601916015190190565b906002116102225790600290565b909291928360141161022257831161022257601401916013190190565b90602c116102225760180190601490565b90939293848311610222578411610222578101920390565b356001600160e01b0319811692919060048210611cfc575050565b6001600160e01b031960049290920360031b82901b16169150565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85060205260405f2090565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85160205260405f2090565b90929060018103611dd457506001600160a01b0392611dce9250611dbe915060581b600160581b600160f81b0316600160f81b17611d17565b5460201c6001600160a01b031690565b16151590565b60028103611e1457506001600160a01b0392611dce9250611e089150611dfb90841661318c565b546001600160a01b031690565b6001600160a01b031690565b600303611e5457611e35611e30610520600193611e4395611b92565b611e77565b01546001600160a01b031690565b6001600160a01b0390811691161490565b5050505f90565b359060208110611e69575090565b5f199060200360031b1b1690565b63ffffffff60e01b165f527f7c341349a4360fdd5d5bc07e69f325dc6aaea3eb018b3e0ea7e53cc0bb0d6f3b60205260405f2090565b63ffffffff60e01b165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85260205260405f2090565b908160209103126102225751611ef881610bca565b90565b908060209392818452848401375f828201840152601f01601f1916010190565b611ef8949260609260018060a01b0316825260208201528160408201520191611efb565b6040513d5f823e3d90fd5b91611f54916131c4565b919080836001600160f81b031984161561212e575b602081101591826120f1575b826120db575b506001600160a01b039050611f95611e08611dbe86611d17565b1615806120c8575b6104e2576001600160f81b03198316600160f81b036120305790611fc86020949392611fe696613216565b604051637aa8f17760e11b8152958694859384933360048601611f1b565b039160581c6001600160a01b03165afa9081156107bd575f91612007575090565b611ef8915060203d602011612029575b6120218183610fc1565b810190611ee3565b503d612017565b92916001600160f81b03198116600160f91b036120925760081b93600160f11b61207361206661205f88611ead565b5460f01b90565b6001600160f01b03191690565b1661208357611ef8943390613354565b635b71057960e01b5f5260045ffd5b929391929091906001600160f81b0319166120b957611ef8936120b491613216565b613270565b6361c4e91b60e11b5f5260045ffd5b506001600160f81b031983161515611f9d565b819295506120e99350611bcb565b925f80611f7b565b91507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a6121276121218385611bbd565b90611e5b565b1491611f75565b92506121485f516020615e965f395f51905f525460581b90565b92611f69565b9060405161215b81610f8a565b915463ffffffff81168352602090811c6001600160a01b031690830152565b903590601e198136030182121561022257018035906001600160401b0382116102225760200191813603831361022257565b90816020910312610222575180151581036102225790565b6001600160401b038111610f6a57601f01601f191660200190565b602081830312610222578051906001600160401b038211610222570181601f8201121561022257805190612212826121c4565b926122206040519485610fc1565b8284526020838301011161022257815f9260208093018386015e8301015290565b611ef8939260609260018060a01b03168252602082015281604082015201905f611efb565b906020611ef8928181520190610d4c565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556001600160a01b03167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2565b604051906122d9602083610fc1565b5f8252565b90813b5f6122eb826121c4565b936122f96040519586610fc1565b82855260208501903c565b80516020909101516001600160f01b0319811692919060028210612326575050565b6001600160f01b031960029290920360031b82901b16169150565b1561234857565b60405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606490fd5b5f516020615e965f395f51905f52805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b634e487b7160e01b5f52603260045260245ffd5b908210156123df5761029b9160051b81019061217a565b6123b4565b908092918237015f815290565b3d1561241b573d90612402826121c4565b916124106040519384610fc1565b82523d5f602084013e565b606090565b94939291909695966001600160581b031961245961244c5f516020615e965f395f51905f525460581b90565b6001600160581b03191690565b161580612561575b61246a90612341565b6001600160581b03198616156104e2576001600160f81b03198616600160f81b141580612549575b6120b957856124a36124f097613946565b6124c46124ae610fe2565b60018152925b6001600160a01b03166020840152565b5f516020615e965f395f51905f52805463ffffffff60a81b1916600160a81b1790556139ac565b6139ac565b5f5b8181106124fe57505050565b5f8061250b8385876123c8565b9061251b604051809381936123e4565b039082305af16125296123f1565b5015612537576001016124f2565b636534eae560e11b5f5260045260245ffd5b506001600160f81b03198616600160f91b1415612492565b5061246a61ef0160f01b6001600160f01b0319612585612580306122de565b612304565b1614159050612461565b94939291906001600160581b03198616156104e2576001600160f81b03198616600160f81b14158061263a575b6120b9576125c986613946565b6001600160a01b036125dd611dbe88611d17565b16156125ec575b505050505050565b61262f956124eb6126125f516020615e965f395f51905f525463ffffffff9060a81c1690565b926124b460405194612625604087610fc1565b63ffffffff168552565b5f80808080806125e4565b506001600160f81b03198616600160f91b14156125bc565b9060405161265f81610f4f565b82546001600160a01b03908116825260019390930154928316602082015260589290921b6001600160f81b0319166040830152565b959294919390946126b66106b45f516020615e965f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580612806575b156127f75760405163ecd0596160e01b81526004808201526001600160a01b039190911695906020816024818a5afa9081156107bd575f916127d8575b50156106525760405163d68f602560e01b8152965f888061274c36343360048501612241565b0381838b5af19788156107bd575f986127b8575b5061276c969798613d54565b803b1561022257604051630b9dfbed60e11b8152915f9183918290849082906127989060048301612266565b03925af180156107bd576127aa575b50565b806107b75f61023193610fc1565b61276c9798506127d1903d805f833e6107db8183610fc1565b9796612760565b6127f1915060203d602011610812576108048183610fc1565b5f612726565b50919390929461023196613d54565b50303314156126e9565b916020611ef8938181520191611efb565b356bffffffffffffffffffffffff19811692919060148210612841575050565b6bffffffffffffffffffffffff1960149290920360031b82901b16169150565b9091600182036129dd575f516020615e565f395f51905f5293906054600160f81b600160581b600160f81b03605887901b1617916128ab6128a184611d17565b5463ffffffff1690565b5f516020615e965f395f51905f525460a81c63ffffffff169063ffffffff8083169116146129c5575b5061293d612916611e0861291061290a6129035f516020615e965f395f51905f525463ffffffff9060a81c1690565b9886611bf9565b90612821565b60601c90565b61292d612921610fe2565b63ffffffff9097168752565b6001600160a01b03166020860152565b612968601482019461294f868061217a565b61295f603486949394018961217a565b939092886139ac565b01916004612976848361217a565b9050146129a4575b5050505b604080519182526001600160a01b03909216602082015290819081015b0390a1565b61052061051a6129bd946129b79361217a565b9061419d565b5f808061297e565b6129d79060010163ffffffff16612383565b5f6128d4565b60028203612a455780612a3a5f516020615e565f395f51905f52956034612a14611e0861291061290a6014612a4099019588611bf9565b93612a3385612a23858061217a565b906001600160a01b038c1661410c565b019061217a565b91613f49565b612982565b60038203612abb5780612a3a5f516020615e565f395f51905f52956038612ab3611e0861291061290a6018612a40990195612aad8c8a612a9b611e0861291061290a87612a956105208288611b92565b95611be8565b612aa58b8061217a565b939092613dc1565b88611be8565b93019061217a565b600482148015612b59575b8015612b4f575b15612b40576001600160a01b03831693843b1561022257612b07945f92836040518098819582946306d61fe760e41b845260048401612810565b03925af19283156107bd575f516020615e565f395f51905f5293612b2c575b50612982565b806107b75f612b3a93610fc1565b5f612b26565b631092ef5760e11b5f5260045ffd5b5060068214612acd565b5060058214612ac6565b929192612b6f826121c4565b91612b7d6040519384610fc1565b829481845281830111610222578281602093845f960137010152565b909160018203612bf4575f516020615e765f395f51905f5293612bd291600160f81b600160581b600160f81b03605887901b16176143f1565b50604080519182526001600160a01b039092166020820152908190810161299f565b60028203612c1e575f516020615e765f395f51905f5293612b26916001600160a01b03851661436e565b60038203612c565780612c508580612c4a6105205f516020615e765f395f51905f5299612b2697611b92565b93611ba0565b916142c0565b60048203612ce657612cb3612b26915f516020615e765f395f51905f5295612c8c5f516020615e965f395f51905f525460581b90565b612c98611dbe82611d17565b6001600160a01b03888116911614612cb9575b503691612b63565b83614202565b612cc5612ce091611d17565b8054640100000000600160c01b031916640100000000179055565b5f612cab565b60058203612d6b575f516020615e965f395f51905f525460581b612d0d6121218684611bbd565b906001600160f81b03198116600160f91b14612d43575b5050612cb3612b26915f516020615e765f395f51905f52953691612b63565b60081b6001600160e01b03191614612d5c575f80612d24565b6313002bdd60e31b5f5260045ffd5b60068203612b40575f516020615e965f395f51905f525460581b612d0d6121218684611bbd565b60405190612d9f82610f8a565b5f6020838281520152565b612dbe818060081b918160301b9160501b90565b929091906001600160f81b03198116600160f81b14159081612e6e575b81612e59575b81612e40575b50611e545760ff60f81b16600160f81b8114159081612e36575b50612e30576001600160e01b031916612e2b576001600160501b031916612e2757600190565b5f90565b505f90565b50505f90565b905015155f612e01565b6001600160f81b031916607f60f91b141590505f612de7565b6001600160f81b031980821614159150612de1565b6001600160f81b0319811615159150612ddb565b91612e92916102319594936143f1565b614771565b906127a79291614552565b60071115612e2757600190565b612f6b90612fa790612eca6001600160a01b03823516611e08565b90612f796020820135612f6b612eec612ee6604086018661217a565b90614803565b93612efd612ee6606083018361217a565b90608081013560a082013590612f1f612ee660c08501359460e081019061217a565b93604051988997602089019b8c94919260e0969399989794919961010087019a60018060a01b03168752602087015260408601526060850152608084015260a083015260c08201520152565b03601f198101835282610fc1565b51902060408051602081019283526001600160a01b03909516908501525f6060850152929182906080820190565b51902090565b7f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460408051338152346020820152a1565b612ffa612ff55f356001600160e01b031916611e77565b612652565b80516001600160a01b0390613010908216611e08565b161561317d5780516060906001600160a01b039061302f908216611e08565b1660018114158061316c575b15613120575050805161305a906001600160a01b031636903490613c12565b60408201516001600160f81b031916806130e057506020820151613086906001600160a01b031661480e565b92905b156130d857516001600160a01b031690600182141582816130c3575b506130b3575b825160208401f35b6130bc91613cdb565b5f806130ab565b6001600160a01b03908116141590505f6130a5565b825160208401fd5b6001600160f81b03199081160361311157602082015161310a906001600160a01b03163690613c91565b9290613089565b632d6a6bb760e01b5f5260045ffd5b6001600160a01b030361305a57337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461305a576348f5c3ed60e01b5f5260045ffd5b506001600160a01b0381141561303b565b631cd4b64760e21b5f5260045ffd5b6001600160a01b03165f9081527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b866020526040902090565b9182358060f81c805f1461320857806001146131fb576002146131e5575f80fd5b6001600160d81b03191692600501916004190190565b5092601501916014190190565b505060015f9301915f190190565b60405160208101917f1547321c374afde8a591d972a084b071c594c275e36724931ff96c25f2999c838352604082015260408152613255606082610fc1565b519020901561326757611ef890614962565b611ef890614850565b919061327d913691612b63565b604051916020820191805180604014613308576041146132aa5750505050505b638baa579f5f526004601cfd5b80606060409201515f1a60205201516060525b5f52516040526020600160805f825afa51905f6060526040523d6132e257505061329d565b6001600160a01b031630036132fc57630b135d3f60e11b90565b6001600160e01b031990565b506040015160ff81901c601b016020526001600160ff1b03166060526132bd565b9092608092611ef89694835260018060a01b0316602083015260408201528160608201520191611efb565b61336d65ffffffffffff939561337997958785856149d7565b96929591989098614ac6565b50911642109081156133f6575b506133e25761339a6133c491602097613216565b60405163392dffaf60e01b8152978896879586959193916001600160e01b03191660048701613329565b03916001600160a01b03165afa9081156107bd575f91612007575090565b506001600160e01b03199695505050505050565b65ffffffffffff91501642115f613386565b90818060081b9160ff839260f01c1660021461342057565b6001600160d81b031983169150565b9080601f8301121561022257816020611ef893359101612b63565b9190916101208184031261022257613460610ff1565b9261346a82610226565b84526020820135602085015260408201356001600160401b038111610222578161349591840161342f565b604085015260608201356001600160401b03811161022257816134b991840161342f565b60608501526080820135608085015260a082013560a085015260c082013560c085015260e08201356001600160401b03811161022257816134fb91840161342f565b60e08501526101008201356001600160401b0381116102225761351e920161342f565b610100830152565b90816020910312610222575190565b80516001600160a01b03168252611ef891602082015160208201526101006135b661358661357460408601516101206040870152610120860190610d4c565b60608601518582036060870152610d4c565b6080850151608085015260a085015160a085015260c085015160c085015260e085015184820360e0860152610d4c565b92015190610100818403910152610d4c565b9392916135e5906040928652606060208701526060860190613535565b930152565b9291906135e5602091604086526040860190613535565b9290925f92613610368261344a565b9161361f61010083018361217a565b918193835f9360208210158061383b575b6137fc575b5050506001600160f81b031916600160f81b145b6137d5575b506001600160f81b03198616600160f81b036136e5575050604051639700320360e01b815293602092859283915f91839161368c91600484016135ea565b039260581c6001600160a01b03165af19081156107bd57611ef8925f926136b4575b50614f1d565b6136d791925060203d6020116136de575b6136cf8183610fc1565b810190613526565b905f6136ae565b503d6136c5565b909491939092916001600160f81b03198116600160f91b036137965760081b93600160f01b61371961206661205f88611ead565b16613787575f61373961373360209661376399858a614d3e565b94614f1d565b604051630ccab7a160e01b8152979096889586948593926001600160e01b031916600485016135c8565b03926001600160a01b03165af19081156107bd57611ef8925f926136b45750614f1d565b6314b9743f60e01b5f5260045ffd5b919350506001600160f81b0319166120b957630b135d3f60e11b926001600160e01b0319926137c6929190613270565b16036137d0575f90565b600190565b916137e293955086614af2565b9193916137f0368284612b63565b6101008401525f61364e565b91955092508291965061380f9350611bcb565b909161381c368385612b63565b6101008501526136496138326001923390612eaf565b95905f80613635565b507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a61386a6121218484611bbd565b14613630565b63ffffffff60019116019063ffffffff821161388857565b634e487b7160e01b5f52601160045260245ffd5b5f516020615e965f395f51905f5254600a63ffffffff808360a81c1616019063ffffffff82116138885763ffffffff838116921682116139375760c81c63ffffffff1610156105e9575f516020615e965f395f51905f52805463ffffffff60c81b60c893841b1663ffffffff60c81b1990911617908190559081901c63ffffffff9081169160a81c16811161392e5750565b61023190612383565b63e60fd64760e01b5f5260045ffd5b60207f6789ec0c85d6458d897a36a70129b101f8b4d84c6e218046c3107373dbcbae88918060581c6001600160581b0360a81b5f516020615e965f395f51905f525416175f516020615e965f395f51905f5255604051906001600160581b0319168152a1565b9294909391936139be6128a185611d17565b5f516020615e965f395f51905f525460a81c63ffffffff169063ffffffff808316911614613bb6575b506020810180516001600160a01b031615613bad575b5f516020615e965f395f51905f525460a81c63ffffffff1663ffffffff613a2b610628855163ffffffff1690565b911614801590613b81575b6105e957613a84613a9192613a4a87611d17565b815181546020938401516001600160c01b031990911663ffffffff9290921691909117921b640100000000600160c01b0316919091179055565b516001600160a01b031690565b915f196001600160a01b03841601613b70575b5050506001600160f81b03198116600160f81b03613b4d5760581c6001600160a01b031690813b15610222576040516306d61fe760e41b8152925f9184918291613af2919060048401612810565b038183855af19081156107bd575f516020615e565f395f51905f529261299f92613b39575b5060408051600181526001600160a01b03909216602083015290918291820190565b806107b75f613b4793610fc1565b5f613b17565b91506001600160f81b03198216600160f91b036120b9576102319160081b6150ea565b613b7992613f49565b5f8080613aa4565b50613b8e6128a186611d17565b63ffffffff613ba4610628855163ffffffff1690565b91161015613a36565b600181526139fd565b613bc89060010163ffffffff16612383565b5f6139e7565b6040908151613bdd8382610fc1565b600681526512d95c9b995b60d21b602082015291613bfd81519182610fc1565b6005815264181719971960d91b602082015290565b91613c39925f8080946040519687958694859363d68f602560e01b85523360048601611f1b565b03926001600160a01b03165af19081156107bd575f91613c57575090565b611ef891503d805f833e6107db8183610fc1565b5f9283613c3995936040519687958694859363d68f602560e01b85523360048601611f1b565b5f9060405192808385378338925af4913d82523d5f602084013e60203d830101604052565b5f9192806040519485378338925af4913d82523d5f602084013e60203d830101604052565b6001600160a01b0316803b1561022257604051630b9dfbed60e11b815260206004820152915f918391829084908290613d18906024830190610d4c565b03925af180156107bd57613d295750565b5f61023191610fc1565b8051156123df5760200190565b80518210156123df5760209160051b010190565b909593919492965f5b87811015613dad57600190613da78a89613d938489613d8c828060051b8c013595613d8787610966565b613d40565b51946123c8565b90613d9f868d8d6123c8565b9490936139ac565b01613d5d565b509650505050505050565b90156123df5790565b9293929091906001600160a01b03821615613f3a575b613de090611e77565b93613e0c613dff613df18684613db8565b356001600160f81b03191690565b6001600160f81b03191690565b936001600160f81b03198516613f12576001600160a01b03841691613e3391908190611c07565b823b1561022257613e5d925f92836040518096819582946306d61fe760e41b845260048401612810565b03925af19485156107bd57613ec1613ee19360019361023198613efe575b5060408051600381526001600160a01b03881660208201525f516020615e565f395f51905f529190a15b82546001600160a01b0319166001600160a01b03909116178255565b0180546001600160a01b0319166001600160a01b03909316929092178255565b805460ff60a01b191660589290921c60ff60a01b16919091179055565b806107b75f613f0c93610fc1565b5f613e7b565b50909390506001600160f81b031980841603613111576001613ee191613ec161023196613ea5565b6001600160a01b039150613dd7565b6001600160a01b0316919082158015614102575b6140fd5760405163d60b347f60e01b8152306004820152602081602481875afa9081156107bd575f916140de575b50614022579080613f9b92611c07565b9190813b15610222576040516306d61fe760e41b8152925f9184918291613fc6919060048401612810565b038183855af19081156107bd575f516020615e565f395f51905f529261299f9261400e575b505b60408051600481526001600160a01b03909216602083015290918291820190565b806107b75f61401c93610fc1565b5f613feb565b811515806140bf575b614049575b505061299f5f516020615e565f395f51905f5291613fed565b908061405492611c07565b9190813b15610222576040516306d61fe760e41b8152925f918491829161407f919060048401612810565b038183855af19081156107bd575f516020615e565f395f51905f529261299f926140ab575b5091614030565b806107b75f6140b993610fc1565b5f6140a4565b506001600160f81b0319806140d7613df18585613db8565b161461402b565b6140f7915060203d602011610812576108048183610fc1565b5f613f8b565b505050565b5060018314613f5d565b9261411790846153f6565b816141665750505f80916040518260208201916306d61fe760e41b835261415081612f6b60248201604090602081525f60208201520190565b51926001600160a01b03165af1506127a76123f1565b6001600160a01b039092169190823b1561022257612798925f92836040518096819582946306d61fe760e41b845260048401612810565b7f9d17cd6d095ac90a655405ab29f30a7ee7e88ef3974c1bf7544bf591043bb71a916060916141cf82610cc883611d4e565b600160ff198254161790556040519163ffffffff60e01b1682526001600160581b031916602082015260016040820152a1565b91907f2b82f87bf66300af618a9621d3f221edfab735f5bacb4e004cce1b62375396c3905a905f8060405193614262856142546020820196638a91b0e360e01b88526020602484018181520190610d4c565b03601f198101875286610fc1565b60405193614271602086610fc1565b828552602085019583908a905f368a375193f1913d90816142b8575b815f9293523e604080516001600160a01b03909516855281151560208601529093908190810161299f565b5f915061428d565b6142cd9093929193611e77565b80546001600160a01b031981168255600190910180546001600160a01b039092169490929091906001600160f81b0319605883901b161561431d575b505081546001600160a81b03191690915550565b61433b9261432c913691612b63565b906001600160a01b0316614202565b50805460408051600381526001600160a01b0390921660208301525f516020615e765f395f51905f5291a15f8080614309565b6001600160a01b039081165f8181527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b8660205260409081902080546001600160a01b0319811690915590921694935f516020615e765f395f51905f52936143e1916143db91369190612b63565b82614202565b50815190600282526020820152a1565b92919061442161440f5f516020615e965f395f51905f525460581b90565b6001600160581b031980871691161490565b612d5c57614431611dbe85611d17565b9361445261443e82611d17565b8054640100000000600160c01b0319169055565b6001600160f81b03198116600160f81b036144955791613b176143db61299f935f516020615e765f395f51905f529560018060a01b039060581c16933691612b63565b91506001600160f81b03198216600160f91b036120b9576102319160081b61547c565b604080519091906144c98382610fc1565b6001815291601f1901825f5b8281106144e157505050565b8060606020809385010152016144d5565b906144fc82611001565b6145096040519182610fc1565b828152809261451a601f1991611001565b01905f5b82811061452a57505050565b80606060208093850101520161451e565b906040611ef8925f81528160208201520190610d4c565b600881901b9291906001600160f81b03198116600160f81b036145e557509061457a916156ba565b90916001600160f81b031981166145955750611ef8916157d2565b6001600160f81b031916600160f81b036145b257611ef891615726565b60405162461bcd60e51b815260206004820152600b60248201526a155b9cdd5c1c1bdc9d195960aa1b6044820152606490fd5b9293926001600160f81b0319811661469d5750906146029161563c565b9161460b6144b8565b956001600160f81b03198116614638575061462593615684565b61462e83613d33565b526127a782613d33565b6001600160f81b031916600160f81b036145b2576146559361565d565b61465e84613d33565b52610231577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb761299f61469084613d33565b516040519182918261453b565b909391906001600160f81b0319908116036145b2576146c76146cd916146c16144b8565b95615614565b91613cb6565b6146d985939293613d33565b526001600160f81b03198116600160f81b036147245750156146f757565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb761299f61469084613d33565b6001600160f81b0319166145b2576102315760405162461bcd60e51b815260206004820152601360248201527211195b1959d85d1958d85b1b0819985a5b1959606a1b6044820152606490fd5b9091906001600160a01b0316801580156147f9575b6140fd5781156123df575f516020615e765f395f51905f529261299f926001600160f81b031982358116146147d9575b505060408051600481526001600160a01b03909216602083015290918291820190565b6147ea816143db926147f194611c07565b3691612b63565b505f806147b6565b5060018114614786565b816040519182372090565b5f809160405136810160405236838237604051601481016040523360601b90528260143601925af190604051903d82523d5f602084013e60203d830101604052565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f0000000000000000000000000000000000000000000000000000000000000000461416156148db575b6719010000000000005f52601a52603a526042601820905f603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f00000000000000000000000000000000000000000000000000000000000000006040820152466060820152306080820152206148be565b60a061496c613bce565b90602081519101209060208151910120604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8352602083015260408201525f6060820152306080820152206719010000000000005f52601a52603a526042601820905f603a52565b94918484614a589296959396604051906149f082610fa5565b5f82525f602083015260408201995f8b52614a52606084019a8b925f84525f60808701525f60a0870152606060c0870152614a4360e08701915f83526101008801955f87529063ffffffff60e01b169052565b6001600160a01b039091169052565b5261585d565b60ff80614a71614a6b613df18786613db8565b60f81c90565b1603614ab757614aa0614a8b84614a9b95614ab094611c07565b9490955163ffffffff60e01b1690565b611ead565b5460101c6001600160a01b031690565b9351929190565b63b32eeb6960e01b5f5260045ffd5b8065ffffffffffff8260a01c16918215600114614ae4575b60d01c92565b65ffffffffffff9250614ade565b9190939293601481019160141161022257803560601c92829190614b14612d92565b6001600160a01b03909516602086019081529490614b72614b376128a183611d17565b5f516020615e965f395f51905f525460a81c63ffffffff169063ffffffff808316911603614cd757614b6890613870565b63ffffffff168352565b815163ffffffff1695516001600160a01b031697614b90858061217a565b614b9991614803565b986034850199614ba98b8861217a565b614bb291614803565b906054870199614bc28b8a61217a565b614bcb91614803565b604080517fb17ab1224aca0d4255ef8161acaf2ac121b8faa32a4b2258c912cc5f8308c505602082019081526001600160581b03198a169282019290925263ffffffff9390931660608401526001600160a01b0395909516608083015260a082019290925260c081019290925260e0808301919091528152614c4f61010082610fc1565b519020905f1461051a61029b98614cb0609498612a3397614c916129b79761052097614cc957614c7e90614962565b614c8b60748d018561217a565b91615acb565b9e614ca7614c9f848061217a565b92909461217a565b9390928a6139ac565b614cc3614cbd828b61217a565b90615c88565b8861217a565b614cd290614850565b614c7e565b614b68565b80548210156123df575f5260205f2001905f90565b356001600160c01b0319811692919060088210614d0c575050565b6001600160c01b031960089290920360031b82901b16169150565b604090611ef8939281528160208201520190613535565b93929190935f926001614d5083611ead565b015f5b8154811015614ee057614d81614d79614d6c8385614cdc565b90549060031b1c60501b90565b908160501c90565b939095614d9d614d97614a6b613df18585613db8565b60ff1690565b808403614eb25750908181614dd6614dca614dc4614dbe84614df498611c23565b90614cf1565b60c01c90565b6001600160401b031690565b600901918c610100614dec6147ea868686611c34565b910152611cc9565b939093955b600160f01b1615614e11575b50600101939193614d53565b604051633894f6e760e11b81529196906020908390815f81614e418f6001600160e01b03198d1660048401614d27565b03926001600160a01b03165af19182156107bd575f92614e92575b506001600160a01b038216614e7e57600191614e7791614f1d565b9590614e05565b631f24c1fb60e11b5f52600487905260245ffd5b614eab91925060203d81116136de576136cf8183610fc1565b905f614e5c565b9196909491831115614ecd57630760bdcf60e11b5f5260045ffd5b614ed56122ca565b6101008b0152614df9565b505091929460ff80614ef8614a6b613df18789613db8565b1603614ab757610100614f156147ea85614aa096611ef898611c07565b910152611ead565b908082186001600160a01b031615606083811b838501821b9081149184901b141717600114614f4d575050600190565b65ffffffffffff60a01b8216916001600160d01b03198082169083168415614fcd575b65ffffffffffff60a01b84168015614fbd575b858110908618028086189514614fac575b81811190821802189160018060a01b03911716171790565b65ffffffffffff60a01b9450614f94565b5065ffffffffffff60a01b614f83565b65ffffffffffff60a01b9450614f70565b903590601e198136030182121561022257018035906001600160401b03821161022257602001918160051b3603831361022257565b8054905f815581615022575050565b5f5260205f20908101905b818110615038575050565b5f815560010161502d565b356001600160501b031981169291906016821061505e575050565b6001600160501b031960169290920360031b82901b16169150565b805468010000000000000000811015610f6a5761509b91600182018155614cdc565b819291549060031b9160501c821b9160018060b01b03901b1916179055565b9092809260209483528483013701015f815290565b356001600160f01b0319811692919060028210612326575050565b91906150f69080614fde565b9260fe841180156153ee575b6153df57600161511182611ead565b01546153c6575b5f1984015f5b8181106152885750906151dd6151d683876151766151c76151ae6120666151a86151a2876151f99e9f8e61519d6152079f8f90611e0861291061290a61516861516e9489896123c8565b90611c5f565b9a8b91611ead565b805462010000600160b01b03191660109290921b62010000600160b01b0316919091179055565b6123c8565b90611c8d565b906150cf565b6151b788611ead565b9060f01c61ffff19825416179055565b6001600160a01b0316966123c8565b8091611c70565b6040519586939092906001600160e01b031916602085016150ba565b03601f198101845283610fc1565b803b15610222575f61522d92604051809481926306d61fe760e41b835260048301612266565b038183855af19081156107bd575f516020615e565f395f51905f529261299f92615274575b5060408051600681526001600160a01b03909216602083015290918291820190565b806107b75f61528293610fc1565b5f615252565b615323906152ce600161529a86611ead565b016152c86152bb6152b56152af868d8c6123c8565b90611c51565b90615043565b6001600160501b03191690565b90615079565b6152e8611e08611e0861291061290a615168868d8c6123c8565b6152f66151d6838a896123c8565b60405194918591615315916001600160e01b03198a16602085016150ba565b03601f198101855284610fc1565b803b15610222576040516306d61fe760e41b8152925f91849182908490829061534f9060048301612266565b03925af19182156107bd576001926153b2575b505f516020615e565f395f51905f526153a961538861291061290a615168868d8c6123c8565b60408051600581526001600160a01b03909216602083015290918291820190565b0390a10161511e565b806107b75f6153c093610fc1565b5f615362565b6153da60016153d483611ead565b01615013565b615118565b63b62d956d60e01b5f5260045ffd5b508315615102565b5f516020615e565f395f51905f52916040916001600160a01b03821615615473575b6001600160a01b039081165f8181527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b8660205284902080546001600160a01b03191693909216929092179055815190600282526020820152a1565b60019150615418565b919061548783611ead565b916154928280614fde565b9190506001840191600183540103615605575f5b825481101561554357805f516020615e765f395f51905f5261553a86615518612f6b6143db8c6154fc886154f66154e6614d798f60019e614d6c91614cdc565b90508c8060a01b03169780614fde565b906123c8565b6040519485939092906001600160e01b031916602085016150ba565b5060408051600581526001600160a01b03909216602083015290918291820190565b0390a1016154a6565b50936155a6915061023193926155a16151f99261556460016153d483611ead565b85546151dd9061557f9060101c6001600160a01b0316611e08565b9361559661558d8280614fde565b91909280614fde565b5f19019290506123c8565b614202565b5080545f516020615e765f395f51905f52906155f2906155d19060101c6001600160a01b0316611e08565b60408051600681526001600160a01b03909216602083015290918291820190565b0390a180546001600160b01b0319169055565b63013dcc8d60e31b5f5260045ffd5b91601382111561562f57823560601c92601401916013190190565b63ba597e7e5f526004601cfd5b90603381111561562f57813560601c92601483013592603401916033190190565b905f928491604051958692833738935af1913d82523d5f602084013e60203d830101604052565b90925f92819594604051968792833738935af1156156b1573d82523d5f602084013e60203d830101604052565b503d5f823e3d90fd5b918235826020118160401c1761562f5783016020810193813593846156de57505050565b01601f190190835b5f190160208160051b8301013580830160608101908135809101918680602080860135809601011191111792171760401c1761562f57806156e657505050565b9190615731816144f2565b925f5b82811061574057505050565b8061576a60019260051b84013584016040810135810190602082359201906020810135903561565d565b6157748389613d40565b5215615781575b01615734565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76157ca6157af8389613d40565b51604051918291858352604060208401526040830190610d4c565b0390a161577b565b91906157dd816144f2565b925f5b8281106157ec57505050565b8061581660019260051b840135840160408101358101906020823592019060208101359035615684565b6158208288613d40565b5261582b8187613d40565b50016157e0565b9092608092611ef89594835260018060a01b0316602083015260408201528160608201520190610d4c565b91606083019060016158b2615879845163ffffffff60e01b1690565b6001600160e01b0319165f9081527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f8526020526040902090565b01805493905f5b8581106158c95750505050505050565b6158d9614d79614d6c8385614cdc565b6001600160a01b031660a0890190815260808901949091615902906001600160f01b0319168652565b61591c615915614a6b613df18985613db8565b60ff168a52565b61592a614d978a5160ff1690565b808403615a99575085818161594f614dca614dc4614dbe6159a49b9c61597798611c23565b8c60c061596a6147ea60208401948086526009018688611c34565b9101525160090191611cc9565b949094955b51600160f11b90615996906001600160f01b031916612066565b166001600160f01b03191690565b156159b3575b506001016158b9565b516159c6906001600160a01b0316611e08565b60206159ec6159df6159df895163ffffffff60e01b1690565b6001600160e01b03191690565b60e08a01516101008b015160c08c015160405163184dfdbb60e11b8152958694909385938493615a2b9390926001600160a01b03169060048601615832565b03915afa9081156107bd575f91615a7b575b506001600160a01b038116615a675790600191615a5f60408a01918251614f1d565b9052906159aa565b631f24c1fb60e11b5f52600482905260245ffd5b615a93915060203d81116136de576136cf8183610fc1565b5f615a3d565b909490831115615ab257630760bdcf60e11b5f5260045ffd5b6159a490615ac1365f88612b63565b60c08b015261597c565b5f516020615e965f395f51905f52545f9493929060581b6001600160f81b03198116600160f81b03615b865791615b2b9391615b0c611e0860209560581c90565b9160405195869485938493637aa8f17760e11b85523060048601611f1b565b03915afa9081156107bd575f91615b67575b505b6001600160e01b0319166374eca2c160e11b01615b5857565b6362467c7760e11b5f5260045ffd5b615b80915060203d602011612029576120218183610fc1565b5f615b3d565b90949192916001600160f81b03198216600160f91b03615c275750602091615bb49160081b958430886149d7565b60405163392dffaf60e01b81529297929586949385938493615be793909230906001600160e01b03191660048701613329565b03916001600160a01b03165afa9081156107bd575f91615c08575b50615b3f565b615c21915060203d602011612029576120218183610fc1565b5f615c02565b94906001600160f81b0319166120b957615c4092613270565b615b3f565b15615c4c57565b60405162461bcd60e51b8152602060048201526014602482015273496e76616c69642073656c6563746f724461746160601b6044820152606490fd5b615c956105208383611b92565b916004811015615ca457505050565b602c8110615e4657602c820190615cc4611e0861291061290a8487611be8565b615cee615ce0613dff613df1615cda878061217a565b90613db8565b6001600160f81b0319161590565b80615da1575b611e0861291061290a85615d496102319a87615d2d611e0861291061290a8f9d612a3a9f9e8f604c9f612ab39f615d4f575b5050611cb8565b615d378b8061217a565b9390926001600160a01b031690613dc1565b88611cb8565b612a3a615d93615d9a93606c860190615d8e615d7d611e0861291061290a615d77878761217a565b90611bf9565b9586906001600160a01b03166153f6565b61217a565b8091611c9b565b8f87615d26565b5060405163ecd0596160e01b81526002600482015290949291906020816024816001600160a01b038a165afa9384156107bd5761291061290a84615d49611e08948b615d2d611e086129106102319f8f9c612a3a9f9d8f604c9f93612ab39f9461290a955f91615e27575b509f50505050505050505097509a5050959650505050615cf4565b615e40915060203d602011610812576108048183610fc1565b5f615e0c565b61023192506004915014615c4556fed21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x21", + "chainId": "0xde9fb" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x7a149486b8ecba0916ef80bc23705e46dbe4d6c8", + "function": null, + "arguments": [ + "0x8768fA84bd76610ACc6AF35b578fE847e1CFf0cA" + ], + "transaction": { + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x5d17a", + "value": "0x0", + "input": "0x000000000000000000000000000000000000000000000000000000000000000060a034607357601f61044238819003918201601f19168301916001600160401b03831184841017607757808492602094604052833981010312607357516001600160a01b03811681036073576080526040516103b6908161008c823960805181818160c60152818161021d01526102d80152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816348aac39214610250575080635c60da1b146102085763ea6d13ac1461003d575f80fd5b6100463661033f565b60405161006c602080838181019587898837878201908382015203018084520182610394565b519020905f92604051927fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f60212060358501523060581b845260ff84538060158501526055842094341591863b156101eb5750506001906101e6575f38818034895af1156101d9575b836040525f60605215610157575b6040516001600160a01b0385168152602090f35b9180825f9493859483378101838152039082855af13d156101d4573d67ffffffffffffffff81116101c0576040519061019a601f8201601f191660200183610394565b81525f60203d92013e5b156101b1575f8080610143565b63487e630960e11b5f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b6101a4565b63b12d13eb5f526004601cfd5b610135565b91509450605f602134f593846101355763301164255f526004601cfd5b3461024c575f36600319011261024c576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b3461024c57806102826020806102653661033f565b908084889499019889378201908382015203018084520182610394565b5190206040517fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f602120906040525f60605260ff5f536035523060601b600152601552602060555f205f6035526040519060018060a01b03168152f35b90604060031983011261024c5760043567ffffffffffffffff811161024c578260238201121561024c5780600401359267ffffffffffffffff841161024c576024848301011161024c57602401919060243590565b90601f8019910116810190811067ffffffffffffffff8211176101c057604052560000000000000000000000008768fa84bd76610acc6af35b578fe847e1cff0ca", + "nonce": "0x22", + "chainId": "0xde9fb" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xd703aae79538628d27099b8c4f621be4ccd142d5", + "function": "approveFactory(address,bool)", + "arguments": [ + "0x7A149486b8ECba0916Ef80Bc23705e46dbE4D6c8", + "true" + ], + "transaction": { + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0xd703aae79538628d27099b8c4f621be4ccd142d5", + "gas": "0x108d1", + "value": "0x0", + "input": "0x6e7dbabb0000000000000000000000007a149486b8ecba0916ef80bc23705e46dbe4d6c80000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x23", + "chainId": "0xde9fb" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1738927559, + "chain": 911867, + "commit": "88d20d3" +} \ No newline at end of file diff --git a/foundry.toml b/foundry.toml index a3d2d35d..d573dfc3 100644 --- a/foundry.toml +++ b/foundry.toml @@ -4,9 +4,9 @@ out = "out" libs = ["lib"] bytecode_hash = "none" cbor_metadata = false -optimize = true via-ir = false -runs = 1000 +optimizer = true +optimizer_runs = 200 [profile.deploy] via-ir = true diff --git a/src/Kernel.sol b/src/Kernel.sol index 3f4f9d44..3471135d 100644 --- a/src/Kernel.sol +++ b/src/Kernel.sol @@ -49,8 +49,6 @@ import { import {InstallExecutorDataFormat, InstallFallbackDataFormat, InstallValidatorDataFormat} from "./types/Structs.sol"; -import {ECDSA} from "solady/utils/ECDSA.sol"; - contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager { error ExecutionReverted(); error InvalidExecutor(); @@ -238,7 +236,6 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager // 2. instead of packing 20 bytes in userOp.signature for enable mode to provide the validator address, v3 uses userOp.nonce[2:22] // 3. In v2, only 1 plugin validator(aside from root validator) can access the selector. // In v3, you can use more than 1 plugin to use the exact selector, you need to specify the validator address in userOp.nonce[2:22] to use the validator - (ValidationMode vMode, ValidationType vType, ValidationId vId) = ValidatorLib.decodeNonce(userOp.nonce); if (vType == VALIDATION_TYPE_ROOT) { vId = vs.rootValidator; @@ -349,9 +346,7 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager } return _checkPermissionSignature(pId, msg.sender, hash, sig, isReplayable); } else if (vType == VALIDATION_TYPE_7702) { - return ECDSA.recover(_toWrappedHash(hash, isReplayable), sig) == address(this) - ? ERC1271_MAGICVALUE - : ERC1271_INVALID; + return _verify7702Signature(_toWrappedHash(hash, isReplayable), sig); } else { revert InvalidValidationType(); } @@ -398,23 +393,17 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager } _installSelector(bytes4(initData[0:4]), module, IHook(address(bytes20(initData[4:24]))), data.selectorData); _installHook(IHook(address(bytes20(initData[4:24]))), data.hookData); - } else if (moduleType == MODULE_TYPE_HOOK) { - // force call onInstall for hook + } else if ( + moduleType == MODULE_TYPE_HOOK || moduleType == MODULE_TYPE_POLICY || moduleType == MODULE_TYPE_SIGNER + ) { + // force call onInstall for hook, policy, signer // NOTE: for hook, kernel does not support independent hook install, - // hook is expected to be paired with proper validator/executor/selector - IHook(module).onInstall(initData); - } else if (moduleType == MODULE_TYPE_POLICY) { - // force call onInstall for policy // NOTE: for policy, kernel does not support independent policy install, - // policy is expected to be paired with proper permissionId - // to "ADD" permission, use "installValidations()" function - IPolicy(module).onInstall(initData); - } else if (moduleType == MODULE_TYPE_SIGNER) { - // force call onInstall for signer // NOTE: for signer, kernel does not support independent signer install, - // signer is expected to be paired with proper permissionId + // hook is expected to be paired with proper validator/executor/selector + // policy is expected to be paired with proper permissionId // to "ADD" permission, use "installValidations()" function - ISigner(module).onInstall(initData); + IHook(module).onInstall(initData); } else { revert InvalidModuleType(); } diff --git a/src/core/ValidationManager.sol b/src/core/ValidationManager.sol index 958e7c0e..aa82619f 100644 --- a/src/core/ValidationManager.sol +++ b/src/core/ValidationManager.sol @@ -47,6 +47,8 @@ import { MAX_NONCE_INCREMENT_SIZE, ENABLE_TYPE_HASH, KERNEL_WRAPPER_TYPE_HASH, + ERC1271_INVALID, + ERC1271_MAGICVALUE, MAGIC_VALUE_SIG_REPLAYABLE } from "../types/Constants.sol"; @@ -339,7 +341,7 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe ) ); } else if (vType == VALIDATION_TYPE_7702) { - validationData = ECDSA.recover(userOpHash, userOpSig) == address(this) + validationData = _verify7702Signature(userOpHash, userOpSig) == ERC1271_MAGICVALUE ? ValidationData.wrap(0) : ValidationData.wrap(1); } else { @@ -426,11 +428,11 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe (signer, validationData, enableSig) = _checkSignaturePolicy(pId, address(this), digest, enableSig); result = signer.checkSignature(bytes32(PermissionId.unwrap(pId)), address(this), digest, enableSig); } else if (vType == VALIDATION_TYPE_7702) { - result = ECDSA.recover(digest, enableSig) == address(this) ? bytes4(0x1626ba7e) : bytes4(0xffffffff); + result = _verify7702Signature(digest, enableSig); } else { revert InvalidValidationType(); } - if (result != 0x1626ba7e) { + if (result != ERC1271_MAGICVALUE) { revert EnableNotApproved(); } } @@ -499,6 +501,10 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe digest = isReplayable ? _chainAgnosticHashTypedData(structHash) : _hashTypedData(structHash); } + function _verify7702Signature(bytes32 hash, bytes calldata sig) internal view returns (bytes4) { + return ECDSA.recover(hash, sig) == address(this) ? ERC1271_MAGICVALUE : ERC1271_INVALID; + } + function _checkUserOpPolicy(PermissionId pId, PackedUserOperation memory userOp, bytes calldata userOpSig) internal returns (ValidationData validationData, ISigner signer) @@ -606,7 +612,7 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe _checkSignaturePolicy(pId, caller, hash, sig); (ValidAfter validAfter, ValidUntil validUntil,) = parseValidationData(ValidationData.unwrap(valdiationData)); if (block.timestamp < ValidAfter.unwrap(validAfter) || block.timestamp > ValidUntil.unwrap(validUntil)) { - return 0xffffffff; + return ERC1271_INVALID; } return signer.checkSignature( bytes32(PermissionId.unwrap(pId)), caller, _toWrappedHash(hash, isReplayable), validatorSig diff --git a/test/base/Kernel7702TestBase.sol b/test/base/Kernel7702TestBase.sol index efb8422f..505feeea 100644 --- a/test/base/Kernel7702TestBase.sol +++ b/test/base/Kernel7702TestBase.sol @@ -27,7 +27,6 @@ contract Kernel7702TestBase is TestPlus, Test { Kernel kernel; uint256 privateKey; IEntryPoint entrypoint; - ValidationId rootValidation; struct RootValidationConfig { IHook hook; @@ -35,7 +34,6 @@ contract Kernel7702TestBase is TestPlus, Test { bytes hookData; } - RootValidationConfig rootValidationConfig; MockValidator mockValidator; MockCallee callee; MockHook mockHook; @@ -305,7 +303,6 @@ contract Kernel7702TestBase is TestPlus, Test { mockERC20 = new MockERC20(); mockERC721 = new MockERC721(); mockERC1155 = new MockERC1155(); - _setRootValidationConfig(); _setEnableValidatorConfig(); _setEnablePermissionConfig(); (address acc, uint256 pk) = makeAddrAndKey("Account"); @@ -364,11 +361,6 @@ contract Kernel7702TestBase is TestPlus, Test { } // things to override on test - function _setRootValidationConfig() internal virtual { - mockValidator = new MockValidator(); - rootValidation = ValidatorLib.validatorToIdentifier(mockValidator); - } - function _setEnableValidatorConfig() internal virtual { enabledValidator = new MockValidator(); } From 4752d4140e46c8827842976d1a4c8491327a1e65 Mon Sep 17 00:00:00 2001 From: leekt Date: Sat, 8 Feb 2025 11:01:43 +0900 Subject: [PATCH 04/14] using constants --- .../911867/run-1738927689.json | 142 ++++++++++++++++++ .../DeployKernel.s.sol/911867/run-latest.json | 79 +++++++++- src/Kernel.sol | 33 ++-- src/types/Constants.sol | 8 + 4 files changed, 242 insertions(+), 20 deletions(-) create mode 100644 broadcast/DeployKernel.s.sol/911867/run-1738927689.json diff --git a/broadcast/DeployKernel.s.sol/911867/run-1738927689.json b/broadcast/DeployKernel.s.sol/911867/run-1738927689.json new file mode 100644 index 00000000..25752103 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/911867/run-1738927689.json @@ -0,0 +1,142 @@ +{ + "transactions": [ + { + "hash": "0x3b084e89fe78ec6ad227bc762285f7529a43d605148e6f39a8838818d1bfb674", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0x8768fa84bd76610acc6af35b578fe847e1cff0ca", + "function": null, + "arguments": [ + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x706a31", + "value": "0x0", + "input": "0x00000000000000000000000000000000000000000000000000000000000000006101408060405234610203576020816160f580380380916100208285610207565b83398101031261020357516001600160a01b038116810361020357306080524660a05260a0604051610053604082610207565b6006815260208101906512d95c9b995b60d21b825260405191610077604084610207565b60058352602083019164181719971960d91b8352519020915190208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260208301526040820152466060820152306080820152206101005261012052604051602081019063deadbeef60e01b825260048152610101602482610207565b5190516001600160581b031981169190601582106101e3575b7f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f80546001600160a81b031916605885901c179055604051615eb6908161023f823960805181614873015260a05181614896015260c05181614906015260e0518161492c015261010051816148520152610120518181816103b4015281816106bd0152818161086301528181610abf01528181610e3e01528181611156015281816112ca015281816113200152818161184d0152818161197d015281816126b901526131300152f35b6001600160581b031960159290920360031b82901b161690505f8061011a565b5f80fd5b601f909101601f19168101906001600160401b0382119082101761022a57604052565b634e487b7160e01b5f52604160045260245ffdfe6080604052600436101561001d575b36612fde5761001b612fad565b005b5f3560e01c8063112d3a7d1461020c578063150b7a02146102075780631626ba7e1461020257806319822f7c146101fd5780631f1b92e3146101f85780633659cfe6146101f35780633c3b752b146101ee57806352141cd9146101e957806357b3a5f4146101e45780636e6fa0c6146101df578063721e67f4146101da57806384b0196e146101d55780638dd7712f146101d057806390ef8862146101cb5780639198bdf5146101c65780639517e29f146101c15780639cfd7cff146101bc578063a65d69d4146101b7578063a71763a8146101b2578063adb610a3146101ad578063b8afe17d146101a8578063bc197c81146101a3578063c3e589781461019e578063d03c791414610199578063d691c96414610194578063e6f3d50a1461018f578063e9ae5c531461018a578063f1f7f0f914610185578063f23a6e6114610180578063f2dc691d1461017b5763fc9c5dec0361000e57611b32565b611b14565b611aba565b611a84565b611956565b6117d8565b6116f6565b6116a9565b6115d6565b6114c5565b611459565b611427565b6112f9565b6112b5565b61125d565b61112f565b611018565b610f09565b610e0e565b610d70565b610cea565b610c8f565b610bdc565b610a3e565b6109a8565b61082d565b610685565b610380565b61031f565b6102c5565b61029f565b6001600160a01b0381160361022257565b5f80fd5b359061023182610211565b565b9181601f84011215610222578235916001600160401b038311610222576020838186019501011161022257565b6060600319820112610222576004359160243561027c81610211565b91604435906001600160401b0382116102225761029b91600401610233565b9091565b346102225760206102bb6102b236610260565b92919091611d85565b6040519015158152f35b34610222576080366003190112610222576102e1600435610211565b6102ec602435610211565b6064356001600160401b0381116102225761030b903690600401610233565b5050604051630a85bd0160e11b8152602090f35b34610222576040366003190112610222576004356024356001600160401b0381116102225760209161035861035e923690600401610233565b91611f4a565b6040516001600160e01b03199091168152f35b90816101209103126102225790565b6060366003190112610222576004356001600160401b038111610222576103ab903690600401610371565b602435604435917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610652576103ef6020820135613408565b9092919084836001600160f81b0319861615610639575b826104119394613601565b9361043661042661042184611d17565b61214e565b946001600160f81b031916151590565b9384806105f8575b6105e957602001516001600160a01b0316801591819083806105e2575b6104e257600192610476610495925f525f60205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b149081156105da575b501561054d57826104f1575b50506104e257816104cc925b6104d0575b506040519081529081906020820190565b0390f35b3490349034903490335af1505f6104bb565b631a0a9b9f60e21b5f5260045ffd5b61054692506105429161052661052061051a61050f61053b95611d4e565b93606081019061217a565b90611b92565b90611ce1565b63ffffffff60e01b165f5260205260405f2090565b5460ff1690565b1590565b5f806104aa565b829192916105a7575b506104e25761051a81606061056c93019061217a565b638dd7712f60e01b916001600160e01b03199161058891611ce1565b160361059857816104cc926104b6565b63dbbb044b60e01b5f5260045ffd5b6105d4915061053b6105bb61054292611d4e565b6105266105206105ce606088018861217a565b90611b81565b5f610556565b90505f61049e565b508661045b565b633ab3447f60e11b5f5260045ffd5b50805163ffffffff1663ffffffff6106316106285f516020615e965f395f51905f525463ffffffff9060c81c1690565b63ffffffff1690565b91161061043e565b5f516020615e965f395f51905f525460581b9250610406565b6348f5c3ed60e01b5f5260045ffd5b6004359063ffffffff8216820361022257565b359063ffffffff8216820361022257565b602036600319011261022257610699610661565b6106ba6106b45f516020615e965f395f51905f525460581b90565b60581c90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610823575b156108195760405163ecd0596160e01b81526004808201526001600160a01b039190911690602081602481855afa9081156107bd575f916107ea575b50156106525760405163d68f602560e01b8152915f838061074f36343360048501612241565b038183865af19283156107bd575f936107c2575b5061076d9061389c565b803b1561022257604051630b9dfbed60e11b8152915f9183918290849082906107999060048301612266565b03925af180156107bd576107a957005b806107b75f61001b93610fc1565b80610d42565b611f3f565b61076d9193506107e3903d805f833e6107db8183610fc1565b8101906121df565b9290610763565b61080c915060203d602011610812575b6108048183610fc1565b8101906121ac565b5f610729565b503d6107fa565b5061001b9061389c565b50303314156106ed565b60203660031901126102225760043561084581610211565b6108606106b45f516020615e965f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061095c575b156109525760405163ecd0596160e01b81526004808201526001600160a01b039190911690602081602481855afa9081156107bd575f91610933575b50156106525760405163d68f602560e01b8152915f83806108f536343360048501612241565b038183865af19283156107bd575f93610913575b5061076d90612277565b61076d91935061092c903d805f833e6107db8183610fc1565b9290610909565b61094c915060203d602011610812576108048183610fc1565b5f6108cf565b5061001b90612277565b5030331415610893565b6001600160581b031981160361022257565b9181601f84011215610222578235916001600160401b038311610222576020808501948460051b01011161022257565b346102225760a0366003190112610222576004356109c581610966565b6024356109d181610211565b6044356001600160401b038111610222576109f0903690600401610233565b6064939193356001600160401b03811161022257610a12903690600401610233565b91608435956001600160401b03871161022257610a3661001b973690600401610978565b969095612420565b608036600319011261022257600435610a5681610966565b602435610a6281610211565b6044356001600160401b03811161022257610a81903690600401610233565b6064356001600160401b03811161022257610aa0903690600401610233565b91610abc6106b45f516020615e965f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610bc0575b15610bb15760405163ecd0596160e01b81526004808201526001600160a01b03919091169490602081602481895afa9081156107bd575f91610b92575b50156106525760405163d68f602560e01b8152955f8780610b5236343360048501612241565b0381838a5af19687156107bd575f97610b72575b5061076d95969761258f565b61076d969750610b8b903d805f833e6107db8183610fc1565b9695610b66565b610bab915060203d602011610812576108048183610fc1565b5f610b2c565b50919361001b9593919361258f565b5030331415610aef565b6001600160e01b031981160361022257565b34610222576020366003190112610222576104cc610c1d600435610bff81610bca565b5f60408051610c0d81610f4f565b8281528260208201520152611e77565b600160405191610c2c83610f4f565b805460a083901b839003168084529101546001600160a01b0380821660208086019182526001600160f81b031960589490941b84166040968701908152865195841686529151909216918401919091525116918101919091529081906060820190565b3461022257604036600319011261022257602060ff610cde600435610cb381610966565b610cc860243591610cc383610bca565b611d4e565b9063ffffffff60e01b165f5260205260405f2090565b54166040519015158152f35b34610222576020366003190112610222576020610d1f600435610d0c81610211565b5f604051610d1981610f6f565b5261318c565b60405190610d2c82610f6f565b546001600160a01b031690819052604051908152f35b5f91031261022257565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b34610222575f36600319011261022257610daf610dbd610d8e613bce565b604092919251938493600f60f81b855260e0602086015260e0850190610d4c565b908382036040850152610d4c565b4660608301523060808301525f60a083015281810360c083015260206060519182815201906080905f5b818110610df5575050500390f35b8251845285945060209384019390920191600101610de7565b6040366003190112610222576004356001600160401b03811161022257610e39903690600401610371565b6024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610652575f908152602081905260409020546001600160a01b03169060609060018314159081610ed9575b610eae610ea7826060610eb594019061217a565b8091611ba0565b9030613cb6565b5015610eca57610ec157005b61001b91613cdb565b63f21e646b60e01b5f5260045ffd5b9150610eb5610eae610ea7610eff610ef7610ea7606088018861217a565b903489613c6b565b9492505050610e93565b34610222575f36600319011261022257602063ffffffff5f516020615e965f395f51905f525460c81c16604051908152f35b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b03821117610f6a57604052565b610f3b565b602081019081106001600160401b03821117610f6a57604052565b604081019081106001600160401b03821117610f6a57604052565b61012081019081106001600160401b03821117610f6a57604052565b90601f801991011681019081106001600160401b03821117610f6a57604052565b60405190610231604083610fc1565b6040519061023161012083610fc1565b6001600160401b038111610f6a5760051b60200190565b6080366003190112610222576004356001600160401b03811161022257611043903690600401610978565b602435916001600160401b038311610222573660238401121561022257826004013561106e81611001565b9361107c6040519586610fc1565b8185526024602086019260061b8201019036821161022257602401915b8183106110ee575050506044356001600160401b038111610222576110c2903690600401610978565b90606435946001600160401b038611610222576110e661001b963690600401610978565b959094612694565b604083360312610222576020604091825161110881610f8a565b61111186610674565b81528286013561112081610211565b83820152815201920191611099565b61113836610260565b6111536106b45f516020615e965f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611253575b156112485760405163ecd0596160e01b81526004808201526001600160a01b03919091169290602081602481875afa9081156107bd575f91611229575b50156106525760405163d68f602560e01b8152935f85806111e936343360048501612241565b038183885af19485156107bd575f95611209575b5061076d939495612861565b61076d949550611222903d805f833e6107db8183610fc1565b94936111fd565b611242915060203d602011610812576108048183610fc1565b5f6111c3565b509161001b93612861565b5030331415611186565b34610222575f366003190112610222576104cc60405161127e604082610fc1565b601681527535b2b93732b61730b23b30b731b2b2173b181719971960511b6020820152604051918291602083526020830190610d4c565b34610222575f366003190112610222576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b61130236610260565b61131d6106b45f516020615e965f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061141d575b156114125760405163ecd0596160e01b81526004808201526001600160a01b03919091169290602081602481875afa9081156107bd575f916113f3575b50156106525760405163d68f602560e01b8152935f85806113b336343360048501612241565b038183885af19485156107bd575f956113d3575b5061076d939495612b99565b61076d9495506113ec903d805f833e6107db8183610fc1565b94936113c7565b61140c915060203d602011610812576108048183610fc1565b5f61138d565b509161001b93612b99565b5030331415611350565b34610222575f36600319011261022257602063ffffffff5f516020615e965f395f51905f525460a81c16604051908152f35b3461022257602036600319011261022257604061148960043561147b81610966565b611483612d92565b50611d17565b81519061149582610f8a565b5463ffffffff81168083526001600160a01b03602092831c81169383019384528451918252925190921690820152f35b346102225760a0366003190112610222576114e1600435610211565b6114ec602435610211565b6044356001600160401b0381116102225761150b903690600401610978565b50506064356001600160401b0381116102225761152c903690600401610978565b50506084356001600160401b0381116102225761154d903690600401610233565b505060405163bc197c8160e01b8152602090f35b602080825282516001600160f01b03191681830152808301516001600160a01b03166040808401919091529092015160608083015280516080830181905260a09092019201905f5b8181106115b65750505090565b82516001600160501b0319168452602093840193909201916001016115a9565b34610222576020366003190112610222576116156004356115f681610bca565b60606040805161160581610f4f565b5f81525f60208201520152611ead565b60016040519161162483610f4f565b805461ffff60f01b8160f01b168452828060a01b039060101c16602084015201906040519182602082549182815201915f5260205f20905f5b818110611686576104cc858761167581880382610fc1565b604082015260405191829182611561565b825460501b6001600160501b03191684526020909301926001928301920161165d565b346102225760203660031901126102225760206102bb600435612daa565b9060406003198301126102225760043591602435906001600160401b0382116102225761029b91600401610233565b6116ff366116c7565b90916001600160a01b036117123361318c565b54169182156117c957606090600184141594856117b2575b6117349293614552565b926117a2575b50506040518091602082016020835281518091526040830190602060408260051b8601019301915f905b82821061177357505050500390f35b919360019193955060206117928192603f198a82030186528851610d4c565b9601920192018594939192611764565b6117ab91613cdb565b5f8061173a565b61173492506117c2363487613c12565b925061172a565b63710c949760e01b5f5260045ffd5b6060366003190112610222576004356117f081610966565b6024356001600160401b0381116102225761180f903690600401610233565b6044356001600160401b0381116102225761182e903690600401610233565b9061184a6106b45f516020615e965f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061194c575b1561193f5760405163ecd0596160e01b81526004808201526001600160a01b03919091169390602081602481885afa9081156107bd575f91611920575b50156106525760405163d68f602560e01b8152945f86806118e036343360048501612241565b038183895af19586156107bd575f96611900575b5061076d949596612e82565b61076d959650611919903d805f833e6107db8183610fc1565b95946118f4565b611939915060203d602011610812576108048183610fc1565b5f6118ba565b5091909261001b94612e82565b503033141561187d565b61195f366116c7565b61197a6106b45f516020615e965f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611a7a575b15611a6f5760405163ecd0596160e01b81526004808201526001600160a01b03919091169190602081602481865afa9081156107bd575f91611a50575b50156106525760405163d68f602560e01b8152925f8480611a1036343360048501612241565b038183875af19384156107bd575f94611a30575b5061076d929394612e97565b61076d939450611a49903d805f833e6107db8183610fc1565b9392611a24565b611a69915060203d602011610812576108048183610fc1565b5f6119ea565b509061001b92612e97565b50303314156119ad565b34610222575f3660031901126102225760205f516020615e965f395f51905f525460581b604051906001600160581b0319168152f35b346102225760a036600319011261022257611ad6600435610211565b611ae1602435610211565b6084356001600160401b03811161022257611b00903690600401610233565b505060405163f23a6e6160e01b8152602090f35b346102225760203660031901126102225760206102bb600435612ea2565b34610222576040366003190112610222576004356001600160401b03811161022257611b79611b676020923690600401610371565b60243590611b7482610211565b612eaf565b604051908152f35b906008116102225760040190600490565b906004116102225790600490565b909291928360041161022257831161022257600401916003190190565b906020116102225790602090565b90929192836020116102225783116102225760200191601f190190565b906018116102225760040190601490565b906014116102225790601490565b909291928360011161022257831161022257600101915f190190565b906009116102225760010190600890565b909291928360091161022257831161022257600901916008190190565b906016116102225790601690565b906016116102225760020190601490565b909291928360161161022257831161022257601601916015190190565b906002116102225790600290565b909291928360141161022257831161022257601401916013190190565b90602c116102225760180190601490565b90939293848311610222578411610222578101920390565b356001600160e01b0319811692919060048210611cfc575050565b6001600160e01b031960049290920360031b82901b16169150565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85060205260405f2090565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85160205260405f2090565b90929060018103611dd457506001600160a01b0392611dce9250611dbe915060581b600160581b600160f81b0316600160f81b17611d17565b5460201c6001600160a01b031690565b16151590565b60028103611e1457506001600160a01b0392611dce9250611e089150611dfb90841661318c565b546001600160a01b031690565b6001600160a01b031690565b600303611e5457611e35611e30610520600193611e4395611b92565b611e77565b01546001600160a01b031690565b6001600160a01b0390811691161490565b5050505f90565b359060208110611e69575090565b5f199060200360031b1b1690565b63ffffffff60e01b165f527f7c341349a4360fdd5d5bc07e69f325dc6aaea3eb018b3e0ea7e53cc0bb0d6f3b60205260405f2090565b63ffffffff60e01b165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85260205260405f2090565b908160209103126102225751611ef881610bca565b90565b908060209392818452848401375f828201840152601f01601f1916010190565b611ef8949260609260018060a01b0316825260208201528160408201520191611efb565b6040513d5f823e3d90fd5b91611f54916131c4565b919080836001600160f81b031984161561212e575b602081101591826120f1575b826120db575b506001600160a01b039050611f95611e08611dbe86611d17565b1615806120c8575b6104e2576001600160f81b03198316600160f81b036120305790611fc86020949392611fe696613216565b604051637aa8f17760e11b8152958694859384933360048601611f1b565b039160581c6001600160a01b03165afa9081156107bd575f91612007575090565b611ef8915060203d602011612029575b6120218183610fc1565b810190611ee3565b503d612017565b92916001600160f81b03198116600160f91b036120925760081b93600160f11b61207361206661205f88611ead565b5460f01b90565b6001600160f01b03191690565b1661208357611ef8943390613354565b635b71057960e01b5f5260045ffd5b929391929091906001600160f81b0319166120b957611ef8936120b491613216565b613270565b6361c4e91b60e11b5f5260045ffd5b506001600160f81b031983161515611f9d565b819295506120e99350611bcb565b925f80611f7b565b91507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a6121276121218385611bbd565b90611e5b565b1491611f75565b92506121485f516020615e965f395f51905f525460581b90565b92611f69565b9060405161215b81610f8a565b915463ffffffff81168352602090811c6001600160a01b031690830152565b903590601e198136030182121561022257018035906001600160401b0382116102225760200191813603831361022257565b90816020910312610222575180151581036102225790565b6001600160401b038111610f6a57601f01601f191660200190565b602081830312610222578051906001600160401b038211610222570181601f8201121561022257805190612212826121c4565b926122206040519485610fc1565b8284526020838301011161022257815f9260208093018386015e8301015290565b611ef8939260609260018060a01b03168252602082015281604082015201905f611efb565b906020611ef8928181520190610d4c565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556001600160a01b03167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2565b604051906122d9602083610fc1565b5f8252565b90813b5f6122eb826121c4565b936122f96040519586610fc1565b82855260208501903c565b80516020909101516001600160f01b0319811692919060028210612326575050565b6001600160f01b031960029290920360031b82901b16169150565b1561234857565b60405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606490fd5b5f516020615e965f395f51905f52805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b634e487b7160e01b5f52603260045260245ffd5b908210156123df5761029b9160051b81019061217a565b6123b4565b908092918237015f815290565b3d1561241b573d90612402826121c4565b916124106040519384610fc1565b82523d5f602084013e565b606090565b94939291909695966001600160581b031961245961244c5f516020615e965f395f51905f525460581b90565b6001600160581b03191690565b161580612561575b61246a90612341565b6001600160581b03198616156104e2576001600160f81b03198616600160f81b141580612549575b6120b957856124a36124f097613946565b6124c46124ae610fe2565b60018152925b6001600160a01b03166020840152565b5f516020615e965f395f51905f52805463ffffffff60a81b1916600160a81b1790556139ac565b6139ac565b5f5b8181106124fe57505050565b5f8061250b8385876123c8565b9061251b604051809381936123e4565b039082305af16125296123f1565b5015612537576001016124f2565b636534eae560e11b5f5260045260245ffd5b506001600160f81b03198616600160f91b1415612492565b5061246a61ef0160f01b6001600160f01b0319612585612580306122de565b612304565b1614159050612461565b94939291906001600160581b03198616156104e2576001600160f81b03198616600160f81b14158061263a575b6120b9576125c986613946565b6001600160a01b036125dd611dbe88611d17565b16156125ec575b505050505050565b61262f956124eb6126125f516020615e965f395f51905f525463ffffffff9060a81c1690565b926124b460405194612625604087610fc1565b63ffffffff168552565b5f80808080806125e4565b506001600160f81b03198616600160f91b14156125bc565b9060405161265f81610f4f565b82546001600160a01b03908116825260019390930154928316602082015260589290921b6001600160f81b0319166040830152565b959294919390946126b66106b45f516020615e965f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580612806575b156127f75760405163ecd0596160e01b81526004808201526001600160a01b039190911695906020816024818a5afa9081156107bd575f916127d8575b50156106525760405163d68f602560e01b8152965f888061274c36343360048501612241565b0381838b5af19788156107bd575f986127b8575b5061276c969798613d54565b803b1561022257604051630b9dfbed60e11b8152915f9183918290849082906127989060048301612266565b03925af180156107bd576127aa575b50565b806107b75f61023193610fc1565b61276c9798506127d1903d805f833e6107db8183610fc1565b9796612760565b6127f1915060203d602011610812576108048183610fc1565b5f612726565b50919390929461023196613d54565b50303314156126e9565b916020611ef8938181520191611efb565b356bffffffffffffffffffffffff19811692919060148210612841575050565b6bffffffffffffffffffffffff1960149290920360031b82901b16169150565b9091600182036129dd575f516020615e565f395f51905f5293906054600160f81b600160581b600160f81b03605887901b1617916128ab6128a184611d17565b5463ffffffff1690565b5f516020615e965f395f51905f525460a81c63ffffffff169063ffffffff8083169116146129c5575b5061293d612916611e0861291061290a6129035f516020615e965f395f51905f525463ffffffff9060a81c1690565b9886611bf9565b90612821565b60601c90565b61292d612921610fe2565b63ffffffff9097168752565b6001600160a01b03166020860152565b612968601482019461294f868061217a565b61295f603486949394018961217a565b939092886139ac565b01916004612976848361217a565b9050146129a4575b5050505b604080519182526001600160a01b03909216602082015290819081015b0390a1565b61052061051a6129bd946129b79361217a565b9061419d565b5f808061297e565b6129d79060010163ffffffff16612383565b5f6128d4565b60028203612a455780612a3a5f516020615e565f395f51905f52956034612a14611e0861291061290a6014612a4099019588611bf9565b93612a3385612a23858061217a565b906001600160a01b038c1661410c565b019061217a565b91613f49565b612982565b60038203612abb5780612a3a5f516020615e565f395f51905f52956038612ab3611e0861291061290a6018612a40990195612aad8c8a612a9b611e0861291061290a87612a956105208288611b92565b95611be8565b612aa58b8061217a565b939092613dc1565b88611be8565b93019061217a565b600482148015612b59575b8015612b4f575b15612b40576001600160a01b03831693843b1561022257612b07945f92836040518098819582946306d61fe760e41b845260048401612810565b03925af19283156107bd575f516020615e565f395f51905f5293612b2c575b50612982565b806107b75f612b3a93610fc1565b5f612b26565b631092ef5760e11b5f5260045ffd5b5060068214612acd565b5060058214612ac6565b929192612b6f826121c4565b91612b7d6040519384610fc1565b829481845281830111610222578281602093845f960137010152565b909160018203612bf4575f516020615e765f395f51905f5293612bd291600160f81b600160581b600160f81b03605887901b16176143f1565b50604080519182526001600160a01b039092166020820152908190810161299f565b60028203612c1e575f516020615e765f395f51905f5293612b26916001600160a01b03851661436e565b60038203612c565780612c508580612c4a6105205f516020615e765f395f51905f5299612b2697611b92565b93611ba0565b916142c0565b60048203612ce657612cb3612b26915f516020615e765f395f51905f5295612c8c5f516020615e965f395f51905f525460581b90565b612c98611dbe82611d17565b6001600160a01b03888116911614612cb9575b503691612b63565b83614202565b612cc5612ce091611d17565b8054640100000000600160c01b031916640100000000179055565b5f612cab565b60058203612d6b575f516020615e965f395f51905f525460581b612d0d6121218684611bbd565b906001600160f81b03198116600160f91b14612d43575b5050612cb3612b26915f516020615e765f395f51905f52953691612b63565b60081b6001600160e01b03191614612d5c575f80612d24565b6313002bdd60e31b5f5260045ffd5b60068203612b40575f516020615e965f395f51905f525460581b612d0d6121218684611bbd565b60405190612d9f82610f8a565b5f6020838281520152565b612dbe818060081b918160301b9160501b90565b929091906001600160f81b03198116600160f81b14159081612e6e575b81612e59575b81612e40575b50611e545760ff60f81b16600160f81b8114159081612e36575b50612e30576001600160e01b031916612e2b576001600160501b031916612e2757600190565b5f90565b505f90565b50505f90565b905015155f612e01565b6001600160f81b031916607f60f91b141590505f612de7565b6001600160f81b031980821614159150612de1565b6001600160f81b0319811615159150612ddb565b91612e92916102319594936143f1565b614771565b906127a79291614552565b60071115612e2757600190565b612f6b90612fa790612eca6001600160a01b03823516611e08565b90612f796020820135612f6b612eec612ee6604086018661217a565b90614803565b93612efd612ee6606083018361217a565b90608081013560a082013590612f1f612ee660c08501359460e081019061217a565b93604051988997602089019b8c94919260e0969399989794919961010087019a60018060a01b03168752602087015260408601526060850152608084015260a083015260c08201520152565b03601f198101835282610fc1565b51902060408051602081019283526001600160a01b03909516908501525f6060850152929182906080820190565b51902090565b7f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460408051338152346020820152a1565b612ffa612ff55f356001600160e01b031916611e77565b612652565b80516001600160a01b0390613010908216611e08565b161561317d5780516060906001600160a01b039061302f908216611e08565b1660018114158061316c575b15613120575050805161305a906001600160a01b031636903490613c12565b60408201516001600160f81b031916806130e057506020820151613086906001600160a01b031661480e565b92905b156130d857516001600160a01b031690600182141582816130c3575b506130b3575b825160208401f35b6130bc91613cdb565b5f806130ab565b6001600160a01b03908116141590505f6130a5565b825160208401fd5b6001600160f81b03199081160361311157602082015161310a906001600160a01b03163690613c91565b9290613089565b632d6a6bb760e01b5f5260045ffd5b6001600160a01b030361305a57337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461305a576348f5c3ed60e01b5f5260045ffd5b506001600160a01b0381141561303b565b631cd4b64760e21b5f5260045ffd5b6001600160a01b03165f9081527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b866020526040902090565b9182358060f81c805f1461320857806001146131fb576002146131e5575f80fd5b6001600160d81b03191692600501916004190190565b5092601501916014190190565b505060015f9301915f190190565b60405160208101917f1547321c374afde8a591d972a084b071c594c275e36724931ff96c25f2999c838352604082015260408152613255606082610fc1565b519020901561326757611ef890614962565b611ef890614850565b919061327d913691612b63565b604051916020820191805180604014613308576041146132aa5750505050505b638baa579f5f526004601cfd5b80606060409201515f1a60205201516060525b5f52516040526020600160805f825afa51905f6060526040523d6132e257505061329d565b6001600160a01b031630036132fc57630b135d3f60e11b90565b6001600160e01b031990565b506040015160ff81901c601b016020526001600160ff1b03166060526132bd565b9092608092611ef89694835260018060a01b0316602083015260408201528160608201520191611efb565b61336d65ffffffffffff939561337997958785856149d7565b96929591989098614ac6565b50911642109081156133f6575b506133e25761339a6133c491602097613216565b60405163392dffaf60e01b8152978896879586959193916001600160e01b03191660048701613329565b03916001600160a01b03165afa9081156107bd575f91612007575090565b506001600160e01b03199695505050505050565b65ffffffffffff91501642115f613386565b90818060081b9160ff839260f01c1660021461342057565b6001600160d81b031983169150565b9080601f8301121561022257816020611ef893359101612b63565b9190916101208184031261022257613460610ff1565b9261346a82610226565b84526020820135602085015260408201356001600160401b038111610222578161349591840161342f565b604085015260608201356001600160401b03811161022257816134b991840161342f565b60608501526080820135608085015260a082013560a085015260c082013560c085015260e08201356001600160401b03811161022257816134fb91840161342f565b60e08501526101008201356001600160401b0381116102225761351e920161342f565b610100830152565b90816020910312610222575190565b80516001600160a01b03168252611ef891602082015160208201526101006135b661358661357460408601516101206040870152610120860190610d4c565b60608601518582036060870152610d4c565b6080850151608085015260a085015160a085015260c085015160c085015260e085015184820360e0860152610d4c565b92015190610100818403910152610d4c565b9392916135e5906040928652606060208701526060860190613535565b930152565b9291906135e5602091604086526040860190613535565b9290925f92613610368261344a565b9161361f61010083018361217a565b918193835f9360208210158061383b575b6137fc575b5050506001600160f81b031916600160f81b145b6137d5575b506001600160f81b03198616600160f81b036136e5575050604051639700320360e01b815293602092859283915f91839161368c91600484016135ea565b039260581c6001600160a01b03165af19081156107bd57611ef8925f926136b4575b50614f1d565b6136d791925060203d6020116136de575b6136cf8183610fc1565b810190613526565b905f6136ae565b503d6136c5565b909491939092916001600160f81b03198116600160f91b036137965760081b93600160f01b61371961206661205f88611ead565b16613787575f61373961373360209661376399858a614d3e565b94614f1d565b604051630ccab7a160e01b8152979096889586948593926001600160e01b031916600485016135c8565b03926001600160a01b03165af19081156107bd57611ef8925f926136b45750614f1d565b6314b9743f60e01b5f5260045ffd5b919350506001600160f81b0319166120b957630b135d3f60e11b926001600160e01b0319926137c6929190613270565b16036137d0575f90565b600190565b916137e293955086614af2565b9193916137f0368284612b63565b6101008401525f61364e565b91955092508291965061380f9350611bcb565b909161381c368385612b63565b6101008501526136496138326001923390612eaf565b95905f80613635565b507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a61386a6121218484611bbd565b14613630565b63ffffffff60019116019063ffffffff821161388857565b634e487b7160e01b5f52601160045260245ffd5b5f516020615e965f395f51905f5254600a63ffffffff808360a81c1616019063ffffffff82116138885763ffffffff838116921682116139375760c81c63ffffffff1610156105e9575f516020615e965f395f51905f52805463ffffffff60c81b60c893841b1663ffffffff60c81b1990911617908190559081901c63ffffffff9081169160a81c16811161392e5750565b61023190612383565b63e60fd64760e01b5f5260045ffd5b60207f6789ec0c85d6458d897a36a70129b101f8b4d84c6e218046c3107373dbcbae88918060581c6001600160581b0360a81b5f516020615e965f395f51905f525416175f516020615e965f395f51905f5255604051906001600160581b0319168152a1565b9294909391936139be6128a185611d17565b5f516020615e965f395f51905f525460a81c63ffffffff169063ffffffff808316911614613bb6575b506020810180516001600160a01b031615613bad575b5f516020615e965f395f51905f525460a81c63ffffffff1663ffffffff613a2b610628855163ffffffff1690565b911614801590613b81575b6105e957613a84613a9192613a4a87611d17565b815181546020938401516001600160c01b031990911663ffffffff9290921691909117921b640100000000600160c01b0316919091179055565b516001600160a01b031690565b915f196001600160a01b03841601613b70575b5050506001600160f81b03198116600160f81b03613b4d5760581c6001600160a01b031690813b15610222576040516306d61fe760e41b8152925f9184918291613af2919060048401612810565b038183855af19081156107bd575f516020615e565f395f51905f529261299f92613b39575b5060408051600181526001600160a01b03909216602083015290918291820190565b806107b75f613b4793610fc1565b5f613b17565b91506001600160f81b03198216600160f91b036120b9576102319160081b6150ea565b613b7992613f49565b5f8080613aa4565b50613b8e6128a186611d17565b63ffffffff613ba4610628855163ffffffff1690565b91161015613a36565b600181526139fd565b613bc89060010163ffffffff16612383565b5f6139e7565b6040908151613bdd8382610fc1565b600681526512d95c9b995b60d21b602082015291613bfd81519182610fc1565b6005815264181719971960d91b602082015290565b91613c39925f8080946040519687958694859363d68f602560e01b85523360048601611f1b565b03926001600160a01b03165af19081156107bd575f91613c57575090565b611ef891503d805f833e6107db8183610fc1565b5f9283613c3995936040519687958694859363d68f602560e01b85523360048601611f1b565b5f9060405192808385378338925af4913d82523d5f602084013e60203d830101604052565b5f9192806040519485378338925af4913d82523d5f602084013e60203d830101604052565b6001600160a01b0316803b1561022257604051630b9dfbed60e11b815260206004820152915f918391829084908290613d18906024830190610d4c565b03925af180156107bd57613d295750565b5f61023191610fc1565b8051156123df5760200190565b80518210156123df5760209160051b010190565b909593919492965f5b87811015613dad57600190613da78a89613d938489613d8c828060051b8c013595613d8787610966565b613d40565b51946123c8565b90613d9f868d8d6123c8565b9490936139ac565b01613d5d565b509650505050505050565b90156123df5790565b9293929091906001600160a01b03821615613f3a575b613de090611e77565b93613e0c613dff613df18684613db8565b356001600160f81b03191690565b6001600160f81b03191690565b936001600160f81b03198516613f12576001600160a01b03841691613e3391908190611c07565b823b1561022257613e5d925f92836040518096819582946306d61fe760e41b845260048401612810565b03925af19485156107bd57613ec1613ee19360019361023198613efe575b5060408051600381526001600160a01b03881660208201525f516020615e565f395f51905f529190a15b82546001600160a01b0319166001600160a01b03909116178255565b0180546001600160a01b0319166001600160a01b03909316929092178255565b805460ff60a01b191660589290921c60ff60a01b16919091179055565b806107b75f613f0c93610fc1565b5f613e7b565b50909390506001600160f81b031980841603613111576001613ee191613ec161023196613ea5565b6001600160a01b039150613dd7565b6001600160a01b0316919082158015614102575b6140fd5760405163d60b347f60e01b8152306004820152602081602481875afa9081156107bd575f916140de575b50614022579080613f9b92611c07565b9190813b15610222576040516306d61fe760e41b8152925f9184918291613fc6919060048401612810565b038183855af19081156107bd575f516020615e565f395f51905f529261299f9261400e575b505b60408051600481526001600160a01b03909216602083015290918291820190565b806107b75f61401c93610fc1565b5f613feb565b811515806140bf575b614049575b505061299f5f516020615e565f395f51905f5291613fed565b908061405492611c07565b9190813b15610222576040516306d61fe760e41b8152925f918491829161407f919060048401612810565b038183855af19081156107bd575f516020615e565f395f51905f529261299f926140ab575b5091614030565b806107b75f6140b993610fc1565b5f6140a4565b506001600160f81b0319806140d7613df18585613db8565b161461402b565b6140f7915060203d602011610812576108048183610fc1565b5f613f8b565b505050565b5060018314613f5d565b9261411790846153f6565b816141665750505f80916040518260208201916306d61fe760e41b835261415081612f6b60248201604090602081525f60208201520190565b51926001600160a01b03165af1506127a76123f1565b6001600160a01b039092169190823b1561022257612798925f92836040518096819582946306d61fe760e41b845260048401612810565b7f9d17cd6d095ac90a655405ab29f30a7ee7e88ef3974c1bf7544bf591043bb71a916060916141cf82610cc883611d4e565b600160ff198254161790556040519163ffffffff60e01b1682526001600160581b031916602082015260016040820152a1565b91907f2b82f87bf66300af618a9621d3f221edfab735f5bacb4e004cce1b62375396c3905a905f8060405193614262856142546020820196638a91b0e360e01b88526020602484018181520190610d4c565b03601f198101875286610fc1565b60405193614271602086610fc1565b828552602085019583908a905f368a375193f1913d90816142b8575b815f9293523e604080516001600160a01b03909516855281151560208601529093908190810161299f565b5f915061428d565b6142cd9093929193611e77565b80546001600160a01b031981168255600190910180546001600160a01b039092169490929091906001600160f81b0319605883901b161561431d575b505081546001600160a81b03191690915550565b61433b9261432c913691612b63565b906001600160a01b0316614202565b50805460408051600381526001600160a01b0390921660208301525f516020615e765f395f51905f5291a15f8080614309565b6001600160a01b039081165f8181527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b8660205260409081902080546001600160a01b0319811690915590921694935f516020615e765f395f51905f52936143e1916143db91369190612b63565b82614202565b50815190600282526020820152a1565b92919061442161440f5f516020615e965f395f51905f525460581b90565b6001600160581b031980871691161490565b612d5c57614431611dbe85611d17565b9361445261443e82611d17565b8054640100000000600160c01b0319169055565b6001600160f81b03198116600160f81b036144955791613b176143db61299f935f516020615e765f395f51905f529560018060a01b039060581c16933691612b63565b91506001600160f81b03198216600160f91b036120b9576102319160081b61547c565b604080519091906144c98382610fc1565b6001815291601f1901825f5b8281106144e157505050565b8060606020809385010152016144d5565b906144fc82611001565b6145096040519182610fc1565b828152809261451a601f1991611001565b01905f5b82811061452a57505050565b80606060208093850101520161451e565b906040611ef8925f81528160208201520190610d4c565b600881901b9291906001600160f81b03198116600160f81b036145e557509061457a916156ba565b90916001600160f81b031981166145955750611ef8916157d2565b6001600160f81b031916600160f81b036145b257611ef891615726565b60405162461bcd60e51b815260206004820152600b60248201526a155b9cdd5c1c1bdc9d195960aa1b6044820152606490fd5b9293926001600160f81b0319811661469d5750906146029161563c565b9161460b6144b8565b956001600160f81b03198116614638575061462593615684565b61462e83613d33565b526127a782613d33565b6001600160f81b031916600160f81b036145b2576146559361565d565b61465e84613d33565b52610231577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb761299f61469084613d33565b516040519182918261453b565b909391906001600160f81b0319908116036145b2576146c76146cd916146c16144b8565b95615614565b91613cb6565b6146d985939293613d33565b526001600160f81b03198116600160f81b036147245750156146f757565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb761299f61469084613d33565b6001600160f81b0319166145b2576102315760405162461bcd60e51b815260206004820152601360248201527211195b1959d85d1958d85b1b0819985a5b1959606a1b6044820152606490fd5b9091906001600160a01b0316801580156147f9575b6140fd5781156123df575f516020615e765f395f51905f529261299f926001600160f81b031982358116146147d9575b505060408051600481526001600160a01b03909216602083015290918291820190565b6147ea816143db926147f194611c07565b3691612b63565b505f806147b6565b5060018114614786565b816040519182372090565b5f809160405136810160405236838237604051601481016040523360601b90528260143601925af190604051903d82523d5f602084013e60203d830101604052565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f0000000000000000000000000000000000000000000000000000000000000000461416156148db575b6719010000000000005f52601a52603a526042601820905f603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f00000000000000000000000000000000000000000000000000000000000000006040820152466060820152306080820152206148be565b60a061496c613bce565b90602081519101209060208151910120604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8352602083015260408201525f6060820152306080820152206719010000000000005f52601a52603a526042601820905f603a52565b94918484614a589296959396604051906149f082610fa5565b5f82525f602083015260408201995f8b52614a52606084019a8b925f84525f60808701525f60a0870152606060c0870152614a4360e08701915f83526101008801955f87529063ffffffff60e01b169052565b6001600160a01b039091169052565b5261585d565b60ff80614a71614a6b613df18786613db8565b60f81c90565b1603614ab757614aa0614a8b84614a9b95614ab094611c07565b9490955163ffffffff60e01b1690565b611ead565b5460101c6001600160a01b031690565b9351929190565b63b32eeb6960e01b5f5260045ffd5b8065ffffffffffff8260a01c16918215600114614ae4575b60d01c92565b65ffffffffffff9250614ade565b9190939293601481019160141161022257803560601c92829190614b14612d92565b6001600160a01b03909516602086019081529490614b72614b376128a183611d17565b5f516020615e965f395f51905f525460a81c63ffffffff169063ffffffff808316911603614cd757614b6890613870565b63ffffffff168352565b815163ffffffff1695516001600160a01b031697614b90858061217a565b614b9991614803565b986034850199614ba98b8861217a565b614bb291614803565b906054870199614bc28b8a61217a565b614bcb91614803565b604080517fb17ab1224aca0d4255ef8161acaf2ac121b8faa32a4b2258c912cc5f8308c505602082019081526001600160581b03198a169282019290925263ffffffff9390931660608401526001600160a01b0395909516608083015260a082019290925260c081019290925260e0808301919091528152614c4f61010082610fc1565b519020905f1461051a61029b98614cb0609498612a3397614c916129b79761052097614cc957614c7e90614962565b614c8b60748d018561217a565b91615acb565b9e614ca7614c9f848061217a565b92909461217a565b9390928a6139ac565b614cc3614cbd828b61217a565b90615c88565b8861217a565b614cd290614850565b614c7e565b614b68565b80548210156123df575f5260205f2001905f90565b356001600160c01b0319811692919060088210614d0c575050565b6001600160c01b031960089290920360031b82901b16169150565b604090611ef8939281528160208201520190613535565b93929190935f926001614d5083611ead565b015f5b8154811015614ee057614d81614d79614d6c8385614cdc565b90549060031b1c60501b90565b908160501c90565b939095614d9d614d97614a6b613df18585613db8565b60ff1690565b808403614eb25750908181614dd6614dca614dc4614dbe84614df498611c23565b90614cf1565b60c01c90565b6001600160401b031690565b600901918c610100614dec6147ea868686611c34565b910152611cc9565b939093955b600160f01b1615614e11575b50600101939193614d53565b604051633894f6e760e11b81529196906020908390815f81614e418f6001600160e01b03198d1660048401614d27565b03926001600160a01b03165af19182156107bd575f92614e92575b506001600160a01b038216614e7e57600191614e7791614f1d565b9590614e05565b631f24c1fb60e11b5f52600487905260245ffd5b614eab91925060203d81116136de576136cf8183610fc1565b905f614e5c565b9196909491831115614ecd57630760bdcf60e11b5f5260045ffd5b614ed56122ca565b6101008b0152614df9565b505091929460ff80614ef8614a6b613df18789613db8565b1603614ab757610100614f156147ea85614aa096611ef898611c07565b910152611ead565b908082186001600160a01b031615606083811b838501821b9081149184901b141717600114614f4d575050600190565b65ffffffffffff60a01b8216916001600160d01b03198082169083168415614fcd575b65ffffffffffff60a01b84168015614fbd575b858110908618028086189514614fac575b81811190821802189160018060a01b03911716171790565b65ffffffffffff60a01b9450614f94565b5065ffffffffffff60a01b614f83565b65ffffffffffff60a01b9450614f70565b903590601e198136030182121561022257018035906001600160401b03821161022257602001918160051b3603831361022257565b8054905f815581615022575050565b5f5260205f20908101905b818110615038575050565b5f815560010161502d565b356001600160501b031981169291906016821061505e575050565b6001600160501b031960169290920360031b82901b16169150565b805468010000000000000000811015610f6a5761509b91600182018155614cdc565b819291549060031b9160501c821b9160018060b01b03901b1916179055565b9092809260209483528483013701015f815290565b356001600160f01b0319811692919060028210612326575050565b91906150f69080614fde565b9260fe841180156153ee575b6153df57600161511182611ead565b01546153c6575b5f1984015f5b8181106152885750906151dd6151d683876151766151c76151ae6120666151a86151a2876151f99e9f8e61519d6152079f8f90611e0861291061290a61516861516e9489896123c8565b90611c5f565b9a8b91611ead565b805462010000600160b01b03191660109290921b62010000600160b01b0316919091179055565b6123c8565b90611c8d565b906150cf565b6151b788611ead565b9060f01c61ffff19825416179055565b6001600160a01b0316966123c8565b8091611c70565b6040519586939092906001600160e01b031916602085016150ba565b03601f198101845283610fc1565b803b15610222575f61522d92604051809481926306d61fe760e41b835260048301612266565b038183855af19081156107bd575f516020615e565f395f51905f529261299f92615274575b5060408051600681526001600160a01b03909216602083015290918291820190565b806107b75f61528293610fc1565b5f615252565b615323906152ce600161529a86611ead565b016152c86152bb6152b56152af868d8c6123c8565b90611c51565b90615043565b6001600160501b03191690565b90615079565b6152e8611e08611e0861291061290a615168868d8c6123c8565b6152f66151d6838a896123c8565b60405194918591615315916001600160e01b03198a16602085016150ba565b03601f198101855284610fc1565b803b15610222576040516306d61fe760e41b8152925f91849182908490829061534f9060048301612266565b03925af19182156107bd576001926153b2575b505f516020615e565f395f51905f526153a961538861291061290a615168868d8c6123c8565b60408051600581526001600160a01b03909216602083015290918291820190565b0390a10161511e565b806107b75f6153c093610fc1565b5f615362565b6153da60016153d483611ead565b01615013565b615118565b63b62d956d60e01b5f5260045ffd5b508315615102565b5f516020615e565f395f51905f52916040916001600160a01b03821615615473575b6001600160a01b039081165f8181527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b8660205284902080546001600160a01b03191693909216929092179055815190600282526020820152a1565b60019150615418565b919061548783611ead565b916154928280614fde565b9190506001840191600183540103615605575f5b825481101561554357805f516020615e765f395f51905f5261553a86615518612f6b6143db8c6154fc886154f66154e6614d798f60019e614d6c91614cdc565b90508c8060a01b03169780614fde565b906123c8565b6040519485939092906001600160e01b031916602085016150ba565b5060408051600581526001600160a01b03909216602083015290918291820190565b0390a1016154a6565b50936155a6915061023193926155a16151f99261556460016153d483611ead565b85546151dd9061557f9060101c6001600160a01b0316611e08565b9361559661558d8280614fde565b91909280614fde565b5f19019290506123c8565b614202565b5080545f516020615e765f395f51905f52906155f2906155d19060101c6001600160a01b0316611e08565b60408051600681526001600160a01b03909216602083015290918291820190565b0390a180546001600160b01b0319169055565b63013dcc8d60e31b5f5260045ffd5b91601382111561562f57823560601c92601401916013190190565b63ba597e7e5f526004601cfd5b90603381111561562f57813560601c92601483013592603401916033190190565b905f928491604051958692833738935af1913d82523d5f602084013e60203d830101604052565b90925f92819594604051968792833738935af1156156b1573d82523d5f602084013e60203d830101604052565b503d5f823e3d90fd5b918235826020118160401c1761562f5783016020810193813593846156de57505050565b01601f190190835b5f190160208160051b8301013580830160608101908135809101918680602080860135809601011191111792171760401c1761562f57806156e657505050565b9190615731816144f2565b925f5b82811061574057505050565b8061576a60019260051b84013584016040810135810190602082359201906020810135903561565d565b6157748389613d40565b5215615781575b01615734565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76157ca6157af8389613d40565b51604051918291858352604060208401526040830190610d4c565b0390a161577b565b91906157dd816144f2565b925f5b8281106157ec57505050565b8061581660019260051b840135840160408101358101906020823592019060208101359035615684565b6158208288613d40565b5261582b8187613d40565b50016157e0565b9092608092611ef89594835260018060a01b0316602083015260408201528160608201520190610d4c565b91606083019060016158b2615879845163ffffffff60e01b1690565b6001600160e01b0319165f9081527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f8526020526040902090565b01805493905f5b8581106158c95750505050505050565b6158d9614d79614d6c8385614cdc565b6001600160a01b031660a0890190815260808901949091615902906001600160f01b0319168652565b61591c615915614a6b613df18985613db8565b60ff168a52565b61592a614d978a5160ff1690565b808403615a99575085818161594f614dca614dc4614dbe6159a49b9c61597798611c23565b8c60c061596a6147ea60208401948086526009018688611c34565b9101525160090191611cc9565b949094955b51600160f11b90615996906001600160f01b031916612066565b166001600160f01b03191690565b156159b3575b506001016158b9565b516159c6906001600160a01b0316611e08565b60206159ec6159df6159df895163ffffffff60e01b1690565b6001600160e01b03191690565b60e08a01516101008b015160c08c015160405163184dfdbb60e11b8152958694909385938493615a2b9390926001600160a01b03169060048601615832565b03915afa9081156107bd575f91615a7b575b506001600160a01b038116615a675790600191615a5f60408a01918251614f1d565b9052906159aa565b631f24c1fb60e11b5f52600482905260245ffd5b615a93915060203d81116136de576136cf8183610fc1565b5f615a3d565b909490831115615ab257630760bdcf60e11b5f5260045ffd5b6159a490615ac1365f88612b63565b60c08b015261597c565b5f516020615e965f395f51905f52545f9493929060581b6001600160f81b03198116600160f81b03615b865791615b2b9391615b0c611e0860209560581c90565b9160405195869485938493637aa8f17760e11b85523060048601611f1b565b03915afa9081156107bd575f91615b67575b505b6001600160e01b0319166374eca2c160e11b01615b5857565b6362467c7760e11b5f5260045ffd5b615b80915060203d602011612029576120218183610fc1565b5f615b3d565b90949192916001600160f81b03198216600160f91b03615c275750602091615bb49160081b958430886149d7565b60405163392dffaf60e01b81529297929586949385938493615be793909230906001600160e01b03191660048701613329565b03916001600160a01b03165afa9081156107bd575f91615c08575b50615b3f565b615c21915060203d602011612029576120218183610fc1565b5f615c02565b94906001600160f81b0319166120b957615c4092613270565b615b3f565b15615c4c57565b60405162461bcd60e51b8152602060048201526014602482015273496e76616c69642073656c6563746f724461746160601b6044820152606490fd5b615c956105208383611b92565b916004811015615ca457505050565b602c8110615e4657602c820190615cc4611e0861291061290a8487611be8565b615cee615ce0613dff613df1615cda878061217a565b90613db8565b6001600160f81b0319161590565b80615da1575b611e0861291061290a85615d496102319a87615d2d611e0861291061290a8f9d612a3a9f9e8f604c9f612ab39f615d4f575b5050611cb8565b615d378b8061217a565b9390926001600160a01b031690613dc1565b88611cb8565b612a3a615d93615d9a93606c860190615d8e615d7d611e0861291061290a615d77878761217a565b90611bf9565b9586906001600160a01b03166153f6565b61217a565b8091611c9b565b8f87615d26565b5060405163ecd0596160e01b81526002600482015290949291906020816024816001600160a01b038a165afa9384156107bd5761291061290a84615d49611e08948b615d2d611e086129106102319f8f9c612a3a9f9d8f604c9f93612ab39f9461290a955f91615e27575b509f50505050505050505097509a5050959650505050615cf4565b615e40915060203d602011610812576108048183610fc1565b5f615e0c565b61023192506004915014615c4556fed21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x21", + "chainId": "0xde9fb" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x66dcf41505d80d7ac4c29e1e8927215b0bf6f3dba29e54a127e0a45d23cd0237", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0x7a149486b8ecba0916ef80bc23705e46dbe4d6c8", + "function": null, + "arguments": [ + "0x8768fA84bd76610ACc6AF35b578fE847e1CFf0cA" + ], + "transaction": { + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x5d17a", + "value": "0x0", + "input": "0x000000000000000000000000000000000000000000000000000000000000000060a034607357601f61044238819003918201601f19168301916001600160401b03831184841017607757808492602094604052833981010312607357516001600160a01b03811681036073576080526040516103b6908161008c823960805181818160c60152818161021d01526102d80152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816348aac39214610250575080635c60da1b146102085763ea6d13ac1461003d575f80fd5b6100463661033f565b60405161006c602080838181019587898837878201908382015203018084520182610394565b519020905f92604051927fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f60212060358501523060581b845260ff84538060158501526055842094341591863b156101eb5750506001906101e6575f38818034895af1156101d9575b836040525f60605215610157575b6040516001600160a01b0385168152602090f35b9180825f9493859483378101838152039082855af13d156101d4573d67ffffffffffffffff81116101c0576040519061019a601f8201601f191660200183610394565b81525f60203d92013e5b156101b1575f8080610143565b63487e630960e11b5f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b6101a4565b63b12d13eb5f526004601cfd5b610135565b91509450605f602134f593846101355763301164255f526004601cfd5b3461024c575f36600319011261024c576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b3461024c57806102826020806102653661033f565b908084889499019889378201908382015203018084520182610394565b5190206040517fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f602120906040525f60605260ff5f536035523060601b600152601552602060555f205f6035526040519060018060a01b03168152f35b90604060031983011261024c5760043567ffffffffffffffff811161024c578260238201121561024c5780600401359267ffffffffffffffff841161024c576024848301011161024c57602401919060243590565b90601f8019910116810190811067ffffffffffffffff8211176101c057604052560000000000000000000000008768fa84bd76610acc6af35b578fe847e1cff0ca", + "nonce": "0x22", + "chainId": "0xde9fb" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xa5367600a6be8e321bf917a5979e18dafdc140058027b34a1f2716b1fda12e13", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xd703aae79538628d27099b8c4f621be4ccd142d5", + "function": "approveFactory(address,bool)", + "arguments": [ + "0x7A149486b8ECba0916Ef80Bc23705e46dbE4D6c8", + "true" + ], + "transaction": { + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0xd703aae79538628d27099b8c4f621be4ccd142d5", + "gas": "0x108d1", + "value": "0x0", + "input": "0x6e7dbabb0000000000000000000000007a149486b8ecba0916ef80bc23705e46dbe4d6c80000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x23", + "chainId": "0xde9fb" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x520e32", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x3b084e89fe78ec6ad227bc762285f7529a43d605148e6f39a8838818d1bfb674", + "transactionIndex": "0x1", + "blockHash": "0xe734e5f89fe4cd44db775957c69728d29d876a86236b44f5fb9b89c8b4b7c198", + "blockNumber": "0x9dadb8", + "gasUsed": "0x5162e4", + "effectiveGasPrice": "0xfd", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0x8768fa84bd76610acc6af35b578fe847e1cff0ca", + "l1BaseFeeScalar": "0xa6fe0", + "l1BlobBaseFee": "0x21ec", + "l1BlobBaseFeeScalar": "0x0", + "l1Fee": "0x350133c62662b1", + "l1GasPrice": "0x1729ed7fb9", + "l1GasUsed": "0x3586c" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x5608a5", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x66dcf41505d80d7ac4c29e1e8927215b0bf6f3dba29e54a127e0a45d23cd0237", + "transactionIndex": "0x2", + "blockHash": "0xe734e5f89fe4cd44db775957c69728d29d876a86236b44f5fb9b89c8b4b7c198", + "blockNumber": "0x9dadb8", + "gasUsed": "0x3fa73", + "effectiveGasPrice": "0xfd", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0x7a149486b8ecba0916ef80bc23705e46dbe4d6c8", + "l1BaseFeeScalar": "0xa6fe0", + "l1BlobBaseFee": "0x21ec", + "l1BlobBaseFeeScalar": "0x0", + "l1Fee": "0x2d75ccb73da5b", + "l1GasPrice": "0x1729ed7fb9", + "l1GasUsed": "0x2de8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x56bdb8", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xa5367600a6be8e321bf917a5979e18dafdc140058027b34a1f2716b1fda12e13", + "transactionIndex": "0x3", + "blockHash": "0xe734e5f89fe4cd44db775957c69728d29d876a86236b44f5fb9b89c8b4b7c198", + "blockNumber": "0x9dadb8", + "gasUsed": "0xb513", + "effectiveGasPrice": "0xfd", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0xd703aae79538628d27099b8c4f621be4ccd142d5", + "contractAddress": null, + "l1BaseFeeScalar": "0xa6fe0", + "l1BlobBaseFee": "0x21ec", + "l1BlobBaseFeeScalar": "0x0", + "l1Fee": "0x630670e86a13", + "l1GasPrice": "0x1729ed7fb9", + "l1GasUsed": "0x640" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1738927689, + "chain": 911867, + "commit": "234e3b6" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/911867/run-latest.json b/broadcast/DeployKernel.s.sol/911867/run-latest.json index 1771d650..25752103 100644 --- a/broadcast/DeployKernel.s.sol/911867/run-latest.json +++ b/broadcast/DeployKernel.s.sol/911867/run-latest.json @@ -1,7 +1,7 @@ { "transactions": [ { - "hash": null, + "hash": "0x3b084e89fe78ec6ad227bc762285f7529a43d605148e6f39a8838818d1bfb674", "transactionType": "CREATE2", "contractName": "Kernel", "contractAddress": "0x8768fa84bd76610acc6af35b578fe847e1cff0ca", @@ -22,7 +22,7 @@ "isFixedGasLimit": false }, { - "hash": null, + "hash": "0x66dcf41505d80d7ac4c29e1e8927215b0bf6f3dba29e54a127e0a45d23cd0237", "transactionType": "CREATE2", "contractName": "KernelFactory", "contractAddress": "0x7a149486b8ecba0916ef80bc23705e46dbe4d6c8", @@ -43,7 +43,7 @@ "isFixedGasLimit": false }, { - "hash": null, + "hash": "0xa5367600a6be8e321bf917a5979e18dafdc140058027b34a1f2716b1fda12e13", "transactionType": "CALL", "contractName": null, "contractAddress": "0xd703aae79538628d27099b8c4f621be4ccd142d5", @@ -65,11 +65,78 @@ "isFixedGasLimit": false } ], - "receipts": [], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x520e32", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x3b084e89fe78ec6ad227bc762285f7529a43d605148e6f39a8838818d1bfb674", + "transactionIndex": "0x1", + "blockHash": "0xe734e5f89fe4cd44db775957c69728d29d876a86236b44f5fb9b89c8b4b7c198", + "blockNumber": "0x9dadb8", + "gasUsed": "0x5162e4", + "effectiveGasPrice": "0xfd", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0x8768fa84bd76610acc6af35b578fe847e1cff0ca", + "l1BaseFeeScalar": "0xa6fe0", + "l1BlobBaseFee": "0x21ec", + "l1BlobBaseFeeScalar": "0x0", + "l1Fee": "0x350133c62662b1", + "l1GasPrice": "0x1729ed7fb9", + "l1GasUsed": "0x3586c" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x5608a5", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x66dcf41505d80d7ac4c29e1e8927215b0bf6f3dba29e54a127e0a45d23cd0237", + "transactionIndex": "0x2", + "blockHash": "0xe734e5f89fe4cd44db775957c69728d29d876a86236b44f5fb9b89c8b4b7c198", + "blockNumber": "0x9dadb8", + "gasUsed": "0x3fa73", + "effectiveGasPrice": "0xfd", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0x7a149486b8ecba0916ef80bc23705e46dbe4d6c8", + "l1BaseFeeScalar": "0xa6fe0", + "l1BlobBaseFee": "0x21ec", + "l1BlobBaseFeeScalar": "0x0", + "l1Fee": "0x2d75ccb73da5b", + "l1GasPrice": "0x1729ed7fb9", + "l1GasUsed": "0x2de8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x56bdb8", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xa5367600a6be8e321bf917a5979e18dafdc140058027b34a1f2716b1fda12e13", + "transactionIndex": "0x3", + "blockHash": "0xe734e5f89fe4cd44db775957c69728d29d876a86236b44f5fb9b89c8b4b7c198", + "blockNumber": "0x9dadb8", + "gasUsed": "0xb513", + "effectiveGasPrice": "0xfd", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0xd703aae79538628d27099b8c4f621be4ccd142d5", + "contractAddress": null, + "l1BaseFeeScalar": "0xa6fe0", + "l1BlobBaseFee": "0x21ec", + "l1BlobBaseFeeScalar": "0x0", + "l1Fee": "0x630670e86a13", + "l1GasPrice": "0x1729ed7fb9", + "l1GasUsed": "0x640" + } + ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1738927559, + "timestamp": 1738927689, "chain": 911867, - "commit": "88d20d3" + "commit": "234e3b6" } \ No newline at end of file diff --git a/src/Kernel.sol b/src/Kernel.sol index 3471135d..9164bec4 100644 --- a/src/Kernel.sol +++ b/src/Kernel.sol @@ -35,6 +35,9 @@ import { MODULE_TYPE_HOOK, MODULE_TYPE_POLICY, MODULE_TYPE_SIGNER, + HOOK_MODULE_NOT_INSTALLED, + HOOK_MODULE_INSTALLED, + HOOK_ONLY_ENTRYPOINT, EXECTYPE_TRY, EXECTYPE_DEFAULT, EXEC_MODE_DEFAULT, @@ -44,7 +47,8 @@ import { CALLTYPE_STATIC, MAGIC_VALUE_SIG_REPLAYABLE, ERC1271_INVALID, - ERC1271_MAGICVALUE + ERC1271_MAGICVALUE, + EIP7702_PREFIX } from "./types/Constants.sol"; import {InstallExecutorDataFormat, InstallFallbackDataFormat, InstallValidatorDataFormat} from "./types/Structs.sol"; @@ -59,6 +63,7 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager error InvalidCaller(); error InvalidSelector(); error InitConfigError(uint256 idx); + error AlreadyInitialized(); event Received(address sender, uint256 amount); event Upgraded(address indexed implementation); @@ -106,8 +111,8 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager ) external { ValidationStorage storage vs = _validationStorage(); require( - ValidationId.unwrap(vs.rootValidator) == bytes21(0) && bytes2(address(this).code) != 0xef01, - "already initialized" + ValidationId.unwrap(vs.rootValidator) == bytes21(0) && bytes2(address(this).code) != EIP7702_PREFIX, + AlreadyInitialized() ); if (ValidationId.unwrap(_rootValidator) == bytes21(0)) { revert InvalidValidator(); @@ -143,7 +148,7 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager revert InvalidValidationType(); } _setRootValidator(_rootValidator); - if (_validationStorage().validationConfig[_rootValidator].hook == IHook(address(0))) { + if (_validationStorage().validationConfig[_rootValidator].hook == IHook(HOOK_MODULE_NOT_INSTALLED)) { // when new rootValidator is not installed yet ValidationConfig memory config = ValidationConfig({nonce: uint32(vs.currentNonce), hook: hook}); _installValidation(_rootValidator, config, validatorData, hookData); @@ -186,14 +191,14 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager SelectorConfig memory config = _selectorConfig(msg.sig); bool success; bytes memory result; - if (address(config.hook) == address(0)) { + if (address(config.hook) == HOOK_MODULE_NOT_INSTALLED) { revert InvalidSelector(); } // action installed bytes memory context; - if (address(config.hook) != address(1) && address(config.hook) != 0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF) { + if (address(config.hook) != HOOK_MODULE_INSTALLED && address(config.hook) != HOOK_ONLY_ENTRYPOINT) { context = _doPreHook(config.hook, msg.value, msg.data); - } else if (address(config.hook) == 0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF) { + } else if (address(config.hook) == HOOK_ONLY_ENTRYPOINT) { // for selector manager, address(0) for the hook will default to type(address).max, // and this will only allow entrypoints to interact if (msg.sender != address(entrypoint)) { @@ -213,7 +218,7 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager revert(add(result, 0x20), mload(result)) } } - if (address(config.hook) != address(1) && address(config.hook) != 0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF) { + if (address(config.hook) != address(1) && address(config.hook) != HOOK_ONLY_ENTRYPOINT) { _doPostHook(config.hook, context); } assembly { @@ -247,12 +252,12 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager revert InvalidNonce(); } IHook execHook = vc.hook; - if (address(execHook) == address(0) && vType != VALIDATION_TYPE_ROOT) { + if (address(execHook) == HOOK_MODULE_NOT_INSTALLED && vType != VALIDATION_TYPE_ROOT) { revert InvalidValidator(); } executionHook[userOpHash] = execHook; - if (address(execHook) == address(1) || address(execHook) == address(0)) { + if (address(execHook) == HOOK_MODULE_INSTALLED || address(execHook) == HOOK_MODULE_NOT_INSTALLED) { // does not require hook if (vType != VALIDATION_TYPE_ROOT && !vs.allowedSelectors[vId][bytes4(userOp.callData[0:4])]) { revert InvalidValidator(); @@ -304,15 +309,15 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager { // no modifier needed, checking if msg.sender is registered executor will replace the modifier IHook hook = _executorConfig(IExecutor(msg.sender)).hook; - if (address(hook) == address(0)) { + if (address(hook) == HOOK_MODULE_NOT_INSTALLED) { revert InvalidExecutor(); } bytes memory context; - if (address(hook) != address(1)) { + if (address(hook) != HOOK_MODULE_INSTALLED) { context = _doPreHook(hook, msg.value, msg.data); } returnData = ExecLib.execute(execMode, executionCalldata); - if (address(hook) != address(1)) { + if (address(hook) != HOOK_MODULE_INSTALLED) { _doPostHook(hook, context); } } @@ -332,7 +337,7 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager sig = sig[32:]; } ValidationType vType = ValidatorLib.getType(vId); - if (address(vs.validationConfig[vId].hook) == address(0) && vType != VALIDATION_TYPE_7702) { + if (address(vs.validationConfig[vId].hook) == HOOK_MODULE_NOT_INSTALLED && vType != VALIDATION_TYPE_7702) { revert InvalidValidator(); } if (vType == VALIDATION_TYPE_VALIDATOR) { diff --git a/src/types/Constants.sol b/src/types/Constants.sol index dd5930b0..1bb36975 100644 --- a/src/types/Constants.sol +++ b/src/types/Constants.sol @@ -42,6 +42,14 @@ ValidationType constant VALIDATION_TYPE_7702 = ValidationType.wrap(0x00); ValidationType constant VALIDATION_TYPE_VALIDATOR = ValidationType.wrap(0x01); ValidationType constant VALIDATION_TYPE_PERMISSION = ValidationType.wrap(0x02); +// --- Kernel Hook constants --- +address constant HOOK_MODULE_NOT_INSTALLED = address(0); +address constant HOOK_MODULE_INSTALLED = address(1); +address constant HOOK_ONLY_ENTRYPOINT = address(0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF); + +// --- EIP7702 constants --- +bytes2 constant EIP7702_PREFIX = bytes2(0xef01); + // --- storage slots --- // bytes32(uint256(keccak256('kernel.v3.selector')) - 1) bytes32 constant SELECTOR_MANAGER_STORAGE_SLOT = 0x7c341349a4360fdd5d5bc07e69f325dc6aaea3eb018b3e0ea7e53cc0bb0d6f3b; From af0e8fcd7f440b165bbf9d7bebc5483c06a4ce35 Mon Sep 17 00:00:00 2001 From: leekt Date: Sun, 9 Feb 2025 00:16:17 +0900 Subject: [PATCH 05/14] refactoring --- src/Kernel.sol | 118 ++++++++++++++------------------- src/core/ExecutorManager.sol | 4 +- src/core/SelectorManager.sol | 5 +- src/core/ValidationManager.sol | 66 ++++++++++++------ 4 files changed, 99 insertions(+), 94 deletions(-) diff --git a/src/Kernel.sol b/src/Kernel.sol index 9164bec4..5a97acf6 100644 --- a/src/Kernel.sol +++ b/src/Kernel.sol @@ -86,10 +86,10 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager } modifier onlyEntryPointOrSelfOrRoot() { - IValidator validator = ValidatorLib.getValidator(_validationStorage().rootValidator); if ( msg.sender != address(entrypoint) && msg.sender != address(this) // do rootValidator hook ) { + IValidator validator = ValidatorLib.getValidator(_validationStorage().rootValidator); if (validator.isModuleType(4)) { bytes memory ret = IHook(address(validator)).preCheck(msg.sender, msg.value, msg.data); _; @@ -140,7 +140,7 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager bytes calldata hookData ) external payable onlyEntryPointOrSelfOrRoot { ValidationStorage storage vs = _validationStorage(); - if (ValidationId.unwrap(_rootValidator) == bytes21(0)) { + if (ValidationId.unwrap(_rootValidator) == bytes21(0) || bytes2(address(this).code) == EIP7702_PREFIX) { revert InvalidValidator(); } ValidationType vType = ValidatorLib.getType(_rootValidator); @@ -196,14 +196,14 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager } // action installed bytes memory context; - if (address(config.hook) != HOOK_MODULE_INSTALLED && address(config.hook) != HOOK_ONLY_ENTRYPOINT) { - context = _doPreHook(config.hook, msg.value, msg.data); - } else if (address(config.hook) == HOOK_ONLY_ENTRYPOINT) { + if (address(config.hook) == HOOK_ONLY_ENTRYPOINT) { // for selector manager, address(0) for the hook will default to type(address).max, // and this will only allow entrypoints to interact if (msg.sender != address(entrypoint)) { revert InvalidCaller(); } + } else if (address(config.hook) != HOOK_MODULE_INSTALLED) { + context = _doPreHook(config.hook, msg.value, msg.data); } // execute action if (config.callType == CALLTYPE_SINGLE) { @@ -218,7 +218,7 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager revert(add(result, 0x20), mload(result)) } } - if (address(config.hook) != address(1) && address(config.hook) != HOOK_ONLY_ENTRYPOINT) { + if (address(config.hook) != HOOK_MODULE_INSTALLED && address(config.hook) != HOOK_ONLY_ENTRYPOINT) { _doPostHook(config.hook, context); } assembly { @@ -245,7 +245,7 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager if (vType == VALIDATION_TYPE_ROOT) { vId = vs.rootValidator; } - validationData = _doValidation(vMode, vId, userOp, userOpHash); + validationData = _validateUserOp(vMode, vId, userOp, userOpHash); ValidationConfig memory vc = vs.validationConfig[vId]; // allow when nonce is not revoked or vType is sudo if (vType != VALIDATION_TYPE_ROOT && vc.nonce < vs.validNonceFrom) { @@ -280,6 +280,10 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager } } + function isValidSignature(bytes32 hash, bytes calldata data) external view returns (bytes4) { + return _verifySignature(hash, data); + } + // --- Execution --- function executeUserOp(PackedUserOperation calldata userOp, bytes32 userOpHash) external @@ -289,7 +293,7 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager { bytes memory context; IHook hook = executionHook[userOpHash]; - if (address(hook) != address(1)) { + if (address(hook) != HOOK_MODULE_INSTALLED) { // removed 4bytes selector context = _doPreHook(hook, msg.value, userOp.callData[4:]); } @@ -297,7 +301,7 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager if (!success) { revert ExecutionReverted(); } - if (address(hook) != address(1)) { + if (address(hook) != HOOK_MODULE_INSTALLED) { _doPostHook(hook, context); } } @@ -313,11 +317,12 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager revert InvalidExecutor(); } bytes memory context; - if (address(hook) != HOOK_MODULE_INSTALLED) { + bool callHook = address(hook) != HOOK_MODULE_INSTALLED; + if (callHook) { context = _doPreHook(hook, msg.value, msg.data); } returnData = ExecLib.execute(execMode, executionCalldata); - if (address(hook) != HOOK_MODULE_INSTALLED) { + if (callHook) { _doPostHook(hook, context); } } @@ -326,37 +331,6 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager ExecLib.execute(execMode, executionCalldata); } - function isValidSignature(bytes32 hash, bytes calldata signature) external view override returns (bytes4) { - ValidationStorage storage vs = _validationStorage(); - (ValidationId vId, bytes calldata sig) = ValidatorLib.decodeSignature(signature); - if (ValidatorLib.getType(vId) == VALIDATION_TYPE_ROOT) { - vId = vs.rootValidator; - } - bool isReplayable = sig.length >= 32 && bytes32(sig[0:32]) == MAGIC_VALUE_SIG_REPLAYABLE; - if (isReplayable) { - sig = sig[32:]; - } - ValidationType vType = ValidatorLib.getType(vId); - if (address(vs.validationConfig[vId].hook) == HOOK_MODULE_NOT_INSTALLED && vType != VALIDATION_TYPE_7702) { - revert InvalidValidator(); - } - if (vType == VALIDATION_TYPE_VALIDATOR) { - IValidator validator = ValidatorLib.getValidator(vId); - return validator.isValidSignatureWithSender(msg.sender, _toWrappedHash(hash, isReplayable), sig); - } else if (vType == VALIDATION_TYPE_PERMISSION) { - PermissionId pId = ValidatorLib.getPermissionId(vId); - PassFlag permissionFlag = vs.permissionConfig[pId].permissionFlag; - if (PassFlag.unwrap(permissionFlag) & PassFlag.unwrap(SKIP_SIGNATURE) != 0) { - revert PermissionNotAlllowedForSignature(); - } - return _checkPermissionSignature(pId, msg.sender, hash, sig, isReplayable); - } else if (vType == VALIDATION_TYPE_7702) { - return _verify7702Signature(_toWrappedHash(hash, isReplayable), sig); - } else { - revert InvalidValidationType(); - } - } - function installModule(uint256 moduleType, address module, bytes calldata initData) external payable @@ -381,7 +355,7 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager _installValidation(vId, config, data.validatorData, data.hookData); if (data.selectorData.length == 4) { // NOTE: we don't allow configure on selector data on v3.1+, but using bytes instead of bytes4 for selector data to make sure we are future proof - _setSelector(vId, bytes4(data.selectorData[0:4]), true); + _grantAccess(vId, bytes4(data.selectorData[0:4]), true); } } else if (moduleType == MODULE_TYPE_EXECUTOR) { InstallExecutorDataFormat calldata data; @@ -415,6 +389,10 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager emit ModuleInstalled(moduleType, module); } + function grantAccess(ValidationId vId, bytes4 selector, bool allow) external payable onlyEntryPointOrSelfOrRoot { + _grantAccess(vId, selector, allow); + } + function installValidations( ValidationId[] calldata vIds, ValidationConfig[] memory configs, @@ -429,7 +407,18 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager payable onlyEntryPointOrSelfOrRoot { - IHook hook = _uninstallValidation(vId, deinitData); + IHook hook = _clearValidationData(vId); + ValidationType vType = ValidatorLib.getType(vId); + if (vType == VALIDATION_TYPE_VALIDATOR) { + IValidator validator = ValidatorLib.getValidator(vId); + ModuleLib.uninstallModule(address(validator), deinitData); + emit IERC7579Account.ModuleUninstalled(MODULE_TYPE_VALIDATOR, address(validator)); + } else if (vType == VALIDATION_TYPE_PERMISSION) { + PermissionId permission = ValidatorLib.getPermissionId(vId); + _uninstallPermission(permission, deinitData); + } else { + revert InvalidValidationType(); + } _uninstallHook(hook, hookDeinitData); } @@ -443,26 +432,31 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager override onlyEntryPointOrSelfOrRoot { - if (moduleType == 1) { + if (moduleType == MODULE_TYPE_VALIDATOR) { ValidationId vId = ValidatorLib.validatorToIdentifier(IValidator(module)); - _uninstallValidation(vId, deInitData); - } else if (moduleType == 2) { - _uninstallExecutor(IExecutor(module), deInitData); - } else if (moduleType == 3) { + _clearValidationData(vId); + } else if (moduleType == MODULE_TYPE_EXECUTOR) { + _clearExecutorData(IExecutor(module)); + } else if (moduleType == MODULE_TYPE_FALLBACK) { bytes4 selector = bytes4(deInitData[0:4]); - _uninstallSelector(selector, deInitData[4:]); - } else if (moduleType == 4) { + address target; + _clearSelectorData(selector); + if (target == address(0)) { + return; + } + require(target == module, InvalidSelector()); + deInitData = deInitData[4:]; + } else if (moduleType == MODULE_TYPE_HOOK) { ValidationId vId = _validationStorage().rootValidator; if (_validationStorage().validationConfig[vId].hook == IHook(module)) { // when root validator hook is being removed // remove hook on root validator to prevent kernel from being locked - _validationStorage().validationConfig[vId].hook = IHook(address(1)); + _validationStorage().validationConfig[vId].hook = IHook(HOOK_MODULE_INSTALLED); } // force call onUninstall for hook // NOTE: for hook, kernel does not support independent hook install, // hook is expected to be paired with proper validator/executor/selector - ModuleLib.uninstallModule(module, deInitData); - } else if (moduleType == 5) { + } else if (moduleType == MODULE_TYPE_POLICY || moduleType == MODULE_TYPE_SIGNER) { ValidationId rootValidator = _validationStorage().rootValidator; bytes32 permissionId = bytes32(deInitData[0:32]); if (ValidatorLib.getType(rootValidator) == VALIDATION_TYPE_PERMISSION) { @@ -474,23 +468,13 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager // NOTE: for policy, kernel does not support independent policy install, // policy is expected to be paired with proper permissionId // to "REMOVE" permission, use "uninstallValidation()" function - ModuleLib.uninstallModule(module, deInitData); - } else if (moduleType == 6) { - ValidationId rootValidator = _validationStorage().rootValidator; - bytes32 permissionId = bytes32(deInitData[0:32]); - if (ValidatorLib.getType(rootValidator) == VALIDATION_TYPE_PERMISSION) { - if (permissionId == bytes32(PermissionId.unwrap(ValidatorLib.getPermissionId(rootValidator)))) { - revert RootValidatorCannotBeRemoved(); - } - } - // force call onUninstall for signer // NOTE: for signer, kernel does not support independent signer install, // signer is expected to be paired with proper permissionId // to "REMOVE" permission, use "uninstallValidation()" function - ModuleLib.uninstallModule(module, deInitData); } else { revert InvalidModuleType(); } + ModuleLib.uninstallModule(module, deInitData); emit ModuleUninstalled(moduleType, module); } @@ -510,9 +494,9 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager { if (moduleType == MODULE_TYPE_VALIDATOR) { return _validationStorage().validationConfig[ValidatorLib.validatorToIdentifier(IValidator(module))].hook - != IHook(address(0)); + != IHook(HOOK_MODULE_NOT_INSTALLED); } else if (moduleType == MODULE_TYPE_EXECUTOR) { - return address(_executorConfig(IExecutor(module)).hook) != address(0); + return address(_executorConfig(IExecutor(module)).hook) != HOOK_MODULE_NOT_INSTALLED; } else if (moduleType == MODULE_TYPE_FALLBACK) { return _selectorConfig(bytes4(additionalContext[0:4])).target == module; } else { diff --git a/src/core/ExecutorManager.sol b/src/core/ExecutorManager.sol index 14790677..d709a28b 100644 --- a/src/core/ExecutorManager.sol +++ b/src/core/ExecutorManager.sol @@ -47,11 +47,9 @@ abstract contract ExecutorManager { emit IERC7579Account.ModuleInstalled(MODULE_TYPE_EXECUTOR, address(executor)); } - function _uninstallExecutor(IExecutor executor, bytes calldata executorData) internal returns (IHook hook) { + function _clearExecutorData(IExecutor executor) internal returns (IHook hook) { ExecutorConfig storage config = _executorConfig(executor); hook = config.hook; config.hook = IHook(address(0)); - ModuleLib.uninstallModule(address(executor), executorData); - emit IERC7579Account.ModuleUninstalled(MODULE_TYPE_EXECUTOR, address(executor)); } } diff --git a/src/core/SelectorManager.sol b/src/core/SelectorManager.sol index 951c498c..e7644c79 100644 --- a/src/core/SelectorManager.sol +++ b/src/core/SelectorManager.sol @@ -60,13 +60,12 @@ abstract contract SelectorManager { ss.callType = callType; } - function _uninstallSelector(bytes4 selector, bytes calldata selectorDeinitData) internal returns (IHook hook) { + function _clearSelectorData(bytes4 selector) internal returns (IHook hook, address target) { SelectorConfig storage ss = _selectorConfig(selector); hook = ss.hook; ss.hook = IHook(address(0)); if (ss.callType == CALLTYPE_SINGLE) { - ModuleLib.uninstallModule(ss.target, selectorDeinitData); - emit IERC7579Account.ModuleUninstalled(MODULE_TYPE_FALLBACK, ss.target); + target = ss.target; // if callType!=CALLTYPE_SINGLE, don't need to call uninstall } ss.target = address(0); ss.callType = CallType.wrap(bytes1(0x00)); diff --git a/src/core/ValidationManager.sol b/src/core/ValidationManager.sol index aa82619f..e0593a76 100644 --- a/src/core/ValidationManager.sol +++ b/src/core/ValidationManager.sol @@ -43,6 +43,9 @@ import { VALIDATION_TYPE_7702, SKIP_USEROP, SKIP_SIGNATURE, + HOOK_MODULE_NOT_INSTALLED, + HOOK_MODULE_INSTALLED, + HOOK_ONLY_ENTRYPOINT, VALIDATION_MANAGER_STORAGE_SLOT, MAX_NONCE_INCREMENT_SIZE, ENABLE_TYPE_HASH, @@ -167,34 +170,22 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe } } - function _setSelector(ValidationId vId, bytes4 selector, bool allowed) internal { + function _grantAccess(ValidationId vId, bytes4 selector, bool allow) internal { ValidationStorage storage state = _validationStorage(); - state.allowedSelectors[vId][selector] = allowed; - emit SelectorSet(selector, vId, allowed); + state.allowedSelectors[vId][selector] = allow; + emit SelectorSet(selector, vId, allow); } // for uninstall, we support uninstall for validator mode by calling onUninstall // but for permission mode, we do it naively by setting hook to address(0). // it is more recommended to use a nonce revoke to make sure the validator has been revoked - // also, we are not calling hook.onInstall here - function _uninstallValidation(ValidationId vId, bytes calldata validatorData) internal returns (IHook hook) { + function _clearValidationData(ValidationId vId) internal returns (IHook hook) { ValidationStorage storage state = _validationStorage(); if (vId == state.rootValidator) { revert RootValidatorCannotBeRemoved(); } hook = state.validationConfig[vId].hook; state.validationConfig[vId].hook = IHook(address(0)); - ValidationType vType = ValidatorLib.getType(vId); - if (vType == VALIDATION_TYPE_VALIDATOR) { - IValidator validator = ValidatorLib.getValidator(vId); - ModuleLib.uninstallModule(address(validator), validatorData); - emit IERC7579Account.ModuleUninstalled(MODULE_TYPE_VALIDATOR, address(validator)); - } else if (vType == VALIDATION_TYPE_PERMISSION) { - PermissionId permission = ValidatorLib.getPermissionId(vId); - _uninstallPermission(permission, validatorData); - } else { - revert InvalidValidationType(); - } } function _uninstallPermission(PermissionId pId, bytes calldata data) internal { @@ -297,10 +288,12 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe } } - function _doValidation(ValidationMode vMode, ValidationId vId, PackedUserOperation calldata op, bytes32 userOpHash) - internal - returns (ValidationData validationData) - { + function _validateUserOp( + ValidationMode vMode, + ValidationId vId, + PackedUserOperation calldata op, + bytes32 userOpHash + ) internal returns (ValidationData validationData) { ValidationStorage storage state = _validationStorage(); PackedUserOperation memory userOp = op; bytes calldata userOpSig = op.signature; @@ -350,6 +343,37 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe } } + function _verifySignature(bytes32 hash, bytes calldata signature) internal view returns (bytes4) { + ValidationStorage storage vs = _validationStorage(); + (ValidationId vId, bytes calldata sig) = ValidatorLib.decodeSignature(signature); + if (ValidatorLib.getType(vId) == VALIDATION_TYPE_ROOT) { + vId = vs.rootValidator; + } + bool isReplayable = sig.length >= 32 && bytes32(sig[0:32]) == MAGIC_VALUE_SIG_REPLAYABLE; + if (isReplayable) { + sig = sig[32:]; + } + ValidationType vType = ValidatorLib.getType(vId); + if (address(vs.validationConfig[vId].hook) == HOOK_MODULE_NOT_INSTALLED && vType != VALIDATION_TYPE_7702) { + revert InvalidValidator(); + } + if (vType == VALIDATION_TYPE_VALIDATOR) { + IValidator validator = ValidatorLib.getValidator(vId); + return validator.isValidSignatureWithSender(msg.sender, _toWrappedHash(hash, isReplayable), sig); + } else if (vType == VALIDATION_TYPE_PERMISSION) { + PermissionId pId = ValidatorLib.getPermissionId(vId); + PassFlag permissionFlag = vs.permissionConfig[pId].permissionFlag; + if (PassFlag.unwrap(permissionFlag) & PassFlag.unwrap(SKIP_SIGNATURE) != 0) { + revert PermissionNotAlllowedForSignature(); + } + return _checkPermissionSignature(pId, msg.sender, hash, sig, isReplayable); + } else if (vType == VALIDATION_TYPE_7702) { + return _verify7702Signature(_toWrappedHash(hash, isReplayable), sig); + } else { + revert InvalidValidationType(); + } + } + function replayableUserOpHash(PackedUserOperation calldata userOp, address entryPoint) public pure @@ -408,7 +432,7 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe validationData = _checkEnableSig(digest, enableData.enableSig); _installValidation(vId, config, enableData.validatorData, enableData.hookData); _configureSelector(enableData.selectorData); - _setSelector(vId, bytes4(enableData.selectorData[0:4]), true); + _grantAccess(vId, bytes4(enableData.selectorData[0:4]), true); } function _checkEnableSig(bytes32 digest, bytes calldata enableSig) From 7ec5feac9a04e334435595aee4e362f4b7a7e766 Mon Sep 17 00:00:00 2001 From: leekt Date: Sun, 9 Feb 2025 00:52:35 +0900 Subject: [PATCH 06/14] refactoring internal functions --- src/core/ValidationManager.sol | 167 ++++++++++++++++----------------- 1 file changed, 82 insertions(+), 85 deletions(-) diff --git a/src/core/ValidationManager.sol b/src/core/ValidationManager.sol index e0593a76..a6afc86e 100644 --- a/src/core/ValidationManager.sol +++ b/src/core/ValidationManager.sol @@ -343,37 +343,6 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe } } - function _verifySignature(bytes32 hash, bytes calldata signature) internal view returns (bytes4) { - ValidationStorage storage vs = _validationStorage(); - (ValidationId vId, bytes calldata sig) = ValidatorLib.decodeSignature(signature); - if (ValidatorLib.getType(vId) == VALIDATION_TYPE_ROOT) { - vId = vs.rootValidator; - } - bool isReplayable = sig.length >= 32 && bytes32(sig[0:32]) == MAGIC_VALUE_SIG_REPLAYABLE; - if (isReplayable) { - sig = sig[32:]; - } - ValidationType vType = ValidatorLib.getType(vId); - if (address(vs.validationConfig[vId].hook) == HOOK_MODULE_NOT_INSTALLED && vType != VALIDATION_TYPE_7702) { - revert InvalidValidator(); - } - if (vType == VALIDATION_TYPE_VALIDATOR) { - IValidator validator = ValidatorLib.getValidator(vId); - return validator.isValidSignatureWithSender(msg.sender, _toWrappedHash(hash, isReplayable), sig); - } else if (vType == VALIDATION_TYPE_PERMISSION) { - PermissionId pId = ValidatorLib.getPermissionId(vId); - PassFlag permissionFlag = vs.permissionConfig[pId].permissionFlag; - if (PassFlag.unwrap(permissionFlag) & PassFlag.unwrap(SKIP_SIGNATURE) != 0) { - revert PermissionNotAlllowedForSignature(); - } - return _checkPermissionSignature(pId, msg.sender, hash, sig, isReplayable); - } else if (vType == VALIDATION_TYPE_7702) { - return _verify7702Signature(_toWrappedHash(hash, isReplayable), sig); - } else { - revert InvalidValidationType(); - } - } - function replayableUserOpHash(PackedUserOperation calldata userOp, address entryPoint) public pure @@ -429,13 +398,13 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe bool isReplayable ) internal returns (ValidationData validationData) { (ValidationConfig memory config, bytes32 digest) = _enableDigest(vId, hook, enableData, isReplayable); - validationData = _checkEnableSig(digest, enableData.enableSig); + validationData = _verifyEnableSig(digest, enableData.enableSig); _installValidation(vId, config, enableData.validatorData, enableData.hookData); _configureSelector(enableData.selectorData); _grantAccess(vId, bytes4(enableData.selectorData[0:4]), true); } - function _checkEnableSig(bytes32 digest, bytes calldata enableSig) + function _verifyEnableSig(bytes32 digest, bytes calldata enableSig) internal view returns (ValidationData validationData) @@ -461,42 +430,57 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe } } - function _configureSelector(bytes calldata selectorData) internal { - bytes4 selector = bytes4(selectorData[0:4]); - - if (selectorData.length >= 4) { - if (selectorData.length >= 44) { - SelectorDataFormat calldata data; - assembly { - data := add(selectorData.offset, 44) - } - // install selector with hook and target contract - IModule selectorModule = IModule(address(bytes20(selectorData[4:24]))); - if ( - CallType.wrap(bytes1(data.selectorInitData[0])) == CALLTYPE_SINGLE && selectorModule.isModuleType(2) - ) { - // also adds as executor when fallback module is also a executor - SelectorDataFormatWithExecutorData calldata dataWithExecutor; - assembly { - dataWithExecutor := data - } - IHook executorHook = IHook(address(bytes20(dataWithExecutor.executorHookData[0:20]))); - // if module is also executor, install as executor - _installExecutorWithoutInit(IExecutor(address(selectorModule)), executorHook); - _installHook(executorHook, dataWithExecutor.executorHookData[20:]); - } - _installSelector( - selector, - address(selectorModule), - IHook(address(bytes20(selectorData[24:44]))), - data.selectorInitData - ); - _installHook(IHook(address(bytes20(selectorData[24:44]))), data.hookInitData); - } else { - // set without install - require(selectorData.length == 4, "Invalid selectorData"); + function _verifySignature(bytes32 hash, bytes calldata signature) internal view returns (bytes4) { + ValidationStorage storage vs = _validationStorage(); + (ValidationId vId, bytes calldata sig) = ValidatorLib.decodeSignature(signature); + if (ValidatorLib.getType(vId) == VALIDATION_TYPE_ROOT) { + vId = vs.rootValidator; + } + bool isReplayable = sig.length >= 32 && bytes32(sig[0:32]) == MAGIC_VALUE_SIG_REPLAYABLE; + if (isReplayable) { + sig = sig[32:]; + } + ValidationType vType = ValidatorLib.getType(vId); + ValidationConfig memory vc = vs.validationConfig[vId]; + if (address(vc.hook) == HOOK_MODULE_NOT_INSTALLED && vType != VALIDATION_TYPE_7702) { + revert InvalidValidator(); + } + if (vType != VALIDATION_TYPE_ROOT && vc.nonce < vs.validNonceFrom) { + revert InvalidNonce(); + } + if (vType == VALIDATION_TYPE_VALIDATOR) { + IValidator validator = ValidatorLib.getValidator(vId); + return validator.isValidSignatureWithSender(msg.sender, _toWrappedHash(hash, isReplayable), sig); + } else if (vType == VALIDATION_TYPE_PERMISSION) { + PermissionId pId = ValidatorLib.getPermissionId(vId); + PassFlag permissionFlag = vs.permissionConfig[pId].permissionFlag; + if (PassFlag.unwrap(permissionFlag) & PassFlag.unwrap(SKIP_SIGNATURE) != 0) { + revert PermissionNotAlllowedForSignature(); } + return _checkPermissionSignature(pId, msg.sender, hash, sig, isReplayable); + } else if (vType == VALIDATION_TYPE_7702) { + return _verify7702Signature(_toWrappedHash(hash, isReplayable), sig); + } else { + revert InvalidValidationType(); + } + } + + function _checkPermissionSignature( + PermissionId pId, + address caller, + bytes32 hash, + bytes calldata sig, + bool isReplayable + ) internal view returns (bytes4) { + (ISigner signer, ValidationData valdiationData, bytes calldata validatorSig) = + _checkSignaturePolicy(pId, msg.sender, hash, sig); + (ValidAfter validAfter, ValidUntil validUntil,) = parseValidationData(ValidationData.unwrap(valdiationData)); + if (block.timestamp < ValidAfter.unwrap(validAfter) || block.timestamp > ValidUntil.unwrap(validUntil)) { + return ERC1271_INVALID; } + return signer.checkSignature( + bytes32(PermissionId.unwrap(pId)), msg.sender, _toWrappedHash(hash, isReplayable), validatorSig + ); } function _enableDigest( @@ -525,6 +509,37 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe digest = isReplayable ? _chainAgnosticHashTypedData(structHash) : _hashTypedData(structHash); } + function _configureSelector(bytes calldata selectorData) internal { + bytes4 selector = bytes4(selectorData[0:4]); + + if (selectorData.length >= 44) { + SelectorDataFormat calldata data; + assembly { + data := add(selectorData.offset, 44) + } + // install selector with hook and target contract + IModule selectorModule = IModule(address(bytes20(selectorData[4:24]))); + if (CallType.wrap(bytes1(data.selectorInitData[0])) == CALLTYPE_SINGLE && selectorModule.isModuleType(2)) { + // also adds as executor when fallback module is also a executor + SelectorDataFormatWithExecutorData calldata dataWithExecutor; + assembly { + dataWithExecutor := data + } + IHook executorHook = IHook(address(bytes20(dataWithExecutor.executorHookData[0:20]))); + // if module is also executor, install as executor + _installExecutorWithoutInit(IExecutor(address(selectorModule)), executorHook); + _installHook(executorHook, dataWithExecutor.executorHookData[20:]); + } + _installSelector( + selector, address(selectorModule), IHook(address(bytes20(selectorData[24:44]))), data.selectorInitData + ); + _installHook(IHook(address(bytes20(selectorData[24:44]))), data.hookInitData); + } else { + // set without install + require(selectorData.length == 4, "Invalid selectorData"); + } + } + function _verify7702Signature(bytes32 hash, bytes calldata sig) internal view returns (bytes4) { return ECDSA.recover(hash, sig) == address(this) ? ERC1271_MAGICVALUE : ERC1271_INVALID; } @@ -625,24 +640,6 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe } } - function _checkPermissionSignature( - PermissionId pId, - address caller, - bytes32 hash, - bytes calldata sig, - bool isReplayable - ) internal view returns (bytes4) { - (ISigner signer, ValidationData valdiationData, bytes calldata validatorSig) = - _checkSignaturePolicy(pId, caller, hash, sig); - (ValidAfter validAfter, ValidUntil validUntil,) = parseValidationData(ValidationData.unwrap(valdiationData)); - if (block.timestamp < ValidAfter.unwrap(validAfter) || block.timestamp > ValidUntil.unwrap(validUntil)) { - return ERC1271_INVALID; - } - return signer.checkSignature( - bytes32(PermissionId.unwrap(pId)), caller, _toWrappedHash(hash, isReplayable), validatorSig - ); - } - function _toWrappedHash(bytes32 hash, bool isReplayable) internal view returns (bytes32) { bytes32 structHash = keccak256(abi.encode(KERNEL_WRAPPER_TYPE_HASH, hash)); return isReplayable ? _chainAgnosticHashTypedData(structHash) : _hashTypedData(structHash); From 94bfe387c32a385c6de66bede5a520d08251b0cd Mon Sep 17 00:00:00 2001 From: leekt Date: Thu, 13 Feb 2025 10:36:34 +0900 Subject: [PATCH 07/14] update worker --- .github/workflows/test.yml | 14 +++++--------- foundry.toml | 1 + 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 32772d18..d746bf94 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -18,7 +18,7 @@ jobs: strategy: matrix: - profile: [post-cancun,post-cancun-via-ir,solc-past-versions-0,via-ir,min-solc,min-solc-via-ir] + profile: [post-prague,post-prague-via-ir,solc-past-versions-0,via-ir,min-solc,min-solc-via-ir] steps: - uses: actions/checkout@v4 @@ -40,24 +40,20 @@ jobs: - name: Run Tests with ${{ matrix.profile }} run: > ( [ "${{ matrix.profile }}" = "post-cancun" ] && - forge test --use 0.8.25 --evm-version "cancun" + forge test --use 0.8.28 --evm-version "prague" ) || ( [ "${{ matrix.profile }}" = "post-cancun-via-ir" ] && - forge test --use 0.8.25 --evm-version "cancun" --via-ir - ) || - ( [ "${{ matrix.profile }}" = "solc-past-versions-0" ] && - forge test --use 0.8.23 --fuzz-runs 16 && - forge test --use 0.8.24 --fuzz-runs 16 + forge test --use 0.8.28 --evm-version "prague" --via-ir ) || ( [ "${{ matrix.profile }}" = "via-ir" ] && forge test --via-ir ) || ( [ "${{ matrix.profile }}" = "min-solc" ] && forge fmt --check && - forge test --use 0.8.23 + forge test --use 0.8.28 ) || ( [ "${{ matrix.profile }}" = "min-solc-via-ir" ] && - forge test --use 0.8.23 --via-ir + forge test --use 0.8.28 --via-ir ) codespell: diff --git a/foundry.toml b/foundry.toml index d573dfc3..4b3d4d96 100644 --- a/foundry.toml +++ b/foundry.toml @@ -7,6 +7,7 @@ cbor_metadata = false via-ir = false optimizer = true optimizer_runs = 200 +evm_version = "prague" [profile.deploy] via-ir = true From 4a7338596bc3b3276d63734b3c4f07ddf0603017 Mon Sep 17 00:00:00 2001 From: leekt Date: Thu, 13 Feb 2025 10:38:04 +0900 Subject: [PATCH 08/14] update worker --- .github/workflows/test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d746bf94..74460a21 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -39,10 +39,10 @@ jobs: - name: Run Tests with ${{ matrix.profile }} run: > - ( [ "${{ matrix.profile }}" = "post-cancun" ] && + ( [ "${{ matrix.profile }}" = "post-prague" ] && forge test --use 0.8.28 --evm-version "prague" ) || - ( [ "${{ matrix.profile }}" = "post-cancun-via-ir" ] && + ( [ "${{ matrix.profile }}" = "post-prague-via-ir" ] && forge test --use 0.8.28 --evm-version "prague" --via-ir ) || ( [ "${{ matrix.profile }}" = "via-ir" ] && From 9d63b0f6eae1cbdb0735e3b8e08037284cf02824 Mon Sep 17 00:00:00 2001 From: leekt Date: Thu, 13 Feb 2025 10:41:23 +0900 Subject: [PATCH 09/14] update worker --- .github/workflows/test.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 74460a21..94c6b2c8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,6 +15,8 @@ jobs: tests: name: Forge Testing runs-on: ubuntu-latest + env: + FOUNDRY_DISABLE_NIGHTLY_WARNING: true strategy: matrix: From 9ebc75ce559faab1f717abfaf7ec19220caaffb7 Mon Sep 17 00:00:00 2001 From: leekt Date: Wed, 26 Feb 2025 01:05:08 +0900 Subject: [PATCH 10/14] pruned some codes to reduce code size --- src/Kernel.sol | 14 ++++++++------ src/core/ValidationManager.sol | 13 +++++++++---- src/utils/ExecLib.sol | 20 ++++++++++++-------- test/base/Kernel7702TestBase.sol | 2 +- 4 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/Kernel.sol b/src/Kernel.sol index 5a97acf6..97e0a988 100644 --- a/src/Kernel.sol +++ b/src/Kernel.sol @@ -110,10 +110,10 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager bytes[] calldata initConfig ) external { ValidationStorage storage vs = _validationStorage(); - require( - ValidationId.unwrap(vs.rootValidator) == bytes21(0) && bytes2(address(this).code) != EIP7702_PREFIX, - AlreadyInitialized() - ); + if( + ValidationId.unwrap(vs.rootValidator) != bytes21(0) || bytes2(address(this).code) == EIP7702_PREFIX) { + revert AlreadyInitialized(); + } if (ValidationId.unwrap(_rootValidator) == bytes21(0)) { revert InvalidValidator(); } @@ -140,7 +140,7 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager bytes calldata hookData ) external payable onlyEntryPointOrSelfOrRoot { ValidationStorage storage vs = _validationStorage(); - if (ValidationId.unwrap(_rootValidator) == bytes21(0) || bytes2(address(this).code) == EIP7702_PREFIX) { + if (ValidationId.unwrap(_rootValidator) == bytes21(0)) { revert InvalidValidator(); } ValidationType vType = ValidatorLib.getType(_rootValidator); @@ -444,7 +444,9 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager if (target == address(0)) { return; } - require(target == module, InvalidSelector()); + if (target != module) { + revert InvalidSelector(); + } deInitData = deInitData[4:]; } else if (moduleType == MODULE_TYPE_HOOK) { ValidationId vId = _validationStorage().rootValidator; diff --git a/src/core/ValidationManager.sol b/src/core/ValidationManager.sol index a6afc86e..bb990fbb 100644 --- a/src/core/ValidationManager.sol +++ b/src/core/ValidationManager.sol @@ -69,6 +69,7 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe error InvalidMode(); error InvalidValidator(); error InvalidSignature(); + error InvalidSelectorData(); error EnableNotApproved(); error PolicySignatureOrderError(); error SignerPrefixNotPresent(); @@ -334,7 +335,7 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe ) ); } else if (vType == VALIDATION_TYPE_7702) { - validationData = _verify7702Signature(userOpHash, userOpSig) == ERC1271_MAGICVALUE + validationData = _verify7702Signature(ECDSA.toEthSignedMessageHash(userOpHash), userOpSig) == ERC1271_MAGICVALUE ? ValidationData.wrap(0) : ValidationData.wrap(1); } else { @@ -491,8 +492,10 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe ) internal view returns (ValidationConfig memory config, bytes32 digest) { ValidationStorage storage state = _validationStorage(); config.hook = IHook(hook); - config.nonce = - state.validationConfig[vId].nonce == state.currentNonce ? state.currentNonce + 1 : state.currentNonce; + unchecked { + config.nonce = + state.validationConfig[vId].nonce == state.currentNonce ? state.currentNonce + 1 : state.currentNonce; + } bytes32 structHash = keccak256( abi.encode( @@ -536,7 +539,9 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe _installHook(IHook(address(bytes20(selectorData[24:44]))), data.hookInitData); } else { // set without install - require(selectorData.length == 4, "Invalid selectorData"); + if (selectorData.length != 4) { + revert InvalidSelectorData(); + } } } diff --git a/src/utils/ExecLib.sol b/src/utils/ExecLib.sol index 6e5cbb69..6bf87d6e 100644 --- a/src/utils/ExecLib.sol +++ b/src/utils/ExecLib.sol @@ -69,20 +69,24 @@ library ExecLib { function execute(bytes32[] calldata pointers) internal returns (bytes[] memory result) { uint256 length = pointers.length; result = new bytes[](length); - for (uint256 i; i < length; i++) { - (address target, uint256 value, bytes calldata data) = LibERC7579.getExecution(pointers, i); - result[i] = execute(target, value, data); + unchecked { + for (uint256 i; i < length; i++) { + (address target, uint256 value, bytes calldata data) = LibERC7579.getExecution(pointers, i); + result[i] = execute(target, value, data); + } } } function tryExecute(bytes32[] calldata pointers) internal returns (bytes[] memory result) { uint256 length = pointers.length; result = new bytes[](length); - for (uint256 i; i < length; i++) { - (address target, uint256 value, bytes calldata data) = LibERC7579.getExecution(pointers, i); - bool success; - (success, result[i]) = tryExecute(target, value, data); - if (!success) emit TryExecuteUnsuccessful(i, result[i]); + unchecked { + for (uint256 i; i < length; i++) { + (address target, uint256 value, bytes calldata data) = LibERC7579.getExecution(pointers, i); + bool success; + (success, result[i]) = tryExecute(target, value, data); + if (!success) emit TryExecuteUnsuccessful(i, result[i]); + } } } diff --git a/test/base/Kernel7702TestBase.sol b/test/base/Kernel7702TestBase.sol index 505feeea..012a3c62 100644 --- a/test/base/Kernel7702TestBase.sol +++ b/test/base/Kernel7702TestBase.sol @@ -426,7 +426,7 @@ contract Kernel7702TestBase is TestPlus, Test { virtual returns (bytes memory) { - return _rootSignDigest(userOpHash, success); + return _rootSignDigest(ECDSA.toEthSignedMessageHash(userOpHash), success); } function _validatorSignUserOp(PackedUserOperation memory, bytes32 userOpHash, bool success) From 53290c001b4f7dbf02697b84409e543bb2751a35 Mon Sep 17 00:00:00 2001 From: leekt Date: Tue, 4 Mar 2025 13:30:18 +0900 Subject: [PATCH 11/14] fixed and optimized --- CLAUDE.md | 33 ++++ .../11155111/run-1740503073.json | 124 +++++++++++++++ .../11155111/run-latest.json | 74 ++++----- .../DeployKernel.s.sol/17000/run-latest.json | 79 ++++++++++ .../911867/run-1740499935.json | 142 ++++++++++++++++++ .../DeployKernel.s.sol/911867/run-latest.json | 82 +++++----- src/Kernel.sol | 18 +-- src/core/ExecutorManager.sol | 3 +- src/core/HookManager.sol | 4 +- src/core/SelectorManager.sol | 1 - src/core/ValidationManager.sol | 30 ++-- src/types/Constants.sol | 2 +- 12 files changed, 476 insertions(+), 116 deletions(-) create mode 100644 CLAUDE.md create mode 100644 broadcast/DeployKernel.s.sol/11155111/run-1740503073.json create mode 100644 broadcast/DeployKernel.s.sol/17000/run-latest.json create mode 100644 broadcast/DeployKernel.s.sol/911867/run-1740499935.json diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000..ee808600 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,33 @@ +# Development Guidelines + +## Build Commands +- `forge build` - Compile all contracts +- `forge test` - Run all tests +- `forge test --match-test testFunctionName` - Run a single test +- `forge test --match-path test/Kernel.t.sol` - Run tests in a specific file +- `forge test -vv` - Run tests with verbose output +- `FOUNDRY_PROFILE=optimized forge test` - Run tests with optimized profile + +## Code Style + +### Formatting +- Indentation: 4 spaces +- Opening braces: same line as declaration +- Use named imports: `import {Contract} from "./path.sol";` +- Line separators: `// --- Section Name ---` + +### Naming Conventions +- Contracts: PascalCase (e.g. `Kernel`) +- Interfaces: Prefixed with "I" (e.g. `IValidator`) +- Functions: camelCase (e.g. `validateUserOp`) +- Private/internal: underscore prefix (e.g. `_executeUserOp`) +- Constants: ALL_CAPS_WITH_UNDERSCORES + +### Error Handling +- Use custom errors instead of require (e.g. `error InvalidValidator();`) +- Use if-revert pattern: `if (condition) { revert ErrorName(); }` + +### Types and Structure +- Use immutable variables when possible for gas optimization +- Follow ERC-4337 and ERC-7579 standards +- Use explicit storage slots with assembly for upgradeability \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/11155111/run-1740503073.json b/broadcast/DeployKernel.s.sol/11155111/run-1740503073.json new file mode 100644 index 00000000..4e9c7bb0 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/11155111/run-1740503073.json @@ -0,0 +1,124 @@ +{ + "transactions": [ + { + "hash": "0x53efa638c1459295f1420a5d3c513817b0059fe455cfb6efd57e9f43393ec813", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xe264dccc54e4b6906c0d1fee11d4326c06d33c80", + "function": null, + "arguments": [ + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x71e987", + "value": "0x0", + "input": "0x0000000000000000000000000000000000000000000000000000000000000000610140806040523461020a576020816162458038038091610020828561020e565b83398101031261020a57516001600160a01b038116810361020a57306080524660a05260a060405161005360408261020e565b6006815260208101906512d95c9b995b60d21b82526040519161007760408461020e565b60058352602083019164181719971960d91b8352519020915190208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260208301526040820152466060820152306080820152206101005261012052604051602081019063deadbeef60e01b82526004815261010160248261020e565b5190516001600160581b031981169190601582106101ea575b7f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f80546001600160a81b031916605885901c179055604051615fff9081610246823960805181615765015260a05181615788015260c051816157f8015260e0518161581e015261010051816157440152610120518181816103c4015281816106ac0152818161086601528181610ac401528181610e600152818161115d015281816112ee0152818161132901528181611528015281816119b901528181611aeb015281816125b701526132100152f35b6001600160581b031960159290920360031b82901b161690505f8061011a565b5f80fd5b601f909101601f19168101906001600160401b0382119082101761023157604052565b634e487b7160e01b5f52604160045260245ffdfe6080604052600436101561001d575b366131b65761001b613185565b005b5f3560e01c8063112d3a7d1461021c578063150b7a02146102175780631626ba7e1461021257806319822f7c1461020d5780631f1b92e3146102085780633659cfe6146102035780633c3b752b146101fe57806352141cd9146101f957806357b3a5f4146101f45780636e6fa0c6146101ef578063721e67f4146101ea57806384b0196e146101e55780638dd7712f146101e057806390ef8862146101db5780639198bdf5146101d65780639517e29f146101d15780639cfd7cff146101cc578063a65d69d4146101c7578063a71763a8146101c2578063adb610a3146101bd578063b8afe17d146101b8578063b9b82941146101b3578063bc197c81146101ae578063c3e58978146101a9578063d03c7914146101a4578063d691c9641461019f578063e6f3d50a1461019a578063e9ae5c5314610195578063f1f7f0f914610190578063f23a6e611461018b578063f2dc691d146101865763fc9c5dec0361000e57611cbd565b611c9f565b611c45565b611c0f565b611adf565b61195f565b61187d565b611830565b61175d565b61164c565b6114f5565b61147f565b61144d565b61131d565b6112d9565b611281565b611151565b61103a565b610f2b565b610e30565b610d92565b610d0c565b610cb1565b610bfe565b610a5e565b6109c8565b61084b565b610695565b610390565b61032f565b6102d5565b6102af565b6001600160a01b0381160361023257565b5f80fd5b359061024182610221565b565b9181601f84011215610232578235916001600160401b038311610232576020838186019501011161023257565b6060600319820112610232576004359160243561028c81610221565b91604435906001600160401b038211610232576102ab91600401610243565b9091565b346102325760206102cb6102c236610270565b92919091611f10565b6040519015158152f35b34610232576080366003190112610232576102f1600435610221565b6102fc602435610221565b6064356001600160401b0381116102325761031b903690600401610243565b5050604051630a85bd0160e11b8152602090f35b34610232576040366003190112610232576004356024356001600160401b0381116102325760209161036861036e923690600401610243565b91613382565b6040516001600160e01b03199091168152f35b90816101209103126102325790565b6060366003190112610232576004356001600160401b038111610232576103bb903690600401610381565b602435604435917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610662576103ff60208201356135ce565b9092919084836001600160f81b0319861615610649575b8261042193946137c7565b9361044661043661043184611ea2565b611fda565b946001600160f81b031916151590565b938480610608575b6105f957602001516001600160a01b0316801591819083806105f2575b6104f2576001926104866104a5925f525f60205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b149081156105ea575b501561055d5782610501575b50506104f257816104dc925b6104e0575b506040519081529081906020820190565b0390f35b3490349034903490335af1505f6104cb565b631a0a9b9f60e21b5f5260045ffd5b61055692506105529161053661053061052a61051f61054b95611ed9565b936060810190612006565b90611d1d565b90611e6c565b63ffffffff60e01b165f5260205260405f2090565b5460ff1690565b1590565b5f806104ba565b829192916105b7575b506104f25761052a81606061057c930190612006565b638dd7712f60e01b916001600160e01b03199161059891611e6c565b16036105a857816104dc926104c6565b63dbbb044b60e01b5f5260045ffd5b6105e4915061054b6105cb61055292611ed9565b6105366105306105de6060880188612006565b90611d0c565b5f610566565b90505f6104ae565b508661046b565b633ab3447f60e11b5f5260045ffd5b50805163ffffffff1663ffffffff6106416106385f516020615fdf5f395f51905f525463ffffffff9060c81c1690565b63ffffffff1690565b91161061044e565b5f516020615fdf5f395f51905f525460581b9250610416565b6348f5c3ed60e01b5f5260045ffd5b6004359063ffffffff8216820361023257565b359063ffffffff8216820361023257565b6020366003190112610232576106a9610671565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610841575b15610838576107116107056106ff5f516020615fdf5f395f51905f525460581b90565b60581c90565b6001600160a01b031690565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91610809575b50156106625760405163d68f602560e01b8152916001600160a01b0391909116905f838061076e36343360048501612164565b038183865af19283156107dc575f936107e1575b5061078c90613a5b565b803b1561023257604051630b9dfbed60e11b8152915f9183918290849082906107b890600483016121ad565b03925af180156107dc576107c857005b806107d65f61001b93610fe3565b80610d64565b6120bc565b61078c919350610802903d805f833e6107fa8183610fe3565b8101906120e2565b9290610782565b61082b915060203d602011610831575b6108238183610fe3565b8101906120a4565b5f61073b565b503d610819565b61001b90613a5b565b50303314156106dc565b60203660031901126102325760043561086381610221565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061097c575b15610973576108b96107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91610954575b50156106625760405163d68f602560e01b8152916001600160a01b0391909116905f838061091636343360048501612164565b038183865af19283156107dc575f93610934575b5061078c906121be565b61078c91935061094d903d805f833e6107fa8183610fe3565b929061092a565b61096d915060203d602011610831576108238183610fe3565b5f6108e3565b61001b906121be565b5030331415610896565b6001600160581b031981160361023257565b9181601f84011215610232578235916001600160401b038311610232576020808501948460051b01011161023257565b346102325760a0366003190112610232576004356109e581610986565b6024356109f181610221565b6044356001600160401b03811161023257610a10903690600401610243565b6064939193356001600160401b03811161023257610a32903690600401610243565b91608435956001600160401b03871161023257610a5661001b973690600401610998565b969095612325565b608036600319011261023257600435610a7681610986565b602435610a8281610221565b6044356001600160401b03811161023257610aa1903690600401610243565b6064356001600160401b03811161023257610ac0903690600401610243565b91337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610be2575b15610bd457610b176107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91610bb5575b50156106625760405163d68f602560e01b8152956001600160a01b039190911694905f8780610b7536343360048501612164565b0381838a5af19687156107dc575f97610b95575b5061078c9596976124a8565b61078c969750610bae903d805f833e6107fa8183610fe3565b9695610b89565b610bce915060203d602011610831576108238183610fe3565b5f610b41565b919361001b959391936124a8565b5030331415610af4565b6001600160e01b031981160361023257565b34610232576020366003190112610232576104dc610c3f600435610c2181610bec565b5f60408051610c2f81610f71565b8281528260208201520152612038565b600160405191610c4e83610f71565b805460a083901b839003168084529101546001600160a01b0380821660208086019182526001600160f81b031960589490941b84166040968701908152865195841686529151909216918401919091525116918101919091529081906060820190565b3461023257604036600319011261023257602060ff610d00600435610cd581610986565b610cea60243591610ce583610bec565b611ed9565b9063ffffffff60e01b165f5260205260405f2090565b54166040519015158152f35b34610232576020366003190112610232576020610d41600435610d2e81610221565b5f604051610d3b81610f91565b52613335565b60405190610d4e82610f91565b546001600160a01b031690819052604051908152f35b5f91031261023257565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b34610232575f36600319011261023257610dd1610ddf610db0613da7565b604092919251938493600f60f81b855260e0602086015260e0850190610d6e565b908382036040850152610d6e565b4660608301523060808301525f60a083015281810360c083015260206060519182815201906080905f5b818110610e17575050500390f35b8251845285945060209384019390920191600101610e09565b6040366003190112610232576004356001600160401b03811161023257610e5b903690600401610381565b6024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610662575f908152602081905260409020546001600160a01b03169060609060018314159081610efb575b610ed0610ec9826060610ed7940190612006565b8091611d2b565b9030613e8f565b5015610eec57610ee357005b61001b91613eb4565b63f21e646b60e01b5f5260045ffd5b9150610ed7610ed0610ec9610f21610f19610ec96060880188612006565b903489613e44565b9492505050610eb5565b34610232575f36600319011261023257602063ffffffff5f516020615fdf5f395f51905f525460c81c16604051908152f35b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b03821117610f8c57604052565b610f5d565b602081019081106001600160401b03821117610f8c57604052565b604081019081106001600160401b03821117610f8c57604052565b61012081019081106001600160401b03821117610f8c57604052565b90601f801991011681019081106001600160401b03821117610f8c57604052565b60405190610241604083610fe3565b6040519061024161012083610fe3565b6001600160401b038111610f8c5760051b60200190565b6080366003190112610232576004356001600160401b03811161023257611065903690600401610998565b602435916001600160401b038311610232573660238401121561023257826004013561109081611023565b9361109e6040519586610fe3565b8185526024602086019260061b8201019036821161023257602401915b818310611110575050506044356001600160401b038111610232576110e4903690600401610998565b90606435946001600160401b0386116102325761110861001b963690600401610998565b9590946125ad565b604083360312610232576020604091825161112a81610fac565b61113386610684565b81528286013561114281610221565b838201528152019201916110bb565b61115a36610270565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611277575b1561126d576111b06107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f9161124e575b50156106625760405163d68f602560e01b8152936001600160a01b039190911692905f858061120e36343360048501612164565b038183885af19485156107dc575f9561122e575b5061078c93949561277c565b61078c949550611247903d805f833e6107fa8183610fe3565b9493611222565b611267915060203d602011610831576108238183610fe3565b5f6111da565b9161001b9361277c565b503033141561118d565b34610232575f366003190112610232576104dc6040516112a2604082610fe3565b601681527535b2b93732b61730b23b30b731b2b2173b181719971960511b6020820152604051918291602083526020830190610d6e565b34610232575f366003190112610232576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b61132636610270565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611443575b156114395761137c6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f9161141a575b50156106625760405163d68f602560e01b8152936001600160a01b039190911692905f85806113da36343360048501612164565b038183885af19485156107dc575f956113fa575b5061078c939495612ad0565b61078c949550611413903d805f833e6107fa8183610fe3565b94936113ee565b611433915060203d602011610831576108238183610fe3565b5f6113a6565b9161001b93612ad0565b5030331415611359565b34610232575f36600319011261023257602063ffffffff5f516020615fdf5f395f51905f525460a81c16604051908152f35b346102325760203660031901126102325760406114af6004356114a181610986565b6114a9612cfa565b50611ea2565b8151906114bb82610fac565b5463ffffffff81168083526001600160a01b03602092831c81169383019384528451918252925190921690820152f35b8015150361023257565b60603660031901126102325760043561150d81610986565b60243561151981610bec565b604435611525816114eb565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611642575b156116385761157b6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91611619575b50156106625760405163d68f602560e01b8152926001600160a01b039190911691905f84806115d936343360048501612164565b038183875af19384156107dc575f946115f9575b5061078c9293946143db565b61078c939450611612903d805f833e6107fa8183610fe3565b93926115ed565b611632915060203d602011610831576108238183610fe3565b5f6115a5565b9061001b926143db565b5030331415611558565b346102325760a036600319011261023257611668600435610221565b611673602435610221565b6044356001600160401b03811161023257611692903690600401610998565b50506064356001600160401b038111610232576116b3903690600401610998565b50506084356001600160401b038111610232576116d4903690600401610243565b505060405163bc197c8160e01b8152602090f35b602080825282516001600160f01b03191681830152808301516001600160a01b03166040808401919091529092015160608083015280516080830181905260a09092019201905f5b81811061173d5750505090565b82516001600160501b031916845260209384019390920191600101611730565b346102325760203660031901126102325761179c60043561177d81610bec565b60606040805161178c81610f71565b5f81525f6020820152015261206e565b6001604051916117ab83610f71565b805461ffff60f01b8160f01b168452828060a01b039060101c16602084015201906040519182602082549182815201915f5260205f20905f5b81811061180d576104dc85876117fc81880382610fe3565b6040820152604051918291826116e8565b825460501b6001600160501b0319168452602090930192600192830192016117e4565b346102325760203660031901126102325760206102cb600435612d12565b9060406003198301126102325760043591602435906001600160401b038211610232576102ab91600401610243565b6118863661184e565b90916001600160a01b0361189933613335565b54169182156119505760609060018414159485611939575b6118bb9293614661565b92611929575b50506040518091602082016020835281518091526040830190602060408260051b8601019301915f905b8282106118fa57505050500390f35b919360019193955060206119198192603f198a82030186528851610d6e565b96019201920185949391926118eb565b61193291613eb4565b5f806118c1565b6118bb9250611949363487613deb565b92506118b1565b63710c949760e01b5f5260045ffd5b60603660031901126102325760043561197781610986565b6024356001600160401b03811161023257611996903690600401610243565b6044356001600160401b038111610232576119b5903690600401610243565b90337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611ad5575b15611ac957611a0c6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91611aaa575b50156106625760405163d68f602560e01b8152946001600160a01b039190911693905f8680611a6a36343360048501612164565b038183895af19586156107dc575f96611a8a575b5061078c949596612dea565b61078c959650611aa3903d805f833e6107fa8183610fe3565b9594611a7e565b611ac3915060203d602011610831576108238183610fe3565b5f611a36565b91909261001b94612dea565b50303314156119e9565b611ae83661184e565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611c05575b15611bfb57611b3e6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91611bdc575b50156106625760405163d68f602560e01b8152926001600160a01b039190911691905f8480611b9c36343360048501612164565b038183875af19384156107dc575f94611bbc575b5061078c92939461307d565b61078c939450611bd5903d805f833e6107fa8183610fe3565b9392611bb0565b611bf5915060203d602011610831576108238183610fe3565b5f611b68565b9061001b9261307d565b5030331415611b1b565b34610232575f3660031901126102325760205f516020615fdf5f395f51905f525460581b604051906001600160581b0319168152f35b346102325760a036600319011261023257611c61600435610221565b611c6c602435610221565b6084356001600160401b03811161023257611c8b903690600401610243565b505060405163f23a6e6160e01b8152602090f35b346102325760203660031901126102325760206102cb600435613088565b34610232576040366003190112610232576004356001600160401b03811161023257611d04611cf26020923690600401610381565b60243590611cff82610221565b613095565b604051908152f35b906008116102325760040190600490565b906004116102325790600490565b909291928360041161023257831161023257600401916003190190565b906018116102325760040190601490565b906014116102325790601490565b906020116102325790602090565b90929192836020116102325783116102325760200191601f190190565b909291928360011161023257831161023257600101915f190190565b906009116102325760010190600890565b909291928360091161023257831161023257600901916008190190565b906016116102325790601690565b906016116102325760020190601490565b909291928360161161023257831161023257601601916015190190565b906002116102325790600290565b909291928360141161023257831161023257601401916013190190565b90602c116102325760180190601490565b90939293848311610232578411610232578101920390565b356001600160e01b0319811692919060048210611e87575050565b6001600160e01b031960049290920360031b82901b16169150565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85060205260405f2090565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85160205260405f2090565b90929060018103611f5f57506001600160a01b0392611f599250611f49915060581b600160581b600160f81b0316600160f81b17611ea2565b5460201c6001600160a01b031690565b16151590565b60028103611f9357506001600160a01b0392611f5992506107059150611f86908416613335565b546001600160a01b031690565b600303611fd357611fb4611faf610530600193611fc295611d1d565b612038565b01546001600160a01b031690565b6001600160a01b0390811691161490565b5050505f90565b90604051611fe781610fac565b915463ffffffff81168352602090811c6001600160a01b031690830152565b903590601e198136030182121561023257018035906001600160401b0382116102325760200191813603831361023257565b63ffffffff60e01b165f527f7c341349a4360fdd5d5bc07e69f325dc6aaea3eb018b3e0ea7e53cc0bb0d6f3b60205260405f2090565b63ffffffff60e01b165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85260205260405f2090565b9081602091031261023257516120b9816114eb565b90565b6040513d5f823e3d90fd5b6001600160401b038111610f8c57601f01601f191660200190565b602081830312610232578051906001600160401b038211610232570181601f8201121561023257805190612115826120c7565b926121236040519485610fe3565b8284526020838301011161023257815f9260208093018386015e8301015290565b908060209392818452848401375f828201840152601f01601f1916010190565b6120b9939260609260018060a01b03168252602082015281604082015201905f612144565b6120b9949260609260018060a01b0316825260208201528160408201520191612144565b9060206120b9928181520190610d6e565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556001600160a01b03167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2565b60405190612220602083610fe3565b5f8252565b90813b5f612232826120c7565b936122406040519586610fe3565b82855260208501903c565b80516020909101516001600160f01b031981169291906002821061226d575050565b6001600160f01b031960029290920360031b82901b16169150565b5f516020615fdf5f395f51905f52805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b634e487b7160e01b5f52603260045260245ffd5b908210156122e4576102ab9160051b810190612006565b6122b9565b908092918237015f815290565b3d15612320573d90612307826120c7565b916123156040519384610fe3565b82523d5f602084013e565b606090565b94939291909695966001600160581b031961235e6123515f516020615fdf5f395f51905f525460581b90565b6001600160581b03191690565b1615801590612480575b612472576001600160581b03198616156104f2576001600160f81b03198616600160f81b14158061245a575b61244b57856123a56123f297613b20565b6123c66123b0611004565b60018152925b6001600160a01b03166020840152565b5f516020615fdf5f395f51905f52805463ffffffff60a81b1916600160a81b179055613b86565b613b86565b5f5b81811061240057505050565b5f8061240d8385876122cd565b9061241d604051809381936122e9565b039082305af161242b6122f6565b5015612439576001016123f4565b636534eae560e11b5f5260045260245ffd5b6361c4e91b60e11b5f5260045ffd5b506001600160f81b03198616600160f91b1415612394565b62dc149f60e41b5f5260045ffd5b5061ef0160f01b6001600160f01b03196124a161249c30612225565b61224b565b1614612368565b94939291906001600160581b03198616156104f2576001600160f81b03198616600160f81b141580612553575b61244b576124e286613b20565b6001600160a01b036124f6611f4988611ea2565b1615612505575b505050505050565b612548956123ed61252b5f516020615fdf5f395f51905f525463ffffffff9060a81c1690565b926123b66040519461253e604087610fe3565b63ffffffff168552565b5f80808080806124fd565b506001600160f81b03198616600160f91b14156124d5565b9060405161257881610f71565b82546001600160a01b03908116825260019390930154928316602082015260589290921b6001600160f81b0319166040830152565b95909491939092337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580612721575b156127135761260a6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f916126f4575b50156106625760405163d68f602560e01b8152966001600160a01b039190911695905f888061266836343360048501612164565b0381838b5af19788156107dc575f986126d4575b50612688969798613f2d565b803b1561023257604051630b9dfbed60e11b8152915f9183918290849082906126b490600483016121ad565b03925af180156107dc576126c6575b50565b806107d65f61024193610fe3565b6126889798506126ed903d805f833e6107fa8183610fe3565b979661267c565b61270d915060203d602011610831576108238183610fe3565b5f612634565b919390929461024196613f2d565b50303314156125e7565b9160206120b9938181520191612144565b356bffffffffffffffffffffffff1981169291906014821061275c575050565b6bffffffffffffffffffffffff1960149290920360031b82901b16169150565b9091600182036128f8575f516020615f9f5f395f51905f5293906054600160f81b600160581b600160f81b03605887901b1617916127c66127bc84611ea2565b5463ffffffff1690565b5f516020615fdf5f395f51905f525460a81c63ffffffff169063ffffffff8083169116146128e0575b5061285861283161070561282b61282561281e5f516020615fdf5f395f51905f525463ffffffff9060a81c1690565b9886611d59565b9061273c565b60601c90565b61284861283c611004565b63ffffffff9097168752565b6001600160a01b03166020860152565b612883601482019461286a8680612006565b61287a6034869493940189612006565b93909288613b86565b019160046128918483612006565b9050146128bf575b5050505b604080519182526001600160a01b03909216602082015290819081015b0390a1565b61053061052a6128d8946128d293612006565b90614376565b5f8080612899565b6128f29060010163ffffffff16612288565b5f6127ef565b6002820361296057806129555f516020615f9f5f395f51905f5295603461292f61070561282b612825601461295b99019588611d59565b9361294e8561293e8580612006565b906001600160a01b038c166142e5565b0190612006565b91614122565b61289d565b600382036129d657806129555f516020615f9f5f395f51905f529560386129ce61070561282b612825601861295b9901956129c88c8a6129b661070561282b612825876129b06105308288611d1d565b95611d48565b6129c08b80612006565b939092613f9a565b88611d48565b930190612006565b600482148015612a74575b8015612a6a575b15612a5b576001600160a01b03831693843b1561023257612a22945f92836040518098819582946306d61fe760e41b84526004840161272b565b03925af19283156107dc575f516020615f9f5f395f51905f5293612a47575b5061289d565b806107d65f612a5593610fe3565b5f612a41565b631092ef5760e11b5f5260045ffd5b50600682146129e8565b50600582146129e1565b359060208110612a8c575090565b5f199060200360031b1b1690565b929192612aa6826120c7565b91612ab46040519384610fe3565b829481845281830111610232578281602093845f960137010152565b909160018203612b41575f516020615fbf5f395f51905f5293612b1f91612b1991612b10600160f81b600160581b600160f81b03605889901b16176144a9565b505b3691612a9a565b83614509565b50604080519182526001600160a01b03909216602082015290819081016128ba565b60028203612bb1576001600160a01b038381165f9081527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b866020526040902080546001600160a01b031981169091555f516020615fbf5f395f51905f5295612b1f93612b19939092165b50612b12565b919060038103612bd6575050610530612bd292612bcd92611d1d565b614445565b5050565b909160048203612c5f57612b19612b1f915f516020615fbf5f395f51905f5295612c0e5f516020615fdf5f395f51905f525460581b90565b612c1a611f4982611ea2565b6001600160a01b03888116911614612c325750612b12565b612c3e612c5991611ea2565b8054640100000000600160c01b031916640100000000179055565b5f612bab565b600582148015612cf0575b15612a5b575f516020615fdf5f395f51905f525460581b612c94612c8e8684611d67565b90612a7e565b906001600160f81b03198116600160f91b14612cc8575b5050612b19612b1f915f516020615fbf5f395f51905f5295612b12565b60081b6001600160e01b03191614612ce1575f80612cab565b6313002bdd60e31b5f5260045ffd5b5060068214612c6a565b60405190612d0782610fac565b5f6020838281520152565b612d26818060081b918160301b9160501b90565b929091906001600160f81b03198116600160f81b14159081612dd6575b81612dc1575b81612da8575b50611fd35760ff60f81b16600160f81b8114159081612d9e575b50612d98576001600160e01b031916612d93576001600160501b031916612d8f57600190565b5f90565b505f90565b50505f90565b905015155f612d69565b6001600160f81b031916607f60f91b141590505f612d4f565b6001600160f81b031980821614159150612d49565b6001600160f81b0319811615159150612d43565b9094939291612df8826144a9565b916001600160f81b03198116600160f81b03612e70575f516020615fbf5f395f51905f5291612e46612e406102419899612e689460018060a01b039060581c16933691612a9a565b82614509565b5060408051600181526001600160a01b03909216602083015290918291820190565b0390a161490f565b9294919290506001600160f81b03198116600160f91b0361244b5760081b92612e988461206e565b94612ea38780614880565b949050600187019460018654010361306e5794956001600160e01b0319871695905f5b8654811015612f7c57805f516020615fbf5f395f51905f52612f738c612f51612f43612e408e612f318f99612f2b612f1b612f13612f068460019f6148b5565b90549060031b1c60501b90565b908160501c90565b90508c8060a01b03169780614880565b906122cd565b604094919451948593602085016148ca565b03601f198101835282610fe3565b5060408051600581526001600160a01b03909216602083015290918291820190565b0390a101612ec6565b509194509296612ff761300a916130056130699598612fa86001612fa26102419d61206e565b016148df565b8554612fe590612fc39060101c6001600160a01b0316610705565b93612fda612fd18280614880565b91909280614880565b5f19019290506122cd565b604095919551958693602085016148ca565b03601f198101845283610fe3565b614509565b5080545f516020615fbf5f395f51905f5290613056906130359060101c6001600160a01b0316610705565b60408051600681526001600160a01b03909216602083015290918291820190565b0390a180546001600160b01b0319169055565b61490f565b63013dcc8d60e31b5f5260045ffd5b906126c39291614661565b60071115612d8f57600190565b612f439061317f906130b06001600160a01b03823516610705565b906131516020820135612f436130d26130cc6040860186612006565b9061499a565b936130e36130cc6060830183612006565b90608081013560a0820135906131056130cc60c08501359460e0810190612006565b93604051988997602089019b8c94919260e0969399989794919961010087019a60018060a01b03168752602087015260408601526060850152608084015260a083015260c08201520152565b51902060408051602081019283526001600160a01b03909516908501525f6060850152929182906080820190565b51902090565b7f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460408051338152346020820152a1565b6131d26131cd5f356001600160e01b031916612038565b61256b565b80516001600160a01b03906131e8908216610705565b16156133265780516060906001600160a01b0316806002600160a01b031981016133045750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610662575b60408201516001600160f81b031916806132c45750602082015161326b906001600160a01b03166149a5565b92905b156132bc57516001600160a01b031690600182141582816132a8575b50613298575b825160208401f35b6132a191613eb4565b5f80613290565b6001600160a01b039150811614155f61328a565b825160208401fd5b6001600160f81b0319908116036132f55760208201516132ee906001600160a01b03163690613e6a565b929061326e565b632d6a6bb760e01b5f5260045ffd5b600103613312575b5061323f565b613320915036903490613deb565b5f61330c565b631cd4b64760e21b5f5260045ffd5b6001600160a01b03165f9081527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b866020526040902090565b9081602091031261023257516120b981610bec565b9161338c916149e7565b919080836001600160f81b03198416156135ae575b60208110159182613577575b82613561575b50506133c161043184611ea2565b60208101516001600160a01b03906133da908216610705565b16158061354e575b6104f2576001600160f81b0319841615159081613515575b506105f9576001600160f81b03198316600160f81b0361348e5790613426602094939261344496614a39565b604051637aa8f17760e11b8152958694859384933360048601612189565b039160581c6001600160a01b03165afa9081156107dc575f91613465575090565b6120b9915060203d602011613487575b61347f8183610fe3565b81019061336d565b503d613475565b92916001600160f81b03198116600160f91b036134ee5760081b93600160f11b6134d16134c46134bd8861206e565b5460f01b90565b6001600160f01b03191690565b166134df576120b994614b77565b635b71057960e01b5f5260045ffd5b929391929091906001600160f81b03191661244b576120b99361351091614a39565b614a93565b5163ffffffff16905063ffffffff6135456106385f516020615fdf5f395f51905f525463ffffffff9060c81c1690565b9116105f6133fa565b506001600160f81b0319841615156133e2565b8192955061356f9350611d75565b925f806133b3565b91507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a6135a7612c8e8385611d67565b14916133ad565b92506135c85f516020615fdf5f395f51905f525460581b90565b926133a1565b90818060081b9160ff839260f01c166002146135e657565b6001600160d81b031983169150565b9080601f83011215610232578160206120b993359101612a9a565b9190916101208184031261023257613626611013565b9261363082610236565b84526020820135602085015260408201356001600160401b038111610232578161365b9184016135f5565b604085015260608201356001600160401b038111610232578161367f9184016135f5565b60608501526080820135608085015260a082013560a085015260c082013560c085015260e08201356001600160401b03811161023257816136c19184016135f5565b60e08501526101008201356001600160401b038111610232576136e492016135f5565b610100830152565b90816020910312610232575190565b80516001600160a01b031682526120b9916020820151602082015261010061377c61374c61373a60408601516101206040870152610120860190610d6e565b60608601518582036060870152610d6e565b6080850151608085015260a085015160a085015260c085015160c085015260e085015184820360e0860152610d6e565b92015190610100818403910152610d6e565b9392916137ab9060409286526060602087015260608601906136fb565b930152565b9291906137ab6020916040865260408601906136fb565b9290925f926137d63682613610565b916137e5610100830183612006565b918193835f93602082101580613a26575b6139e7575b5050506001600160f81b031916600160f81b145b6139c0575b506001600160f81b03198616600160f81b036138ab575050604051639700320360e01b815293602092859283915f91839161385291600484016137b0565b039260581c6001600160a01b03165af19081156107dc576120b9925f9261387a575b50615053565b61389d91925060203d6020116138a4575b6138958183610fe3565b8101906136ec565b905f613874565b503d61388b565b909491939092916001600160f81b03198116600160f91b0361395c5760081b93600160f01b6138df6134c46134bd8861206e565b1661394d575f6138ff6138f960209661392999858a614e64565b94615053565b604051630ccab7a160e01b8152979096889586948593926001600160e01b0319166004850161378e565b03926001600160a01b03165af19081156107dc576120b9925f9261387a5750615053565b6314b9743f60e01b5f5260045ffd5b919350506001600160f81b03191661244b576139b190630b135d3f60e11b9361351063ffffffff60e01b946020527b19457468657265756d205369676e6564204d6573736167653a0a33325f52603c60042090565b16036139bb575f90565b600190565b916139cd93955086614c2c565b9193916139db368284612a9a565b6101008401525f613814565b9195509250829196506139fa9350611d75565b9091613a07368385612a9a565b61010085015261380f613a1d6001923390613095565b95905f806137fb565b507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a613a55612c8e8484611d67565b146137f6565b5f516020615fdf5f395f51905f5254600a63ffffffff8260a81c16019063ffffffff8211613b0c5763ffffffff83811692168211613afd57613aa59060c81c63ffffffff16610638565b10156105f9575f516020615fdf5f395f51905f52805463ffffffff60c81b60c893841b1663ffffffff60c81b1990911617908190559081901c63ffffffff9081169160a81c168111613af45750565b61024190612288565b63e60fd64760e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b60207f6789ec0c85d6458d897a36a70129b101f8b4d84c6e218046c3107373dbcbae88918060581c6001600160581b0360a81b5f516020615fdf5f395f51905f525416175f516020615fdf5f395f51905f5255604051906001600160581b0319168152a1565b929490939193613b986127bc85611ea2565b5f516020615fdf5f395f51905f525460a81c63ffffffff169063ffffffff808316911614613d8f575b506020810180516001600160a01b031615613d86575b5f516020615fdf5f395f51905f525460a81c63ffffffff1663ffffffff613c05610638855163ffffffff1690565b911614801590613d5a575b6105f957613c5e613c6b92613c2487611ea2565b815181546020938401516001600160c01b031990911663ffffffff9290921691909117921b640100000000600160c01b0316919091179055565b516001600160a01b031690565b915f196001600160a01b03841601613d49575b5050506001600160f81b03198116600160f81b03613d265760581c6001600160a01b031690813b15610232576040516306d61fe760e41b8152925f9184918291613ccc91906004840161272b565b038183855af19081156107dc575f516020615f9f5f395f51905f52926128ba92613d12575060408051600181526001600160a01b03909216602083015290918291820190565b806107d65f613d2093610fe3565b5f612e46565b91506001600160f81b03198216600160f91b0361244b576102419160081b6151a6565b613d5292614122565b5f8080613c7e565b50613d676127bc86611ea2565b63ffffffff613d7d610638855163ffffffff1690565b91161015613c10565b60018152613bd7565b613da19060010163ffffffff16612288565b5f613bc1565b6040908151613db68382610fe3565b600681526512d95c9b995b60d21b602082015291613dd681519182610fe3565b6005815264181719971960d91b602082015290565b91613e12925f8080946040519687958694859363d68f602560e01b85523360048601612189565b03926001600160a01b03165af19081156107dc575f91613e30575090565b6120b991503d805f833e6107fa8183610fe3565b5f9283613e1295936040519687958694859363d68f602560e01b85523360048601612189565b5f9060405192808385378338925af4913d82523d5f602084013e60203d830101604052565b5f9192806040519485378338925af4913d82523d5f602084013e60203d830101604052565b6001600160a01b0316803b1561023257604051630b9dfbed60e11b815260206004820152915f918391829084908290613ef1906024830190610d6e565b03925af180156107dc57613f025750565b5f61024191610fe3565b8051156122e45760200190565b80518210156122e45760209160051b010190565b909593919492965f5b87811015613f8657600190613f808a89613f6c8489613f65828060051b8c013595613f6087610986565b613f19565b51946122cd565b90613f78868d8d6122cd565b949093613b86565b01613f36565b509650505050505050565b90156122e45790565b9293929091906001600160a01b03821615614113575b613fb990612038565b93613fe5613fd8613fca8684613f91565b356001600160f81b03191690565b6001600160f81b03191690565b936001600160f81b031985166140eb576001600160a01b0384169161400c91908190611d92565b823b1561023257614036925f92836040518096819582946306d61fe760e41b84526004840161272b565b03925af19485156107dc5761409a6140ba93600193610241986140d7575b5060408051600381526001600160a01b03881660208201525f516020615f9f5f395f51905f529190a15b82546001600160a01b0319166001600160a01b03909116178255565b0180546001600160a01b0319166001600160a01b03909316929092178255565b805460ff60a01b191660589290921c60ff60a01b16919091179055565b806107d65f6140e593610fe3565b5f614054565b50909390506001600160f81b0319808416036132f55760016140ba9161409a6102419661407e565b6001600160a01b039150613fb0565b6001600160a01b03169190821580156142db575b6142d65760405163d60b347f60e01b8152306004820152602081602481875afa9081156107dc575f916142b7575b506141fb57908061417492611d92565b9190813b15610232576040516306d61fe760e41b8152925f918491829161419f91906004840161272b565b038183855af19081156107dc575f516020615f9f5f395f51905f52926128ba926141e7575b505b60408051600481526001600160a01b03909216602083015290918291820190565b806107d65f6141f593610fe3565b5f6141c4565b81151580614298575b614222575b50506128ba5f516020615f9f5f395f51905f52916141c6565b908061422d92611d92565b9190813b15610232576040516306d61fe760e41b8152925f918491829161425891906004840161272b565b038183855af19081156107dc575f516020615f9f5f395f51905f52926128ba92614284575b5091614209565b806107d65f61429293610fe3565b5f61427d565b506001600160f81b0319806142b0613fca8585613f91565b1614614204565b6142d0915060203d602011610831576108238183610fe3565b5f614164565b505050565b5060018314614136565b926142f0908461549e565b8161433f5750505f80916040518260208201916306d61fe760e41b835261432981612f4360248201604090602081525f60208201520190565b51926001600160a01b03165af1506126c36122f6565b6001600160a01b039092169190823b15610232576126b4925f92836040518096819582946306d61fe760e41b84526004840161272b565b7f9d17cd6d095ac90a655405ab29f30a7ee7e88ef3974c1bf7544bf591043bb71a916060916143a882610cea83611ed9565b600160ff198254161790556040519163ffffffff60e01b1682526001600160581b031916602082015260016040820152a1565b907f9d17cd6d095ac90a655405ab29f30a7ee7e88ef3974c1bf7544bf591043bb71a9260609261440e83610cea83611ed9565b9115159160ff1981541660ff84161790556040519263ffffffff60e01b1683526001600160581b03191660208301526040820152a1565b61444f5f91612038565b80546001600160a01b031981168255600190910180546001600160a01b0390921693916001600160f81b0319605882901b1615614498575b5080546001600160a81b0319169055565b6001600160a01b031692505f614487565b906001600160581b03195f516020615fdf5f395f51905f525460581b166001600160581b0319831614612ce1576144f56001600160a01b036144ea84611ea2565b5460201c1692611ea2565b8054640100000000600160c01b0319169055565b91907f2b82f87bf66300af618a9621d3f221edfab735f5bacb4e004cce1b62375396c3905a905f80604051936145698561455b6020820196638a91b0e360e01b88526020602484018181520190610d6e565b03601f198101875286610fe3565b60405193614578602086610fe3565b828552602085019583908a905f368a375193f1913d90816145bf575b815f9293523e604080516001600160a01b0390951685528115156020860152909390819081016128ba565b5f9150614594565b604080519091906145d88382610fe3565b6001815291601f1901825f5b8281106145f057505050565b8060606020809385010152016145e4565b9061460b82611023565b6146186040519182610fe3565b8281528092614629601f1991611023565b01905f5b82811061463957505050565b80606060208093850101520161462d565b9060406120b9925f81528160208201520190610d6e565b600881901b9291906001600160f81b03198116600160f81b036146f4575090614689916155ca565b90916001600160f81b031981166146a457506120b9916156e2565b6001600160f81b031916600160f81b036146c1576120b991615636565b60405162461bcd60e51b815260206004820152600b60248201526a155b9cdd5c1c1bdc9d195960aa1b6044820152606490fd5b9293926001600160f81b031981166147ac5750906147119161554c565b9161471a6145c7565b956001600160f81b03198116614747575061473493615594565b61473d83613f0c565b526126c382613f0c565b6001600160f81b031916600160f81b036146c1576147649361556d565b61476d84613f0c565b52610241577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76128ba61479f84613f0c565b516040519182918261464a565b909391906001600160f81b0319908116036146c1576147d66147dc916147d06145c7565b95615524565b91613e8f565b6147e885939293613f0c565b526001600160f81b03198116600160f81b0361483357501561480657565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76128ba61479f84613f0c565b6001600160f81b0319166146c1576102415760405162461bcd60e51b815260206004820152601360248201527211195b1959d85d1958d85b1b0819985a5b1959606a1b6044820152606490fd5b903590601e198136030182121561023257018035906001600160401b03821161023257602001918160051b3603831361023257565b80548210156122e4575f5260205f2001905f90565b9092809260209483528483013701015f815290565b8054905f8155816148ee575050565b5f5260205f20908101905b818110614904575050565b5f81556001016148f9565b9091906001600160a01b031680158015614990575b6142d65781156122e4575f516020615fbf5f395f51905f52926128ba926001600160f81b03198235811614614977575b505060408051600481526001600160a01b03909216602083015290918291820190565b612b1281612e409261498894611d92565b505f80614954565b5060018114614924565b816040519182372090565b5f809160405136810160405236838237604051601481016040523360601b90528260143601925af190604051903d82523d5f602084013e60203d830101604052565b9182358060f81c805f14614a2b5780600114614a1e57600214614a08575f80fd5b6001600160d81b03191692600501916004190190565b5092601501916014190190565b505060015f9301915f190190565b60405160208101917f1547321c374afde8a591d972a084b071c594c275e36724931ff96c25f2999c838352604082015260408152614a78606082610fe3565b5190209015614a8a576120b990615854565b6120b990615742565b9190614aa0913691612a9a565b604051916020820191805180604014614b2b57604114614acd5750505050505b638baa579f5f526004601cfd5b80606060409201515f1a60205201516060525b5f52516040526020600160805f825afa51905f6060526040523d614b05575050614ac0565b6001600160a01b03163003614b1f57630b135d3f60e11b90565b6001600160e01b031990565b506040015160ff81901c601b016020526001600160ff1b0316606052614ae0565b90926080926120b99694835260018060a01b0316602083015260408201528160608201520191612144565b614b9065ffffffffffff929594614b9c948733856158c9565b97929491959095615993565b5091164210908115614c1a575b50614c0757602094614bba91614a39565b60405163392dffaf60e01b815295869485938493614be993929133906001600160e01b03191660048701614b4c565b03916001600160a01b03165afa9081156107dc575f91613465575090565b506001600160e01b031995945050505050565b65ffffffffffff91501642115f614ba9565b9190939293601481019160141161023257803560601c92829190614c4e612cfa565b6001600160a01b03909516602086019081529490614cad614c716127bc83611ea2565b5f516020615fdf5f395f51905f525460a81c63ffffffff169063ffffffff808316911603614e125760010163ffffffff165b63ffffffff168352565b815163ffffffff1695516001600160a01b031697614ccb8580612006565b614cd49161499a565b986034850199614ce48b88612006565b614ced9161499a565b906054870199614cfd8b8a612006565b614d069161499a565b604080517fb17ab1224aca0d4255ef8161acaf2ac121b8faa32a4b2258c912cc5f8308c505602082019081526001600160581b03198a169282019290925263ffffffff9390931660608401526001600160a01b0395909516608083015260a082019290925260c081019290925260e0808301919091528152614d8a61010082610fe3565b519020905f1461052a6102ab98614deb60949861294e97614dcc6128d29761053097614e0457614db990615854565b614dc660748d0185612006565b91615c58565b9e614de2614dda8480612006565b929094612006565b9390928a613b86565b614dfe614df8828b612006565b90615dd2565b88612006565b614e0d90615742565b614db9565b614ca3565b356001600160c01b0319811692919060088210614e32575050565b6001600160c01b031960089290920360031b82901b16169150565b6040906120b99392815281602082015201906136fb565b93929190935f926001614e768361206e565b015f5b8154811015614ff757614e92612f13612f0683856148b5565b939095614eb4614eae614ea8613fca8585613f91565b60f81c90565b60ff1690565b808403614fc95750908181614eed614ee1614edb614ed584614f0b98611dae565b90614e17565b60c01c90565b6001600160401b031690565b600901918c610100614f03612b12868686611dbf565b910152611e54565b939093955b600160f01b1615614f28575b50600101939193614e79565b604051633894f6e760e11b81529196906020908390815f81614f588f6001600160e01b03198d1660048401614e4d565b03926001600160a01b03165af19182156107dc575f92614fa9575b506001600160a01b038216614f9557600191614f8e91615053565b9590614f1c565b631f24c1fb60e11b5f52600487905260245ffd5b614fc291925060203d81116138a4576138958183610fe3565b905f614f73565b9196909491831115614fe457630760bdcf60e11b5f5260045ffd5b614fec612211565b6101008b0152614f10565b505091929460ff8061500f614ea8613fca8789613f91565b16036150445761010061502c612b1285615034966120b998611d92565b91015261206e565b5460101c6001600160a01b031690565b63b32eeb6960e01b5f5260045ffd5b908082186001600160a01b031615606083811b838501821b9081149184901b141717600114615083575050600190565b65ffffffffffff60a01b8216916001600160d01b03198082169083168415615103575b65ffffffffffff60a01b841680156150f3575b8581109086180280861895146150e2575b81811190821802189160018060a01b03911716171790565b65ffffffffffff60a01b94506150ca565b5065ffffffffffff60a01b6150b9565b65ffffffffffff60a01b94506150a6565b356001600160501b031981169291906016821061512f575050565b6001600160501b031960169290920360031b82901b16169150565b805468010000000000000000811015610f8c5761516c916001820181556148b5565b819291549060031b9160501c821b9160018060b01b03901b1916179055565b356001600160f01b031981169291906002821061226d575050565b91906151b29080614880565b9260fe84118015615496575b6154875760016151cd8261206e565b0154615474575b5f1984015f5b818110615336575090615299615292838761523261528361526a6134c461526461525e87612ff79e9f8e6152596152b59f8f9061070561282b61282561522461522a9489896122cd565b90611dea565b9a8b9161206e565b805462010000600160b01b03191660109290921b62010000600160b01b0316919091179055565b6122cd565b90611e18565b9061518b565b6152738861206e565b9060f01c61ffff19825416179055565b6001600160a01b0316966122cd565b8091611dfb565b6040519586939092906001600160e01b031916602085016148ca565b803b15610232575f6152db92604051809481926306d61fe760e41b8352600483016121ad565b038183855af19081156107dc575f516020615f9f5f395f51905f52926128ba92615322575b5060408051600681526001600160a01b03909216602083015290918291820190565b806107d65f61533093610fe3565b5f615300565b6153d19061537c60016153488661206e565b0161537661536961536361535d868d8c6122cd565b90611ddc565b90615114565b6001600160501b03191690565b9061514a565b61539661070561070561282b612825615224868d8c6122cd565b6153a4615292838a896122cd565b604051949185916153c3916001600160e01b03198a16602085016148ca565b03601f198101855284610fe3565b803b15610232576040516306d61fe760e41b8152925f9184918290849082906153fd90600483016121ad565b03925af19182156107dc57600192615460575b505f516020615f9f5f395f51905f5261545761543661282b612825615224868d8c6122cd565b60408051600581526001600160a01b03909216602083015290918291820190565b0390a1016151da565b806107d65f61546e93610fe3565b5f615410565b6154826001612fa28361206e565b6151d4565b63b62d956d60e01b5f5260045ffd5b5083156151be565b5f516020615f9f5f395f51905f52916040916001600160a01b0382161561551b575b6001600160a01b039081165f8181527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b8660205284902080546001600160a01b03191693909216929092179055815190600282526020820152a1565b600191506154c0565b91601382111561553f57823560601c92601401916013190190565b63ba597e7e5f526004601cfd5b90603381111561553f57813560601c92601483013592603401916033190190565b905f928491604051958692833738935af1913d82523d5f602084013e60203d830101604052565b90925f92819594604051968792833738935af1156155c1573d82523d5f602084013e60203d830101604052565b503d5f823e3d90fd5b918235826020118160401c1761553f5783016020810193813593846155ee57505050565b01601f190190835b5f190160208160051b8301013580830160608101908135809101918680602080860135809601011191111792171760401c1761553f57806155f657505050565b919061564181614601565b925f5b82811061565057505050565b8061567a60019260051b84013584016040810135810190602082359201906020810135903561556d565b6156848389613f19565b5215615691575b01615644565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76156da6156bf8389613f19565b51604051918291858352604060208401526040830190610d6e565b0390a161568b565b91906156ed81614601565b925f5b8281106156fc57505050565b8061572660019260051b840135840160408101358101906020823592019060208101359035615594565b6157308288613f19565b5261573b8187613f19565b50016156f0565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f0000000000000000000000000000000000000000000000000000000000000000461416156157cd575b6719010000000000005f52601a52603a526042601820905f603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f00000000000000000000000000000000000000000000000000000000000000006040820152466060820152306080820152206157b0565b60a061585e613da7565b90602081519101209060208151910120604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8352602083015260408201525f6060820152306080820152206719010000000000005f52601a52603a526042601820905f603a52565b9491848461594a9296959396604051906158e282610fc7565b5f82525f602083015260408201995f8b52615944606084019a8b925f84525f60808701525f60a0870152606060c087015261593560e08701915f83526101008801955f87529063ffffffff60e01b169052565b6001600160a01b039091169052565b526159ea565b60ff8061595d614ea8613fca8786613f91565b160361504457615034615977846159879561598c94611d92565b9490955163ffffffff60e01b1690565b61206e565b9351929190565b8065ffffffffffff8260a01c169182156001146159b1575b60d01c92565b65ffffffffffff92506159ab565b90926080926120b99594835260018060a01b0316602083015260408201528160608201520190610d6e565b9160608301906001615a3f615a06845163ffffffff60e01b1690565b6001600160e01b0319165f9081527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f8526020526040902090565b01805493905f5b858110615a565750505050505050565b615a66612f13612f0683856148b5565b6001600160a01b031660a0890190815260808901949091615a8f906001600160f01b0319168652565b615aa9615aa2614ea8613fca8985613f91565b60ff168a52565b615ab7614eae8a5160ff1690565b808403615c265750858181615adc614ee1614edb614ed5615b319b9c615b0498611dae565b8c60c0615af7612b1260208401948086526009018688611dbf565b9101525160090191611e54565b949094955b51600160f11b90615b23906001600160f01b0319166134c4565b166001600160f01b03191690565b15615b40575b50600101615a46565b51615b53906001600160a01b0316610705565b6020615b79615b6c615b6c895163ffffffff60e01b1690565b6001600160e01b03191690565b60e08a01516101008b015160c08c015160405163184dfdbb60e11b8152958694909385938493615bb89390926001600160a01b031690600486016159bf565b03915afa9081156107dc575f91615c08575b506001600160a01b038116615bf45790600191615bec60408a01918251615053565b905290615b37565b631f24c1fb60e11b5f52600482905260245ffd5b615c20915060203d81116138a4576138958183610fe3565b5f615bca565b909490831115615c3f57630760bdcf60e11b5f5260045ffd5b615b3190615c4e365f88612a9a565b60c08b0152615b09565b5f516020615fdf5f395f51905f52545f9493929060581b6001600160f81b03198116600160f81b03615d135791615cb89391615c9961070560209560581c90565b9160405195869485938493637aa8f17760e11b85523060048601612189565b03915afa9081156107dc575f91615cf4575b505b6001600160e01b0319166374eca2c160e11b01615ce557565b6362467c7760e11b5f5260045ffd5b615d0d915060203d6020116134875761347f8183610fe3565b5f615cca565b90949192916001600160f81b03198216600160f91b03615db45750602091615d419160081b958430886158c9565b60405163392dffaf60e01b81529297929586949385938493615d7493909230906001600160e01b03191660048701614b4c565b03916001600160a01b03165afa9081156107dc575f91615d95575b50615ccc565b615dae915060203d6020116134875761347f8183610fe3565b5f615d8f565b94906001600160f81b03191661244b57615dcd92614a93565b615ccc565b615ddf6105308383611d1d565b91602c8110615f8257602c820190615e0061070561282b6128258487611d48565b615e2a615e1c613fd8613fca615e168780612006565b90613f91565b6001600160f81b0319161590565b80615edd575b61070561282b61282585615e856102419a87615e6961070561282b6128258f9d6129559f9e8f604c9f6129ce9f615e8b575b5050611e43565b615e738b80612006565b9390926001600160a01b031690613f9a565b88611e43565b612955615ecf615ed693606c860190615eca615eb961070561282b612825615eb38787612006565b90611d59565b9586906001600160a01b031661549e565b612006565b8091611e26565b8f87615e62565b5060405163ecd0596160e01b81526002600482015290949291906020816024816001600160a01b038a165afa9384156107dc5761282b61282584615e85610705948b615e6961070561282b6102419f8f9c6129559f9d8f604c9f936129ce9f94612825955f91615f63575b509f50505050505050505097509a5050959650505050615e30565b615f7c915060203d602011610831576108238183610fe3565b5f615f48565b90506004915003615f8f57565b637a210a5d60e11b5f5260045ffdfed21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x127", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x38ab00720fd3d1ab2ba17366d9df8e3f8662a4625382eda6b56e5280bc8a7cb7", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0xe30c76dc9ecf1c19f6fec070674e1b4effe069fa", + "function": null, + "arguments": [ + "0xE264dCCc54e4b6906c0D1Fee11D4326c06D33c80" + ], + "transaction": { + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x5d17a", + "value": "0x0", + "input": "0x000000000000000000000000000000000000000000000000000000000000000060a034607357601f61044238819003918201601f19168301916001600160401b03831184841017607757808492602094604052833981010312607357516001600160a01b03811681036073576080526040516103b6908161008c823960805181818160c60152818161021d01526102d80152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816348aac39214610250575080635c60da1b146102085763ea6d13ac1461003d575f80fd5b6100463661033f565b60405161006c602080838181019587898837878201908382015203018084520182610394565b519020905f92604051927fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f60212060358501523060581b845260ff84538060158501526055842094341591863b156101eb5750506001906101e6575f38818034895af1156101d9575b836040525f60605215610157575b6040516001600160a01b0385168152602090f35b9180825f9493859483378101838152039082855af13d156101d4573d67ffffffffffffffff81116101c0576040519061019a601f8201601f191660200183610394565b81525f60203d92013e5b156101b1575f8080610143565b63487e630960e11b5f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b6101a4565b63b12d13eb5f526004601cfd5b610135565b91509450605f602134f593846101355763301164255f526004601cfd5b3461024c575f36600319011261024c576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b3461024c57806102826020806102653661033f565b908084889499019889378201908382015203018084520182610394565b5190206040517fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f602120906040525f60605260ff5f536035523060601b600152601552602060555f205f6035526040519060018060a01b03168152f35b90604060031983011261024c5760043567ffffffffffffffff811161024c578260238201121561024c5780600401359267ffffffffffffffff841161024c576024848301011161024c57602401919060243590565b90601f8019910116810190811067ffffffffffffffff8211176101c05760405256000000000000000000000000e264dccc54e4b6906c0d1fee11d4326c06d33c80", + "nonce": "0x128", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x5aed2b4fdb8f1590f077009d701c5efa0bfa78996fde17e5149f259bc6536fa9", + "transactionType": "CALL", + "contractName": "FactoryStaker", + "contractAddress": "0xd703aae79538628d27099b8c4f621be4ccd142d5", + "function": "approveFactory(address,bool)", + "arguments": [ + "0xE30c76Dc9eCF1c19F6Fec070674E1b4eFfE069FA", + "true" + ], + "transaction": { + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0xd703aae79538628d27099b8c4f621be4ccd142d5", + "gas": "0x108d1", + "value": "0x0", + "input": "0x6e7dbabb000000000000000000000000e30c76dc9ecf1c19f6fec070674e1b4effe069fa0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x129", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x110e5d6", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x53efa638c1459295f1420a5d3c513817b0059fe455cfb6efd57e9f43393ec813", + "transactionIndex": "0xb8", + "blockHash": "0xef37eb99995e743934f8b219a6c9c5c7bee1f3f5b63c69e5de6e8f6858f7b626", + "blockNumber": "0x76c627", + "gasUsed": "0x52786c", + "effectiveGasPrice": "0x92954692", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0xe264dccc54e4b6906c0d1fee11d4326c06d33c80" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x114e049", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x38ab00720fd3d1ab2ba17366d9df8e3f8662a4625382eda6b56e5280bc8a7cb7", + "transactionIndex": "0xb9", + "blockHash": "0xef37eb99995e743934f8b219a6c9c5c7bee1f3f5b63c69e5de6e8f6858f7b626", + "blockNumber": "0x76c627", + "gasUsed": "0x3fa73", + "effectiveGasPrice": "0x92954692", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0xe30c76dc9ecf1c19f6fec070674e1b4effe069fa" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x115955c", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x5aed2b4fdb8f1590f077009d701c5efa0bfa78996fde17e5149f259bc6536fa9", + "transactionIndex": "0xba", + "blockHash": "0xef37eb99995e743934f8b219a6c9c5c7bee1f3f5b63c69e5de6e8f6858f7b626", + "blockNumber": "0x76c627", + "gasUsed": "0xb513", + "effectiveGasPrice": "0x92954692", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0xd703aae79538628d27099b8c4f621be4ccd142d5", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1740503073, + "chain": 11155111, + "commit": "9ebc75c" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/11155111/run-latest.json b/broadcast/DeployKernel.s.sol/11155111/run-latest.json index 9d52ba76..4e9c7bb0 100644 --- a/broadcast/DeployKernel.s.sol/11155111/run-latest.json +++ b/broadcast/DeployKernel.s.sol/11155111/run-latest.json @@ -1,10 +1,10 @@ { "transactions": [ { - "hash": "0xe04a1ae67377ff45975933b4dee7b41a4c8de161b1e53b0f2aaa5db1b7117b44", + "hash": "0x53efa638c1459295f1420a5d3c513817b0059fe455cfb6efd57e9f43393ec813", "transactionType": "CREATE2", "contractName": "Kernel", - "contractAddress": "0xd830d15d3dc0c269f3dbaa0f3e8626d33cfdabe1", + "contractAddress": "0xe264dccc54e4b6906c0d1fee11d4326c06d33c80", "function": null, "arguments": [ "0x0000000071727De22E5E9d8BAf0edAc6f37da032" @@ -12,44 +12,44 @@ "transaction": { "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0x73b8af", + "gas": "0x71e987", "value": "0x0", - "input": "0x0000000000000000000000000000000000000000000000000000000000000000610140806040523461020357602081615e4a80380380916100208285610207565b83398101031261020357516001600160a01b038116810361020357306080524660a05260a0604051610053604082610207565b6006815260208101906512d95c9b995b60d21b825260405191610077604084610207565b60058352602083019164181719971960d91b8352519020915190208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260208301526040820152466060820152306080820152206101005261012052604051602081019063deadbeef60e01b825260048152610101602482610207565b5190516001600160581b031981169190601582106101e3575b7f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f80546001600160a81b031916605885901c179055604051615c0b908161023f82396080518161472c015260a0518161474f015260c051816147bf015260e051816147e50152610100518161470b0152610120518181816103b40152818161069d0152818161084301528181610a9f01528181610e1e01528181611136015281816112aa015281816113000152818161182d0152818161195d015281816125ac0152612ff30152f35b6001600160581b031960159290920360031b82901b161690505f8061011a565b5f80fd5b601f909101601f19168101906001600160401b0382119082101761022a57604052565b634e487b7160e01b5f52604160045260245ffdfe6080604052600436101561001d575b36612ea15761001b612e70565b005b5f3560e01c8063112d3a7d1461020c578063150b7a02146102075780631626ba7e1461020257806319822f7c146101fd5780631f1b92e3146101f85780633659cfe6146101f35780633c3b752b146101ee57806352141cd9146101e957806357b3a5f4146101e45780636e6fa0c6146101df578063721e67f4146101da57806384b0196e146101d55780638dd7712f146101d057806390ef8862146101cb5780639198bdf5146101c65780639517e29f146101c15780639cfd7cff146101bc578063a65d69d4146101b7578063a71763a8146101b2578063adb610a3146101ad578063b8afe17d146101a8578063bc197c81146101a3578063c3e589781461019e578063d03c791414610199578063d691c96414610194578063e6f3d50a1461018f578063e9ae5c531461018a578063f1f7f0f914610185578063f23a6e6114610180578063f2dc691d1461017b5763fc9c5dec0361000e57611b12565b611af4565b611a9a565b611a64565b611936565b6117b8565b6116d6565b611689565b6115b6565b6114a5565b611439565b611407565b6112d9565b611295565b61123d565b61110f565b610ff8565b610ee9565b610dee565b610d50565b610cca565b610c6f565b610bbc565b610a1e565b610988565b61080d565b610665565b610380565b61031f565b6102c5565b61029f565b6001600160a01b0381160361022257565b5f80fd5b359061023182610211565b565b9181601f84011215610222578235916001600160401b038311610222576020838186019501011161022257565b6060600319820112610222576004359160243561027c81610211565b91604435906001600160401b0382116102225761029b91600401610233565b9091565b346102225760206102bb6102b236610260565b92919091611d65565b6040519015158152f35b34610222576080366003190112610222576102e1600435610211565b6102ec602435610211565b6064356001600160401b0381116102225761030b903690600401610233565b5050604051630a85bd0160e11b8152602090f35b34610222576040366003190112610222576004356024356001600160401b0381116102225760209161035861035e923690600401610233565b91611f2a565b6040516001600160e01b03199091168152f35b90816101209103126102225790565b6060366003190112610222576004356001600160401b038111610222576103ab903690600401610371565b602435604435917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610632576103ef6020820135613212565b9092919084836001600160f81b0319861615610619575b82610411939461340b565b9361043661042661042184611cf7565b6120ca565b946001600160f81b031916151590565b9384806105d8575b6105c957602001516001600160a01b031690819081156104d15760019261046f61048e925f525f60205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b0361053c57826104e0575b50506104d157816104bb925b6104bf575b506040519081529081906020820190565b0390f35b3490349034903490335af1505f6104aa565b631a0a9b9f60e21b5f5260045ffd5b61053592506105319161051561050f6105096104fe61052a95611d2e565b9360608101906120f6565b90611b72565b90611cc1565b63ffffffff60e01b165f5260205260405f2090565b5460ff1690565b1590565b5f80610499565b82919291610596575b506104d15761050981606061055b9301906120f6565b638dd7712f60e01b916001600160e01b03199161057791611cc1565b160361058757816104bb926104a5565b63dbbb044b60e01b5f5260045ffd5b6105c3915061052a6105aa61053192611d2e565b61051561050f6105bd60608801886120f6565b90611b61565b5f610545565b633ab3447f60e11b5f5260045ffd5b50805163ffffffff1663ffffffff6106116106085f516020615beb5f395f51905f525463ffffffff9060c81c1690565b63ffffffff1690565b91161061043e565b5f516020615beb5f395f51905f525460581b9250610406565b6348f5c3ed60e01b5f5260045ffd5b6004359063ffffffff8216820361022257565b359063ffffffff8216820361022257565b602036600319011261022257610679610641565b61069a6106945f516020615beb5f395f51905f525460581b90565b60581c90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610803575b156107f95760405163ecd0596160e01b81526004808201526001600160a01b039190911690602081602481855afa90811561079d575f916107ca575b50156106325760405163d68f602560e01b8152915f838061072f363433600485016121bd565b038183865af192831561079d575f936107a2575b5061074d90613624565b803b1561022257604051630b9dfbed60e11b8152915f91839182908490829061077990600483016121e2565b03925af1801561079d5761078957005b806107975f61001b93610fa1565b80610d22565b611f1f565b61074d9193506107c3903d805f833e6107bb8183610fa1565b81019061215b565b9290610743565b6107ec915060203d6020116107f2575b6107e48183610fa1565b810190612128565b5f610709565b503d6107da565b5061001b90613624565b50303314156106cd565b60203660031901126102225760043561082581610211565b6108406106945f516020615beb5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061093c575b156109325760405163ecd0596160e01b81526004808201526001600160a01b039190911690602081602481855afa90811561079d575f91610913575b50156106325760405163d68f602560e01b8152915f83806108d5363433600485016121bd565b038183865af192831561079d575f936108f3575b5061074d906121f3565b61074d91935061090c903d805f833e6107bb8183610fa1565b92906108e9565b61092c915060203d6020116107f2576107e48183610fa1565b5f6108af565b5061001b906121f3565b5030331415610873565b6001600160581b031981160361022257565b9181601f84011215610222578235916001600160401b038311610222576020808501948460051b01011161022257565b346102225760a0366003190112610222576004356109a581610946565b6024356109b181610211565b6044356001600160401b038111610222576109d0903690600401610233565b6064939193356001600160401b038111610222576109f2903690600401610233565b91608435956001600160401b03871161022257610a1661001b973690600401610958565b969095612339565b608036600319011261022257600435610a3681610946565b602435610a4281610211565b6044356001600160401b03811161022257610a61903690600401610233565b6064356001600160401b03811161022257610a80903690600401610233565b91610a9c6106945f516020615beb5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ba0575b15610b915760405163ecd0596160e01b81526004808201526001600160a01b03919091169490602081602481895afa90811561079d575f91610b72575b50156106325760405163d68f602560e01b8152955f8780610b32363433600485016121bd565b0381838a5af196871561079d575f97610b52575b5061074d959697612482565b61074d969750610b6b903d805f833e6107bb8183610fa1565b9695610b46565b610b8b915060203d6020116107f2576107e48183610fa1565b5f610b0c565b50919361001b95939193612482565b5030331415610acf565b6001600160e01b031981160361022257565b34610222576020366003190112610222576104bb610bfd600435610bdf81610baa565b5f60408051610bed81610f2f565b8281528260208201520152611e57565b600160405191610c0c83610f2f565b805460a083901b839003168084529101546001600160a01b0380821660208086019182526001600160f81b031960589490941b84166040968701908152865195841686529151909216918401919091525116918101919091529081906060820190565b3461022257604036600319011261022257602060ff610cbe600435610c9381610946565b610ca860243591610ca383610baa565b611d2e565b9063ffffffff60e01b165f5260205260405f2090565b54166040519015158152f35b34610222576020366003190112610222576020610cff600435610cec81610211565b5f604051610cf981610f4f565b5261304f565b60405190610d0c82610f4f565b546001600160a01b031690819052604051908152f35b5f91031261022257565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b34610222575f36600319011261022257610d8f610d9d610d6e613971565b604092919251938493600f60f81b855260e0602086015260e0850190610d2c565b908382036040850152610d2c565b4660608301523060808301525f60a083015281810360c083015260206060519182815201906080905f5b818110610dd5575050500390f35b8251845285945060209384019390920191600101610dc7565b6040366003190112610222576004356001600160401b03811161022257610e19903690600401610371565b6024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610632575f908152602081905260409020546001600160a01b03169060609060018314159081610eb9575b610e8e610e87826060610e959401906120f6565b8091611b80565b9030613a59565b5015610eaa57610ea157005b61001b91613a7e565b63f21e646b60e01b5f5260045ffd5b9150610e95610e8e610e87610edf610ed7610e8760608801886120f6565b903489613a0e565b9492505050610e73565b34610222575f36600319011261022257602063ffffffff5f516020615beb5f395f51905f525460c81c16604051908152f35b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b03821117610f4a57604052565b610f1b565b602081019081106001600160401b03821117610f4a57604052565b604081019081106001600160401b03821117610f4a57604052565b61012081019081106001600160401b03821117610f4a57604052565b90601f801991011681019081106001600160401b03821117610f4a57604052565b60405190610231604083610fa1565b6040519061023161012083610fa1565b6001600160401b038111610f4a5760051b60200190565b6080366003190112610222576004356001600160401b03811161022257611023903690600401610958565b602435916001600160401b038311610222573660238401121561022257826004013561104e81610fe1565b9361105c6040519586610fa1565b8185526024602086019260061b8201019036821161022257602401915b8183106110ce575050506044356001600160401b038111610222576110a2903690600401610958565b90606435946001600160401b038611610222576110c661001b963690600401610958565b959094612587565b60408336031261022257602060409182516110e881610f6a565b6110f186610654565b81528286013561110081610211565b83820152815201920191611079565b61111836610260565b6111336106945f516020615beb5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611233575b156112285760405163ecd0596160e01b81526004808201526001600160a01b03919091169290602081602481875afa90811561079d575f91611209575b50156106325760405163d68f602560e01b8152935f85806111c9363433600485016121bd565b038183885af194851561079d575f956111e9575b5061074d939495612754565b61074d949550611202903d805f833e6107bb8183610fa1565b94936111dd565b611222915060203d6020116107f2576107e48183610fa1565b5f6111a3565b509161001b93612754565b5030331415611166565b34610222575f366003190112610222576104bb60405161125e604082610fa1565b601681527535b2b93732b61730b23b30b731b2b2173b181719971960511b6020820152604051918291602083526020830190610d2c565b34610222575f366003190112610222576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b6112e236610260565b6112fd6106945f516020615beb5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806113fd575b156113f25760405163ecd0596160e01b81526004808201526001600160a01b03919091169290602081602481875afa90811561079d575f916113d3575b50156106325760405163d68f602560e01b8152935f8580611393363433600485016121bd565b038183885af194851561079d575f956113b3575b5061074d939495612aad565b61074d9495506113cc903d805f833e6107bb8183610fa1565b94936113a7565b6113ec915060203d6020116107f2576107e48183610fa1565b5f61136d565b509161001b93612aad565b5030331415611330565b34610222575f36600319011261022257602063ffffffff5f516020615beb5f395f51905f525460a81c16604051908152f35b3461022257602036600319011261022257604061146960043561145b81610946565b611463612c55565b50611cf7565b81519061147582610f6a565b5463ffffffff81168083526001600160a01b03602092831c81169383019384528451918252925190921690820152f35b346102225760a0366003190112610222576114c1600435610211565b6114cc602435610211565b6044356001600160401b038111610222576114eb903690600401610958565b50506064356001600160401b0381116102225761150c903690600401610958565b50506084356001600160401b0381116102225761152d903690600401610233565b505060405163bc197c8160e01b8152602090f35b602080825282516001600160f01b03191681830152808301516001600160a01b03166040808401919091529092015160608083015280516080830181905260a09092019201905f5b8181106115965750505090565b82516001600160501b031916845260209384019390920191600101611589565b34610222576020366003190112610222576115f56004356115d681610baa565b6060604080516115e581610f2f565b5f81525f60208201520152611e8d565b60016040519161160483610f2f565b805461ffff60f01b8160f01b168452828060a01b039060101c16602084015201906040519182602082549182815201915f5260205f20905f5b818110611666576104bb858761165581880382610fa1565b604082015260405191829182611541565b825460501b6001600160501b03191684526020909301926001928301920161163d565b346102225760203660031901126102225760206102bb600435612c6d565b9060406003198301126102225760043591602435906001600160401b0382116102225761029b91600401610233565b6116df366116a7565b90916001600160a01b036116f23361304f565b54169182156117a95760609060018414159485611792575b61171492936142f0565b92611782575b50506040518091602082016020835281518091526040830190602060408260051b8601019301915f905b82821061175357505050500390f35b919360019193955060206117728192603f198a82030186528851610d2c565b9601920192018594939192611744565b61178b91613a7e565b5f8061171a565b61171492506117a23634876139b5565b925061170a565b63710c949760e01b5f5260045ffd5b6060366003190112610222576004356117d081610946565b6024356001600160401b038111610222576117ef903690600401610233565b6044356001600160401b0381116102225761180e903690600401610233565b9061182a6106945f516020615beb5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061192c575b1561191f5760405163ecd0596160e01b81526004808201526001600160a01b03919091169390602081602481885afa90811561079d575f91611900575b50156106325760405163d68f602560e01b8152945f86806118c0363433600485016121bd565b038183895af195861561079d575f966118e0575b5061074d949596612d45565b61074d9596506118f9903d805f833e6107bb8183610fa1565b95946118d4565b611919915060203d6020116107f2576107e48183610fa1565b5f61189a565b5091909261001b94612d45565b503033141561185d565b61193f366116a7565b61195a6106945f516020615beb5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611a5a575b15611a4f5760405163ecd0596160e01b81526004808201526001600160a01b03919091169190602081602481865afa90811561079d575f91611a30575b50156106325760405163d68f602560e01b8152925f84806119f0363433600485016121bd565b038183875af193841561079d575f94611a10575b5061074d929394612d5a565b61074d939450611a29903d805f833e6107bb8183610fa1565b9392611a04565b611a49915060203d6020116107f2576107e48183610fa1565b5f6119ca565b509061001b92612d5a565b503033141561198d565b34610222575f3660031901126102225760205f516020615beb5f395f51905f525460581b604051906001600160581b0319168152f35b346102225760a036600319011261022257611ab6600435610211565b611ac1602435610211565b6084356001600160401b03811161022257611ae0903690600401610233565b505060405163f23a6e6160e01b8152602090f35b346102225760203660031901126102225760206102bb600435612d65565b34610222576040366003190112610222576004356001600160401b03811161022257611b59611b476020923690600401610371565b60243590611b5482610211565b612d72565b604051908152f35b906008116102225760040190600490565b906004116102225790600490565b909291928360041161022257831161022257600401916003190190565b906020116102225790602090565b90929192836020116102225783116102225760200191601f190190565b906018116102225760040190601490565b906014116102225790601490565b909291928360011161022257831161022257600101915f190190565b906009116102225760010190600890565b909291928360091161022257831161022257600901916008190190565b906016116102225790601690565b906016116102225760020190601490565b909291928360161161022257831161022257601601916015190190565b906002116102225790600290565b909291928360141161022257831161022257601401916013190190565b90602c116102225760180190601490565b90939293848311610222578411610222578101920390565b356001600160e01b0319811692919060048210611cdc575050565b6001600160e01b031960049290920360031b82901b16169150565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85060205260405f2090565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85160205260405f2090565b90929060018103611db457506001600160a01b0392611dae9250611d9e915060581b600160581b600160f81b0316600160f81b17611cf7565b5460201c6001600160a01b031690565b16151590565b60028103611df457506001600160a01b0392611dae9250611de89150611ddb90841661304f565b546001600160a01b031690565b6001600160a01b031690565b600303611e3457611e15611e1061050f600193611e2395611b72565b611e57565b01546001600160a01b031690565b6001600160a01b0390811691161490565b5050505f90565b359060208110611e49575090565b5f199060200360031b1b1690565b63ffffffff60e01b165f527f7c341349a4360fdd5d5bc07e69f325dc6aaea3eb018b3e0ea7e53cc0bb0d6f3b60205260405f2090565b63ffffffff60e01b165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85260205260405f2090565b908160209103126102225751611ed881610baa565b90565b908060209392818452848401375f828201840152601f01601f1916010190565b611ed8949260609260018060a01b0316825260208201528160408201520191611edb565b6040513d5f823e3d90fd5b91611f3491613087565b919080836001600160f81b03198416156120aa575b6020811015918261206d575b82612057575b506001600160a01b039050611f75611de8611d9e86611cf7565b16156104d1576001600160f81b03198316600160f81b0361200a5790611fa26020949392611fc0966131b8565b604051637aa8f17760e11b8152958694859384933360048601611efb565b039160581c6001600160a01b03165afa90811561079d575f91611fe1575090565b611ed8915060203d602011612003575b611ffb8183610fa1565b810190611ec3565b503d611ff1565b929160081b93600160f11b61203861202b61202488611e8d565b5460f01b90565b6001600160f01b03191690565b1661204857611ed8943390613104565b635b71057960e01b5f5260045ffd5b819295506120659350611bab565b925f80611f5b565b91507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a6120a361209d8385611b9d565b90611e3b565b1491611f55565b92506120c45f516020615beb5f395f51905f525460581b90565b92611f49565b906040516120d781610f6a565b915463ffffffff81168352602090811c6001600160a01b031690830152565b903590601e198136030182121561022257018035906001600160401b0382116102225760200191813603831361022257565b90816020910312610222575180151581036102225790565b6001600160401b038111610f4a57601f01601f191660200190565b602081830312610222578051906001600160401b038211610222570181601f820112156102225780519061218e82612140565b9261219c6040519485610fa1565b8284526020838301011161022257815f9260208093018386015e8301015290565b611ed8939260609260018060a01b03168252602082015281604082015201905f611edb565b906020611ed8928181520190610d2c565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556001600160a01b03167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2565b1561224d57565b60405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606490fd5b5f516020615beb5f395f51905f52805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b634e487b7160e01b5f52603260045260245ffd5b908210156122e45761029b9160051b8101906120f6565b6122b9565b908092918237015f815290565b60405190612305602083610fa1565b5f8252565b3d15612334573d9061231b82612140565b916123296040519384610fa1565b82523d5f602084013e565b606090565b949392919096959661237c6001600160581b03196123756123685f516020615beb5f395f51905f525460581b90565b6001600160581b03191690565b1615612246565b6001600160581b03198616156104d1576001600160f81b03198616600160f81b14158061246a575b61245b57856123b5612402976136e9565b6123d66123c0610fc2565b60018152925b6001600160a01b03166020840152565b5f516020615beb5f395f51905f52805463ffffffff60a81b1916600160a81b17905561374f565b61374f565b5f5b81811061241057505050565b5f8061241d8385876122cd565b9061242d604051809381936122e9565b039082305af161243b61230a565b501561244957600101612404565b636534eae560e11b5f5260045260245ffd5b6361c4e91b60e11b5f5260045ffd5b506001600160f81b03198616600160f91b14156123a4565b94939291906001600160581b03198616156104d1576001600160f81b03198616600160f81b14158061252d575b61245b576124bc866136e9565b6001600160a01b036124d0611d9e88611cf7565b16156124df575b505050505050565b612522956123fd6125055f516020615beb5f395f51905f525463ffffffff9060a81c1690565b926123c660405194612518604087610fa1565b63ffffffff168552565b5f80808080806124d7565b506001600160f81b03198616600160f91b14156124af565b9060405161255281610f2f565b82546001600160a01b03908116825260019390930154928316602082015260589290921b6001600160f81b0319166040830152565b959294919390946125a96106945f516020615beb5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806126f9575b156126ea5760405163ecd0596160e01b81526004808201526001600160a01b039190911695906020816024818a5afa90811561079d575f916126cb575b50156106325760405163d68f602560e01b8152965f888061263f363433600485016121bd565b0381838b5af197881561079d575f986126ab575b5061265f969798613af7565b803b1561022257604051630b9dfbed60e11b8152915f91839182908490829061268b90600483016121e2565b03925af1801561079d5761269d575b50565b806107975f61023193610fa1565b61265f9798506126c4903d805f833e6107bb8183610fa1565b9796612653565b6126e4915060203d6020116107f2576107e48183610fa1565b5f612619565b50919390929461023196613af7565b50303314156125dc565b916020611ed8938181520191611edb565b356bffffffffffffffffffffffff19811692919060148210612734575050565b6bffffffffffffffffffffffff1960149290920360031b82901b16169150565b9091906001810361289957509060549060581b600160581b600160f81b0316600160f81b179161279061278684611cf7565b5463ffffffff1690565b5f516020615beb5f395f51905f525460a81c63ffffffff169063ffffffff808316911614612881575b506128226127fb611de86127f56127ef6127e85f516020615beb5f395f51905f525463ffffffff9060a81c1690565b9886611bd9565b90612714565b60601c90565b612812612806610fc2565b63ffffffff9097168752565b6001600160a01b03166020860152565b61284d601482019461283486806120f6565b61284460348694939401896120f6565b9390928861374f565b0191600461285b84836120f6565b905014612868575b505050565b61050f6105096102319461287b936120f6565b90613f3b565b6128939060010163ffffffff16612288565b5f6127b9565b600281036128ee5750610231926034826128e16128c6611de86127f56127ef60146128e899019786611bd9565b80966128d286806120f6565b916001600160a01b0316613eaa565b01906120f6565b91613cec565b9091906003810361295957506128e8906038612951611de86127f56127ef6102319861294b60188a01978a612939611de86127f56127ef8761293361050f8288611b72565b95611bc8565b6129438b806120f6565b939092613b64565b88611bc8565b9301906120f6565b9091600482036129ee576001600160a01b03831693843b1561022257612998945f92836040518098819582946306d61fe760e41b845260048401612703565b03925af192831561079d575f516020615bab5f395f51905f52936129da575b50604080519182526001600160a01b03909216602082015290819081015b0390a1565b806107975f6129e893610fa1565b5f6129b7565b60058203612a2b576001600160a01b03831693843b1561022257612998945f92836040518098819582946306d61fe760e41b845260048401612703565b60068203612a68576001600160a01b03831693843b1561022257612998945f92836040518098819582946306d61fe760e41b845260048401612703565b631092ef5760e11b5f5260045ffd5b929192612a8382612140565b91612a916040519384610fa1565b829481845281830111610222578281602093845f960137010152565b60018103612ad6575061269a92919060581b600160581b600160f81b0316600160f81b1761418f565b60028103612af3575061269a9291906001600160a01b031661410c565b60038103612b1e575050612b188280612b1261050f61269a9686611b72565b93611b80565b9161405e565b909160048203612bb057612b7d6129b7915f516020615bcb5f395f51905f5295612b565f516020615beb5f395f51905f525460581b90565b612b62611d9e82611cf7565b6001600160a01b03888116911614612b83575b503691612a77565b83613fa0565b612b8f612baa91611cf7565b8054640100000000600160c01b031916640100000000179055565b5f612b75565b60058203612c36575f516020615beb5f395f51905f525460581b5b612bd861209d8684611b9d565b906001600160f81b03198116600160f91b14612c0e575b5050612b7d6129b7915f516020615bcb5f395f51905f52953691612a77565b60081b6001600160e01b03191614612c27575f80612bef565b6313002bdd60e31b5f5260045ffd5b60068203612a68575f516020615beb5f395f51905f525460581b612bcb565b60405190612c6282610f6a565b5f6020838281520152565b612c81818060081b918160301b9160501b90565b929091906001600160f81b03198116600160f81b14159081612d31575b81612d1c575b81612d03575b50611e345760ff60f81b16600160f81b8114159081612cf9575b50612cf3576001600160e01b031916612cee576001600160501b031916612cea57600190565b5f90565b505f90565b50505f90565b905015155f612cc4565b6001600160f81b031916607f60f91b141590505f612caa565b6001600160f81b031980821614159150612ca4565b6001600160f81b0319811615159150612c9e565b91612d559161023195949361418f565b61450f565b9061269a92916142f0565b60071115612cea57600190565b612e2e90612e6a90612d8d6001600160a01b03823516611de8565b90612e3c6020820135612e2e612daf612da960408601866120f6565b906145a1565b93612dc0612da960608301836120f6565b90608081013560a082013590612de2612da960c08501359460e08101906120f6565b93604051988997602089019b8c94919260e0969399989794919961010087019a60018060a01b03168752602087015260408601526060850152608084015260a083015260c08201520152565b03601f198101835282610fa1565b51902060408051602081019283526001600160a01b03909516908501525f6060850152929182906080820190565b51902090565b7f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460408051338152346020820152a1565b612ebd612eb85f356001600160e01b031916611e57565b612545565b80516001600160a01b0390612ed3908216611de8565b16156130405780516060906001600160a01b0390612ef2908216611de8565b1660018114158061302f575b15612fe35750508051612f1d906001600160a01b0316369034906139b5565b60408201516001600160f81b03191680612fa357506020820151612f49906001600160a01b03166145ac565b92905b15612f9b57516001600160a01b03169060018214158281612f86575b50612f76575b825160208401f35b612f7f91613a7e565b5f80612f6e565b6001600160a01b03908116141590505f612f68565b825160208401fd5b6001600160f81b031990811603612fd4576020820151612fcd906001600160a01b03163690613a34565b9290612f4c565b632d6a6bb760e01b5f5260045ffd5b6001600160a01b0303612f1d57337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614612f1d576348f5c3ed60e01b5f5260045ffd5b506001600160a01b03811415612efe565b631cd4b64760e21b5f5260045ffd5b6001600160a01b03165f9081527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b866020526040902090565b9182358060f81c805f146130cb57806001146130be576002146130a8575f80fd5b6001600160d81b03191692600501916004190190565b5092601501916014190190565b505060015f9301915f190190565b9092608092611ed89694835260018060a01b0316602083015260408201528160608201520191611edb565b61311d65ffffffffffff939561312997958785856145ee565b969295919890986146dd565b50911642109081156131a6575b506131925761314a613174916020976131b8565b60405163392dffaf60e01b8152978896879586959193916001600160e01b031916600487016130d9565b03916001600160a01b03165afa90811561079d575f91611fe1575090565b506001600160e01b03199695505050505050565b65ffffffffffff91501642115f613136565b60405160208101917f1547321c374afde8a591d972a084b071c594c275e36724931ff96c25f2999c8383526040820152604081526131f7606082610fa1565b519020901561320957611ed89061481b565b611ed890614709565b90818060081b9160ff839260f01c1660021461322a57565b6001600160d81b031983169150565b9080601f8301121561022257816020611ed893359101612a77565b919091610120818403126102225761326a610fd1565b9261327482610226565b84526020820135602085015260408201356001600160401b038111610222578161329f918401613239565b604085015260608201356001600160401b03811161022257816132c3918401613239565b60608501526080820135608085015260a082013560a085015260c082013560c085015260e08201356001600160401b0381116102225781613305918401613239565b60e08501526101008201356001600160401b038111610222576133289201613239565b610100830152565b90816020910312610222575190565b80516001600160a01b03168252611ed891602082015160208201526101006133c061339061337e60408601516101206040870152610120860190610d2c565b60608601518582036060870152610d2c565b6080850151608085015260a085015160a085015260c085015160c085015260e085015184820360e0860152610d2c565b92015190610100818403910152610d2c565b9392916133ef90604092865260606020870152606086019061333f565b930152565b9291906133ef60209160408652604086019061333f565b9290925f9261341a3682613254565b916134296101008301836120f6565b918193835f936020821015806135ef575b6135b0575b5050506001600160f81b031916600160f81b145b613589575b506001600160f81b03198616600160f81b036134ef575050604051639700320360e01b815293602092859283915f91839161349691600484016133f4565b039260581c6001600160a01b03165af190811561079d57611ed8925f926134be575b50614c75565b6134e191925060203d6020116134e8575b6134d98183610fa1565b810190613330565b905f6134b8565b503d6134cf565b909460081b93909291600160f01b61350c61202b61202488611e8d565b1661357a575f61352c61352660209661355699858a614a96565b94614c75565b604051630ccab7a160e01b8152979096889586948593926001600160e01b031916600485016133d2565b03926001600160a01b03165af190811561079d57611ed8925f926134be5750614c75565b6314b9743f60e01b5f5260045ffd5b9161359693955086614890565b9193916135a4368284612a77565b6101008401525f613458565b9195509250829196506135c39350611bab565b90916135d0368385612a77565b6101008501526134536135e66001923390612d72565b95905f8061343f565b507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a61361e61209d8484611b9d565b1461343a565b5f516020615beb5f395f51905f5254600a63ffffffff8260a81c16019063ffffffff82116136d55763ffffffff838116921682116136c65761366e9060c81c63ffffffff16610608565b10156105c9575f516020615beb5f395f51905f52805463ffffffff60c81b60c893841b1663ffffffff60c81b1990911617908190559081901c63ffffffff9081169160a81c1681116136bd5750565b61023190612288565b63e60fd64760e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b60207f6789ec0c85d6458d897a36a70129b101f8b4d84c6e218046c3107373dbcbae88918060581c6001600160581b0360a81b5f516020615beb5f395f51905f525416175f516020615beb5f395f51905f5255604051906001600160581b0319168152a1565b92949093919361376161278685611cf7565b5f516020615beb5f395f51905f525460a81c63ffffffff169063ffffffff808316911614613959575b506020810180516001600160a01b031615613950575b5f516020615beb5f395f51905f525460a81c63ffffffff1663ffffffff6137ce610608855163ffffffff1690565b911614801590613924575b6105c957613827613834926137ed87611cf7565b815181546020938401516001600160c01b031990911663ffffffff9290921691909117921b640100000000600160c01b0316919091179055565b516001600160a01b031690565b915f196001600160a01b03841601613913575b5050506001600160f81b03198116600160f81b036138f05760581c6001600160a01b031690813b15610222576040516306d61fe760e41b8152925f9184918291613895919060048401612703565b038183855af190811561079d575f516020615bab5f395f51905f52926129d5926138dc575b5060408051600181526001600160a01b03909216602083015290918291820190565b806107975f6138ea93610fa1565b5f6138ba565b91506001600160f81b03198216600160f91b0361245b576102319160081b614e5d565b61391c92613cec565b5f8080613847565b5061393161278686611cf7565b63ffffffff613947610608855163ffffffff1690565b911610156137d9565b600181526137a0565b61396b9060010163ffffffff16612288565b5f61378a565b60409081516139808382610fa1565b600681526512d95c9b995b60d21b6020820152916139a081519182610fa1565b6005815264181719971960d91b602082015290565b916139dc925f8080946040519687958694859363d68f602560e01b85523360048601611efb565b03926001600160a01b03165af190811561079d575f916139fa575090565b611ed891503d805f833e6107bb8183610fa1565b5f92836139dc95936040519687958694859363d68f602560e01b85523360048601611efb565b5f9060405192808385378338925af4913d82523d5f602084013e60203d830101604052565b5f9192806040519485378338925af4913d82523d5f602084013e60203d830101604052565b6001600160a01b0316803b1561022257604051630b9dfbed60e11b815260206004820152915f918391829084908290613abb906024830190610d2c565b03925af1801561079d57613acc5750565b5f61023191610fa1565b8051156122e45760200190565b80518210156122e45760209160051b010190565b909593919492965f5b87811015613b5057600190613b4a8a89613b368489613b2f828060051b8c013595613b2a87610946565b613ae3565b51946122cd565b90613b42868d8d6122cd565b94909361374f565b01613b00565b509650505050505050565b90156122e45790565b9293929091906001600160a01b03821615613cdd575b613b8390611e57565b93613baf613ba2613b948684613b5b565b356001600160f81b03191690565b6001600160f81b03191690565b936001600160f81b03198516613cb5576001600160a01b03841691613bd691908190611be7565b823b1561022257613c00925f92836040518096819582946306d61fe760e41b845260048401612703565b03925af194851561079d57613c64613c849360019361023198613ca1575b5060408051600381526001600160a01b03881660208201525f516020615bab5f395f51905f529190a15b82546001600160a01b0319166001600160a01b03909116178255565b0180546001600160a01b0319166001600160a01b03909316929092178255565b805460ff60a01b191660589290921c60ff60a01b16919091179055565b806107975f613caf93610fa1565b5f613c1e565b50909390506001600160f81b031980841603612fd4576001613c8491613c6461023196613c48565b6001600160a01b039150613b7a565b6001600160a01b0316919082158015613ea0575b6128635760405163d60b347f60e01b8152306004820152602081602481875afa90811561079d575f91613e81575b50613dc5579080613d3e92611be7565b9190813b15610222576040516306d61fe760e41b8152925f9184918291613d69919060048401612703565b038183855af190811561079d575f516020615bab5f395f51905f52926129d592613db1575b505b60408051600481526001600160a01b03909216602083015290918291820190565b806107975f613dbf93610fa1565b5f613d8e565b81151580613e62575b613dec575b50506129d55f516020615bab5f395f51905f5291613d90565b9080613df792611be7565b9190813b15610222576040516306d61fe760e41b8152925f9184918291613e22919060048401612703565b038183855af190811561079d575f516020615bab5f395f51905f52926129d592613e4e575b5091613dd3565b806107975f613e5c93610fa1565b5f613e47565b506001600160f81b031980613e7a613b948585613b5b565b1614613dce565b613e9a915060203d6020116107f2576107e48183610fa1565b5f613d2e565b5060018314613d00565b92613eb59084615169565b81613f045750505f80916040518260208201916306d61fe760e41b8352613eee81612e2e60248201604090602081525f60208201520190565b51926001600160a01b03165af15061269a61230a565b6001600160a01b039092169190823b156102225761268b925f92836040518096819582946306d61fe760e41b845260048401612703565b7f9d17cd6d095ac90a655405ab29f30a7ee7e88ef3974c1bf7544bf591043bb71a91606091613f6d82610ca883611d2e565b600160ff198254161790556040519163ffffffff60e01b1682526001600160581b031916602082015260016040820152a1565b91907f2b82f87bf66300af618a9621d3f221edfab735f5bacb4e004cce1b62375396c3905a905f806040519361400085613ff26020820196638a91b0e360e01b88526020602484018181520190610d2c565b03601f198101875286610fa1565b6040519361400f602086610fa1565b828552602085019583908a905f368a375193f1913d9081614056575b815f9293523e604080516001600160a01b0390951685528115156020860152909390819081016129d5565b5f915061402b565b61406b9093929193611e57565b80546001600160a01b031981168255600190910180546001600160a01b039092169490929091906001600160f81b0319605883901b16156140bb575b505081546001600160a81b03191690915550565b6140d9926140ca913691612a77565b906001600160a01b0316613fa0565b50805460408051600381526001600160a01b0390921660208301525f516020615bcb5f395f51905f5291a15f80806140a7565b6001600160a01b039081165f8181527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b8660205260409081902080546001600160a01b0319811690915590921694935f516020615bcb5f395f51905f529361417f9161417991369190612a77565b82613fa0565b50815190600282526020820152a1565b9291906141bf6141ad5f516020615beb5f395f51905f525460581b90565b6001600160581b031980871691161490565b612c27576141cf611d9e85611cf7565b936141f06141dc82611cf7565b8054640100000000600160c01b0319169055565b6001600160f81b03198116600160f81b0361423357916138ba6141796129d5935f516020615bcb5f395f51905f529560018060a01b039060581c16933691612a77565b91506001600160f81b03198216600160f91b0361245b576102319160081b6151ef565b604080519091906142678382610fa1565b6001815291601f1901825f5b82811061427f57505050565b806060602080938501015201614273565b9061429a82610fe1565b6142a76040519182610fa1565b82815280926142b8601f1991610fe1565b01905f5b8281106142c857505050565b8060606020809385010152016142bc565b906040611ed8925f81528160208201520190610d2c565b600881901b9291906001600160f81b03198116600160f81b036143835750906143189161542d565b90916001600160f81b031981166143335750611ed891615545565b6001600160f81b031916600160f81b0361435057611ed891615499565b60405162461bcd60e51b815260206004820152600b60248201526a155b9cdd5c1c1bdc9d195960aa1b6044820152606490fd5b9293926001600160f81b0319811661443b5750906143a0916153af565b916143a9614256565b956001600160f81b031981166143d657506143c3936153f7565b6143cc83613ad6565b5261269a82613ad6565b6001600160f81b031916600160f81b03614350576143f3936153d0565b6143fc84613ad6565b52610231577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76129d561442e84613ad6565b51604051918291826142d9565b909391906001600160f81b0319908116036143505761446561446b9161445f614256565b95615387565b91613a59565b61447785939293613ad6565b526001600160f81b03198116600160f81b036144c257501561449557565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76129d561442e84613ad6565b6001600160f81b031916614350576102315760405162461bcd60e51b815260206004820152601360248201527211195b1959d85d1958d85b1b0819985a5b1959606a1b6044820152606490fd5b9091906001600160a01b031680158015614597575b6128635781156122e4575f516020615bcb5f395f51905f52926129d5926001600160f81b03198235811614614577575b505060408051600481526001600160a01b03909216602083015290918291820190565b614588816141799261458f94611be7565b3691612a77565b505f80614554565b5060018114614524565b816040519182372090565b5f809160405136810160405236838237604051601481016040523360601b90528260143601925af190604051903d82523d5f602084013e60203d830101604052565b9491848461466f92969593966040519061460782610f85565b5f82525f602083015260408201995f8b52614669606084019a8b925f84525f60808701525f60a0870152606060c087015261465a60e08701915f83526101008801955f87529063ffffffff60e01b169052565b6001600160a01b039091169052565b526155d0565b60ff80614688614682613b948786613b5b565b60f81c90565b16036146ce576146b76146a2846146b2956146c794611be7565b9490955163ffffffff60e01b1690565b611e8d565b5460101c6001600160a01b031690565b9351929190565b63b32eeb6960e01b5f5260045ffd5b8065ffffffffffff8260a01c169182156001146146fb575b60d01c92565b65ffffffffffff92506146f5565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615614794575b6719010000000000005f52601a52603a526042601820905f603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220614777565b60a0614825613971565b90602081519101209060208151910120604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8352602083015260408201525f6060820152306080820152206719010000000000005f52601a52603a526042601820905f603a52565b9190939293601481019160141161022257803560601c928291906148b2612c55565b602081018690525f516020615beb5f395f51905f525460a81c63ffffffff168082526001600160a01b03909616979091906148ed85806120f6565b6148f6916145a1565b9860348501996149068b886120f6565b61490f916145a1565b90605487019961491f8b8a6120f6565b614928916145a1565b604080517fb17ab1224aca0d4255ef8161acaf2ac121b8faa32a4b2258c912cc5f8308c505602082019081526001600160581b03198a169282019290925263ffffffff9390931660608401526001600160a01b0395909516608083015260a082019290925260c081019290925260e08083019190915281526149ac61010082610fa1565b519020905f1461050961029b98614a0d6094986128e1976149ee61287b9761050f97614a26576149db9061481b565b6149e860748d01856120f6565b9161583e565b9e614a046149fc84806120f6565b9290946120f6565b9390928a61374f565b614a20614a1a828b6120f6565b906159dd565b886120f6565b614a2f90614709565b6149db565b80548210156122e4575f5260205f2001905f90565b356001600160c01b0319811692919060088210614a64575050565b6001600160c01b031960089290920360031b82901b16169150565b604090611ed893928152816020820152019061333f565b93929190935f926001614aa883611e8d565b015f5b8154811015614c3857614ad9614ad1614ac48385614a34565b90549060031b1c60501b90565b908160501c90565b939095614af5614aef614682613b948585613b5b565b60ff1690565b808403614c0a5750908181614b2e614b22614b1c614b1684614b4c98611c03565b90614a49565b60c01c90565b6001600160401b031690565b600901918c610100614b44614588868686611c14565b910152611ca9565b939093955b600160f01b1615614b69575b50600101939193614aab565b604051633894f6e760e11b81529196906020908390815f81614b998f6001600160e01b03198d1660048401614a7f565b03926001600160a01b03165af191821561079d575f92614bea575b506001600160a01b038216614bd657600191614bcf91614c75565b9590614b5d565b631f24c1fb60e11b5f52600487905260245ffd5b614c0391925060203d81116134e8576134d98183610fa1565b905f614bb4565b9196909491831115614c2557630760bdcf60e11b5f5260045ffd5b614c2d6122f6565b6101008b0152614b51565b505091929460ff80614c50614682613b948789613b5b565b16036146ce57610100614c6d614588856146b796611ed898611be7565b910152611e8d565b908082186001600160a01b031615606083811b838501821b9081149184901b141717600114614ca5575050600190565b65ffffffffffff60a01b8216916001600160d01b03198082169083168415614d25575b65ffffffffffff60a01b84168015614d15575b858110908618028086189514614d04575b81811190821802189160018060a01b03911716171790565b65ffffffffffff60a01b9450614cec565b5065ffffffffffff60a01b614cdb565b65ffffffffffff60a01b9450614cc8565b903590601e198136030182121561022257018035906001600160401b03821161022257602001918160051b3603831361022257565b8054905f815581614d7a575050565b5f5260205f20908101905b818110614d90575050565b5f8155600101614d85565b356001600160501b0319811692919060168210614db6575050565b6001600160501b031960169290920360031b82901b16169150565b805468010000000000000000811015610f4a57614df391600182018155614a34565b819291549060031b9160501c821b9160018060b01b03901b1916179055565b9092809260209483528483013701015f815290565b356001600160f01b0319811692919060028210614e42575050565b6001600160f01b031960029290920360031b82901b16169150565b9190614e699080614d36565b9260fe84118015615161575b615152576001614e8482611e8d565b0154615139575b5f1984015f5b818110614ffb575090614f50614f498387614ee9614f3a614f2161202b614f1b614f1587614f6c9e9f8e614f10614f7a9f8f90611de86127f56127ef614edb614ee19489896122cd565b90611c3f565b9a8b91611e8d565b805462010000600160b01b03191660109290921b62010000600160b01b0316919091179055565b6122cd565b90611c6d565b90614e27565b614f2a88611e8d565b9060f01c61ffff19825416179055565b6001600160a01b0316966122cd565b8091611c50565b6040519586939092906001600160e01b03191660208501614e12565b03601f198101845283610fa1565b803b15610222575f614fa092604051809481926306d61fe760e41b8352600483016121e2565b038183855af190811561079d575f516020615bab5f395f51905f52926129d592614fe7575b5060408051600681526001600160a01b03909216602083015290918291820190565b806107975f614ff593610fa1565b5f614fc5565b61509690615041600161500d86611e8d565b0161503b61502e615028615022868d8c6122cd565b90611c31565b90614d9b565b6001600160501b03191690565b90614dd1565b61505b611de8611de86127f56127ef614edb868d8c6122cd565b615069614f49838a896122cd565b60405194918591615088916001600160e01b03198a1660208501614e12565b03601f198101855284610fa1565b803b15610222576040516306d61fe760e41b8152925f9184918290849082906150c290600483016121e2565b03925af191821561079d57600192615125575b505f516020615bab5f395f51905f5261511c6150fb6127f56127ef614edb868d8c6122cd565b60408051600581526001600160a01b03909216602083015290918291820190565b0390a101614e91565b806107975f61513393610fa1565b5f6150d5565b61514d600161514783611e8d565b01614d6b565b614e8b565b63b62d956d60e01b5f5260045ffd5b508315614e75565b5f516020615bab5f395f51905f52916040916001600160a01b038216156151e6575b6001600160a01b039081165f8181527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b8660205284902080546001600160a01b03191693909216929092179055815190600282526020820152a1565b6001915061518b565b91906151fa83611e8d565b916152058280614d36565b9190506001840191600183540103615378575f5b82548110156152b657805f516020615bcb5f395f51905f526152ad8661528b612e2e6141798c61526f88615269615259614ad18f60019e614ac491614a34565b90508c8060a01b03169780614d36565b906122cd565b6040519485939092906001600160e01b03191660208501614e12565b5060408051600581526001600160a01b03909216602083015290918291820190565b0390a101615219565b509361531991506102319392615314614f6c926152d7600161514783611e8d565b8554614f50906152f29060101c6001600160a01b0316611de8565b936153096153008280614d36565b91909280614d36565b5f19019290506122cd565b613fa0565b5080545f516020615bcb5f395f51905f5290615365906153449060101c6001600160a01b0316611de8565b60408051600681526001600160a01b03909216602083015290918291820190565b0390a180546001600160b01b0319169055565b63013dcc8d60e31b5f5260045ffd5b9160138211156153a257823560601c92601401916013190190565b63ba597e7e5f526004601cfd5b9060338111156153a257813560601c92601483013592603401916033190190565b905f928491604051958692833738935af1913d82523d5f602084013e60203d830101604052565b90925f92819594604051968792833738935af115615424573d82523d5f602084013e60203d830101604052565b503d5f823e3d90fd5b918235826020118160401c176153a257830160208101938135938461545157505050565b01601f190190835b5f190160208160051b8301013580830160608101908135809101918680602080860135809601011191111792171760401c176153a2578061545957505050565b91906154a481614290565b925f5b8281106154b357505050565b806154dd60019260051b8401358401604081013581019060208235920190602081013590356153d0565b6154e78389613ae3565b52156154f4575b016154a7565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb761553d6155228389613ae3565b51604051918291858352604060208401526040830190610d2c565b0390a16154ee565b919061555081614290565b925f5b82811061555f57505050565b8061558960019260051b8401358401604081013581019060208235920190602081013590356153f7565b6155938288613ae3565b5261559e8187613ae3565b5001615553565b9092608092611ed89594835260018060a01b0316602083015260408201528160608201520190610d2c565b91606083019060016156256155ec845163ffffffff60e01b1690565b6001600160e01b0319165f9081527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f8526020526040902090565b01805493905f5b85811061563c5750505050505050565b61564c614ad1614ac48385614a34565b6001600160a01b031660a0890190815260808901949091615675906001600160f01b0319168652565b61568f615688614682613b948985613b5b565b60ff168a52565b61569d614aef8a5160ff1690565b80840361580c57508581816156c2614b22614b1c614b166157179b9c6156ea98611c03565b8c60c06156dd61458860208401948086526009018688611c14565b9101525160090191611ca9565b949094955b51600160f11b90615709906001600160f01b03191661202b565b166001600160f01b03191690565b15615726575b5060010161562c565b51615739906001600160a01b0316611de8565b602061575f615752615752895163ffffffff60e01b1690565b6001600160e01b03191690565b60e08a01516101008b015160c08c015160405163184dfdbb60e11b815295869490938593849361579e9390926001600160a01b031690600486016155a5565b03915afa90811561079d575f916157ee575b506001600160a01b0381166157da57906001916157d260408a01918251614c75565b90529061571d565b631f24c1fb60e11b5f52600482905260245ffd5b615806915060203d81116134e8576134d98183610fa1565b5f6157b0565b90949083111561582557630760bdcf60e11b5f5260045ffd5b61571790615834365f88612a77565b60c08b01526156ef565b5f516020615beb5f395f51905f52545f9493929060581b6001600160f81b03198116600160f81b036158f9579161589e939161587f611de860209560581c90565b9160405195869485938493637aa8f17760e11b85523060048601611efb565b03915afa90811561079d575f916158da575b505b6001600160e01b0319166374eca2c160e11b016158cb57565b6362467c7760e11b5f5260045ffd5b6158f3915060203d60201161200357611ffb8183610fa1565b5f6158b0565b9094509091906001600160f81b03198116600160f91b0361245b576020916159279160081b958430886145ee565b60405163392dffaf60e01b8152929792958694938593849361595a93909230906001600160e01b031916600487016130d9565b03916001600160a01b03165afa90811561079d575f9161597b575b506158b2565b615994915060203d60201161200357611ffb8183610fa1565b5f615975565b156159a157565b60405162461bcd60e51b8152602060048201526014602482015273496e76616c69642073656c6563746f724461746160601b6044820152606490fd5b6159ea61050f8383611b72565b9160048110156159f957505050565b602c8110615b9b57602c820190615a19611de86127f56127ef8487611bc8565b615a43615a35613ba2613b94615a2f87806120f6565b90613b5b565b6001600160f81b0319161590565b80615af6575b611de86127f56127ef85615a9e6102319a87615a82611de86127f56127ef8f9d6128e89f9e8f604c9f6129519f615aa4575b5050611c98565b615a8c8b806120f6565b9390926001600160a01b031690613b64565b88611c98565b6128e8615ae8615aef93606c860190615ae3615ad2611de86127f56127ef615acc87876120f6565b90611bd9565b9586906001600160a01b0316615169565b6120f6565b8091611c7b565b8f87615a7b565b5060405163ecd0596160e01b81526002600482015290949291906020816024816001600160a01b038a165afa93841561079d576127f56127ef84615a9e611de8948b615a82611de86127f56102319f8f9c6128e89f9d8f604c9f936129519f946127ef955f91615b7c575b509f50505050505050505097509a5050959650505050615a49565b615b95915060203d6020116107f2576107e48183610fa1565b5f615b61565b6102319250600491501461599a56fed21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", - "nonce": "0xe8", + "input": "0x0000000000000000000000000000000000000000000000000000000000000000610140806040523461020a576020816162458038038091610020828561020e565b83398101031261020a57516001600160a01b038116810361020a57306080524660a05260a060405161005360408261020e565b6006815260208101906512d95c9b995b60d21b82526040519161007760408461020e565b60058352602083019164181719971960d91b8352519020915190208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260208301526040820152466060820152306080820152206101005261012052604051602081019063deadbeef60e01b82526004815261010160248261020e565b5190516001600160581b031981169190601582106101ea575b7f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f80546001600160a81b031916605885901c179055604051615fff9081610246823960805181615765015260a05181615788015260c051816157f8015260e0518161581e015261010051816157440152610120518181816103c4015281816106ac0152818161086601528181610ac401528181610e600152818161115d015281816112ee0152818161132901528181611528015281816119b901528181611aeb015281816125b701526132100152f35b6001600160581b031960159290920360031b82901b161690505f8061011a565b5f80fd5b601f909101601f19168101906001600160401b0382119082101761023157604052565b634e487b7160e01b5f52604160045260245ffdfe6080604052600436101561001d575b366131b65761001b613185565b005b5f3560e01c8063112d3a7d1461021c578063150b7a02146102175780631626ba7e1461021257806319822f7c1461020d5780631f1b92e3146102085780633659cfe6146102035780633c3b752b146101fe57806352141cd9146101f957806357b3a5f4146101f45780636e6fa0c6146101ef578063721e67f4146101ea57806384b0196e146101e55780638dd7712f146101e057806390ef8862146101db5780639198bdf5146101d65780639517e29f146101d15780639cfd7cff146101cc578063a65d69d4146101c7578063a71763a8146101c2578063adb610a3146101bd578063b8afe17d146101b8578063b9b82941146101b3578063bc197c81146101ae578063c3e58978146101a9578063d03c7914146101a4578063d691c9641461019f578063e6f3d50a1461019a578063e9ae5c5314610195578063f1f7f0f914610190578063f23a6e611461018b578063f2dc691d146101865763fc9c5dec0361000e57611cbd565b611c9f565b611c45565b611c0f565b611adf565b61195f565b61187d565b611830565b61175d565b61164c565b6114f5565b61147f565b61144d565b61131d565b6112d9565b611281565b611151565b61103a565b610f2b565b610e30565b610d92565b610d0c565b610cb1565b610bfe565b610a5e565b6109c8565b61084b565b610695565b610390565b61032f565b6102d5565b6102af565b6001600160a01b0381160361023257565b5f80fd5b359061024182610221565b565b9181601f84011215610232578235916001600160401b038311610232576020838186019501011161023257565b6060600319820112610232576004359160243561028c81610221565b91604435906001600160401b038211610232576102ab91600401610243565b9091565b346102325760206102cb6102c236610270565b92919091611f10565b6040519015158152f35b34610232576080366003190112610232576102f1600435610221565b6102fc602435610221565b6064356001600160401b0381116102325761031b903690600401610243565b5050604051630a85bd0160e11b8152602090f35b34610232576040366003190112610232576004356024356001600160401b0381116102325760209161036861036e923690600401610243565b91613382565b6040516001600160e01b03199091168152f35b90816101209103126102325790565b6060366003190112610232576004356001600160401b038111610232576103bb903690600401610381565b602435604435917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610662576103ff60208201356135ce565b9092919084836001600160f81b0319861615610649575b8261042193946137c7565b9361044661043661043184611ea2565b611fda565b946001600160f81b031916151590565b938480610608575b6105f957602001516001600160a01b0316801591819083806105f2575b6104f2576001926104866104a5925f525f60205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b149081156105ea575b501561055d5782610501575b50506104f257816104dc925b6104e0575b506040519081529081906020820190565b0390f35b3490349034903490335af1505f6104cb565b631a0a9b9f60e21b5f5260045ffd5b61055692506105529161053661053061052a61051f61054b95611ed9565b936060810190612006565b90611d1d565b90611e6c565b63ffffffff60e01b165f5260205260405f2090565b5460ff1690565b1590565b5f806104ba565b829192916105b7575b506104f25761052a81606061057c930190612006565b638dd7712f60e01b916001600160e01b03199161059891611e6c565b16036105a857816104dc926104c6565b63dbbb044b60e01b5f5260045ffd5b6105e4915061054b6105cb61055292611ed9565b6105366105306105de6060880188612006565b90611d0c565b5f610566565b90505f6104ae565b508661046b565b633ab3447f60e11b5f5260045ffd5b50805163ffffffff1663ffffffff6106416106385f516020615fdf5f395f51905f525463ffffffff9060c81c1690565b63ffffffff1690565b91161061044e565b5f516020615fdf5f395f51905f525460581b9250610416565b6348f5c3ed60e01b5f5260045ffd5b6004359063ffffffff8216820361023257565b359063ffffffff8216820361023257565b6020366003190112610232576106a9610671565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610841575b15610838576107116107056106ff5f516020615fdf5f395f51905f525460581b90565b60581c90565b6001600160a01b031690565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91610809575b50156106625760405163d68f602560e01b8152916001600160a01b0391909116905f838061076e36343360048501612164565b038183865af19283156107dc575f936107e1575b5061078c90613a5b565b803b1561023257604051630b9dfbed60e11b8152915f9183918290849082906107b890600483016121ad565b03925af180156107dc576107c857005b806107d65f61001b93610fe3565b80610d64565b6120bc565b61078c919350610802903d805f833e6107fa8183610fe3565b8101906120e2565b9290610782565b61082b915060203d602011610831575b6108238183610fe3565b8101906120a4565b5f61073b565b503d610819565b61001b90613a5b565b50303314156106dc565b60203660031901126102325760043561086381610221565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061097c575b15610973576108b96107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91610954575b50156106625760405163d68f602560e01b8152916001600160a01b0391909116905f838061091636343360048501612164565b038183865af19283156107dc575f93610934575b5061078c906121be565b61078c91935061094d903d805f833e6107fa8183610fe3565b929061092a565b61096d915060203d602011610831576108238183610fe3565b5f6108e3565b61001b906121be565b5030331415610896565b6001600160581b031981160361023257565b9181601f84011215610232578235916001600160401b038311610232576020808501948460051b01011161023257565b346102325760a0366003190112610232576004356109e581610986565b6024356109f181610221565b6044356001600160401b03811161023257610a10903690600401610243565b6064939193356001600160401b03811161023257610a32903690600401610243565b91608435956001600160401b03871161023257610a5661001b973690600401610998565b969095612325565b608036600319011261023257600435610a7681610986565b602435610a8281610221565b6044356001600160401b03811161023257610aa1903690600401610243565b6064356001600160401b03811161023257610ac0903690600401610243565b91337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610be2575b15610bd457610b176107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91610bb5575b50156106625760405163d68f602560e01b8152956001600160a01b039190911694905f8780610b7536343360048501612164565b0381838a5af19687156107dc575f97610b95575b5061078c9596976124a8565b61078c969750610bae903d805f833e6107fa8183610fe3565b9695610b89565b610bce915060203d602011610831576108238183610fe3565b5f610b41565b919361001b959391936124a8565b5030331415610af4565b6001600160e01b031981160361023257565b34610232576020366003190112610232576104dc610c3f600435610c2181610bec565b5f60408051610c2f81610f71565b8281528260208201520152612038565b600160405191610c4e83610f71565b805460a083901b839003168084529101546001600160a01b0380821660208086019182526001600160f81b031960589490941b84166040968701908152865195841686529151909216918401919091525116918101919091529081906060820190565b3461023257604036600319011261023257602060ff610d00600435610cd581610986565b610cea60243591610ce583610bec565b611ed9565b9063ffffffff60e01b165f5260205260405f2090565b54166040519015158152f35b34610232576020366003190112610232576020610d41600435610d2e81610221565b5f604051610d3b81610f91565b52613335565b60405190610d4e82610f91565b546001600160a01b031690819052604051908152f35b5f91031261023257565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b34610232575f36600319011261023257610dd1610ddf610db0613da7565b604092919251938493600f60f81b855260e0602086015260e0850190610d6e565b908382036040850152610d6e565b4660608301523060808301525f60a083015281810360c083015260206060519182815201906080905f5b818110610e17575050500390f35b8251845285945060209384019390920191600101610e09565b6040366003190112610232576004356001600160401b03811161023257610e5b903690600401610381565b6024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610662575f908152602081905260409020546001600160a01b03169060609060018314159081610efb575b610ed0610ec9826060610ed7940190612006565b8091611d2b565b9030613e8f565b5015610eec57610ee357005b61001b91613eb4565b63f21e646b60e01b5f5260045ffd5b9150610ed7610ed0610ec9610f21610f19610ec96060880188612006565b903489613e44565b9492505050610eb5565b34610232575f36600319011261023257602063ffffffff5f516020615fdf5f395f51905f525460c81c16604051908152f35b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b03821117610f8c57604052565b610f5d565b602081019081106001600160401b03821117610f8c57604052565b604081019081106001600160401b03821117610f8c57604052565b61012081019081106001600160401b03821117610f8c57604052565b90601f801991011681019081106001600160401b03821117610f8c57604052565b60405190610241604083610fe3565b6040519061024161012083610fe3565b6001600160401b038111610f8c5760051b60200190565b6080366003190112610232576004356001600160401b03811161023257611065903690600401610998565b602435916001600160401b038311610232573660238401121561023257826004013561109081611023565b9361109e6040519586610fe3565b8185526024602086019260061b8201019036821161023257602401915b818310611110575050506044356001600160401b038111610232576110e4903690600401610998565b90606435946001600160401b0386116102325761110861001b963690600401610998565b9590946125ad565b604083360312610232576020604091825161112a81610fac565b61113386610684565b81528286013561114281610221565b838201528152019201916110bb565b61115a36610270565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611277575b1561126d576111b06107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f9161124e575b50156106625760405163d68f602560e01b8152936001600160a01b039190911692905f858061120e36343360048501612164565b038183885af19485156107dc575f9561122e575b5061078c93949561277c565b61078c949550611247903d805f833e6107fa8183610fe3565b9493611222565b611267915060203d602011610831576108238183610fe3565b5f6111da565b9161001b9361277c565b503033141561118d565b34610232575f366003190112610232576104dc6040516112a2604082610fe3565b601681527535b2b93732b61730b23b30b731b2b2173b181719971960511b6020820152604051918291602083526020830190610d6e565b34610232575f366003190112610232576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b61132636610270565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611443575b156114395761137c6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f9161141a575b50156106625760405163d68f602560e01b8152936001600160a01b039190911692905f85806113da36343360048501612164565b038183885af19485156107dc575f956113fa575b5061078c939495612ad0565b61078c949550611413903d805f833e6107fa8183610fe3565b94936113ee565b611433915060203d602011610831576108238183610fe3565b5f6113a6565b9161001b93612ad0565b5030331415611359565b34610232575f36600319011261023257602063ffffffff5f516020615fdf5f395f51905f525460a81c16604051908152f35b346102325760203660031901126102325760406114af6004356114a181610986565b6114a9612cfa565b50611ea2565b8151906114bb82610fac565b5463ffffffff81168083526001600160a01b03602092831c81169383019384528451918252925190921690820152f35b8015150361023257565b60603660031901126102325760043561150d81610986565b60243561151981610bec565b604435611525816114eb565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611642575b156116385761157b6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91611619575b50156106625760405163d68f602560e01b8152926001600160a01b039190911691905f84806115d936343360048501612164565b038183875af19384156107dc575f946115f9575b5061078c9293946143db565b61078c939450611612903d805f833e6107fa8183610fe3565b93926115ed565b611632915060203d602011610831576108238183610fe3565b5f6115a5565b9061001b926143db565b5030331415611558565b346102325760a036600319011261023257611668600435610221565b611673602435610221565b6044356001600160401b03811161023257611692903690600401610998565b50506064356001600160401b038111610232576116b3903690600401610998565b50506084356001600160401b038111610232576116d4903690600401610243565b505060405163bc197c8160e01b8152602090f35b602080825282516001600160f01b03191681830152808301516001600160a01b03166040808401919091529092015160608083015280516080830181905260a09092019201905f5b81811061173d5750505090565b82516001600160501b031916845260209384019390920191600101611730565b346102325760203660031901126102325761179c60043561177d81610bec565b60606040805161178c81610f71565b5f81525f6020820152015261206e565b6001604051916117ab83610f71565b805461ffff60f01b8160f01b168452828060a01b039060101c16602084015201906040519182602082549182815201915f5260205f20905f5b81811061180d576104dc85876117fc81880382610fe3565b6040820152604051918291826116e8565b825460501b6001600160501b0319168452602090930192600192830192016117e4565b346102325760203660031901126102325760206102cb600435612d12565b9060406003198301126102325760043591602435906001600160401b038211610232576102ab91600401610243565b6118863661184e565b90916001600160a01b0361189933613335565b54169182156119505760609060018414159485611939575b6118bb9293614661565b92611929575b50506040518091602082016020835281518091526040830190602060408260051b8601019301915f905b8282106118fa57505050500390f35b919360019193955060206119198192603f198a82030186528851610d6e565b96019201920185949391926118eb565b61193291613eb4565b5f806118c1565b6118bb9250611949363487613deb565b92506118b1565b63710c949760e01b5f5260045ffd5b60603660031901126102325760043561197781610986565b6024356001600160401b03811161023257611996903690600401610243565b6044356001600160401b038111610232576119b5903690600401610243565b90337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611ad5575b15611ac957611a0c6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91611aaa575b50156106625760405163d68f602560e01b8152946001600160a01b039190911693905f8680611a6a36343360048501612164565b038183895af19586156107dc575f96611a8a575b5061078c949596612dea565b61078c959650611aa3903d805f833e6107fa8183610fe3565b9594611a7e565b611ac3915060203d602011610831576108238183610fe3565b5f611a36565b91909261001b94612dea565b50303314156119e9565b611ae83661184e565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611c05575b15611bfb57611b3e6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91611bdc575b50156106625760405163d68f602560e01b8152926001600160a01b039190911691905f8480611b9c36343360048501612164565b038183875af19384156107dc575f94611bbc575b5061078c92939461307d565b61078c939450611bd5903d805f833e6107fa8183610fe3565b9392611bb0565b611bf5915060203d602011610831576108238183610fe3565b5f611b68565b9061001b9261307d565b5030331415611b1b565b34610232575f3660031901126102325760205f516020615fdf5f395f51905f525460581b604051906001600160581b0319168152f35b346102325760a036600319011261023257611c61600435610221565b611c6c602435610221565b6084356001600160401b03811161023257611c8b903690600401610243565b505060405163f23a6e6160e01b8152602090f35b346102325760203660031901126102325760206102cb600435613088565b34610232576040366003190112610232576004356001600160401b03811161023257611d04611cf26020923690600401610381565b60243590611cff82610221565b613095565b604051908152f35b906008116102325760040190600490565b906004116102325790600490565b909291928360041161023257831161023257600401916003190190565b906018116102325760040190601490565b906014116102325790601490565b906020116102325790602090565b90929192836020116102325783116102325760200191601f190190565b909291928360011161023257831161023257600101915f190190565b906009116102325760010190600890565b909291928360091161023257831161023257600901916008190190565b906016116102325790601690565b906016116102325760020190601490565b909291928360161161023257831161023257601601916015190190565b906002116102325790600290565b909291928360141161023257831161023257601401916013190190565b90602c116102325760180190601490565b90939293848311610232578411610232578101920390565b356001600160e01b0319811692919060048210611e87575050565b6001600160e01b031960049290920360031b82901b16169150565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85060205260405f2090565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85160205260405f2090565b90929060018103611f5f57506001600160a01b0392611f599250611f49915060581b600160581b600160f81b0316600160f81b17611ea2565b5460201c6001600160a01b031690565b16151590565b60028103611f9357506001600160a01b0392611f5992506107059150611f86908416613335565b546001600160a01b031690565b600303611fd357611fb4611faf610530600193611fc295611d1d565b612038565b01546001600160a01b031690565b6001600160a01b0390811691161490565b5050505f90565b90604051611fe781610fac565b915463ffffffff81168352602090811c6001600160a01b031690830152565b903590601e198136030182121561023257018035906001600160401b0382116102325760200191813603831361023257565b63ffffffff60e01b165f527f7c341349a4360fdd5d5bc07e69f325dc6aaea3eb018b3e0ea7e53cc0bb0d6f3b60205260405f2090565b63ffffffff60e01b165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85260205260405f2090565b9081602091031261023257516120b9816114eb565b90565b6040513d5f823e3d90fd5b6001600160401b038111610f8c57601f01601f191660200190565b602081830312610232578051906001600160401b038211610232570181601f8201121561023257805190612115826120c7565b926121236040519485610fe3565b8284526020838301011161023257815f9260208093018386015e8301015290565b908060209392818452848401375f828201840152601f01601f1916010190565b6120b9939260609260018060a01b03168252602082015281604082015201905f612144565b6120b9949260609260018060a01b0316825260208201528160408201520191612144565b9060206120b9928181520190610d6e565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556001600160a01b03167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2565b60405190612220602083610fe3565b5f8252565b90813b5f612232826120c7565b936122406040519586610fe3565b82855260208501903c565b80516020909101516001600160f01b031981169291906002821061226d575050565b6001600160f01b031960029290920360031b82901b16169150565b5f516020615fdf5f395f51905f52805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b634e487b7160e01b5f52603260045260245ffd5b908210156122e4576102ab9160051b810190612006565b6122b9565b908092918237015f815290565b3d15612320573d90612307826120c7565b916123156040519384610fe3565b82523d5f602084013e565b606090565b94939291909695966001600160581b031961235e6123515f516020615fdf5f395f51905f525460581b90565b6001600160581b03191690565b1615801590612480575b612472576001600160581b03198616156104f2576001600160f81b03198616600160f81b14158061245a575b61244b57856123a56123f297613b20565b6123c66123b0611004565b60018152925b6001600160a01b03166020840152565b5f516020615fdf5f395f51905f52805463ffffffff60a81b1916600160a81b179055613b86565b613b86565b5f5b81811061240057505050565b5f8061240d8385876122cd565b9061241d604051809381936122e9565b039082305af161242b6122f6565b5015612439576001016123f4565b636534eae560e11b5f5260045260245ffd5b6361c4e91b60e11b5f5260045ffd5b506001600160f81b03198616600160f91b1415612394565b62dc149f60e41b5f5260045ffd5b5061ef0160f01b6001600160f01b03196124a161249c30612225565b61224b565b1614612368565b94939291906001600160581b03198616156104f2576001600160f81b03198616600160f81b141580612553575b61244b576124e286613b20565b6001600160a01b036124f6611f4988611ea2565b1615612505575b505050505050565b612548956123ed61252b5f516020615fdf5f395f51905f525463ffffffff9060a81c1690565b926123b66040519461253e604087610fe3565b63ffffffff168552565b5f80808080806124fd565b506001600160f81b03198616600160f91b14156124d5565b9060405161257881610f71565b82546001600160a01b03908116825260019390930154928316602082015260589290921b6001600160f81b0319166040830152565b95909491939092337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580612721575b156127135761260a6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f916126f4575b50156106625760405163d68f602560e01b8152966001600160a01b039190911695905f888061266836343360048501612164565b0381838b5af19788156107dc575f986126d4575b50612688969798613f2d565b803b1561023257604051630b9dfbed60e11b8152915f9183918290849082906126b490600483016121ad565b03925af180156107dc576126c6575b50565b806107d65f61024193610fe3565b6126889798506126ed903d805f833e6107fa8183610fe3565b979661267c565b61270d915060203d602011610831576108238183610fe3565b5f612634565b919390929461024196613f2d565b50303314156125e7565b9160206120b9938181520191612144565b356bffffffffffffffffffffffff1981169291906014821061275c575050565b6bffffffffffffffffffffffff1960149290920360031b82901b16169150565b9091600182036128f8575f516020615f9f5f395f51905f5293906054600160f81b600160581b600160f81b03605887901b1617916127c66127bc84611ea2565b5463ffffffff1690565b5f516020615fdf5f395f51905f525460a81c63ffffffff169063ffffffff8083169116146128e0575b5061285861283161070561282b61282561281e5f516020615fdf5f395f51905f525463ffffffff9060a81c1690565b9886611d59565b9061273c565b60601c90565b61284861283c611004565b63ffffffff9097168752565b6001600160a01b03166020860152565b612883601482019461286a8680612006565b61287a6034869493940189612006565b93909288613b86565b019160046128918483612006565b9050146128bf575b5050505b604080519182526001600160a01b03909216602082015290819081015b0390a1565b61053061052a6128d8946128d293612006565b90614376565b5f8080612899565b6128f29060010163ffffffff16612288565b5f6127ef565b6002820361296057806129555f516020615f9f5f395f51905f5295603461292f61070561282b612825601461295b99019588611d59565b9361294e8561293e8580612006565b906001600160a01b038c166142e5565b0190612006565b91614122565b61289d565b600382036129d657806129555f516020615f9f5f395f51905f529560386129ce61070561282b612825601861295b9901956129c88c8a6129b661070561282b612825876129b06105308288611d1d565b95611d48565b6129c08b80612006565b939092613f9a565b88611d48565b930190612006565b600482148015612a74575b8015612a6a575b15612a5b576001600160a01b03831693843b1561023257612a22945f92836040518098819582946306d61fe760e41b84526004840161272b565b03925af19283156107dc575f516020615f9f5f395f51905f5293612a47575b5061289d565b806107d65f612a5593610fe3565b5f612a41565b631092ef5760e11b5f5260045ffd5b50600682146129e8565b50600582146129e1565b359060208110612a8c575090565b5f199060200360031b1b1690565b929192612aa6826120c7565b91612ab46040519384610fe3565b829481845281830111610232578281602093845f960137010152565b909160018203612b41575f516020615fbf5f395f51905f5293612b1f91612b1991612b10600160f81b600160581b600160f81b03605889901b16176144a9565b505b3691612a9a565b83614509565b50604080519182526001600160a01b03909216602082015290819081016128ba565b60028203612bb1576001600160a01b038381165f9081527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b866020526040902080546001600160a01b031981169091555f516020615fbf5f395f51905f5295612b1f93612b19939092165b50612b12565b919060038103612bd6575050610530612bd292612bcd92611d1d565b614445565b5050565b909160048203612c5f57612b19612b1f915f516020615fbf5f395f51905f5295612c0e5f516020615fdf5f395f51905f525460581b90565b612c1a611f4982611ea2565b6001600160a01b03888116911614612c325750612b12565b612c3e612c5991611ea2565b8054640100000000600160c01b031916640100000000179055565b5f612bab565b600582148015612cf0575b15612a5b575f516020615fdf5f395f51905f525460581b612c94612c8e8684611d67565b90612a7e565b906001600160f81b03198116600160f91b14612cc8575b5050612b19612b1f915f516020615fbf5f395f51905f5295612b12565b60081b6001600160e01b03191614612ce1575f80612cab565b6313002bdd60e31b5f5260045ffd5b5060068214612c6a565b60405190612d0782610fac565b5f6020838281520152565b612d26818060081b918160301b9160501b90565b929091906001600160f81b03198116600160f81b14159081612dd6575b81612dc1575b81612da8575b50611fd35760ff60f81b16600160f81b8114159081612d9e575b50612d98576001600160e01b031916612d93576001600160501b031916612d8f57600190565b5f90565b505f90565b50505f90565b905015155f612d69565b6001600160f81b031916607f60f91b141590505f612d4f565b6001600160f81b031980821614159150612d49565b6001600160f81b0319811615159150612d43565b9094939291612df8826144a9565b916001600160f81b03198116600160f81b03612e70575f516020615fbf5f395f51905f5291612e46612e406102419899612e689460018060a01b039060581c16933691612a9a565b82614509565b5060408051600181526001600160a01b03909216602083015290918291820190565b0390a161490f565b9294919290506001600160f81b03198116600160f91b0361244b5760081b92612e988461206e565b94612ea38780614880565b949050600187019460018654010361306e5794956001600160e01b0319871695905f5b8654811015612f7c57805f516020615fbf5f395f51905f52612f738c612f51612f43612e408e612f318f99612f2b612f1b612f13612f068460019f6148b5565b90549060031b1c60501b90565b908160501c90565b90508c8060a01b03169780614880565b906122cd565b604094919451948593602085016148ca565b03601f198101835282610fe3565b5060408051600581526001600160a01b03909216602083015290918291820190565b0390a101612ec6565b509194509296612ff761300a916130056130699598612fa86001612fa26102419d61206e565b016148df565b8554612fe590612fc39060101c6001600160a01b0316610705565b93612fda612fd18280614880565b91909280614880565b5f19019290506122cd565b604095919551958693602085016148ca565b03601f198101845283610fe3565b614509565b5080545f516020615fbf5f395f51905f5290613056906130359060101c6001600160a01b0316610705565b60408051600681526001600160a01b03909216602083015290918291820190565b0390a180546001600160b01b0319169055565b61490f565b63013dcc8d60e31b5f5260045ffd5b906126c39291614661565b60071115612d8f57600190565b612f439061317f906130b06001600160a01b03823516610705565b906131516020820135612f436130d26130cc6040860186612006565b9061499a565b936130e36130cc6060830183612006565b90608081013560a0820135906131056130cc60c08501359460e0810190612006565b93604051988997602089019b8c94919260e0969399989794919961010087019a60018060a01b03168752602087015260408601526060850152608084015260a083015260c08201520152565b51902060408051602081019283526001600160a01b03909516908501525f6060850152929182906080820190565b51902090565b7f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460408051338152346020820152a1565b6131d26131cd5f356001600160e01b031916612038565b61256b565b80516001600160a01b03906131e8908216610705565b16156133265780516060906001600160a01b0316806002600160a01b031981016133045750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610662575b60408201516001600160f81b031916806132c45750602082015161326b906001600160a01b03166149a5565b92905b156132bc57516001600160a01b031690600182141582816132a8575b50613298575b825160208401f35b6132a191613eb4565b5f80613290565b6001600160a01b039150811614155f61328a565b825160208401fd5b6001600160f81b0319908116036132f55760208201516132ee906001600160a01b03163690613e6a565b929061326e565b632d6a6bb760e01b5f5260045ffd5b600103613312575b5061323f565b613320915036903490613deb565b5f61330c565b631cd4b64760e21b5f5260045ffd5b6001600160a01b03165f9081527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b866020526040902090565b9081602091031261023257516120b981610bec565b9161338c916149e7565b919080836001600160f81b03198416156135ae575b60208110159182613577575b82613561575b50506133c161043184611ea2565b60208101516001600160a01b03906133da908216610705565b16158061354e575b6104f2576001600160f81b0319841615159081613515575b506105f9576001600160f81b03198316600160f81b0361348e5790613426602094939261344496614a39565b604051637aa8f17760e11b8152958694859384933360048601612189565b039160581c6001600160a01b03165afa9081156107dc575f91613465575090565b6120b9915060203d602011613487575b61347f8183610fe3565b81019061336d565b503d613475565b92916001600160f81b03198116600160f91b036134ee5760081b93600160f11b6134d16134c46134bd8861206e565b5460f01b90565b6001600160f01b03191690565b166134df576120b994614b77565b635b71057960e01b5f5260045ffd5b929391929091906001600160f81b03191661244b576120b99361351091614a39565b614a93565b5163ffffffff16905063ffffffff6135456106385f516020615fdf5f395f51905f525463ffffffff9060c81c1690565b9116105f6133fa565b506001600160f81b0319841615156133e2565b8192955061356f9350611d75565b925f806133b3565b91507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a6135a7612c8e8385611d67565b14916133ad565b92506135c85f516020615fdf5f395f51905f525460581b90565b926133a1565b90818060081b9160ff839260f01c166002146135e657565b6001600160d81b031983169150565b9080601f83011215610232578160206120b993359101612a9a565b9190916101208184031261023257613626611013565b9261363082610236565b84526020820135602085015260408201356001600160401b038111610232578161365b9184016135f5565b604085015260608201356001600160401b038111610232578161367f9184016135f5565b60608501526080820135608085015260a082013560a085015260c082013560c085015260e08201356001600160401b03811161023257816136c19184016135f5565b60e08501526101008201356001600160401b038111610232576136e492016135f5565b610100830152565b90816020910312610232575190565b80516001600160a01b031682526120b9916020820151602082015261010061377c61374c61373a60408601516101206040870152610120860190610d6e565b60608601518582036060870152610d6e565b6080850151608085015260a085015160a085015260c085015160c085015260e085015184820360e0860152610d6e565b92015190610100818403910152610d6e565b9392916137ab9060409286526060602087015260608601906136fb565b930152565b9291906137ab6020916040865260408601906136fb565b9290925f926137d63682613610565b916137e5610100830183612006565b918193835f93602082101580613a26575b6139e7575b5050506001600160f81b031916600160f81b145b6139c0575b506001600160f81b03198616600160f81b036138ab575050604051639700320360e01b815293602092859283915f91839161385291600484016137b0565b039260581c6001600160a01b03165af19081156107dc576120b9925f9261387a575b50615053565b61389d91925060203d6020116138a4575b6138958183610fe3565b8101906136ec565b905f613874565b503d61388b565b909491939092916001600160f81b03198116600160f91b0361395c5760081b93600160f01b6138df6134c46134bd8861206e565b1661394d575f6138ff6138f960209661392999858a614e64565b94615053565b604051630ccab7a160e01b8152979096889586948593926001600160e01b0319166004850161378e565b03926001600160a01b03165af19081156107dc576120b9925f9261387a5750615053565b6314b9743f60e01b5f5260045ffd5b919350506001600160f81b03191661244b576139b190630b135d3f60e11b9361351063ffffffff60e01b946020527b19457468657265756d205369676e6564204d6573736167653a0a33325f52603c60042090565b16036139bb575f90565b600190565b916139cd93955086614c2c565b9193916139db368284612a9a565b6101008401525f613814565b9195509250829196506139fa9350611d75565b9091613a07368385612a9a565b61010085015261380f613a1d6001923390613095565b95905f806137fb565b507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a613a55612c8e8484611d67565b146137f6565b5f516020615fdf5f395f51905f5254600a63ffffffff8260a81c16019063ffffffff8211613b0c5763ffffffff83811692168211613afd57613aa59060c81c63ffffffff16610638565b10156105f9575f516020615fdf5f395f51905f52805463ffffffff60c81b60c893841b1663ffffffff60c81b1990911617908190559081901c63ffffffff9081169160a81c168111613af45750565b61024190612288565b63e60fd64760e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b60207f6789ec0c85d6458d897a36a70129b101f8b4d84c6e218046c3107373dbcbae88918060581c6001600160581b0360a81b5f516020615fdf5f395f51905f525416175f516020615fdf5f395f51905f5255604051906001600160581b0319168152a1565b929490939193613b986127bc85611ea2565b5f516020615fdf5f395f51905f525460a81c63ffffffff169063ffffffff808316911614613d8f575b506020810180516001600160a01b031615613d86575b5f516020615fdf5f395f51905f525460a81c63ffffffff1663ffffffff613c05610638855163ffffffff1690565b911614801590613d5a575b6105f957613c5e613c6b92613c2487611ea2565b815181546020938401516001600160c01b031990911663ffffffff9290921691909117921b640100000000600160c01b0316919091179055565b516001600160a01b031690565b915f196001600160a01b03841601613d49575b5050506001600160f81b03198116600160f81b03613d265760581c6001600160a01b031690813b15610232576040516306d61fe760e41b8152925f9184918291613ccc91906004840161272b565b038183855af19081156107dc575f516020615f9f5f395f51905f52926128ba92613d12575060408051600181526001600160a01b03909216602083015290918291820190565b806107d65f613d2093610fe3565b5f612e46565b91506001600160f81b03198216600160f91b0361244b576102419160081b6151a6565b613d5292614122565b5f8080613c7e565b50613d676127bc86611ea2565b63ffffffff613d7d610638855163ffffffff1690565b91161015613c10565b60018152613bd7565b613da19060010163ffffffff16612288565b5f613bc1565b6040908151613db68382610fe3565b600681526512d95c9b995b60d21b602082015291613dd681519182610fe3565b6005815264181719971960d91b602082015290565b91613e12925f8080946040519687958694859363d68f602560e01b85523360048601612189565b03926001600160a01b03165af19081156107dc575f91613e30575090565b6120b991503d805f833e6107fa8183610fe3565b5f9283613e1295936040519687958694859363d68f602560e01b85523360048601612189565b5f9060405192808385378338925af4913d82523d5f602084013e60203d830101604052565b5f9192806040519485378338925af4913d82523d5f602084013e60203d830101604052565b6001600160a01b0316803b1561023257604051630b9dfbed60e11b815260206004820152915f918391829084908290613ef1906024830190610d6e565b03925af180156107dc57613f025750565b5f61024191610fe3565b8051156122e45760200190565b80518210156122e45760209160051b010190565b909593919492965f5b87811015613f8657600190613f808a89613f6c8489613f65828060051b8c013595613f6087610986565b613f19565b51946122cd565b90613f78868d8d6122cd565b949093613b86565b01613f36565b509650505050505050565b90156122e45790565b9293929091906001600160a01b03821615614113575b613fb990612038565b93613fe5613fd8613fca8684613f91565b356001600160f81b03191690565b6001600160f81b03191690565b936001600160f81b031985166140eb576001600160a01b0384169161400c91908190611d92565b823b1561023257614036925f92836040518096819582946306d61fe760e41b84526004840161272b565b03925af19485156107dc5761409a6140ba93600193610241986140d7575b5060408051600381526001600160a01b03881660208201525f516020615f9f5f395f51905f529190a15b82546001600160a01b0319166001600160a01b03909116178255565b0180546001600160a01b0319166001600160a01b03909316929092178255565b805460ff60a01b191660589290921c60ff60a01b16919091179055565b806107d65f6140e593610fe3565b5f614054565b50909390506001600160f81b0319808416036132f55760016140ba9161409a6102419661407e565b6001600160a01b039150613fb0565b6001600160a01b03169190821580156142db575b6142d65760405163d60b347f60e01b8152306004820152602081602481875afa9081156107dc575f916142b7575b506141fb57908061417492611d92565b9190813b15610232576040516306d61fe760e41b8152925f918491829161419f91906004840161272b565b038183855af19081156107dc575f516020615f9f5f395f51905f52926128ba926141e7575b505b60408051600481526001600160a01b03909216602083015290918291820190565b806107d65f6141f593610fe3565b5f6141c4565b81151580614298575b614222575b50506128ba5f516020615f9f5f395f51905f52916141c6565b908061422d92611d92565b9190813b15610232576040516306d61fe760e41b8152925f918491829161425891906004840161272b565b038183855af19081156107dc575f516020615f9f5f395f51905f52926128ba92614284575b5091614209565b806107d65f61429293610fe3565b5f61427d565b506001600160f81b0319806142b0613fca8585613f91565b1614614204565b6142d0915060203d602011610831576108238183610fe3565b5f614164565b505050565b5060018314614136565b926142f0908461549e565b8161433f5750505f80916040518260208201916306d61fe760e41b835261432981612f4360248201604090602081525f60208201520190565b51926001600160a01b03165af1506126c36122f6565b6001600160a01b039092169190823b15610232576126b4925f92836040518096819582946306d61fe760e41b84526004840161272b565b7f9d17cd6d095ac90a655405ab29f30a7ee7e88ef3974c1bf7544bf591043bb71a916060916143a882610cea83611ed9565b600160ff198254161790556040519163ffffffff60e01b1682526001600160581b031916602082015260016040820152a1565b907f9d17cd6d095ac90a655405ab29f30a7ee7e88ef3974c1bf7544bf591043bb71a9260609261440e83610cea83611ed9565b9115159160ff1981541660ff84161790556040519263ffffffff60e01b1683526001600160581b03191660208301526040820152a1565b61444f5f91612038565b80546001600160a01b031981168255600190910180546001600160a01b0390921693916001600160f81b0319605882901b1615614498575b5080546001600160a81b0319169055565b6001600160a01b031692505f614487565b906001600160581b03195f516020615fdf5f395f51905f525460581b166001600160581b0319831614612ce1576144f56001600160a01b036144ea84611ea2565b5460201c1692611ea2565b8054640100000000600160c01b0319169055565b91907f2b82f87bf66300af618a9621d3f221edfab735f5bacb4e004cce1b62375396c3905a905f80604051936145698561455b6020820196638a91b0e360e01b88526020602484018181520190610d6e565b03601f198101875286610fe3565b60405193614578602086610fe3565b828552602085019583908a905f368a375193f1913d90816145bf575b815f9293523e604080516001600160a01b0390951685528115156020860152909390819081016128ba565b5f9150614594565b604080519091906145d88382610fe3565b6001815291601f1901825f5b8281106145f057505050565b8060606020809385010152016145e4565b9061460b82611023565b6146186040519182610fe3565b8281528092614629601f1991611023565b01905f5b82811061463957505050565b80606060208093850101520161462d565b9060406120b9925f81528160208201520190610d6e565b600881901b9291906001600160f81b03198116600160f81b036146f4575090614689916155ca565b90916001600160f81b031981166146a457506120b9916156e2565b6001600160f81b031916600160f81b036146c1576120b991615636565b60405162461bcd60e51b815260206004820152600b60248201526a155b9cdd5c1c1bdc9d195960aa1b6044820152606490fd5b9293926001600160f81b031981166147ac5750906147119161554c565b9161471a6145c7565b956001600160f81b03198116614747575061473493615594565b61473d83613f0c565b526126c382613f0c565b6001600160f81b031916600160f81b036146c1576147649361556d565b61476d84613f0c565b52610241577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76128ba61479f84613f0c565b516040519182918261464a565b909391906001600160f81b0319908116036146c1576147d66147dc916147d06145c7565b95615524565b91613e8f565b6147e885939293613f0c565b526001600160f81b03198116600160f81b0361483357501561480657565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76128ba61479f84613f0c565b6001600160f81b0319166146c1576102415760405162461bcd60e51b815260206004820152601360248201527211195b1959d85d1958d85b1b0819985a5b1959606a1b6044820152606490fd5b903590601e198136030182121561023257018035906001600160401b03821161023257602001918160051b3603831361023257565b80548210156122e4575f5260205f2001905f90565b9092809260209483528483013701015f815290565b8054905f8155816148ee575050565b5f5260205f20908101905b818110614904575050565b5f81556001016148f9565b9091906001600160a01b031680158015614990575b6142d65781156122e4575f516020615fbf5f395f51905f52926128ba926001600160f81b03198235811614614977575b505060408051600481526001600160a01b03909216602083015290918291820190565b612b1281612e409261498894611d92565b505f80614954565b5060018114614924565b816040519182372090565b5f809160405136810160405236838237604051601481016040523360601b90528260143601925af190604051903d82523d5f602084013e60203d830101604052565b9182358060f81c805f14614a2b5780600114614a1e57600214614a08575f80fd5b6001600160d81b03191692600501916004190190565b5092601501916014190190565b505060015f9301915f190190565b60405160208101917f1547321c374afde8a591d972a084b071c594c275e36724931ff96c25f2999c838352604082015260408152614a78606082610fe3565b5190209015614a8a576120b990615854565b6120b990615742565b9190614aa0913691612a9a565b604051916020820191805180604014614b2b57604114614acd5750505050505b638baa579f5f526004601cfd5b80606060409201515f1a60205201516060525b5f52516040526020600160805f825afa51905f6060526040523d614b05575050614ac0565b6001600160a01b03163003614b1f57630b135d3f60e11b90565b6001600160e01b031990565b506040015160ff81901c601b016020526001600160ff1b0316606052614ae0565b90926080926120b99694835260018060a01b0316602083015260408201528160608201520191612144565b614b9065ffffffffffff929594614b9c948733856158c9565b97929491959095615993565b5091164210908115614c1a575b50614c0757602094614bba91614a39565b60405163392dffaf60e01b815295869485938493614be993929133906001600160e01b03191660048701614b4c565b03916001600160a01b03165afa9081156107dc575f91613465575090565b506001600160e01b031995945050505050565b65ffffffffffff91501642115f614ba9565b9190939293601481019160141161023257803560601c92829190614c4e612cfa565b6001600160a01b03909516602086019081529490614cad614c716127bc83611ea2565b5f516020615fdf5f395f51905f525460a81c63ffffffff169063ffffffff808316911603614e125760010163ffffffff165b63ffffffff168352565b815163ffffffff1695516001600160a01b031697614ccb8580612006565b614cd49161499a565b986034850199614ce48b88612006565b614ced9161499a565b906054870199614cfd8b8a612006565b614d069161499a565b604080517fb17ab1224aca0d4255ef8161acaf2ac121b8faa32a4b2258c912cc5f8308c505602082019081526001600160581b03198a169282019290925263ffffffff9390931660608401526001600160a01b0395909516608083015260a082019290925260c081019290925260e0808301919091528152614d8a61010082610fe3565b519020905f1461052a6102ab98614deb60949861294e97614dcc6128d29761053097614e0457614db990615854565b614dc660748d0185612006565b91615c58565b9e614de2614dda8480612006565b929094612006565b9390928a613b86565b614dfe614df8828b612006565b90615dd2565b88612006565b614e0d90615742565b614db9565b614ca3565b356001600160c01b0319811692919060088210614e32575050565b6001600160c01b031960089290920360031b82901b16169150565b6040906120b99392815281602082015201906136fb565b93929190935f926001614e768361206e565b015f5b8154811015614ff757614e92612f13612f0683856148b5565b939095614eb4614eae614ea8613fca8585613f91565b60f81c90565b60ff1690565b808403614fc95750908181614eed614ee1614edb614ed584614f0b98611dae565b90614e17565b60c01c90565b6001600160401b031690565b600901918c610100614f03612b12868686611dbf565b910152611e54565b939093955b600160f01b1615614f28575b50600101939193614e79565b604051633894f6e760e11b81529196906020908390815f81614f588f6001600160e01b03198d1660048401614e4d565b03926001600160a01b03165af19182156107dc575f92614fa9575b506001600160a01b038216614f9557600191614f8e91615053565b9590614f1c565b631f24c1fb60e11b5f52600487905260245ffd5b614fc291925060203d81116138a4576138958183610fe3565b905f614f73565b9196909491831115614fe457630760bdcf60e11b5f5260045ffd5b614fec612211565b6101008b0152614f10565b505091929460ff8061500f614ea8613fca8789613f91565b16036150445761010061502c612b1285615034966120b998611d92565b91015261206e565b5460101c6001600160a01b031690565b63b32eeb6960e01b5f5260045ffd5b908082186001600160a01b031615606083811b838501821b9081149184901b141717600114615083575050600190565b65ffffffffffff60a01b8216916001600160d01b03198082169083168415615103575b65ffffffffffff60a01b841680156150f3575b8581109086180280861895146150e2575b81811190821802189160018060a01b03911716171790565b65ffffffffffff60a01b94506150ca565b5065ffffffffffff60a01b6150b9565b65ffffffffffff60a01b94506150a6565b356001600160501b031981169291906016821061512f575050565b6001600160501b031960169290920360031b82901b16169150565b805468010000000000000000811015610f8c5761516c916001820181556148b5565b819291549060031b9160501c821b9160018060b01b03901b1916179055565b356001600160f01b031981169291906002821061226d575050565b91906151b29080614880565b9260fe84118015615496575b6154875760016151cd8261206e565b0154615474575b5f1984015f5b818110615336575090615299615292838761523261528361526a6134c461526461525e87612ff79e9f8e6152596152b59f8f9061070561282b61282561522461522a9489896122cd565b90611dea565b9a8b9161206e565b805462010000600160b01b03191660109290921b62010000600160b01b0316919091179055565b6122cd565b90611e18565b9061518b565b6152738861206e565b9060f01c61ffff19825416179055565b6001600160a01b0316966122cd565b8091611dfb565b6040519586939092906001600160e01b031916602085016148ca565b803b15610232575f6152db92604051809481926306d61fe760e41b8352600483016121ad565b038183855af19081156107dc575f516020615f9f5f395f51905f52926128ba92615322575b5060408051600681526001600160a01b03909216602083015290918291820190565b806107d65f61533093610fe3565b5f615300565b6153d19061537c60016153488661206e565b0161537661536961536361535d868d8c6122cd565b90611ddc565b90615114565b6001600160501b03191690565b9061514a565b61539661070561070561282b612825615224868d8c6122cd565b6153a4615292838a896122cd565b604051949185916153c3916001600160e01b03198a16602085016148ca565b03601f198101855284610fe3565b803b15610232576040516306d61fe760e41b8152925f9184918290849082906153fd90600483016121ad565b03925af19182156107dc57600192615460575b505f516020615f9f5f395f51905f5261545761543661282b612825615224868d8c6122cd565b60408051600581526001600160a01b03909216602083015290918291820190565b0390a1016151da565b806107d65f61546e93610fe3565b5f615410565b6154826001612fa28361206e565b6151d4565b63b62d956d60e01b5f5260045ffd5b5083156151be565b5f516020615f9f5f395f51905f52916040916001600160a01b0382161561551b575b6001600160a01b039081165f8181527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b8660205284902080546001600160a01b03191693909216929092179055815190600282526020820152a1565b600191506154c0565b91601382111561553f57823560601c92601401916013190190565b63ba597e7e5f526004601cfd5b90603381111561553f57813560601c92601483013592603401916033190190565b905f928491604051958692833738935af1913d82523d5f602084013e60203d830101604052565b90925f92819594604051968792833738935af1156155c1573d82523d5f602084013e60203d830101604052565b503d5f823e3d90fd5b918235826020118160401c1761553f5783016020810193813593846155ee57505050565b01601f190190835b5f190160208160051b8301013580830160608101908135809101918680602080860135809601011191111792171760401c1761553f57806155f657505050565b919061564181614601565b925f5b82811061565057505050565b8061567a60019260051b84013584016040810135810190602082359201906020810135903561556d565b6156848389613f19565b5215615691575b01615644565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76156da6156bf8389613f19565b51604051918291858352604060208401526040830190610d6e565b0390a161568b565b91906156ed81614601565b925f5b8281106156fc57505050565b8061572660019260051b840135840160408101358101906020823592019060208101359035615594565b6157308288613f19565b5261573b8187613f19565b50016156f0565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f0000000000000000000000000000000000000000000000000000000000000000461416156157cd575b6719010000000000005f52601a52603a526042601820905f603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f00000000000000000000000000000000000000000000000000000000000000006040820152466060820152306080820152206157b0565b60a061585e613da7565b90602081519101209060208151910120604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8352602083015260408201525f6060820152306080820152206719010000000000005f52601a52603a526042601820905f603a52565b9491848461594a9296959396604051906158e282610fc7565b5f82525f602083015260408201995f8b52615944606084019a8b925f84525f60808701525f60a0870152606060c087015261593560e08701915f83526101008801955f87529063ffffffff60e01b169052565b6001600160a01b039091169052565b526159ea565b60ff8061595d614ea8613fca8786613f91565b160361504457615034615977846159879561598c94611d92565b9490955163ffffffff60e01b1690565b61206e565b9351929190565b8065ffffffffffff8260a01c169182156001146159b1575b60d01c92565b65ffffffffffff92506159ab565b90926080926120b99594835260018060a01b0316602083015260408201528160608201520190610d6e565b9160608301906001615a3f615a06845163ffffffff60e01b1690565b6001600160e01b0319165f9081527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f8526020526040902090565b01805493905f5b858110615a565750505050505050565b615a66612f13612f0683856148b5565b6001600160a01b031660a0890190815260808901949091615a8f906001600160f01b0319168652565b615aa9615aa2614ea8613fca8985613f91565b60ff168a52565b615ab7614eae8a5160ff1690565b808403615c265750858181615adc614ee1614edb614ed5615b319b9c615b0498611dae565b8c60c0615af7612b1260208401948086526009018688611dbf565b9101525160090191611e54565b949094955b51600160f11b90615b23906001600160f01b0319166134c4565b166001600160f01b03191690565b15615b40575b50600101615a46565b51615b53906001600160a01b0316610705565b6020615b79615b6c615b6c895163ffffffff60e01b1690565b6001600160e01b03191690565b60e08a01516101008b015160c08c015160405163184dfdbb60e11b8152958694909385938493615bb89390926001600160a01b031690600486016159bf565b03915afa9081156107dc575f91615c08575b506001600160a01b038116615bf45790600191615bec60408a01918251615053565b905290615b37565b631f24c1fb60e11b5f52600482905260245ffd5b615c20915060203d81116138a4576138958183610fe3565b5f615bca565b909490831115615c3f57630760bdcf60e11b5f5260045ffd5b615b3190615c4e365f88612a9a565b60c08b0152615b09565b5f516020615fdf5f395f51905f52545f9493929060581b6001600160f81b03198116600160f81b03615d135791615cb89391615c9961070560209560581c90565b9160405195869485938493637aa8f17760e11b85523060048601612189565b03915afa9081156107dc575f91615cf4575b505b6001600160e01b0319166374eca2c160e11b01615ce557565b6362467c7760e11b5f5260045ffd5b615d0d915060203d6020116134875761347f8183610fe3565b5f615cca565b90949192916001600160f81b03198216600160f91b03615db45750602091615d419160081b958430886158c9565b60405163392dffaf60e01b81529297929586949385938493615d7493909230906001600160e01b03191660048701614b4c565b03916001600160a01b03165afa9081156107dc575f91615d95575b50615ccc565b615dae915060203d6020116134875761347f8183610fe3565b5f615d8f565b94906001600160f81b03191661244b57615dcd92614a93565b615ccc565b615ddf6105308383611d1d565b91602c8110615f8257602c820190615e0061070561282b6128258487611d48565b615e2a615e1c613fd8613fca615e168780612006565b90613f91565b6001600160f81b0319161590565b80615edd575b61070561282b61282585615e856102419a87615e6961070561282b6128258f9d6129559f9e8f604c9f6129ce9f615e8b575b5050611e43565b615e738b80612006565b9390926001600160a01b031690613f9a565b88611e43565b612955615ecf615ed693606c860190615eca615eb961070561282b612825615eb38787612006565b90611d59565b9586906001600160a01b031661549e565b612006565b8091611e26565b8f87615e62565b5060405163ecd0596160e01b81526002600482015290949291906020816024816001600160a01b038a165afa9384156107dc5761282b61282584615e85610705948b615e6961070561282b6102419f8f9c6129559f9d8f604c9f936129ce9f94612825955f91615f63575b509f50505050505050505097509a5050959650505050615e30565b615f7c915060203d602011610831576108238183610fe3565b5f615f48565b90506004915003615f8f57565b637a210a5d60e11b5f5260045ffdfed21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x127", "chainId": "0xaa36a7" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0xa6dcb7aa5bb9f6b4ac81d9b57713014e394187d96198afdd8b87710e075bdfe9", + "hash": "0x38ab00720fd3d1ab2ba17366d9df8e3f8662a4625382eda6b56e5280bc8a7cb7", "transactionType": "CREATE2", "contractName": "KernelFactory", - "contractAddress": "0x7a1dbab750f12a90eb1b60d2ae3ad17d4d81effe", + "contractAddress": "0xe30c76dc9ecf1c19f6fec070674e1b4effe069fa", "function": null, "arguments": [ - "0xD830D15D3dc0C269F3dBAa0F3e8626d33CFdaBe1" + "0xE264dCCc54e4b6906c0D1Fee11D4326c06D33c80" ], "transaction": { "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", "gas": "0x5d17a", "value": "0x0", - "input": "0x000000000000000000000000000000000000000000000000000000000000000060a034607357601f61044238819003918201601f19168301916001600160401b03831184841017607757808492602094604052833981010312607357516001600160a01b03811681036073576080526040516103b6908161008c823960805181818160c60152818161021d01526102d80152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816348aac39214610250575080635c60da1b146102085763ea6d13ac1461003d575f80fd5b6100463661033f565b60405161006c602080838181019587898837878201908382015203018084520182610394565b519020905f92604051927fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f60212060358501523060581b845260ff84538060158501526055842094341591863b156101eb5750506001906101e6575f38818034895af1156101d9575b836040525f60605215610157575b6040516001600160a01b0385168152602090f35b9180825f9493859483378101838152039082855af13d156101d4573d67ffffffffffffffff81116101c0576040519061019a601f8201601f191660200183610394565b81525f60203d92013e5b156101b1575f8080610143565b63487e630960e11b5f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b6101a4565b63b12d13eb5f526004601cfd5b610135565b91509450605f602134f593846101355763301164255f526004601cfd5b3461024c575f36600319011261024c576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b3461024c57806102826020806102653661033f565b908084889499019889378201908382015203018084520182610394565b5190206040517fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f602120906040525f60605260ff5f536035523060601b600152601552602060555f205f6035526040519060018060a01b03168152f35b90604060031983011261024c5760043567ffffffffffffffff811161024c578260238201121561024c5780600401359267ffffffffffffffff841161024c576024848301011161024c57602401919060243590565b90601f8019910116810190811067ffffffffffffffff8211176101c05760405256000000000000000000000000d830d15d3dc0c269f3dbaa0f3e8626d33cfdabe1", - "nonce": "0xe9", + "input": "0x000000000000000000000000000000000000000000000000000000000000000060a034607357601f61044238819003918201601f19168301916001600160401b03831184841017607757808492602094604052833981010312607357516001600160a01b03811681036073576080526040516103b6908161008c823960805181818160c60152818161021d01526102d80152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816348aac39214610250575080635c60da1b146102085763ea6d13ac1461003d575f80fd5b6100463661033f565b60405161006c602080838181019587898837878201908382015203018084520182610394565b519020905f92604051927fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f60212060358501523060581b845260ff84538060158501526055842094341591863b156101eb5750506001906101e6575f38818034895af1156101d9575b836040525f60605215610157575b6040516001600160a01b0385168152602090f35b9180825f9493859483378101838152039082855af13d156101d4573d67ffffffffffffffff81116101c0576040519061019a601f8201601f191660200183610394565b81525f60203d92013e5b156101b1575f8080610143565b63487e630960e11b5f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b6101a4565b63b12d13eb5f526004601cfd5b610135565b91509450605f602134f593846101355763301164255f526004601cfd5b3461024c575f36600319011261024c576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b3461024c57806102826020806102653661033f565b908084889499019889378201908382015203018084520182610394565b5190206040517fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f602120906040525f60605260ff5f536035523060601b600152601552602060555f205f6035526040519060018060a01b03168152f35b90604060031983011261024c5760043567ffffffffffffffff811161024c578260238201121561024c5780600401359267ffffffffffffffff841161024c576024848301011161024c57602401919060243590565b90601f8019910116810190811067ffffffffffffffff8211176101c05760405256000000000000000000000000e264dccc54e4b6906c0d1fee11d4326c06d33c80", + "nonce": "0x128", "chainId": "0xaa36a7" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x38643c5b23787d908c62e32c302cf1b6b34207af19e90d508811a4ab42e565cf", + "hash": "0x5aed2b4fdb8f1590f077009d701c5efa0bfa78996fde17e5149f259bc6536fa9", "transactionType": "CALL", "contractName": "FactoryStaker", "contractAddress": "0xd703aae79538628d27099b8c4f621be4ccd142d5", "function": "approveFactory(address,bool)", "arguments": [ - "0x7a1dBAB750f12a90EB1B60D2Ae3aD17D4D81EfFe", + "0xE30c76Dc9eCF1c19F6Fec070674E1b4eFfE069FA", "true" ], "transaction": { @@ -57,8 +57,8 @@ "to": "0xd703aae79538628d27099b8c4f621be4ccd142d5", "gas": "0x108d1", "value": "0x0", - "input": "0x6e7dbabb0000000000000000000000007a1dbab750f12a90eb1b60d2ae3ad17d4d81effe0000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0xea", + "input": "0x6e7dbabb000000000000000000000000e30c76dc9ecf1c19f6fec070674e1b4effe069fa0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x129", "chainId": "0xaa36a7" }, "additionalContracts": [], @@ -68,48 +68,48 @@ "receipts": [ { "status": "0x1", - "cumulativeGasUsed": "0x1ed4931", + "cumulativeGasUsed": "0x110e5d6", "logs": [], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0xe04a1ae67377ff45975933b4dee7b41a4c8de161b1e53b0f2aaa5db1b7117b44", - "transactionIndex": "0x136", - "blockHash": "0x50ede33c5fb46d966f0b18314740be22805bade7a1b6814d40e7205809bcc1a6", - "blockNumber": "0x6ec1ec", - "gasUsed": "0x4f2032", - "effectiveGasPrice": "0x1ff2d899e", + "transactionHash": "0x53efa638c1459295f1420a5d3c513817b0059fe455cfb6efd57e9f43393ec813", + "transactionIndex": "0xb8", + "blockHash": "0xef37eb99995e743934f8b219a6c9c5c7bee1f3f5b63c69e5de6e8f6858f7b626", + "blockNumber": "0x76c627", + "gasUsed": "0x52786c", + "effectiveGasPrice": "0x92954692", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "contractAddress": "0xd830d15d3dc0c269f3dbaa0f3e8626d33cfdabe1" + "contractAddress": "0xe264dccc54e4b6906c0d1fee11d4326c06d33c80" }, { "status": "0x1", - "cumulativeGasUsed": "0x1f143a4", + "cumulativeGasUsed": "0x114e049", "logs": [], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0xa6dcb7aa5bb9f6b4ac81d9b57713014e394187d96198afdd8b87710e075bdfe9", - "transactionIndex": "0x137", - "blockHash": "0x50ede33c5fb46d966f0b18314740be22805bade7a1b6814d40e7205809bcc1a6", - "blockNumber": "0x6ec1ec", + "transactionHash": "0x38ab00720fd3d1ab2ba17366d9df8e3f8662a4625382eda6b56e5280bc8a7cb7", + "transactionIndex": "0xb9", + "blockHash": "0xef37eb99995e743934f8b219a6c9c5c7bee1f3f5b63c69e5de6e8f6858f7b626", + "blockNumber": "0x76c627", "gasUsed": "0x3fa73", - "effectiveGasPrice": "0x1ff2d899e", + "effectiveGasPrice": "0x92954692", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "contractAddress": "0x7a1dbab750f12a90eb1b60d2ae3ad17d4d81effe" + "contractAddress": "0xe30c76dc9ecf1c19f6fec070674e1b4effe069fa" }, { "status": "0x1", - "cumulativeGasUsed": "0x1f1f8b7", + "cumulativeGasUsed": "0x115955c", "logs": [], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0x38643c5b23787d908c62e32c302cf1b6b34207af19e90d508811a4ab42e565cf", - "transactionIndex": "0x138", - "blockHash": "0x50ede33c5fb46d966f0b18314740be22805bade7a1b6814d40e7205809bcc1a6", - "blockNumber": "0x6ec1ec", + "transactionHash": "0x5aed2b4fdb8f1590f077009d701c5efa0bfa78996fde17e5149f259bc6536fa9", + "transactionIndex": "0xba", + "blockHash": "0xef37eb99995e743934f8b219a6c9c5c7bee1f3f5b63c69e5de6e8f6858f7b626", + "blockNumber": "0x76c627", "gasUsed": "0xb513", - "effectiveGasPrice": "0x1ff2d899e", + "effectiveGasPrice": "0x92954692", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0xd703aae79538628d27099b8c4f621be4ccd142d5", "contractAddress": null @@ -118,7 +118,7 @@ "libraries": [], "pending": [], "returns": {}, - "timestamp": 1733940034, + "timestamp": 1740503073, "chain": 11155111, - "commit": "0ff92c6" + "commit": "9ebc75c" } \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/17000/run-latest.json b/broadcast/DeployKernel.s.sol/17000/run-latest.json new file mode 100644 index 00000000..49352eb4 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/17000/run-latest.json @@ -0,0 +1,79 @@ +{ + "transactions": [ + { + "hash": "0x545369c18b2b063b0f541dba3cdb0f012137d734537a36cc22994eec4a3091c8", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xe264dccc54e4b6906c0d1fee11d4326c06d33c80", + "function": null, + "arguments": [ + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x71e987", + "value": "0x0", + "input": "0x0000000000000000000000000000000000000000000000000000000000000000610140806040523461020a576020816162458038038091610020828561020e565b83398101031261020a57516001600160a01b038116810361020a57306080524660a05260a060405161005360408261020e565b6006815260208101906512d95c9b995b60d21b82526040519161007760408461020e565b60058352602083019164181719971960d91b8352519020915190208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260208301526040820152466060820152306080820152206101005261012052604051602081019063deadbeef60e01b82526004815261010160248261020e565b5190516001600160581b031981169190601582106101ea575b7f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f80546001600160a81b031916605885901c179055604051615fff9081610246823960805181615765015260a05181615788015260c051816157f8015260e0518161581e015261010051816157440152610120518181816103c4015281816106ac0152818161086601528181610ac401528181610e600152818161115d015281816112ee0152818161132901528181611528015281816119b901528181611aeb015281816125b701526132100152f35b6001600160581b031960159290920360031b82901b161690505f8061011a565b5f80fd5b601f909101601f19168101906001600160401b0382119082101761023157604052565b634e487b7160e01b5f52604160045260245ffdfe6080604052600436101561001d575b366131b65761001b613185565b005b5f3560e01c8063112d3a7d1461021c578063150b7a02146102175780631626ba7e1461021257806319822f7c1461020d5780631f1b92e3146102085780633659cfe6146102035780633c3b752b146101fe57806352141cd9146101f957806357b3a5f4146101f45780636e6fa0c6146101ef578063721e67f4146101ea57806384b0196e146101e55780638dd7712f146101e057806390ef8862146101db5780639198bdf5146101d65780639517e29f146101d15780639cfd7cff146101cc578063a65d69d4146101c7578063a71763a8146101c2578063adb610a3146101bd578063b8afe17d146101b8578063b9b82941146101b3578063bc197c81146101ae578063c3e58978146101a9578063d03c7914146101a4578063d691c9641461019f578063e6f3d50a1461019a578063e9ae5c5314610195578063f1f7f0f914610190578063f23a6e611461018b578063f2dc691d146101865763fc9c5dec0361000e57611cbd565b611c9f565b611c45565b611c0f565b611adf565b61195f565b61187d565b611830565b61175d565b61164c565b6114f5565b61147f565b61144d565b61131d565b6112d9565b611281565b611151565b61103a565b610f2b565b610e30565b610d92565b610d0c565b610cb1565b610bfe565b610a5e565b6109c8565b61084b565b610695565b610390565b61032f565b6102d5565b6102af565b6001600160a01b0381160361023257565b5f80fd5b359061024182610221565b565b9181601f84011215610232578235916001600160401b038311610232576020838186019501011161023257565b6060600319820112610232576004359160243561028c81610221565b91604435906001600160401b038211610232576102ab91600401610243565b9091565b346102325760206102cb6102c236610270565b92919091611f10565b6040519015158152f35b34610232576080366003190112610232576102f1600435610221565b6102fc602435610221565b6064356001600160401b0381116102325761031b903690600401610243565b5050604051630a85bd0160e11b8152602090f35b34610232576040366003190112610232576004356024356001600160401b0381116102325760209161036861036e923690600401610243565b91613382565b6040516001600160e01b03199091168152f35b90816101209103126102325790565b6060366003190112610232576004356001600160401b038111610232576103bb903690600401610381565b602435604435917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610662576103ff60208201356135ce565b9092919084836001600160f81b0319861615610649575b8261042193946137c7565b9361044661043661043184611ea2565b611fda565b946001600160f81b031916151590565b938480610608575b6105f957602001516001600160a01b0316801591819083806105f2575b6104f2576001926104866104a5925f525f60205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b149081156105ea575b501561055d5782610501575b50506104f257816104dc925b6104e0575b506040519081529081906020820190565b0390f35b3490349034903490335af1505f6104cb565b631a0a9b9f60e21b5f5260045ffd5b61055692506105529161053661053061052a61051f61054b95611ed9565b936060810190612006565b90611d1d565b90611e6c565b63ffffffff60e01b165f5260205260405f2090565b5460ff1690565b1590565b5f806104ba565b829192916105b7575b506104f25761052a81606061057c930190612006565b638dd7712f60e01b916001600160e01b03199161059891611e6c565b16036105a857816104dc926104c6565b63dbbb044b60e01b5f5260045ffd5b6105e4915061054b6105cb61055292611ed9565b6105366105306105de6060880188612006565b90611d0c565b5f610566565b90505f6104ae565b508661046b565b633ab3447f60e11b5f5260045ffd5b50805163ffffffff1663ffffffff6106416106385f516020615fdf5f395f51905f525463ffffffff9060c81c1690565b63ffffffff1690565b91161061044e565b5f516020615fdf5f395f51905f525460581b9250610416565b6348f5c3ed60e01b5f5260045ffd5b6004359063ffffffff8216820361023257565b359063ffffffff8216820361023257565b6020366003190112610232576106a9610671565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610841575b15610838576107116107056106ff5f516020615fdf5f395f51905f525460581b90565b60581c90565b6001600160a01b031690565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91610809575b50156106625760405163d68f602560e01b8152916001600160a01b0391909116905f838061076e36343360048501612164565b038183865af19283156107dc575f936107e1575b5061078c90613a5b565b803b1561023257604051630b9dfbed60e11b8152915f9183918290849082906107b890600483016121ad565b03925af180156107dc576107c857005b806107d65f61001b93610fe3565b80610d64565b6120bc565b61078c919350610802903d805f833e6107fa8183610fe3565b8101906120e2565b9290610782565b61082b915060203d602011610831575b6108238183610fe3565b8101906120a4565b5f61073b565b503d610819565b61001b90613a5b565b50303314156106dc565b60203660031901126102325760043561086381610221565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061097c575b15610973576108b96107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91610954575b50156106625760405163d68f602560e01b8152916001600160a01b0391909116905f838061091636343360048501612164565b038183865af19283156107dc575f93610934575b5061078c906121be565b61078c91935061094d903d805f833e6107fa8183610fe3565b929061092a565b61096d915060203d602011610831576108238183610fe3565b5f6108e3565b61001b906121be565b5030331415610896565b6001600160581b031981160361023257565b9181601f84011215610232578235916001600160401b038311610232576020808501948460051b01011161023257565b346102325760a0366003190112610232576004356109e581610986565b6024356109f181610221565b6044356001600160401b03811161023257610a10903690600401610243565b6064939193356001600160401b03811161023257610a32903690600401610243565b91608435956001600160401b03871161023257610a5661001b973690600401610998565b969095612325565b608036600319011261023257600435610a7681610986565b602435610a8281610221565b6044356001600160401b03811161023257610aa1903690600401610243565b6064356001600160401b03811161023257610ac0903690600401610243565b91337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610be2575b15610bd457610b176107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91610bb5575b50156106625760405163d68f602560e01b8152956001600160a01b039190911694905f8780610b7536343360048501612164565b0381838a5af19687156107dc575f97610b95575b5061078c9596976124a8565b61078c969750610bae903d805f833e6107fa8183610fe3565b9695610b89565b610bce915060203d602011610831576108238183610fe3565b5f610b41565b919361001b959391936124a8565b5030331415610af4565b6001600160e01b031981160361023257565b34610232576020366003190112610232576104dc610c3f600435610c2181610bec565b5f60408051610c2f81610f71565b8281528260208201520152612038565b600160405191610c4e83610f71565b805460a083901b839003168084529101546001600160a01b0380821660208086019182526001600160f81b031960589490941b84166040968701908152865195841686529151909216918401919091525116918101919091529081906060820190565b3461023257604036600319011261023257602060ff610d00600435610cd581610986565b610cea60243591610ce583610bec565b611ed9565b9063ffffffff60e01b165f5260205260405f2090565b54166040519015158152f35b34610232576020366003190112610232576020610d41600435610d2e81610221565b5f604051610d3b81610f91565b52613335565b60405190610d4e82610f91565b546001600160a01b031690819052604051908152f35b5f91031261023257565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b34610232575f36600319011261023257610dd1610ddf610db0613da7565b604092919251938493600f60f81b855260e0602086015260e0850190610d6e565b908382036040850152610d6e565b4660608301523060808301525f60a083015281810360c083015260206060519182815201906080905f5b818110610e17575050500390f35b8251845285945060209384019390920191600101610e09565b6040366003190112610232576004356001600160401b03811161023257610e5b903690600401610381565b6024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610662575f908152602081905260409020546001600160a01b03169060609060018314159081610efb575b610ed0610ec9826060610ed7940190612006565b8091611d2b565b9030613e8f565b5015610eec57610ee357005b61001b91613eb4565b63f21e646b60e01b5f5260045ffd5b9150610ed7610ed0610ec9610f21610f19610ec96060880188612006565b903489613e44565b9492505050610eb5565b34610232575f36600319011261023257602063ffffffff5f516020615fdf5f395f51905f525460c81c16604051908152f35b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b03821117610f8c57604052565b610f5d565b602081019081106001600160401b03821117610f8c57604052565b604081019081106001600160401b03821117610f8c57604052565b61012081019081106001600160401b03821117610f8c57604052565b90601f801991011681019081106001600160401b03821117610f8c57604052565b60405190610241604083610fe3565b6040519061024161012083610fe3565b6001600160401b038111610f8c5760051b60200190565b6080366003190112610232576004356001600160401b03811161023257611065903690600401610998565b602435916001600160401b038311610232573660238401121561023257826004013561109081611023565b9361109e6040519586610fe3565b8185526024602086019260061b8201019036821161023257602401915b818310611110575050506044356001600160401b038111610232576110e4903690600401610998565b90606435946001600160401b0386116102325761110861001b963690600401610998565b9590946125ad565b604083360312610232576020604091825161112a81610fac565b61113386610684565b81528286013561114281610221565b838201528152019201916110bb565b61115a36610270565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611277575b1561126d576111b06107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f9161124e575b50156106625760405163d68f602560e01b8152936001600160a01b039190911692905f858061120e36343360048501612164565b038183885af19485156107dc575f9561122e575b5061078c93949561277c565b61078c949550611247903d805f833e6107fa8183610fe3565b9493611222565b611267915060203d602011610831576108238183610fe3565b5f6111da565b9161001b9361277c565b503033141561118d565b34610232575f366003190112610232576104dc6040516112a2604082610fe3565b601681527535b2b93732b61730b23b30b731b2b2173b181719971960511b6020820152604051918291602083526020830190610d6e565b34610232575f366003190112610232576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b61132636610270565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611443575b156114395761137c6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f9161141a575b50156106625760405163d68f602560e01b8152936001600160a01b039190911692905f85806113da36343360048501612164565b038183885af19485156107dc575f956113fa575b5061078c939495612ad0565b61078c949550611413903d805f833e6107fa8183610fe3565b94936113ee565b611433915060203d602011610831576108238183610fe3565b5f6113a6565b9161001b93612ad0565b5030331415611359565b34610232575f36600319011261023257602063ffffffff5f516020615fdf5f395f51905f525460a81c16604051908152f35b346102325760203660031901126102325760406114af6004356114a181610986565b6114a9612cfa565b50611ea2565b8151906114bb82610fac565b5463ffffffff81168083526001600160a01b03602092831c81169383019384528451918252925190921690820152f35b8015150361023257565b60603660031901126102325760043561150d81610986565b60243561151981610bec565b604435611525816114eb565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611642575b156116385761157b6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91611619575b50156106625760405163d68f602560e01b8152926001600160a01b039190911691905f84806115d936343360048501612164565b038183875af19384156107dc575f946115f9575b5061078c9293946143db565b61078c939450611612903d805f833e6107fa8183610fe3565b93926115ed565b611632915060203d602011610831576108238183610fe3565b5f6115a5565b9061001b926143db565b5030331415611558565b346102325760a036600319011261023257611668600435610221565b611673602435610221565b6044356001600160401b03811161023257611692903690600401610998565b50506064356001600160401b038111610232576116b3903690600401610998565b50506084356001600160401b038111610232576116d4903690600401610243565b505060405163bc197c8160e01b8152602090f35b602080825282516001600160f01b03191681830152808301516001600160a01b03166040808401919091529092015160608083015280516080830181905260a09092019201905f5b81811061173d5750505090565b82516001600160501b031916845260209384019390920191600101611730565b346102325760203660031901126102325761179c60043561177d81610bec565b60606040805161178c81610f71565b5f81525f6020820152015261206e565b6001604051916117ab83610f71565b805461ffff60f01b8160f01b168452828060a01b039060101c16602084015201906040519182602082549182815201915f5260205f20905f5b81811061180d576104dc85876117fc81880382610fe3565b6040820152604051918291826116e8565b825460501b6001600160501b0319168452602090930192600192830192016117e4565b346102325760203660031901126102325760206102cb600435612d12565b9060406003198301126102325760043591602435906001600160401b038211610232576102ab91600401610243565b6118863661184e565b90916001600160a01b0361189933613335565b54169182156119505760609060018414159485611939575b6118bb9293614661565b92611929575b50506040518091602082016020835281518091526040830190602060408260051b8601019301915f905b8282106118fa57505050500390f35b919360019193955060206119198192603f198a82030186528851610d6e565b96019201920185949391926118eb565b61193291613eb4565b5f806118c1565b6118bb9250611949363487613deb565b92506118b1565b63710c949760e01b5f5260045ffd5b60603660031901126102325760043561197781610986565b6024356001600160401b03811161023257611996903690600401610243565b6044356001600160401b038111610232576119b5903690600401610243565b90337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611ad5575b15611ac957611a0c6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91611aaa575b50156106625760405163d68f602560e01b8152946001600160a01b039190911693905f8680611a6a36343360048501612164565b038183895af19586156107dc575f96611a8a575b5061078c949596612dea565b61078c959650611aa3903d805f833e6107fa8183610fe3565b9594611a7e565b611ac3915060203d602011610831576108238183610fe3565b5f611a36565b91909261001b94612dea565b50303314156119e9565b611ae83661184e565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611c05575b15611bfb57611b3e6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91611bdc575b50156106625760405163d68f602560e01b8152926001600160a01b039190911691905f8480611b9c36343360048501612164565b038183875af19384156107dc575f94611bbc575b5061078c92939461307d565b61078c939450611bd5903d805f833e6107fa8183610fe3565b9392611bb0565b611bf5915060203d602011610831576108238183610fe3565b5f611b68565b9061001b9261307d565b5030331415611b1b565b34610232575f3660031901126102325760205f516020615fdf5f395f51905f525460581b604051906001600160581b0319168152f35b346102325760a036600319011261023257611c61600435610221565b611c6c602435610221565b6084356001600160401b03811161023257611c8b903690600401610243565b505060405163f23a6e6160e01b8152602090f35b346102325760203660031901126102325760206102cb600435613088565b34610232576040366003190112610232576004356001600160401b03811161023257611d04611cf26020923690600401610381565b60243590611cff82610221565b613095565b604051908152f35b906008116102325760040190600490565b906004116102325790600490565b909291928360041161023257831161023257600401916003190190565b906018116102325760040190601490565b906014116102325790601490565b906020116102325790602090565b90929192836020116102325783116102325760200191601f190190565b909291928360011161023257831161023257600101915f190190565b906009116102325760010190600890565b909291928360091161023257831161023257600901916008190190565b906016116102325790601690565b906016116102325760020190601490565b909291928360161161023257831161023257601601916015190190565b906002116102325790600290565b909291928360141161023257831161023257601401916013190190565b90602c116102325760180190601490565b90939293848311610232578411610232578101920390565b356001600160e01b0319811692919060048210611e87575050565b6001600160e01b031960049290920360031b82901b16169150565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85060205260405f2090565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85160205260405f2090565b90929060018103611f5f57506001600160a01b0392611f599250611f49915060581b600160581b600160f81b0316600160f81b17611ea2565b5460201c6001600160a01b031690565b16151590565b60028103611f9357506001600160a01b0392611f5992506107059150611f86908416613335565b546001600160a01b031690565b600303611fd357611fb4611faf610530600193611fc295611d1d565b612038565b01546001600160a01b031690565b6001600160a01b0390811691161490565b5050505f90565b90604051611fe781610fac565b915463ffffffff81168352602090811c6001600160a01b031690830152565b903590601e198136030182121561023257018035906001600160401b0382116102325760200191813603831361023257565b63ffffffff60e01b165f527f7c341349a4360fdd5d5bc07e69f325dc6aaea3eb018b3e0ea7e53cc0bb0d6f3b60205260405f2090565b63ffffffff60e01b165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85260205260405f2090565b9081602091031261023257516120b9816114eb565b90565b6040513d5f823e3d90fd5b6001600160401b038111610f8c57601f01601f191660200190565b602081830312610232578051906001600160401b038211610232570181601f8201121561023257805190612115826120c7565b926121236040519485610fe3565b8284526020838301011161023257815f9260208093018386015e8301015290565b908060209392818452848401375f828201840152601f01601f1916010190565b6120b9939260609260018060a01b03168252602082015281604082015201905f612144565b6120b9949260609260018060a01b0316825260208201528160408201520191612144565b9060206120b9928181520190610d6e565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556001600160a01b03167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2565b60405190612220602083610fe3565b5f8252565b90813b5f612232826120c7565b936122406040519586610fe3565b82855260208501903c565b80516020909101516001600160f01b031981169291906002821061226d575050565b6001600160f01b031960029290920360031b82901b16169150565b5f516020615fdf5f395f51905f52805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b634e487b7160e01b5f52603260045260245ffd5b908210156122e4576102ab9160051b810190612006565b6122b9565b908092918237015f815290565b3d15612320573d90612307826120c7565b916123156040519384610fe3565b82523d5f602084013e565b606090565b94939291909695966001600160581b031961235e6123515f516020615fdf5f395f51905f525460581b90565b6001600160581b03191690565b1615801590612480575b612472576001600160581b03198616156104f2576001600160f81b03198616600160f81b14158061245a575b61244b57856123a56123f297613b20565b6123c66123b0611004565b60018152925b6001600160a01b03166020840152565b5f516020615fdf5f395f51905f52805463ffffffff60a81b1916600160a81b179055613b86565b613b86565b5f5b81811061240057505050565b5f8061240d8385876122cd565b9061241d604051809381936122e9565b039082305af161242b6122f6565b5015612439576001016123f4565b636534eae560e11b5f5260045260245ffd5b6361c4e91b60e11b5f5260045ffd5b506001600160f81b03198616600160f91b1415612394565b62dc149f60e41b5f5260045ffd5b5061ef0160f01b6001600160f01b03196124a161249c30612225565b61224b565b1614612368565b94939291906001600160581b03198616156104f2576001600160f81b03198616600160f81b141580612553575b61244b576124e286613b20565b6001600160a01b036124f6611f4988611ea2565b1615612505575b505050505050565b612548956123ed61252b5f516020615fdf5f395f51905f525463ffffffff9060a81c1690565b926123b66040519461253e604087610fe3565b63ffffffff168552565b5f80808080806124fd565b506001600160f81b03198616600160f91b14156124d5565b9060405161257881610f71565b82546001600160a01b03908116825260019390930154928316602082015260589290921b6001600160f81b0319166040830152565b95909491939092337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580612721575b156127135761260a6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f916126f4575b50156106625760405163d68f602560e01b8152966001600160a01b039190911695905f888061266836343360048501612164565b0381838b5af19788156107dc575f986126d4575b50612688969798613f2d565b803b1561023257604051630b9dfbed60e11b8152915f9183918290849082906126b490600483016121ad565b03925af180156107dc576126c6575b50565b806107d65f61024193610fe3565b6126889798506126ed903d805f833e6107fa8183610fe3565b979661267c565b61270d915060203d602011610831576108238183610fe3565b5f612634565b919390929461024196613f2d565b50303314156125e7565b9160206120b9938181520191612144565b356bffffffffffffffffffffffff1981169291906014821061275c575050565b6bffffffffffffffffffffffff1960149290920360031b82901b16169150565b9091600182036128f8575f516020615f9f5f395f51905f5293906054600160f81b600160581b600160f81b03605887901b1617916127c66127bc84611ea2565b5463ffffffff1690565b5f516020615fdf5f395f51905f525460a81c63ffffffff169063ffffffff8083169116146128e0575b5061285861283161070561282b61282561281e5f516020615fdf5f395f51905f525463ffffffff9060a81c1690565b9886611d59565b9061273c565b60601c90565b61284861283c611004565b63ffffffff9097168752565b6001600160a01b03166020860152565b612883601482019461286a8680612006565b61287a6034869493940189612006565b93909288613b86565b019160046128918483612006565b9050146128bf575b5050505b604080519182526001600160a01b03909216602082015290819081015b0390a1565b61053061052a6128d8946128d293612006565b90614376565b5f8080612899565b6128f29060010163ffffffff16612288565b5f6127ef565b6002820361296057806129555f516020615f9f5f395f51905f5295603461292f61070561282b612825601461295b99019588611d59565b9361294e8561293e8580612006565b906001600160a01b038c166142e5565b0190612006565b91614122565b61289d565b600382036129d657806129555f516020615f9f5f395f51905f529560386129ce61070561282b612825601861295b9901956129c88c8a6129b661070561282b612825876129b06105308288611d1d565b95611d48565b6129c08b80612006565b939092613f9a565b88611d48565b930190612006565b600482148015612a74575b8015612a6a575b15612a5b576001600160a01b03831693843b1561023257612a22945f92836040518098819582946306d61fe760e41b84526004840161272b565b03925af19283156107dc575f516020615f9f5f395f51905f5293612a47575b5061289d565b806107d65f612a5593610fe3565b5f612a41565b631092ef5760e11b5f5260045ffd5b50600682146129e8565b50600582146129e1565b359060208110612a8c575090565b5f199060200360031b1b1690565b929192612aa6826120c7565b91612ab46040519384610fe3565b829481845281830111610232578281602093845f960137010152565b909160018203612b41575f516020615fbf5f395f51905f5293612b1f91612b1991612b10600160f81b600160581b600160f81b03605889901b16176144a9565b505b3691612a9a565b83614509565b50604080519182526001600160a01b03909216602082015290819081016128ba565b60028203612bb1576001600160a01b038381165f9081527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b866020526040902080546001600160a01b031981169091555f516020615fbf5f395f51905f5295612b1f93612b19939092165b50612b12565b919060038103612bd6575050610530612bd292612bcd92611d1d565b614445565b5050565b909160048203612c5f57612b19612b1f915f516020615fbf5f395f51905f5295612c0e5f516020615fdf5f395f51905f525460581b90565b612c1a611f4982611ea2565b6001600160a01b03888116911614612c325750612b12565b612c3e612c5991611ea2565b8054640100000000600160c01b031916640100000000179055565b5f612bab565b600582148015612cf0575b15612a5b575f516020615fdf5f395f51905f525460581b612c94612c8e8684611d67565b90612a7e565b906001600160f81b03198116600160f91b14612cc8575b5050612b19612b1f915f516020615fbf5f395f51905f5295612b12565b60081b6001600160e01b03191614612ce1575f80612cab565b6313002bdd60e31b5f5260045ffd5b5060068214612c6a565b60405190612d0782610fac565b5f6020838281520152565b612d26818060081b918160301b9160501b90565b929091906001600160f81b03198116600160f81b14159081612dd6575b81612dc1575b81612da8575b50611fd35760ff60f81b16600160f81b8114159081612d9e575b50612d98576001600160e01b031916612d93576001600160501b031916612d8f57600190565b5f90565b505f90565b50505f90565b905015155f612d69565b6001600160f81b031916607f60f91b141590505f612d4f565b6001600160f81b031980821614159150612d49565b6001600160f81b0319811615159150612d43565b9094939291612df8826144a9565b916001600160f81b03198116600160f81b03612e70575f516020615fbf5f395f51905f5291612e46612e406102419899612e689460018060a01b039060581c16933691612a9a565b82614509565b5060408051600181526001600160a01b03909216602083015290918291820190565b0390a161490f565b9294919290506001600160f81b03198116600160f91b0361244b5760081b92612e988461206e565b94612ea38780614880565b949050600187019460018654010361306e5794956001600160e01b0319871695905f5b8654811015612f7c57805f516020615fbf5f395f51905f52612f738c612f51612f43612e408e612f318f99612f2b612f1b612f13612f068460019f6148b5565b90549060031b1c60501b90565b908160501c90565b90508c8060a01b03169780614880565b906122cd565b604094919451948593602085016148ca565b03601f198101835282610fe3565b5060408051600581526001600160a01b03909216602083015290918291820190565b0390a101612ec6565b509194509296612ff761300a916130056130699598612fa86001612fa26102419d61206e565b016148df565b8554612fe590612fc39060101c6001600160a01b0316610705565b93612fda612fd18280614880565b91909280614880565b5f19019290506122cd565b604095919551958693602085016148ca565b03601f198101845283610fe3565b614509565b5080545f516020615fbf5f395f51905f5290613056906130359060101c6001600160a01b0316610705565b60408051600681526001600160a01b03909216602083015290918291820190565b0390a180546001600160b01b0319169055565b61490f565b63013dcc8d60e31b5f5260045ffd5b906126c39291614661565b60071115612d8f57600190565b612f439061317f906130b06001600160a01b03823516610705565b906131516020820135612f436130d26130cc6040860186612006565b9061499a565b936130e36130cc6060830183612006565b90608081013560a0820135906131056130cc60c08501359460e0810190612006565b93604051988997602089019b8c94919260e0969399989794919961010087019a60018060a01b03168752602087015260408601526060850152608084015260a083015260c08201520152565b51902060408051602081019283526001600160a01b03909516908501525f6060850152929182906080820190565b51902090565b7f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460408051338152346020820152a1565b6131d26131cd5f356001600160e01b031916612038565b61256b565b80516001600160a01b03906131e8908216610705565b16156133265780516060906001600160a01b0316806002600160a01b031981016133045750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610662575b60408201516001600160f81b031916806132c45750602082015161326b906001600160a01b03166149a5565b92905b156132bc57516001600160a01b031690600182141582816132a8575b50613298575b825160208401f35b6132a191613eb4565b5f80613290565b6001600160a01b039150811614155f61328a565b825160208401fd5b6001600160f81b0319908116036132f55760208201516132ee906001600160a01b03163690613e6a565b929061326e565b632d6a6bb760e01b5f5260045ffd5b600103613312575b5061323f565b613320915036903490613deb565b5f61330c565b631cd4b64760e21b5f5260045ffd5b6001600160a01b03165f9081527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b866020526040902090565b9081602091031261023257516120b981610bec565b9161338c916149e7565b919080836001600160f81b03198416156135ae575b60208110159182613577575b82613561575b50506133c161043184611ea2565b60208101516001600160a01b03906133da908216610705565b16158061354e575b6104f2576001600160f81b0319841615159081613515575b506105f9576001600160f81b03198316600160f81b0361348e5790613426602094939261344496614a39565b604051637aa8f17760e11b8152958694859384933360048601612189565b039160581c6001600160a01b03165afa9081156107dc575f91613465575090565b6120b9915060203d602011613487575b61347f8183610fe3565b81019061336d565b503d613475565b92916001600160f81b03198116600160f91b036134ee5760081b93600160f11b6134d16134c46134bd8861206e565b5460f01b90565b6001600160f01b03191690565b166134df576120b994614b77565b635b71057960e01b5f5260045ffd5b929391929091906001600160f81b03191661244b576120b99361351091614a39565b614a93565b5163ffffffff16905063ffffffff6135456106385f516020615fdf5f395f51905f525463ffffffff9060c81c1690565b9116105f6133fa565b506001600160f81b0319841615156133e2565b8192955061356f9350611d75565b925f806133b3565b91507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a6135a7612c8e8385611d67565b14916133ad565b92506135c85f516020615fdf5f395f51905f525460581b90565b926133a1565b90818060081b9160ff839260f01c166002146135e657565b6001600160d81b031983169150565b9080601f83011215610232578160206120b993359101612a9a565b9190916101208184031261023257613626611013565b9261363082610236565b84526020820135602085015260408201356001600160401b038111610232578161365b9184016135f5565b604085015260608201356001600160401b038111610232578161367f9184016135f5565b60608501526080820135608085015260a082013560a085015260c082013560c085015260e08201356001600160401b03811161023257816136c19184016135f5565b60e08501526101008201356001600160401b038111610232576136e492016135f5565b610100830152565b90816020910312610232575190565b80516001600160a01b031682526120b9916020820151602082015261010061377c61374c61373a60408601516101206040870152610120860190610d6e565b60608601518582036060870152610d6e565b6080850151608085015260a085015160a085015260c085015160c085015260e085015184820360e0860152610d6e565b92015190610100818403910152610d6e565b9392916137ab9060409286526060602087015260608601906136fb565b930152565b9291906137ab6020916040865260408601906136fb565b9290925f926137d63682613610565b916137e5610100830183612006565b918193835f93602082101580613a26575b6139e7575b5050506001600160f81b031916600160f81b145b6139c0575b506001600160f81b03198616600160f81b036138ab575050604051639700320360e01b815293602092859283915f91839161385291600484016137b0565b039260581c6001600160a01b03165af19081156107dc576120b9925f9261387a575b50615053565b61389d91925060203d6020116138a4575b6138958183610fe3565b8101906136ec565b905f613874565b503d61388b565b909491939092916001600160f81b03198116600160f91b0361395c5760081b93600160f01b6138df6134c46134bd8861206e565b1661394d575f6138ff6138f960209661392999858a614e64565b94615053565b604051630ccab7a160e01b8152979096889586948593926001600160e01b0319166004850161378e565b03926001600160a01b03165af19081156107dc576120b9925f9261387a5750615053565b6314b9743f60e01b5f5260045ffd5b919350506001600160f81b03191661244b576139b190630b135d3f60e11b9361351063ffffffff60e01b946020527b19457468657265756d205369676e6564204d6573736167653a0a33325f52603c60042090565b16036139bb575f90565b600190565b916139cd93955086614c2c565b9193916139db368284612a9a565b6101008401525f613814565b9195509250829196506139fa9350611d75565b9091613a07368385612a9a565b61010085015261380f613a1d6001923390613095565b95905f806137fb565b507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a613a55612c8e8484611d67565b146137f6565b5f516020615fdf5f395f51905f5254600a63ffffffff8260a81c16019063ffffffff8211613b0c5763ffffffff83811692168211613afd57613aa59060c81c63ffffffff16610638565b10156105f9575f516020615fdf5f395f51905f52805463ffffffff60c81b60c893841b1663ffffffff60c81b1990911617908190559081901c63ffffffff9081169160a81c168111613af45750565b61024190612288565b63e60fd64760e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b60207f6789ec0c85d6458d897a36a70129b101f8b4d84c6e218046c3107373dbcbae88918060581c6001600160581b0360a81b5f516020615fdf5f395f51905f525416175f516020615fdf5f395f51905f5255604051906001600160581b0319168152a1565b929490939193613b986127bc85611ea2565b5f516020615fdf5f395f51905f525460a81c63ffffffff169063ffffffff808316911614613d8f575b506020810180516001600160a01b031615613d86575b5f516020615fdf5f395f51905f525460a81c63ffffffff1663ffffffff613c05610638855163ffffffff1690565b911614801590613d5a575b6105f957613c5e613c6b92613c2487611ea2565b815181546020938401516001600160c01b031990911663ffffffff9290921691909117921b640100000000600160c01b0316919091179055565b516001600160a01b031690565b915f196001600160a01b03841601613d49575b5050506001600160f81b03198116600160f81b03613d265760581c6001600160a01b031690813b15610232576040516306d61fe760e41b8152925f9184918291613ccc91906004840161272b565b038183855af19081156107dc575f516020615f9f5f395f51905f52926128ba92613d12575060408051600181526001600160a01b03909216602083015290918291820190565b806107d65f613d2093610fe3565b5f612e46565b91506001600160f81b03198216600160f91b0361244b576102419160081b6151a6565b613d5292614122565b5f8080613c7e565b50613d676127bc86611ea2565b63ffffffff613d7d610638855163ffffffff1690565b91161015613c10565b60018152613bd7565b613da19060010163ffffffff16612288565b5f613bc1565b6040908151613db68382610fe3565b600681526512d95c9b995b60d21b602082015291613dd681519182610fe3565b6005815264181719971960d91b602082015290565b91613e12925f8080946040519687958694859363d68f602560e01b85523360048601612189565b03926001600160a01b03165af19081156107dc575f91613e30575090565b6120b991503d805f833e6107fa8183610fe3565b5f9283613e1295936040519687958694859363d68f602560e01b85523360048601612189565b5f9060405192808385378338925af4913d82523d5f602084013e60203d830101604052565b5f9192806040519485378338925af4913d82523d5f602084013e60203d830101604052565b6001600160a01b0316803b1561023257604051630b9dfbed60e11b815260206004820152915f918391829084908290613ef1906024830190610d6e565b03925af180156107dc57613f025750565b5f61024191610fe3565b8051156122e45760200190565b80518210156122e45760209160051b010190565b909593919492965f5b87811015613f8657600190613f808a89613f6c8489613f65828060051b8c013595613f6087610986565b613f19565b51946122cd565b90613f78868d8d6122cd565b949093613b86565b01613f36565b509650505050505050565b90156122e45790565b9293929091906001600160a01b03821615614113575b613fb990612038565b93613fe5613fd8613fca8684613f91565b356001600160f81b03191690565b6001600160f81b03191690565b936001600160f81b031985166140eb576001600160a01b0384169161400c91908190611d92565b823b1561023257614036925f92836040518096819582946306d61fe760e41b84526004840161272b565b03925af19485156107dc5761409a6140ba93600193610241986140d7575b5060408051600381526001600160a01b03881660208201525f516020615f9f5f395f51905f529190a15b82546001600160a01b0319166001600160a01b03909116178255565b0180546001600160a01b0319166001600160a01b03909316929092178255565b805460ff60a01b191660589290921c60ff60a01b16919091179055565b806107d65f6140e593610fe3565b5f614054565b50909390506001600160f81b0319808416036132f55760016140ba9161409a6102419661407e565b6001600160a01b039150613fb0565b6001600160a01b03169190821580156142db575b6142d65760405163d60b347f60e01b8152306004820152602081602481875afa9081156107dc575f916142b7575b506141fb57908061417492611d92565b9190813b15610232576040516306d61fe760e41b8152925f918491829161419f91906004840161272b565b038183855af19081156107dc575f516020615f9f5f395f51905f52926128ba926141e7575b505b60408051600481526001600160a01b03909216602083015290918291820190565b806107d65f6141f593610fe3565b5f6141c4565b81151580614298575b614222575b50506128ba5f516020615f9f5f395f51905f52916141c6565b908061422d92611d92565b9190813b15610232576040516306d61fe760e41b8152925f918491829161425891906004840161272b565b038183855af19081156107dc575f516020615f9f5f395f51905f52926128ba92614284575b5091614209565b806107d65f61429293610fe3565b5f61427d565b506001600160f81b0319806142b0613fca8585613f91565b1614614204565b6142d0915060203d602011610831576108238183610fe3565b5f614164565b505050565b5060018314614136565b926142f0908461549e565b8161433f5750505f80916040518260208201916306d61fe760e41b835261432981612f4360248201604090602081525f60208201520190565b51926001600160a01b03165af1506126c36122f6565b6001600160a01b039092169190823b15610232576126b4925f92836040518096819582946306d61fe760e41b84526004840161272b565b7f9d17cd6d095ac90a655405ab29f30a7ee7e88ef3974c1bf7544bf591043bb71a916060916143a882610cea83611ed9565b600160ff198254161790556040519163ffffffff60e01b1682526001600160581b031916602082015260016040820152a1565b907f9d17cd6d095ac90a655405ab29f30a7ee7e88ef3974c1bf7544bf591043bb71a9260609261440e83610cea83611ed9565b9115159160ff1981541660ff84161790556040519263ffffffff60e01b1683526001600160581b03191660208301526040820152a1565b61444f5f91612038565b80546001600160a01b031981168255600190910180546001600160a01b0390921693916001600160f81b0319605882901b1615614498575b5080546001600160a81b0319169055565b6001600160a01b031692505f614487565b906001600160581b03195f516020615fdf5f395f51905f525460581b166001600160581b0319831614612ce1576144f56001600160a01b036144ea84611ea2565b5460201c1692611ea2565b8054640100000000600160c01b0319169055565b91907f2b82f87bf66300af618a9621d3f221edfab735f5bacb4e004cce1b62375396c3905a905f80604051936145698561455b6020820196638a91b0e360e01b88526020602484018181520190610d6e565b03601f198101875286610fe3565b60405193614578602086610fe3565b828552602085019583908a905f368a375193f1913d90816145bf575b815f9293523e604080516001600160a01b0390951685528115156020860152909390819081016128ba565b5f9150614594565b604080519091906145d88382610fe3565b6001815291601f1901825f5b8281106145f057505050565b8060606020809385010152016145e4565b9061460b82611023565b6146186040519182610fe3565b8281528092614629601f1991611023565b01905f5b82811061463957505050565b80606060208093850101520161462d565b9060406120b9925f81528160208201520190610d6e565b600881901b9291906001600160f81b03198116600160f81b036146f4575090614689916155ca565b90916001600160f81b031981166146a457506120b9916156e2565b6001600160f81b031916600160f81b036146c1576120b991615636565b60405162461bcd60e51b815260206004820152600b60248201526a155b9cdd5c1c1bdc9d195960aa1b6044820152606490fd5b9293926001600160f81b031981166147ac5750906147119161554c565b9161471a6145c7565b956001600160f81b03198116614747575061473493615594565b61473d83613f0c565b526126c382613f0c565b6001600160f81b031916600160f81b036146c1576147649361556d565b61476d84613f0c565b52610241577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76128ba61479f84613f0c565b516040519182918261464a565b909391906001600160f81b0319908116036146c1576147d66147dc916147d06145c7565b95615524565b91613e8f565b6147e885939293613f0c565b526001600160f81b03198116600160f81b0361483357501561480657565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76128ba61479f84613f0c565b6001600160f81b0319166146c1576102415760405162461bcd60e51b815260206004820152601360248201527211195b1959d85d1958d85b1b0819985a5b1959606a1b6044820152606490fd5b903590601e198136030182121561023257018035906001600160401b03821161023257602001918160051b3603831361023257565b80548210156122e4575f5260205f2001905f90565b9092809260209483528483013701015f815290565b8054905f8155816148ee575050565b5f5260205f20908101905b818110614904575050565b5f81556001016148f9565b9091906001600160a01b031680158015614990575b6142d65781156122e4575f516020615fbf5f395f51905f52926128ba926001600160f81b03198235811614614977575b505060408051600481526001600160a01b03909216602083015290918291820190565b612b1281612e409261498894611d92565b505f80614954565b5060018114614924565b816040519182372090565b5f809160405136810160405236838237604051601481016040523360601b90528260143601925af190604051903d82523d5f602084013e60203d830101604052565b9182358060f81c805f14614a2b5780600114614a1e57600214614a08575f80fd5b6001600160d81b03191692600501916004190190565b5092601501916014190190565b505060015f9301915f190190565b60405160208101917f1547321c374afde8a591d972a084b071c594c275e36724931ff96c25f2999c838352604082015260408152614a78606082610fe3565b5190209015614a8a576120b990615854565b6120b990615742565b9190614aa0913691612a9a565b604051916020820191805180604014614b2b57604114614acd5750505050505b638baa579f5f526004601cfd5b80606060409201515f1a60205201516060525b5f52516040526020600160805f825afa51905f6060526040523d614b05575050614ac0565b6001600160a01b03163003614b1f57630b135d3f60e11b90565b6001600160e01b031990565b506040015160ff81901c601b016020526001600160ff1b0316606052614ae0565b90926080926120b99694835260018060a01b0316602083015260408201528160608201520191612144565b614b9065ffffffffffff929594614b9c948733856158c9565b97929491959095615993565b5091164210908115614c1a575b50614c0757602094614bba91614a39565b60405163392dffaf60e01b815295869485938493614be993929133906001600160e01b03191660048701614b4c565b03916001600160a01b03165afa9081156107dc575f91613465575090565b506001600160e01b031995945050505050565b65ffffffffffff91501642115f614ba9565b9190939293601481019160141161023257803560601c92829190614c4e612cfa565b6001600160a01b03909516602086019081529490614cad614c716127bc83611ea2565b5f516020615fdf5f395f51905f525460a81c63ffffffff169063ffffffff808316911603614e125760010163ffffffff165b63ffffffff168352565b815163ffffffff1695516001600160a01b031697614ccb8580612006565b614cd49161499a565b986034850199614ce48b88612006565b614ced9161499a565b906054870199614cfd8b8a612006565b614d069161499a565b604080517fb17ab1224aca0d4255ef8161acaf2ac121b8faa32a4b2258c912cc5f8308c505602082019081526001600160581b03198a169282019290925263ffffffff9390931660608401526001600160a01b0395909516608083015260a082019290925260c081019290925260e0808301919091528152614d8a61010082610fe3565b519020905f1461052a6102ab98614deb60949861294e97614dcc6128d29761053097614e0457614db990615854565b614dc660748d0185612006565b91615c58565b9e614de2614dda8480612006565b929094612006565b9390928a613b86565b614dfe614df8828b612006565b90615dd2565b88612006565b614e0d90615742565b614db9565b614ca3565b356001600160c01b0319811692919060088210614e32575050565b6001600160c01b031960089290920360031b82901b16169150565b6040906120b99392815281602082015201906136fb565b93929190935f926001614e768361206e565b015f5b8154811015614ff757614e92612f13612f0683856148b5565b939095614eb4614eae614ea8613fca8585613f91565b60f81c90565b60ff1690565b808403614fc95750908181614eed614ee1614edb614ed584614f0b98611dae565b90614e17565b60c01c90565b6001600160401b031690565b600901918c610100614f03612b12868686611dbf565b910152611e54565b939093955b600160f01b1615614f28575b50600101939193614e79565b604051633894f6e760e11b81529196906020908390815f81614f588f6001600160e01b03198d1660048401614e4d565b03926001600160a01b03165af19182156107dc575f92614fa9575b506001600160a01b038216614f9557600191614f8e91615053565b9590614f1c565b631f24c1fb60e11b5f52600487905260245ffd5b614fc291925060203d81116138a4576138958183610fe3565b905f614f73565b9196909491831115614fe457630760bdcf60e11b5f5260045ffd5b614fec612211565b6101008b0152614f10565b505091929460ff8061500f614ea8613fca8789613f91565b16036150445761010061502c612b1285615034966120b998611d92565b91015261206e565b5460101c6001600160a01b031690565b63b32eeb6960e01b5f5260045ffd5b908082186001600160a01b031615606083811b838501821b9081149184901b141717600114615083575050600190565b65ffffffffffff60a01b8216916001600160d01b03198082169083168415615103575b65ffffffffffff60a01b841680156150f3575b8581109086180280861895146150e2575b81811190821802189160018060a01b03911716171790565b65ffffffffffff60a01b94506150ca565b5065ffffffffffff60a01b6150b9565b65ffffffffffff60a01b94506150a6565b356001600160501b031981169291906016821061512f575050565b6001600160501b031960169290920360031b82901b16169150565b805468010000000000000000811015610f8c5761516c916001820181556148b5565b819291549060031b9160501c821b9160018060b01b03901b1916179055565b356001600160f01b031981169291906002821061226d575050565b91906151b29080614880565b9260fe84118015615496575b6154875760016151cd8261206e565b0154615474575b5f1984015f5b818110615336575090615299615292838761523261528361526a6134c461526461525e87612ff79e9f8e6152596152b59f8f9061070561282b61282561522461522a9489896122cd565b90611dea565b9a8b9161206e565b805462010000600160b01b03191660109290921b62010000600160b01b0316919091179055565b6122cd565b90611e18565b9061518b565b6152738861206e565b9060f01c61ffff19825416179055565b6001600160a01b0316966122cd565b8091611dfb565b6040519586939092906001600160e01b031916602085016148ca565b803b15610232575f6152db92604051809481926306d61fe760e41b8352600483016121ad565b038183855af19081156107dc575f516020615f9f5f395f51905f52926128ba92615322575b5060408051600681526001600160a01b03909216602083015290918291820190565b806107d65f61533093610fe3565b5f615300565b6153d19061537c60016153488661206e565b0161537661536961536361535d868d8c6122cd565b90611ddc565b90615114565b6001600160501b03191690565b9061514a565b61539661070561070561282b612825615224868d8c6122cd565b6153a4615292838a896122cd565b604051949185916153c3916001600160e01b03198a16602085016148ca565b03601f198101855284610fe3565b803b15610232576040516306d61fe760e41b8152925f9184918290849082906153fd90600483016121ad565b03925af19182156107dc57600192615460575b505f516020615f9f5f395f51905f5261545761543661282b612825615224868d8c6122cd565b60408051600581526001600160a01b03909216602083015290918291820190565b0390a1016151da565b806107d65f61546e93610fe3565b5f615410565b6154826001612fa28361206e565b6151d4565b63b62d956d60e01b5f5260045ffd5b5083156151be565b5f516020615f9f5f395f51905f52916040916001600160a01b0382161561551b575b6001600160a01b039081165f8181527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b8660205284902080546001600160a01b03191693909216929092179055815190600282526020820152a1565b600191506154c0565b91601382111561553f57823560601c92601401916013190190565b63ba597e7e5f526004601cfd5b90603381111561553f57813560601c92601483013592603401916033190190565b905f928491604051958692833738935af1913d82523d5f602084013e60203d830101604052565b90925f92819594604051968792833738935af1156155c1573d82523d5f602084013e60203d830101604052565b503d5f823e3d90fd5b918235826020118160401c1761553f5783016020810193813593846155ee57505050565b01601f190190835b5f190160208160051b8301013580830160608101908135809101918680602080860135809601011191111792171760401c1761553f57806155f657505050565b919061564181614601565b925f5b82811061565057505050565b8061567a60019260051b84013584016040810135810190602082359201906020810135903561556d565b6156848389613f19565b5215615691575b01615644565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76156da6156bf8389613f19565b51604051918291858352604060208401526040830190610d6e565b0390a161568b565b91906156ed81614601565b925f5b8281106156fc57505050565b8061572660019260051b840135840160408101358101906020823592019060208101359035615594565b6157308288613f19565b5261573b8187613f19565b50016156f0565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f0000000000000000000000000000000000000000000000000000000000000000461416156157cd575b6719010000000000005f52601a52603a526042601820905f603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f00000000000000000000000000000000000000000000000000000000000000006040820152466060820152306080820152206157b0565b60a061585e613da7565b90602081519101209060208151910120604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8352602083015260408201525f6060820152306080820152206719010000000000005f52601a52603a526042601820905f603a52565b9491848461594a9296959396604051906158e282610fc7565b5f82525f602083015260408201995f8b52615944606084019a8b925f84525f60808701525f60a0870152606060c087015261593560e08701915f83526101008801955f87529063ffffffff60e01b169052565b6001600160a01b039091169052565b526159ea565b60ff8061595d614ea8613fca8786613f91565b160361504457615034615977846159879561598c94611d92565b9490955163ffffffff60e01b1690565b61206e565b9351929190565b8065ffffffffffff8260a01c169182156001146159b1575b60d01c92565b65ffffffffffff92506159ab565b90926080926120b99594835260018060a01b0316602083015260408201528160608201520190610d6e565b9160608301906001615a3f615a06845163ffffffff60e01b1690565b6001600160e01b0319165f9081527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f8526020526040902090565b01805493905f5b858110615a565750505050505050565b615a66612f13612f0683856148b5565b6001600160a01b031660a0890190815260808901949091615a8f906001600160f01b0319168652565b615aa9615aa2614ea8613fca8985613f91565b60ff168a52565b615ab7614eae8a5160ff1690565b808403615c265750858181615adc614ee1614edb614ed5615b319b9c615b0498611dae565b8c60c0615af7612b1260208401948086526009018688611dbf565b9101525160090191611e54565b949094955b51600160f11b90615b23906001600160f01b0319166134c4565b166001600160f01b03191690565b15615b40575b50600101615a46565b51615b53906001600160a01b0316610705565b6020615b79615b6c615b6c895163ffffffff60e01b1690565b6001600160e01b03191690565b60e08a01516101008b015160c08c015160405163184dfdbb60e11b8152958694909385938493615bb89390926001600160a01b031690600486016159bf565b03915afa9081156107dc575f91615c08575b506001600160a01b038116615bf45790600191615bec60408a01918251615053565b905290615b37565b631f24c1fb60e11b5f52600482905260245ffd5b615c20915060203d81116138a4576138958183610fe3565b5f615bca565b909490831115615c3f57630760bdcf60e11b5f5260045ffd5b615b3190615c4e365f88612a9a565b60c08b0152615b09565b5f516020615fdf5f395f51905f52545f9493929060581b6001600160f81b03198116600160f81b03615d135791615cb89391615c9961070560209560581c90565b9160405195869485938493637aa8f17760e11b85523060048601612189565b03915afa9081156107dc575f91615cf4575b505b6001600160e01b0319166374eca2c160e11b01615ce557565b6362467c7760e11b5f5260045ffd5b615d0d915060203d6020116134875761347f8183610fe3565b5f615cca565b90949192916001600160f81b03198216600160f91b03615db45750602091615d419160081b958430886158c9565b60405163392dffaf60e01b81529297929586949385938493615d7493909230906001600160e01b03191660048701614b4c565b03916001600160a01b03165afa9081156107dc575f91615d95575b50615ccc565b615dae915060203d6020116134875761347f8183610fe3565b5f615d8f565b94906001600160f81b03191661244b57615dcd92614a93565b615ccc565b615ddf6105308383611d1d565b91602c8110615f8257602c820190615e0061070561282b6128258487611d48565b615e2a615e1c613fd8613fca615e168780612006565b90613f91565b6001600160f81b0319161590565b80615edd575b61070561282b61282585615e856102419a87615e6961070561282b6128258f9d6129559f9e8f604c9f6129ce9f615e8b575b5050611e43565b615e738b80612006565b9390926001600160a01b031690613f9a565b88611e43565b612955615ecf615ed693606c860190615eca615eb961070561282b612825615eb38787612006565b90611d59565b9586906001600160a01b031661549e565b612006565b8091611e26565b8f87615e62565b5060405163ecd0596160e01b81526002600482015290949291906020816024816001600160a01b038a165afa9384156107dc5761282b61282584615e85610705948b615e6961070561282b6102419f8f9c6129559f9d8f604c9f936129ce9f94612825955f91615f63575b509f50505050505050505097509a5050959650505050615e30565b615f7c915060203d602011610831576108238183610fe3565b5f615f48565b90506004915003615f8f57565b637a210a5d60e11b5f5260045ffdfed21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x1a", + "chainId": "0x4268" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xcdfb075f8b0d348d5cd441aa45dbc5478882d7a5e7bdc712de429df410fda9c0", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0xe30c76dc9ecf1c19f6fec070674e1b4effe069fa", + "function": null, + "arguments": [ + "0xE264dCCc54e4b6906c0D1Fee11D4326c06D33c80" + ], + "transaction": { + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x5d17a", + "value": "0x0", + "input": "0x000000000000000000000000000000000000000000000000000000000000000060a034607357601f61044238819003918201601f19168301916001600160401b03831184841017607757808492602094604052833981010312607357516001600160a01b03811681036073576080526040516103b6908161008c823960805181818160c60152818161021d01526102d80152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816348aac39214610250575080635c60da1b146102085763ea6d13ac1461003d575f80fd5b6100463661033f565b60405161006c602080838181019587898837878201908382015203018084520182610394565b519020905f92604051927fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f60212060358501523060581b845260ff84538060158501526055842094341591863b156101eb5750506001906101e6575f38818034895af1156101d9575b836040525f60605215610157575b6040516001600160a01b0385168152602090f35b9180825f9493859483378101838152039082855af13d156101d4573d67ffffffffffffffff81116101c0576040519061019a601f8201601f191660200183610394565b81525f60203d92013e5b156101b1575f8080610143565b63487e630960e11b5f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b6101a4565b63b12d13eb5f526004601cfd5b610135565b91509450605f602134f593846101355763301164255f526004601cfd5b3461024c575f36600319011261024c576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b3461024c57806102826020806102653661033f565b908084889499019889378201908382015203018084520182610394565b5190206040517fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f602120906040525f60605260ff5f536035523060601b600152601552602060555f205f6035526040519060018060a01b03168152f35b90604060031983011261024c5760043567ffffffffffffffff811161024c578260238201121561024c5780600401359267ffffffffffffffff841161024c576024848301011161024c57602401919060243590565b90601f8019910116810190811067ffffffffffffffff8211176101c05760405256000000000000000000000000e264dccc54e4b6906c0d1fee11d4326c06d33c80", + "nonce": "0x1b", + "chainId": "0x4268" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x804af0d15702a25ab52f0f9b21ea646d48ac060e16914e3c6d46124120bea960", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xd703aae79538628d27099b8c4f621be4ccd142d5", + "function": "approveFactory(address,bool)", + "arguments": [ + "0xE30c76Dc9eCF1c19F6Fec070674E1b4eFfE069FA", + "true" + ], + "transaction": { + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0xd703aae79538628d27099b8c4f621be4ccd142d5", + "gas": "0x108d1", + "value": "0x0", + "input": "0x6e7dbabb000000000000000000000000e30c76dc9ecf1c19f6fec070674e1b4effe069fa0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x1c", + "chainId": "0x4268" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x545369c18b2b063b0f541dba3cdb0f012137d734537a36cc22994eec4a3091c8", + "0xcdfb075f8b0d348d5cd441aa45dbc5478882d7a5e7bdc712de429df410fda9c0", + "0x804af0d15702a25ab52f0f9b21ea646d48ac060e16914e3c6d46124120bea960" + ], + "returns": {}, + "timestamp": 1740499688, + "chain": 17000, + "commit": "9ebc75c" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/911867/run-1740499935.json b/broadcast/DeployKernel.s.sol/911867/run-1740499935.json new file mode 100644 index 00000000..30bccc0a --- /dev/null +++ b/broadcast/DeployKernel.s.sol/911867/run-1740499935.json @@ -0,0 +1,142 @@ +{ + "transactions": [ + { + "hash": "0xa5b9286c1b5263c88f07f9f1405716db0b6a2d16c1bb9d30620ed490729b8f48", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0xe264dccc54e4b6906c0d1fee11d4326c06d33c80", + "function": null, + "arguments": [ + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x71e987", + "value": "0x0", + "input": "0x0000000000000000000000000000000000000000000000000000000000000000610140806040523461020a576020816162458038038091610020828561020e565b83398101031261020a57516001600160a01b038116810361020a57306080524660a05260a060405161005360408261020e565b6006815260208101906512d95c9b995b60d21b82526040519161007760408461020e565b60058352602083019164181719971960d91b8352519020915190208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260208301526040820152466060820152306080820152206101005261012052604051602081019063deadbeef60e01b82526004815261010160248261020e565b5190516001600160581b031981169190601582106101ea575b7f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f80546001600160a81b031916605885901c179055604051615fff9081610246823960805181615765015260a05181615788015260c051816157f8015260e0518161581e015261010051816157440152610120518181816103c4015281816106ac0152818161086601528181610ac401528181610e600152818161115d015281816112ee0152818161132901528181611528015281816119b901528181611aeb015281816125b701526132100152f35b6001600160581b031960159290920360031b82901b161690505f8061011a565b5f80fd5b601f909101601f19168101906001600160401b0382119082101761023157604052565b634e487b7160e01b5f52604160045260245ffdfe6080604052600436101561001d575b366131b65761001b613185565b005b5f3560e01c8063112d3a7d1461021c578063150b7a02146102175780631626ba7e1461021257806319822f7c1461020d5780631f1b92e3146102085780633659cfe6146102035780633c3b752b146101fe57806352141cd9146101f957806357b3a5f4146101f45780636e6fa0c6146101ef578063721e67f4146101ea57806384b0196e146101e55780638dd7712f146101e057806390ef8862146101db5780639198bdf5146101d65780639517e29f146101d15780639cfd7cff146101cc578063a65d69d4146101c7578063a71763a8146101c2578063adb610a3146101bd578063b8afe17d146101b8578063b9b82941146101b3578063bc197c81146101ae578063c3e58978146101a9578063d03c7914146101a4578063d691c9641461019f578063e6f3d50a1461019a578063e9ae5c5314610195578063f1f7f0f914610190578063f23a6e611461018b578063f2dc691d146101865763fc9c5dec0361000e57611cbd565b611c9f565b611c45565b611c0f565b611adf565b61195f565b61187d565b611830565b61175d565b61164c565b6114f5565b61147f565b61144d565b61131d565b6112d9565b611281565b611151565b61103a565b610f2b565b610e30565b610d92565b610d0c565b610cb1565b610bfe565b610a5e565b6109c8565b61084b565b610695565b610390565b61032f565b6102d5565b6102af565b6001600160a01b0381160361023257565b5f80fd5b359061024182610221565b565b9181601f84011215610232578235916001600160401b038311610232576020838186019501011161023257565b6060600319820112610232576004359160243561028c81610221565b91604435906001600160401b038211610232576102ab91600401610243565b9091565b346102325760206102cb6102c236610270565b92919091611f10565b6040519015158152f35b34610232576080366003190112610232576102f1600435610221565b6102fc602435610221565b6064356001600160401b0381116102325761031b903690600401610243565b5050604051630a85bd0160e11b8152602090f35b34610232576040366003190112610232576004356024356001600160401b0381116102325760209161036861036e923690600401610243565b91613382565b6040516001600160e01b03199091168152f35b90816101209103126102325790565b6060366003190112610232576004356001600160401b038111610232576103bb903690600401610381565b602435604435917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610662576103ff60208201356135ce565b9092919084836001600160f81b0319861615610649575b8261042193946137c7565b9361044661043661043184611ea2565b611fda565b946001600160f81b031916151590565b938480610608575b6105f957602001516001600160a01b0316801591819083806105f2575b6104f2576001926104866104a5925f525f60205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b149081156105ea575b501561055d5782610501575b50506104f257816104dc925b6104e0575b506040519081529081906020820190565b0390f35b3490349034903490335af1505f6104cb565b631a0a9b9f60e21b5f5260045ffd5b61055692506105529161053661053061052a61051f61054b95611ed9565b936060810190612006565b90611d1d565b90611e6c565b63ffffffff60e01b165f5260205260405f2090565b5460ff1690565b1590565b5f806104ba565b829192916105b7575b506104f25761052a81606061057c930190612006565b638dd7712f60e01b916001600160e01b03199161059891611e6c565b16036105a857816104dc926104c6565b63dbbb044b60e01b5f5260045ffd5b6105e4915061054b6105cb61055292611ed9565b6105366105306105de6060880188612006565b90611d0c565b5f610566565b90505f6104ae565b508661046b565b633ab3447f60e11b5f5260045ffd5b50805163ffffffff1663ffffffff6106416106385f516020615fdf5f395f51905f525463ffffffff9060c81c1690565b63ffffffff1690565b91161061044e565b5f516020615fdf5f395f51905f525460581b9250610416565b6348f5c3ed60e01b5f5260045ffd5b6004359063ffffffff8216820361023257565b359063ffffffff8216820361023257565b6020366003190112610232576106a9610671565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610841575b15610838576107116107056106ff5f516020615fdf5f395f51905f525460581b90565b60581c90565b6001600160a01b031690565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91610809575b50156106625760405163d68f602560e01b8152916001600160a01b0391909116905f838061076e36343360048501612164565b038183865af19283156107dc575f936107e1575b5061078c90613a5b565b803b1561023257604051630b9dfbed60e11b8152915f9183918290849082906107b890600483016121ad565b03925af180156107dc576107c857005b806107d65f61001b93610fe3565b80610d64565b6120bc565b61078c919350610802903d805f833e6107fa8183610fe3565b8101906120e2565b9290610782565b61082b915060203d602011610831575b6108238183610fe3565b8101906120a4565b5f61073b565b503d610819565b61001b90613a5b565b50303314156106dc565b60203660031901126102325760043561086381610221565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061097c575b15610973576108b96107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91610954575b50156106625760405163d68f602560e01b8152916001600160a01b0391909116905f838061091636343360048501612164565b038183865af19283156107dc575f93610934575b5061078c906121be565b61078c91935061094d903d805f833e6107fa8183610fe3565b929061092a565b61096d915060203d602011610831576108238183610fe3565b5f6108e3565b61001b906121be565b5030331415610896565b6001600160581b031981160361023257565b9181601f84011215610232578235916001600160401b038311610232576020808501948460051b01011161023257565b346102325760a0366003190112610232576004356109e581610986565b6024356109f181610221565b6044356001600160401b03811161023257610a10903690600401610243565b6064939193356001600160401b03811161023257610a32903690600401610243565b91608435956001600160401b03871161023257610a5661001b973690600401610998565b969095612325565b608036600319011261023257600435610a7681610986565b602435610a8281610221565b6044356001600160401b03811161023257610aa1903690600401610243565b6064356001600160401b03811161023257610ac0903690600401610243565b91337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610be2575b15610bd457610b176107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91610bb5575b50156106625760405163d68f602560e01b8152956001600160a01b039190911694905f8780610b7536343360048501612164565b0381838a5af19687156107dc575f97610b95575b5061078c9596976124a8565b61078c969750610bae903d805f833e6107fa8183610fe3565b9695610b89565b610bce915060203d602011610831576108238183610fe3565b5f610b41565b919361001b959391936124a8565b5030331415610af4565b6001600160e01b031981160361023257565b34610232576020366003190112610232576104dc610c3f600435610c2181610bec565b5f60408051610c2f81610f71565b8281528260208201520152612038565b600160405191610c4e83610f71565b805460a083901b839003168084529101546001600160a01b0380821660208086019182526001600160f81b031960589490941b84166040968701908152865195841686529151909216918401919091525116918101919091529081906060820190565b3461023257604036600319011261023257602060ff610d00600435610cd581610986565b610cea60243591610ce583610bec565b611ed9565b9063ffffffff60e01b165f5260205260405f2090565b54166040519015158152f35b34610232576020366003190112610232576020610d41600435610d2e81610221565b5f604051610d3b81610f91565b52613335565b60405190610d4e82610f91565b546001600160a01b031690819052604051908152f35b5f91031261023257565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b34610232575f36600319011261023257610dd1610ddf610db0613da7565b604092919251938493600f60f81b855260e0602086015260e0850190610d6e565b908382036040850152610d6e565b4660608301523060808301525f60a083015281810360c083015260206060519182815201906080905f5b818110610e17575050500390f35b8251845285945060209384019390920191600101610e09565b6040366003190112610232576004356001600160401b03811161023257610e5b903690600401610381565b6024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610662575f908152602081905260409020546001600160a01b03169060609060018314159081610efb575b610ed0610ec9826060610ed7940190612006565b8091611d2b565b9030613e8f565b5015610eec57610ee357005b61001b91613eb4565b63f21e646b60e01b5f5260045ffd5b9150610ed7610ed0610ec9610f21610f19610ec96060880188612006565b903489613e44565b9492505050610eb5565b34610232575f36600319011261023257602063ffffffff5f516020615fdf5f395f51905f525460c81c16604051908152f35b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b03821117610f8c57604052565b610f5d565b602081019081106001600160401b03821117610f8c57604052565b604081019081106001600160401b03821117610f8c57604052565b61012081019081106001600160401b03821117610f8c57604052565b90601f801991011681019081106001600160401b03821117610f8c57604052565b60405190610241604083610fe3565b6040519061024161012083610fe3565b6001600160401b038111610f8c5760051b60200190565b6080366003190112610232576004356001600160401b03811161023257611065903690600401610998565b602435916001600160401b038311610232573660238401121561023257826004013561109081611023565b9361109e6040519586610fe3565b8185526024602086019260061b8201019036821161023257602401915b818310611110575050506044356001600160401b038111610232576110e4903690600401610998565b90606435946001600160401b0386116102325761110861001b963690600401610998565b9590946125ad565b604083360312610232576020604091825161112a81610fac565b61113386610684565b81528286013561114281610221565b838201528152019201916110bb565b61115a36610270565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611277575b1561126d576111b06107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f9161124e575b50156106625760405163d68f602560e01b8152936001600160a01b039190911692905f858061120e36343360048501612164565b038183885af19485156107dc575f9561122e575b5061078c93949561277c565b61078c949550611247903d805f833e6107fa8183610fe3565b9493611222565b611267915060203d602011610831576108238183610fe3565b5f6111da565b9161001b9361277c565b503033141561118d565b34610232575f366003190112610232576104dc6040516112a2604082610fe3565b601681527535b2b93732b61730b23b30b731b2b2173b181719971960511b6020820152604051918291602083526020830190610d6e565b34610232575f366003190112610232576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b61132636610270565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611443575b156114395761137c6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f9161141a575b50156106625760405163d68f602560e01b8152936001600160a01b039190911692905f85806113da36343360048501612164565b038183885af19485156107dc575f956113fa575b5061078c939495612ad0565b61078c949550611413903d805f833e6107fa8183610fe3565b94936113ee565b611433915060203d602011610831576108238183610fe3565b5f6113a6565b9161001b93612ad0565b5030331415611359565b34610232575f36600319011261023257602063ffffffff5f516020615fdf5f395f51905f525460a81c16604051908152f35b346102325760203660031901126102325760406114af6004356114a181610986565b6114a9612cfa565b50611ea2565b8151906114bb82610fac565b5463ffffffff81168083526001600160a01b03602092831c81169383019384528451918252925190921690820152f35b8015150361023257565b60603660031901126102325760043561150d81610986565b60243561151981610bec565b604435611525816114eb565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611642575b156116385761157b6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91611619575b50156106625760405163d68f602560e01b8152926001600160a01b039190911691905f84806115d936343360048501612164565b038183875af19384156107dc575f946115f9575b5061078c9293946143db565b61078c939450611612903d805f833e6107fa8183610fe3565b93926115ed565b611632915060203d602011610831576108238183610fe3565b5f6115a5565b9061001b926143db565b5030331415611558565b346102325760a036600319011261023257611668600435610221565b611673602435610221565b6044356001600160401b03811161023257611692903690600401610998565b50506064356001600160401b038111610232576116b3903690600401610998565b50506084356001600160401b038111610232576116d4903690600401610243565b505060405163bc197c8160e01b8152602090f35b602080825282516001600160f01b03191681830152808301516001600160a01b03166040808401919091529092015160608083015280516080830181905260a09092019201905f5b81811061173d5750505090565b82516001600160501b031916845260209384019390920191600101611730565b346102325760203660031901126102325761179c60043561177d81610bec565b60606040805161178c81610f71565b5f81525f6020820152015261206e565b6001604051916117ab83610f71565b805461ffff60f01b8160f01b168452828060a01b039060101c16602084015201906040519182602082549182815201915f5260205f20905f5b81811061180d576104dc85876117fc81880382610fe3565b6040820152604051918291826116e8565b825460501b6001600160501b0319168452602090930192600192830192016117e4565b346102325760203660031901126102325760206102cb600435612d12565b9060406003198301126102325760043591602435906001600160401b038211610232576102ab91600401610243565b6118863661184e565b90916001600160a01b0361189933613335565b54169182156119505760609060018414159485611939575b6118bb9293614661565b92611929575b50506040518091602082016020835281518091526040830190602060408260051b8601019301915f905b8282106118fa57505050500390f35b919360019193955060206119198192603f198a82030186528851610d6e565b96019201920185949391926118eb565b61193291613eb4565b5f806118c1565b6118bb9250611949363487613deb565b92506118b1565b63710c949760e01b5f5260045ffd5b60603660031901126102325760043561197781610986565b6024356001600160401b03811161023257611996903690600401610243565b6044356001600160401b038111610232576119b5903690600401610243565b90337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611ad5575b15611ac957611a0c6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91611aaa575b50156106625760405163d68f602560e01b8152946001600160a01b039190911693905f8680611a6a36343360048501612164565b038183895af19586156107dc575f96611a8a575b5061078c949596612dea565b61078c959650611aa3903d805f833e6107fa8183610fe3565b9594611a7e565b611ac3915060203d602011610831576108238183610fe3565b5f611a36565b91909261001b94612dea565b50303314156119e9565b611ae83661184e565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611c05575b15611bfb57611b3e6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91611bdc575b50156106625760405163d68f602560e01b8152926001600160a01b039190911691905f8480611b9c36343360048501612164565b038183875af19384156107dc575f94611bbc575b5061078c92939461307d565b61078c939450611bd5903d805f833e6107fa8183610fe3565b9392611bb0565b611bf5915060203d602011610831576108238183610fe3565b5f611b68565b9061001b9261307d565b5030331415611b1b565b34610232575f3660031901126102325760205f516020615fdf5f395f51905f525460581b604051906001600160581b0319168152f35b346102325760a036600319011261023257611c61600435610221565b611c6c602435610221565b6084356001600160401b03811161023257611c8b903690600401610243565b505060405163f23a6e6160e01b8152602090f35b346102325760203660031901126102325760206102cb600435613088565b34610232576040366003190112610232576004356001600160401b03811161023257611d04611cf26020923690600401610381565b60243590611cff82610221565b613095565b604051908152f35b906008116102325760040190600490565b906004116102325790600490565b909291928360041161023257831161023257600401916003190190565b906018116102325760040190601490565b906014116102325790601490565b906020116102325790602090565b90929192836020116102325783116102325760200191601f190190565b909291928360011161023257831161023257600101915f190190565b906009116102325760010190600890565b909291928360091161023257831161023257600901916008190190565b906016116102325790601690565b906016116102325760020190601490565b909291928360161161023257831161023257601601916015190190565b906002116102325790600290565b909291928360141161023257831161023257601401916013190190565b90602c116102325760180190601490565b90939293848311610232578411610232578101920390565b356001600160e01b0319811692919060048210611e87575050565b6001600160e01b031960049290920360031b82901b16169150565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85060205260405f2090565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85160205260405f2090565b90929060018103611f5f57506001600160a01b0392611f599250611f49915060581b600160581b600160f81b0316600160f81b17611ea2565b5460201c6001600160a01b031690565b16151590565b60028103611f9357506001600160a01b0392611f5992506107059150611f86908416613335565b546001600160a01b031690565b600303611fd357611fb4611faf610530600193611fc295611d1d565b612038565b01546001600160a01b031690565b6001600160a01b0390811691161490565b5050505f90565b90604051611fe781610fac565b915463ffffffff81168352602090811c6001600160a01b031690830152565b903590601e198136030182121561023257018035906001600160401b0382116102325760200191813603831361023257565b63ffffffff60e01b165f527f7c341349a4360fdd5d5bc07e69f325dc6aaea3eb018b3e0ea7e53cc0bb0d6f3b60205260405f2090565b63ffffffff60e01b165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85260205260405f2090565b9081602091031261023257516120b9816114eb565b90565b6040513d5f823e3d90fd5b6001600160401b038111610f8c57601f01601f191660200190565b602081830312610232578051906001600160401b038211610232570181601f8201121561023257805190612115826120c7565b926121236040519485610fe3565b8284526020838301011161023257815f9260208093018386015e8301015290565b908060209392818452848401375f828201840152601f01601f1916010190565b6120b9939260609260018060a01b03168252602082015281604082015201905f612144565b6120b9949260609260018060a01b0316825260208201528160408201520191612144565b9060206120b9928181520190610d6e565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556001600160a01b03167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2565b60405190612220602083610fe3565b5f8252565b90813b5f612232826120c7565b936122406040519586610fe3565b82855260208501903c565b80516020909101516001600160f01b031981169291906002821061226d575050565b6001600160f01b031960029290920360031b82901b16169150565b5f516020615fdf5f395f51905f52805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b634e487b7160e01b5f52603260045260245ffd5b908210156122e4576102ab9160051b810190612006565b6122b9565b908092918237015f815290565b3d15612320573d90612307826120c7565b916123156040519384610fe3565b82523d5f602084013e565b606090565b94939291909695966001600160581b031961235e6123515f516020615fdf5f395f51905f525460581b90565b6001600160581b03191690565b1615801590612480575b612472576001600160581b03198616156104f2576001600160f81b03198616600160f81b14158061245a575b61244b57856123a56123f297613b20565b6123c66123b0611004565b60018152925b6001600160a01b03166020840152565b5f516020615fdf5f395f51905f52805463ffffffff60a81b1916600160a81b179055613b86565b613b86565b5f5b81811061240057505050565b5f8061240d8385876122cd565b9061241d604051809381936122e9565b039082305af161242b6122f6565b5015612439576001016123f4565b636534eae560e11b5f5260045260245ffd5b6361c4e91b60e11b5f5260045ffd5b506001600160f81b03198616600160f91b1415612394565b62dc149f60e41b5f5260045ffd5b5061ef0160f01b6001600160f01b03196124a161249c30612225565b61224b565b1614612368565b94939291906001600160581b03198616156104f2576001600160f81b03198616600160f81b141580612553575b61244b576124e286613b20565b6001600160a01b036124f6611f4988611ea2565b1615612505575b505050505050565b612548956123ed61252b5f516020615fdf5f395f51905f525463ffffffff9060a81c1690565b926123b66040519461253e604087610fe3565b63ffffffff168552565b5f80808080806124fd565b506001600160f81b03198616600160f91b14156124d5565b9060405161257881610f71565b82546001600160a01b03908116825260019390930154928316602082015260589290921b6001600160f81b0319166040830152565b95909491939092337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580612721575b156127135761260a6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f916126f4575b50156106625760405163d68f602560e01b8152966001600160a01b039190911695905f888061266836343360048501612164565b0381838b5af19788156107dc575f986126d4575b50612688969798613f2d565b803b1561023257604051630b9dfbed60e11b8152915f9183918290849082906126b490600483016121ad565b03925af180156107dc576126c6575b50565b806107d65f61024193610fe3565b6126889798506126ed903d805f833e6107fa8183610fe3565b979661267c565b61270d915060203d602011610831576108238183610fe3565b5f612634565b919390929461024196613f2d565b50303314156125e7565b9160206120b9938181520191612144565b356bffffffffffffffffffffffff1981169291906014821061275c575050565b6bffffffffffffffffffffffff1960149290920360031b82901b16169150565b9091600182036128f8575f516020615f9f5f395f51905f5293906054600160f81b600160581b600160f81b03605887901b1617916127c66127bc84611ea2565b5463ffffffff1690565b5f516020615fdf5f395f51905f525460a81c63ffffffff169063ffffffff8083169116146128e0575b5061285861283161070561282b61282561281e5f516020615fdf5f395f51905f525463ffffffff9060a81c1690565b9886611d59565b9061273c565b60601c90565b61284861283c611004565b63ffffffff9097168752565b6001600160a01b03166020860152565b612883601482019461286a8680612006565b61287a6034869493940189612006565b93909288613b86565b019160046128918483612006565b9050146128bf575b5050505b604080519182526001600160a01b03909216602082015290819081015b0390a1565b61053061052a6128d8946128d293612006565b90614376565b5f8080612899565b6128f29060010163ffffffff16612288565b5f6127ef565b6002820361296057806129555f516020615f9f5f395f51905f5295603461292f61070561282b612825601461295b99019588611d59565b9361294e8561293e8580612006565b906001600160a01b038c166142e5565b0190612006565b91614122565b61289d565b600382036129d657806129555f516020615f9f5f395f51905f529560386129ce61070561282b612825601861295b9901956129c88c8a6129b661070561282b612825876129b06105308288611d1d565b95611d48565b6129c08b80612006565b939092613f9a565b88611d48565b930190612006565b600482148015612a74575b8015612a6a575b15612a5b576001600160a01b03831693843b1561023257612a22945f92836040518098819582946306d61fe760e41b84526004840161272b565b03925af19283156107dc575f516020615f9f5f395f51905f5293612a47575b5061289d565b806107d65f612a5593610fe3565b5f612a41565b631092ef5760e11b5f5260045ffd5b50600682146129e8565b50600582146129e1565b359060208110612a8c575090565b5f199060200360031b1b1690565b929192612aa6826120c7565b91612ab46040519384610fe3565b829481845281830111610232578281602093845f960137010152565b909160018203612b41575f516020615fbf5f395f51905f5293612b1f91612b1991612b10600160f81b600160581b600160f81b03605889901b16176144a9565b505b3691612a9a565b83614509565b50604080519182526001600160a01b03909216602082015290819081016128ba565b60028203612bb1576001600160a01b038381165f9081527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b866020526040902080546001600160a01b031981169091555f516020615fbf5f395f51905f5295612b1f93612b19939092165b50612b12565b919060038103612bd6575050610530612bd292612bcd92611d1d565b614445565b5050565b909160048203612c5f57612b19612b1f915f516020615fbf5f395f51905f5295612c0e5f516020615fdf5f395f51905f525460581b90565b612c1a611f4982611ea2565b6001600160a01b03888116911614612c325750612b12565b612c3e612c5991611ea2565b8054640100000000600160c01b031916640100000000179055565b5f612bab565b600582148015612cf0575b15612a5b575f516020615fdf5f395f51905f525460581b612c94612c8e8684611d67565b90612a7e565b906001600160f81b03198116600160f91b14612cc8575b5050612b19612b1f915f516020615fbf5f395f51905f5295612b12565b60081b6001600160e01b03191614612ce1575f80612cab565b6313002bdd60e31b5f5260045ffd5b5060068214612c6a565b60405190612d0782610fac565b5f6020838281520152565b612d26818060081b918160301b9160501b90565b929091906001600160f81b03198116600160f81b14159081612dd6575b81612dc1575b81612da8575b50611fd35760ff60f81b16600160f81b8114159081612d9e575b50612d98576001600160e01b031916612d93576001600160501b031916612d8f57600190565b5f90565b505f90565b50505f90565b905015155f612d69565b6001600160f81b031916607f60f91b141590505f612d4f565b6001600160f81b031980821614159150612d49565b6001600160f81b0319811615159150612d43565b9094939291612df8826144a9565b916001600160f81b03198116600160f81b03612e70575f516020615fbf5f395f51905f5291612e46612e406102419899612e689460018060a01b039060581c16933691612a9a565b82614509565b5060408051600181526001600160a01b03909216602083015290918291820190565b0390a161490f565b9294919290506001600160f81b03198116600160f91b0361244b5760081b92612e988461206e565b94612ea38780614880565b949050600187019460018654010361306e5794956001600160e01b0319871695905f5b8654811015612f7c57805f516020615fbf5f395f51905f52612f738c612f51612f43612e408e612f318f99612f2b612f1b612f13612f068460019f6148b5565b90549060031b1c60501b90565b908160501c90565b90508c8060a01b03169780614880565b906122cd565b604094919451948593602085016148ca565b03601f198101835282610fe3565b5060408051600581526001600160a01b03909216602083015290918291820190565b0390a101612ec6565b509194509296612ff761300a916130056130699598612fa86001612fa26102419d61206e565b016148df565b8554612fe590612fc39060101c6001600160a01b0316610705565b93612fda612fd18280614880565b91909280614880565b5f19019290506122cd565b604095919551958693602085016148ca565b03601f198101845283610fe3565b614509565b5080545f516020615fbf5f395f51905f5290613056906130359060101c6001600160a01b0316610705565b60408051600681526001600160a01b03909216602083015290918291820190565b0390a180546001600160b01b0319169055565b61490f565b63013dcc8d60e31b5f5260045ffd5b906126c39291614661565b60071115612d8f57600190565b612f439061317f906130b06001600160a01b03823516610705565b906131516020820135612f436130d26130cc6040860186612006565b9061499a565b936130e36130cc6060830183612006565b90608081013560a0820135906131056130cc60c08501359460e0810190612006565b93604051988997602089019b8c94919260e0969399989794919961010087019a60018060a01b03168752602087015260408601526060850152608084015260a083015260c08201520152565b51902060408051602081019283526001600160a01b03909516908501525f6060850152929182906080820190565b51902090565b7f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460408051338152346020820152a1565b6131d26131cd5f356001600160e01b031916612038565b61256b565b80516001600160a01b03906131e8908216610705565b16156133265780516060906001600160a01b0316806002600160a01b031981016133045750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610662575b60408201516001600160f81b031916806132c45750602082015161326b906001600160a01b03166149a5565b92905b156132bc57516001600160a01b031690600182141582816132a8575b50613298575b825160208401f35b6132a191613eb4565b5f80613290565b6001600160a01b039150811614155f61328a565b825160208401fd5b6001600160f81b0319908116036132f55760208201516132ee906001600160a01b03163690613e6a565b929061326e565b632d6a6bb760e01b5f5260045ffd5b600103613312575b5061323f565b613320915036903490613deb565b5f61330c565b631cd4b64760e21b5f5260045ffd5b6001600160a01b03165f9081527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b866020526040902090565b9081602091031261023257516120b981610bec565b9161338c916149e7565b919080836001600160f81b03198416156135ae575b60208110159182613577575b82613561575b50506133c161043184611ea2565b60208101516001600160a01b03906133da908216610705565b16158061354e575b6104f2576001600160f81b0319841615159081613515575b506105f9576001600160f81b03198316600160f81b0361348e5790613426602094939261344496614a39565b604051637aa8f17760e11b8152958694859384933360048601612189565b039160581c6001600160a01b03165afa9081156107dc575f91613465575090565b6120b9915060203d602011613487575b61347f8183610fe3565b81019061336d565b503d613475565b92916001600160f81b03198116600160f91b036134ee5760081b93600160f11b6134d16134c46134bd8861206e565b5460f01b90565b6001600160f01b03191690565b166134df576120b994614b77565b635b71057960e01b5f5260045ffd5b929391929091906001600160f81b03191661244b576120b99361351091614a39565b614a93565b5163ffffffff16905063ffffffff6135456106385f516020615fdf5f395f51905f525463ffffffff9060c81c1690565b9116105f6133fa565b506001600160f81b0319841615156133e2565b8192955061356f9350611d75565b925f806133b3565b91507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a6135a7612c8e8385611d67565b14916133ad565b92506135c85f516020615fdf5f395f51905f525460581b90565b926133a1565b90818060081b9160ff839260f01c166002146135e657565b6001600160d81b031983169150565b9080601f83011215610232578160206120b993359101612a9a565b9190916101208184031261023257613626611013565b9261363082610236565b84526020820135602085015260408201356001600160401b038111610232578161365b9184016135f5565b604085015260608201356001600160401b038111610232578161367f9184016135f5565b60608501526080820135608085015260a082013560a085015260c082013560c085015260e08201356001600160401b03811161023257816136c19184016135f5565b60e08501526101008201356001600160401b038111610232576136e492016135f5565b610100830152565b90816020910312610232575190565b80516001600160a01b031682526120b9916020820151602082015261010061377c61374c61373a60408601516101206040870152610120860190610d6e565b60608601518582036060870152610d6e565b6080850151608085015260a085015160a085015260c085015160c085015260e085015184820360e0860152610d6e565b92015190610100818403910152610d6e565b9392916137ab9060409286526060602087015260608601906136fb565b930152565b9291906137ab6020916040865260408601906136fb565b9290925f926137d63682613610565b916137e5610100830183612006565b918193835f93602082101580613a26575b6139e7575b5050506001600160f81b031916600160f81b145b6139c0575b506001600160f81b03198616600160f81b036138ab575050604051639700320360e01b815293602092859283915f91839161385291600484016137b0565b039260581c6001600160a01b03165af19081156107dc576120b9925f9261387a575b50615053565b61389d91925060203d6020116138a4575b6138958183610fe3565b8101906136ec565b905f613874565b503d61388b565b909491939092916001600160f81b03198116600160f91b0361395c5760081b93600160f01b6138df6134c46134bd8861206e565b1661394d575f6138ff6138f960209661392999858a614e64565b94615053565b604051630ccab7a160e01b8152979096889586948593926001600160e01b0319166004850161378e565b03926001600160a01b03165af19081156107dc576120b9925f9261387a5750615053565b6314b9743f60e01b5f5260045ffd5b919350506001600160f81b03191661244b576139b190630b135d3f60e11b9361351063ffffffff60e01b946020527b19457468657265756d205369676e6564204d6573736167653a0a33325f52603c60042090565b16036139bb575f90565b600190565b916139cd93955086614c2c565b9193916139db368284612a9a565b6101008401525f613814565b9195509250829196506139fa9350611d75565b9091613a07368385612a9a565b61010085015261380f613a1d6001923390613095565b95905f806137fb565b507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a613a55612c8e8484611d67565b146137f6565b5f516020615fdf5f395f51905f5254600a63ffffffff8260a81c16019063ffffffff8211613b0c5763ffffffff83811692168211613afd57613aa59060c81c63ffffffff16610638565b10156105f9575f516020615fdf5f395f51905f52805463ffffffff60c81b60c893841b1663ffffffff60c81b1990911617908190559081901c63ffffffff9081169160a81c168111613af45750565b61024190612288565b63e60fd64760e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b60207f6789ec0c85d6458d897a36a70129b101f8b4d84c6e218046c3107373dbcbae88918060581c6001600160581b0360a81b5f516020615fdf5f395f51905f525416175f516020615fdf5f395f51905f5255604051906001600160581b0319168152a1565b929490939193613b986127bc85611ea2565b5f516020615fdf5f395f51905f525460a81c63ffffffff169063ffffffff808316911614613d8f575b506020810180516001600160a01b031615613d86575b5f516020615fdf5f395f51905f525460a81c63ffffffff1663ffffffff613c05610638855163ffffffff1690565b911614801590613d5a575b6105f957613c5e613c6b92613c2487611ea2565b815181546020938401516001600160c01b031990911663ffffffff9290921691909117921b640100000000600160c01b0316919091179055565b516001600160a01b031690565b915f196001600160a01b03841601613d49575b5050506001600160f81b03198116600160f81b03613d265760581c6001600160a01b031690813b15610232576040516306d61fe760e41b8152925f9184918291613ccc91906004840161272b565b038183855af19081156107dc575f516020615f9f5f395f51905f52926128ba92613d12575060408051600181526001600160a01b03909216602083015290918291820190565b806107d65f613d2093610fe3565b5f612e46565b91506001600160f81b03198216600160f91b0361244b576102419160081b6151a6565b613d5292614122565b5f8080613c7e565b50613d676127bc86611ea2565b63ffffffff613d7d610638855163ffffffff1690565b91161015613c10565b60018152613bd7565b613da19060010163ffffffff16612288565b5f613bc1565b6040908151613db68382610fe3565b600681526512d95c9b995b60d21b602082015291613dd681519182610fe3565b6005815264181719971960d91b602082015290565b91613e12925f8080946040519687958694859363d68f602560e01b85523360048601612189565b03926001600160a01b03165af19081156107dc575f91613e30575090565b6120b991503d805f833e6107fa8183610fe3565b5f9283613e1295936040519687958694859363d68f602560e01b85523360048601612189565b5f9060405192808385378338925af4913d82523d5f602084013e60203d830101604052565b5f9192806040519485378338925af4913d82523d5f602084013e60203d830101604052565b6001600160a01b0316803b1561023257604051630b9dfbed60e11b815260206004820152915f918391829084908290613ef1906024830190610d6e565b03925af180156107dc57613f025750565b5f61024191610fe3565b8051156122e45760200190565b80518210156122e45760209160051b010190565b909593919492965f5b87811015613f8657600190613f808a89613f6c8489613f65828060051b8c013595613f6087610986565b613f19565b51946122cd565b90613f78868d8d6122cd565b949093613b86565b01613f36565b509650505050505050565b90156122e45790565b9293929091906001600160a01b03821615614113575b613fb990612038565b93613fe5613fd8613fca8684613f91565b356001600160f81b03191690565b6001600160f81b03191690565b936001600160f81b031985166140eb576001600160a01b0384169161400c91908190611d92565b823b1561023257614036925f92836040518096819582946306d61fe760e41b84526004840161272b565b03925af19485156107dc5761409a6140ba93600193610241986140d7575b5060408051600381526001600160a01b03881660208201525f516020615f9f5f395f51905f529190a15b82546001600160a01b0319166001600160a01b03909116178255565b0180546001600160a01b0319166001600160a01b03909316929092178255565b805460ff60a01b191660589290921c60ff60a01b16919091179055565b806107d65f6140e593610fe3565b5f614054565b50909390506001600160f81b0319808416036132f55760016140ba9161409a6102419661407e565b6001600160a01b039150613fb0565b6001600160a01b03169190821580156142db575b6142d65760405163d60b347f60e01b8152306004820152602081602481875afa9081156107dc575f916142b7575b506141fb57908061417492611d92565b9190813b15610232576040516306d61fe760e41b8152925f918491829161419f91906004840161272b565b038183855af19081156107dc575f516020615f9f5f395f51905f52926128ba926141e7575b505b60408051600481526001600160a01b03909216602083015290918291820190565b806107d65f6141f593610fe3565b5f6141c4565b81151580614298575b614222575b50506128ba5f516020615f9f5f395f51905f52916141c6565b908061422d92611d92565b9190813b15610232576040516306d61fe760e41b8152925f918491829161425891906004840161272b565b038183855af19081156107dc575f516020615f9f5f395f51905f52926128ba92614284575b5091614209565b806107d65f61429293610fe3565b5f61427d565b506001600160f81b0319806142b0613fca8585613f91565b1614614204565b6142d0915060203d602011610831576108238183610fe3565b5f614164565b505050565b5060018314614136565b926142f0908461549e565b8161433f5750505f80916040518260208201916306d61fe760e41b835261432981612f4360248201604090602081525f60208201520190565b51926001600160a01b03165af1506126c36122f6565b6001600160a01b039092169190823b15610232576126b4925f92836040518096819582946306d61fe760e41b84526004840161272b565b7f9d17cd6d095ac90a655405ab29f30a7ee7e88ef3974c1bf7544bf591043bb71a916060916143a882610cea83611ed9565b600160ff198254161790556040519163ffffffff60e01b1682526001600160581b031916602082015260016040820152a1565b907f9d17cd6d095ac90a655405ab29f30a7ee7e88ef3974c1bf7544bf591043bb71a9260609261440e83610cea83611ed9565b9115159160ff1981541660ff84161790556040519263ffffffff60e01b1683526001600160581b03191660208301526040820152a1565b61444f5f91612038565b80546001600160a01b031981168255600190910180546001600160a01b0390921693916001600160f81b0319605882901b1615614498575b5080546001600160a81b0319169055565b6001600160a01b031692505f614487565b906001600160581b03195f516020615fdf5f395f51905f525460581b166001600160581b0319831614612ce1576144f56001600160a01b036144ea84611ea2565b5460201c1692611ea2565b8054640100000000600160c01b0319169055565b91907f2b82f87bf66300af618a9621d3f221edfab735f5bacb4e004cce1b62375396c3905a905f80604051936145698561455b6020820196638a91b0e360e01b88526020602484018181520190610d6e565b03601f198101875286610fe3565b60405193614578602086610fe3565b828552602085019583908a905f368a375193f1913d90816145bf575b815f9293523e604080516001600160a01b0390951685528115156020860152909390819081016128ba565b5f9150614594565b604080519091906145d88382610fe3565b6001815291601f1901825f5b8281106145f057505050565b8060606020809385010152016145e4565b9061460b82611023565b6146186040519182610fe3565b8281528092614629601f1991611023565b01905f5b82811061463957505050565b80606060208093850101520161462d565b9060406120b9925f81528160208201520190610d6e565b600881901b9291906001600160f81b03198116600160f81b036146f4575090614689916155ca565b90916001600160f81b031981166146a457506120b9916156e2565b6001600160f81b031916600160f81b036146c1576120b991615636565b60405162461bcd60e51b815260206004820152600b60248201526a155b9cdd5c1c1bdc9d195960aa1b6044820152606490fd5b9293926001600160f81b031981166147ac5750906147119161554c565b9161471a6145c7565b956001600160f81b03198116614747575061473493615594565b61473d83613f0c565b526126c382613f0c565b6001600160f81b031916600160f81b036146c1576147649361556d565b61476d84613f0c565b52610241577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76128ba61479f84613f0c565b516040519182918261464a565b909391906001600160f81b0319908116036146c1576147d66147dc916147d06145c7565b95615524565b91613e8f565b6147e885939293613f0c565b526001600160f81b03198116600160f81b0361483357501561480657565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76128ba61479f84613f0c565b6001600160f81b0319166146c1576102415760405162461bcd60e51b815260206004820152601360248201527211195b1959d85d1958d85b1b0819985a5b1959606a1b6044820152606490fd5b903590601e198136030182121561023257018035906001600160401b03821161023257602001918160051b3603831361023257565b80548210156122e4575f5260205f2001905f90565b9092809260209483528483013701015f815290565b8054905f8155816148ee575050565b5f5260205f20908101905b818110614904575050565b5f81556001016148f9565b9091906001600160a01b031680158015614990575b6142d65781156122e4575f516020615fbf5f395f51905f52926128ba926001600160f81b03198235811614614977575b505060408051600481526001600160a01b03909216602083015290918291820190565b612b1281612e409261498894611d92565b505f80614954565b5060018114614924565b816040519182372090565b5f809160405136810160405236838237604051601481016040523360601b90528260143601925af190604051903d82523d5f602084013e60203d830101604052565b9182358060f81c805f14614a2b5780600114614a1e57600214614a08575f80fd5b6001600160d81b03191692600501916004190190565b5092601501916014190190565b505060015f9301915f190190565b60405160208101917f1547321c374afde8a591d972a084b071c594c275e36724931ff96c25f2999c838352604082015260408152614a78606082610fe3565b5190209015614a8a576120b990615854565b6120b990615742565b9190614aa0913691612a9a565b604051916020820191805180604014614b2b57604114614acd5750505050505b638baa579f5f526004601cfd5b80606060409201515f1a60205201516060525b5f52516040526020600160805f825afa51905f6060526040523d614b05575050614ac0565b6001600160a01b03163003614b1f57630b135d3f60e11b90565b6001600160e01b031990565b506040015160ff81901c601b016020526001600160ff1b0316606052614ae0565b90926080926120b99694835260018060a01b0316602083015260408201528160608201520191612144565b614b9065ffffffffffff929594614b9c948733856158c9565b97929491959095615993565b5091164210908115614c1a575b50614c0757602094614bba91614a39565b60405163392dffaf60e01b815295869485938493614be993929133906001600160e01b03191660048701614b4c565b03916001600160a01b03165afa9081156107dc575f91613465575090565b506001600160e01b031995945050505050565b65ffffffffffff91501642115f614ba9565b9190939293601481019160141161023257803560601c92829190614c4e612cfa565b6001600160a01b03909516602086019081529490614cad614c716127bc83611ea2565b5f516020615fdf5f395f51905f525460a81c63ffffffff169063ffffffff808316911603614e125760010163ffffffff165b63ffffffff168352565b815163ffffffff1695516001600160a01b031697614ccb8580612006565b614cd49161499a565b986034850199614ce48b88612006565b614ced9161499a565b906054870199614cfd8b8a612006565b614d069161499a565b604080517fb17ab1224aca0d4255ef8161acaf2ac121b8faa32a4b2258c912cc5f8308c505602082019081526001600160581b03198a169282019290925263ffffffff9390931660608401526001600160a01b0395909516608083015260a082019290925260c081019290925260e0808301919091528152614d8a61010082610fe3565b519020905f1461052a6102ab98614deb60949861294e97614dcc6128d29761053097614e0457614db990615854565b614dc660748d0185612006565b91615c58565b9e614de2614dda8480612006565b929094612006565b9390928a613b86565b614dfe614df8828b612006565b90615dd2565b88612006565b614e0d90615742565b614db9565b614ca3565b356001600160c01b0319811692919060088210614e32575050565b6001600160c01b031960089290920360031b82901b16169150565b6040906120b99392815281602082015201906136fb565b93929190935f926001614e768361206e565b015f5b8154811015614ff757614e92612f13612f0683856148b5565b939095614eb4614eae614ea8613fca8585613f91565b60f81c90565b60ff1690565b808403614fc95750908181614eed614ee1614edb614ed584614f0b98611dae565b90614e17565b60c01c90565b6001600160401b031690565b600901918c610100614f03612b12868686611dbf565b910152611e54565b939093955b600160f01b1615614f28575b50600101939193614e79565b604051633894f6e760e11b81529196906020908390815f81614f588f6001600160e01b03198d1660048401614e4d565b03926001600160a01b03165af19182156107dc575f92614fa9575b506001600160a01b038216614f9557600191614f8e91615053565b9590614f1c565b631f24c1fb60e11b5f52600487905260245ffd5b614fc291925060203d81116138a4576138958183610fe3565b905f614f73565b9196909491831115614fe457630760bdcf60e11b5f5260045ffd5b614fec612211565b6101008b0152614f10565b505091929460ff8061500f614ea8613fca8789613f91565b16036150445761010061502c612b1285615034966120b998611d92565b91015261206e565b5460101c6001600160a01b031690565b63b32eeb6960e01b5f5260045ffd5b908082186001600160a01b031615606083811b838501821b9081149184901b141717600114615083575050600190565b65ffffffffffff60a01b8216916001600160d01b03198082169083168415615103575b65ffffffffffff60a01b841680156150f3575b8581109086180280861895146150e2575b81811190821802189160018060a01b03911716171790565b65ffffffffffff60a01b94506150ca565b5065ffffffffffff60a01b6150b9565b65ffffffffffff60a01b94506150a6565b356001600160501b031981169291906016821061512f575050565b6001600160501b031960169290920360031b82901b16169150565b805468010000000000000000811015610f8c5761516c916001820181556148b5565b819291549060031b9160501c821b9160018060b01b03901b1916179055565b356001600160f01b031981169291906002821061226d575050565b91906151b29080614880565b9260fe84118015615496575b6154875760016151cd8261206e565b0154615474575b5f1984015f5b818110615336575090615299615292838761523261528361526a6134c461526461525e87612ff79e9f8e6152596152b59f8f9061070561282b61282561522461522a9489896122cd565b90611dea565b9a8b9161206e565b805462010000600160b01b03191660109290921b62010000600160b01b0316919091179055565b6122cd565b90611e18565b9061518b565b6152738861206e565b9060f01c61ffff19825416179055565b6001600160a01b0316966122cd565b8091611dfb565b6040519586939092906001600160e01b031916602085016148ca565b803b15610232575f6152db92604051809481926306d61fe760e41b8352600483016121ad565b038183855af19081156107dc575f516020615f9f5f395f51905f52926128ba92615322575b5060408051600681526001600160a01b03909216602083015290918291820190565b806107d65f61533093610fe3565b5f615300565b6153d19061537c60016153488661206e565b0161537661536961536361535d868d8c6122cd565b90611ddc565b90615114565b6001600160501b03191690565b9061514a565b61539661070561070561282b612825615224868d8c6122cd565b6153a4615292838a896122cd565b604051949185916153c3916001600160e01b03198a16602085016148ca565b03601f198101855284610fe3565b803b15610232576040516306d61fe760e41b8152925f9184918290849082906153fd90600483016121ad565b03925af19182156107dc57600192615460575b505f516020615f9f5f395f51905f5261545761543661282b612825615224868d8c6122cd565b60408051600581526001600160a01b03909216602083015290918291820190565b0390a1016151da565b806107d65f61546e93610fe3565b5f615410565b6154826001612fa28361206e565b6151d4565b63b62d956d60e01b5f5260045ffd5b5083156151be565b5f516020615f9f5f395f51905f52916040916001600160a01b0382161561551b575b6001600160a01b039081165f8181527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b8660205284902080546001600160a01b03191693909216929092179055815190600282526020820152a1565b600191506154c0565b91601382111561553f57823560601c92601401916013190190565b63ba597e7e5f526004601cfd5b90603381111561553f57813560601c92601483013592603401916033190190565b905f928491604051958692833738935af1913d82523d5f602084013e60203d830101604052565b90925f92819594604051968792833738935af1156155c1573d82523d5f602084013e60203d830101604052565b503d5f823e3d90fd5b918235826020118160401c1761553f5783016020810193813593846155ee57505050565b01601f190190835b5f190160208160051b8301013580830160608101908135809101918680602080860135809601011191111792171760401c1761553f57806155f657505050565b919061564181614601565b925f5b82811061565057505050565b8061567a60019260051b84013584016040810135810190602082359201906020810135903561556d565b6156848389613f19565b5215615691575b01615644565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76156da6156bf8389613f19565b51604051918291858352604060208401526040830190610d6e565b0390a161568b565b91906156ed81614601565b925f5b8281106156fc57505050565b8061572660019260051b840135840160408101358101906020823592019060208101359035615594565b6157308288613f19565b5261573b8187613f19565b50016156f0565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f0000000000000000000000000000000000000000000000000000000000000000461416156157cd575b6719010000000000005f52601a52603a526042601820905f603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f00000000000000000000000000000000000000000000000000000000000000006040820152466060820152306080820152206157b0565b60a061585e613da7565b90602081519101209060208151910120604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8352602083015260408201525f6060820152306080820152206719010000000000005f52601a52603a526042601820905f603a52565b9491848461594a9296959396604051906158e282610fc7565b5f82525f602083015260408201995f8b52615944606084019a8b925f84525f60808701525f60a0870152606060c087015261593560e08701915f83526101008801955f87529063ffffffff60e01b169052565b6001600160a01b039091169052565b526159ea565b60ff8061595d614ea8613fca8786613f91565b160361504457615034615977846159879561598c94611d92565b9490955163ffffffff60e01b1690565b61206e565b9351929190565b8065ffffffffffff8260a01c169182156001146159b1575b60d01c92565b65ffffffffffff92506159ab565b90926080926120b99594835260018060a01b0316602083015260408201528160608201520190610d6e565b9160608301906001615a3f615a06845163ffffffff60e01b1690565b6001600160e01b0319165f9081527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f8526020526040902090565b01805493905f5b858110615a565750505050505050565b615a66612f13612f0683856148b5565b6001600160a01b031660a0890190815260808901949091615a8f906001600160f01b0319168652565b615aa9615aa2614ea8613fca8985613f91565b60ff168a52565b615ab7614eae8a5160ff1690565b808403615c265750858181615adc614ee1614edb614ed5615b319b9c615b0498611dae565b8c60c0615af7612b1260208401948086526009018688611dbf565b9101525160090191611e54565b949094955b51600160f11b90615b23906001600160f01b0319166134c4565b166001600160f01b03191690565b15615b40575b50600101615a46565b51615b53906001600160a01b0316610705565b6020615b79615b6c615b6c895163ffffffff60e01b1690565b6001600160e01b03191690565b60e08a01516101008b015160c08c015160405163184dfdbb60e11b8152958694909385938493615bb89390926001600160a01b031690600486016159bf565b03915afa9081156107dc575f91615c08575b506001600160a01b038116615bf45790600191615bec60408a01918251615053565b905290615b37565b631f24c1fb60e11b5f52600482905260245ffd5b615c20915060203d81116138a4576138958183610fe3565b5f615bca565b909490831115615c3f57630760bdcf60e11b5f5260045ffd5b615b3190615c4e365f88612a9a565b60c08b0152615b09565b5f516020615fdf5f395f51905f52545f9493929060581b6001600160f81b03198116600160f81b03615d135791615cb89391615c9961070560209560581c90565b9160405195869485938493637aa8f17760e11b85523060048601612189565b03915afa9081156107dc575f91615cf4575b505b6001600160e01b0319166374eca2c160e11b01615ce557565b6362467c7760e11b5f5260045ffd5b615d0d915060203d6020116134875761347f8183610fe3565b5f615cca565b90949192916001600160f81b03198216600160f91b03615db45750602091615d419160081b958430886158c9565b60405163392dffaf60e01b81529297929586949385938493615d7493909230906001600160e01b03191660048701614b4c565b03916001600160a01b03165afa9081156107dc575f91615d95575b50615ccc565b615dae915060203d6020116134875761347f8183610fe3565b5f615d8f565b94906001600160f81b03191661244b57615dcd92614a93565b615ccc565b615ddf6105308383611d1d565b91602c8110615f8257602c820190615e0061070561282b6128258487611d48565b615e2a615e1c613fd8613fca615e168780612006565b90613f91565b6001600160f81b0319161590565b80615edd575b61070561282b61282585615e856102419a87615e6961070561282b6128258f9d6129559f9e8f604c9f6129ce9f615e8b575b5050611e43565b615e738b80612006565b9390926001600160a01b031690613f9a565b88611e43565b612955615ecf615ed693606c860190615eca615eb961070561282b612825615eb38787612006565b90611d59565b9586906001600160a01b031661549e565b612006565b8091611e26565b8f87615e62565b5060405163ecd0596160e01b81526002600482015290949291906020816024816001600160a01b038a165afa9384156107dc5761282b61282584615e85610705948b615e6961070561282b6102419f8f9c6129559f9d8f604c9f936129ce9f94612825955f91615f63575b509f50505050505050505097509a5050959650505050615e30565b615f7c915060203d602011610831576108238183610fe3565b5f615f48565b90506004915003615f8f57565b637a210a5d60e11b5f5260045ffdfed21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x24", + "chainId": "0xde9fb" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xbd52b9839fe97264d39c685282605a51a795adcc89afa3a375f26ea62e92bef7", + "transactionType": "CREATE2", + "contractName": "KernelFactory", + "contractAddress": "0xe30c76dc9ecf1c19f6fec070674e1b4effe069fa", + "function": null, + "arguments": [ + "0xE264dCCc54e4b6906c0D1Fee11D4326c06D33c80" + ], + "transaction": { + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x5d17a", + "value": "0x0", + "input": "0x000000000000000000000000000000000000000000000000000000000000000060a034607357601f61044238819003918201601f19168301916001600160401b03831184841017607757808492602094604052833981010312607357516001600160a01b03811681036073576080526040516103b6908161008c823960805181818160c60152818161021d01526102d80152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816348aac39214610250575080635c60da1b146102085763ea6d13ac1461003d575f80fd5b6100463661033f565b60405161006c602080838181019587898837878201908382015203018084520182610394565b519020905f92604051927fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f60212060358501523060581b845260ff84538060158501526055842094341591863b156101eb5750506001906101e6575f38818034895af1156101d9575b836040525f60605215610157575b6040516001600160a01b0385168152602090f35b9180825f9493859483378101838152039082855af13d156101d4573d67ffffffffffffffff81116101c0576040519061019a601f8201601f191660200183610394565b81525f60203d92013e5b156101b1575f8080610143565b63487e630960e11b5f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b6101a4565b63b12d13eb5f526004601cfd5b610135565b91509450605f602134f593846101355763301164255f526004601cfd5b3461024c575f36600319011261024c576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b3461024c57806102826020806102653661033f565b908084889499019889378201908382015203018084520182610394565b5190206040517fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f602120906040525f60605260ff5f536035523060601b600152601552602060555f205f6035526040519060018060a01b03168152f35b90604060031983011261024c5760043567ffffffffffffffff811161024c578260238201121561024c5780600401359267ffffffffffffffff841161024c576024848301011161024c57602401919060243590565b90601f8019910116810190811067ffffffffffffffff8211176101c05760405256000000000000000000000000e264dccc54e4b6906c0d1fee11d4326c06d33c80", + "nonce": "0x25", + "chainId": "0xde9fb" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x22b35ccd1a06a49663d1ac944af7d7088bc3e38b47b684fb1982d7c8d1ed03fc", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xd703aae79538628d27099b8c4f621be4ccd142d5", + "function": "approveFactory(address,bool)", + "arguments": [ + "0xE30c76Dc9eCF1c19F6Fec070674E1b4eFfE069FA", + "true" + ], + "transaction": { + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0xd703aae79538628d27099b8c4f621be4ccd142d5", + "gas": "0x108d1", + "value": "0x0", + "input": "0x6e7dbabb000000000000000000000000e30c76dc9ecf1c19f6fec070674e1b4effe069fa0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x26", + "chainId": "0xde9fb" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x5323c6", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xa5b9286c1b5263c88f07f9f1405716db0b6a2d16c1bb9d30620ed490729b8f48", + "transactionIndex": "0x1", + "blockHash": "0xb95b3d7cb4067e8ff088b723b662acf9d84ba6083244db900732e9b27adbbb6b", + "blockNumber": "0xb5ab4b", + "gasUsed": "0x52786c", + "effectiveGasPrice": "0xfd", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0xe264dccc54e4b6906c0d1fee11d4326c06d33c80", + "l1BaseFeeScalar": "0xa6fe0", + "l1BlobBaseFee": "0xa814af", + "l1BlobBaseFeeScalar": "0x0", + "l1Fee": "0x45b70ef17277c", + "l1GasPrice": "0x1e24f8068", + "l1GasUsed": "0x36192" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x571e39", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xbd52b9839fe97264d39c685282605a51a795adcc89afa3a375f26ea62e92bef7", + "transactionIndex": "0x2", + "blockHash": "0xb95b3d7cb4067e8ff088b723b662acf9d84ba6083244db900732e9b27adbbb6b", + "blockNumber": "0xb5ab4b", + "gasUsed": "0x3fa73", + "effectiveGasPrice": "0xfd", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0xe30c76dc9ecf1c19f6fec070674e1b4effe069fa", + "l1BaseFeeScalar": "0xa6fe0", + "l1BlobBaseFee": "0xa814af", + "l1BlobBaseFeeScalar": "0x0", + "l1Fee": "0x3b28f697664b", + "l1GasPrice": "0x1e24f8068", + "l1GasUsed": "0x2de8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x57d34c", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x22b35ccd1a06a49663d1ac944af7d7088bc3e38b47b684fb1982d7c8d1ed03fc", + "transactionIndex": "0x3", + "blockHash": "0xb95b3d7cb4067e8ff088b723b662acf9d84ba6083244db900732e9b27adbbb6b", + "blockNumber": "0xb5ab4b", + "gasUsed": "0xb513", + "effectiveGasPrice": "0xfd", + "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", + "to": "0xd703aae79538628d27099b8c4f621be4ccd142d5", + "contractAddress": null, + "l1BaseFeeScalar": "0xa6fe0", + "l1BlobBaseFee": "0xa814af", + "l1BlobBaseFeeScalar": "0x0", + "l1Fee": "0x80de0ab5633", + "l1GasPrice": "0x1e24f8068", + "l1GasUsed": "0x640" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1740499935, + "chain": 911867, + "commit": "9ebc75c" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/911867/run-latest.json b/broadcast/DeployKernel.s.sol/911867/run-latest.json index 25752103..30bccc0a 100644 --- a/broadcast/DeployKernel.s.sol/911867/run-latest.json +++ b/broadcast/DeployKernel.s.sol/911867/run-latest.json @@ -1,10 +1,10 @@ { "transactions": [ { - "hash": "0x3b084e89fe78ec6ad227bc762285f7529a43d605148e6f39a8838818d1bfb674", + "hash": "0xa5b9286c1b5263c88f07f9f1405716db0b6a2d16c1bb9d30620ed490729b8f48", "transactionType": "CREATE2", "contractName": "Kernel", - "contractAddress": "0x8768fa84bd76610acc6af35b578fe847e1cff0ca", + "contractAddress": "0xe264dccc54e4b6906c0d1fee11d4326c06d33c80", "function": null, "arguments": [ "0x0000000071727De22E5E9d8BAf0edAc6f37da032" @@ -12,44 +12,44 @@ "transaction": { "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0x706a31", + "gas": "0x71e987", "value": "0x0", - "input": "0x00000000000000000000000000000000000000000000000000000000000000006101408060405234610203576020816160f580380380916100208285610207565b83398101031261020357516001600160a01b038116810361020357306080524660a05260a0604051610053604082610207565b6006815260208101906512d95c9b995b60d21b825260405191610077604084610207565b60058352602083019164181719971960d91b8352519020915190208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260208301526040820152466060820152306080820152206101005261012052604051602081019063deadbeef60e01b825260048152610101602482610207565b5190516001600160581b031981169190601582106101e3575b7f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f80546001600160a81b031916605885901c179055604051615eb6908161023f823960805181614873015260a05181614896015260c05181614906015260e0518161492c015261010051816148520152610120518181816103b4015281816106bd0152818161086301528181610abf01528181610e3e01528181611156015281816112ca015281816113200152818161184d0152818161197d015281816126b901526131300152f35b6001600160581b031960159290920360031b82901b161690505f8061011a565b5f80fd5b601f909101601f19168101906001600160401b0382119082101761022a57604052565b634e487b7160e01b5f52604160045260245ffdfe6080604052600436101561001d575b36612fde5761001b612fad565b005b5f3560e01c8063112d3a7d1461020c578063150b7a02146102075780631626ba7e1461020257806319822f7c146101fd5780631f1b92e3146101f85780633659cfe6146101f35780633c3b752b146101ee57806352141cd9146101e957806357b3a5f4146101e45780636e6fa0c6146101df578063721e67f4146101da57806384b0196e146101d55780638dd7712f146101d057806390ef8862146101cb5780639198bdf5146101c65780639517e29f146101c15780639cfd7cff146101bc578063a65d69d4146101b7578063a71763a8146101b2578063adb610a3146101ad578063b8afe17d146101a8578063bc197c81146101a3578063c3e589781461019e578063d03c791414610199578063d691c96414610194578063e6f3d50a1461018f578063e9ae5c531461018a578063f1f7f0f914610185578063f23a6e6114610180578063f2dc691d1461017b5763fc9c5dec0361000e57611b32565b611b14565b611aba565b611a84565b611956565b6117d8565b6116f6565b6116a9565b6115d6565b6114c5565b611459565b611427565b6112f9565b6112b5565b61125d565b61112f565b611018565b610f09565b610e0e565b610d70565b610cea565b610c8f565b610bdc565b610a3e565b6109a8565b61082d565b610685565b610380565b61031f565b6102c5565b61029f565b6001600160a01b0381160361022257565b5f80fd5b359061023182610211565b565b9181601f84011215610222578235916001600160401b038311610222576020838186019501011161022257565b6060600319820112610222576004359160243561027c81610211565b91604435906001600160401b0382116102225761029b91600401610233565b9091565b346102225760206102bb6102b236610260565b92919091611d85565b6040519015158152f35b34610222576080366003190112610222576102e1600435610211565b6102ec602435610211565b6064356001600160401b0381116102225761030b903690600401610233565b5050604051630a85bd0160e11b8152602090f35b34610222576040366003190112610222576004356024356001600160401b0381116102225760209161035861035e923690600401610233565b91611f4a565b6040516001600160e01b03199091168152f35b90816101209103126102225790565b6060366003190112610222576004356001600160401b038111610222576103ab903690600401610371565b602435604435917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610652576103ef6020820135613408565b9092919084836001600160f81b0319861615610639575b826104119394613601565b9361043661042661042184611d17565b61214e565b946001600160f81b031916151590565b9384806105f8575b6105e957602001516001600160a01b0316801591819083806105e2575b6104e257600192610476610495925f525f60205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b149081156105da575b501561054d57826104f1575b50506104e257816104cc925b6104d0575b506040519081529081906020820190565b0390f35b3490349034903490335af1505f6104bb565b631a0a9b9f60e21b5f5260045ffd5b61054692506105429161052661052061051a61050f61053b95611d4e565b93606081019061217a565b90611b92565b90611ce1565b63ffffffff60e01b165f5260205260405f2090565b5460ff1690565b1590565b5f806104aa565b829192916105a7575b506104e25761051a81606061056c93019061217a565b638dd7712f60e01b916001600160e01b03199161058891611ce1565b160361059857816104cc926104b6565b63dbbb044b60e01b5f5260045ffd5b6105d4915061053b6105bb61054292611d4e565b6105266105206105ce606088018861217a565b90611b81565b5f610556565b90505f61049e565b508661045b565b633ab3447f60e11b5f5260045ffd5b50805163ffffffff1663ffffffff6106316106285f516020615e965f395f51905f525463ffffffff9060c81c1690565b63ffffffff1690565b91161061043e565b5f516020615e965f395f51905f525460581b9250610406565b6348f5c3ed60e01b5f5260045ffd5b6004359063ffffffff8216820361022257565b359063ffffffff8216820361022257565b602036600319011261022257610699610661565b6106ba6106b45f516020615e965f395f51905f525460581b90565b60581c90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610823575b156108195760405163ecd0596160e01b81526004808201526001600160a01b039190911690602081602481855afa9081156107bd575f916107ea575b50156106525760405163d68f602560e01b8152915f838061074f36343360048501612241565b038183865af19283156107bd575f936107c2575b5061076d9061389c565b803b1561022257604051630b9dfbed60e11b8152915f9183918290849082906107999060048301612266565b03925af180156107bd576107a957005b806107b75f61001b93610fc1565b80610d42565b611f3f565b61076d9193506107e3903d805f833e6107db8183610fc1565b8101906121df565b9290610763565b61080c915060203d602011610812575b6108048183610fc1565b8101906121ac565b5f610729565b503d6107fa565b5061001b9061389c565b50303314156106ed565b60203660031901126102225760043561084581610211565b6108606106b45f516020615e965f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061095c575b156109525760405163ecd0596160e01b81526004808201526001600160a01b039190911690602081602481855afa9081156107bd575f91610933575b50156106525760405163d68f602560e01b8152915f83806108f536343360048501612241565b038183865af19283156107bd575f93610913575b5061076d90612277565b61076d91935061092c903d805f833e6107db8183610fc1565b9290610909565b61094c915060203d602011610812576108048183610fc1565b5f6108cf565b5061001b90612277565b5030331415610893565b6001600160581b031981160361022257565b9181601f84011215610222578235916001600160401b038311610222576020808501948460051b01011161022257565b346102225760a0366003190112610222576004356109c581610966565b6024356109d181610211565b6044356001600160401b038111610222576109f0903690600401610233565b6064939193356001600160401b03811161022257610a12903690600401610233565b91608435956001600160401b03871161022257610a3661001b973690600401610978565b969095612420565b608036600319011261022257600435610a5681610966565b602435610a6281610211565b6044356001600160401b03811161022257610a81903690600401610233565b6064356001600160401b03811161022257610aa0903690600401610233565b91610abc6106b45f516020615e965f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610bc0575b15610bb15760405163ecd0596160e01b81526004808201526001600160a01b03919091169490602081602481895afa9081156107bd575f91610b92575b50156106525760405163d68f602560e01b8152955f8780610b5236343360048501612241565b0381838a5af19687156107bd575f97610b72575b5061076d95969761258f565b61076d969750610b8b903d805f833e6107db8183610fc1565b9695610b66565b610bab915060203d602011610812576108048183610fc1565b5f610b2c565b50919361001b9593919361258f565b5030331415610aef565b6001600160e01b031981160361022257565b34610222576020366003190112610222576104cc610c1d600435610bff81610bca565b5f60408051610c0d81610f4f565b8281528260208201520152611e77565b600160405191610c2c83610f4f565b805460a083901b839003168084529101546001600160a01b0380821660208086019182526001600160f81b031960589490941b84166040968701908152865195841686529151909216918401919091525116918101919091529081906060820190565b3461022257604036600319011261022257602060ff610cde600435610cb381610966565b610cc860243591610cc383610bca565b611d4e565b9063ffffffff60e01b165f5260205260405f2090565b54166040519015158152f35b34610222576020366003190112610222576020610d1f600435610d0c81610211565b5f604051610d1981610f6f565b5261318c565b60405190610d2c82610f6f565b546001600160a01b031690819052604051908152f35b5f91031261022257565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b34610222575f36600319011261022257610daf610dbd610d8e613bce565b604092919251938493600f60f81b855260e0602086015260e0850190610d4c565b908382036040850152610d4c565b4660608301523060808301525f60a083015281810360c083015260206060519182815201906080905f5b818110610df5575050500390f35b8251845285945060209384019390920191600101610de7565b6040366003190112610222576004356001600160401b03811161022257610e39903690600401610371565b6024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610652575f908152602081905260409020546001600160a01b03169060609060018314159081610ed9575b610eae610ea7826060610eb594019061217a565b8091611ba0565b9030613cb6565b5015610eca57610ec157005b61001b91613cdb565b63f21e646b60e01b5f5260045ffd5b9150610eb5610eae610ea7610eff610ef7610ea7606088018861217a565b903489613c6b565b9492505050610e93565b34610222575f36600319011261022257602063ffffffff5f516020615e965f395f51905f525460c81c16604051908152f35b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b03821117610f6a57604052565b610f3b565b602081019081106001600160401b03821117610f6a57604052565b604081019081106001600160401b03821117610f6a57604052565b61012081019081106001600160401b03821117610f6a57604052565b90601f801991011681019081106001600160401b03821117610f6a57604052565b60405190610231604083610fc1565b6040519061023161012083610fc1565b6001600160401b038111610f6a5760051b60200190565b6080366003190112610222576004356001600160401b03811161022257611043903690600401610978565b602435916001600160401b038311610222573660238401121561022257826004013561106e81611001565b9361107c6040519586610fc1565b8185526024602086019260061b8201019036821161022257602401915b8183106110ee575050506044356001600160401b038111610222576110c2903690600401610978565b90606435946001600160401b038611610222576110e661001b963690600401610978565b959094612694565b604083360312610222576020604091825161110881610f8a565b61111186610674565b81528286013561112081610211565b83820152815201920191611099565b61113836610260565b6111536106b45f516020615e965f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611253575b156112485760405163ecd0596160e01b81526004808201526001600160a01b03919091169290602081602481875afa9081156107bd575f91611229575b50156106525760405163d68f602560e01b8152935f85806111e936343360048501612241565b038183885af19485156107bd575f95611209575b5061076d939495612861565b61076d949550611222903d805f833e6107db8183610fc1565b94936111fd565b611242915060203d602011610812576108048183610fc1565b5f6111c3565b509161001b93612861565b5030331415611186565b34610222575f366003190112610222576104cc60405161127e604082610fc1565b601681527535b2b93732b61730b23b30b731b2b2173b181719971960511b6020820152604051918291602083526020830190610d4c565b34610222575f366003190112610222576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b61130236610260565b61131d6106b45f516020615e965f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061141d575b156114125760405163ecd0596160e01b81526004808201526001600160a01b03919091169290602081602481875afa9081156107bd575f916113f3575b50156106525760405163d68f602560e01b8152935f85806113b336343360048501612241565b038183885af19485156107bd575f956113d3575b5061076d939495612b99565b61076d9495506113ec903d805f833e6107db8183610fc1565b94936113c7565b61140c915060203d602011610812576108048183610fc1565b5f61138d565b509161001b93612b99565b5030331415611350565b34610222575f36600319011261022257602063ffffffff5f516020615e965f395f51905f525460a81c16604051908152f35b3461022257602036600319011261022257604061148960043561147b81610966565b611483612d92565b50611d17565b81519061149582610f8a565b5463ffffffff81168083526001600160a01b03602092831c81169383019384528451918252925190921690820152f35b346102225760a0366003190112610222576114e1600435610211565b6114ec602435610211565b6044356001600160401b0381116102225761150b903690600401610978565b50506064356001600160401b0381116102225761152c903690600401610978565b50506084356001600160401b0381116102225761154d903690600401610233565b505060405163bc197c8160e01b8152602090f35b602080825282516001600160f01b03191681830152808301516001600160a01b03166040808401919091529092015160608083015280516080830181905260a09092019201905f5b8181106115b65750505090565b82516001600160501b0319168452602093840193909201916001016115a9565b34610222576020366003190112610222576116156004356115f681610bca565b60606040805161160581610f4f565b5f81525f60208201520152611ead565b60016040519161162483610f4f565b805461ffff60f01b8160f01b168452828060a01b039060101c16602084015201906040519182602082549182815201915f5260205f20905f5b818110611686576104cc858761167581880382610fc1565b604082015260405191829182611561565b825460501b6001600160501b03191684526020909301926001928301920161165d565b346102225760203660031901126102225760206102bb600435612daa565b9060406003198301126102225760043591602435906001600160401b0382116102225761029b91600401610233565b6116ff366116c7565b90916001600160a01b036117123361318c565b54169182156117c957606090600184141594856117b2575b6117349293614552565b926117a2575b50506040518091602082016020835281518091526040830190602060408260051b8601019301915f905b82821061177357505050500390f35b919360019193955060206117928192603f198a82030186528851610d4c565b9601920192018594939192611764565b6117ab91613cdb565b5f8061173a565b61173492506117c2363487613c12565b925061172a565b63710c949760e01b5f5260045ffd5b6060366003190112610222576004356117f081610966565b6024356001600160401b0381116102225761180f903690600401610233565b6044356001600160401b0381116102225761182e903690600401610233565b9061184a6106b45f516020615e965f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061194c575b1561193f5760405163ecd0596160e01b81526004808201526001600160a01b03919091169390602081602481885afa9081156107bd575f91611920575b50156106525760405163d68f602560e01b8152945f86806118e036343360048501612241565b038183895af19586156107bd575f96611900575b5061076d949596612e82565b61076d959650611919903d805f833e6107db8183610fc1565b95946118f4565b611939915060203d602011610812576108048183610fc1565b5f6118ba565b5091909261001b94612e82565b503033141561187d565b61195f366116c7565b61197a6106b45f516020615e965f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611a7a575b15611a6f5760405163ecd0596160e01b81526004808201526001600160a01b03919091169190602081602481865afa9081156107bd575f91611a50575b50156106525760405163d68f602560e01b8152925f8480611a1036343360048501612241565b038183875af19384156107bd575f94611a30575b5061076d929394612e97565b61076d939450611a49903d805f833e6107db8183610fc1565b9392611a24565b611a69915060203d602011610812576108048183610fc1565b5f6119ea565b509061001b92612e97565b50303314156119ad565b34610222575f3660031901126102225760205f516020615e965f395f51905f525460581b604051906001600160581b0319168152f35b346102225760a036600319011261022257611ad6600435610211565b611ae1602435610211565b6084356001600160401b03811161022257611b00903690600401610233565b505060405163f23a6e6160e01b8152602090f35b346102225760203660031901126102225760206102bb600435612ea2565b34610222576040366003190112610222576004356001600160401b03811161022257611b79611b676020923690600401610371565b60243590611b7482610211565b612eaf565b604051908152f35b906008116102225760040190600490565b906004116102225790600490565b909291928360041161022257831161022257600401916003190190565b906020116102225790602090565b90929192836020116102225783116102225760200191601f190190565b906018116102225760040190601490565b906014116102225790601490565b909291928360011161022257831161022257600101915f190190565b906009116102225760010190600890565b909291928360091161022257831161022257600901916008190190565b906016116102225790601690565b906016116102225760020190601490565b909291928360161161022257831161022257601601916015190190565b906002116102225790600290565b909291928360141161022257831161022257601401916013190190565b90602c116102225760180190601490565b90939293848311610222578411610222578101920390565b356001600160e01b0319811692919060048210611cfc575050565b6001600160e01b031960049290920360031b82901b16169150565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85060205260405f2090565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85160205260405f2090565b90929060018103611dd457506001600160a01b0392611dce9250611dbe915060581b600160581b600160f81b0316600160f81b17611d17565b5460201c6001600160a01b031690565b16151590565b60028103611e1457506001600160a01b0392611dce9250611e089150611dfb90841661318c565b546001600160a01b031690565b6001600160a01b031690565b600303611e5457611e35611e30610520600193611e4395611b92565b611e77565b01546001600160a01b031690565b6001600160a01b0390811691161490565b5050505f90565b359060208110611e69575090565b5f199060200360031b1b1690565b63ffffffff60e01b165f527f7c341349a4360fdd5d5bc07e69f325dc6aaea3eb018b3e0ea7e53cc0bb0d6f3b60205260405f2090565b63ffffffff60e01b165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85260205260405f2090565b908160209103126102225751611ef881610bca565b90565b908060209392818452848401375f828201840152601f01601f1916010190565b611ef8949260609260018060a01b0316825260208201528160408201520191611efb565b6040513d5f823e3d90fd5b91611f54916131c4565b919080836001600160f81b031984161561212e575b602081101591826120f1575b826120db575b506001600160a01b039050611f95611e08611dbe86611d17565b1615806120c8575b6104e2576001600160f81b03198316600160f81b036120305790611fc86020949392611fe696613216565b604051637aa8f17760e11b8152958694859384933360048601611f1b565b039160581c6001600160a01b03165afa9081156107bd575f91612007575090565b611ef8915060203d602011612029575b6120218183610fc1565b810190611ee3565b503d612017565b92916001600160f81b03198116600160f91b036120925760081b93600160f11b61207361206661205f88611ead565b5460f01b90565b6001600160f01b03191690565b1661208357611ef8943390613354565b635b71057960e01b5f5260045ffd5b929391929091906001600160f81b0319166120b957611ef8936120b491613216565b613270565b6361c4e91b60e11b5f5260045ffd5b506001600160f81b031983161515611f9d565b819295506120e99350611bcb565b925f80611f7b565b91507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a6121276121218385611bbd565b90611e5b565b1491611f75565b92506121485f516020615e965f395f51905f525460581b90565b92611f69565b9060405161215b81610f8a565b915463ffffffff81168352602090811c6001600160a01b031690830152565b903590601e198136030182121561022257018035906001600160401b0382116102225760200191813603831361022257565b90816020910312610222575180151581036102225790565b6001600160401b038111610f6a57601f01601f191660200190565b602081830312610222578051906001600160401b038211610222570181601f8201121561022257805190612212826121c4565b926122206040519485610fc1565b8284526020838301011161022257815f9260208093018386015e8301015290565b611ef8939260609260018060a01b03168252602082015281604082015201905f611efb565b906020611ef8928181520190610d4c565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556001600160a01b03167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2565b604051906122d9602083610fc1565b5f8252565b90813b5f6122eb826121c4565b936122f96040519586610fc1565b82855260208501903c565b80516020909101516001600160f01b0319811692919060028210612326575050565b6001600160f01b031960029290920360031b82901b16169150565b1561234857565b60405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606490fd5b5f516020615e965f395f51905f52805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b634e487b7160e01b5f52603260045260245ffd5b908210156123df5761029b9160051b81019061217a565b6123b4565b908092918237015f815290565b3d1561241b573d90612402826121c4565b916124106040519384610fc1565b82523d5f602084013e565b606090565b94939291909695966001600160581b031961245961244c5f516020615e965f395f51905f525460581b90565b6001600160581b03191690565b161580612561575b61246a90612341565b6001600160581b03198616156104e2576001600160f81b03198616600160f81b141580612549575b6120b957856124a36124f097613946565b6124c46124ae610fe2565b60018152925b6001600160a01b03166020840152565b5f516020615e965f395f51905f52805463ffffffff60a81b1916600160a81b1790556139ac565b6139ac565b5f5b8181106124fe57505050565b5f8061250b8385876123c8565b9061251b604051809381936123e4565b039082305af16125296123f1565b5015612537576001016124f2565b636534eae560e11b5f5260045260245ffd5b506001600160f81b03198616600160f91b1415612492565b5061246a61ef0160f01b6001600160f01b0319612585612580306122de565b612304565b1614159050612461565b94939291906001600160581b03198616156104e2576001600160f81b03198616600160f81b14158061263a575b6120b9576125c986613946565b6001600160a01b036125dd611dbe88611d17565b16156125ec575b505050505050565b61262f956124eb6126125f516020615e965f395f51905f525463ffffffff9060a81c1690565b926124b460405194612625604087610fc1565b63ffffffff168552565b5f80808080806125e4565b506001600160f81b03198616600160f91b14156125bc565b9060405161265f81610f4f565b82546001600160a01b03908116825260019390930154928316602082015260589290921b6001600160f81b0319166040830152565b959294919390946126b66106b45f516020615e965f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580612806575b156127f75760405163ecd0596160e01b81526004808201526001600160a01b039190911695906020816024818a5afa9081156107bd575f916127d8575b50156106525760405163d68f602560e01b8152965f888061274c36343360048501612241565b0381838b5af19788156107bd575f986127b8575b5061276c969798613d54565b803b1561022257604051630b9dfbed60e11b8152915f9183918290849082906127989060048301612266565b03925af180156107bd576127aa575b50565b806107b75f61023193610fc1565b61276c9798506127d1903d805f833e6107db8183610fc1565b9796612760565b6127f1915060203d602011610812576108048183610fc1565b5f612726565b50919390929461023196613d54565b50303314156126e9565b916020611ef8938181520191611efb565b356bffffffffffffffffffffffff19811692919060148210612841575050565b6bffffffffffffffffffffffff1960149290920360031b82901b16169150565b9091600182036129dd575f516020615e565f395f51905f5293906054600160f81b600160581b600160f81b03605887901b1617916128ab6128a184611d17565b5463ffffffff1690565b5f516020615e965f395f51905f525460a81c63ffffffff169063ffffffff8083169116146129c5575b5061293d612916611e0861291061290a6129035f516020615e965f395f51905f525463ffffffff9060a81c1690565b9886611bf9565b90612821565b60601c90565b61292d612921610fe2565b63ffffffff9097168752565b6001600160a01b03166020860152565b612968601482019461294f868061217a565b61295f603486949394018961217a565b939092886139ac565b01916004612976848361217a565b9050146129a4575b5050505b604080519182526001600160a01b03909216602082015290819081015b0390a1565b61052061051a6129bd946129b79361217a565b9061419d565b5f808061297e565b6129d79060010163ffffffff16612383565b5f6128d4565b60028203612a455780612a3a5f516020615e565f395f51905f52956034612a14611e0861291061290a6014612a4099019588611bf9565b93612a3385612a23858061217a565b906001600160a01b038c1661410c565b019061217a565b91613f49565b612982565b60038203612abb5780612a3a5f516020615e565f395f51905f52956038612ab3611e0861291061290a6018612a40990195612aad8c8a612a9b611e0861291061290a87612a956105208288611b92565b95611be8565b612aa58b8061217a565b939092613dc1565b88611be8565b93019061217a565b600482148015612b59575b8015612b4f575b15612b40576001600160a01b03831693843b1561022257612b07945f92836040518098819582946306d61fe760e41b845260048401612810565b03925af19283156107bd575f516020615e565f395f51905f5293612b2c575b50612982565b806107b75f612b3a93610fc1565b5f612b26565b631092ef5760e11b5f5260045ffd5b5060068214612acd565b5060058214612ac6565b929192612b6f826121c4565b91612b7d6040519384610fc1565b829481845281830111610222578281602093845f960137010152565b909160018203612bf4575f516020615e765f395f51905f5293612bd291600160f81b600160581b600160f81b03605887901b16176143f1565b50604080519182526001600160a01b039092166020820152908190810161299f565b60028203612c1e575f516020615e765f395f51905f5293612b26916001600160a01b03851661436e565b60038203612c565780612c508580612c4a6105205f516020615e765f395f51905f5299612b2697611b92565b93611ba0565b916142c0565b60048203612ce657612cb3612b26915f516020615e765f395f51905f5295612c8c5f516020615e965f395f51905f525460581b90565b612c98611dbe82611d17565b6001600160a01b03888116911614612cb9575b503691612b63565b83614202565b612cc5612ce091611d17565b8054640100000000600160c01b031916640100000000179055565b5f612cab565b60058203612d6b575f516020615e965f395f51905f525460581b612d0d6121218684611bbd565b906001600160f81b03198116600160f91b14612d43575b5050612cb3612b26915f516020615e765f395f51905f52953691612b63565b60081b6001600160e01b03191614612d5c575f80612d24565b6313002bdd60e31b5f5260045ffd5b60068203612b40575f516020615e965f395f51905f525460581b612d0d6121218684611bbd565b60405190612d9f82610f8a565b5f6020838281520152565b612dbe818060081b918160301b9160501b90565b929091906001600160f81b03198116600160f81b14159081612e6e575b81612e59575b81612e40575b50611e545760ff60f81b16600160f81b8114159081612e36575b50612e30576001600160e01b031916612e2b576001600160501b031916612e2757600190565b5f90565b505f90565b50505f90565b905015155f612e01565b6001600160f81b031916607f60f91b141590505f612de7565b6001600160f81b031980821614159150612de1565b6001600160f81b0319811615159150612ddb565b91612e92916102319594936143f1565b614771565b906127a79291614552565b60071115612e2757600190565b612f6b90612fa790612eca6001600160a01b03823516611e08565b90612f796020820135612f6b612eec612ee6604086018661217a565b90614803565b93612efd612ee6606083018361217a565b90608081013560a082013590612f1f612ee660c08501359460e081019061217a565b93604051988997602089019b8c94919260e0969399989794919961010087019a60018060a01b03168752602087015260408601526060850152608084015260a083015260c08201520152565b03601f198101835282610fc1565b51902060408051602081019283526001600160a01b03909516908501525f6060850152929182906080820190565b51902090565b7f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460408051338152346020820152a1565b612ffa612ff55f356001600160e01b031916611e77565b612652565b80516001600160a01b0390613010908216611e08565b161561317d5780516060906001600160a01b039061302f908216611e08565b1660018114158061316c575b15613120575050805161305a906001600160a01b031636903490613c12565b60408201516001600160f81b031916806130e057506020820151613086906001600160a01b031661480e565b92905b156130d857516001600160a01b031690600182141582816130c3575b506130b3575b825160208401f35b6130bc91613cdb565b5f806130ab565b6001600160a01b03908116141590505f6130a5565b825160208401fd5b6001600160f81b03199081160361311157602082015161310a906001600160a01b03163690613c91565b9290613089565b632d6a6bb760e01b5f5260045ffd5b6001600160a01b030361305a57337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461305a576348f5c3ed60e01b5f5260045ffd5b506001600160a01b0381141561303b565b631cd4b64760e21b5f5260045ffd5b6001600160a01b03165f9081527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b866020526040902090565b9182358060f81c805f1461320857806001146131fb576002146131e5575f80fd5b6001600160d81b03191692600501916004190190565b5092601501916014190190565b505060015f9301915f190190565b60405160208101917f1547321c374afde8a591d972a084b071c594c275e36724931ff96c25f2999c838352604082015260408152613255606082610fc1565b519020901561326757611ef890614962565b611ef890614850565b919061327d913691612b63565b604051916020820191805180604014613308576041146132aa5750505050505b638baa579f5f526004601cfd5b80606060409201515f1a60205201516060525b5f52516040526020600160805f825afa51905f6060526040523d6132e257505061329d565b6001600160a01b031630036132fc57630b135d3f60e11b90565b6001600160e01b031990565b506040015160ff81901c601b016020526001600160ff1b03166060526132bd565b9092608092611ef89694835260018060a01b0316602083015260408201528160608201520191611efb565b61336d65ffffffffffff939561337997958785856149d7565b96929591989098614ac6565b50911642109081156133f6575b506133e25761339a6133c491602097613216565b60405163392dffaf60e01b8152978896879586959193916001600160e01b03191660048701613329565b03916001600160a01b03165afa9081156107bd575f91612007575090565b506001600160e01b03199695505050505050565b65ffffffffffff91501642115f613386565b90818060081b9160ff839260f01c1660021461342057565b6001600160d81b031983169150565b9080601f8301121561022257816020611ef893359101612b63565b9190916101208184031261022257613460610ff1565b9261346a82610226565b84526020820135602085015260408201356001600160401b038111610222578161349591840161342f565b604085015260608201356001600160401b03811161022257816134b991840161342f565b60608501526080820135608085015260a082013560a085015260c082013560c085015260e08201356001600160401b03811161022257816134fb91840161342f565b60e08501526101008201356001600160401b0381116102225761351e920161342f565b610100830152565b90816020910312610222575190565b80516001600160a01b03168252611ef891602082015160208201526101006135b661358661357460408601516101206040870152610120860190610d4c565b60608601518582036060870152610d4c565b6080850151608085015260a085015160a085015260c085015160c085015260e085015184820360e0860152610d4c565b92015190610100818403910152610d4c565b9392916135e5906040928652606060208701526060860190613535565b930152565b9291906135e5602091604086526040860190613535565b9290925f92613610368261344a565b9161361f61010083018361217a565b918193835f9360208210158061383b575b6137fc575b5050506001600160f81b031916600160f81b145b6137d5575b506001600160f81b03198616600160f81b036136e5575050604051639700320360e01b815293602092859283915f91839161368c91600484016135ea565b039260581c6001600160a01b03165af19081156107bd57611ef8925f926136b4575b50614f1d565b6136d791925060203d6020116136de575b6136cf8183610fc1565b810190613526565b905f6136ae565b503d6136c5565b909491939092916001600160f81b03198116600160f91b036137965760081b93600160f01b61371961206661205f88611ead565b16613787575f61373961373360209661376399858a614d3e565b94614f1d565b604051630ccab7a160e01b8152979096889586948593926001600160e01b031916600485016135c8565b03926001600160a01b03165af19081156107bd57611ef8925f926136b45750614f1d565b6314b9743f60e01b5f5260045ffd5b919350506001600160f81b0319166120b957630b135d3f60e11b926001600160e01b0319926137c6929190613270565b16036137d0575f90565b600190565b916137e293955086614af2565b9193916137f0368284612b63565b6101008401525f61364e565b91955092508291965061380f9350611bcb565b909161381c368385612b63565b6101008501526136496138326001923390612eaf565b95905f80613635565b507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a61386a6121218484611bbd565b14613630565b63ffffffff60019116019063ffffffff821161388857565b634e487b7160e01b5f52601160045260245ffd5b5f516020615e965f395f51905f5254600a63ffffffff808360a81c1616019063ffffffff82116138885763ffffffff838116921682116139375760c81c63ffffffff1610156105e9575f516020615e965f395f51905f52805463ffffffff60c81b60c893841b1663ffffffff60c81b1990911617908190559081901c63ffffffff9081169160a81c16811161392e5750565b61023190612383565b63e60fd64760e01b5f5260045ffd5b60207f6789ec0c85d6458d897a36a70129b101f8b4d84c6e218046c3107373dbcbae88918060581c6001600160581b0360a81b5f516020615e965f395f51905f525416175f516020615e965f395f51905f5255604051906001600160581b0319168152a1565b9294909391936139be6128a185611d17565b5f516020615e965f395f51905f525460a81c63ffffffff169063ffffffff808316911614613bb6575b506020810180516001600160a01b031615613bad575b5f516020615e965f395f51905f525460a81c63ffffffff1663ffffffff613a2b610628855163ffffffff1690565b911614801590613b81575b6105e957613a84613a9192613a4a87611d17565b815181546020938401516001600160c01b031990911663ffffffff9290921691909117921b640100000000600160c01b0316919091179055565b516001600160a01b031690565b915f196001600160a01b03841601613b70575b5050506001600160f81b03198116600160f81b03613b4d5760581c6001600160a01b031690813b15610222576040516306d61fe760e41b8152925f9184918291613af2919060048401612810565b038183855af19081156107bd575f516020615e565f395f51905f529261299f92613b39575b5060408051600181526001600160a01b03909216602083015290918291820190565b806107b75f613b4793610fc1565b5f613b17565b91506001600160f81b03198216600160f91b036120b9576102319160081b6150ea565b613b7992613f49565b5f8080613aa4565b50613b8e6128a186611d17565b63ffffffff613ba4610628855163ffffffff1690565b91161015613a36565b600181526139fd565b613bc89060010163ffffffff16612383565b5f6139e7565b6040908151613bdd8382610fc1565b600681526512d95c9b995b60d21b602082015291613bfd81519182610fc1565b6005815264181719971960d91b602082015290565b91613c39925f8080946040519687958694859363d68f602560e01b85523360048601611f1b565b03926001600160a01b03165af19081156107bd575f91613c57575090565b611ef891503d805f833e6107db8183610fc1565b5f9283613c3995936040519687958694859363d68f602560e01b85523360048601611f1b565b5f9060405192808385378338925af4913d82523d5f602084013e60203d830101604052565b5f9192806040519485378338925af4913d82523d5f602084013e60203d830101604052565b6001600160a01b0316803b1561022257604051630b9dfbed60e11b815260206004820152915f918391829084908290613d18906024830190610d4c565b03925af180156107bd57613d295750565b5f61023191610fc1565b8051156123df5760200190565b80518210156123df5760209160051b010190565b909593919492965f5b87811015613dad57600190613da78a89613d938489613d8c828060051b8c013595613d8787610966565b613d40565b51946123c8565b90613d9f868d8d6123c8565b9490936139ac565b01613d5d565b509650505050505050565b90156123df5790565b9293929091906001600160a01b03821615613f3a575b613de090611e77565b93613e0c613dff613df18684613db8565b356001600160f81b03191690565b6001600160f81b03191690565b936001600160f81b03198516613f12576001600160a01b03841691613e3391908190611c07565b823b1561022257613e5d925f92836040518096819582946306d61fe760e41b845260048401612810565b03925af19485156107bd57613ec1613ee19360019361023198613efe575b5060408051600381526001600160a01b03881660208201525f516020615e565f395f51905f529190a15b82546001600160a01b0319166001600160a01b03909116178255565b0180546001600160a01b0319166001600160a01b03909316929092178255565b805460ff60a01b191660589290921c60ff60a01b16919091179055565b806107b75f613f0c93610fc1565b5f613e7b565b50909390506001600160f81b031980841603613111576001613ee191613ec161023196613ea5565b6001600160a01b039150613dd7565b6001600160a01b0316919082158015614102575b6140fd5760405163d60b347f60e01b8152306004820152602081602481875afa9081156107bd575f916140de575b50614022579080613f9b92611c07565b9190813b15610222576040516306d61fe760e41b8152925f9184918291613fc6919060048401612810565b038183855af19081156107bd575f516020615e565f395f51905f529261299f9261400e575b505b60408051600481526001600160a01b03909216602083015290918291820190565b806107b75f61401c93610fc1565b5f613feb565b811515806140bf575b614049575b505061299f5f516020615e565f395f51905f5291613fed565b908061405492611c07565b9190813b15610222576040516306d61fe760e41b8152925f918491829161407f919060048401612810565b038183855af19081156107bd575f516020615e565f395f51905f529261299f926140ab575b5091614030565b806107b75f6140b993610fc1565b5f6140a4565b506001600160f81b0319806140d7613df18585613db8565b161461402b565b6140f7915060203d602011610812576108048183610fc1565b5f613f8b565b505050565b5060018314613f5d565b9261411790846153f6565b816141665750505f80916040518260208201916306d61fe760e41b835261415081612f6b60248201604090602081525f60208201520190565b51926001600160a01b03165af1506127a76123f1565b6001600160a01b039092169190823b1561022257612798925f92836040518096819582946306d61fe760e41b845260048401612810565b7f9d17cd6d095ac90a655405ab29f30a7ee7e88ef3974c1bf7544bf591043bb71a916060916141cf82610cc883611d4e565b600160ff198254161790556040519163ffffffff60e01b1682526001600160581b031916602082015260016040820152a1565b91907f2b82f87bf66300af618a9621d3f221edfab735f5bacb4e004cce1b62375396c3905a905f8060405193614262856142546020820196638a91b0e360e01b88526020602484018181520190610d4c565b03601f198101875286610fc1565b60405193614271602086610fc1565b828552602085019583908a905f368a375193f1913d90816142b8575b815f9293523e604080516001600160a01b03909516855281151560208601529093908190810161299f565b5f915061428d565b6142cd9093929193611e77565b80546001600160a01b031981168255600190910180546001600160a01b039092169490929091906001600160f81b0319605883901b161561431d575b505081546001600160a81b03191690915550565b61433b9261432c913691612b63565b906001600160a01b0316614202565b50805460408051600381526001600160a01b0390921660208301525f516020615e765f395f51905f5291a15f8080614309565b6001600160a01b039081165f8181527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b8660205260409081902080546001600160a01b0319811690915590921694935f516020615e765f395f51905f52936143e1916143db91369190612b63565b82614202565b50815190600282526020820152a1565b92919061442161440f5f516020615e965f395f51905f525460581b90565b6001600160581b031980871691161490565b612d5c57614431611dbe85611d17565b9361445261443e82611d17565b8054640100000000600160c01b0319169055565b6001600160f81b03198116600160f81b036144955791613b176143db61299f935f516020615e765f395f51905f529560018060a01b039060581c16933691612b63565b91506001600160f81b03198216600160f91b036120b9576102319160081b61547c565b604080519091906144c98382610fc1565b6001815291601f1901825f5b8281106144e157505050565b8060606020809385010152016144d5565b906144fc82611001565b6145096040519182610fc1565b828152809261451a601f1991611001565b01905f5b82811061452a57505050565b80606060208093850101520161451e565b906040611ef8925f81528160208201520190610d4c565b600881901b9291906001600160f81b03198116600160f81b036145e557509061457a916156ba565b90916001600160f81b031981166145955750611ef8916157d2565b6001600160f81b031916600160f81b036145b257611ef891615726565b60405162461bcd60e51b815260206004820152600b60248201526a155b9cdd5c1c1bdc9d195960aa1b6044820152606490fd5b9293926001600160f81b0319811661469d5750906146029161563c565b9161460b6144b8565b956001600160f81b03198116614638575061462593615684565b61462e83613d33565b526127a782613d33565b6001600160f81b031916600160f81b036145b2576146559361565d565b61465e84613d33565b52610231577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb761299f61469084613d33565b516040519182918261453b565b909391906001600160f81b0319908116036145b2576146c76146cd916146c16144b8565b95615614565b91613cb6565b6146d985939293613d33565b526001600160f81b03198116600160f81b036147245750156146f757565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb761299f61469084613d33565b6001600160f81b0319166145b2576102315760405162461bcd60e51b815260206004820152601360248201527211195b1959d85d1958d85b1b0819985a5b1959606a1b6044820152606490fd5b9091906001600160a01b0316801580156147f9575b6140fd5781156123df575f516020615e765f395f51905f529261299f926001600160f81b031982358116146147d9575b505060408051600481526001600160a01b03909216602083015290918291820190565b6147ea816143db926147f194611c07565b3691612b63565b505f806147b6565b5060018114614786565b816040519182372090565b5f809160405136810160405236838237604051601481016040523360601b90528260143601925af190604051903d82523d5f602084013e60203d830101604052565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f0000000000000000000000000000000000000000000000000000000000000000461416156148db575b6719010000000000005f52601a52603a526042601820905f603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f00000000000000000000000000000000000000000000000000000000000000006040820152466060820152306080820152206148be565b60a061496c613bce565b90602081519101209060208151910120604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8352602083015260408201525f6060820152306080820152206719010000000000005f52601a52603a526042601820905f603a52565b94918484614a589296959396604051906149f082610fa5565b5f82525f602083015260408201995f8b52614a52606084019a8b925f84525f60808701525f60a0870152606060c0870152614a4360e08701915f83526101008801955f87529063ffffffff60e01b169052565b6001600160a01b039091169052565b5261585d565b60ff80614a71614a6b613df18786613db8565b60f81c90565b1603614ab757614aa0614a8b84614a9b95614ab094611c07565b9490955163ffffffff60e01b1690565b611ead565b5460101c6001600160a01b031690565b9351929190565b63b32eeb6960e01b5f5260045ffd5b8065ffffffffffff8260a01c16918215600114614ae4575b60d01c92565b65ffffffffffff9250614ade565b9190939293601481019160141161022257803560601c92829190614b14612d92565b6001600160a01b03909516602086019081529490614b72614b376128a183611d17565b5f516020615e965f395f51905f525460a81c63ffffffff169063ffffffff808316911603614cd757614b6890613870565b63ffffffff168352565b815163ffffffff1695516001600160a01b031697614b90858061217a565b614b9991614803565b986034850199614ba98b8861217a565b614bb291614803565b906054870199614bc28b8a61217a565b614bcb91614803565b604080517fb17ab1224aca0d4255ef8161acaf2ac121b8faa32a4b2258c912cc5f8308c505602082019081526001600160581b03198a169282019290925263ffffffff9390931660608401526001600160a01b0395909516608083015260a082019290925260c081019290925260e0808301919091528152614c4f61010082610fc1565b519020905f1461051a61029b98614cb0609498612a3397614c916129b79761052097614cc957614c7e90614962565b614c8b60748d018561217a565b91615acb565b9e614ca7614c9f848061217a565b92909461217a565b9390928a6139ac565b614cc3614cbd828b61217a565b90615c88565b8861217a565b614cd290614850565b614c7e565b614b68565b80548210156123df575f5260205f2001905f90565b356001600160c01b0319811692919060088210614d0c575050565b6001600160c01b031960089290920360031b82901b16169150565b604090611ef8939281528160208201520190613535565b93929190935f926001614d5083611ead565b015f5b8154811015614ee057614d81614d79614d6c8385614cdc565b90549060031b1c60501b90565b908160501c90565b939095614d9d614d97614a6b613df18585613db8565b60ff1690565b808403614eb25750908181614dd6614dca614dc4614dbe84614df498611c23565b90614cf1565b60c01c90565b6001600160401b031690565b600901918c610100614dec6147ea868686611c34565b910152611cc9565b939093955b600160f01b1615614e11575b50600101939193614d53565b604051633894f6e760e11b81529196906020908390815f81614e418f6001600160e01b03198d1660048401614d27565b03926001600160a01b03165af19182156107bd575f92614e92575b506001600160a01b038216614e7e57600191614e7791614f1d565b9590614e05565b631f24c1fb60e11b5f52600487905260245ffd5b614eab91925060203d81116136de576136cf8183610fc1565b905f614e5c565b9196909491831115614ecd57630760bdcf60e11b5f5260045ffd5b614ed56122ca565b6101008b0152614df9565b505091929460ff80614ef8614a6b613df18789613db8565b1603614ab757610100614f156147ea85614aa096611ef898611c07565b910152611ead565b908082186001600160a01b031615606083811b838501821b9081149184901b141717600114614f4d575050600190565b65ffffffffffff60a01b8216916001600160d01b03198082169083168415614fcd575b65ffffffffffff60a01b84168015614fbd575b858110908618028086189514614fac575b81811190821802189160018060a01b03911716171790565b65ffffffffffff60a01b9450614f94565b5065ffffffffffff60a01b614f83565b65ffffffffffff60a01b9450614f70565b903590601e198136030182121561022257018035906001600160401b03821161022257602001918160051b3603831361022257565b8054905f815581615022575050565b5f5260205f20908101905b818110615038575050565b5f815560010161502d565b356001600160501b031981169291906016821061505e575050565b6001600160501b031960169290920360031b82901b16169150565b805468010000000000000000811015610f6a5761509b91600182018155614cdc565b819291549060031b9160501c821b9160018060b01b03901b1916179055565b9092809260209483528483013701015f815290565b356001600160f01b0319811692919060028210612326575050565b91906150f69080614fde565b9260fe841180156153ee575b6153df57600161511182611ead565b01546153c6575b5f1984015f5b8181106152885750906151dd6151d683876151766151c76151ae6120666151a86151a2876151f99e9f8e61519d6152079f8f90611e0861291061290a61516861516e9489896123c8565b90611c5f565b9a8b91611ead565b805462010000600160b01b03191660109290921b62010000600160b01b0316919091179055565b6123c8565b90611c8d565b906150cf565b6151b788611ead565b9060f01c61ffff19825416179055565b6001600160a01b0316966123c8565b8091611c70565b6040519586939092906001600160e01b031916602085016150ba565b03601f198101845283610fc1565b803b15610222575f61522d92604051809481926306d61fe760e41b835260048301612266565b038183855af19081156107bd575f516020615e565f395f51905f529261299f92615274575b5060408051600681526001600160a01b03909216602083015290918291820190565b806107b75f61528293610fc1565b5f615252565b615323906152ce600161529a86611ead565b016152c86152bb6152b56152af868d8c6123c8565b90611c51565b90615043565b6001600160501b03191690565b90615079565b6152e8611e08611e0861291061290a615168868d8c6123c8565b6152f66151d6838a896123c8565b60405194918591615315916001600160e01b03198a16602085016150ba565b03601f198101855284610fc1565b803b15610222576040516306d61fe760e41b8152925f91849182908490829061534f9060048301612266565b03925af19182156107bd576001926153b2575b505f516020615e565f395f51905f526153a961538861291061290a615168868d8c6123c8565b60408051600581526001600160a01b03909216602083015290918291820190565b0390a10161511e565b806107b75f6153c093610fc1565b5f615362565b6153da60016153d483611ead565b01615013565b615118565b63b62d956d60e01b5f5260045ffd5b508315615102565b5f516020615e565f395f51905f52916040916001600160a01b03821615615473575b6001600160a01b039081165f8181527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b8660205284902080546001600160a01b03191693909216929092179055815190600282526020820152a1565b60019150615418565b919061548783611ead565b916154928280614fde565b9190506001840191600183540103615605575f5b825481101561554357805f516020615e765f395f51905f5261553a86615518612f6b6143db8c6154fc886154f66154e6614d798f60019e614d6c91614cdc565b90508c8060a01b03169780614fde565b906123c8565b6040519485939092906001600160e01b031916602085016150ba565b5060408051600581526001600160a01b03909216602083015290918291820190565b0390a1016154a6565b50936155a6915061023193926155a16151f99261556460016153d483611ead565b85546151dd9061557f9060101c6001600160a01b0316611e08565b9361559661558d8280614fde565b91909280614fde565b5f19019290506123c8565b614202565b5080545f516020615e765f395f51905f52906155f2906155d19060101c6001600160a01b0316611e08565b60408051600681526001600160a01b03909216602083015290918291820190565b0390a180546001600160b01b0319169055565b63013dcc8d60e31b5f5260045ffd5b91601382111561562f57823560601c92601401916013190190565b63ba597e7e5f526004601cfd5b90603381111561562f57813560601c92601483013592603401916033190190565b905f928491604051958692833738935af1913d82523d5f602084013e60203d830101604052565b90925f92819594604051968792833738935af1156156b1573d82523d5f602084013e60203d830101604052565b503d5f823e3d90fd5b918235826020118160401c1761562f5783016020810193813593846156de57505050565b01601f190190835b5f190160208160051b8301013580830160608101908135809101918680602080860135809601011191111792171760401c1761562f57806156e657505050565b9190615731816144f2565b925f5b82811061574057505050565b8061576a60019260051b84013584016040810135810190602082359201906020810135903561565d565b6157748389613d40565b5215615781575b01615734565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76157ca6157af8389613d40565b51604051918291858352604060208401526040830190610d4c565b0390a161577b565b91906157dd816144f2565b925f5b8281106157ec57505050565b8061581660019260051b840135840160408101358101906020823592019060208101359035615684565b6158208288613d40565b5261582b8187613d40565b50016157e0565b9092608092611ef89594835260018060a01b0316602083015260408201528160608201520190610d4c565b91606083019060016158b2615879845163ffffffff60e01b1690565b6001600160e01b0319165f9081527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f8526020526040902090565b01805493905f5b8581106158c95750505050505050565b6158d9614d79614d6c8385614cdc565b6001600160a01b031660a0890190815260808901949091615902906001600160f01b0319168652565b61591c615915614a6b613df18985613db8565b60ff168a52565b61592a614d978a5160ff1690565b808403615a99575085818161594f614dca614dc4614dbe6159a49b9c61597798611c23565b8c60c061596a6147ea60208401948086526009018688611c34565b9101525160090191611cc9565b949094955b51600160f11b90615996906001600160f01b031916612066565b166001600160f01b03191690565b156159b3575b506001016158b9565b516159c6906001600160a01b0316611e08565b60206159ec6159df6159df895163ffffffff60e01b1690565b6001600160e01b03191690565b60e08a01516101008b015160c08c015160405163184dfdbb60e11b8152958694909385938493615a2b9390926001600160a01b03169060048601615832565b03915afa9081156107bd575f91615a7b575b506001600160a01b038116615a675790600191615a5f60408a01918251614f1d565b9052906159aa565b631f24c1fb60e11b5f52600482905260245ffd5b615a93915060203d81116136de576136cf8183610fc1565b5f615a3d565b909490831115615ab257630760bdcf60e11b5f5260045ffd5b6159a490615ac1365f88612b63565b60c08b015261597c565b5f516020615e965f395f51905f52545f9493929060581b6001600160f81b03198116600160f81b03615b865791615b2b9391615b0c611e0860209560581c90565b9160405195869485938493637aa8f17760e11b85523060048601611f1b565b03915afa9081156107bd575f91615b67575b505b6001600160e01b0319166374eca2c160e11b01615b5857565b6362467c7760e11b5f5260045ffd5b615b80915060203d602011612029576120218183610fc1565b5f615b3d565b90949192916001600160f81b03198216600160f91b03615c275750602091615bb49160081b958430886149d7565b60405163392dffaf60e01b81529297929586949385938493615be793909230906001600160e01b03191660048701613329565b03916001600160a01b03165afa9081156107bd575f91615c08575b50615b3f565b615c21915060203d602011612029576120218183610fc1565b5f615c02565b94906001600160f81b0319166120b957615c4092613270565b615b3f565b15615c4c57565b60405162461bcd60e51b8152602060048201526014602482015273496e76616c69642073656c6563746f724461746160601b6044820152606490fd5b615c956105208383611b92565b916004811015615ca457505050565b602c8110615e4657602c820190615cc4611e0861291061290a8487611be8565b615cee615ce0613dff613df1615cda878061217a565b90613db8565b6001600160f81b0319161590565b80615da1575b611e0861291061290a85615d496102319a87615d2d611e0861291061290a8f9d612a3a9f9e8f604c9f612ab39f615d4f575b5050611cb8565b615d378b8061217a565b9390926001600160a01b031690613dc1565b88611cb8565b612a3a615d93615d9a93606c860190615d8e615d7d611e0861291061290a615d77878761217a565b90611bf9565b9586906001600160a01b03166153f6565b61217a565b8091611c9b565b8f87615d26565b5060405163ecd0596160e01b81526002600482015290949291906020816024816001600160a01b038a165afa9384156107bd5761291061290a84615d49611e08948b615d2d611e086129106102319f8f9c612a3a9f9d8f604c9f93612ab39f9461290a955f91615e27575b509f50505050505050505097509a5050959650505050615cf4565b615e40915060203d602011610812576108048183610fc1565b5f615e0c565b61023192506004915014615c4556fed21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", - "nonce": "0x21", + "input": "0x0000000000000000000000000000000000000000000000000000000000000000610140806040523461020a576020816162458038038091610020828561020e565b83398101031261020a57516001600160a01b038116810361020a57306080524660a05260a060405161005360408261020e565b6006815260208101906512d95c9b995b60d21b82526040519161007760408461020e565b60058352602083019164181719971960d91b8352519020915190208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260208301526040820152466060820152306080820152206101005261012052604051602081019063deadbeef60e01b82526004815261010160248261020e565b5190516001600160581b031981169190601582106101ea575b7f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f80546001600160a81b031916605885901c179055604051615fff9081610246823960805181615765015260a05181615788015260c051816157f8015260e0518161581e015261010051816157440152610120518181816103c4015281816106ac0152818161086601528181610ac401528181610e600152818161115d015281816112ee0152818161132901528181611528015281816119b901528181611aeb015281816125b701526132100152f35b6001600160581b031960159290920360031b82901b161690505f8061011a565b5f80fd5b601f909101601f19168101906001600160401b0382119082101761023157604052565b634e487b7160e01b5f52604160045260245ffdfe6080604052600436101561001d575b366131b65761001b613185565b005b5f3560e01c8063112d3a7d1461021c578063150b7a02146102175780631626ba7e1461021257806319822f7c1461020d5780631f1b92e3146102085780633659cfe6146102035780633c3b752b146101fe57806352141cd9146101f957806357b3a5f4146101f45780636e6fa0c6146101ef578063721e67f4146101ea57806384b0196e146101e55780638dd7712f146101e057806390ef8862146101db5780639198bdf5146101d65780639517e29f146101d15780639cfd7cff146101cc578063a65d69d4146101c7578063a71763a8146101c2578063adb610a3146101bd578063b8afe17d146101b8578063b9b82941146101b3578063bc197c81146101ae578063c3e58978146101a9578063d03c7914146101a4578063d691c9641461019f578063e6f3d50a1461019a578063e9ae5c5314610195578063f1f7f0f914610190578063f23a6e611461018b578063f2dc691d146101865763fc9c5dec0361000e57611cbd565b611c9f565b611c45565b611c0f565b611adf565b61195f565b61187d565b611830565b61175d565b61164c565b6114f5565b61147f565b61144d565b61131d565b6112d9565b611281565b611151565b61103a565b610f2b565b610e30565b610d92565b610d0c565b610cb1565b610bfe565b610a5e565b6109c8565b61084b565b610695565b610390565b61032f565b6102d5565b6102af565b6001600160a01b0381160361023257565b5f80fd5b359061024182610221565b565b9181601f84011215610232578235916001600160401b038311610232576020838186019501011161023257565b6060600319820112610232576004359160243561028c81610221565b91604435906001600160401b038211610232576102ab91600401610243565b9091565b346102325760206102cb6102c236610270565b92919091611f10565b6040519015158152f35b34610232576080366003190112610232576102f1600435610221565b6102fc602435610221565b6064356001600160401b0381116102325761031b903690600401610243565b5050604051630a85bd0160e11b8152602090f35b34610232576040366003190112610232576004356024356001600160401b0381116102325760209161036861036e923690600401610243565b91613382565b6040516001600160e01b03199091168152f35b90816101209103126102325790565b6060366003190112610232576004356001600160401b038111610232576103bb903690600401610381565b602435604435917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610662576103ff60208201356135ce565b9092919084836001600160f81b0319861615610649575b8261042193946137c7565b9361044661043661043184611ea2565b611fda565b946001600160f81b031916151590565b938480610608575b6105f957602001516001600160a01b0316801591819083806105f2575b6104f2576001926104866104a5925f525f60205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b149081156105ea575b501561055d5782610501575b50506104f257816104dc925b6104e0575b506040519081529081906020820190565b0390f35b3490349034903490335af1505f6104cb565b631a0a9b9f60e21b5f5260045ffd5b61055692506105529161053661053061052a61051f61054b95611ed9565b936060810190612006565b90611d1d565b90611e6c565b63ffffffff60e01b165f5260205260405f2090565b5460ff1690565b1590565b5f806104ba565b829192916105b7575b506104f25761052a81606061057c930190612006565b638dd7712f60e01b916001600160e01b03199161059891611e6c565b16036105a857816104dc926104c6565b63dbbb044b60e01b5f5260045ffd5b6105e4915061054b6105cb61055292611ed9565b6105366105306105de6060880188612006565b90611d0c565b5f610566565b90505f6104ae565b508661046b565b633ab3447f60e11b5f5260045ffd5b50805163ffffffff1663ffffffff6106416106385f516020615fdf5f395f51905f525463ffffffff9060c81c1690565b63ffffffff1690565b91161061044e565b5f516020615fdf5f395f51905f525460581b9250610416565b6348f5c3ed60e01b5f5260045ffd5b6004359063ffffffff8216820361023257565b359063ffffffff8216820361023257565b6020366003190112610232576106a9610671565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610841575b15610838576107116107056106ff5f516020615fdf5f395f51905f525460581b90565b60581c90565b6001600160a01b031690565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91610809575b50156106625760405163d68f602560e01b8152916001600160a01b0391909116905f838061076e36343360048501612164565b038183865af19283156107dc575f936107e1575b5061078c90613a5b565b803b1561023257604051630b9dfbed60e11b8152915f9183918290849082906107b890600483016121ad565b03925af180156107dc576107c857005b806107d65f61001b93610fe3565b80610d64565b6120bc565b61078c919350610802903d805f833e6107fa8183610fe3565b8101906120e2565b9290610782565b61082b915060203d602011610831575b6108238183610fe3565b8101906120a4565b5f61073b565b503d610819565b61001b90613a5b565b50303314156106dc565b60203660031901126102325760043561086381610221565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061097c575b15610973576108b96107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91610954575b50156106625760405163d68f602560e01b8152916001600160a01b0391909116905f838061091636343360048501612164565b038183865af19283156107dc575f93610934575b5061078c906121be565b61078c91935061094d903d805f833e6107fa8183610fe3565b929061092a565b61096d915060203d602011610831576108238183610fe3565b5f6108e3565b61001b906121be565b5030331415610896565b6001600160581b031981160361023257565b9181601f84011215610232578235916001600160401b038311610232576020808501948460051b01011161023257565b346102325760a0366003190112610232576004356109e581610986565b6024356109f181610221565b6044356001600160401b03811161023257610a10903690600401610243565b6064939193356001600160401b03811161023257610a32903690600401610243565b91608435956001600160401b03871161023257610a5661001b973690600401610998565b969095612325565b608036600319011261023257600435610a7681610986565b602435610a8281610221565b6044356001600160401b03811161023257610aa1903690600401610243565b6064356001600160401b03811161023257610ac0903690600401610243565b91337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610be2575b15610bd457610b176107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91610bb5575b50156106625760405163d68f602560e01b8152956001600160a01b039190911694905f8780610b7536343360048501612164565b0381838a5af19687156107dc575f97610b95575b5061078c9596976124a8565b61078c969750610bae903d805f833e6107fa8183610fe3565b9695610b89565b610bce915060203d602011610831576108238183610fe3565b5f610b41565b919361001b959391936124a8565b5030331415610af4565b6001600160e01b031981160361023257565b34610232576020366003190112610232576104dc610c3f600435610c2181610bec565b5f60408051610c2f81610f71565b8281528260208201520152612038565b600160405191610c4e83610f71565b805460a083901b839003168084529101546001600160a01b0380821660208086019182526001600160f81b031960589490941b84166040968701908152865195841686529151909216918401919091525116918101919091529081906060820190565b3461023257604036600319011261023257602060ff610d00600435610cd581610986565b610cea60243591610ce583610bec565b611ed9565b9063ffffffff60e01b165f5260205260405f2090565b54166040519015158152f35b34610232576020366003190112610232576020610d41600435610d2e81610221565b5f604051610d3b81610f91565b52613335565b60405190610d4e82610f91565b546001600160a01b031690819052604051908152f35b5f91031261023257565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b34610232575f36600319011261023257610dd1610ddf610db0613da7565b604092919251938493600f60f81b855260e0602086015260e0850190610d6e565b908382036040850152610d6e565b4660608301523060808301525f60a083015281810360c083015260206060519182815201906080905f5b818110610e17575050500390f35b8251845285945060209384019390920191600101610e09565b6040366003190112610232576004356001600160401b03811161023257610e5b903690600401610381565b6024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610662575f908152602081905260409020546001600160a01b03169060609060018314159081610efb575b610ed0610ec9826060610ed7940190612006565b8091611d2b565b9030613e8f565b5015610eec57610ee357005b61001b91613eb4565b63f21e646b60e01b5f5260045ffd5b9150610ed7610ed0610ec9610f21610f19610ec96060880188612006565b903489613e44565b9492505050610eb5565b34610232575f36600319011261023257602063ffffffff5f516020615fdf5f395f51905f525460c81c16604051908152f35b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b03821117610f8c57604052565b610f5d565b602081019081106001600160401b03821117610f8c57604052565b604081019081106001600160401b03821117610f8c57604052565b61012081019081106001600160401b03821117610f8c57604052565b90601f801991011681019081106001600160401b03821117610f8c57604052565b60405190610241604083610fe3565b6040519061024161012083610fe3565b6001600160401b038111610f8c5760051b60200190565b6080366003190112610232576004356001600160401b03811161023257611065903690600401610998565b602435916001600160401b038311610232573660238401121561023257826004013561109081611023565b9361109e6040519586610fe3565b8185526024602086019260061b8201019036821161023257602401915b818310611110575050506044356001600160401b038111610232576110e4903690600401610998565b90606435946001600160401b0386116102325761110861001b963690600401610998565b9590946125ad565b604083360312610232576020604091825161112a81610fac565b61113386610684565b81528286013561114281610221565b838201528152019201916110bb565b61115a36610270565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611277575b1561126d576111b06107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f9161124e575b50156106625760405163d68f602560e01b8152936001600160a01b039190911692905f858061120e36343360048501612164565b038183885af19485156107dc575f9561122e575b5061078c93949561277c565b61078c949550611247903d805f833e6107fa8183610fe3565b9493611222565b611267915060203d602011610831576108238183610fe3565b5f6111da565b9161001b9361277c565b503033141561118d565b34610232575f366003190112610232576104dc6040516112a2604082610fe3565b601681527535b2b93732b61730b23b30b731b2b2173b181719971960511b6020820152604051918291602083526020830190610d6e565b34610232575f366003190112610232576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b61132636610270565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611443575b156114395761137c6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f9161141a575b50156106625760405163d68f602560e01b8152936001600160a01b039190911692905f85806113da36343360048501612164565b038183885af19485156107dc575f956113fa575b5061078c939495612ad0565b61078c949550611413903d805f833e6107fa8183610fe3565b94936113ee565b611433915060203d602011610831576108238183610fe3565b5f6113a6565b9161001b93612ad0565b5030331415611359565b34610232575f36600319011261023257602063ffffffff5f516020615fdf5f395f51905f525460a81c16604051908152f35b346102325760203660031901126102325760406114af6004356114a181610986565b6114a9612cfa565b50611ea2565b8151906114bb82610fac565b5463ffffffff81168083526001600160a01b03602092831c81169383019384528451918252925190921690820152f35b8015150361023257565b60603660031901126102325760043561150d81610986565b60243561151981610bec565b604435611525816114eb565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611642575b156116385761157b6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91611619575b50156106625760405163d68f602560e01b8152926001600160a01b039190911691905f84806115d936343360048501612164565b038183875af19384156107dc575f946115f9575b5061078c9293946143db565b61078c939450611612903d805f833e6107fa8183610fe3565b93926115ed565b611632915060203d602011610831576108238183610fe3565b5f6115a5565b9061001b926143db565b5030331415611558565b346102325760a036600319011261023257611668600435610221565b611673602435610221565b6044356001600160401b03811161023257611692903690600401610998565b50506064356001600160401b038111610232576116b3903690600401610998565b50506084356001600160401b038111610232576116d4903690600401610243565b505060405163bc197c8160e01b8152602090f35b602080825282516001600160f01b03191681830152808301516001600160a01b03166040808401919091529092015160608083015280516080830181905260a09092019201905f5b81811061173d5750505090565b82516001600160501b031916845260209384019390920191600101611730565b346102325760203660031901126102325761179c60043561177d81610bec565b60606040805161178c81610f71565b5f81525f6020820152015261206e565b6001604051916117ab83610f71565b805461ffff60f01b8160f01b168452828060a01b039060101c16602084015201906040519182602082549182815201915f5260205f20905f5b81811061180d576104dc85876117fc81880382610fe3565b6040820152604051918291826116e8565b825460501b6001600160501b0319168452602090930192600192830192016117e4565b346102325760203660031901126102325760206102cb600435612d12565b9060406003198301126102325760043591602435906001600160401b038211610232576102ab91600401610243565b6118863661184e565b90916001600160a01b0361189933613335565b54169182156119505760609060018414159485611939575b6118bb9293614661565b92611929575b50506040518091602082016020835281518091526040830190602060408260051b8601019301915f905b8282106118fa57505050500390f35b919360019193955060206119198192603f198a82030186528851610d6e565b96019201920185949391926118eb565b61193291613eb4565b5f806118c1565b6118bb9250611949363487613deb565b92506118b1565b63710c949760e01b5f5260045ffd5b60603660031901126102325760043561197781610986565b6024356001600160401b03811161023257611996903690600401610243565b6044356001600160401b038111610232576119b5903690600401610243565b90337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611ad5575b15611ac957611a0c6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91611aaa575b50156106625760405163d68f602560e01b8152946001600160a01b039190911693905f8680611a6a36343360048501612164565b038183895af19586156107dc575f96611a8a575b5061078c949596612dea565b61078c959650611aa3903d805f833e6107fa8183610fe3565b9594611a7e565b611ac3915060203d602011610831576108238183610fe3565b5f611a36565b91909261001b94612dea565b50303314156119e9565b611ae83661184e565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611c05575b15611bfb57611b3e6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91611bdc575b50156106625760405163d68f602560e01b8152926001600160a01b039190911691905f8480611b9c36343360048501612164565b038183875af19384156107dc575f94611bbc575b5061078c92939461307d565b61078c939450611bd5903d805f833e6107fa8183610fe3565b9392611bb0565b611bf5915060203d602011610831576108238183610fe3565b5f611b68565b9061001b9261307d565b5030331415611b1b565b34610232575f3660031901126102325760205f516020615fdf5f395f51905f525460581b604051906001600160581b0319168152f35b346102325760a036600319011261023257611c61600435610221565b611c6c602435610221565b6084356001600160401b03811161023257611c8b903690600401610243565b505060405163f23a6e6160e01b8152602090f35b346102325760203660031901126102325760206102cb600435613088565b34610232576040366003190112610232576004356001600160401b03811161023257611d04611cf26020923690600401610381565b60243590611cff82610221565b613095565b604051908152f35b906008116102325760040190600490565b906004116102325790600490565b909291928360041161023257831161023257600401916003190190565b906018116102325760040190601490565b906014116102325790601490565b906020116102325790602090565b90929192836020116102325783116102325760200191601f190190565b909291928360011161023257831161023257600101915f190190565b906009116102325760010190600890565b909291928360091161023257831161023257600901916008190190565b906016116102325790601690565b906016116102325760020190601490565b909291928360161161023257831161023257601601916015190190565b906002116102325790600290565b909291928360141161023257831161023257601401916013190190565b90602c116102325760180190601490565b90939293848311610232578411610232578101920390565b356001600160e01b0319811692919060048210611e87575050565b6001600160e01b031960049290920360031b82901b16169150565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85060205260405f2090565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85160205260405f2090565b90929060018103611f5f57506001600160a01b0392611f599250611f49915060581b600160581b600160f81b0316600160f81b17611ea2565b5460201c6001600160a01b031690565b16151590565b60028103611f9357506001600160a01b0392611f5992506107059150611f86908416613335565b546001600160a01b031690565b600303611fd357611fb4611faf610530600193611fc295611d1d565b612038565b01546001600160a01b031690565b6001600160a01b0390811691161490565b5050505f90565b90604051611fe781610fac565b915463ffffffff81168352602090811c6001600160a01b031690830152565b903590601e198136030182121561023257018035906001600160401b0382116102325760200191813603831361023257565b63ffffffff60e01b165f527f7c341349a4360fdd5d5bc07e69f325dc6aaea3eb018b3e0ea7e53cc0bb0d6f3b60205260405f2090565b63ffffffff60e01b165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85260205260405f2090565b9081602091031261023257516120b9816114eb565b90565b6040513d5f823e3d90fd5b6001600160401b038111610f8c57601f01601f191660200190565b602081830312610232578051906001600160401b038211610232570181601f8201121561023257805190612115826120c7565b926121236040519485610fe3565b8284526020838301011161023257815f9260208093018386015e8301015290565b908060209392818452848401375f828201840152601f01601f1916010190565b6120b9939260609260018060a01b03168252602082015281604082015201905f612144565b6120b9949260609260018060a01b0316825260208201528160408201520191612144565b9060206120b9928181520190610d6e565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556001600160a01b03167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2565b60405190612220602083610fe3565b5f8252565b90813b5f612232826120c7565b936122406040519586610fe3565b82855260208501903c565b80516020909101516001600160f01b031981169291906002821061226d575050565b6001600160f01b031960029290920360031b82901b16169150565b5f516020615fdf5f395f51905f52805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b634e487b7160e01b5f52603260045260245ffd5b908210156122e4576102ab9160051b810190612006565b6122b9565b908092918237015f815290565b3d15612320573d90612307826120c7565b916123156040519384610fe3565b82523d5f602084013e565b606090565b94939291909695966001600160581b031961235e6123515f516020615fdf5f395f51905f525460581b90565b6001600160581b03191690565b1615801590612480575b612472576001600160581b03198616156104f2576001600160f81b03198616600160f81b14158061245a575b61244b57856123a56123f297613b20565b6123c66123b0611004565b60018152925b6001600160a01b03166020840152565b5f516020615fdf5f395f51905f52805463ffffffff60a81b1916600160a81b179055613b86565b613b86565b5f5b81811061240057505050565b5f8061240d8385876122cd565b9061241d604051809381936122e9565b039082305af161242b6122f6565b5015612439576001016123f4565b636534eae560e11b5f5260045260245ffd5b6361c4e91b60e11b5f5260045ffd5b506001600160f81b03198616600160f91b1415612394565b62dc149f60e41b5f5260045ffd5b5061ef0160f01b6001600160f01b03196124a161249c30612225565b61224b565b1614612368565b94939291906001600160581b03198616156104f2576001600160f81b03198616600160f81b141580612553575b61244b576124e286613b20565b6001600160a01b036124f6611f4988611ea2565b1615612505575b505050505050565b612548956123ed61252b5f516020615fdf5f395f51905f525463ffffffff9060a81c1690565b926123b66040519461253e604087610fe3565b63ffffffff168552565b5f80808080806124fd565b506001600160f81b03198616600160f91b14156124d5565b9060405161257881610f71565b82546001600160a01b03908116825260019390930154928316602082015260589290921b6001600160f81b0319166040830152565b95909491939092337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580612721575b156127135761260a6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f916126f4575b50156106625760405163d68f602560e01b8152966001600160a01b039190911695905f888061266836343360048501612164565b0381838b5af19788156107dc575f986126d4575b50612688969798613f2d565b803b1561023257604051630b9dfbed60e11b8152915f9183918290849082906126b490600483016121ad565b03925af180156107dc576126c6575b50565b806107d65f61024193610fe3565b6126889798506126ed903d805f833e6107fa8183610fe3565b979661267c565b61270d915060203d602011610831576108238183610fe3565b5f612634565b919390929461024196613f2d565b50303314156125e7565b9160206120b9938181520191612144565b356bffffffffffffffffffffffff1981169291906014821061275c575050565b6bffffffffffffffffffffffff1960149290920360031b82901b16169150565b9091600182036128f8575f516020615f9f5f395f51905f5293906054600160f81b600160581b600160f81b03605887901b1617916127c66127bc84611ea2565b5463ffffffff1690565b5f516020615fdf5f395f51905f525460a81c63ffffffff169063ffffffff8083169116146128e0575b5061285861283161070561282b61282561281e5f516020615fdf5f395f51905f525463ffffffff9060a81c1690565b9886611d59565b9061273c565b60601c90565b61284861283c611004565b63ffffffff9097168752565b6001600160a01b03166020860152565b612883601482019461286a8680612006565b61287a6034869493940189612006565b93909288613b86565b019160046128918483612006565b9050146128bf575b5050505b604080519182526001600160a01b03909216602082015290819081015b0390a1565b61053061052a6128d8946128d293612006565b90614376565b5f8080612899565b6128f29060010163ffffffff16612288565b5f6127ef565b6002820361296057806129555f516020615f9f5f395f51905f5295603461292f61070561282b612825601461295b99019588611d59565b9361294e8561293e8580612006565b906001600160a01b038c166142e5565b0190612006565b91614122565b61289d565b600382036129d657806129555f516020615f9f5f395f51905f529560386129ce61070561282b612825601861295b9901956129c88c8a6129b661070561282b612825876129b06105308288611d1d565b95611d48565b6129c08b80612006565b939092613f9a565b88611d48565b930190612006565b600482148015612a74575b8015612a6a575b15612a5b576001600160a01b03831693843b1561023257612a22945f92836040518098819582946306d61fe760e41b84526004840161272b565b03925af19283156107dc575f516020615f9f5f395f51905f5293612a47575b5061289d565b806107d65f612a5593610fe3565b5f612a41565b631092ef5760e11b5f5260045ffd5b50600682146129e8565b50600582146129e1565b359060208110612a8c575090565b5f199060200360031b1b1690565b929192612aa6826120c7565b91612ab46040519384610fe3565b829481845281830111610232578281602093845f960137010152565b909160018203612b41575f516020615fbf5f395f51905f5293612b1f91612b1991612b10600160f81b600160581b600160f81b03605889901b16176144a9565b505b3691612a9a565b83614509565b50604080519182526001600160a01b03909216602082015290819081016128ba565b60028203612bb1576001600160a01b038381165f9081527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b866020526040902080546001600160a01b031981169091555f516020615fbf5f395f51905f5295612b1f93612b19939092165b50612b12565b919060038103612bd6575050610530612bd292612bcd92611d1d565b614445565b5050565b909160048203612c5f57612b19612b1f915f516020615fbf5f395f51905f5295612c0e5f516020615fdf5f395f51905f525460581b90565b612c1a611f4982611ea2565b6001600160a01b03888116911614612c325750612b12565b612c3e612c5991611ea2565b8054640100000000600160c01b031916640100000000179055565b5f612bab565b600582148015612cf0575b15612a5b575f516020615fdf5f395f51905f525460581b612c94612c8e8684611d67565b90612a7e565b906001600160f81b03198116600160f91b14612cc8575b5050612b19612b1f915f516020615fbf5f395f51905f5295612b12565b60081b6001600160e01b03191614612ce1575f80612cab565b6313002bdd60e31b5f5260045ffd5b5060068214612c6a565b60405190612d0782610fac565b5f6020838281520152565b612d26818060081b918160301b9160501b90565b929091906001600160f81b03198116600160f81b14159081612dd6575b81612dc1575b81612da8575b50611fd35760ff60f81b16600160f81b8114159081612d9e575b50612d98576001600160e01b031916612d93576001600160501b031916612d8f57600190565b5f90565b505f90565b50505f90565b905015155f612d69565b6001600160f81b031916607f60f91b141590505f612d4f565b6001600160f81b031980821614159150612d49565b6001600160f81b0319811615159150612d43565b9094939291612df8826144a9565b916001600160f81b03198116600160f81b03612e70575f516020615fbf5f395f51905f5291612e46612e406102419899612e689460018060a01b039060581c16933691612a9a565b82614509565b5060408051600181526001600160a01b03909216602083015290918291820190565b0390a161490f565b9294919290506001600160f81b03198116600160f91b0361244b5760081b92612e988461206e565b94612ea38780614880565b949050600187019460018654010361306e5794956001600160e01b0319871695905f5b8654811015612f7c57805f516020615fbf5f395f51905f52612f738c612f51612f43612e408e612f318f99612f2b612f1b612f13612f068460019f6148b5565b90549060031b1c60501b90565b908160501c90565b90508c8060a01b03169780614880565b906122cd565b604094919451948593602085016148ca565b03601f198101835282610fe3565b5060408051600581526001600160a01b03909216602083015290918291820190565b0390a101612ec6565b509194509296612ff761300a916130056130699598612fa86001612fa26102419d61206e565b016148df565b8554612fe590612fc39060101c6001600160a01b0316610705565b93612fda612fd18280614880565b91909280614880565b5f19019290506122cd565b604095919551958693602085016148ca565b03601f198101845283610fe3565b614509565b5080545f516020615fbf5f395f51905f5290613056906130359060101c6001600160a01b0316610705565b60408051600681526001600160a01b03909216602083015290918291820190565b0390a180546001600160b01b0319169055565b61490f565b63013dcc8d60e31b5f5260045ffd5b906126c39291614661565b60071115612d8f57600190565b612f439061317f906130b06001600160a01b03823516610705565b906131516020820135612f436130d26130cc6040860186612006565b9061499a565b936130e36130cc6060830183612006565b90608081013560a0820135906131056130cc60c08501359460e0810190612006565b93604051988997602089019b8c94919260e0969399989794919961010087019a60018060a01b03168752602087015260408601526060850152608084015260a083015260c08201520152565b51902060408051602081019283526001600160a01b03909516908501525f6060850152929182906080820190565b51902090565b7f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460408051338152346020820152a1565b6131d26131cd5f356001600160e01b031916612038565b61256b565b80516001600160a01b03906131e8908216610705565b16156133265780516060906001600160a01b0316806002600160a01b031981016133045750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610662575b60408201516001600160f81b031916806132c45750602082015161326b906001600160a01b03166149a5565b92905b156132bc57516001600160a01b031690600182141582816132a8575b50613298575b825160208401f35b6132a191613eb4565b5f80613290565b6001600160a01b039150811614155f61328a565b825160208401fd5b6001600160f81b0319908116036132f55760208201516132ee906001600160a01b03163690613e6a565b929061326e565b632d6a6bb760e01b5f5260045ffd5b600103613312575b5061323f565b613320915036903490613deb565b5f61330c565b631cd4b64760e21b5f5260045ffd5b6001600160a01b03165f9081527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b866020526040902090565b9081602091031261023257516120b981610bec565b9161338c916149e7565b919080836001600160f81b03198416156135ae575b60208110159182613577575b82613561575b50506133c161043184611ea2565b60208101516001600160a01b03906133da908216610705565b16158061354e575b6104f2576001600160f81b0319841615159081613515575b506105f9576001600160f81b03198316600160f81b0361348e5790613426602094939261344496614a39565b604051637aa8f17760e11b8152958694859384933360048601612189565b039160581c6001600160a01b03165afa9081156107dc575f91613465575090565b6120b9915060203d602011613487575b61347f8183610fe3565b81019061336d565b503d613475565b92916001600160f81b03198116600160f91b036134ee5760081b93600160f11b6134d16134c46134bd8861206e565b5460f01b90565b6001600160f01b03191690565b166134df576120b994614b77565b635b71057960e01b5f5260045ffd5b929391929091906001600160f81b03191661244b576120b99361351091614a39565b614a93565b5163ffffffff16905063ffffffff6135456106385f516020615fdf5f395f51905f525463ffffffff9060c81c1690565b9116105f6133fa565b506001600160f81b0319841615156133e2565b8192955061356f9350611d75565b925f806133b3565b91507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a6135a7612c8e8385611d67565b14916133ad565b92506135c85f516020615fdf5f395f51905f525460581b90565b926133a1565b90818060081b9160ff839260f01c166002146135e657565b6001600160d81b031983169150565b9080601f83011215610232578160206120b993359101612a9a565b9190916101208184031261023257613626611013565b9261363082610236565b84526020820135602085015260408201356001600160401b038111610232578161365b9184016135f5565b604085015260608201356001600160401b038111610232578161367f9184016135f5565b60608501526080820135608085015260a082013560a085015260c082013560c085015260e08201356001600160401b03811161023257816136c19184016135f5565b60e08501526101008201356001600160401b038111610232576136e492016135f5565b610100830152565b90816020910312610232575190565b80516001600160a01b031682526120b9916020820151602082015261010061377c61374c61373a60408601516101206040870152610120860190610d6e565b60608601518582036060870152610d6e565b6080850151608085015260a085015160a085015260c085015160c085015260e085015184820360e0860152610d6e565b92015190610100818403910152610d6e565b9392916137ab9060409286526060602087015260608601906136fb565b930152565b9291906137ab6020916040865260408601906136fb565b9290925f926137d63682613610565b916137e5610100830183612006565b918193835f93602082101580613a26575b6139e7575b5050506001600160f81b031916600160f81b145b6139c0575b506001600160f81b03198616600160f81b036138ab575050604051639700320360e01b815293602092859283915f91839161385291600484016137b0565b039260581c6001600160a01b03165af19081156107dc576120b9925f9261387a575b50615053565b61389d91925060203d6020116138a4575b6138958183610fe3565b8101906136ec565b905f613874565b503d61388b565b909491939092916001600160f81b03198116600160f91b0361395c5760081b93600160f01b6138df6134c46134bd8861206e565b1661394d575f6138ff6138f960209661392999858a614e64565b94615053565b604051630ccab7a160e01b8152979096889586948593926001600160e01b0319166004850161378e565b03926001600160a01b03165af19081156107dc576120b9925f9261387a5750615053565b6314b9743f60e01b5f5260045ffd5b919350506001600160f81b03191661244b576139b190630b135d3f60e11b9361351063ffffffff60e01b946020527b19457468657265756d205369676e6564204d6573736167653a0a33325f52603c60042090565b16036139bb575f90565b600190565b916139cd93955086614c2c565b9193916139db368284612a9a565b6101008401525f613814565b9195509250829196506139fa9350611d75565b9091613a07368385612a9a565b61010085015261380f613a1d6001923390613095565b95905f806137fb565b507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a613a55612c8e8484611d67565b146137f6565b5f516020615fdf5f395f51905f5254600a63ffffffff8260a81c16019063ffffffff8211613b0c5763ffffffff83811692168211613afd57613aa59060c81c63ffffffff16610638565b10156105f9575f516020615fdf5f395f51905f52805463ffffffff60c81b60c893841b1663ffffffff60c81b1990911617908190559081901c63ffffffff9081169160a81c168111613af45750565b61024190612288565b63e60fd64760e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b60207f6789ec0c85d6458d897a36a70129b101f8b4d84c6e218046c3107373dbcbae88918060581c6001600160581b0360a81b5f516020615fdf5f395f51905f525416175f516020615fdf5f395f51905f5255604051906001600160581b0319168152a1565b929490939193613b986127bc85611ea2565b5f516020615fdf5f395f51905f525460a81c63ffffffff169063ffffffff808316911614613d8f575b506020810180516001600160a01b031615613d86575b5f516020615fdf5f395f51905f525460a81c63ffffffff1663ffffffff613c05610638855163ffffffff1690565b911614801590613d5a575b6105f957613c5e613c6b92613c2487611ea2565b815181546020938401516001600160c01b031990911663ffffffff9290921691909117921b640100000000600160c01b0316919091179055565b516001600160a01b031690565b915f196001600160a01b03841601613d49575b5050506001600160f81b03198116600160f81b03613d265760581c6001600160a01b031690813b15610232576040516306d61fe760e41b8152925f9184918291613ccc91906004840161272b565b038183855af19081156107dc575f516020615f9f5f395f51905f52926128ba92613d12575060408051600181526001600160a01b03909216602083015290918291820190565b806107d65f613d2093610fe3565b5f612e46565b91506001600160f81b03198216600160f91b0361244b576102419160081b6151a6565b613d5292614122565b5f8080613c7e565b50613d676127bc86611ea2565b63ffffffff613d7d610638855163ffffffff1690565b91161015613c10565b60018152613bd7565b613da19060010163ffffffff16612288565b5f613bc1565b6040908151613db68382610fe3565b600681526512d95c9b995b60d21b602082015291613dd681519182610fe3565b6005815264181719971960d91b602082015290565b91613e12925f8080946040519687958694859363d68f602560e01b85523360048601612189565b03926001600160a01b03165af19081156107dc575f91613e30575090565b6120b991503d805f833e6107fa8183610fe3565b5f9283613e1295936040519687958694859363d68f602560e01b85523360048601612189565b5f9060405192808385378338925af4913d82523d5f602084013e60203d830101604052565b5f9192806040519485378338925af4913d82523d5f602084013e60203d830101604052565b6001600160a01b0316803b1561023257604051630b9dfbed60e11b815260206004820152915f918391829084908290613ef1906024830190610d6e565b03925af180156107dc57613f025750565b5f61024191610fe3565b8051156122e45760200190565b80518210156122e45760209160051b010190565b909593919492965f5b87811015613f8657600190613f808a89613f6c8489613f65828060051b8c013595613f6087610986565b613f19565b51946122cd565b90613f78868d8d6122cd565b949093613b86565b01613f36565b509650505050505050565b90156122e45790565b9293929091906001600160a01b03821615614113575b613fb990612038565b93613fe5613fd8613fca8684613f91565b356001600160f81b03191690565b6001600160f81b03191690565b936001600160f81b031985166140eb576001600160a01b0384169161400c91908190611d92565b823b1561023257614036925f92836040518096819582946306d61fe760e41b84526004840161272b565b03925af19485156107dc5761409a6140ba93600193610241986140d7575b5060408051600381526001600160a01b03881660208201525f516020615f9f5f395f51905f529190a15b82546001600160a01b0319166001600160a01b03909116178255565b0180546001600160a01b0319166001600160a01b03909316929092178255565b805460ff60a01b191660589290921c60ff60a01b16919091179055565b806107d65f6140e593610fe3565b5f614054565b50909390506001600160f81b0319808416036132f55760016140ba9161409a6102419661407e565b6001600160a01b039150613fb0565b6001600160a01b03169190821580156142db575b6142d65760405163d60b347f60e01b8152306004820152602081602481875afa9081156107dc575f916142b7575b506141fb57908061417492611d92565b9190813b15610232576040516306d61fe760e41b8152925f918491829161419f91906004840161272b565b038183855af19081156107dc575f516020615f9f5f395f51905f52926128ba926141e7575b505b60408051600481526001600160a01b03909216602083015290918291820190565b806107d65f6141f593610fe3565b5f6141c4565b81151580614298575b614222575b50506128ba5f516020615f9f5f395f51905f52916141c6565b908061422d92611d92565b9190813b15610232576040516306d61fe760e41b8152925f918491829161425891906004840161272b565b038183855af19081156107dc575f516020615f9f5f395f51905f52926128ba92614284575b5091614209565b806107d65f61429293610fe3565b5f61427d565b506001600160f81b0319806142b0613fca8585613f91565b1614614204565b6142d0915060203d602011610831576108238183610fe3565b5f614164565b505050565b5060018314614136565b926142f0908461549e565b8161433f5750505f80916040518260208201916306d61fe760e41b835261432981612f4360248201604090602081525f60208201520190565b51926001600160a01b03165af1506126c36122f6565b6001600160a01b039092169190823b15610232576126b4925f92836040518096819582946306d61fe760e41b84526004840161272b565b7f9d17cd6d095ac90a655405ab29f30a7ee7e88ef3974c1bf7544bf591043bb71a916060916143a882610cea83611ed9565b600160ff198254161790556040519163ffffffff60e01b1682526001600160581b031916602082015260016040820152a1565b907f9d17cd6d095ac90a655405ab29f30a7ee7e88ef3974c1bf7544bf591043bb71a9260609261440e83610cea83611ed9565b9115159160ff1981541660ff84161790556040519263ffffffff60e01b1683526001600160581b03191660208301526040820152a1565b61444f5f91612038565b80546001600160a01b031981168255600190910180546001600160a01b0390921693916001600160f81b0319605882901b1615614498575b5080546001600160a81b0319169055565b6001600160a01b031692505f614487565b906001600160581b03195f516020615fdf5f395f51905f525460581b166001600160581b0319831614612ce1576144f56001600160a01b036144ea84611ea2565b5460201c1692611ea2565b8054640100000000600160c01b0319169055565b91907f2b82f87bf66300af618a9621d3f221edfab735f5bacb4e004cce1b62375396c3905a905f80604051936145698561455b6020820196638a91b0e360e01b88526020602484018181520190610d6e565b03601f198101875286610fe3565b60405193614578602086610fe3565b828552602085019583908a905f368a375193f1913d90816145bf575b815f9293523e604080516001600160a01b0390951685528115156020860152909390819081016128ba565b5f9150614594565b604080519091906145d88382610fe3565b6001815291601f1901825f5b8281106145f057505050565b8060606020809385010152016145e4565b9061460b82611023565b6146186040519182610fe3565b8281528092614629601f1991611023565b01905f5b82811061463957505050565b80606060208093850101520161462d565b9060406120b9925f81528160208201520190610d6e565b600881901b9291906001600160f81b03198116600160f81b036146f4575090614689916155ca565b90916001600160f81b031981166146a457506120b9916156e2565b6001600160f81b031916600160f81b036146c1576120b991615636565b60405162461bcd60e51b815260206004820152600b60248201526a155b9cdd5c1c1bdc9d195960aa1b6044820152606490fd5b9293926001600160f81b031981166147ac5750906147119161554c565b9161471a6145c7565b956001600160f81b03198116614747575061473493615594565b61473d83613f0c565b526126c382613f0c565b6001600160f81b031916600160f81b036146c1576147649361556d565b61476d84613f0c565b52610241577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76128ba61479f84613f0c565b516040519182918261464a565b909391906001600160f81b0319908116036146c1576147d66147dc916147d06145c7565b95615524565b91613e8f565b6147e885939293613f0c565b526001600160f81b03198116600160f81b0361483357501561480657565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76128ba61479f84613f0c565b6001600160f81b0319166146c1576102415760405162461bcd60e51b815260206004820152601360248201527211195b1959d85d1958d85b1b0819985a5b1959606a1b6044820152606490fd5b903590601e198136030182121561023257018035906001600160401b03821161023257602001918160051b3603831361023257565b80548210156122e4575f5260205f2001905f90565b9092809260209483528483013701015f815290565b8054905f8155816148ee575050565b5f5260205f20908101905b818110614904575050565b5f81556001016148f9565b9091906001600160a01b031680158015614990575b6142d65781156122e4575f516020615fbf5f395f51905f52926128ba926001600160f81b03198235811614614977575b505060408051600481526001600160a01b03909216602083015290918291820190565b612b1281612e409261498894611d92565b505f80614954565b5060018114614924565b816040519182372090565b5f809160405136810160405236838237604051601481016040523360601b90528260143601925af190604051903d82523d5f602084013e60203d830101604052565b9182358060f81c805f14614a2b5780600114614a1e57600214614a08575f80fd5b6001600160d81b03191692600501916004190190565b5092601501916014190190565b505060015f9301915f190190565b60405160208101917f1547321c374afde8a591d972a084b071c594c275e36724931ff96c25f2999c838352604082015260408152614a78606082610fe3565b5190209015614a8a576120b990615854565b6120b990615742565b9190614aa0913691612a9a565b604051916020820191805180604014614b2b57604114614acd5750505050505b638baa579f5f526004601cfd5b80606060409201515f1a60205201516060525b5f52516040526020600160805f825afa51905f6060526040523d614b05575050614ac0565b6001600160a01b03163003614b1f57630b135d3f60e11b90565b6001600160e01b031990565b506040015160ff81901c601b016020526001600160ff1b0316606052614ae0565b90926080926120b99694835260018060a01b0316602083015260408201528160608201520191612144565b614b9065ffffffffffff929594614b9c948733856158c9565b97929491959095615993565b5091164210908115614c1a575b50614c0757602094614bba91614a39565b60405163392dffaf60e01b815295869485938493614be993929133906001600160e01b03191660048701614b4c565b03916001600160a01b03165afa9081156107dc575f91613465575090565b506001600160e01b031995945050505050565b65ffffffffffff91501642115f614ba9565b9190939293601481019160141161023257803560601c92829190614c4e612cfa565b6001600160a01b03909516602086019081529490614cad614c716127bc83611ea2565b5f516020615fdf5f395f51905f525460a81c63ffffffff169063ffffffff808316911603614e125760010163ffffffff165b63ffffffff168352565b815163ffffffff1695516001600160a01b031697614ccb8580612006565b614cd49161499a565b986034850199614ce48b88612006565b614ced9161499a565b906054870199614cfd8b8a612006565b614d069161499a565b604080517fb17ab1224aca0d4255ef8161acaf2ac121b8faa32a4b2258c912cc5f8308c505602082019081526001600160581b03198a169282019290925263ffffffff9390931660608401526001600160a01b0395909516608083015260a082019290925260c081019290925260e0808301919091528152614d8a61010082610fe3565b519020905f1461052a6102ab98614deb60949861294e97614dcc6128d29761053097614e0457614db990615854565b614dc660748d0185612006565b91615c58565b9e614de2614dda8480612006565b929094612006565b9390928a613b86565b614dfe614df8828b612006565b90615dd2565b88612006565b614e0d90615742565b614db9565b614ca3565b356001600160c01b0319811692919060088210614e32575050565b6001600160c01b031960089290920360031b82901b16169150565b6040906120b99392815281602082015201906136fb565b93929190935f926001614e768361206e565b015f5b8154811015614ff757614e92612f13612f0683856148b5565b939095614eb4614eae614ea8613fca8585613f91565b60f81c90565b60ff1690565b808403614fc95750908181614eed614ee1614edb614ed584614f0b98611dae565b90614e17565b60c01c90565b6001600160401b031690565b600901918c610100614f03612b12868686611dbf565b910152611e54565b939093955b600160f01b1615614f28575b50600101939193614e79565b604051633894f6e760e11b81529196906020908390815f81614f588f6001600160e01b03198d1660048401614e4d565b03926001600160a01b03165af19182156107dc575f92614fa9575b506001600160a01b038216614f9557600191614f8e91615053565b9590614f1c565b631f24c1fb60e11b5f52600487905260245ffd5b614fc291925060203d81116138a4576138958183610fe3565b905f614f73565b9196909491831115614fe457630760bdcf60e11b5f5260045ffd5b614fec612211565b6101008b0152614f10565b505091929460ff8061500f614ea8613fca8789613f91565b16036150445761010061502c612b1285615034966120b998611d92565b91015261206e565b5460101c6001600160a01b031690565b63b32eeb6960e01b5f5260045ffd5b908082186001600160a01b031615606083811b838501821b9081149184901b141717600114615083575050600190565b65ffffffffffff60a01b8216916001600160d01b03198082169083168415615103575b65ffffffffffff60a01b841680156150f3575b8581109086180280861895146150e2575b81811190821802189160018060a01b03911716171790565b65ffffffffffff60a01b94506150ca565b5065ffffffffffff60a01b6150b9565b65ffffffffffff60a01b94506150a6565b356001600160501b031981169291906016821061512f575050565b6001600160501b031960169290920360031b82901b16169150565b805468010000000000000000811015610f8c5761516c916001820181556148b5565b819291549060031b9160501c821b9160018060b01b03901b1916179055565b356001600160f01b031981169291906002821061226d575050565b91906151b29080614880565b9260fe84118015615496575b6154875760016151cd8261206e565b0154615474575b5f1984015f5b818110615336575090615299615292838761523261528361526a6134c461526461525e87612ff79e9f8e6152596152b59f8f9061070561282b61282561522461522a9489896122cd565b90611dea565b9a8b9161206e565b805462010000600160b01b03191660109290921b62010000600160b01b0316919091179055565b6122cd565b90611e18565b9061518b565b6152738861206e565b9060f01c61ffff19825416179055565b6001600160a01b0316966122cd565b8091611dfb565b6040519586939092906001600160e01b031916602085016148ca565b803b15610232575f6152db92604051809481926306d61fe760e41b8352600483016121ad565b038183855af19081156107dc575f516020615f9f5f395f51905f52926128ba92615322575b5060408051600681526001600160a01b03909216602083015290918291820190565b806107d65f61533093610fe3565b5f615300565b6153d19061537c60016153488661206e565b0161537661536961536361535d868d8c6122cd565b90611ddc565b90615114565b6001600160501b03191690565b9061514a565b61539661070561070561282b612825615224868d8c6122cd565b6153a4615292838a896122cd565b604051949185916153c3916001600160e01b03198a16602085016148ca565b03601f198101855284610fe3565b803b15610232576040516306d61fe760e41b8152925f9184918290849082906153fd90600483016121ad565b03925af19182156107dc57600192615460575b505f516020615f9f5f395f51905f5261545761543661282b612825615224868d8c6122cd565b60408051600581526001600160a01b03909216602083015290918291820190565b0390a1016151da565b806107d65f61546e93610fe3565b5f615410565b6154826001612fa28361206e565b6151d4565b63b62d956d60e01b5f5260045ffd5b5083156151be565b5f516020615f9f5f395f51905f52916040916001600160a01b0382161561551b575b6001600160a01b039081165f8181527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b8660205284902080546001600160a01b03191693909216929092179055815190600282526020820152a1565b600191506154c0565b91601382111561553f57823560601c92601401916013190190565b63ba597e7e5f526004601cfd5b90603381111561553f57813560601c92601483013592603401916033190190565b905f928491604051958692833738935af1913d82523d5f602084013e60203d830101604052565b90925f92819594604051968792833738935af1156155c1573d82523d5f602084013e60203d830101604052565b503d5f823e3d90fd5b918235826020118160401c1761553f5783016020810193813593846155ee57505050565b01601f190190835b5f190160208160051b8301013580830160608101908135809101918680602080860135809601011191111792171760401c1761553f57806155f657505050565b919061564181614601565b925f5b82811061565057505050565b8061567a60019260051b84013584016040810135810190602082359201906020810135903561556d565b6156848389613f19565b5215615691575b01615644565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76156da6156bf8389613f19565b51604051918291858352604060208401526040830190610d6e565b0390a161568b565b91906156ed81614601565b925f5b8281106156fc57505050565b8061572660019260051b840135840160408101358101906020823592019060208101359035615594565b6157308288613f19565b5261573b8187613f19565b50016156f0565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f0000000000000000000000000000000000000000000000000000000000000000461416156157cd575b6719010000000000005f52601a52603a526042601820905f603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f00000000000000000000000000000000000000000000000000000000000000006040820152466060820152306080820152206157b0565b60a061585e613da7565b90602081519101209060208151910120604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8352602083015260408201525f6060820152306080820152206719010000000000005f52601a52603a526042601820905f603a52565b9491848461594a9296959396604051906158e282610fc7565b5f82525f602083015260408201995f8b52615944606084019a8b925f84525f60808701525f60a0870152606060c087015261593560e08701915f83526101008801955f87529063ffffffff60e01b169052565b6001600160a01b039091169052565b526159ea565b60ff8061595d614ea8613fca8786613f91565b160361504457615034615977846159879561598c94611d92565b9490955163ffffffff60e01b1690565b61206e565b9351929190565b8065ffffffffffff8260a01c169182156001146159b1575b60d01c92565b65ffffffffffff92506159ab565b90926080926120b99594835260018060a01b0316602083015260408201528160608201520190610d6e565b9160608301906001615a3f615a06845163ffffffff60e01b1690565b6001600160e01b0319165f9081527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f8526020526040902090565b01805493905f5b858110615a565750505050505050565b615a66612f13612f0683856148b5565b6001600160a01b031660a0890190815260808901949091615a8f906001600160f01b0319168652565b615aa9615aa2614ea8613fca8985613f91565b60ff168a52565b615ab7614eae8a5160ff1690565b808403615c265750858181615adc614ee1614edb614ed5615b319b9c615b0498611dae565b8c60c0615af7612b1260208401948086526009018688611dbf565b9101525160090191611e54565b949094955b51600160f11b90615b23906001600160f01b0319166134c4565b166001600160f01b03191690565b15615b40575b50600101615a46565b51615b53906001600160a01b0316610705565b6020615b79615b6c615b6c895163ffffffff60e01b1690565b6001600160e01b03191690565b60e08a01516101008b015160c08c015160405163184dfdbb60e11b8152958694909385938493615bb89390926001600160a01b031690600486016159bf565b03915afa9081156107dc575f91615c08575b506001600160a01b038116615bf45790600191615bec60408a01918251615053565b905290615b37565b631f24c1fb60e11b5f52600482905260245ffd5b615c20915060203d81116138a4576138958183610fe3565b5f615bca565b909490831115615c3f57630760bdcf60e11b5f5260045ffd5b615b3190615c4e365f88612a9a565b60c08b0152615b09565b5f516020615fdf5f395f51905f52545f9493929060581b6001600160f81b03198116600160f81b03615d135791615cb89391615c9961070560209560581c90565b9160405195869485938493637aa8f17760e11b85523060048601612189565b03915afa9081156107dc575f91615cf4575b505b6001600160e01b0319166374eca2c160e11b01615ce557565b6362467c7760e11b5f5260045ffd5b615d0d915060203d6020116134875761347f8183610fe3565b5f615cca565b90949192916001600160f81b03198216600160f91b03615db45750602091615d419160081b958430886158c9565b60405163392dffaf60e01b81529297929586949385938493615d7493909230906001600160e01b03191660048701614b4c565b03916001600160a01b03165afa9081156107dc575f91615d95575b50615ccc565b615dae915060203d6020116134875761347f8183610fe3565b5f615d8f565b94906001600160f81b03191661244b57615dcd92614a93565b615ccc565b615ddf6105308383611d1d565b91602c8110615f8257602c820190615e0061070561282b6128258487611d48565b615e2a615e1c613fd8613fca615e168780612006565b90613f91565b6001600160f81b0319161590565b80615edd575b61070561282b61282585615e856102419a87615e6961070561282b6128258f9d6129559f9e8f604c9f6129ce9f615e8b575b5050611e43565b615e738b80612006565b9390926001600160a01b031690613f9a565b88611e43565b612955615ecf615ed693606c860190615eca615eb961070561282b612825615eb38787612006565b90611d59565b9586906001600160a01b031661549e565b612006565b8091611e26565b8f87615e62565b5060405163ecd0596160e01b81526002600482015290949291906020816024816001600160a01b038a165afa9384156107dc5761282b61282584615e85610705948b615e6961070561282b6102419f8f9c6129559f9d8f604c9f936129ce9f94612825955f91615f63575b509f50505050505050505097509a5050959650505050615e30565b615f7c915060203d602011610831576108238183610fe3565b5f615f48565b90506004915003615f8f57565b637a210a5d60e11b5f5260045ffdfed21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x24", "chainId": "0xde9fb" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x66dcf41505d80d7ac4c29e1e8927215b0bf6f3dba29e54a127e0a45d23cd0237", + "hash": "0xbd52b9839fe97264d39c685282605a51a795adcc89afa3a375f26ea62e92bef7", "transactionType": "CREATE2", "contractName": "KernelFactory", - "contractAddress": "0x7a149486b8ecba0916ef80bc23705e46dbe4d6c8", + "contractAddress": "0xe30c76dc9ecf1c19f6fec070674e1b4effe069fa", "function": null, "arguments": [ - "0x8768fA84bd76610ACc6AF35b578fE847e1CFf0cA" + "0xE264dCCc54e4b6906c0D1Fee11D4326c06D33c80" ], "transaction": { "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", "gas": "0x5d17a", "value": "0x0", - "input": "0x000000000000000000000000000000000000000000000000000000000000000060a034607357601f61044238819003918201601f19168301916001600160401b03831184841017607757808492602094604052833981010312607357516001600160a01b03811681036073576080526040516103b6908161008c823960805181818160c60152818161021d01526102d80152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816348aac39214610250575080635c60da1b146102085763ea6d13ac1461003d575f80fd5b6100463661033f565b60405161006c602080838181019587898837878201908382015203018084520182610394565b519020905f92604051927fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f60212060358501523060581b845260ff84538060158501526055842094341591863b156101eb5750506001906101e6575f38818034895af1156101d9575b836040525f60605215610157575b6040516001600160a01b0385168152602090f35b9180825f9493859483378101838152039082855af13d156101d4573d67ffffffffffffffff81116101c0576040519061019a601f8201601f191660200183610394565b81525f60203d92013e5b156101b1575f8080610143565b63487e630960e11b5f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b6101a4565b63b12d13eb5f526004601cfd5b610135565b91509450605f602134f593846101355763301164255f526004601cfd5b3461024c575f36600319011261024c576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b3461024c57806102826020806102653661033f565b908084889499019889378201908382015203018084520182610394565b5190206040517fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f602120906040525f60605260ff5f536035523060601b600152601552602060555f205f6035526040519060018060a01b03168152f35b90604060031983011261024c5760043567ffffffffffffffff811161024c578260238201121561024c5780600401359267ffffffffffffffff841161024c576024848301011161024c57602401919060243590565b90601f8019910116810190811067ffffffffffffffff8211176101c057604052560000000000000000000000008768fa84bd76610acc6af35b578fe847e1cff0ca", - "nonce": "0x22", + "input": "0x000000000000000000000000000000000000000000000000000000000000000060a034607357601f61044238819003918201601f19168301916001600160401b03831184841017607757808492602094604052833981010312607357516001600160a01b03811681036073576080526040516103b6908161008c823960805181818160c60152818161021d01526102d80152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816348aac39214610250575080635c60da1b146102085763ea6d13ac1461003d575f80fd5b6100463661033f565b60405161006c602080838181019587898837878201908382015203018084520182610394565b519020905f92604051927fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f60212060358501523060581b845260ff84538060158501526055842094341591863b156101eb5750506001906101e6575f38818034895af1156101d9575b836040525f60605215610157575b6040516001600160a01b0385168152602090f35b9180825f9493859483378101838152039082855af13d156101d4573d67ffffffffffffffff81116101c0576040519061019a601f8201601f191660200183610394565b81525f60203d92013e5b156101b1575f8080610143565b63487e630960e11b5f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b6101a4565b63b12d13eb5f526004601cfd5b610135565b91509450605f602134f593846101355763301164255f526004601cfd5b3461024c575f36600319011261024c576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b3461024c57806102826020806102653661033f565b908084889499019889378201908382015203018084520182610394565b5190206040517fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f602120906040525f60605260ff5f536035523060601b600152601552602060555f205f6035526040519060018060a01b03168152f35b90604060031983011261024c5760043567ffffffffffffffff811161024c578260238201121561024c5780600401359267ffffffffffffffff841161024c576024848301011161024c57602401919060243590565b90601f8019910116810190811067ffffffffffffffff8211176101c05760405256000000000000000000000000e264dccc54e4b6906c0d1fee11d4326c06d33c80", + "nonce": "0x25", "chainId": "0xde9fb" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0xa5367600a6be8e321bf917a5979e18dafdc140058027b34a1f2716b1fda12e13", + "hash": "0x22b35ccd1a06a49663d1ac944af7d7088bc3e38b47b684fb1982d7c8d1ed03fc", "transactionType": "CALL", "contractName": null, "contractAddress": "0xd703aae79538628d27099b8c4f621be4ccd142d5", "function": "approveFactory(address,bool)", "arguments": [ - "0x7A149486b8ECba0916Ef80Bc23705e46dbE4D6c8", + "0xE30c76Dc9eCF1c19F6Fec070674E1b4eFfE069FA", "true" ], "transaction": { @@ -57,8 +57,8 @@ "to": "0xd703aae79538628d27099b8c4f621be4ccd142d5", "gas": "0x108d1", "value": "0x0", - "input": "0x6e7dbabb0000000000000000000000007a149486b8ecba0916ef80bc23705e46dbe4d6c80000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x23", + "input": "0x6e7dbabb000000000000000000000000e30c76dc9ecf1c19f6fec070674e1b4effe069fa0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x26", "chainId": "0xde9fb" }, "additionalContracts": [], @@ -68,75 +68,75 @@ "receipts": [ { "status": "0x1", - "cumulativeGasUsed": "0x520e32", + "cumulativeGasUsed": "0x5323c6", "logs": [], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0x3b084e89fe78ec6ad227bc762285f7529a43d605148e6f39a8838818d1bfb674", + "transactionHash": "0xa5b9286c1b5263c88f07f9f1405716db0b6a2d16c1bb9d30620ed490729b8f48", "transactionIndex": "0x1", - "blockHash": "0xe734e5f89fe4cd44db775957c69728d29d876a86236b44f5fb9b89c8b4b7c198", - "blockNumber": "0x9dadb8", - "gasUsed": "0x5162e4", + "blockHash": "0xb95b3d7cb4067e8ff088b723b662acf9d84ba6083244db900732e9b27adbbb6b", + "blockNumber": "0xb5ab4b", + "gasUsed": "0x52786c", "effectiveGasPrice": "0xfd", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "contractAddress": "0x8768fa84bd76610acc6af35b578fe847e1cff0ca", + "contractAddress": "0xe264dccc54e4b6906c0d1fee11d4326c06d33c80", "l1BaseFeeScalar": "0xa6fe0", - "l1BlobBaseFee": "0x21ec", + "l1BlobBaseFee": "0xa814af", "l1BlobBaseFeeScalar": "0x0", - "l1Fee": "0x350133c62662b1", - "l1GasPrice": "0x1729ed7fb9", - "l1GasUsed": "0x3586c" + "l1Fee": "0x45b70ef17277c", + "l1GasPrice": "0x1e24f8068", + "l1GasUsed": "0x36192" }, { "status": "0x1", - "cumulativeGasUsed": "0x5608a5", + "cumulativeGasUsed": "0x571e39", "logs": [], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0x66dcf41505d80d7ac4c29e1e8927215b0bf6f3dba29e54a127e0a45d23cd0237", + "transactionHash": "0xbd52b9839fe97264d39c685282605a51a795adcc89afa3a375f26ea62e92bef7", "transactionIndex": "0x2", - "blockHash": "0xe734e5f89fe4cd44db775957c69728d29d876a86236b44f5fb9b89c8b4b7c198", - "blockNumber": "0x9dadb8", + "blockHash": "0xb95b3d7cb4067e8ff088b723b662acf9d84ba6083244db900732e9b27adbbb6b", + "blockNumber": "0xb5ab4b", "gasUsed": "0x3fa73", "effectiveGasPrice": "0xfd", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "contractAddress": "0x7a149486b8ecba0916ef80bc23705e46dbe4d6c8", + "contractAddress": "0xe30c76dc9ecf1c19f6fec070674e1b4effe069fa", "l1BaseFeeScalar": "0xa6fe0", - "l1BlobBaseFee": "0x21ec", + "l1BlobBaseFee": "0xa814af", "l1BlobBaseFeeScalar": "0x0", - "l1Fee": "0x2d75ccb73da5b", - "l1GasPrice": "0x1729ed7fb9", + "l1Fee": "0x3b28f697664b", + "l1GasPrice": "0x1e24f8068", "l1GasUsed": "0x2de8" }, { "status": "0x1", - "cumulativeGasUsed": "0x56bdb8", + "cumulativeGasUsed": "0x57d34c", "logs": [], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0xa5367600a6be8e321bf917a5979e18dafdc140058027b34a1f2716b1fda12e13", + "transactionHash": "0x22b35ccd1a06a49663d1ac944af7d7088bc3e38b47b684fb1982d7c8d1ed03fc", "transactionIndex": "0x3", - "blockHash": "0xe734e5f89fe4cd44db775957c69728d29d876a86236b44f5fb9b89c8b4b7c198", - "blockNumber": "0x9dadb8", + "blockHash": "0xb95b3d7cb4067e8ff088b723b662acf9d84ba6083244db900732e9b27adbbb6b", + "blockNumber": "0xb5ab4b", "gasUsed": "0xb513", "effectiveGasPrice": "0xfd", "from": "0x9775137314fe595c943712b0b336327dfa80ae8a", "to": "0xd703aae79538628d27099b8c4f621be4ccd142d5", "contractAddress": null, "l1BaseFeeScalar": "0xa6fe0", - "l1BlobBaseFee": "0x21ec", + "l1BlobBaseFee": "0xa814af", "l1BlobBaseFeeScalar": "0x0", - "l1Fee": "0x630670e86a13", - "l1GasPrice": "0x1729ed7fb9", + "l1Fee": "0x80de0ab5633", + "l1GasPrice": "0x1e24f8068", "l1GasUsed": "0x640" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1738927689, + "timestamp": 1740499935, "chain": 911867, - "commit": "234e3b6" + "commit": "9ebc75c" } \ No newline at end of file diff --git a/src/Kernel.sol b/src/Kernel.sol index 97e0a988..892c9d0b 100644 --- a/src/Kernel.sol +++ b/src/Kernel.sol @@ -110,8 +110,7 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager bytes[] calldata initConfig ) external { ValidationStorage storage vs = _validationStorage(); - if( - ValidationId.unwrap(vs.rootValidator) != bytes21(0) || bytes2(address(this).code) == EIP7702_PREFIX) { + if (ValidationId.unwrap(vs.rootValidator) != bytes21(0) || bytes3(address(this).code) == EIP7702_PREFIX) { revert AlreadyInitialized(); } if (ValidationId.unwrap(_rootValidator) == bytes21(0)) { @@ -164,7 +163,7 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager function _domainNameAndVersion() internal pure override returns (string memory name, string memory version) { name = "Kernel"; - version = "0.3.2"; + version = "0.3.3"; } receive() external payable { @@ -293,7 +292,8 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager { bytes memory context; IHook hook = executionHook[userOpHash]; - if (address(hook) != HOOK_MODULE_INSTALLED) { + bool callHook = address(hook) != HOOK_MODULE_INSTALLED; + if (callHook) { // removed 4bytes selector context = _doPreHook(hook, msg.value, userOp.callData[4:]); } @@ -301,7 +301,7 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager if (!success) { revert ExecutionReverted(); } - if (address(hook) != HOOK_MODULE_INSTALLED) { + if (callHook) { _doPostHook(hook, context); } } @@ -481,11 +481,7 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager } function supportsModule(uint256 moduleTypeId) external pure override returns (bool) { - if (moduleTypeId < 7) { - return true; - } else { - return false; - } + return moduleTypeId < 7; } function isModuleInstalled(uint256 moduleType, address module, bytes calldata additionalContext) @@ -507,7 +503,7 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager } function accountId() external pure override returns (string memory accountImplementationId) { - return "kernel.advanced.v0.3.2"; + return "kernel.advanced.v0.3.3"; } function supportsExecutionMode(ExecMode mode) external pure override returns (bool) { diff --git a/src/core/ExecutorManager.sol b/src/core/ExecutorManager.sol index d709a28b..1fe1b090 100644 --- a/src/core/ExecutorManager.sol +++ b/src/core/ExecutorManager.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.0; import {IHook, IExecutor, IModule} from "../interfaces/IERC7579Modules.sol"; import {IERC7579Account} from "../interfaces/IERC7579Account.sol"; -import {ModuleLib} from "../utils/ModuleLib.sol"; import {EXECUTOR_MANAGER_STORAGE_SLOT, MODULE_TYPE_EXECUTOR} from "../types/Constants.sol"; abstract contract ExecutorManager { @@ -32,7 +31,7 @@ abstract contract ExecutorManager { function _installExecutor(IExecutor executor, bytes calldata executorData, IHook hook) internal { _installExecutorWithoutInit(executor, hook); if (executorData.length == 0) { - (bool success,) = address(executor).call(abi.encodeWithSelector(IModule.onInstall.selector, hex"")); // ignore return value + (bool success,) = address(executor).call(abi.encodeWithSelector(IModule.onInstall.selector, executorData)); // ignore return value } else { executor.onInstall(executorData); } diff --git a/src/core/HookManager.sol b/src/core/HookManager.sol index 4fb92fcf..f75d7a96 100644 --- a/src/core/HookManager.sol +++ b/src/core/HookManager.sol @@ -31,10 +31,8 @@ abstract contract HookManager { if (address(hook) == address(0) || address(hook) == address(1)) { return; } - if (!hook.isInitialized(address(this))) { + if (!hook.isInitialized(address(this)) || (hookData.length > 0 && bytes1(hookData[0]) == bytes1(0xff))) { // if hook is not installed, it should call onInstall - hook.onInstall(hookData[1:]); - } else if (hookData.length > 0 && bytes1(hookData[0]) == bytes1(0xff)) { // 0xff means you want to explicitly call install hook hook.onInstall(hookData[1:]); } diff --git a/src/core/SelectorManager.sol b/src/core/SelectorManager.sol index e7644c79..78e1d8df 100644 --- a/src/core/SelectorManager.sol +++ b/src/core/SelectorManager.sol @@ -11,7 +11,6 @@ import { CALLTYPE_SINGLE, MODULE_TYPE_FALLBACK } from "../types/Constants.sol"; -import {ModuleLib} from "../utils/ModuleLib.sol"; abstract contract SelectorManager { error NotSupportedCallType(); diff --git a/src/core/ValidationManager.sol b/src/core/ValidationManager.sol index bb990fbb..3bb0c6a5 100644 --- a/src/core/ValidationManager.sol +++ b/src/core/ValidationManager.sol @@ -335,9 +335,8 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe ) ); } else if (vType == VALIDATION_TYPE_7702) { - validationData = _verify7702Signature(ECDSA.toEthSignedMessageHash(userOpHash), userOpSig) == ERC1271_MAGICVALUE - ? ValidationData.wrap(0) - : ValidationData.wrap(1); + validationData = _verify7702Signature(ECDSA.toEthSignedMessageHash(userOpHash), userOpSig) + == ERC1271_MAGICVALUE ? ValidationData.wrap(0) : ValidationData.wrap(1); } else { revert InvalidValidationType(); } @@ -349,27 +348,18 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe pure returns (bytes32) { - address sender = getSender(userOp); - uint256 nonce = userOp.nonce; - bytes32 hashInitCode = calldataKeccak(userOp.initCode); - bytes32 hashCallData = calldataKeccak(userOp.callData); - bytes32 accountGasLimits = userOp.accountGasLimits; - uint256 preVerificationGas = userOp.preVerificationGas; - bytes32 gasFees = userOp.gasFees; - bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData); - return keccak256( abi.encode( keccak256( abi.encode( - sender, - nonce, - hashInitCode, - hashCallData, - accountGasLimits, - preVerificationGas, - gasFees, - hashPaymasterAndData + getSender(userOp), + userOp.nonce, + calldataKeccak(userOp.initCode), + calldataKeccak(userOp.callData), + userOp.accountGasLimits, + userOp.preVerificationGas, + userOp.gasFees, + calldataKeccak(userOp.paymasterAndData) ) ), entryPoint, diff --git a/src/types/Constants.sol b/src/types/Constants.sol index 1bb36975..0d2ed12f 100644 --- a/src/types/Constants.sol +++ b/src/types/Constants.sol @@ -48,7 +48,7 @@ address constant HOOK_MODULE_INSTALLED = address(1); address constant HOOK_ONLY_ENTRYPOINT = address(0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF); // --- EIP7702 constants --- -bytes2 constant EIP7702_PREFIX = bytes2(0xef01); +bytes3 constant EIP7702_PREFIX = bytes3(0xef0100); // --- storage slots --- // bytes32(uint256(keccak256('kernel.v3.selector')) - 1) From 7f988f5ad3c6ae75da8e320dc84b7f32cbc63c93 Mon Sep 17 00:00:00 2001 From: leekt Date: Thu, 6 Mar 2025 21:00:41 +0900 Subject: [PATCH 12/14] chore: added DS_Store in gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 1ec91788..f9ff335c 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,5 @@ typechain-types/ # zerodev orchestra log/ .envrc + +**/.DS_Store From 469b186573182fdbf43188bddcba6858f686dc6f Mon Sep 17 00:00:00 2001 From: leekt Date: Thu, 6 Mar 2025 21:10:03 +0900 Subject: [PATCH 13/14] fix: use 0.3.3 for test --- test/base/Kernel7702TestBase.sol | 10 +++++----- test/base/KernelTestBase.sol | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/test/base/Kernel7702TestBase.sol b/test/base/Kernel7702TestBase.sol index 012a3c62..23dac8e3 100644 --- a/test/base/Kernel7702TestBase.sol +++ b/test/base/Kernel7702TestBase.sol @@ -184,10 +184,10 @@ contract Kernel7702TestBase is TestPlus, Test { bytes32 digest; if (isReplayable) { - digest = chainAgnosticHashTypedData(address(kernel), "Kernel", "0.3.2", hash); + digest = chainAgnosticHashTypedData(address(kernel), "Kernel", "0.3.3", hash); } else { digest = - keccak256(abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.2", address(kernel)), hash)); + keccak256(abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.3", address(kernel)), hash)); } return digest; @@ -1038,7 +1038,7 @@ contract Kernel7702TestBase is TestPlus, Test { function testSignatureRoot(bytes32 hash) external whenInitialized { bytes32 wrappedHash = keccak256(abi.encode(keccak256("Kernel(bytes32 hash)"), hash)); bytes32 digest = keccak256( - abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.2", address(kernel)), wrappedHash) + abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.3", address(kernel)), wrappedHash) ); bytes memory sig = _rootSignDigest(digest, true); sig = abi.encodePacked(hex"00", sig); @@ -1067,7 +1067,7 @@ contract Kernel7702TestBase is TestPlus, Test { bytes32 wrappedHash = keccak256(abi.encode(keccak256("Kernel(bytes32 hash)"), hash)); bytes32 digest = keccak256( - abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.2", address(kernel)), wrappedHash) + abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.3", address(kernel)), wrappedHash) ); bytes memory sig = _validatorSignDigest(digest, true); sig = abi.encodePacked(hex"01", address(enabledValidator), sig); @@ -1095,7 +1095,7 @@ contract Kernel7702TestBase is TestPlus, Test { ); bytes32 wrappedHash = keccak256(abi.encode(keccak256("Kernel(bytes32 hash)"), hash)); bytes32 digest = keccak256( - abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.2", address(kernel)), wrappedHash) + abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.3", address(kernel)), wrappedHash) ); bytes memory sig = _permissionSignDigest(digest, true); sig = abi.encodePacked(hex"02", PermissionId.unwrap(enabledPermission), hex"ff", sig); diff --git a/test/base/KernelTestBase.sol b/test/base/KernelTestBase.sol index 7c53a6cd..2081c251 100644 --- a/test/base/KernelTestBase.sol +++ b/test/base/KernelTestBase.sol @@ -191,10 +191,10 @@ abstract contract KernelTestBase is TestPlus, Test { bytes32 digest; if (isReplayable) { - digest = chainAgnosticHashTypedData(address(kernel), "Kernel", "0.3.2", hash); + digest = chainAgnosticHashTypedData(address(kernel), "Kernel", "0.3.3", hash); } else { digest = - keccak256(abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.2", address(kernel)), hash)); + keccak256(abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.3", address(kernel)), hash)); } return digest; @@ -1079,7 +1079,7 @@ abstract contract KernelTestBase is TestPlus, Test { function testSignatureRoot(bytes32 hash) external whenInitialized { bytes32 wrappedHash = keccak256(abi.encode(keccak256("Kernel(bytes32 hash)"), hash)); bytes32 digest = keccak256( - abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.2", address(kernel)), wrappedHash) + abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.3", address(kernel)), wrappedHash) ); bytes memory sig = _rootSignDigest(digest, true); sig = abi.encodePacked(hex"00", sig); @@ -1108,7 +1108,7 @@ abstract contract KernelTestBase is TestPlus, Test { bytes32 wrappedHash = keccak256(abi.encode(keccak256("Kernel(bytes32 hash)"), hash)); bytes32 digest = keccak256( - abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.2", address(kernel)), wrappedHash) + abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.3", address(kernel)), wrappedHash) ); bytes memory sig = _validatorSignDigest(digest, true); sig = abi.encodePacked(hex"01", address(enabledValidator), sig); @@ -1136,7 +1136,7 @@ abstract contract KernelTestBase is TestPlus, Test { ); bytes32 wrappedHash = keccak256(abi.encode(keccak256("Kernel(bytes32 hash)"), hash)); bytes32 digest = keccak256( - abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.2", address(kernel)), wrappedHash) + abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.3", address(kernel)), wrappedHash) ); bytes memory sig = _permissionSignDigest(digest, true); sig = abi.encodePacked(hex"02", PermissionId.unwrap(enabledPermission), hex"ff", sig); From 6ee816c5c7243de6050352d7ef906adef70bb664 Mon Sep 17 00:00:00 2001 From: leekt Date: Thu, 6 Mar 2025 21:11:30 +0900 Subject: [PATCH 14/14] updated github workflow --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 94c6b2c8..cad849ac 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,7 +20,7 @@ jobs: strategy: matrix: - profile: [post-prague,post-prague-via-ir,solc-past-versions-0,via-ir,min-solc,min-solc-via-ir] + profile: [post-prague,post-prague-via-ir,via-ir,min-solc,min-solc-via-ir] steps: - uses: actions/checkout@v4