From 874329e40f310e7fbe2f6d5568d778f6bf33b237 Mon Sep 17 00:00:00 2001 From: Dylan DesRosier Date: Sun, 7 Jul 2024 15:36:59 +0200 Subject: [PATCH] init --- .env.example | 12 + .gas-snapshot | 395 +++ .github/ISSUE_TEMPLATE/feature.md | 39 + .github/pull_request_template.md | 11 + .github/workflows/test.yml | 38 + .gitignore | 25 + .gitmodules | 18 + .solhint.json | 17 + .vscode/extensions.json | 1 + .vscode/settings.json | 8 + LICENSE-APACHE2.md | 201 ++ LICENSE-MIT.md | 21 + README.md | 120 + .../10/run-1720358512.json | 312 +++ .../10/run-1720359255.json | 340 +++ .../10/run-latest.json | 340 +++ .../137/run-1720358722.json | 925 +++++++ .../137/run-latest.json | 925 +++++++ .../42161/run-1720358427.json | 703 +++++ .../42161/run-latest.json | 703 +++++ .../59144/run-1720356824.json | 673 +++++ .../59144/run-latest.json | 673 +++++ .../8453/run-1720358475.json | 763 ++++++ .../8453/run-latest.json | 763 ++++++ documents/DeleGatorCore.md | 23 + documents/DelegationManager.md | 67 + documents/HybridDeleGator.md | 29 + documents/MultisigDeleGator.md | 27 + documents/StyleGuide.md | 163 ++ foundry.toml | 29 + lib/FreshCryptoLib | 1 + lib/account-abstraction | 1 + lib/forge-std | 1 + lib/openzeppelin-contracts | 1 + lib/solidity-bytes-utils | 1 + lib/solidity-stringutils | 1 + remappings.txt | 8 + script/DeployEnvironmentSetUp.s.sol | 106 + script/DeployMultiSigDeleGator.s.sol | 52 + script/coverage.sh | 40 + src/DeleGatorCore.sol | 425 +++ src/DelegationManager.sol | 265 ++ src/HybridDeleGator.sol | 389 +++ src/MultiSigDeleGator.sol | 356 +++ src/enforcers/AllowedCalldataEnforcer.sol | 71 + src/enforcers/AllowedMethodsEnforcer.sol | 61 + src/enforcers/AllowedTargetsEnforcer.sol | 58 + src/enforcers/BlockNumberEnforcer.sol | 49 + src/enforcers/CaveatEnforcer.sol | 17 + src/enforcers/DeployedEnforcer.sol | 91 + src/enforcers/ERC20BalanceGteEnforcer.sol | 104 + src/enforcers/ERC20TransferAmountEnforcer.sol | 75 + src/enforcers/IdEnforcer.sol | 68 + src/enforcers/LimitedCallsEnforcer.sol | 56 + src/enforcers/NonceEnforcer.sol | 65 + src/enforcers/TimestampEnforcer.sol | 49 + src/enforcers/ValueLteEnforcer.sol | 44 + src/interfaces/ICaveatEnforcer.sol | 55 + src/interfaces/IDeleGatorCore.sol | 19 + src/interfaces/IDeleGatorCoreFull.sol | 100 + src/interfaces/IDelegationManager.sol | 87 + src/interfaces/IERC173.sol | 18 + src/libraries/ERC1271Lib.sol | 13 + src/libraries/EncoderLib.sol | 54 + src/libraries/ExecutionLib.sol | 73 + src/libraries/P256FCLVerifierLib.sol | 51 + src/libraries/P256VerifierLib.sol | 98 + src/libraries/WebAuthn.sol | 150 ++ src/libraries/utils/Base64URL.sol | 31 + src/utils/Typehashes.sol | 12 + src/utils/Types.sol | 72 + test/CounterfactualAssetsTest.t.sol | 261 ++ test/DeleGatorTestSuite.t.sol | 2378 +++++++++++++++++ test/DelegationManagerTest.t.sol | 303 +++ test/HybridDeleGatorTest.t.sol | 975 +++++++ test/InviteTest.t.sol | 192 ++ test/MultiSigDeleGatorTest.t.sol | 919 +++++++ test/ProxyMigrationTest.t.sol | 192 ++ test/enforcers/AllowedCalldataEnforcer.t.sol | 273 ++ test/enforcers/AllowedMethodsEnforcer.t.sol | 189 ++ test/enforcers/AllowedTargetsEnforcer.t.sol | 189 ++ test/enforcers/BlockNumberEnforcer.t.sol | 184 ++ test/enforcers/CaveatEnforcerBaseTest.t.sol | 34 + test/enforcers/DeployedEnforcer.t.sol | 259 ++ test/enforcers/ERC20BalanceGteEnforcer.t.sol | 157 ++ .../ERC20TransferAmountEnforcer.t.sol | 300 +++ test/enforcers/IdEnforcer.t.sol | 121 + test/enforcers/LimitedCallsEnforcer.t.sol | 152 ++ test/enforcers/NonceEnforcer.t.sol | 116 + test/enforcers/PasswordEnforcer.t.sol | 205 ++ test/enforcers/TimestampEnforcer.t.sol | 187 ++ test/enforcers/ValueLteEnforcer.t.sol | 114 + test/metaTests/EncoderLibTest.t.sol | 82 + test/metaTests/StorageUtilsLibTest.t.sol | 25 + test/metaTests/TypehashTest.t.sol | 43 + test/utils/AccountSorterLib.t.sol | 56 + test/utils/BaseTest.t.sol | 425 +++ test/utils/BasicCF721.t.sol | 58 + test/utils/BasicERC20.t.sol | 43 + test/utils/Counter.t.sol | 24 + test/utils/FCLWrapperLib.sol | 65 + test/utils/Invalid1271.t.sol | 24 + test/utils/PasswordCaveatEnforcer.t.sol | 33 + test/utils/SigningUtilsLib.t.sol | 61 + test/utils/SimpleFactory.sol | 38 + test/utils/StorageUtilsLib.t.sol | 76 + test/utils/Types.t.sol | 43 + 107 files changed, 20448 insertions(+) create mode 100644 .env.example create mode 100644 .gas-snapshot create mode 100644 .github/ISSUE_TEMPLATE/feature.md create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/test.yml create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 .solhint.json create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 LICENSE-APACHE2.md create mode 100644 LICENSE-MIT.md create mode 100644 README.md create mode 100644 broadcast/DeployEnvironmentSetUp.s.sol/10/run-1720358512.json create mode 100644 broadcast/DeployEnvironmentSetUp.s.sol/10/run-1720359255.json create mode 100644 broadcast/DeployEnvironmentSetUp.s.sol/10/run-latest.json create mode 100644 broadcast/DeployEnvironmentSetUp.s.sol/137/run-1720358722.json create mode 100644 broadcast/DeployEnvironmentSetUp.s.sol/137/run-latest.json create mode 100644 broadcast/DeployEnvironmentSetUp.s.sol/42161/run-1720358427.json create mode 100644 broadcast/DeployEnvironmentSetUp.s.sol/42161/run-latest.json create mode 100644 broadcast/DeployEnvironmentSetUp.s.sol/59144/run-1720356824.json create mode 100644 broadcast/DeployEnvironmentSetUp.s.sol/59144/run-latest.json create mode 100644 broadcast/DeployEnvironmentSetUp.s.sol/8453/run-1720358475.json create mode 100644 broadcast/DeployEnvironmentSetUp.s.sol/8453/run-latest.json create mode 100644 documents/DeleGatorCore.md create mode 100644 documents/DelegationManager.md create mode 100644 documents/HybridDeleGator.md create mode 100644 documents/MultisigDeleGator.md create mode 100644 documents/StyleGuide.md create mode 100644 foundry.toml create mode 160000 lib/FreshCryptoLib create mode 160000 lib/account-abstraction create mode 160000 lib/forge-std create mode 160000 lib/openzeppelin-contracts create mode 160000 lib/solidity-bytes-utils create mode 160000 lib/solidity-stringutils create mode 100644 remappings.txt create mode 100644 script/DeployEnvironmentSetUp.s.sol create mode 100644 script/DeployMultiSigDeleGator.s.sol create mode 100755 script/coverage.sh create mode 100644 src/DeleGatorCore.sol create mode 100644 src/DelegationManager.sol create mode 100644 src/HybridDeleGator.sol create mode 100644 src/MultiSigDeleGator.sol create mode 100644 src/enforcers/AllowedCalldataEnforcer.sol create mode 100644 src/enforcers/AllowedMethodsEnforcer.sol create mode 100644 src/enforcers/AllowedTargetsEnforcer.sol create mode 100644 src/enforcers/BlockNumberEnforcer.sol create mode 100644 src/enforcers/CaveatEnforcer.sol create mode 100644 src/enforcers/DeployedEnforcer.sol create mode 100644 src/enforcers/ERC20BalanceGteEnforcer.sol create mode 100644 src/enforcers/ERC20TransferAmountEnforcer.sol create mode 100644 src/enforcers/IdEnforcer.sol create mode 100644 src/enforcers/LimitedCallsEnforcer.sol create mode 100644 src/enforcers/NonceEnforcer.sol create mode 100644 src/enforcers/TimestampEnforcer.sol create mode 100644 src/enforcers/ValueLteEnforcer.sol create mode 100644 src/interfaces/ICaveatEnforcer.sol create mode 100644 src/interfaces/IDeleGatorCore.sol create mode 100644 src/interfaces/IDeleGatorCoreFull.sol create mode 100644 src/interfaces/IDelegationManager.sol create mode 100644 src/interfaces/IERC173.sol create mode 100644 src/libraries/ERC1271Lib.sol create mode 100644 src/libraries/EncoderLib.sol create mode 100644 src/libraries/ExecutionLib.sol create mode 100644 src/libraries/P256FCLVerifierLib.sol create mode 100644 src/libraries/P256VerifierLib.sol create mode 100644 src/libraries/WebAuthn.sol create mode 100644 src/libraries/utils/Base64URL.sol create mode 100644 src/utils/Typehashes.sol create mode 100644 src/utils/Types.sol create mode 100644 test/CounterfactualAssetsTest.t.sol create mode 100644 test/DeleGatorTestSuite.t.sol create mode 100644 test/DelegationManagerTest.t.sol create mode 100644 test/HybridDeleGatorTest.t.sol create mode 100644 test/InviteTest.t.sol create mode 100644 test/MultiSigDeleGatorTest.t.sol create mode 100644 test/ProxyMigrationTest.t.sol create mode 100644 test/enforcers/AllowedCalldataEnforcer.t.sol create mode 100644 test/enforcers/AllowedMethodsEnforcer.t.sol create mode 100644 test/enforcers/AllowedTargetsEnforcer.t.sol create mode 100644 test/enforcers/BlockNumberEnforcer.t.sol create mode 100644 test/enforcers/CaveatEnforcerBaseTest.t.sol create mode 100644 test/enforcers/DeployedEnforcer.t.sol create mode 100644 test/enforcers/ERC20BalanceGteEnforcer.t.sol create mode 100644 test/enforcers/ERC20TransferAmountEnforcer.t.sol create mode 100644 test/enforcers/IdEnforcer.t.sol create mode 100644 test/enforcers/LimitedCallsEnforcer.t.sol create mode 100644 test/enforcers/NonceEnforcer.t.sol create mode 100644 test/enforcers/PasswordEnforcer.t.sol create mode 100644 test/enforcers/TimestampEnforcer.t.sol create mode 100644 test/enforcers/ValueLteEnforcer.t.sol create mode 100644 test/metaTests/EncoderLibTest.t.sol create mode 100644 test/metaTests/StorageUtilsLibTest.t.sol create mode 100644 test/metaTests/TypehashTest.t.sol create mode 100644 test/utils/AccountSorterLib.t.sol create mode 100644 test/utils/BaseTest.t.sol create mode 100644 test/utils/BasicCF721.t.sol create mode 100644 test/utils/BasicERC20.t.sol create mode 100644 test/utils/Counter.t.sol create mode 100644 test/utils/FCLWrapperLib.sol create mode 100644 test/utils/Invalid1271.t.sol create mode 100644 test/utils/PasswordCaveatEnforcer.t.sol create mode 100644 test/utils/SigningUtilsLib.t.sol create mode 100644 test/utils/SimpleFactory.sol create mode 100644 test/utils/StorageUtilsLib.t.sol create mode 100644 test/utils/Types.t.sol diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..059f7cf --- /dev/null +++ b/.env.example @@ -0,0 +1,12 @@ +# Required for scripts +PRIVATE_KEY= +SALT= +ENTRYPOINT_ADDRESS=0x0000000071727De22E5E9d8BAf0edAc6f37da032 +MULTISIG_DELEGATOR_IMPLEMENTATION_ADDRESS= + +# Required for verifying contracts +ETHERSCAN_API_KEY= + +# RPC URLs +MAINNET_RPC_URL=https://mainnet.infura.io/v3/ +LINEA_RPC_URL=https://linea-mainnet.infura.io/v3/ \ No newline at end of file diff --git a/.gas-snapshot b/.gas-snapshot new file mode 100644 index 0000000..37d4175 --- /dev/null +++ b/.gas-snapshot @@ -0,0 +1,395 @@ +AllowedCalldataEnforcerTest:test_failsWithInvalidTermsLength() (gas: 22806) +AllowedCalldataEnforcerTest:test_methodCanBeCalledWithSpecificMetadata() (gas: 25539) +AllowedCalldataEnforcerTest:test_singleMethodCanBeCalledWithEqualDynamicArrayParam() (gas: 32959) +AllowedCalldataEnforcerTest:test_singleMethodCanBeCalledWithEqualDynamicStringParam() (gas: 31833) +AllowedCalldataEnforcerTest:test_singleMethodCanBeCalledWithEqualParam() (gas: 21784) +AllowedCalldataEnforcerTest:test_singleMethodCanBeCalledWithEqualParamIntegration() (gas: 667292) +AllowedCalldataEnforcerTest:test_singleMethodCanNotBeCalledWithNonEqualParamIntegration() (gas: 480123) +AllowedCalldataEnforcerTest:test_singleMethodCanNotCalledWithInvalidTermsSize() (gas: 20232) +AllowedCalldataEnforcerTest:test_singleMethodCanNotCalledWithNonEqualParam() (gas: 22616) +AllowedMethodsEnforcerTest:test_getTermsInfoFailsForInvalidLength() (gas: 12141) +AllowedMethodsEnforcerTest:test_methodCanBeSingleMethodIntegration() (gas: 651654) +AllowedMethodsEnforcerTest:test_multiMethodCanBeCalled() (gas: 21595) +AllowedMethodsEnforcerTest:test_notAllow_invalidActionLength() (gas: 18051) +AllowedMethodsEnforcerTest:test_onlyApprovedMethodsCanBeCalled() (gas: 22542) +AllowedMethodsEnforcerTest:test_onlyApprovedMethodsCanBeCalledIntegration() (gas: 478827) +AllowedMethodsEnforcerTest:test_singleMethodCanBeCalled() (gas: 18951) +AllowedTargetsEnforcerTest:testFToken1() (gas: 2761) +AllowedTargetsEnforcerTest:testFToken2() (gas: 2803) +AllowedTargetsEnforcerTest:test_getTermsInfoFailsForInvalidLength() (gas: 12183) +AllowedTargetsEnforcerTest:test_multiTargetCanBeCalled() (gas: 25981) +AllowedTargetsEnforcerTest:test_multiTargetCanBeCalledIntegration() (gas: 974411) +AllowedTargetsEnforcerTest:test_onlyApprovedMethodsCanBeCalledIntegration() (gas: 489354) +AllowedTargetsEnforcerTest:test_onlyApprovedTargetsCanBeCalled() (gas: 28925) +AllowedTargetsEnforcerTest:test_singleTargetCanBeCalled() (gas: 18735) +BlockNumberEnforcerTest:test_getTermsInfoFailsForInvalidLength() (gas: 9755) +BlockNumberEnforcerTest:test_methodCanBeCalledAfterBlockNumber() (gas: 18148) +BlockNumberEnforcerTest:test_methodCanBeCalledAfterBlockNumberIntegration() (gas: 632477) +BlockNumberEnforcerTest:test_methodCanBeCalledBeforeBlockNumber() (gas: 17781) +BlockNumberEnforcerTest:test_methodCanBeCalledInsideBlockNumberRange() (gas: 18414) +BlockNumberEnforcerTest:test_methodFailsIfCalledAfterBlockNumber() (gas: 19076) +BlockNumberEnforcerTest:test_methodFailsIfCalledAfterBlockNumberRange() (gas: 19488) +BlockNumberEnforcerTest:test_methodFailsIfCalledBeforeBlockNumber() (gas: 18567) +BlockNumberEnforcerTest:test_methodFailsIfCalledBeforeBlockNumberRange() (gas: 18763) +CounterfactualAssetsTest:test_allow_createNftAndDelegateWithCaveatsAndRedelegate_offchain() (gas: 5154246) +CounterfactualAssetsTest:test_allow_createNftAndDelegateWithCaveats_offchain() (gas: 5080861) +CounterfactualAssetsTest:test_allow_createNftAndDelegate_offchain() (gas: 5027113) +DelegationManagerTest:test_allow_anyDelegateReads() (gas: 5921) +DelegationManagerTest:test_allow_contractNameReads() (gas: 7921) +DelegationManagerTest:test_allow_contractVersionReads() (gas: 8029) +DelegationManagerTest:test_allow_domainHashReads() (gas: 11049) +DelegationManagerTest:test_allow_domainHashReadsWhenChainIdChanges() (gas: 14836) +DelegationManagerTest:test_allow_domainVersionReads() (gas: 7875) +DelegationManagerTest:test_allow_getDelegationHash() (gas: 19919) +DelegationManagerTest:test_allow_rootAuthorityReads() (gas: 5837) +DelegationManagerTest:test_notAllow_crossDelegationManagerReplays() (gas: 3259077) +DelegationManagerTest:test_notAllow_invalidSignatureReturns() (gas: 211072) +DelegationManagerTest:test_notAllow_invalidSignatureReverts() (gas: 245145) +DelegationManagerTest:test_ownership_transferAndAcceptOwnership() (gas: 38437) +DelegationManagerTest:test_pausability_allowsOwnerToPause() (gas: 41993) +DelegationManagerTest:test_pausability_allowsOwnerToPauseRedemptions() (gas: 40129) +DelegationManagerTest:test_pausability_allowsOwnerToUnpause() (gas: 31656) +DelegationManagerTest:test_pausability_failsToPauseIfNotOwner() (gas: 19272) +DelegationManagerTest:test_pausability_failsToPauseWhenActivePause() (gas: 38830) +DelegationManagerTest:test_pausability_failsToPauseWhenActiveUnpause() (gas: 16132) +DelegationManagerTest:test_pausability_failsToUnpauseIfNotOwner() (gas: 43849) +DelegationManagerTest:test_pausability_validateInitialPauseState() (gas: 2983890) +DeployedEnforcerTest:test_deploysIfNonExistent() (gas: 287197) +DeployedEnforcerTest:test_deploysIfNonExistentAndAllowsToUseItIntegration() (gas: 798500) +DeployedEnforcerTest:test_doesNotDeployIfExistent() (gas: 180998) +DeployedEnforcerTest:test_event_factoryDeployedEvent() (gas: 155820) +DeployedEnforcerTest:test_revertIfContractIsEmpty() (gas: 66940) +DeployedEnforcerTest:test_revertIfFactoryAddressIsInvalid() (gas: 705668) +DeployedEnforcerTest:test_revertIfPredictedAddressDoesNotMatch() (gas: 174875) +DeployedEnforcerTest:test_revertIfTermsLengthIsInvalid() (gas: 19577) +DeployedEnforcerTest:test_revertsIfBytecodeDoesntExist() (gas: 1024174696) +DeployedEnforcerTest:test_shouldReadFactoryAddress() (gas: 7955) +ERC20BalanceGteEnforcerTest:test_allow_ifBalanceIncreases() (gas: 150972) +ERC20BalanceGteEnforcerTest:test_decodedTheTerms() (gas: 10835) +ERC20BalanceGteEnforcerTest:test_invalid_decodedTheTerms() (gas: 17801) +ERC20BalanceGteEnforcerTest:test_invalid_tokenAddress() (gas: 56499) +ERC20BalanceGteEnforcerTest:test_notAllow_expectingOverflow() (gas: 80199) +ERC20BalanceGteEnforcerTest:test_notAllow_insufficientIncrease() (gas: 107025) +ERC20BalanceGteEnforcerTest:test_notAllow_reenterALockedEnforcer() (gas: 172966) +ERC20TransferAmountEnforcerTest:test_methodFailsIfInvokesInvalidContract() (gas: 38087) +ERC20TransferAmountEnforcerTest:test_methodFailsIfInvokesInvalidMethod() (gas: 36682) +ERC20TransferAmountEnforcerTest:test_methodFailsIfInvokesInvalidTermsLength() (gas: 34745) +ERC20TransferAmountEnforcerTest:test_notAllow_invalidActionLength() (gas: 35318) +ERC20TransferAmountEnforcerTest:test_transferFailsAboveAllowance() (gas: 839655) +ERC20TransferAmountEnforcerTest:test_transferFailsIfCalledAboveAllowance() (gas: 58020) +ERC20TransferAmountEnforcerTest:test_transferSucceedsIfCalledBelowAllowance() (gas: 63660) +EncoderLibTest:test_ShouldEncodeAnArrayOfCaveats() (gas: 14116) +EncoderLibTest:test_ShouldEncodeOneCaveat() (gas: 6495) +EncoderLibTest:test_shouldEncodeOneDelegation() (gas: 10626) +HybridDeleGator_Test:test_allow_addKey() (gas: 494680) +HybridDeleGator_Test:test_allow_erc173InterfaceId() (gas: 14416) +HybridDeleGator_Test:test_allow_removeKey() (gas: 732973) +HybridDeleGator_Test:test_allow_replaceEOAWithEOA() (gas: 201287) +HybridDeleGator_Test:test_allow_replaceEOAWithEOAAndP256() (gas: 306400) +HybridDeleGator_Test:test_allow_replaceEOAWithEOAAndP256WithOffchainDelegation() (gas: 774890) +HybridDeleGator_Test:test_allow_replaceEOAWithEOAAndP256WithOnchainDelegation() (gas: 944226) +HybridDeleGator_Test:test_allow_replaceEOAWithP256() (gas: 297439) +HybridDeleGator_Test:test_allow_signatureWithEOA() (gas: 43120) +HybridDeleGator_Test:test_allow_signatureWithP256() (gas: 250607) +HybridDeleGator_Test:test_allow_signingWithWebAuthn() (gas: 508409) +HybridDeleGator_Test:test_allow_upgradingHybridDeleGator() (gas: 523442) +HybridDeleGator_Test:test_error_replacedSignersInputsMismatch() (gas: 47243) +HybridDeleGator_Test:test_error_replacedSignersToEmpty() (gas: 17362) +HybridDeleGator_Test:test_events_replacedSigners() (gas: 120022) +HybridDeleGator_Test:test_fails_signingWithWebAuthnWithInvalidType() (gas: 241562) +HybridDeleGator_Test:test_initialize_multipleP256OneEOA() (gas: 728348) +HybridDeleGator_Test:test_initialize_multipleP256ZeroEOA() (gas: 706117) +HybridDeleGator_Test:test_initialize_zeroP256OneEOA() (gas: 168585) +HybridDeleGator_Test:test_keyAdded_addKey() (gas: 495175) +HybridDeleGator_Test:test_keyAdded_initialize() (gas: 276464) +HybridDeleGator_Test:test_keyRemoved_removeKey() (gas: 732534) +HybridDeleGator_Test:test_notAllow_addKeyNotOnCurve() (gas: 19496) +HybridDeleGator_Test:test_notAllow_addingAnEmptyKey() (gas: 16635) +HybridDeleGator_Test:test_notAllow_addingExistingKey() (gas: 26432) +HybridDeleGator_Test:test_notAllow_invalidKeyOnDeploy() (gas: 104005) +HybridDeleGator_Test:test_notAllow_invalidSignatureLength() (gas: 24650) +HybridDeleGator_Test:test_notAllow_removingLastKeyViaEOA() (gas: 31448) +HybridDeleGator_Test:test_notAllow_removingLastKeyViaP256() (gas: 28302) +HybridDeleGator_Test:test_notAllow_removingNonExistantKey() (gas: 23498) +HybridDeleGator_Test:test_notAllow_renounceOwnership_Direct() (gas: 20326) +HybridDeleGator_Test:test_notAllow_transferOwnership_directNonOwner() (gas: 17729) +HybridDeleGator_Test:test_notAllow_transferOwnership_directOwner() (gas: 19706) +HybridDeleGator_Test:test_reinitialize_clearsAndSetSigners() (gas: 197577) +HybridDeleGator_Test:test_reinitialize_keepAndSetSigners() (gas: 212787) +HybridDeleGator_Test:test_removeP256KeyAndRearrangeStoredKeyIdHashes() (gas: 179883) +HybridDeleGator_Test:test_return_KeyIdHashes() (gas: 496239) +HybridDeleGator_Test:test_upgradeMultipleTimes() (gas: 597086) +HybridDeleGator_Test:test_upgradeWithoutStorageCleanup() (gas: 488197) +HybridDeleGator_TestSuite_EOA_Test:test_allow_chainOfOffchainDelegationToDeleGators() (gas: 355578) +HybridDeleGator_TestSuite_EOA_Test:test_allow_chainOfOffchainDelegationToEoa() (gas: 177648) +HybridDeleGator_TestSuite_EOA_Test:test_allow_chainOfOnchainDelegationToDeleGators() (gas: 696220) +HybridDeleGator_TestSuite_EOA_Test:test_allow_chainOfOnchainDelegationToEoa() (gas: 532503) +HybridDeleGator_TestSuite_EOA_Test:test_allow_deleGatorInvokeOffchainDelegation() (gas: 295543) +HybridDeleGator_TestSuite_EOA_Test:test_allow_deleGatorInvokeOnchainDelegation() (gas: 464863) +HybridDeleGator_TestSuite_EOA_Test:test_allow_disableOffchainDelegation() (gas: 609459) +HybridDeleGator_TestSuite_EOA_Test:test_allow_eoaInvokeOffchainDelegation() (gas: 120208) +HybridDeleGator_TestSuite_EOA_Test:test_allow_eoaInvokeOnchainDelegation() (gas: 303112) +HybridDeleGator_TestSuite_EOA_Test:test_allow_eoaRedelegateOffchainDelegation() (gas: 159820) +HybridDeleGator_TestSuite_EOA_Test:test_allow_getDeposit() (gas: 16946) +HybridDeleGator_TestSuite_EOA_Test:test_allow_getEntryPoint() (gas: 13363) +HybridDeleGator_TestSuite_EOA_Test:test_allow_getNonce() (gas: 17515) +HybridDeleGator_TestSuite_EOA_Test:test_allow_getNonceWithKey() (gas: 17865) +HybridDeleGator_TestSuite_EOA_Test:test_allow_invokeCombinedDelegationChain() (gas: 526905) +HybridDeleGator_TestSuite_EOA_Test:test_allow_invokeOffchainDelegationWithCaveats() (gas: 350726) +HybridDeleGator_TestSuite_EOA_Test:test_allow_invokeOnchainDelegationWithCaveats() (gas: 541406) +HybridDeleGator_TestSuite_EOA_Test:test_allow_multiActionCombination_UserOp() (gas: 345515) +HybridDeleGator_TestSuite_EOA_Test:test_allow_multiActionDelegationClaim_Offchain_UserOp() (gas: 355277) +HybridDeleGator_TestSuite_EOA_Test:test_allow_multiActionDelegationClaim_Onchain_UserOp() (gas: 514293) +HybridDeleGator_TestSuite_EOA_Test:test_allow_multiAction_UserOp() (gas: 229417) +HybridDeleGator_TestSuite_EOA_Test:test_allow_offchainOpenDelegation() (gas: 383284) +HybridDeleGator_TestSuite_EOA_Test:test_allow_offchainOpenDelegationRedelegation() (gas: 206716) +HybridDeleGator_TestSuite_EOA_Test:test_allow_onchainOpenDelegation() (gas: 568147) +HybridDeleGator_TestSuite_EOA_Test:test_allow_onchainOpenDelegationRedelegation() (gas: 588268) +HybridDeleGator_TestSuite_EOA_Test:test_allow_receiveNativeToken() (gas: 17890) +HybridDeleGator_TestSuite_EOA_Test:test_allow_resetDisabledDelegation() (gas: 459605) +HybridDeleGator_TestSuite_EOA_Test:test_allow_storeOnchainDelegation() (gas: 242935) +HybridDeleGator_TestSuite_EOA_Test:test_allow_updatingOffchainDelegationDisabledStateWithStruct() (gas: 333855) +HybridDeleGator_TestSuite_EOA_Test:test_allow_updatingOnchainDelegationDisabledStateWithStruct() (gas: 459525) +HybridDeleGator_TestSuite_EOA_Test:test_allow_withdrawDeposit() (gas: 299714) +HybridDeleGator_TestSuite_EOA_Test:test_emit_executedActionEvent() (gas: 75315) +HybridDeleGator_TestSuite_EOA_Test:test_emit_sentPrefund() (gas: 77389) +HybridDeleGator_TestSuite_EOA_Test:test_erc165_supportsInterface() (gas: 21974) +HybridDeleGator_TestSuite_EOA_Test:test_error_InvalidAuthority() (gas: 661059) +HybridDeleGator_TestSuite_EOA_Test:test_error_InvalidDelegate() (gas: 435881) +HybridDeleGator_TestSuite_EOA_Test:test_error_InvalidDelegator() (gas: 214334) +HybridDeleGator_TestSuite_EOA_Test:test_error_InvalidRootAuthority() (gas: 264276) +HybridDeleGator_TestSuite_EOA_Test:test_error_InvalidSignature() (gas: 268189) +HybridDeleGator_TestSuite_EOA_Test:test_error_InvalidSigner() (gas: 267866) +HybridDeleGator_TestSuite_EOA_Test:test_error_NoDelegationsProvided() (gas: 425587) +HybridDeleGator_TestSuite_EOA_Test:test_event_Deposited() (gas: 209795) +HybridDeleGator_TestSuite_EOA_Test:test_event_storeDelegation() (gas: 239350) +HybridDeleGator_TestSuite_EOA_Test:test_executesFirstRootAuthorityFound() (gas: 308469) +HybridDeleGator_TestSuite_EOA_Test:test_executionRevertsWithoutReason() (gas: 33370) +HybridDeleGator_TestSuite_EOA_Test:test_notAllow_alreadyExistingDelegation() (gas: 342392) +HybridDeleGator_TestSuite_EOA_Test:test_notAllow_callFromNonProxyAddress_IsValidSignature() (gas: 86155) +HybridDeleGator_TestSuite_EOA_Test:test_notAllow_callFromNonProxyAddress_ValidateUserOp() (gas: 89096) +HybridDeleGator_TestSuite_EOA_Test:test_notAllow_chainOfOffchainDelegationToDeleGators() (gas: 327670) +HybridDeleGator_TestSuite_EOA_Test:test_notAllow_delegatingForAnotherDelegator() (gas: 214399) +HybridDeleGator_TestSuite_EOA_Test:test_notAllow_delegationWithoutSignature() (gas: 42116) +HybridDeleGator_TestSuite_EOA_Test:test_notAllow_disableAlreadyDisabledDelegation() (gas: 476910) +HybridDeleGator_TestSuite_EOA_Test:test_notAllow_disablingInvalidDelegation() (gas: 214511) +HybridDeleGator_TestSuite_EOA_Test:test_notAllow_emptyAction_UserOp() (gas: 190853) +HybridDeleGator_TestSuite_EOA_Test:test_notAllow_enableAlreadyEnabledDelegation() (gas: 344423) +HybridDeleGator_TestSuite_EOA_Test:test_notAllow_eoaRedelegateOffchainDelegation() (gas: 89686) +HybridDeleGator_TestSuite_EOA_Test:test_notAllow_invalidEntryPoint() (gas: 5683108) +HybridDeleGator_TestSuite_EOA_Test:test_notAllow_invalidRedeemDelegationData() (gas: 255747) +HybridDeleGator_TestSuite_EOA_Test:test_notAllow_invalidUserOpSignature() (gas: 148688) +HybridDeleGator_TestSuite_EOA_Test:test_notAllow_invokeOffchainDelegationToAnotherUser() (gas: 243580) +HybridDeleGator_TestSuite_EOA_Test:test_notAllow_invokeOnchainDelegationToAnotherUser() (gas: 428504) +HybridDeleGator_TestSuite_EOA_Test:test_notAllow_multiActionUserOp() (gas: 217094) +HybridDeleGator_TestSuite_EOA_Test:test_notAllow_nonceReuse() (gas: 240656) +HybridDeleGator_TestSuite_EOA_Test:test_notAllow_notDelegationManager() (gas: 17406) +HybridDeleGator_TestSuite_EOA_Test:test_notAllow_notEntryPoint() (gas: 17408) +HybridDeleGator_TestSuite_P256_Test:test_allow_chainOfOffchainDelegationToDeleGators() (gas: 990394) +HybridDeleGator_TestSuite_P256_Test:test_allow_chainOfOffchainDelegationToEoa() (gas: 601105) +HybridDeleGator_TestSuite_P256_Test:test_allow_chainOfOnchainDelegationToDeleGators() (gas: 1327318) +HybridDeleGator_TestSuite_P256_Test:test_allow_chainOfOnchainDelegationToEoa() (gas: 964341) +HybridDeleGator_TestSuite_P256_Test:test_allow_deleGatorInvokeOffchainDelegation() (gas: 714784) +HybridDeleGator_TestSuite_P256_Test:test_allow_deleGatorInvokeOnchainDelegation() (gas: 889953) +HybridDeleGator_TestSuite_P256_Test:test_allow_disableOffchainDelegation() (gas: 1647104) +HybridDeleGator_TestSuite_P256_Test:test_allow_eoaInvokeOffchainDelegation() (gas: 325793) +HybridDeleGator_TestSuite_P256_Test:test_allow_eoaInvokeOnchainDelegation() (gas: 519648) +HybridDeleGator_TestSuite_P256_Test:test_allow_eoaRedelegateOffchainDelegation() (gas: 365405) +HybridDeleGator_TestSuite_P256_Test:test_allow_getDeposit() (gas: 16946) +HybridDeleGator_TestSuite_P256_Test:test_allow_getEntryPoint() (gas: 13363) +HybridDeleGator_TestSuite_P256_Test:test_allow_getNonce() (gas: 17515) +HybridDeleGator_TestSuite_P256_Test:test_allow_getNonceWithKey() (gas: 17865) +HybridDeleGator_TestSuite_P256_Test:test_allow_invokeCombinedDelegationChain() (gas: 1157169) +HybridDeleGator_TestSuite_P256_Test:test_allow_invokeOffchainDelegationWithCaveats() (gas: 773343) +HybridDeleGator_TestSuite_P256_Test:test_allow_invokeOnchainDelegationWithCaveats() (gas: 973484) +HybridDeleGator_TestSuite_P256_Test:test_allow_multiActionCombination_UserOp() (gas: 771321) +HybridDeleGator_TestSuite_P256_Test:test_allow_multiActionDelegationClaim_Offchain_UserOp() (gas: 985819) +HybridDeleGator_TestSuite_P256_Test:test_allow_multiActionDelegationClaim_Onchain_UserOp() (gas: 941092) +HybridDeleGator_TestSuite_P256_Test:test_allow_multiAction_UserOp() (gas: 434220) +HybridDeleGator_TestSuite_P256_Test:test_allow_offchainOpenDelegation() (gas: 1002124) +HybridDeleGator_TestSuite_P256_Test:test_allow_offchainOpenDelegationRedelegation() (gas: 624116) +HybridDeleGator_TestSuite_P256_Test:test_allow_onchainOpenDelegation() (gas: 993720) +HybridDeleGator_TestSuite_P256_Test:test_allow_onchainOpenDelegationRedelegation() (gas: 1013782) +HybridDeleGator_TestSuite_P256_Test:test_allow_receiveNativeToken() (gas: 17890) +HybridDeleGator_TestSuite_P256_Test:test_allow_resetDisabledDelegation() (gas: 1088252) +HybridDeleGator_TestSuite_P256_Test:test_allow_storeOnchainDelegation() (gas: 459475) +HybridDeleGator_TestSuite_P256_Test:test_allow_updatingOffchainDelegationDisabledStateWithStruct() (gas: 754627) +HybridDeleGator_TestSuite_P256_Test:test_allow_updatingOnchainDelegationDisabledStateWithStruct() (gas: 1103305) +HybridDeleGator_TestSuite_P256_Test:test_allow_withdrawDeposit() (gas: 718584) +HybridDeleGator_TestSuite_P256_Test:test_emit_executedActionEvent() (gas: 75315) +HybridDeleGator_TestSuite_P256_Test:test_emit_sentPrefund() (gas: 77389) +HybridDeleGator_TestSuite_P256_Test:test_erc165_supportsInterface() (gas: 21974) +HybridDeleGator_TestSuite_P256_Test:test_error_InvalidAuthority() (gas: 1302083) +HybridDeleGator_TestSuite_P256_Test:test_error_InvalidDelegate() (gas: 858882) +HybridDeleGator_TestSuite_P256_Test:test_error_InvalidDelegator() (gas: 430030) +HybridDeleGator_TestSuite_P256_Test:test_error_InvalidRootAuthority() (gas: 477650) +HybridDeleGator_TestSuite_P256_Test:test_error_InvalidSignature() (gas: 485631) +HybridDeleGator_TestSuite_P256_Test:test_error_InvalidSigner() (gas: 485308) +HybridDeleGator_TestSuite_P256_Test:test_error_NoDelegationsProvided() (gas: 847723) +HybridDeleGator_TestSuite_P256_Test:test_event_Deposited() (gas: 420427) +HybridDeleGator_TestSuite_P256_Test:test_event_storeDelegation() (gas: 453994) +HybridDeleGator_TestSuite_P256_Test:test_executesFirstRootAuthorityFound() (gas: 947294) +HybridDeleGator_TestSuite_P256_Test:test_executionRevertsWithoutReason() (gas: 33370) +HybridDeleGator_TestSuite_P256_Test:test_notAllow_alreadyExistingDelegation() (gas: 773922) +HybridDeleGator_TestSuite_P256_Test:test_notAllow_callFromNonProxyAddress_IsValidSignature() (gas: 89068) +HybridDeleGator_TestSuite_P256_Test:test_notAllow_callFromNonProxyAddress_ValidateUserOp() (gas: 92010) +HybridDeleGator_TestSuite_P256_Test:test_notAllow_chainOfOffchainDelegationToDeleGators() (gas: 968130) +HybridDeleGator_TestSuite_P256_Test:test_notAllow_delegatingForAnotherDelegator() (gas: 426933) +HybridDeleGator_TestSuite_P256_Test:test_notAllow_delegationWithoutSignature() (gas: 42116) +HybridDeleGator_TestSuite_P256_Test:test_notAllow_disableAlreadyDisabledDelegation() (gas: 1114803) +HybridDeleGator_TestSuite_P256_Test:test_notAllow_disablingInvalidDelegation() (gas: 429999) +HybridDeleGator_TestSuite_P256_Test:test_notAllow_emptyAction_UserOp() (gas: 405918) +HybridDeleGator_TestSuite_P256_Test:test_notAllow_enableAlreadyEnabledDelegation() (gas: 770045) +HybridDeleGator_TestSuite_P256_Test:test_notAllow_eoaRedelegateOffchainDelegation() (gas: 92804) +HybridDeleGator_TestSuite_P256_Test:test_notAllow_invalidEntryPoint() (gas: 5689142) +HybridDeleGator_TestSuite_P256_Test:test_notAllow_invalidRedeemDelegationData() (gas: 472286) +HybridDeleGator_TestSuite_P256_Test:test_notAllow_invalidUserOpSignature() (gas: 149804) +HybridDeleGator_TestSuite_P256_Test:test_notAllow_invokeOffchainDelegationToAnotherUser() (gas: 463030) +HybridDeleGator_TestSuite_P256_Test:test_notAllow_invokeOnchainDelegationToAnotherUser() (gas: 851505) +HybridDeleGator_TestSuite_P256_Test:test_notAllow_multiActionUserOp() (gas: 429628) +HybridDeleGator_TestSuite_P256_Test:test_notAllow_nonceReuse() (gas: 655989) +HybridDeleGator_TestSuite_P256_Test:test_notAllow_notDelegationManager() (gas: 17406) +HybridDeleGator_TestSuite_P256_Test:test_notAllow_notEntryPoint() (gas: 17408) +IdEnforcerEnforcerTest:testFToken1() (gas: 2805) +IdEnforcerEnforcerTest:test_blocksDelegationWithRepeatedNonce() (gas: 56530) +IdEnforcerEnforcerTest:test_decodedTheTerms() (gas: 7071) +IdEnforcerEnforcerTest:test_methodFailsIfCalledWithInvalidInputTerms() (gas: 17484) +IdEnforcerEnforcerTest:test_methodFailsIfNonceAlreadyUsed() (gas: 655300) +InviteTest:test_createADeleGatorForBobAndDelegate() (gas: 640568) +InviteTest:test_createADeleGatorForBobAndSend() (gas: 483624) +LimitedCallsEnforcerTest:test_methodCanBeCalledBelowLimitNumber() (gas: 60253) +LimitedCallsEnforcerTest:test_methodFailsAboveLimitIntegration() (gas: 664291) +LimitedCallsEnforcerTest:test_methodFailsIfCalledAboveLimitNumber() (gas: 61583) +LimitedCallsEnforcerTest:test_methodFailsIfCalledWithInvalidInputTerms() (gas: 17550) +MultiSigDeleGatorTest:test_DelegationManagerSetEvent() (gas: 4875423) +MultiSigDeleGatorTest:test_ImplementationUsesMaxThreshold() (gas: 7961) +MultiSigDeleGatorTest:test_InitializedImplementationEvent() (gas: 4875332) +MultiSigDeleGatorTest:test_InitializedSignersEvents() (gas: 351893) +MultiSigDeleGatorTest:test_ReinitializedSignersEvents() (gas: 145845) +MultiSigDeleGatorTest:test_allow_addSigner() (gas: 85585) +MultiSigDeleGatorTest:test_allow_deploySCAWithInitCode() (gas: 466035) +MultiSigDeleGatorTest:test_allow_getMaxSigners() (gas: 10841) +MultiSigDeleGatorTest:test_allow_getSignersCount() (gas: 13120) +MultiSigDeleGatorTest:test_allow_invokeOffchainDelegationWithMultipleSigners() (gas: 330143) +MultiSigDeleGatorTest:test_allow_invokeOnchainDelegationWithMultipleSigners() (gas: 489010) +MultiSigDeleGatorTest:test_allow_removeSigner() (gas: 232930) +MultiSigDeleGatorTest:test_allow_replaceSigner() (gas: 237682) +MultiSigDeleGatorTest:test_allow_updateMultiSigParameters_base() (gas: 587143) +MultiSigDeleGatorTest:test_allow_updatingThreshold() (gas: 84460) +MultiSigDeleGatorTest:test_error_Init_AlreadyASigner() (gas: 168435) +MultiSigDeleGatorTest:test_error_Init_InvalidSignerAddress() (gas: 98333) +MultiSigDeleGatorTest:test_error_Init_InvalidSignersLength() (gas: 301249) +MultiSigDeleGatorTest:test_error_Init_InvalidThreshold() (gas: 188429) +MultiSigDeleGatorTest:test_error_Init_thresholdGreaterThanSigners() (gas: 131752) +MultiSigDeleGatorTest:test_error_updateSigParamatersAlreadyASigner() (gas: 74645) +MultiSigDeleGatorTest:test_error_updateSigParamatersContractNewSigner() (gas: 26709) +MultiSigDeleGatorTest:test_error_updateSigParamatersZeroNewSigner() (gas: 21964) +MultiSigDeleGatorTest:test_error_updateSigParametersInvalidThreshold() (gas: 18741) +MultiSigDeleGatorTest:test_notAllow_addSigner() (gas: 1629243) +MultiSigDeleGatorTest:test_notAllow_invalidSignatureLength() (gas: 173175) +MultiSigDeleGatorTest:test_notAllow_invalidSigners() (gas: 189597) +MultiSigDeleGatorTest:test_notAllow_removeSigner() (gas: 116529) +MultiSigDeleGatorTest:test_notAllow_replaceSigner() (gas: 61732) +MultiSigDeleGatorTest:test_notAllow_signerReuse() (gas: 175049) +MultiSigDeleGatorTest:test_notAllow_updateMultiSigParameters_access() (gas: 42297) +MultiSigDeleGatorTest:test_notAllow_updateMultiSigParameters_maxNumberOfSigners() (gas: 47188) +MultiSigDeleGatorTest:test_notAllow_updateMultiSigParameters_threshold() (gas: 35539) +MultiSigDeleGatorTest:test_notAllow_updateMultiSigParameters_thresholdKeepingSigners() (gas: 29645) +MultiSigDeleGatorTest:test_notAllow_updatingThreshold() (gas: 90063) +MultiSigDeleGatorTest:test_reinitialize_clearsAndSetSigners() (gas: 134181) +MultiSigDeleGatorTest:test_reinitialize_keepAndSetSigners() (gas: 152132) +MultiSigDeleGatorTest:test_return_ifAnAddressIsAValidSigner() (gas: 22702) +MultiSigDeleGatorTest:test_unauthorizedReinitializeCall() (gas: 27056) +MultiSig_TestSuite_Test:test_allow_chainOfOffchainDelegationToDeleGators() (gas: 373832) +MultiSig_TestSuite_Test:test_allow_chainOfOffchainDelegationToEoa() (gas: 189749) +MultiSig_TestSuite_Test:test_allow_chainOfOnchainDelegationToDeleGators() (gas: 714476) +MultiSig_TestSuite_Test:test_allow_chainOfOnchainDelegationToEoa() (gas: 544605) +MultiSig_TestSuite_Test:test_allow_deleGatorInvokeOffchainDelegation() (gas: 307734) +MultiSig_TestSuite_Test:test_allow_deleGatorInvokeOnchainDelegation() (gas: 477054) +MultiSig_TestSuite_Test:test_allow_disableOffchainDelegation() (gas: 631667) +MultiSig_TestSuite_Test:test_allow_eoaInvokeOffchainDelegation() (gas: 126247) +MultiSig_TestSuite_Test:test_allow_eoaInvokeOnchainDelegation() (gas: 309151) +MultiSig_TestSuite_Test:test_allow_eoaRedelegateOffchainDelegation() (gas: 165860) +MultiSig_TestSuite_Test:test_allow_getDeposit() (gas: 16968) +MultiSig_TestSuite_Test:test_allow_getEntryPoint() (gas: 13385) +MultiSig_TestSuite_Test:test_allow_getNonce() (gas: 17515) +MultiSig_TestSuite_Test:test_allow_getNonceWithKey() (gas: 17821) +MultiSig_TestSuite_Test:test_allow_invokeCombinedDelegationChain() (gas: 545161) +MultiSig_TestSuite_Test:test_allow_invokeOffchainDelegationWithCaveats() (gas: 362917) +MultiSig_TestSuite_Test:test_allow_invokeOnchainDelegationWithCaveats() (gas: 553599) +MultiSig_TestSuite_Test:test_allow_multiActionCombination_UserOp() (gas: 357663) +MultiSig_TestSuite_Test:test_allow_multiActionDelegationClaim_Offchain_UserOp() (gas: 369333) +MultiSig_TestSuite_Test:test_allow_multiActionDelegationClaim_Onchain_UserOp() (gas: 526509) +MultiSig_TestSuite_Test:test_allow_multiAction_UserOp() (gas: 235434) +MultiSig_TestSuite_Test:test_allow_offchainOpenDelegation() (gas: 397294) +MultiSig_TestSuite_Test:test_allow_offchainOpenDelegationRedelegation() (gas: 218817) +MultiSig_TestSuite_Test:test_allow_onchainOpenDelegation() (gas: 580317) +MultiSig_TestSuite_Test:test_allow_onchainOpenDelegationRedelegation() (gas: 600371) +MultiSig_TestSuite_Test:test_allow_receiveNativeToken() (gas: 17890) +MultiSig_TestSuite_Test:test_allow_resetDisabledDelegation() (gas: 473991) +MultiSig_TestSuite_Test:test_allow_storeOnchainDelegation() (gas: 249018) +MultiSig_TestSuite_Test:test_allow_updatingOffchainDelegationDisabledStateWithStruct() (gas: 344221) +MultiSig_TestSuite_Test:test_allow_updatingOnchainDelegationDisabledStateWithStruct() (gas: 473956) +MultiSig_TestSuite_Test:test_allow_withdrawDeposit() (gas: 309795) +MultiSig_TestSuite_Test:test_emit_executedActionEvent() (gas: 75271) +MultiSig_TestSuite_Test:test_emit_sentPrefund() (gas: 80123) +MultiSig_TestSuite_Test:test_erc165_supportsInterface() (gas: 21674) +MultiSig_TestSuite_Test:test_error_InvalidAuthority() (gas: 679338) +MultiSig_TestSuite_Test:test_error_InvalidDelegate() (gas: 448095) +MultiSig_TestSuite_Test:test_error_InvalidDelegator() (gas: 220418) +MultiSig_TestSuite_Test:test_error_InvalidRootAuthority() (gas: 270337) +MultiSig_TestSuite_Test:test_error_InvalidSignature() (gas: 280239) +MultiSig_TestSuite_Test:test_error_InvalidSigner() (gas: 279916) +MultiSig_TestSuite_Test:test_error_NoDelegationsProvided() (gas: 437800) +MultiSig_TestSuite_Test:test_event_Deposited() (gas: 215812) +MultiSig_TestSuite_Test:test_event_storeDelegation() (gas: 245433) +MultiSig_TestSuite_Test:test_executesFirstRootAuthorityFound() (gas: 326745) +MultiSig_TestSuite_Test:test_executionRevertsWithoutReason() (gas: 33348) +MultiSig_TestSuite_Test:test_notAllow_alreadyExistingDelegation() (gas: 352538) +MultiSig_TestSuite_Test:test_notAllow_callFromNonProxyAddress_IsValidSignature() (gas: 88375) +MultiSig_TestSuite_Test:test_notAllow_callFromNonProxyAddress_ValidateUserOp() (gas: 91317) +MultiSig_TestSuite_Test:test_notAllow_chainOfOffchainDelegationToDeleGators() (gas: 345947) +MultiSig_TestSuite_Test:test_notAllow_delegatingForAnotherDelegator() (gas: 220527) +MultiSig_TestSuite_Test:test_notAllow_delegationWithoutSignature() (gas: 42205) +MultiSig_TestSuite_Test:test_notAllow_disableAlreadyDisabledDelegation() (gas: 491164) +MultiSig_TestSuite_Test:test_notAllow_disablingInvalidDelegation() (gas: 220551) +MultiSig_TestSuite_Test:test_notAllow_emptyAction_UserOp() (gas: 196870) +MultiSig_TestSuite_Test:test_notAllow_enableAlreadyEnabledDelegation() (gas: 354613) +MultiSig_TestSuite_Test:test_notAllow_eoaRedelegateOffchainDelegation() (gas: 91906) +MultiSig_TestSuite_Test:test_notAllow_invalidEntryPoint() (gas: 5687534) +MultiSig_TestSuite_Test:test_notAllow_invalidRedeemDelegationData() (gas: 261808) +MultiSig_TestSuite_Test:test_notAllow_invalidUserOpSignature() (gas: 154586) +MultiSig_TestSuite_Test:test_notAllow_invokeOffchainDelegationToAnotherUser() (gas: 251952) +MultiSig_TestSuite_Test:test_notAllow_invokeOnchainDelegationToAnotherUser() (gas: 440717) +MultiSig_TestSuite_Test:test_notAllow_multiActionUserOp() (gas: 223111) +MultiSig_TestSuite_Test:test_notAllow_nonceReuse() (gas: 248536) +MultiSig_TestSuite_Test:test_notAllow_notDelegationManager() (gas: 17384) +MultiSig_TestSuite_Test:test_notAllow_notEntryPoint() (gas: 17386) +NonceEnforcerTest:test_allow_incrementingId() (gas: 45496) +NonceEnforcerTest:test_allow_validId() (gas: 27573) +NonceEnforcerTest:test_decodedTheTerms() (gas: 11687) +NonceEnforcerTest:test_invalid_decodedTheTerms() (gas: 14368) +NonceEnforcerTest:test_notAllow_invalidId() (gas: 62867) +PasswordEnforcerTest:test_userInputCorrectArgsWorks() (gas: 17351) +PasswordEnforcerTest:test_userInputCorrectArgsWorksWithOffchainDelegation() (gas: 324319) +PasswordEnforcerTest:test_userInputCorrectArgsWorksWithOnchainDelegation() (gas: 515138) +PasswordEnforcerTest:test_userInputIncorrectArgs() (gas: 18166) +PasswordEnforcerTest:test_userInputIncorrectArgsWithOnchainDelegation() (gas: 475032) +PasswordEnforcerTest:test_userInputIncorrectArgsWorksWithOffchainDelegation() (gas: 283210) +StorageUtilsLibTest:testToBool() (gas: 17570) +TimestampEnforcerTest:test_methodCanBeCalledAfterTimestamp() (gas: 18300) +TimestampEnforcerTest:test_methodCanBeCalledAfterTimestampIntegration() (gas: 632716) +TimestampEnforcerTest:test_methodCanBeCalledBeforeTimestamp() (gas: 17780) +TimestampEnforcerTest:test_methodCanBeCalledInsideTimestampRange() (gas: 18525) +TimestampEnforcerTest:test_methodFailsIfCalledAfterTimestamp() (gas: 19141) +TimestampEnforcerTest:test_methodFailsIfCalledAfterTimestampRange() (gas: 19573) +TimestampEnforcerTest:test_methodFailsIfCalledBeforeTimestampRange() (gas: 18762) +TimestampEnforcerTest:test_methodFailsIfCalledTimestamp() (gas: 18568) +TimestampEnforcerTest:test_methodFailsIfCalledWithInvalidInputTerms() (gas: 17578) +TypehashTest:test_CaveatTypehash() (gas: 7811) +TypehashTest:test_DelegationTypehash() (gas: 18857) +TypehashTest:test_EIP712DomainTypehash() (gas: 10048) +ValueLteEnforcerTest:test_allow_decodeTerms() (gas: 11764) +ValueLteEnforcerTest:test_allow_valueLte() (gas: 15950) +ValueLteEnforcerTest:test_notAllow_decodeTerms() (gas: 17198) +ValueLteEnforcerTest:test_notAllow_valueGt() (gas: 15174) \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature.md b/.github/ISSUE_TEMPLATE/feature.md new file mode 100644 index 0000000..216b445 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature.md @@ -0,0 +1,39 @@ +--- +name: Feature +about: For new features +title: '' +labels: '' +assignees: '' + +--- + +### **Description** + +Describe the task. What does this aim to implement? + +### **Technical Details** + +- Implementation details +- Insight to what needs to be done +- Etc. + +### **Acceptance Criteria** + +- Are metrics required? +- Are translations required? +- Cases to satisfy +- XYZ should work +- Etc. + +Scenario: xxxx +- GIVEN a user is in x state +- WHEN a user does x +- AND a user does x +- THEN x should occur + +### **References** + +- References go here. +- Issue numbers. Links. +- Slack threads. +- Etc. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..b13e082 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,11 @@ +### **What?** + +- + +### **Why?** + +- + +### **How?** + +- diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..1ab62dc --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,38 @@ +name: Tests + +on: [push, pull_request] + +jobs: + pre_job: + continue-on-error: true + runs-on: ubuntu-latest + permissions: + actions: "read" + outputs: + should_skip: ${{ steps.skip_check.outputs.should_skip }} + steps: + - id: skip_check + uses: MetaMask/skip-duplicate-actions@v5 + with: + concurrent_skipping: same_content_newer + + tests: + needs: pre_job + if: needs.pre_job.outputs.should_skip != 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Install Foundry + uses: MetaMask/foundry-toolchain@v1 + with: + version: nightly + + - name: Run Forge Install + run: forge install + + - name: Check contract sizes + run: forge build --sizes --skip test --skip script + + - name: Run tests + run: forge test -vvv diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7d052f1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# Compiler files +cache/ +out/ + +# Ignores development broadcast logs +/broadcast/**/dry-run/ + +report/ + +# Docs +docs/ + +# Dotenv file +*.env + +# Files +*.log +.DS_Store + +# Coverage +coverage/ +filtered-lcov.info + +# Node Modules +node_modules/ \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..3621929 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,18 @@ +[submodule "lib/forge-std"] + path = lib/forge-std + url = https://github.com/foundry-rs/forge-std +[submodule "lib/solidity-bytes-utils"] + path = lib/solidity-bytes-utils + url = https://github.com/GNSPS/solidity-bytes-utils +[submodule "lib/solidity-stringutils"] + path = lib/solidity-stringutils + url = https://github.com/Arachnid/solidity-stringutils +[submodule "lib/FreshCryptoLib"] + path = lib/FreshCryptoLib + url = https://github.com/rdubois-crypto/FreshCryptoLib +[submodule "lib/openzeppelin-contracts"] + path = lib/openzeppelin-contracts + url = https://github.com/OpenZeppelin/openzeppelin-contracts +[submodule "lib/account-abstraction"] + path = lib/account-abstraction + url = https://github.com/eth-infinitism/account-abstraction diff --git a/.solhint.json b/.solhint.json new file mode 100644 index 0000000..adcb360 --- /dev/null +++ b/.solhint.json @@ -0,0 +1,17 @@ +{ + "extends": "solhint:recommended", + "rules": { + "code-complexity": "off", + "compiler-version": ["error", "0.8.23"], + "const-name-snakecase": "off", + "contract-name-camelcase": "off", + "func-name-mixedcase": "off", + "func-visibility": ["error", { "ignoreConstructors": true }], + "max-line-length": ["error", 132], + "no-console": "off", + "no-global-import": "off", + "no-inline-assembly": "off", + "not-rely-on-time": "off", + "var-name-mixedcase": "off" + } +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..3044971 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1 @@ +{ "recommendations": ["NomicFoundation.hardhat-solidity"] } diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..f004dcf --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "editor.formatOnSave": true, + "[solidity]": { + "editor.defaultFormatter": "NomicFoundation.hardhat-solidity" + }, + "npm.exclude": "**/lib/**", + "solidity.formatter": "forge" +} diff --git a/LICENSE-APACHE2.md b/LICENSE-APACHE2.md new file mode 100644 index 0000000..609da6f --- /dev/null +++ b/LICENSE-APACHE2.md @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2022 ConsenSys Software Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/LICENSE-MIT.md b/LICENSE-MIT.md new file mode 100644 index 0000000..6ca719f --- /dev/null +++ b/LICENSE-MIT.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 ConsenSys Software Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..50f11c8 --- /dev/null +++ b/README.md @@ -0,0 +1,120 @@ +# DeleGator Smart Account + +A DeleGator Smart Account is a 4337-compatible Smart Account that implements delegation functionality. An end user will operate through a DeleGatorProxy which uses a chosen DeleGator implementation. + +## Overview + +An end user controls a DeleGator Proxy that USES a DeleGator Implementation which IMPLEMENTS DeleGatorCore and interacts with a DelegationManager. + +### Delegations + +A Delegation enables the ability to share the capability to invoke some onchain action entirely offchain in a secure manner. [Caveats](#caveats) can be combined to create delegations with restricted functionality that users can extend, share or redeem. + +A simple example is "Alice delegates the ability to use her USDC to Bob limiting the amount to 100 USDC". + +[Read more on "Delegations" ->](/documents/DelegationManager.md#Delegations) + +### DeleGator + +A DeleGator is the contract an end user controls and uses to interact with other contracts onchain. A DeleGator is an [EIP-1967](https://eips.ethereum.org/EIPS/eip-1967[EIP1967]) proxy contract that uses a DeleGator Implementation which defines the granular details of how the DeleGator works. Users are free to migrate their DeleGator Implementation as their needs change. + +### DeleGator Core + +The DeleGator Core includes the Delegation execution and ERC-4337 functionality to make the Smart Account work. + +[Read more on "DeleGator Core" ->](/documents/DeleGatorCore.md) + +### DeleGator Implementation + +A DeleGator Implementation contains the logic for a DeleGator Smart Account. Each DeleGator Implementation must include the required methods for a DeleGator Smart Account, namely the signature scheme to be used for verifying access to control the contract. A few examples are the MultiSigDeleGator and the HybridDeleGator. + +[Read more on "MultiSig DeleGator" ->](/documents/MultisigDeleGator.md) + +[Read more on "Hybrid DeleGator" ->](/documents/HybridDeleGator.md) + +### Delegation Manager + +The Delegation Manager includes the logic for validating and executing Delegations. + +[Read more on "Delegation Manager" ->](/documents/DelegationManager.md) + +### Caveat Enforcers + +Caveats are used to add restrictions and rules for Delegations. By default, a Delegation allows the delegate to make **any** onchain action so caveats are strongly recommended. They are managed by Caveat Enforcer contracts. + +Developers can build new Caveat Enforcers for their own use cases, and the possibilities are endless. Developers can optimize their Delegations by making extremely specific and granular caveats for their individual use cases. + +[Read more on "Caveats" ->](/documents/DelegationManager.md#Caveats) + +## Development + +### Third Party Developers + +There's several touchpoints where developers may be using or extending a DeleGator Smart Account. + +- Developers can build custom DeleGator Implementations that use the [DeleGator Core](https://github.com/MetaMask/DeleGator/blob/main/src/DeleGatorCore.sol) to create new ways for end users to control and manage their Smart Accounts. +- Developers can write any contract that meets the [DeleGator Core Interface](https://github.com/MetaMask/DeleGator/blob/main/src/interfaces/IDeleGatorCore.sol) to create novel ways of delegating functionality. +- Developers can create custom Caveat Enforcers to refine the capabilities of a delegation for any use case they imagine. +- Developers can craft Delegations to then share onchain capabilities entirely offchain. + +### Foundry + +This repo uses [Foundry](https://book.getfoundry.sh/). + +#### Build + +```shell +forge build +``` + +#### Test + +```shell +forge test +``` + +#### Deploying + +0. Copy `.env.example` to `.env` and populate the variables you plan to use if you plan to deploy any contracts. + +```shell +source .env +``` + +1. Use [Anvil](https://book.getfoundry.sh/reference/anvil/) to run a local fork of a blockchain to develop in an isolated environment. + +```shell +anvil -f +``` + +2. Deploy the necessary environment contracts. + +> NOTE: As this system matures, this step will no longer be required for public chains where the DeleGator is in use. + +```shell +forge script script/DeployEnvironmentSetUp.s.sol --rpc-url --private-key $PRIVATE_KEY --broadcast +``` + +### Javascript + +Read more [here](https://www.notion.so/DeleGator-Developer-Guide-aaa11e5462e8422a85bc8ad70b8d14dc?pvs=4). + +### Notes + +- We're building against solidity version [0.8.23](https://github.com/ethereum/solidity/releases/tag/v0.8.23) for the time being. +- Format on save using the Forge formatter. + +### Style Guide + +[Read more on "Style Guide" ->](/documents/StyleGuide.md) + +## Relevant Documents + +- [EIP-712](https://eips.ethereum.org/EIPS/eip-712) +- [EIP-1014](https://eips.ethereum.org/EIPS/eip-1014) +- [EIP-1271](https://eips.ethereum.org/EIPS/eip-1271) +- [EIP-1822](https://eips.ethereum.org/EIPS/eip-1822) +- [EIP-1967](https://eips.ethereum.org/EIPS/eip-1967) +- [EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) +- [EIP-7201](https://eips.ethereum.org/EIPS/eip-7201) +- [EIP-7212](https://eips.ethereum.org/EIPS/eip-7212) diff --git a/broadcast/DeployEnvironmentSetUp.s.sol/10/run-1720358512.json b/broadcast/DeployEnvironmentSetUp.s.sol/10/run-1720358512.json new file mode 100644 index 0000000..87cee1b --- /dev/null +++ b/broadcast/DeployEnvironmentSetUp.s.sol/10/run-1720358512.json @@ -0,0 +1,312 @@ +{ + "transactions": [ + { + "hash": "0x2270564bebbd702c02bab39b94883b98ac6cfdd8e9e1c6a3d9f379793920a39f", + "transactionType": "CREATE2", + "contractName": "DelegationManager", + "contractAddress": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "function": null, + "arguments": [ + "0xB0403B32f54d0Bd752113f4009e8B534C6669f44" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x2e52b2", + "value": "0x0", + "input": "0x44656c654761746f7200000000000000000000000000000000000000000000006101606040523480156200001257600080fd5b50604051620029e7380380620029e7833981016040819052620000359162000384565b60408051808201825260118152702232b632b3b0ba34b7b726b0b730b3b2b960791b602080830191909152825180840190935260018352603160f81b9083015290826001600160a01b038116620000a757604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b620000b28162000204565b506001805460ff60a01b19169055620000cd82600262000222565b61012052620000de81600362000222565b61014052815160208084019190912060e052815190820120610100524660a0526200015b60e0516101005160408051600080516020620029c783398151915260208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526000620001706200025b565b9050306001600160a01b0316817f04a46d9007577c7ff1e513b900545162ec25d25991ae3dc60cf26ec01a84806d604051806040016040528060118152602001702232b632b3b0ba34b7b726b0b730b3b2b960791b815250604051806040016040528060018152602001603160f81b81525046604051620001f493929190620003fe565b60405180910390a35050620005e5565b600180546001600160a01b03191690556200021f81620002f1565b50565b600060208351101562000242576200023a8362000341565b905062000255565b816200024f8482620004df565b5060ff90505b92915050565b600060c0516001600160a01b0316306001600160a01b031614801562000282575060a05146145b156200028f575060805190565b620002ec60e0516101005160408051600080516020620029c783398151915260208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b905090565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080829050601f815111156200036f578260405163305a27a960e01b81526004016200009e9190620005ab565b80516200037c82620005c0565b179392505050565b6000602082840312156200039757600080fd5b81516001600160a01b0381168114620003af57600080fd5b9392505050565b6000815180845260005b81811015620003de57602081850181015186830182015201620003c0565b506000602082860101526020601f19601f83011685010191505092915050565b606081526000620004136060830186620003b6565b8281036020840152620004278186620003b6565b915050826040830152949350505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200046357607f821691505b6020821081036200048457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004da576000816000526020600020601f850160051c81016020861015620004b55750805b601f850160051c820191505b81811015620004d657828155600101620004c1565b5050505b505050565b81516001600160401b03811115620004fb57620004fb62000438565b62000513816200050c84546200044e565b846200048a565b602080601f8311600181146200054b5760008415620005325750858301515b600019600386901b1c1916600185901b178555620004d6565b600085815260208120601f198616915b828110156200057c578886015182559484019460019091019084016200055b565b50858210156200059b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602081526000620003af6020830184620003b6565b80516020808301519190811015620004845760001960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516123876200064060003960006113bb0152600061138e015260006112f3015260006112cb01526000611226015260006112500152600061127a01526123876000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80637fade287116100b8578063a3f4df7e1161007c578063a3f4df7e1461028e578063acb8cc49146102cb578063e1520f54146102eb578063e30c3978146102fe578063f2fde38b1461030f578063ffa1ad741461032257600080fd5b80637fade2871461023f57806383ebb771146102525780638456cb591461025a57806384b0196e146102625780638da5cb5b1461027d57600080fd5b806358909ebc1161010a57806358909ebc146101c65780635c975abb146101e75780635daa6539146101f9578063661346071461021c578063715018a61461022f57806379ba50971461023757600080fd5b80631b13cac2146101475780632d40d052146101635780633ed01015146101965780633f4ba83a146101ab57806349934047146101b3575b600080fd5b61015060001981565b6040519081526020015b60405180910390f35b6101866101713660046118c7565b60056020526000908152604090205460ff1681565b604051901515815260200161015a565b6101a96101a43660046118e0565b610346565b005b6101a9610440565b6101a96101c13660046118e0565b610452565b6101cf610a1181565b6040516001600160a01b03909116815260200161015a565b600154600160a01b900460ff16610186565b6101866102073660046118c7565b60046020526000908152604090205460ff1681565b61015061022a3660046118e0565b610542565b6101a961055b565b6101a961056d565b6101a961024d3660046118e0565b6105b6565b6101506106a7565b6101a96106b6565b61026a6106c6565b60405161015a9796959493929190611967565b6000546001600160a01b03166101cf565b6102be604051806040016040528060118152602001702232b632b3b0ba34b7b726b0b730b3b2b960791b81525081565b60405161015a9190611a00565b6102be604051806040016040528060018152602001603160f81b81525081565b6101a96102f9366004611a13565b61070c565b6001546001600160a01b03166101cf565b6101a961031d366004611ac9565b611072565b6102be604051806040016040528060058152602001640312e302e360dc1b81525081565b6103566040820160208301611ac9565b6001600160a01b038116331461037f5760405163b9f0f17160e01b815260040160405180910390fd5b600061038a83610542565b60008181526005602052604090205490915060ff166103bc57604051637952fbad60e11b815260040160405180910390fd5b6000818152600560209081526040909120805460ff191690556103e190840184611ac9565b6001600160a01b03166103fa6040850160208601611ac9565b6001600160a01b0316827f3feadce88fc1b49db633a56fd5307ed6ee18734df83bcc4011daa720c9cd95f1866040516104339190611c18565b60405180910390a4505050565b6104486110e3565b610450611110565b565b6104626040820160208301611ac9565b6001600160a01b038116331461048b5760405163b9f0f17160e01b815260040160405180910390fd5b600061049683610542565b60008181526005602052604090205490915060ff16156104c857604051625ecddb60e01b815260040160405180910390fd5b6000818152600560209081526040909120805460ff191660011790556104f090840184611ac9565b6001600160a01b03166105096040850160208601611ac9565b6001600160a01b0316827fea589ba9473ee1fe77d352c7ed919747715a5d22931b972de9b02a907c66d5dd866040516104339190611c18565b600061055561055083611fae565b611165565b92915050565b6105636110e3565b6104506000611200565b60015433906001600160a01b031681146105aa5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b6105b381611200565b50565b6105c66040820160208301611ac9565b6001600160a01b03811633146105ef5760405163b9f0f17160e01b815260040160405180910390fd5b60006105fa83610542565b60008181526004602052604090205490915060ff161561062d5760405163119b4fd360e11b815260040160405180910390fd5b6000818152600460209081526040909120805460ff1916600117905561065590840184611ac9565b6001600160a01b031661066e6040850160208601611ac9565b6001600160a01b0316827fb9b56ecd70a93a7fcb54a1072d6a9c7ff488f46d6c656bb0a0fa453924658704866040516104339190611c18565b60006106b1611219565b905090565b6106be6110e3565b610450611344565b6000606080600080600060606106da611387565b6106e26113b4565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6107146113e1565b600061072283850185611fba565b905080516000036107465760405163efe957cf60e01b815260040160405180910390fd5b600081516001600160401b0381111561076157610761611ce9565b60405190808252806020026020018201604052801561078a578160200160208202803683370190505b5090506107db6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600080191681526020016060815260200160008152602001606081525090565b336001600160a01b0316836000815181106107f8576107f861206a565b6020026020010151600001516001600160a01b03161415801561084d5750610a116001600160a01b0316836000815181106108355761083561206a565b6020026020010151600001516001600160a01b031614155b1561086b57604051632d618d8160e21b815260040160405180910390fd5b60005b8351811015610a98578381815181106108895761088961206a565b6020026020010151915061089c82611165565b8382815181106108ae576108ae61206a565b6020026020010181815250508160a001515160000361091d57600460008483815181106108dd576108dd61206a565b60209081029190910181015182528101919091526040016000205460ff166109185760405163a9e649e960e01b815260040160405180910390fd5b610a90565b60208201516001600160a01b0381163b6000036109c157600061098761097d6109446106a7565b8786815181106109565761095661206a565b602002602001015160405161190160f01b8152600281019290925260228201526042902090565b8560a0015161140c565b9050816001600160a01b0316816001600160a01b0316146109bb57604051638baa579f60e01b815260040160405180910390fd5b50610a8e565b60006109e06109ce6106a7565b8685815181106109565761095661206a565b60a0850151604051630b135d3f60e11b81529192506000916001600160a01b03851691631626ba7e91610a17918691600401612080565b602060405180830381865afa158015610a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5891906120a1565b6001600160e01b0319169050630b135d3f60e11b8114610a8b57604051638baa579f60e01b815260040160405180910390fd5b50505b505b60010161086e565b5060005b8351811015610c585760056000848381518110610abb57610abb61206a565b60209081029190910181015182528101919091526040016000205460ff1615610af7576040516302dd502960e11b815260040160405180910390fd5b60018451610b0591906120e1565b8114610c0e5782610b178260016120f4565b81518110610b2757610b2761206a565b6020026020010151848281518110610b4157610b4161206a565b60200260200101516040015114610b6b57604051636f6a1b8760e11b815260040160405180910390fd5b600084610b798360016120f4565b81518110610b8957610b8961206a565b6020026020010151600001519050610a116001600160a01b0316816001600160a01b031614158015610bea5750806001600160a01b0316858381518110610bd257610bd261206a565b6020026020010151602001516001600160a01b031614155b15610c0857604051632d618d8160e21b815260040160405180910390fd5b50610c50565b60001960001b848281518110610c2657610c2661206a565b60200260200101516040015114610c5057604051636f6a1b8760e11b815260040160405180910390fd5b600101610a9c565b5060005b8351811015610db8576000848281518110610c7957610c7961206a565b60200260200101516060015190506000848381518110610c9b57610c9b61206a565b602002602001015190506000868481518110610cb957610cb961206a565b602002602001015160200151905060008351905060005b81811015610da8576000858281518110610cec57610cec61206a565b6020026020010151600001519050806001600160a01b0316639751a83d878481518110610d1b57610d1b61206a565b602002602001015160200151888581518110610d3957610d3961206a565b6020026020010151604001518e8989336040518763ffffffff1660e01b8152600401610d6a96959493929190612152565b600060405180830381600087803b158015610d8457600080fd5b505af1158015610d98573d6000803e3d6000fd5b5050505050806001019050610cd0565b5050505050806001019050610c5c565b508260018451610dc891906120e1565b81518110610dd857610dd861206a565b6020026020010151602001516001600160a01b03166326f0aef7856040518263ffffffff1660e01b8152600401610e0f91906121b4565b600060405180830381600087803b158015610e2957600080fd5b505af1158015610e3d573d6000803e3d6000fd5b505084519150505b8015610fc657600084610e596001846120e1565b81518110610e6957610e6961206a565b6020026020010151606001519050600084600184610e8791906120e1565b81518110610e9757610e9761206a565b60200260200101519050600086600185610eb191906120e1565b81518110610ec157610ec161206a565b602002602001015160200151905060008351905060005b81811015610fb0576000858281518110610ef457610ef461206a565b6020026020010151600001519050806001600160a01b031663de723eeb878481518110610f2357610f2361206a565b602002602001015160200151888581518110610f4157610f4161206a565b6020026020010151604001518e8989336040518763ffffffff1660e01b8152600401610f7296959493929190612152565b600060405180830381600087803b158015610f8c57600080fd5b505af1158015610fa0573d6000803e3d6000fd5b5050505050806001019050610ed8565b505050505080610fbf906121c7565b9050610e45565b5060005b835181101561106957336001600160a01b03168460018651610fec91906120e1565b81518110610ffc57610ffc61206a565b6020026020010151602001516001600160a01b03167f40dadaa36c6c2e3d7317e24757451ffb2d603d875f0ad5e92c5dd156573b18738684815181106110445761104461206a565b602002602001015160405161105991906121de565b60405180910390a3600101610fca565b50505050505050565b61107a6110e3565b600180546001600160a01b0383166001600160a01b031990911681179091556110ab6000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000546001600160a01b031633146104505760405163118cdaa760e01b81523360048201526024016105a1565b611118611436565b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000807f88c1d2ecf185adf710588203a5f263f0ff61be0d33da39792cde19ba9aa4331e8360000151846020015185604001516111a58760600151611460565b6080808901516040805160208101989098526001600160a01b03968716908801529490931660608601529184015260a083015260c082015260e0015b60408051601f1981840301815291905280516020909101209392505050565b600180546001600160a01b03191690556105b38161152b565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561127257507f000000000000000000000000000000000000000000000000000000000000000046145b1561129c57507f000000000000000000000000000000000000000000000000000000000000000090565b6106b1604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b61134c6113e1565b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586111483390565b60606106b17f0000000000000000000000000000000000000000000000000000000000000000600261157b565b60606106b17f0000000000000000000000000000000000000000000000000000000000000000600361157b565b600154600160a01b900460ff16156104505760405163d93c066560e01b815260040160405180910390fd5b60008060008061141c8686611626565b92509250925061142c8282611673565b5090949350505050565b600154600160a01b900460ff1661045057604051638dfc202b60e01b815260040160405180910390fd5b60008082516001600160401b0381111561147c5761147c611ce9565b6040519080825280602002602001820160405280156114a5578160200160208202803683370190505b50905060005b83518110156114fb576114d68482815181106114c9576114c961206a565b6020026020010151611730565b8282815181106114e8576114e861206a565b60209081029190910101526001016114ab565b508060405160200161150d91906122cb565b60405160208183030381529060405280519060200120915050919050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606060ff83146115955761158e83611791565b9050610555565b8180546115a190612301565b80601f01602080910402602001604051908101604052809291908181526020018280546115cd90612301565b801561161a5780601f106115ef5761010080835404028352916020019161161a565b820191906000526020600020905b8154815290600101906020018083116115fd57829003601f168201915b50505050509050610555565b600080600083516041036116605760208401516040850151606086015160001a611652888285856117d0565b95509550955050505061166c565b50508151600091506002905b9250925092565b60008260038111156116875761168761233b565b03611690575050565b60018260038111156116a4576116a461233b565b036116c25760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156116d6576116d661233b565b036116f75760405163fce698f760e01b8152600481018290526024016105a1565b600382600381111561170b5761170b61233b565b0361172c576040516335e2f38360e21b8152600481018290526024016105a1565b5050565b6000807f80ad7e1b04ee6d994a125f4714ca0720908bd80ed16063ec8aee4b88e9253e2d83600001518460200151805190602001206040516020016111e1939291909283526001600160a01b03919091166020830152604082015260600190565b6060600061179e8361189f565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561180b5750600091506003905082611895565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561185f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661188b57506000925060019150829050611895565b9250600091508190505b9450945094915050565b600060ff8216601f81111561055557604051632cd44ac360e21b815260040160405180910390fd5b6000602082840312156118d957600080fd5b5035919050565b6000602082840312156118f257600080fd5b81356001600160401b0381111561190857600080fd5b820160c0818503121561191a57600080fd5b9392505050565b6000815180845260005b818110156119475760208185018101518683018201520161192b565b506000602082860101526020601f19601f83011685010191505092915050565b60ff60f81b881681526000602060e0602084015261198860e084018a611921565b838103604085015261199a818a611921565b606085018990526001600160a01b038816608086015260a0850187905284810360c08601528551808252602080880193509091019060005b818110156119ee578351835292840192918401916001016119d2565b50909c9b505050505050505050505050565b60208152600061191a6020830184611921565b600080600060408486031215611a2857600080fd5b83356001600160401b0380821115611a3f57600080fd5b818601915086601f830112611a5357600080fd5b813581811115611a6257600080fd5b876020828501011115611a7457600080fd5b602092830195509350908501359080821115611a8f57600080fd5b50840160608187031215611aa257600080fd5b809150509250925092565b80356001600160a01b0381168114611ac457600080fd5b919050565b600060208284031215611adb57600080fd5b61191a82611aad565b6000808335601e19843603018112611afb57600080fd5b83016020810192503590506001600160401b03811115611b1a57600080fd5b803603821315611b2957600080fd5b9250929050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b88811015611c0a57858403601f19018a52823536899003605e19018112611b98578283fd5b880160606001600160a01b03611bad83611aad565b168652611bbc87830183611ae4565b8289890152611bce8389018284611b30565b925050506040611be081840184611ae4565b935087830382890152611bf4838583611b30565b9d89019d97505050938601935050600101611b73565b509198975050505050505050565b6020815260006001600160a01b0380611c3085611aad565b16602084015280611c4360208601611aad565b16604084015250604083013560608301526060830135601e19843603018112611c6b57600080fd5b83016020810190356001600160401b03811115611c8757600080fd5b8060051b3603821315611c9957600080fd5b60c06080850152611cae60e085018284611b59565b915050608084013560a0840152611cc860a0850185611ae4565b848303601f190160c0860152611cdf838284611b30565b9695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715611d2157611d21611ce9565b60405290565b60405160c081016001600160401b0381118282101715611d2157611d21611ce9565b604051601f8201601f191681016001600160401b0381118282101715611d7157611d71611ce9565b604052919050565b60006001600160401b03821115611d9257611d92611ce9565b5060051b60200190565b600082601f830112611dad57600080fd5b81356001600160401b03811115611dc657611dc6611ce9565b611dd9601f8201601f1916602001611d49565b818152846020838601011115611dee57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f830112611e1c57600080fd5b81356020611e31611e2c83611d79565b611d49565b82815260059290921b84018101918181019086841115611e5057600080fd5b8286015b84811015611eff5780356001600160401b0380821115611e745760008081fd5b908801906060828b03601f1901811315611e8e5760008081fd5b611e96611cff565b611ea1888501611aad565b815260408085013584811115611eb75760008081fd5b611ec58e8b83890101611d9c565b838b015250918401359183831115611edd5760008081fd5b611eeb8d8a85880101611d9c565b908201528652505050918301918301611e54565b509695505050505050565b600060c08284031215611f1c57600080fd5b611f24611d27565b9050611f2f82611aad565b8152611f3d60208301611aad565b60208201526040820135604082015260608201356001600160401b0380821115611f6657600080fd5b611f7285838601611e0b565b60608401526080840135608084015260a0840135915080821115611f9557600080fd5b50611fa284828501611d9c565b60a08301525092915050565b60006105553683611f0a565b60006020808385031215611fcd57600080fd5b82356001600160401b0380821115611fe457600080fd5b818501915085601f830112611ff857600080fd5b8135612006611e2c82611d79565b81815260059190911b8301840190848101908883111561202557600080fd5b8585015b8381101561205d578035858111156120415760008081fd5b61204f8b89838a0101611f0a565b845250918601918601612029565b5098975050505050505050565b634e487b7160e01b600052603260045260246000fd5b8281526040602082015260006120996040830184611921565b949350505050565b6000602082840312156120b357600080fd5b81516001600160e01b03198116811461191a57600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610555576105556120cb565b80820180821115610555576105556120cb565b6001600160a01b0361211882611aad565b1682526020810135602083015260006121346040830183611ae4565b60606040860152612149606086018284611b30565b95945050505050565b60c08152600061216560c0830189611921565b82810360208401526121778189611921565b9050828103604084015261218b8188612107565b606084019690965250506001600160a01b039283166080820152911660a0909101529392505050565b60208152600061191a6020830184612107565b6000816121d6576121d66120cb565b506000190190565b602080825282516001600160a01b0390811683830152838201518116604080850191909152808501516060808601919091528086015160c06080870152805160e0870181905260009594610100600583901b8901810195919493870193919290890190885b8181101561229d5760ff198b8903018352855187815116895289810151858b8b0152612271868b0182611921565b918701518a83038b8901529190506122898183611921565b995050509488019491880191600101612243565b50505050505050608085015160a085015260a08501519150601f198482030160c08501526121498183611921565b815160009082906020808601845b838110156122f5578151855293820193908201906001016122d9565b50929695505050505050565b600181811c9082168061231557607f821691505b60208210810361233557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052602160045260246000fdfea26469706673582212206702181458ece90d9cf27649387478caa2ed36ffd86ba70b239c4be34106280764736f6c634300081700338b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "nonce": "0x0", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x053ac3e9d027b94c36bed3197c5d5565c7b83c3a8d3ec74722f51f3977c8d150", + "transactionType": "CREATE2", + "contractName": "MultiSigDeleGator", + "contractAddress": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "function": null, + "arguments": [ + "0xbe4138886cB096bDC1B930F2f0ca7892AA234D78", + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x4162a1", + "value": "0x0", + "input": "0x44656c654761746f72000000000000000000000000000000000000000000000060e0604052306080523480156200001557600080fd5b506040516200396338038062003963833981016040819052620000389162000208565b8181620000446200013e565b6001600160a01b0380831660a081905290821660c0526040517fb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d90600090a26040516001600160a01b038216907fee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a9990600090a250506000197fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c0281905560408051918252517fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c00917f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d03919081900360200190a150505062000247565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156200018f5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001ef5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b0381168114620001ef57600080fd5b600080604083850312156200021c57600080fd5b82516200022981620001f2565b60208401519092506200023c81620001f2565b809150509250929050565b60805160a05160c0516136216200034260003960008181610633015281816108a001528181610b0001528181610bbb01528181610c3c01528181610cba01528181610e1f01528181610ed401528181610f5b015281816110b9015281816111f9015281816112ac0152818161131e0152818161138901528181611521015281816115b4015281816115f6015281816116ec015281816117ca015281816119e0015261240a01526000818161077201528181610b6601528181610d1d01528181610da001528181610e8201528181611130015281816113ec015261174f015260008181611b8201528181611bab015261211901526136216000f3fe60806040526004361061024a5760003560e01c80637df73e2711610139578063bc197c81116100b6578063e3d9109f1161007a578063e3d9109f1461070c578063e75235b81461072c578063ea4d3c9b14610760578063eb12d61e14610794578063f23a6e61146107b4578063ffa1ad74146107d457600080fd5b8063bc197c8114610682578063c399ec88146106a2578063d087d288146106b7578063d7d7442f146106cc578063e1520f54146106ec57600080fd5b8063a24c8f32116100fd578063a24c8f32146105a3578063aaf10f42146105b6578063ad3cb1cc146105e3578063b0d691fe14610621578063b3c650151461065557600080fd5b80637df73e27146104d95780637f07bfdc1461051f5780637fade2871461053f57806394cf795e1461055f578063a0c1deb41461058157600080fd5b80634891161f116101c75780635c1c6dcd1161018b5780635c1c6dcd1461043957806360b5bb3f1461045957806365ee81d8146104795780636af1f3991461049957806378979a80146104b957600080fd5b80634891161f146103d457806349934047146103e95780634a58db19146104095780634f1ef2861461041157806352d1902d1461042457600080fd5b806326f0aef71161020e57806326f0aef71461033457806334fcd5be146103545780633e1b0812146103745780633ed0101514610394578063445140b8146103b457600080fd5b806301ffc9a7146102565780630e316ab71461028b578063150b7a02146102ad5780631626ba7e146102e657806319822f7c1461030657600080fd5b3661025157005b600080fd5b34801561026257600080fd5b506102766102713660046128f4565b610805565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102ab6102a6366004612933565b610895565b005b3480156102b957600080fd5b506102cd6102c8366004612a05565b610ab9565b6040516001600160e01b03199091168152602001610282565b3480156102f257600080fd5b506102cd610301366004612ab8565b610ad4565b34801561031257600080fd5b50610326610321366004612b03565b610af3565b604051908152602001610282565b34801561034057600080fd5b506102ab61034f366004612b6e565b610b5b565b34801561036057600080fd5b506102ab61036f366004612bee565b610bb0565b34801561038057600080fd5b5061032661038f366004612c2f565b610c15565b3480156103a057600080fd5b506102ab6103af366004612c58565b610caf565b3480156103c057600080fd5b506102766103cf366004612c92565b610d87565b3480156103e057600080fd5b50610326601e81565b3480156103f557600080fd5b506102ab610404366004612c58565b610e14565b6102ab610eb7565b6102ab61041f366004612cab565b610f21565b34801561043057600080fd5b50610326610f33565b34801561044557600080fd5b506102ab610454366004612b6e565b610f50565b34801561046557600080fd5b506102ab610474366004612cfa565b610f99565b34801561048557600080fd5b506102ab610494366004612d53565b6110ae565b3480156104a557600080fd5b506102766104b4366004612c92565b611117565b3480156104c557600080fd5b506102ab6104d4366004612db1565b611167565b3480156104e557600080fd5b506102766104f4366004612933565b6001600160a01b031660009081526000805160206135ac833981519152602052604090205460ff1690565b34801561052b57600080fd5b506102ab61053a366004612e2d565b6112a1565b34801561054b57600080fd5b506102ab61055a366004612c58565b61137e565b34801561056b57600080fd5b50610574611421565b6040516102829190612e59565b34801561058d57600080fd5b5060008051602061358c83398151915254610326565b6102ab6105b1366004612cab565b610f29565b3480156105c257600080fd5b506105cb611494565b6040516001600160a01b039091168152602001610282565b3480156105ef57600080fd5b50610614604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102829190612ef6565b34801561062d57600080fd5b506105cb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561066157600080fd5b5061066a6114ba565b6040516001600160401b039091168152602001610282565b34801561068e57600080fd5b506102cd61069d366004612f88565b6114ed565b3480156106ae57600080fd5b50610326611509565b3480156106c357600080fd5b50610326611595565b3480156106d857600080fd5b506102ab6106e7366004612c92565b6115eb565b3480156106f857600080fd5b506102ab610707366004613035565b6116e1565b34801561071857600080fd5b506102ab61072736600461309d565b6117bf565b34801561073857600080fd5b507fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c0254610326565b34801561076c57600080fd5b506105cb7f000000000000000000000000000000000000000000000000000000000000000081565b3480156107a057600080fd5b506102ab6107af366004612933565b6119d5565b3480156107c057600080fd5b506102cd6107cf3660046130d6565b611b5b565b3480156107e057600080fd5b50610614604051806040016040528060058152602001640312e302e360dc1b81525081565b600061080f611b77565b6001600160e01b031982166326f0aef760e01b148061083e57506001600160e01b03198216630a85bd0160e11b145b8061085957506001600160e01b03198216630271189760e51b145b8061087457506001600160e01b031982166301ffc9a760e01b145b8061088f57506001600160e01b03198216630b135d3f60e11b145b92915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906108ce5750333014155b156108ec57604051630796d94560e01b815260040160405180910390fd5b6001600160a01b03811660009081526000805160206135ac833981519152602081905260409091205460ff166109355760405163da0357f760e01b815260040160405180910390fd5b60018101546002820154810361095e576040516361774dcf60e11b815260040160405180910390fd5b60005b61096c600183613154565b811015610a3657836001600160a01b031683600101828154811061099257610992613167565b6000918252602090912001546001600160a01b031603610a2e57826001016001836109bd9190613154565b815481106109cd576109cd613167565b6000918252602090912001546001840180546001600160a01b0390921691839081106109fb576109fb613167565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610a36565b600101610961565b5081600101805480610a4a57610a4a61317d565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038516808352908490526040808320805460ff191690555190917fb0073c14ccc2332b5b461c0d2fb94366f38d3954a82745e74827aa0811c9f98191a2505050565b6000610ac3611b77565b50630a85bd0160e11b949350505050565b6000610ade611b77565b610ae9848484611c1e565b90505b9392505050565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b3e57604051636b31ba1560e11b815260040160405180910390fd5b610b46611b77565b610b508484611dbd565b9050610aec82611e33565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ba457604051630692ce8160e21b815260040160405180910390fd5b610bad81611eca565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610be95750333014155b15610c0757604051630796d94560e01b815260040160405180910390fd5b610c118282611fd4565b5050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610c8b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088f9190613193565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610ce85750333014155b15610d0657604051630796d94560e01b815260040160405180910390fd5b604051633ed0101560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633ed0101590610d529084906004016132db565b600060405180830381600087803b158015610d6c57600080fd5b505af1158015610d80573d6000803e3d6000fd5b5050505050565b6040516316a0682960e11b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632d40d052906024015b602060405180830381865afa158015610df0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088f91906133b6565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610e4d5750333014155b15610e6b57604051630796d94560e01b815260040160405180910390fd5b604051634993404760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634993404790610d529084906004016132db565b610ebf611b77565b60405163b760faf960e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b158015610d6c57600080fd5b610f29612036565b610c1182826120f3565b6000610f3d61210e565b506000805160206135cc83398151915290565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ba457604051636b31ba1560e11b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610fde5750825b90506000826001600160401b03166001148015610ffa5750303b155b905081158015611008575080155b156110265760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561105057845460ff60401b1916600160401b1785555b61105d8888886000612157565b83156110a457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2906020015b60405180910390a15b5050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110e75750333014155b1561110557604051630796d94560e01b815260040160405180910390fd5b61111184848484612157565b50505050565b604051635daa653960e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635daa653990602401610dd3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054869190600160401b900460ff16806111af575080546001600160401b03808416911610155b156111cd5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906112275750333014155b1561124557604051630796d94560e01b815260040160405180910390fd5b61125186868686612157565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906112da5750333014155b156112f857604051630796d94560e01b815260040160405180910390fd5b60405163040b850f60e31b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561136257600080fd5b505af1158015611376573d6000803e3d6000fd5b505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906113b75750333014155b156113d557604051630796d94560e01b815260040160405180910390fd5b604051637fade28760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637fade28790610d529084906004016132db565b606060006000805160206135ac8339815191526001810180546040805160208084028201810190925282815293945083018282801561148957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161146b575b505050505091505090565b60006114b56000805160206135cc833981519152546001600160a01b031690565b905090565b60006114b57ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00546001600160401b031690565b60006114f7611b77565b5063bc197c8160e01b95945050505050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a08231906024015b602060405180830381865afa158015611571573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b59190613193565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401611554565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906116245750333014155b1561164257604051630796d94560e01b815260040160405180910390fd5b806000036116635760405163aabd5a0960e01b815260040160405180910390fd5b60008051602061358c833981519152546000805160206135ac833981519152908211156116a35760405163aabd5a0960e01b815260040160405180910390fd5b600281018290556040518281527f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d039060200160405180910390a15050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480159061171a5750333014155b1561173857604051630796d94560e01b815260040160405180910390fd5b60405163385483d560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e1520f5490611788908690869086906004016133d3565b600060405180830381600087803b1580156117a257600080fd5b505af11580156117b6573d6000803e3d6000fd5b50505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906117f85750333014155b1561181657604051630796d94560e01b815260040160405180910390fd5b6001600160a01b038116158061183557506001600160a01b0381163b15155b1561185357604051634501a91960e01b815260040160405180910390fd5b6001600160a01b03821660009081526000805160206135ac833981519152602081905260409091205460ff1661189c5760405163da0357f760e01b815260040160405180910390fd5b6001600160a01b03821660009081526020829052604090205460ff16156118d657604051631985f4ab60e31b815260040160405180910390fd5b600181015460005b8181101561197057846001600160a01b031683600101828154811061190557611905613167565b6000918252602090912001546001600160a01b031603611968578383600101828154811061193557611935613167565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550611970565b6001016118de565b506001600160a01b03808516600081815260208590526040808220805460ff199081169091559387168083528183208054909516600117909455517f53a7b6f060162826746b07f3ff5cc66b83afad3bc9a57c9f34d7802901c6e8299190a350505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590611a0e5750333014155b15611a2c57604051630796d94560e01b815260040160405180910390fd5b6001600160a01b0381161580611a4b57506001600160a01b0381163b15155b15611a6957604051634501a91960e01b815260040160405180910390fd5b60008051602061358c833981519152546000805160206135ac83398151915290601d1901611aaa57604051630dc92ed360e11b815260040160405180910390fd5b6001600160a01b03821660009081526020829052604090205460ff1615611ae457604051631985f4ab60e31b815260040160405180910390fd5b6001818101805480830182556000918252602080832090910180546001600160a01b0319166001600160a01b038716908117909155808352908490526040808320805460ff191690941790935591517f82b74755d483f0688b80354268454667c377a5684e64a4dbb6820fc11a6276d49190a25050565b6000611b65611b77565b5063f23a6e6160e01b95945050505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611bfe57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611bf26000805160206135cc833981519152546001600160a01b031690565b6001600160a01b031614155b15611c1c5760405163703e46dd60e11b815260040160405180910390fd5b565b7fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c02546000906000805160206135ac83398151915290611c5f9060419061343d565b8314611c7657506001600160e01b03199050610aec565b6000611c83604185613454565b600283015490915060008080805b85811015611da55760008a8a611ca860418561343d565b906041611cb6866001613476565b611cc0919061343d565b92611ccd93929190613489565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929350611d1192508e91508390506123d5565b9350846001600160a01b0316846001600160a01b0316111580611d4d57506001600160a01b03841660009081526020899052604090205460ff16155b15611d6b57506001600160e01b03199750610aec9650505050505050565b82611d75816134b3565b935050858310611d975750630b135d3f60e11b9750610aec9650505050505050565b509192508291600101611c91565b506001600160e01b03199a9950505050505050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c829052603c81208190611e0590611e006101008701876134cc565b611c1e565b90506374eca2c160e11b6001600160e01b0319821601611e2957600091505061088f565b5060019392505050565b8015610bad57604051600090339060001990849084818181858888f193505050503d8060008114611e80576040519150601f19603f3d011682016040523d82523d6000602084013e611e85565b606091505b505060408051848152821515602082015291925033917fa427c7d47f24d01b170779a7600b1d4c0d7cdbabaa0f19c4f0e6182053ffc931910160405180910390a25050565b600080611eda6020840184612933565b6001600160a01b03166020840135611ef560408601866134cc565b604051611f03929190613512565b60006040518083038185875af1925050503d8060008114611f40576040519150601f19603f3d011682016040523d82523d6000602084013e611f45565b606091505b509092509050611f586020840184612933565b6001600160a01b03167f74b56487625d598ffbf59a76c3b58fc1922f54afc86a075bad0c2a8aa05d2ad284602001358484604051611f9893929190613522565b60405180910390a281611fcf578051600003611fc75760405163764bbf1760e01b815260040160405180910390fd5b805181602001fd5b505050565b806000819003611ff757604051635fc74f2160e11b815260040160405180910390fd5b60005b818110156111115761202e84848381811061201757612017613167565b90506020028101906120299190613543565b611eca565b600101611ffa565b60008051602061358c833981519152546000805160206135ac8339815191529060005b818110156120b05782600001600084600101838154811061207c5761207c613167565b60009182526020808320909101546001600160a01b031683528201929092526040019020805460ff19169055600101612059565b506120bf6001830160006128c2565b6000600283018190556040517feb09d532980c3cc73dcad99b80e264204a667a54cbb7b63ec8d68dcb1c7096be9190a15050565b6120fb611b77565b612104826123ff565b610c118282612456565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c1c5760405163703e46dd60e11b815260040160405180910390fd5b60008051602061358c8339815191525483906000805160206135ac8339815191529060008461218f5761218a8285613476565b612191565b835b905085158061219f57508086115b156121bd5760405163aabd5a0960e01b815260040160405180910390fd5b601e8111156121df57604051630dc92ed360e11b815260040160405180910390fd5b84156122735760005b8281101561226457600084600101828154811061220757612207613167565b60009182526020808320909101546001600160a01b0316808352908790526040808320805460ff191690555190925082917fb0073c14ccc2332b5b461c0d2fb94366f38d3954a82745e74827aa0811c9f98191a2506001016121e8565b506122736001840160006128c2565b60005b8481101561239d57600089898381811061229257612292613167565b90506020020160208101906122a79190612933565b6001600160a01b03811660009081526020879052604090205490915060ff16156122e457604051631985f4ab60e31b815260040160405180910390fd5b6001600160a01b038116158061230357506001600160a01b0381163b15155b1561232157604051634501a91960e01b815260040160405180910390fd5b6001858101805480830182556000918252602080832090910180546001600160a01b0319166001600160a01b038616908117909155808352908890526040808320805460ff191690941790935591517f82b74755d483f0688b80354268454667c377a5684e64a4dbb6820fc11a6276d49190a250600101612276565b50600283018690556040518681527f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d039060200161109b565b6000806000806123e58686612518565b9250925092506123f58282612565565b5090949350505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906124385750333014155b15610bad57604051630796d94560e01b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156124b0575060408051601f3d908101601f191682019092526124ad91810190613193565b60015b6124dd57604051634c9c8ce360e01b81526001600160a01b03831660048201526024015b60405180910390fd5b6000805160206135cc833981519152811461250e57604051632a87526960e21b8152600481018290526024016124d4565b611fcf838361261e565b600080600083516041036125525760208401516040850151606086015160001a61254488828585612674565b95509550955050505061255e565b50508151600091506002905b9250925092565b600082600381111561257957612579613563565b03612582575050565b600182600381111561259657612596613563565b036125b45760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156125c8576125c8613563565b036125e95760405163fce698f760e01b8152600481018290526024016124d4565b60038260038111156125fd576125fd613563565b03610c11576040516335e2f38360e21b8152600481018290526024016124d4565b61262782612743565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561266c57611fcf82826127a8565b610c1161281e565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156126af5750600091506003905082612739565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612703573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661272f57506000925060019150829050612739565b9250600091508190505b9450945094915050565b806001600160a01b03163b60000361277957604051634c9c8ce360e01b81526001600160a01b03821660048201526024016124d4565b6000805160206135cc83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516127c59190613579565b600060405180830381855af49150503d8060008114612800576040519150601f19603f3d011682016040523d82523d6000602084013e612805565b606091505b509150915061281585838361283d565b95945050505050565b3415611c1c5760405163b398979f60e01b815260040160405180910390fd5b6060826128525761284d82612899565b610aec565b815115801561286957506001600160a01b0384163b155b1561289257604051639996b31560e01b81526001600160a01b03851660048201526024016124d4565b5080610aec565b8051156128a95780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825590600052602060002090810190610bad91905b808211156128f057600081556001016128dc565b5090565b60006020828403121561290657600080fd5b81356001600160e01b031981168114610aec57600080fd5b6001600160a01b0381168114610bad57600080fd5b60006020828403121561294557600080fd5b8135610aec8161291e565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561298e5761298e612950565b604052919050565b600082601f8301126129a757600080fd5b81356001600160401b038111156129c0576129c0612950565b6129d3601f8201601f1916602001612966565b8181528460208386010111156129e857600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215612a1b57600080fd5b8435612a268161291e565b93506020850135612a368161291e565b92506040850135915060608501356001600160401b03811115612a5857600080fd5b612a6487828801612996565b91505092959194509250565b60008083601f840112612a8257600080fd5b5081356001600160401b03811115612a9957600080fd5b602083019150836020828501011115612ab157600080fd5b9250929050565b600080600060408486031215612acd57600080fd5b8335925060208401356001600160401b03811115612aea57600080fd5b612af686828701612a70565b9497909650939450505050565b600080600060608486031215612b1857600080fd5b83356001600160401b03811115612b2e57600080fd5b84016101208187031215612b4157600080fd5b95602085013595506040909401359392505050565b600060608284031215612b6857600080fd5b50919050565b600060208284031215612b8057600080fd5b81356001600160401b03811115612b9657600080fd5b612ba284828501612b56565b949350505050565b60008083601f840112612bbc57600080fd5b5081356001600160401b03811115612bd357600080fd5b6020830191508360208260051b8501011115612ab157600080fd5b60008060208385031215612c0157600080fd5b82356001600160401b03811115612c1757600080fd5b612c2385828601612baa565b90969095509350505050565b600060208284031215612c4157600080fd5b81356001600160c01b0381168114610aec57600080fd5b600060208284031215612c6a57600080fd5b81356001600160401b03811115612c8057600080fd5b820160c08185031215610aec57600080fd5b600060208284031215612ca457600080fd5b5035919050565b60008060408385031215612cbe57600080fd5b8235612cc98161291e565b915060208301356001600160401b03811115612ce457600080fd5b612cf085828601612996565b9150509250929050565b600080600060408486031215612d0f57600080fd5b83356001600160401b03811115612d2557600080fd5b612d3186828701612baa565b909790965060209590950135949350505050565b8015158114610bad57600080fd5b60008060008060608587031215612d6957600080fd5b84356001600160401b03811115612d7f57600080fd5b612d8b87828801612baa565b909550935050602085013591506040850135612da681612d45565b939692955090935050565b600080600080600060808688031215612dc957600080fd5b85356001600160401b038082168214612de157600080fd5b90955060208701359080821115612df757600080fd5b50612e0488828901612baa565b909550935050604086013591506060860135612e1f81612d45565b809150509295509295909350565b60008060408385031215612e4057600080fd5b8235612e4b8161291e565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b81811015612e9a5783516001600160a01b031683529284019291840191600101612e75565b50909695505050505050565b60005b83811015612ec1578181015183820152602001612ea9565b50506000910152565b60008151808452612ee2816020860160208601612ea6565b601f01601f19169290920160200192915050565b602081526000610aec6020830184612eca565b600082601f830112612f1a57600080fd5b813560206001600160401b03821115612f3557612f35612950565b8160051b612f44828201612966565b9283528481018201928281019087851115612f5e57600080fd5b83870192505b84831015612f7d57823582529183019190830190612f64565b979650505050505050565b600080600080600060a08688031215612fa057600080fd5b8535612fab8161291e565b94506020860135612fbb8161291e565b935060408601356001600160401b0380821115612fd757600080fd5b612fe389838a01612f09565b94506060880135915080821115612ff957600080fd5b61300589838a01612f09565b9350608088013591508082111561301b57600080fd5b5061302888828901612996565b9150509295509295909350565b60008060006040848603121561304a57600080fd5b83356001600160401b038082111561306157600080fd5b61306d87838801612a70565b9095509350602086013591508082111561308657600080fd5b5061309386828701612b56565b9150509250925092565b600080604083850312156130b057600080fd5b82356130bb8161291e565b915060208301356130cb8161291e565b809150509250929050565b600080600080600060a086880312156130ee57600080fd5b85356130f98161291e565b945060208601356131098161291e565b9350604086013592506060860135915060808601356001600160401b0381111561313257600080fd5b61302888828901612996565b634e487b7160e01b600052601160045260246000fd5b8181038181111561088f5761088f61313e565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6000602082840312156131a557600080fd5b5051919050565b6000808335601e198436030181126131c357600080fd5b83016020810192503590506001600160401b038111156131e257600080fd5b803603821315612ab157600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b888110156132cd57858403601f19018a52823536899003605e19018112613259578283fd5b8801606081356132688161291e565b6001600160a01b0316865261327f828801836131ac565b828989015261329183890182846131f1565b9250505060406132a3818401846131ac565b9350878303828901526132b78385836131f1565b9d89019d97505050938601935050600101613234565b509198975050505050505050565b60208152600082356132ec8161291e565b6001600160a01b039081166020848101919091528401359061330d8261291e565b80821660408501525050604083013560608301526060830135601e1984360301811261333857600080fd5b83016020810190356001600160401b0381111561335457600080fd5b8060051b360382131561336657600080fd5b60c0608085015261337b60e08501828461321a565b915050608084013560a084015261339560a08501856131ac565b848303601f190160c08601526133ac8382846131f1565b9695505050505050565b6000602082840312156133c857600080fd5b8151610aec81612d45565b6040815260006133e76040830185876131f1565b828103602084015283356133fa8161291e565b6001600160a01b031681526020848101359082015261341c60408501856131ac565b606060408401526134316060840182846131f1565b98975050505050505050565b808202811582820484141761088f5761088f61313e565b60008261347157634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561088f5761088f61313e565b6000808585111561349957600080fd5b838611156134a657600080fd5b5050820193919092039150565b6000600182016134c5576134c561313e565b5060010190565b6000808335601e198436030181126134e357600080fd5b8301803591506001600160401b038211156134fd57600080fd5b602001915036819003821315612ab157600080fd5b8183823760009101908152919050565b83815282151560208201526060604082015260006128156060830184612eca565b60008235605e1983360301811261355957600080fd5b9190910192915050565b634e487b7160e01b600052602160045260246000fd5b60008251613559818460208701612ea656feb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c01b005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212207f3a1345dd207b3e6a7d8045651ded34698ad5d76b8ff402fdacf6337782f2f664736f6c63430008170033000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d780000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x1", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x1ece25e137f1085fb4fd19c65734491a2aa7e3ac90a92edf487af9e0139458eb", + "transactionType": "CREATE2", + "contractName": "HybridDeleGator", + "contractAddress": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "function": null, + "arguments": [ + "0xbe4138886cB096bDC1B930F2f0ca7892AA234D78", + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x62d183", + "value": "0x0", + "input": "0x44656c654761746f72000000000000000000000000000000000000000000000060e0604052306080523480156200001557600080fd5b50604051620051483803806200514883398101604081905262000038916200018b565b818162000044620000c1565b6001600160a01b0380831660a081905290821660c0526040517fb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d90600090a26040516001600160a01b038216907fee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a9990600090a250505050620001ca565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620001125760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001725780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b03811681146200017257600080fd5b600080604083850312156200019f57600080fd5b8251620001ac8162000175565b6020840151909250620001bf8162000175565b809150509250929050565b60805160a05160c051614e83620002c5600039600081816105e9015281816107f3015281816108a1015281816109c501528181610a4601528181610ac401528181610c2901528181610cde01528181610d6501528181610dfe01528181610eea01528181610fa50152818161101701528181611082015281816112c401528181611343015281816113c00152818161147f015281816116c4015281816117b501526124480152600081816107290152818161090701528181610b2701528181610baa01528181610c8c01528181610dbc015281816110e50152611727015260008181611a9b01528181611ac401526120b50152614e836000f3fe60806040526004361061023f5760003560e01c80637f07bfdc1161012e578063c399ec88116100ab578063e1520f541161006f578063e1520f54146106f7578063ea4d3c9b14610717578063f23a6e611461074b578063f2fde38b1461076b578063ffa1ad741461078b57600080fd5b8063c399ec8814610658578063c8561e731461066d578063d087d2881461068d578063d37aec92146106a2578063d5d33b55146106d757600080fd5b8063aaf10f42116100f2578063aaf10f4214610584578063ad3cb1cc14610599578063b0d691fe146105d7578063b3c650151461060b578063bc197c811461063857600080fd5b80637f07bfdc146104d25780637fade287146104f25780638da5cb5b146105125780638ebf953314610551578063a24c8f321461057157600080fd5b80633ed01015116101bc57806352d1902d1161018057806352d1902d146104485780635c1c6dcd1461045d5780636af1f3991461047d578063715018a61461049d57806378a68ecf146104b257600080fd5b80633ed01015146103cd578063445140b8146103ed578063499340471461040d5780634a58db191461042d5780634f1ef2861461043557600080fd5b80631c03010a116102035780631c03010a1461032957806326f0aef71461034b5780632ffeaad61461036b57806334fcd5be1461038d5780633e1b0812146103ad57600080fd5b806301ffc9a71461024b578063074feff314610280578063150b7a02146102a25780631626ba7e146102db57806319822f7c146102fb57600080fd5b3661024657005b600080fd5b34801561025757600080fd5b5061026b610266366004613e92565b6107bc565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102a061029b366004613f27565b6107e8565b005b3480156102ae57600080fd5b506102c26102bd366004614096565b610859565b6040516001600160e01b03199091168152602001610277565b3480156102e757600080fd5b506102c26102f6366004614142565b610875565b34801561030757600080fd5b5061031b61031636600461418d565b610894565b604051908152602001610277565b34801561033557600080fd5b50600080516020614dae8339815191525461031b565b34801561035757600080fd5b506102a06103663660046141f8565b6108fc565b34801561037757600080fd5b50610380610951565b604051610277919061422c565b34801561039957600080fd5b506102a06103a8366004614264565b6109ba565b3480156103b957600080fd5b5061031b6103c83660046142a5565b610a1f565b3480156103d957600080fd5b506102a06103e83660046142ce565b610ab9565b3480156103f957600080fd5b5061026b610408366004614308565b610b91565b34801561041957600080fd5b506102a06104283660046142ce565b610c1e565b6102a0610cc1565b6102a0610443366004614321565b610d2b565b34801561045457600080fd5b5061031b610d3d565b34801561046957600080fd5b506102a06104783660046141f8565b610d5a565b34801561048957600080fd5b5061026b610498366004614308565b610da3565b3480156104a957600080fd5b506102a0610df3565b3480156104be57600080fd5b506102a06104cd366004614389565b610e56565b3480156104de57600080fd5b506102a06104ed36600461445b565b610f9a565b3480156104fe57600080fd5b506102a061050d3660046142ce565b611077565b34801561051e57600080fd5b50600080516020614d8e833981519152546001600160a01b03165b6040516001600160a01b039091168152602001610277565b34801561055d57600080fd5b506102a061056c366004613f27565b61111a565b6102a061057f366004614321565b610d33565b34801561059057600080fd5b50610539611236565b3480156105a557600080fd5b506105ca604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161027791906144d7565b3480156105e357600080fd5b506105397f000000000000000000000000000000000000000000000000000000000000000081565b34801561061757600080fd5b5061062061125c565b6040516001600160401b039091168152602001610277565b34801561064457600080fd5b506102c2610653366004614569565b61128f565b34801561066457600080fd5b5061031b6112ac565b34801561067957600080fd5b506102a0610688366004614616565b611338565b34801561069957600080fd5b5061031b6113a1565b3480156106ae57600080fd5b506106c26106bd366004614666565b6113f7565b60408051928352602083019190915201610277565b3480156106e357600080fd5b506102a06106f2366004614666565b611474565b34801561070357600080fd5b506102a061071236600461469b565b6116b9565b34801561072357600080fd5b506105397f000000000000000000000000000000000000000000000000000000000000000081565b34801561075757600080fd5b506102c2610766366004614703565b61178e565b34801561077757600080fd5b506102a061078636600461476b565b6117aa565b34801561079757600080fd5b506105ca604051806040016040528060058152602001640312e302e360dc1b81525081565b60006107c78261180a565b806107e257506001600160e01b031982166307f5828d60e41b145b92915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906108215750333014155b1561083f57604051630796d94560e01b815260040160405180910390fd5b61085087878787878787600161189a565b50505050505050565b6000610863611a90565b50630a85bd0160e11b5b949350505050565b600061087f611a90565b61088a848484611b35565b90505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108df57604051636b31ba1560e11b815260040160405180910390fd5b6108e7611a90565b6108f18484611d59565b905061088d82611dcf565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094557604051630692ce8160e21b815260040160405180910390fd5b61094e81611e66565b50565b60606000600080516020614d8e833981519152600281018054604080516020808402820181019092528281529394508301828280156109af57602002820191906000526020600020905b81548152602001906001019080831161099b575b505050505091505090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906109f35750333014155b15610a1157604051630796d94560e01b815260040160405180910390fd5b610a1b8282611f70565b5050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610a95573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e29190614788565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610af25750333014155b15610b1057604051630796d94560e01b815260040160405180910390fd5b604051633ed0101560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633ed0101590610b5c9084906004016148d0565b600060405180830381600087803b158015610b7657600080fd5b505af1158015610b8a573d6000803e3d6000fd5b5050505050565b6040516316a0682960e11b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632d40d052906024015b602060405180830381865afa158015610bfa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e291906149ac565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610c575750333014155b15610c7557604051630796d94560e01b815260040160405180910390fd5b604051634993404760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634993404790610b5c9084906004016148d0565b610cc9611a90565b60405163b760faf960e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b158015610b7657600080fd5b610d33611fd2565b610a1b828261208f565b6000610d476120aa565b50600080516020614dee83398151915290565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094557604051636b31ba1560e11b815260040160405180910390fd5b604051635daa653960e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635daa653990602401610bdd565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610e2c5750333014155b15610e4a57604051630796d94560e01b815260040160405180910390fd5b610e5460006120f3565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460ff8b81169291600160401b90041680610ea0575080546001600160401b03808416911610155b15610ebe5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610f185750333014155b15610f3657604051630796d94560e01b815260040160405180910390fd5b610f468a8a8a8a8a8a8a8a61189a565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15050505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610fd35750333014155b15610ff157604051630796d94560e01b815260040160405180910390fd5b60405163040b850f60e31b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561105b57600080fd5b505af115801561106f573d6000803e3d6000fd5b505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110b05750333014155b156110ce57604051630796d94560e01b815260040160405180910390fd5b604051637fade28760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637fade28790610b5c9084906004016148d0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b031660008115801561115f5750825b90506000826001600160401b0316600114801561117b5750303b155b905081158015611189575080155b156111a75760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156111d157845460ff60401b1916600160401b1785555b6111e28c8c8c8c8c8c8c600061189a565b831561122857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b6000611257600080516020614dee833981519152546001600160a01b031690565b905090565b60006112577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00546001600160401b031690565b6000611299611a90565b5063bc197c8160e01b5b95945050505050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a08231906024015b602060405180830381865afa158015611314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112579190614788565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906113715750333014155b1561138f57604051630796d94560e01b815260040160405180910390fd5b61139b84848484612195565b50505050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a906044016112f7565b60008080600080516020614d8e8339815191529050600081600101600087876040516020016114279291906149c9565b60408051601f198184030181529181528151602092830120835282820193909352908201600020825180840190935280548084526001909101549290910182905297909650945050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906114ad5750333014155b156114cb57604051630796d94560e01b815260040160405180910390fd5b604051600080516020614d8e833981519152906000906114f190859085906020016149c9565b60408051601f19818403018152828252805160209182012060008181526001808801845290849020858501909452835480865293015491840182905293508115801561153b575080155b1561156157604051631a36430d60e31b8152600481018590526024015b60405180910390fd5b600285015460018114801561157e575085546001600160a01b0316155b1561159c5760405163c4c8547360e01b815260040160405180910390fd5b60005b6115aa6001836149ef565b81101561162f57858760020182815481106115c7576115c7614a02565b90600052602060002001540361162757600287016115e66001846149ef565b815481106115f6576115f6614a02565b906000526020600020015487600201828154811061161657611616614a02565b60009182526020909120015561162f565b60010161159f565b508560020180548061164357611643614a18565b60008281526020808220830160001990810183905590920190925586825260018881018252604080842084815590910192909255815185815290810184905286917facf0e8088062f44f734bbcb5223794fd8bb6f6db1c199cb6a72df119d002a71b910160405180910390a25050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906116f25750333014155b1561171057604051630796d94560e01b815260040160405180910390fd5b60405163385483d560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e1520f549061176090869086908690600401614a2e565b600060405180830381600087803b15801561177a57600080fd5b505af1158015610850573d6000803e3d6000fd5b6000611798611a90565b5063f23a6e6160e01b95945050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906117e35750333014155b1561180157604051630796d94560e01b815260040160405180910390fd5b61094e816120f3565b6000611814611a90565b6001600160e01b031982166326f0aef760e01b148061184357506001600160e01b03198216630a85bd0160e11b145b8061185e57506001600160e01b03198216630271189760e51b145b8061187957506001600160e01b031982166301ffc9a760e01b145b806107e2575050630b135d3f60e11b6001600160e01b03198216145b919050565b856001600160a01b0389161580156118b0575080155b80156118b95750815b156118d7576040516312da594d60e11b815260040160405180910390fd5b80851415806118e65750808314155b156119155760405163a297991b60e01b8152600481018290526024810186905260448101849052606401611558565b8115611a0a57600080516020614dae83398151915254600080516020614d8e833981519152908015611a075760005b818110156119f857600083600201828154811061196357611963614a02565b6000918252602080832090910154808352600180880180845260408086208151808301835281548152938101805485880190815286895293909652869055949093558051925193519194509284927facf0e8088062f44f734bbcb5223794fd8bb6f6db1c199cb6a72df119d002a71b926119e69290918252602082015260400190565b60405180910390a25050600101611944565b50611a07600283016000613e60565b50505b60005b81811015611a7b57611a73898983818110611a2a57611a2a614a02565b9050602002810190611a3c9190614a8c565b898985818110611a4e57611a4e614a02565b90506020020135888886818110611a6757611a67614a02565b90506020020135612195565b600101611a0d565b50611a85896120f3565b505050505050505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611b1757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611b0b600080516020614dee833981519152546001600160a01b031690565b6001600160a01b031614155b15610e545760405163703e46dd60e11b815260040160405180910390fd5b6000816041819003611bd257600080516020614d8e833981519152546001600160a01b03166001600160a01b0316611ba38686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061231292505050565b6001600160a01b031603611bc15750630b135d3f60e11b905061088d565b506001600160e01b0319905061088d565b6060811015611bec57506001600160e01b0319905061088d565b600080516020614d8e8339815191526000611c0a6020828789614ad2565b611c1391614afc565b600081815260018085016020908152604092839020835180850190945280548085529201549083015291925090158015611c4f57506020810151155b15611c6957506001600160e01b0319935061088d92505050565b836060148015611cbd5750611cbd8888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505085516020870151909250905061233c565b15611cd65750630b135d3f60e11b935061088d92505050565b83606014158015611d2b5750611d2b8888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508551602087015190925090506123da565b15611d445750630b135d3f60e11b935061088d92505050565b506001600160e01b0319935061088d92505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c829052603c81208190611da190611d9c610100870187614a8c565b611b35565b90506374eca2c160e11b6001600160e01b0319821601611dc55760009150506107e2565b5060019392505050565b801561094e57604051600090339060001990849084818181858888f193505050503d8060008114611e1c576040519150601f19603f3d011682016040523d82523d6000602084013e611e21565b606091505b505060408051848152821515602082015291925033917fa427c7d47f24d01b170779a7600b1d4c0d7cdbabaa0f19c4f0e6182053ffc931910160405180910390a25050565b600080611e76602084018461476b565b6001600160a01b03166020840135611e916040860186614a8c565b604051611e9f9291906149c9565b60006040518083038185875af1925050503d8060008114611edc576040519150601f19603f3d011682016040523d82523d6000602084013e611ee1565b606091505b509092509050611ef4602084018461476b565b6001600160a01b03167f74b56487625d598ffbf59a76c3b58fc1922f54afc86a075bad0c2a8aa05d2ad284602001358484604051611f3493929190614b1a565b60405180910390a281611f6b578051600003611f635760405163764bbf1760e01b815260040160405180910390fd5b805181602001fd5b505050565b806000819003611f9357604051635fc74f2160e11b815260040160405180910390fd5b60005b8181101561139b57611fca848483818110611fb357611fb3614a02565b9050602002810190611fc59190614b3b565b611e66565b600101611f96565b600080516020614dae83398151915254600080516020614d8e8339815191529060005b818110156120455782600101600084600201838154811061201857612018614a02565b60009182526020808320909101548352820192909252604001812081815560019081019190915501611ff5565b50612054600283016000613e60565b81546001600160a01b03191682556040517feb09d532980c3cc73dcad99b80e264204a667a54cbb7b63ec8d68dcb1c7096be90600090a15050565b612097611a90565b6120a08261243d565b610a1b8282612494565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e545760405163703e46dd60e11b815260040160405180910390fd5b600080516020614dae83398151915254600080516020614d8e8339815191529015801561212757506001600160a01b038216155b156121455760405163c4c8547360e01b815260040160405180910390fd5b80546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b61219f8282612551565b6121c6576040516313c3d61f60e01b81526004810183905260248101829052604401611558565b600084846040516020016121db9291906149c9565b6040516020818303038152906040528051906020012090508484905060000361221757604051637e25658160e11b815260040160405180910390fd5b60008181527fa2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694901602052604090208054600080516020614d8e83398151915291901515806122675750600181015415155b15612288576040516361db108160e01b815260048101849052602401611558565b604080518082018252868152602080820187815260008781526001808801845285822094518555915193820193909355600286018054918201815583529120018490555183907fd00539cb08a7c24166308150d64d603150c01baf89d3d3e4c6063d6db7c6983d90612301908a908a908a908a90614b5b565b60405180910390a250505050505050565b600080600080612322868661255d565b92509250925061233282826125aa565b5090949350505050565b600080600061234a86612663565b91509150600060028860405160200161236591815260200190565b60408051601f198184030181529082905261237f91614b82565b602060405180830381855afa15801561239c573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906123bf9190614788565b90506123ce8184848989612685565b98975050505050505050565b6000806123e685612793565b9050612433866040516020016123fe91815260200190565b60408051601f198184030181529181528301516060840151608085015160a086015160c0870151875160208901518c8c612811565b9695505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906124765750333014155b1561094e57604051630796d94560e01b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156124ee575060408051601f3d908101601f191682019092526124eb91810190614788565b60015b61251657604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611558565b600080516020614dee833981519152811461254757604051632a87526960e21b815260048101829052602401611558565b611f6b83836129b1565b600061088d8383612a07565b600080600083516041036125975760208401516040850151606086015160001a61258988828585612b01565b9550955095505050506125a3565b50508151600091506002905b9250925092565b60008260038111156125be576125be614b94565b036125c7575050565b60018260038111156125db576125db614b94565b036125f95760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561260d5761260d614b94565b0361262e5760405163fce698f760e01b815260048101829052602401611558565b600382600381111561264257612642614b94565b03610a1b576040516335e2f38360e21b815260048101829052602401611558565b6000808280602001905181019061267a9190614baa565b909590945092505050565b60006126a06002600080516020614dce833981519152614bd8565b8411156126af575060006112a3565b6040805160208101889052908101869052606081018590526080810184905260a0810183905260009060c00160405160208183030381529060405290506000806101006001600160a01b0316836040516127099190614b82565b600060405180830381855afa9150503d8060008114612744576040519150601f19603f3d011682016040523d82523d6000602084013e612749565b606091505b50915091508115612779578080602001905181019061276891906149ac565b1515600115151493505050506112a3565b6127868989898989612bd0565b9998505050505050505050565b6127d56040518060e001604052806000815260200160008152602001606081526020016000151581526020016060815260200160608152602001600081525090565b818060200190518101906127e99190614c3f565b60c089015260a088015260808701521515606086015260408501526020840152825250919050565b600060258a51108061284b57506128498a60208151811061283457612834614a02565b01602001516001600160f81b0319168a612cb3565b155b15612858575060006129a3565b6000886128648d612d19565b8960405160200161287793929190614cfe565b60408051601f198184030181528282019091526015825274113a3cb832911d113bb2b130baba34371733b2ba1160591b602083015291506128b981838a612f26565b6128c8576000925050506129a3565b60006002836040516128da9190614b82565b602060405180830381855afa1580156128f7573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061291a9190614788565b9050600060028e83604051602001612933929190614d41565b60408051601f198184030181529082905261294d91614b82565b602060405180830381855afa15801561296a573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061298d9190614788565b905061299c818a8a8a8a612685565b9450505050505b9a9950505050505050505050565b6129ba82612fd5565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156129ff57611f6b828261303a565b610a1b6130a7565b600082158015612a15575081155b80612a2d5750600160601b63ffffffff60c01b031983145b80612a455750600160601b63ffffffff60c01b031982145b15612a52575060006107e2565b6000600160601b63ffffffff60c01b031983840990506000600160601b63ffffffff60c01b0319807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc8709600160601b63ffffffff60c01b031987600160601b63ffffffff60c01b0319898a0909089050600160601b63ffffffff60c01b03197f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b820891909114949350505050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612b3c5750600091506003905082612bc6565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612b90573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612bbc57506000925060019150829050612bc6565b9250600091508190505b9450945094915050565b6000841580612bed5750600080516020614dce8339815191528510155b80612bf6575083155b80612c0f5750600080516020614dce8339815191528410155b15612c1c575060006112a3565b612c268383612a07565b612c32575060006112a3565b6000612c3d856130c6565b90506000600080516020614dce83398151915282890990506000600080516020614dce83398151915283890990506000612c7987878585613138565b9050600080516020614dce833981519152612ca28a600080516020614dce8339815191526149ef565b8208159a9950505050505050505050565b6000600160f81b83811614612cca575060006107e2565b818015612cdd5750600160fa1b83811614155b15612cea575060006107e2565b600160fb1b83811614612d1057600f60fc1b600160fc1b841601612d10575060006107e2565b50600192915050565b60606000612d2683613800565b90506000819050600060028251118015612d7157508160028351612d4a91906149ef565b81518110612d5a57612d5a614a02565b6020910101516001600160f81b031916603d60f81b145b15612d7e57506002612dc9565b60018251118015612dc057508160018351612d9991906149ef565b81518110612da957612da9614a02565b6020910101516001600160f81b031916603d60f81b145b15612dc9575060015b6000818351612dd891906149ef565b90506000816001600160401b03811115612df457612df4613fd3565b6040519080825280601f01601f191660200182016040528015612e1e576020820181803683370190505b50905060005b82811015612f1b57848181518110612e3e57612e3e614a02565b01602001516001600160f81b031916602b60f81b03612e8a57602d60f81b828281518110612e6e57612e6e614a02565b60200101906001600160f81b031916908160001a905350612f13565b848181518110612e9c57612e9c614a02565b01602001516001600160f81b031916602f60f81b03612ecc57605f60f81b828281518110612e6e57612e6e614a02565b848181518110612ede57612ede614a02565b602001015160f81c60f81b828281518110612efb57612efb614a02565b60200101906001600160f81b031916908160001a9053505b600101612e24565b509695505050505050565b825182516000918591859190845b82811015612fc65781612f478289614d63565b10612f5a5760009550505050505061088d565b83612f658289614d63565b81518110612f7557612f75614a02565b602001015160f81c60f81b6001600160f81b031916858281518110612f9c57612f9c614a02565b01602001516001600160f81b03191614612fbe5760009550505050505061088d565b600101612f34565b50600198975050505050505050565b806001600160a01b03163b60000361300b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611558565b600080516020614dee83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516130579190614b82565b600060405180830381855af49150503d8060008114613092576040519150601f19603f3d011682016040523d82523d6000602084013e613097565b606091505b50915091506112a3858383613826565b3415610e545760405163b398979f60e01b815260040160405180910390fd5b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f6080820152600080516020614dce83398151915260a082015260208160c0836005600019fa61313157600080fd5b5192915050565b600080808060ff81808815801561314d575087155b15613161576000965050505050505061086d565b6131ad7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d613882565b9092509050811580156131be575080155b156131ec57600080516020614dce83398151915288600080516020614dce833981519152038a089850600097505b600189841c16600189851c1660011b015b8061321f5760018403935060018a851c1660018a861c1660011b0190506131fd565b50600189841c16600189851c1660011b01955060018603613281577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603613290578a96508993505b6003860361329f578196508093505b60018303925060019550600194505b82600019111561378357600160601b63ffffffff60c01b031984600209600160601b63ffffffff60c01b0319818209600160601b63ffffffff60c01b0319818a09600160601b63ffffffff60c01b03198284099250600160601b63ffffffff60c01b031980600160601b63ffffffff60c01b03198b8d08600160601b63ffffffff60c01b03198c600160601b63ffffffff60c01b0319038e0809600309600160601b63ffffffff60c01b03198985099850600160601b63ffffffff60c01b03198a84099950600160601b63ffffffff60c01b031980836002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319838409089a50600160601b63ffffffff60c01b03198083600160601b63ffffffff60c01b0319038d0882099250600160601b63ffffffff60c01b031983600160601b63ffffffff60c01b03198a870908975060018d881c1660018d891c1660011b0190508061342b5787600160601b63ffffffff60c01b031903975050505050613778565b6001810361347a577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103613489578e93508d92505b60038103613498578593508492505b896134b157509198506001975087965094506137789050565b600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b03198b860908600160601b63ffffffff60c01b03198c600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b03198d88090893508061366a578361366a57600160601b63ffffffff60c01b0319896002600160601b0363ffffffff60c01b0319099450600160601b63ffffffff60c01b03198586099350600160601b63ffffffff60c01b0319848d099250600160601b63ffffffff60c01b03198486099450600160601b63ffffffff60c01b0319808c600160601b63ffffffff60c01b0319038e08600160601b63ffffffff60c01b03198d8f08099050600160601b63ffffffff60c01b0319816003099150600160601b63ffffffff60c01b03198a86099950600160601b63ffffffff60c01b03198b85099a50600160601b63ffffffff60c01b031980846002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319848509089b50600160601b63ffffffff60c01b0319808d600160601b63ffffffff60c01b031903850883099350600160601b63ffffffff60c01b0319808a8709850898505050505050613778565b600160601b63ffffffff60c01b03198485099150600160601b63ffffffff60c01b0319848309600160601b63ffffffff60c01b0319838d099b50600160601b63ffffffff60c01b0319818c099a50600160601b63ffffffff60c01b0319838e09600160601b63ffffffff60c01b031980826002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b031984600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b031987880908089350600160601b63ffffffff60c01b031980838d09600160601b63ffffffff60c01b031985600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b031903860809089a50505050809a50505050505b6001830392506132ae565b60405186606082015260208152602080820152602060408201526002600160601b0363ffffffff60c01b03196080820152600160601b63ffffffff60c01b031960a082015260208160c0836005600019fa6137dd57600080fd5b600160601b63ffffffff60c01b0319815189099c9b505050505050505050505050565b60606107e282604051806060016040528060408152602001614e0e604091396001613910565b60608261383b5761383682613a8f565b61088d565b815115801561385257506001600160a01b0384163b155b1561387b57604051639996b31560e01b81526001600160a01b0385166004820152602401611558565b508061088d565b600080808086613899578585935093505050613907565b846138ab578787935093505050613907565b85881480156138b957508487145b156138da576138cb8888600180613ab8565b929a50909850925090506138f4565b6138e988886001808a8a613c13565b929a50909850925090505b61390088888484613d97565b9350935050505b94509492505050565b60608351600003613930575060408051602081019091526000815261088d565b600082613961576003855160046139479190614d76565b613952906002614d63565b61395c9190614bd8565b613986565b6003855160026139719190614d63565b61397b9190614bd8565b613986906004614d76565b90506000816001600160401b038111156139a2576139a2613fd3565b6040519080825280601f01601f1916602001820160405280156139cc576020820181803683370190505b50905060018501602082018788518901602081018051600082525b82841015613a42576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f81168701518653506001850194506139e7565b905250508515613a8357600388510660018114613a665760028114613a7957613a81565b603d6001830353603d6002830353613a81565b603d60018303535b505b50909695505050505050565b805115613a9f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080600080600160601b63ffffffff60c01b0319876002099350600160601b63ffffffff60c01b03198485099150600160601b63ffffffff60c01b03198289099050600160601b63ffffffff60c01b03198285099250600160601b63ffffffff60c01b03198683099150600160601b63ffffffff60c01b031980600160601b63ffffffff60c01b0319888b08600160601b63ffffffff60c01b031989600160601b63ffffffff60c01b0319038c08096003099550600160601b63ffffffff60c01b031980826002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319888909089350600160601b63ffffffff60c01b03198085600160601b63ffffffff60c01b031903830887099750600160601b63ffffffff60c01b03198584099050600160601b63ffffffff60c01b031980888509600160601b63ffffffff60c01b03190389089250945094509450949050565b60008060008088600003613c3257508492508391506001905080613d8a565b600160601b63ffffffff60c01b0319988903988981898809089450600160601b63ffffffff60c01b03198a600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b03198a8909089550600160601b63ffffffff60c01b03198687099350600160601b63ffffffff60c01b03198685099250600160601b63ffffffff60c01b03198489099150600160601b63ffffffff60c01b03198388099050600160601b63ffffffff60c01b0319848b099750600160601b63ffffffff60c01b031980896002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b031985600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b0319898a0908089350600160601b63ffffffff60c01b031980848b09600160601b63ffffffff60c01b031987600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b0319038d08090892505b9650965096509692505050565b6000806000613da584613e04565b9050600160601b63ffffffff60c01b031981870991506000600160601b63ffffffff60c01b03198287099050600160601b63ffffffff60c01b03198182099150600160601b63ffffffff60c01b03198289099350505094509492505050565b600060405160208152602080820152602060408201528260608201526002600160601b0363ffffffff60c01b03196080820152600160601b63ffffffff60c01b031960a082015260208160c0836005600019fa61313157600080fd5b508054600082559060005260206000209081019061094e91905b80821115613e8e5760008155600101613e7a565b5090565b600060208284031215613ea457600080fd5b81356001600160e01b03198116811461088d57600080fd5b6001600160a01b038116811461094e57600080fd5b803561189581613ebc565b60008083601f840112613eee57600080fd5b5081356001600160401b03811115613f0557600080fd5b6020830191508360208260051b8501011115613f2057600080fd5b9250929050565b60008060008060008060006080888a031215613f4257600080fd5b8735613f4d81613ebc565b965060208801356001600160401b0380821115613f6957600080fd5b613f758b838c01613edc565b909850965060408a0135915080821115613f8e57600080fd5b613f9a8b838c01613edc565b909650945060608a0135915080821115613fb357600080fd5b50613fc08a828b01613edc565b989b979a50959850939692959293505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561401157614011613fd3565b604052919050565b60006001600160401b0382111561403257614032613fd3565b50601f01601f191660200190565b600082601f83011261405157600080fd5b813561406461405f82614019565b613fe9565b81815284602083860101111561407957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156140ac57600080fd5b84356140b781613ebc565b935060208501356140c781613ebc565b92506040850135915060608501356001600160401b038111156140e957600080fd5b6140f587828801614040565b91505092959194509250565b60008083601f84011261411357600080fd5b5081356001600160401b0381111561412a57600080fd5b602083019150836020828501011115613f2057600080fd5b60008060006040848603121561415757600080fd5b8335925060208401356001600160401b0381111561417457600080fd5b61418086828701614101565b9497909650939450505050565b6000806000606084860312156141a257600080fd5b83356001600160401b038111156141b857600080fd5b840161012081870312156141cb57600080fd5b95602085013595506040909401359392505050565b6000606082840312156141f257600080fd5b50919050565b60006020828403121561420a57600080fd5b81356001600160401b0381111561422057600080fd5b61086d848285016141e0565b6020808252825182820181905260009190848201906040850190845b81811015613a8357835183529284019291840191600101614248565b6000806020838503121561427757600080fd5b82356001600160401b0381111561428d57600080fd5b61429985828601613edc565b90969095509350505050565b6000602082840312156142b757600080fd5b81356001600160c01b038116811461088d57600080fd5b6000602082840312156142e057600080fd5b81356001600160401b038111156142f657600080fd5b820160c0818503121561088d57600080fd5b60006020828403121561431a57600080fd5b5035919050565b6000806040838503121561433457600080fd5b823561433f81613ebc565b915060208301356001600160401b0381111561435a57600080fd5b61436685828601614040565b9150509250929050565b801515811461094e57600080fd5b803561189581614370565b600080600080600080600080600060c08a8c0312156143a757600080fd5b893560ff811681146143b857600080fd5b98506143c660208b01613ed1565b975060408a01356001600160401b03808211156143e257600080fd5b6143ee8d838e01613edc565b909950975060608c013591508082111561440757600080fd5b6144138d838e01613edc565b909750955060808c013591508082111561442c57600080fd5b506144398c828d01613edc565b909450925061444c905060a08b0161437e565b90509295985092959850929598565b6000806040838503121561446e57600080fd5b823561447981613ebc565b946020939093013593505050565b60005b838110156144a257818101518382015260200161448a565b50506000910152565b600081518084526144c3816020860160208601614487565b601f01601f19169290920160200192915050565b60208152600061088d60208301846144ab565b600082601f8301126144fb57600080fd5b813560206001600160401b0382111561451657614516613fd3565b8160051b614525828201613fe9565b928352848101820192828101908785111561453f57600080fd5b83870192505b8483101561455e57823582529183019190830190614545565b979650505050505050565b600080600080600060a0868803121561458157600080fd5b853561458c81613ebc565b9450602086013561459c81613ebc565b935060408601356001600160401b03808211156145b857600080fd5b6145c489838a016144ea565b945060608801359150808211156145da57600080fd5b6145e689838a016144ea565b935060808801359150808211156145fc57600080fd5b5061460988828901614040565b9150509295509295909350565b6000806000806060858703121561462c57600080fd5b84356001600160401b0381111561464257600080fd5b61464e87828801614101565b90989097506020870135966040013595509350505050565b6000806020838503121561467957600080fd5b82356001600160401b0381111561468f57600080fd5b61429985828601614101565b6000806000604084860312156146b057600080fd5b83356001600160401b03808211156146c757600080fd5b6146d387838801614101565b909550935060208601359150808211156146ec57600080fd5b506146f9868287016141e0565b9150509250925092565b600080600080600060a0868803121561471b57600080fd5b853561472681613ebc565b9450602086013561473681613ebc565b9350604086013592506060860135915060808601356001600160401b0381111561475f57600080fd5b61460988828901614040565b60006020828403121561477d57600080fd5b813561088d81613ebc565b60006020828403121561479a57600080fd5b5051919050565b6000808335601e198436030181126147b857600080fd5b83016020810192503590506001600160401b038111156147d757600080fd5b803603821315613f2057600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b888110156148c257858403601f19018a52823536899003605e1901811261484e578283fd5b88016060813561485d81613ebc565b6001600160a01b03168652614874828801836147a1565b828989015261488683890182846147e6565b925050506040614898818401846147a1565b9350878303828901526148ac8385836147e6565b9d89019d97505050938601935050600101614829565b509198975050505050505050565b60208152600082356148e181613ebc565b6001600160a01b039081166020848101919091528401359061490282613ebc565b80821660408501525050604083013560608301526060830135601e1984360301811261492d57600080fd5b83016020810190356001600160401b0381111561494957600080fd5b8060051b360382131561495b57600080fd5b60c0608085015261497060e08501828461480f565b915050608084013560a084015261498a60a08501856147a1565b848303601f190160c08601526124338382846147e6565b805161189581614370565b6000602082840312156149be57600080fd5b815161088d81614370565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156107e2576107e26149d9565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b604081526000614a426040830185876147e6565b82810360208401528335614a5581613ebc565b6001600160a01b0316815260208481013590820152614a7760408501856147a1565b606060408401526123ce6060840182846147e6565b6000808335601e19843603018112614aa357600080fd5b8301803591506001600160401b03821115614abd57600080fd5b602001915036819003821315613f2057600080fd5b60008085851115614ae257600080fd5b83861115614aef57600080fd5b5050820193919092039150565b803560208310156107e257600019602084900360031b1b1692915050565b83815282151560208201526060604082015260006112a360608301846144ab565b60008235605e19833603018112614b5157600080fd5b9190910192915050565b606081526000614b6f6060830186886147e6565b6020830194909452506040015292915050565b60008251614b51818460208701614487565b634e487b7160e01b600052602160045260246000fd5b600080600060608486031215614bbf57600080fd5b8351925060208401519150604084015190509250925092565b600082614bf557634e487b7160e01b600052601260045260246000fd5b500490565b600082601f830112614c0b57600080fd5b8151614c1961405f82614019565b818152846020838601011115614c2e57600080fd5b61086d826020830160208701614487565b600080600080600080600080610100898b031215614c5c57600080fd5b88519750602089015196506040890151955060608901516001600160401b0380821115614c8857600080fd5b614c948c838d01614bfa565b9650614ca260808c016149a1565b955060a08b0151915080821115614cb857600080fd5b614cc48c838d01614bfa565b945060c08b0151915080821115614cda57600080fd5b50614ce78b828c01614bfa565b92505060e089015190509295985092959890939650565b60008451614d10818460208901614487565b845190830190614d24818360208901614487565b8451910190614d37818360208801614487565b0195945050505050565b60008351614d53818460208801614487565b9190910191825250602001919050565b808201808211156107e2576107e26149d9565b80820281158282048414176107e2576107e26149d956fea2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694900a2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694902ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212208ea6494b631dfbdfca458a1c0a52311f1cf61e8c8eacea1ff8b3b6e773897baa64736f6c63430008170033000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d780000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x2", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x45826a2aa19fbfdef482e146ca1d9d59df7eea7f214645c317dafa90f24cc7be", + "transactionType": "CREATE2", + "contractName": "AllowedCalldataEnforcer", + "contractAddress": "0x48db3835a873d64a4af2c09f014052407c003bd7", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x7ac98", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061059c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610085575b600080fd5b61005961005436600461035a565b61009d565b005b61006e61006936600461041d565b61020c565b60405161007c92919061045f565b60405180910390f35b61005961009336600461035a565b5050505050505050565b60006060806100ac8b8b61020c565b805191945092506100c060408901896104b6565b90506100cc82866104fd565b11156101375760405162461bcd60e51b815260206004820152602f60248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d60448201526e0c6c2d8d8c8c2e8c25ad8cadccee8d608b1b60648201526084015b60405180910390fd5b61014460408901896104b6565b859061015084836104fd565b9261015d9392919061051e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509294506101a192508491508590506102d9565b6101fe5760405162461bcd60e51b815260206004820152602860248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d60448201526763616c6c6461746160c01b606482015260840161012e565b505050505050505050505050565b6000606060218310156102745760405162461bcd60e51b815260206004820152602a60248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d6044820152697465726d732d73697a6560b01b606482015260840161012e565b61028260206000858761051e565b61028b91610548565b915061029a836020818761051e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250949792965091945050505050565b6000818051906020012083805190602001201490505b92915050565b60008083601f84011261030757600080fd5b50813567ffffffffffffffff81111561031f57600080fd5b60208301915083602082850101111561033757600080fd5b9250929050565b80356001600160a01b038116811461035557600080fd5b919050565b60008060008060008060008060c0898b03121561037657600080fd5b883567ffffffffffffffff8082111561038e57600080fd5b61039a8c838d016102f5565b909a50985060208b01359150808211156103b357600080fd5b6103bf8c838d016102f5565b909850965060408b01359150808211156103d857600080fd5b5089016060818c0312156103eb57600080fd5b93506060890135925061040060808a0161033e565b915061040e60a08a0161033e565b90509295985092959890939650565b6000806020838503121561043057600080fd5b823567ffffffffffffffff81111561044757600080fd5b610453858286016102f5565b90969095509350505050565b8281526000602060406020840152835180604085015260005b8181101561049457858101830151858201606001528201610478565b506000606082860101526060601f19601f830116850101925050509392505050565b6000808335601e198436030181126104cd57600080fd5b83018035915067ffffffffffffffff8211156104e857600080fd5b60200191503681900382131561033757600080fd5b808201808211156102ef57634e487b7160e01b600052601160045260246000fd5b6000808585111561052e57600080fd5b8386111561053b57600080fd5b5050820193919092039150565b803560208310156102ef57600019602084900360031b1b169291505056fea264697066735822122094149f339193c37892b2442e24526e5fff221c6592b2b7cd87732677fcc1c9c464736f6c63430008170033", + "nonce": "0x3", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8c8cb5feea10d6490df0cd14a2729bcaa8c867edf94c53804f16081b0c6cd005", + "transactionType": "CREATE2", + "contractName": "AllowedMethodsEnforcer", + "contractAddress": "0xfd731951bf1c52afccee3e6f14ab656475b76dd4", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x8ba05", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610683806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610084575b600080fd5b6100596100543660046103a7565b61009c565b005b61006e61006936600461046a565b6101ff565b60405161007b91906104ac565b60405180910390f35b6100596100923660046103a7565b5050505050505050565b60046100ab60408601866104fa565b9050101561011a5760405162461bcd60e51b815260206004820152603160248201527f416c6c6f7765644d6574686f6473456e666f726365723a696e76616c69642d616044820152700c6e8d2dedc5ac8c2e8c25ad8cadccee8d607b1b60648201526084015b60405180910390fd5b600061012960408601866104fa565b61013891600491600091610541565b6101419161056b565b9050600061014f8a8a6101ff565b805190915060005b818110156101a4578281815181106101715761017161059b565b60200260200101516001600160e01b031916846001600160e01b0319160361019c5750505050610092565b600101610157565b5060405162461bcd60e51b815260206004820152602960248201527f416c6c6f7765644d6574686f6473456e666f726365723a6d6574686f642d6e6f6044820152681d0b585b1b1bddd95960ba1b6064820152608401610111565b606060008261020f6004826105c7565b156102705760405162461bcd60e51b815260206004820152602b60248201527f416c6c6f7765644d6574686f6473456e666f726365723a696e76616c69642d7460448201526a0cae4dae65ad8cadccee8d60ab1b6064820152608401610111565b61027b6004826105f1565b67ffffffffffffffff81111561029357610293610605565b6040519080825280602002602001820160405280156102bc578160200160208202803683370190505b50925060005b81811015610339578581866102d882600461061b565b926102e593929190610541565b6102ee9161056b565b8484815181106103005761030061059b565b6001600160e01b0319909216602092830291909101909101528261032381610634565b9350610332905060048261061b565b90506102c2565b50505092915050565b60008083601f84011261035457600080fd5b50813567ffffffffffffffff81111561036c57600080fd5b60208301915083602082850101111561038457600080fd5b9250929050565b80356001600160a01b03811681146103a257600080fd5b919050565b60008060008060008060008060c0898b0312156103c357600080fd5b883567ffffffffffffffff808211156103db57600080fd5b6103e78c838d01610342565b909a50985060208b013591508082111561040057600080fd5b61040c8c838d01610342565b909850965060408b013591508082111561042557600080fd5b5089016060818c03121561043857600080fd5b93506060890135925061044d60808a0161038b565b915061045b60a08a0161038b565b90509295985092959890939650565b6000806020838503121561047d57600080fd5b823567ffffffffffffffff81111561049457600080fd5b6104a085828601610342565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156104ee5783516001600160e01b031916835292840192918401916001016104c8565b50909695505050505050565b6000808335601e1984360301811261051157600080fd5b83018035915067ffffffffffffffff82111561052c57600080fd5b60200191503681900382131561038457600080fd5b6000808585111561055157600080fd5b8386111561055e57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156105935780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826105d6576105d66105b1565b500690565b634e487b7160e01b600052601160045260246000fd5b600082610600576106006105b1565b500490565b634e487b7160e01b600052604160045260246000fd5b8082018082111561062e5761062e6105db565b92915050565b600060018201610646576106466105db565b506001019056fea26469706673582212204ec9b63db8ffcc611dbc205c0eb5d3daa906537fc4f6d216704a61e004393bed64736f6c63430008170033", + "nonce": "0x4", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x69fd87514a5a8d56ad612dcafe63219d52644f78656d487866ef591b44556f88", + "transactionType": "CREATE2", + "contractName": "AllowedTargetsEnforcer", + "contractAddress": "0xbc8673c0afa52d86d991c06881e55b2966920564", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x7f38f", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b506105d9806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610084575b600080fd5b61005961005436600461031e565b61009c565b005b61006e6100693660046103e1565b610174565b60405161007b9190610423565b60405180910390f35b61005961009236600461031e565b5050505050505050565b60006100ab6020860186610470565b905060006100b98a8a610174565b805190915060005b8181101561010c578281815181106100db576100db610492565b60200260200101516001600160a01b0316846001600160a01b0316036101045750505050610092565b6001016100c1565b5060405162461bcd60e51b815260206004820152603160248201527f416c6c6f77656454617267657473456e666f726365723a7461726765742d6164604482015270191c995cdccb5b9bdd0b585b1b1bddd959607a1b60648201526084015b60405180910390fd5b60606000826101846014826104be565b156101e55760405162461bcd60e51b815260206004820152602b60248201527f416c6c6f77656454617267657473456e666f726365723a696e76616c69642d7460448201526a0cae4dae65ad8cadccee8d60ab1b606482015260840161016b565b6101f06014826104e8565b67ffffffffffffffff811115610208576102086104fc565b604051908082528060200260200182016040528015610231578160200160208202803683370190505b50925060005b818110156102b05785818661024d826014610512565b9261025a9392919061052b565b61026391610555565b60601c84848151811061027857610278610492565b6001600160a01b03909216602092830291909101909101528261029a8161058a565b93506102a99050601482610512565b9050610237565b50505092915050565b60008083601f8401126102cb57600080fd5b50813567ffffffffffffffff8111156102e357600080fd5b6020830191508360208285010111156102fb57600080fd5b9250929050565b80356001600160a01b038116811461031957600080fd5b919050565b60008060008060008060008060c0898b03121561033a57600080fd5b883567ffffffffffffffff8082111561035257600080fd5b61035e8c838d016102b9565b909a50985060208b013591508082111561037757600080fd5b6103838c838d016102b9565b909850965060408b013591508082111561039c57600080fd5b5089016060818c0312156103af57600080fd5b9350606089013592506103c460808a01610302565b91506103d260a08a01610302565b90509295985092959890939650565b600080602083850312156103f457600080fd5b823567ffffffffffffffff81111561040b57600080fd5b610417858286016102b9565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156104645783516001600160a01b03168352928401929184019160010161043f565b50909695505050505050565b60006020828403121561048257600080fd5b61048b82610302565b9392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826104cd576104cd6104a8565b500690565b634e487b7160e01b600052601160045260246000fd5b6000826104f7576104f76104a8565b500490565b634e487b7160e01b600052604160045260246000fd5b80820180821115610525576105256104d2565b92915050565b6000808585111561053b57600080fd5b8386111561054857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156105825780818660140360031b1b83161692505b505092915050565b60006001820161059c5761059c6104d2565b506001019056fea26469706673582212204a2e5d298e85989e2cc1b01eb90837481124fb817e6ba907174cafb6c568768564736f6c63430008170033", + "nonce": "0x5", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xfe1ae340140269e4f6d9de2f060644a3755f6b3904eea4580db08c81c6615e0a", + "transactionType": "CREATE2", + "contractName": "BlockNumberEnforcer", + "contractAddress": "0xc15faffa0d879b9263c15a46ce31eacfa2e0e8ae", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6942b", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061045b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610092575b600080fd5b6100596100543660046102bd565b6100aa565b005b61006e610069366004610380565b6101b6565b604080516001600160801b0393841681529290911660208301520160405180910390f35b6100596100a03660046102bd565b5050505050505050565b6000806100b78a8a6101b6565b90925090506001600160801b0382161561013457816001600160801b031643116101345760405162461bcd60e51b8152602060048201526024808201527f426c6f636b4e756d626572456e666f726365723a6561726c792d64656c6567616044820152633a34b7b760e11b60648201526084015b60405180910390fd5b6001600160801b038116156101aa57806001600160801b031643106101aa5760405162461bcd60e51b815260206004820152602660248201527f426c6f636b4e756d626572456e666f726365723a657870697265642d64656c6560448201526533b0ba34b7b760d11b606482015260840161012b565b50505050505050505050565b6000806020831461021a5760405162461bcd60e51b815260206004820152602860248201527f426c6f636b4e756d626572456e666f726365723a696e76616c69642d7465726d6044820152670e65ad8cadccee8d60c31b606482015260840161012b565b6102286010600085876103c2565b610231916103ec565b60801c915061024383601081876103c2565b61024c916103ec565b60801c90509250929050565b60008083601f84011261026a57600080fd5b50813567ffffffffffffffff81111561028257600080fd5b60208301915083602082850101111561029a57600080fd5b9250929050565b80356001600160a01b03811681146102b857600080fd5b919050565b60008060008060008060008060c0898b0312156102d957600080fd5b883567ffffffffffffffff808211156102f157600080fd5b6102fd8c838d01610258565b909a50985060208b013591508082111561031657600080fd5b6103228c838d01610258565b909850965060408b013591508082111561033b57600080fd5b5089016060818c03121561034e57600080fd5b93506060890135925061036360808a016102a1565b915061037160a08a016102a1565b90509295985092959890939650565b6000806020838503121561039357600080fd5b823567ffffffffffffffff8111156103aa57600080fd5b6103b685828601610258565b90969095509350505050565b600080858511156103d257600080fd5b838611156103df57600080fd5b5050820193919092039150565b6fffffffffffffffffffffffffffffffff19813581811691601085101561041d5780818660100360031b1b83161692505b50509291505056fea26469706673582212202f1df071a3b936ee3ad015758f36f43130359bf66ac06d4703490535de194a3864736f6c63430008170033", + "nonce": "0x6", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "DeployedEnforcer", + "contractAddress": "0x5accb9559b56a6c1e3f90e342c85c42d93720d43", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x8f463", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b506106b5806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063481286e6146100515780639751a83d14610081578063b99deb0e14610096578063de723eeb146100b8575b600080fd5b61006461005f366004610410565b6100d0565b6040516001600160a01b0390911681526020015b60405180910390f35b61009461008f366004610497565b6100e5565b005b6100a96100a436600461055a565b6101e4565b6040516100789392919061059c565b6100946100c6366004610497565b5050505050505050565b60006100dc82846102ca565b90505b92915050565b60008060006100f48b8b6101e4565b919450925090506001600160a01b0383163b1561014f576040516001600160a01b03841681527f641dafeb23238fae3ef71c64fced975da90c34dede63890507f3dda6b1e0dfef9060200160405180910390a15050506100c6565b600061015b82846102d7565b9050836001600160a01b0316816001600160a01b0316146101d65760405162461bcd60e51b815260206004820152602a60248201527f4465706c6f796564456e666f726365723a6465706c6f7965642d6164647265736044820152690e65adad2e6dac2e8c6d60b31b60648201526084015b60405180910390fd5b505050505050505050505050565b6000806060603484116102475760405162461bcd60e51b815260206004820152602560248201527f4465706c6f796564456e666f726365723a696e76616c69642d7465726d732d6c6044820152640cadccee8d60db1b60648201526084016101cd565b610255601460008688610602565b61025e9161062c565b60601c9250610271603460148688610602565b61027a91610661565b91506102898460348188610602565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509598949750919550929350505050565b60006100dc83833061035f565b60006102e560008385610389565b9050806001600160a01b03163b60000361031d576040516352c7cd4960e11b81526001600160a01b03821660048201526024016101cd565b6040516001600160a01b03821681527faf3c4b03f515b5a38f3c238fdc24abf10854a2f27f2a85743a71de17e9bc7e7f9060200160405180910390a192915050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6000834710156103b55760405163392efb2b60e21b8152476004820152602481018590526044016101cd565b81516000036103d757604051631328927760e21b815260040160405180910390fd5b8282516020840186f590506001600160a01b03811661040957604051633a0ba96160e11b815260040160405180910390fd5b9392505050565b6000806040838503121561042357600080fd5b50508035926020909101359150565b60008083601f84011261044457600080fd5b50813567ffffffffffffffff81111561045c57600080fd5b60208301915083602082850101111561047457600080fd5b9250929050565b80356001600160a01b038116811461049257600080fd5b919050565b60008060008060008060008060c0898b0312156104b357600080fd5b883567ffffffffffffffff808211156104cb57600080fd5b6104d78c838d01610432565b909a50985060208b01359150808211156104f057600080fd5b6104fc8c838d01610432565b909850965060408b013591508082111561051557600080fd5b5089016060818c03121561052857600080fd5b93506060890135925061053d60808a0161047b565b915061054b60a08a0161047b565b90509295985092959890939650565b6000806020838503121561056d57600080fd5b823567ffffffffffffffff81111561058457600080fd5b61059085828601610432565b90969095509350505050565b60018060a01b03841681526000602084602084015260606040840152835180606085015260005b818110156105df578581018301518582016080015282016105c3565b506000608082860101526080601f19601f83011685010192505050949350505050565b6000808585111561061257600080fd5b8386111561061f57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106595780818660140360031b1b83161692505b505092915050565b803560208310156100df57600019602084900360031b1b169291505056fea2646970667358221220adae6ada7a0e210e98db78555afd35a3b834fe39e89d1ae92e20b35e9cc9358664736f6c63430008170033", + "nonce": "0x7", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "ERC20BalanceGteEnforcer", + "contractAddress": "0xb5d6b1ec6d868a3bae5b7f48178eaa2686a7a087", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xa3337", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061074a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806332a16f4e146100675780638678d6ef1461009f5780639751a83d146100c0578063b5e54492146100d5578063b99deb0e146100f5578063de723eeb14610127575b600080fd5b61008a61007536600461049d565b60016020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100b26100ad3660046104d2565b61013a565b604051908152602001610096565b6100d36100ce366004610557565b61014f565b005b6100b26100e336600461049d565b60006020819052908152604090205481565b61010861010336600461061a565b610289565b604080516001600160a01b039093168352602083019190915201610096565b6100d3610135366004610557565b61032f565b600061014784848461045a565b949350505050565b600061015b8989610289565b509050600061016b33838761045a565b60008181526001602052604090205490915060ff16156101e55760405162461bcd60e51b815260206004820152602a60248201527f455243323042616c616e6365477465456e666f726365723a656e666f726365726044820152690b5a5ccb5b1bd8dad95960b21b60648201526084015b60405180910390fd5b6000818152600160208190526040808320805460ff1916909217909155516370a0823160e01b81526001600160a01b0386811660048301528416906370a0823190602401602060405180830381865afa158015610246573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026a919061065c565b6000928352602083905260409092209190915550505050505050505050565b600080603483146102f15760405162461bcd60e51b815260206004820152602c60248201527f455243323042616c616e6365477465456e666f726365723a696e76616c69642d60448201526b0e8cae4dae65ad8cadccee8d60a31b60648201526084016101dc565b6102ff601460008587610675565b6103089161069f565b60601c915061031a8360148187610675565b610323916106d4565b60001c90509250929050565b60008061033c8a8a610289565b91509150600061034d33848861045a565b600081815260016020526040808220805460ff19169055516370a0823160e01b81526001600160a01b03888116600483015292935090918516906370a0823190602401602060405180830381865afa1580156103ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d1919061065c565b6000838152602081905260409020549091506103ee9084906106f3565b81101561044c5760405162461bcd60e51b815260206004820152602660248201527f455243323042616c616e6365477465456e666f726365723a62616c616e63652d6044820152651b9bdd0b59dd60d21b60648201526084016101dc565b505050505050505050505050565b604080516001600160a01b039485166020808301919091529390941684820152606080850192909252805180850390920182526080909301909252815191012090565b6000602082840312156104af57600080fd5b5035919050565b80356001600160a01b03811681146104cd57600080fd5b919050565b6000806000606084860312156104e757600080fd5b6104f0846104b6565b92506104fe602085016104b6565b9150604084013590509250925092565b60008083601f84011261052057600080fd5b50813567ffffffffffffffff81111561053857600080fd5b60208301915083602082850101111561055057600080fd5b9250929050565b60008060008060008060008060c0898b03121561057357600080fd5b883567ffffffffffffffff8082111561058b57600080fd5b6105978c838d0161050e565b909a50985060208b01359150808211156105b057600080fd5b6105bc8c838d0161050e565b909850965060408b01359150808211156105d557600080fd5b5089016060818c0312156105e857600080fd5b9350606089013592506105fd60808a016104b6565b915061060b60a08a016104b6565b90509295985092959890939650565b6000806020838503121561062d57600080fd5b823567ffffffffffffffff81111561064457600080fd5b6106508582860161050e565b90969095509350505050565b60006020828403121561066e57600080fd5b5051919050565b6000808585111561068557600080fd5b8386111561069257600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106cc5780818660140360031b1b83161692505b505092915050565b803560208310156106ed57600019602084900360031b1b165b92915050565b808201808211156106ed57634e487b7160e01b600052601160045260246000fdfea2646970667358221220706a4bd5217d105228b49e7ecb48d785e4c5a4cbd88c1e0018e40907dafc0c9d64736f6c63430008170033", + "nonce": "0x8", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "ERC20TransferAmountEnforcer", + "contractAddress": "0x92ac423b9c111962179a6242e1adb58d02c103be", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x990f4", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061073b806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80639751a83d146100515780639dd5d9ab14610066578063b99deb0e146100a1578063de723eeb146100d3575b600080fd5b61006461005f366004610480565b6100eb565b005b61008e610074366004610543565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b6100b46100af36600461056d565b610383565b604080516001600160a01b039093168352602083019190915201610098565b6100646100e1366004610480565b5050505050505050565b6100f860408501856105af565b90506044146101565760405162461bcd60e51b815260206004820152603160248201526000805160206106e68339815191526044820152700d8d2c85ac2c6e8d2dedc5ad8cadccee8d607b1b60648201526084015b60405180910390fd5b6000806101638a8a610383565b9092509050600061017760208801886105f6565b905063a9059cbb60e01b6001600160a01b03848116908316146101df5760405162461bcd60e51b815260206004820152602c60248201526000805160206106e683398151915260448201526b1b1a590b58dbdb9d1c9858dd60a21b606482015260840161014d565b60006101ee60408a018a6105af565b6101fd91600491600091610618565b61020691610642565b90506001600160e01b0319808216908316146102655760405162461bcd60e51b815260206004820152602a60248201526000805160206106e68339815191526044820152691b1a590b5b595d1a1bd960b21b606482015260840161014d565b600061027460408b018b6105af565b61028391604491602491610618565b61028c91610672565b336000908152602081815260408083208d845290915281208054929350909183919083906102bb908490610691565b92505081905590508581111561032a5760405162461bcd60e51b815260206004820152602e60248201527f45524332305472616e73666572416d6f756e74456e666f726365723a616c6c6f60448201526d1dd85b98d94b595e18d95959195960921b606482015260840161014d565b60408051878152602081018390528b916001600160a01b038b169133917fc026e493323d526061a052b5dd562495120e2f648797a48be61966d3a6beec8d910160405180910390a4505050505050505050505050505050565b600080603483146103dd5760405162461bcd60e51b815260206004820152603060248201526000805160206106e683398151915260448201526f0d8d2c85ae8cae4dae65ad8cadccee8d60831b606482015260840161014d565b6103eb601460008587610618565b6103f4916106b2565b60601c91506104068360148187610618565b61040f91610672565b60001c90509250929050565b60008083601f84011261042d57600080fd5b50813567ffffffffffffffff81111561044557600080fd5b60208301915083602082850101111561045d57600080fd5b9250929050565b80356001600160a01b038116811461047b57600080fd5b919050565b60008060008060008060008060c0898b03121561049c57600080fd5b883567ffffffffffffffff808211156104b457600080fd5b6104c08c838d0161041b565b909a50985060208b01359150808211156104d957600080fd5b6104e58c838d0161041b565b909850965060408b01359150808211156104fe57600080fd5b5089016060818c03121561051157600080fd5b93506060890135925061052660808a01610464565b915061053460a08a01610464565b90509295985092959890939650565b6000806040838503121561055657600080fd5b61055f83610464565b946020939093013593505050565b6000806020838503121561058057600080fd5b823567ffffffffffffffff81111561059757600080fd5b6105a38582860161041b565b90969095509350505050565b6000808335601e198436030181126105c657600080fd5b83018035915067ffffffffffffffff8211156105e157600080fd5b60200191503681900382131561045d57600080fd5b60006020828403121561060857600080fd5b61061182610464565b9392505050565b6000808585111561062857600080fd5b8386111561063557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561066a5780818660040360031b1b83161692505b505092915050565b8035602083101561068b57600019602084900360031b1b165b92915050565b8082018082111561068b57634e487b7160e01b600052601160045260246000fd5b6bffffffffffffffffffffffff19813581811691601485101561066a5760149490940360031b84901b169092169291505056fe45524332305472616e73666572416d6f756e74456e666f726365723a696e7661a2646970667358221220bbaa47e7ff7ca5d260ee2e4ae44f60d5ed447ee0a25335e020538968f33cc37d64736f6c63430008170033", + "nonce": "0x9", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "IdEnforcer", + "contractAddress": "0x34152d9f3f8f74338d50703e780389e829b4abac", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x667df", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610486806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063595dce48146100515780639751a83d14610079578063b99deb0e1461008e578063de723eeb146100af575b600080fd5b61006461005f3660046102a8565b6100c7565b60405190151581526020015b60405180910390f35b61008c61008736600461032d565b6100fe565b005b6100a161009c3660046103f0565b610204565b604051908152602001610070565b61008c6100bd36600461032d565b5050505050505050565b6001600160a01b0380841660009081526020818152604080832093861683529290529081206100f69083610267565b949350505050565b600061010a8989610204565b90506101173384836100c7565b156101695760405162461bcd60e51b815260206004820152601a60248201527f4964456e666f726365723a69642d616c72656164792d7573656400000000000060448201526064015b60405180910390fd5b336000908152602081815260408083206001600160a01b03871684528252808320600885901c845290915290208054600160ff84161b179055826001600160a01b0316826001600160a01b0316336001600160a01b03167f6286af1aaf28b34723a53056e5608eabb40c823d1ce093ff371cf08c502431d6846040516101f191815260200190565b60405180910390a4505050505050505050565b6000602082146102565760405162461bcd60e51b815260206004820152601f60248201527f4964456e666f726365723a696e76616c69642d7465726d732d6c656e677468006044820152606401610160565b6102608284610432565b9392505050565b600881901c600090815260208390526040902054600160ff83161b1615155b92915050565b80356001600160a01b03811681146102a357600080fd5b919050565b6000806000606084860312156102bd57600080fd5b6102c68461028c565b92506102d46020850161028c565b9150604084013590509250925092565b60008083601f8401126102f657600080fd5b50813567ffffffffffffffff81111561030e57600080fd5b60208301915083602082850101111561032657600080fd5b9250929050565b60008060008060008060008060c0898b03121561034957600080fd5b883567ffffffffffffffff8082111561036157600080fd5b61036d8c838d016102e4565b909a50985060208b013591508082111561038657600080fd5b6103928c838d016102e4565b909850965060408b01359150808211156103ab57600080fd5b5089016060818c0312156103be57600080fd5b9350606089013592506103d360808a0161028c565b91506103e160a08a0161028c565b90509295985092959890939650565b6000806020838503121561040357600080fd5b823567ffffffffffffffff81111561041a57600080fd5b610426858286016102e4565b90969095509350505050565b8035602083101561028657600019602084900360031b1b169291505056fea264697066735822122028074431512be4166d9bc04a0557354e43d233df6620f59dcf4e6fea83a3a51f64736f6c63430008170033", + "nonce": "0xa", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "LimitedCallsEnforcer", + "contractAddress": "0x4b3adad4a328bee8ba17b86074d92fe7372180cd", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x61904", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610442806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806319054d89146100515780639751a83d1461008b578063b99deb0e146100a0578063de723eeb146100b3575b600080fd5b61007961005f36600461024e565b600060208181529281526040808220909352908152205481565b60405190815260200160405180910390f35b61009e6100993660046102c1565b6100cb565b005b6100796100ae366004610384565b6101bd565b61009e6100c13660046102c1565b5050505050505050565b60006100d789896101bd565b336000908152602081815260408083208884529091528120805492935090918290610101906103c6565b91829055509050818111156101695760405162461bcd60e51b815260206004820152602360248201527f4c696d6974656443616c6c73456e666f726365723a6c696d69742d657863656560448201526219195960ea1b60648201526084015b60405180910390fd5b604080518381526020810183905286916001600160a01b0386169133917f449da07f2c06c9d1a6b19d2454ffe749e8cf991d22f686e076a1a4844c5ff370910160405180910390a450505050505050505050565b6000602082146102215760405162461bcd60e51b815260206004820152602960248201527f4c696d6974656443616c6c73456e666f726365723a696e76616c69642d7465726044820152680dae65ad8cadccee8d60bb1b6064820152608401610160565b61022b82846103ed565b9392505050565b80356001600160a01b038116811461024957600080fd5b919050565b6000806040838503121561026157600080fd5b61026a83610232565b946020939093013593505050565b60008083601f84011261028a57600080fd5b50813567ffffffffffffffff8111156102a257600080fd5b6020830191508360208285010111156102ba57600080fd5b9250929050565b60008060008060008060008060c0898b0312156102dd57600080fd5b883567ffffffffffffffff808211156102f557600080fd5b6103018c838d01610278565b909a50985060208b013591508082111561031a57600080fd5b6103268c838d01610278565b909850965060408b013591508082111561033f57600080fd5b5089016060818c03121561035257600080fd5b93506060890135925061036760808a01610232565b915061037560a08a01610232565b90509295985092959890939650565b6000806020838503121561039757600080fd5b823567ffffffffffffffff8111156103ae57600080fd5b6103ba85828601610278565b90969095509350505050565b6000600182016103e657634e487b7160e01b600052601160045260246000fd5b5060010190565b8035602083101561040657600019602084900360031b1b165b9291505056fea2646970667358221220f78aa8066d472e78f2d898b70704f695cf682a9b2914539b1a5a83b1dd87e31064736f6c63430008170033", + "nonce": "0xb", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "NonceEnforcer", + "contractAddress": "0x2f32ff3fc3086d7f63f16fe8d0065390d460b40d", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x68e23", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610457806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80632bd4ed211461005c5780639751a83d14610096578063b99deb0e146100ab578063de723eeb146100be578063f5743c4c146100d6575b600080fd5b61008461006a366004610266565b600060208181529281526040808220909352908152205481565b60405190815260200160405180910390f35b6100a96100a43660046102e2565b6100e9565b005b6100846100b93660046103a5565b610178565b6100a96100cc3660046102e2565b5050505050505050565b6100a96100e43660046103e7565b6101e6565b60006100f58989610178565b336000908152602081815260408083206001600160a01b0388168452909152902054909150811461016d5760405162461bcd60e51b815260206004820152601b60248201527f4e6f6e6365456e666f726365723a696e76616c69642d6e6f6e6365000000000060448201526064015b60405180910390fd5b505050505050505050565b6000602082146101d55760405162461bcd60e51b815260206004820152602260248201527f4e6f6e6365456e666f726365723a696e76616c69642d7465726d732d6c656e676044820152610e8d60f31b6064820152608401610164565b6101df8284610402565b9392505050565b6001600160a01b038116600081815260208181526040808320338085529083529281902080546001810190915590518181529093917fe02d340254c92bc3ad96f0fceb790db939e11c669c1f4c8a549d248f17130b33910160405180910390a35050565b80356001600160a01b038116811461026157600080fd5b919050565b6000806040838503121561027957600080fd5b6102828361024a565b91506102906020840161024a565b90509250929050565b60008083601f8401126102ab57600080fd5b50813567ffffffffffffffff8111156102c357600080fd5b6020830191508360208285010111156102db57600080fd5b9250929050565b60008060008060008060008060c0898b0312156102fe57600080fd5b883567ffffffffffffffff8082111561031657600080fd5b6103228c838d01610299565b909a50985060208b013591508082111561033b57600080fd5b6103478c838d01610299565b909850965060408b013591508082111561036057600080fd5b5089016060818c03121561037357600080fd5b93506060890135925061038860808a0161024a565b915061039660a08a0161024a565b90509295985092959890939650565b600080602083850312156103b857600080fd5b823567ffffffffffffffff8111156103cf57600080fd5b6103db85828601610299565b90969095509350505050565b6000602082840312156103f957600080fd5b6101df8261024a565b8035602083101561041b57600019602084900360031b1b165b9291505056fea2646970667358221220b8ac9ab0759f02df69d888b08c000fa4dfa4048ad7f88931687eeff439dd484a64736f6c63430008170033", + "nonce": "0xc", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "TimestampEnforcer", + "contractAddress": "0x78e05f779490c24bf3bfa135b4112e7003b321cd", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x68cc4", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610455806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610092575b600080fd5b6100596100543660046102b7565b6100aa565b005b61006e61006936600461037a565b6101b2565b604080516001600160801b0393841681529290911660208301520160405180910390f35b6100596100a03660046102b7565b5050505050505050565b6000806100b78a8a6101b2565b90925090506001600160801b0382161561013357816001600160801b031642116101335760405162461bcd60e51b815260206004820152602260248201527f54696d657374616d70456e666f726365723a6561726c792d64656c656761746960448201526137b760f11b60648201526084015b60405180910390fd5b6001600160801b038116156101a657806001600160801b031642106101a65760405162461bcd60e51b8152602060048201526024808201527f54696d657374616d70456e666f726365723a657870697265642d64656c6567616044820152633a34b7b760e11b606482015260840161012a565b50505050505050505050565b600080602083146102145760405162461bcd60e51b815260206004820152602660248201527f54696d657374616d70456e666f726365723a696e76616c69642d7465726d732d6044820152650d8cadccee8d60d31b606482015260840161012a565b61022183601081876103bc565b61022a916103e6565b60801c905061023d6010600085876103bc565b610246916103e6565b60801c91509250929050565b60008083601f84011261026457600080fd5b50813567ffffffffffffffff81111561027c57600080fd5b60208301915083602082850101111561029457600080fd5b9250929050565b80356001600160a01b03811681146102b257600080fd5b919050565b60008060008060008060008060c0898b0312156102d357600080fd5b883567ffffffffffffffff808211156102eb57600080fd5b6102f78c838d01610252565b909a50985060208b013591508082111561031057600080fd5b61031c8c838d01610252565b909850965060408b013591508082111561033557600080fd5b5089016060818c03121561034857600080fd5b93506060890135925061035d60808a0161029b565b915061036b60a08a0161029b565b90509295985092959890939650565b6000806020838503121561038d57600080fd5b823567ffffffffffffffff8111156103a457600080fd5b6103b085828601610252565b90969095509350505050565b600080858511156103cc57600080fd5b838611156103d957600080fd5b5050820193919092039150565b6fffffffffffffffffffffffffffffffff1981358181169160108510156104175780818660100360031b1b83161692505b50509291505056fea2646970667358221220032d822c6d896afe6d14f1080a0918e2996d1c61fe51449e6ecf5841d50e5ea464736f6c63430008170033", + "nonce": "0xd", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "ValueLteEnforcer", + "contractAddress": "0xfc20ede0a1132e839fbda9d7ed3904ff3c89540f", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x4e4e9", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061033a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610080575b600080fd5b6100596100543660046101e0565b610098565b005b61006e6100693660046102a3565b61010a565b60405190815260200160405180910390f35b61005961008e3660046101e0565b5050505050505050565b60006100a4898961010a565b905080856020013511156100ff5760405162461bcd60e51b815260206004820152601f60248201527f56616c75654c7465456e666f726365723a76616c75652d746f6f2d686967680060448201526064015b60405180910390fd5b505050505050505050565b60006020821461016a5760405162461bcd60e51b815260206004820152602560248201527f56616c75654c7465456e666f726365723a696e76616c69642d7465726d732d6c6044820152640cadccee8d60db1b60648201526084016100f6565b61017482846102e5565b9392505050565b60008083601f84011261018d57600080fd5b50813567ffffffffffffffff8111156101a557600080fd5b6020830191508360208285010111156101bd57600080fd5b9250929050565b80356001600160a01b03811681146101db57600080fd5b919050565b60008060008060008060008060c0898b0312156101fc57600080fd5b883567ffffffffffffffff8082111561021457600080fd5b6102208c838d0161017b565b909a50985060208b013591508082111561023957600080fd5b6102458c838d0161017b565b909850965060408b013591508082111561025e57600080fd5b5089016060818c03121561027157600080fd5b93506060890135925061028660808a016101c4565b915061029460a08a016101c4565b90509295985092959890939650565b600080602083850312156102b657600080fd5b823567ffffffffffffffff8111156102cd57600080fd5b6102d98582860161017b565b90969095509350505050565b803560208310156102fe57600019602084900360031b1b165b9291505056fea2646970667358221220cd4bcb89c90c60ef26b293e82752e5ff08228ce4ed86119c5597e63559710ece64736f6c63430008170033", + "nonce": "0xe", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x2270564bebbd702c02bab39b94883b98ac6cfdd8e9e1c6a3d9f379793920a39f", + "0x053ac3e9d027b94c36bed3197c5d5565c7b83c3a8d3ec74722f51f3977c8d150", + "0x1ece25e137f1085fb4fd19c65734491a2aa7e3ac90a92edf487af9e0139458eb", + "0x45826a2aa19fbfdef482e146ca1d9d59df7eea7f214645c317dafa90f24cc7be", + "0x8c8cb5feea10d6490df0cd14a2729bcaa8c867edf94c53804f16081b0c6cd005", + "0x69fd87514a5a8d56ad612dcafe63219d52644f78656d487866ef591b44556f88", + "0xfe1ae340140269e4f6d9de2f060644a3755f6b3904eea4580db08c81c6615e0a" + ], + "returns": {}, + "timestamp": 1720358512, + "chain": 10, + "commit": null +} \ No newline at end of file diff --git a/broadcast/DeployEnvironmentSetUp.s.sol/10/run-1720359255.json b/broadcast/DeployEnvironmentSetUp.s.sol/10/run-1720359255.json new file mode 100644 index 0000000..826d5fc --- /dev/null +++ b/broadcast/DeployEnvironmentSetUp.s.sol/10/run-1720359255.json @@ -0,0 +1,340 @@ +{ + "transactions": [ + { + "hash": "0x0ef47d3bcd74141589644bf8cb1ddcb9c84754066dc021f0a0b13aae04adb684", + "transactionType": "CREATE2", + "contractName": "DeployedEnforcer", + "contractAddress": "0x5accb9559b56a6c1e3f90e342c85c42d93720d43", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x8f463", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b506106b5806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063481286e6146100515780639751a83d14610081578063b99deb0e14610096578063de723eeb146100b8575b600080fd5b61006461005f366004610410565b6100d0565b6040516001600160a01b0390911681526020015b60405180910390f35b61009461008f366004610497565b6100e5565b005b6100a96100a436600461055a565b6101e4565b6040516100789392919061059c565b6100946100c6366004610497565b5050505050505050565b60006100dc82846102ca565b90505b92915050565b60008060006100f48b8b6101e4565b919450925090506001600160a01b0383163b1561014f576040516001600160a01b03841681527f641dafeb23238fae3ef71c64fced975da90c34dede63890507f3dda6b1e0dfef9060200160405180910390a15050506100c6565b600061015b82846102d7565b9050836001600160a01b0316816001600160a01b0316146101d65760405162461bcd60e51b815260206004820152602a60248201527f4465706c6f796564456e666f726365723a6465706c6f7965642d6164647265736044820152690e65adad2e6dac2e8c6d60b31b60648201526084015b60405180910390fd5b505050505050505050505050565b6000806060603484116102475760405162461bcd60e51b815260206004820152602560248201527f4465706c6f796564456e666f726365723a696e76616c69642d7465726d732d6c6044820152640cadccee8d60db1b60648201526084016101cd565b610255601460008688610602565b61025e9161062c565b60601c9250610271603460148688610602565b61027a91610661565b91506102898460348188610602565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509598949750919550929350505050565b60006100dc83833061035f565b60006102e560008385610389565b9050806001600160a01b03163b60000361031d576040516352c7cd4960e11b81526001600160a01b03821660048201526024016101cd565b6040516001600160a01b03821681527faf3c4b03f515b5a38f3c238fdc24abf10854a2f27f2a85743a71de17e9bc7e7f9060200160405180910390a192915050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6000834710156103b55760405163392efb2b60e21b8152476004820152602481018590526044016101cd565b81516000036103d757604051631328927760e21b815260040160405180910390fd5b8282516020840186f590506001600160a01b03811661040957604051633a0ba96160e11b815260040160405180910390fd5b9392505050565b6000806040838503121561042357600080fd5b50508035926020909101359150565b60008083601f84011261044457600080fd5b50813567ffffffffffffffff81111561045c57600080fd5b60208301915083602082850101111561047457600080fd5b9250929050565b80356001600160a01b038116811461049257600080fd5b919050565b60008060008060008060008060c0898b0312156104b357600080fd5b883567ffffffffffffffff808211156104cb57600080fd5b6104d78c838d01610432565b909a50985060208b01359150808211156104f057600080fd5b6104fc8c838d01610432565b909850965060408b013591508082111561051557600080fd5b5089016060818c03121561052857600080fd5b93506060890135925061053d60808a0161047b565b915061054b60a08a0161047b565b90509295985092959890939650565b6000806020838503121561056d57600080fd5b823567ffffffffffffffff81111561058457600080fd5b61059085828601610432565b90969095509350505050565b60018060a01b03841681526000602084602084015260606040840152835180606085015260005b818110156105df578581018301518582016080015282016105c3565b506000608082860101526080601f19601f83011685010192505050949350505050565b6000808585111561061257600080fd5b8386111561061f57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106595780818660140360031b1b83161692505b505092915050565b803560208310156100df57600019602084900360031b1b169291505056fea2646970667358221220adae6ada7a0e210e98db78555afd35a3b834fe39e89d1ae92e20b35e9cc9358664736f6c63430008170033", + "nonce": "0x7", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x875059489c3274cead184256d6c5224b27943422f149efadb68aad8f84775859", + "transactionType": "CREATE2", + "contractName": "ERC20BalanceGteEnforcer", + "contractAddress": "0xb5d6b1ec6d868a3bae5b7f48178eaa2686a7a087", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xa3337", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061074a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806332a16f4e146100675780638678d6ef1461009f5780639751a83d146100c0578063b5e54492146100d5578063b99deb0e146100f5578063de723eeb14610127575b600080fd5b61008a61007536600461049d565b60016020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100b26100ad3660046104d2565b61013a565b604051908152602001610096565b6100d36100ce366004610557565b61014f565b005b6100b26100e336600461049d565b60006020819052908152604090205481565b61010861010336600461061a565b610289565b604080516001600160a01b039093168352602083019190915201610096565b6100d3610135366004610557565b61032f565b600061014784848461045a565b949350505050565b600061015b8989610289565b509050600061016b33838761045a565b60008181526001602052604090205490915060ff16156101e55760405162461bcd60e51b815260206004820152602a60248201527f455243323042616c616e6365477465456e666f726365723a656e666f726365726044820152690b5a5ccb5b1bd8dad95960b21b60648201526084015b60405180910390fd5b6000818152600160208190526040808320805460ff1916909217909155516370a0823160e01b81526001600160a01b0386811660048301528416906370a0823190602401602060405180830381865afa158015610246573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026a919061065c565b6000928352602083905260409092209190915550505050505050505050565b600080603483146102f15760405162461bcd60e51b815260206004820152602c60248201527f455243323042616c616e6365477465456e666f726365723a696e76616c69642d60448201526b0e8cae4dae65ad8cadccee8d60a31b60648201526084016101dc565b6102ff601460008587610675565b6103089161069f565b60601c915061031a8360148187610675565b610323916106d4565b60001c90509250929050565b60008061033c8a8a610289565b91509150600061034d33848861045a565b600081815260016020526040808220805460ff19169055516370a0823160e01b81526001600160a01b03888116600483015292935090918516906370a0823190602401602060405180830381865afa1580156103ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d1919061065c565b6000838152602081905260409020549091506103ee9084906106f3565b81101561044c5760405162461bcd60e51b815260206004820152602660248201527f455243323042616c616e6365477465456e666f726365723a62616c616e63652d6044820152651b9bdd0b59dd60d21b60648201526084016101dc565b505050505050505050505050565b604080516001600160a01b039485166020808301919091529390941684820152606080850192909252805180850390920182526080909301909252815191012090565b6000602082840312156104af57600080fd5b5035919050565b80356001600160a01b03811681146104cd57600080fd5b919050565b6000806000606084860312156104e757600080fd5b6104f0846104b6565b92506104fe602085016104b6565b9150604084013590509250925092565b60008083601f84011261052057600080fd5b50813567ffffffffffffffff81111561053857600080fd5b60208301915083602082850101111561055057600080fd5b9250929050565b60008060008060008060008060c0898b03121561057357600080fd5b883567ffffffffffffffff8082111561058b57600080fd5b6105978c838d0161050e565b909a50985060208b01359150808211156105b057600080fd5b6105bc8c838d0161050e565b909850965060408b01359150808211156105d557600080fd5b5089016060818c0312156105e857600080fd5b9350606089013592506105fd60808a016104b6565b915061060b60a08a016104b6565b90509295985092959890939650565b6000806020838503121561062d57600080fd5b823567ffffffffffffffff81111561064457600080fd5b6106508582860161050e565b90969095509350505050565b60006020828403121561066e57600080fd5b5051919050565b6000808585111561068557600080fd5b8386111561069257600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106cc5780818660140360031b1b83161692505b505092915050565b803560208310156106ed57600019602084900360031b1b165b92915050565b808201808211156106ed57634e487b7160e01b600052601160045260246000fdfea2646970667358221220706a4bd5217d105228b49e7ecb48d785e4c5a4cbd88c1e0018e40907dafc0c9d64736f6c63430008170033", + "nonce": "0x8", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x0d24dc342624aa20ed8874892c2a353bb52338cccd65753974e46e2dfa271e4d", + "transactionType": "CREATE2", + "contractName": "ERC20TransferAmountEnforcer", + "contractAddress": "0x92ac423b9c111962179a6242e1adb58d02c103be", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x990f4", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061073b806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80639751a83d146100515780639dd5d9ab14610066578063b99deb0e146100a1578063de723eeb146100d3575b600080fd5b61006461005f366004610480565b6100eb565b005b61008e610074366004610543565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b6100b46100af36600461056d565b610383565b604080516001600160a01b039093168352602083019190915201610098565b6100646100e1366004610480565b5050505050505050565b6100f860408501856105af565b90506044146101565760405162461bcd60e51b815260206004820152603160248201526000805160206106e68339815191526044820152700d8d2c85ac2c6e8d2dedc5ad8cadccee8d607b1b60648201526084015b60405180910390fd5b6000806101638a8a610383565b9092509050600061017760208801886105f6565b905063a9059cbb60e01b6001600160a01b03848116908316146101df5760405162461bcd60e51b815260206004820152602c60248201526000805160206106e683398151915260448201526b1b1a590b58dbdb9d1c9858dd60a21b606482015260840161014d565b60006101ee60408a018a6105af565b6101fd91600491600091610618565b61020691610642565b90506001600160e01b0319808216908316146102655760405162461bcd60e51b815260206004820152602a60248201526000805160206106e68339815191526044820152691b1a590b5b595d1a1bd960b21b606482015260840161014d565b600061027460408b018b6105af565b61028391604491602491610618565b61028c91610672565b336000908152602081815260408083208d845290915281208054929350909183919083906102bb908490610691565b92505081905590508581111561032a5760405162461bcd60e51b815260206004820152602e60248201527f45524332305472616e73666572416d6f756e74456e666f726365723a616c6c6f60448201526d1dd85b98d94b595e18d95959195960921b606482015260840161014d565b60408051878152602081018390528b916001600160a01b038b169133917fc026e493323d526061a052b5dd562495120e2f648797a48be61966d3a6beec8d910160405180910390a4505050505050505050505050505050565b600080603483146103dd5760405162461bcd60e51b815260206004820152603060248201526000805160206106e683398151915260448201526f0d8d2c85ae8cae4dae65ad8cadccee8d60831b606482015260840161014d565b6103eb601460008587610618565b6103f4916106b2565b60601c91506104068360148187610618565b61040f91610672565b60001c90509250929050565b60008083601f84011261042d57600080fd5b50813567ffffffffffffffff81111561044557600080fd5b60208301915083602082850101111561045d57600080fd5b9250929050565b80356001600160a01b038116811461047b57600080fd5b919050565b60008060008060008060008060c0898b03121561049c57600080fd5b883567ffffffffffffffff808211156104b457600080fd5b6104c08c838d0161041b565b909a50985060208b01359150808211156104d957600080fd5b6104e58c838d0161041b565b909850965060408b01359150808211156104fe57600080fd5b5089016060818c03121561051157600080fd5b93506060890135925061052660808a01610464565b915061053460a08a01610464565b90509295985092959890939650565b6000806040838503121561055657600080fd5b61055f83610464565b946020939093013593505050565b6000806020838503121561058057600080fd5b823567ffffffffffffffff81111561059757600080fd5b6105a38582860161041b565b90969095509350505050565b6000808335601e198436030181126105c657600080fd5b83018035915067ffffffffffffffff8211156105e157600080fd5b60200191503681900382131561045d57600080fd5b60006020828403121561060857600080fd5b61061182610464565b9392505050565b6000808585111561062857600080fd5b8386111561063557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561066a5780818660040360031b1b83161692505b505092915050565b8035602083101561068b57600019602084900360031b1b165b92915050565b8082018082111561068b57634e487b7160e01b600052601160045260246000fd5b6bffffffffffffffffffffffff19813581811691601485101561066a5760149490940360031b84901b169092169291505056fe45524332305472616e73666572416d6f756e74456e666f726365723a696e7661a2646970667358221220bbaa47e7ff7ca5d260ee2e4ae44f60d5ed447ee0a25335e020538968f33cc37d64736f6c63430008170033", + "nonce": "0x9", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xfa4e769814b486962e90944e3b1aff0295f9238c6daddac87ce390faa937b602", + "transactionType": "CREATE2", + "contractName": "IdEnforcer", + "contractAddress": "0x34152d9f3f8f74338d50703e780389e829b4abac", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x667df", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610486806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063595dce48146100515780639751a83d14610079578063b99deb0e1461008e578063de723eeb146100af575b600080fd5b61006461005f3660046102a8565b6100c7565b60405190151581526020015b60405180910390f35b61008c61008736600461032d565b6100fe565b005b6100a161009c3660046103f0565b610204565b604051908152602001610070565b61008c6100bd36600461032d565b5050505050505050565b6001600160a01b0380841660009081526020818152604080832093861683529290529081206100f69083610267565b949350505050565b600061010a8989610204565b90506101173384836100c7565b156101695760405162461bcd60e51b815260206004820152601a60248201527f4964456e666f726365723a69642d616c72656164792d7573656400000000000060448201526064015b60405180910390fd5b336000908152602081815260408083206001600160a01b03871684528252808320600885901c845290915290208054600160ff84161b179055826001600160a01b0316826001600160a01b0316336001600160a01b03167f6286af1aaf28b34723a53056e5608eabb40c823d1ce093ff371cf08c502431d6846040516101f191815260200190565b60405180910390a4505050505050505050565b6000602082146102565760405162461bcd60e51b815260206004820152601f60248201527f4964456e666f726365723a696e76616c69642d7465726d732d6c656e677468006044820152606401610160565b6102608284610432565b9392505050565b600881901c600090815260208390526040902054600160ff83161b1615155b92915050565b80356001600160a01b03811681146102a357600080fd5b919050565b6000806000606084860312156102bd57600080fd5b6102c68461028c565b92506102d46020850161028c565b9150604084013590509250925092565b60008083601f8401126102f657600080fd5b50813567ffffffffffffffff81111561030e57600080fd5b60208301915083602082850101111561032657600080fd5b9250929050565b60008060008060008060008060c0898b03121561034957600080fd5b883567ffffffffffffffff8082111561036157600080fd5b61036d8c838d016102e4565b909a50985060208b013591508082111561038657600080fd5b6103928c838d016102e4565b909850965060408b01359150808211156103ab57600080fd5b5089016060818c0312156103be57600080fd5b9350606089013592506103d360808a0161028c565b91506103e160a08a0161028c565b90509295985092959890939650565b6000806020838503121561040357600080fd5b823567ffffffffffffffff81111561041a57600080fd5b610426858286016102e4565b90969095509350505050565b8035602083101561028657600019602084900360031b1b169291505056fea264697066735822122028074431512be4166d9bc04a0557354e43d233df6620f59dcf4e6fea83a3a51f64736f6c63430008170033", + "nonce": "0xa", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb74b77ed77a813fa17a814042f42b6131f3c305453950d550f70f67284e0b0ad", + "transactionType": "CREATE2", + "contractName": "LimitedCallsEnforcer", + "contractAddress": "0x4b3adad4a328bee8ba17b86074d92fe7372180cd", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x61904", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610442806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806319054d89146100515780639751a83d1461008b578063b99deb0e146100a0578063de723eeb146100b3575b600080fd5b61007961005f36600461024e565b600060208181529281526040808220909352908152205481565b60405190815260200160405180910390f35b61009e6100993660046102c1565b6100cb565b005b6100796100ae366004610384565b6101bd565b61009e6100c13660046102c1565b5050505050505050565b60006100d789896101bd565b336000908152602081815260408083208884529091528120805492935090918290610101906103c6565b91829055509050818111156101695760405162461bcd60e51b815260206004820152602360248201527f4c696d6974656443616c6c73456e666f726365723a6c696d69742d657863656560448201526219195960ea1b60648201526084015b60405180910390fd5b604080518381526020810183905286916001600160a01b0386169133917f449da07f2c06c9d1a6b19d2454ffe749e8cf991d22f686e076a1a4844c5ff370910160405180910390a450505050505050505050565b6000602082146102215760405162461bcd60e51b815260206004820152602960248201527f4c696d6974656443616c6c73456e666f726365723a696e76616c69642d7465726044820152680dae65ad8cadccee8d60bb1b6064820152608401610160565b61022b82846103ed565b9392505050565b80356001600160a01b038116811461024957600080fd5b919050565b6000806040838503121561026157600080fd5b61026a83610232565b946020939093013593505050565b60008083601f84011261028a57600080fd5b50813567ffffffffffffffff8111156102a257600080fd5b6020830191508360208285010111156102ba57600080fd5b9250929050565b60008060008060008060008060c0898b0312156102dd57600080fd5b883567ffffffffffffffff808211156102f557600080fd5b6103018c838d01610278565b909a50985060208b013591508082111561031a57600080fd5b6103268c838d01610278565b909850965060408b013591508082111561033f57600080fd5b5089016060818c03121561035257600080fd5b93506060890135925061036760808a01610232565b915061037560a08a01610232565b90509295985092959890939650565b6000806020838503121561039757600080fd5b823567ffffffffffffffff8111156103ae57600080fd5b6103ba85828601610278565b90969095509350505050565b6000600182016103e657634e487b7160e01b600052601160045260246000fd5b5060010190565b8035602083101561040657600019602084900360031b1b165b9291505056fea2646970667358221220f78aa8066d472e78f2d898b70704f695cf682a9b2914539b1a5a83b1dd87e31064736f6c63430008170033", + "nonce": "0xb", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x72bba352961a47eee9e7c34e5b21e648d89faf6d39e414a642ee3b4c81ca3c20", + "transactionType": "CREATE2", + "contractName": "NonceEnforcer", + "contractAddress": "0x2f32ff3fc3086d7f63f16fe8d0065390d460b40d", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x68e23", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610457806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80632bd4ed211461005c5780639751a83d14610096578063b99deb0e146100ab578063de723eeb146100be578063f5743c4c146100d6575b600080fd5b61008461006a366004610266565b600060208181529281526040808220909352908152205481565b60405190815260200160405180910390f35b6100a96100a43660046102e2565b6100e9565b005b6100846100b93660046103a5565b610178565b6100a96100cc3660046102e2565b5050505050505050565b6100a96100e43660046103e7565b6101e6565b60006100f58989610178565b336000908152602081815260408083206001600160a01b0388168452909152902054909150811461016d5760405162461bcd60e51b815260206004820152601b60248201527f4e6f6e6365456e666f726365723a696e76616c69642d6e6f6e6365000000000060448201526064015b60405180910390fd5b505050505050505050565b6000602082146101d55760405162461bcd60e51b815260206004820152602260248201527f4e6f6e6365456e666f726365723a696e76616c69642d7465726d732d6c656e676044820152610e8d60f31b6064820152608401610164565b6101df8284610402565b9392505050565b6001600160a01b038116600081815260208181526040808320338085529083529281902080546001810190915590518181529093917fe02d340254c92bc3ad96f0fceb790db939e11c669c1f4c8a549d248f17130b33910160405180910390a35050565b80356001600160a01b038116811461026157600080fd5b919050565b6000806040838503121561027957600080fd5b6102828361024a565b91506102906020840161024a565b90509250929050565b60008083601f8401126102ab57600080fd5b50813567ffffffffffffffff8111156102c357600080fd5b6020830191508360208285010111156102db57600080fd5b9250929050565b60008060008060008060008060c0898b0312156102fe57600080fd5b883567ffffffffffffffff8082111561031657600080fd5b6103228c838d01610299565b909a50985060208b013591508082111561033b57600080fd5b6103478c838d01610299565b909850965060408b013591508082111561036057600080fd5b5089016060818c03121561037357600080fd5b93506060890135925061038860808a0161024a565b915061039660a08a0161024a565b90509295985092959890939650565b600080602083850312156103b857600080fd5b823567ffffffffffffffff8111156103cf57600080fd5b6103db85828601610299565b90969095509350505050565b6000602082840312156103f957600080fd5b6101df8261024a565b8035602083101561041b57600019602084900360031b1b165b9291505056fea2646970667358221220b8ac9ab0759f02df69d888b08c000fa4dfa4048ad7f88931687eeff439dd484a64736f6c63430008170033", + "nonce": "0xc", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x9fa13cdad18431ddf1297dc618e0dbad7ddb03e080f10b33beafccd00a918914", + "transactionType": "CREATE2", + "contractName": "TimestampEnforcer", + "contractAddress": "0x78e05f779490c24bf3bfa135b4112e7003b321cd", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x68cc4", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610455806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610092575b600080fd5b6100596100543660046102b7565b6100aa565b005b61006e61006936600461037a565b6101b2565b604080516001600160801b0393841681529290911660208301520160405180910390f35b6100596100a03660046102b7565b5050505050505050565b6000806100b78a8a6101b2565b90925090506001600160801b0382161561013357816001600160801b031642116101335760405162461bcd60e51b815260206004820152602260248201527f54696d657374616d70456e666f726365723a6561726c792d64656c656761746960448201526137b760f11b60648201526084015b60405180910390fd5b6001600160801b038116156101a657806001600160801b031642106101a65760405162461bcd60e51b8152602060048201526024808201527f54696d657374616d70456e666f726365723a657870697265642d64656c6567616044820152633a34b7b760e11b606482015260840161012a565b50505050505050505050565b600080602083146102145760405162461bcd60e51b815260206004820152602660248201527f54696d657374616d70456e666f726365723a696e76616c69642d7465726d732d6044820152650d8cadccee8d60d31b606482015260840161012a565b61022183601081876103bc565b61022a916103e6565b60801c905061023d6010600085876103bc565b610246916103e6565b60801c91509250929050565b60008083601f84011261026457600080fd5b50813567ffffffffffffffff81111561027c57600080fd5b60208301915083602082850101111561029457600080fd5b9250929050565b80356001600160a01b03811681146102b257600080fd5b919050565b60008060008060008060008060c0898b0312156102d357600080fd5b883567ffffffffffffffff808211156102eb57600080fd5b6102f78c838d01610252565b909a50985060208b013591508082111561031057600080fd5b61031c8c838d01610252565b909850965060408b013591508082111561033557600080fd5b5089016060818c03121561034857600080fd5b93506060890135925061035d60808a0161029b565b915061036b60a08a0161029b565b90509295985092959890939650565b6000806020838503121561038d57600080fd5b823567ffffffffffffffff8111156103a457600080fd5b6103b085828601610252565b90969095509350505050565b600080858511156103cc57600080fd5b838611156103d957600080fd5b5050820193919092039150565b6fffffffffffffffffffffffffffffffff1981358181169160108510156104175780818660100360031b1b83161692505b50509291505056fea2646970667358221220032d822c6d896afe6d14f1080a0918e2996d1c61fe51449e6ecf5841d50e5ea464736f6c63430008170033", + "nonce": "0xd", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xae82473a14d1c81c432e68ea25ac2fa3ad10993d6ac10ab1e6d938ffacbeceee", + "transactionType": "CREATE2", + "contractName": "ValueLteEnforcer", + "contractAddress": "0xfc20ede0a1132e839fbda9d7ed3904ff3c89540f", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x4e4e9", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061033a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610080575b600080fd5b6100596100543660046101e0565b610098565b005b61006e6100693660046102a3565b61010a565b60405190815260200160405180910390f35b61005961008e3660046101e0565b5050505050505050565b60006100a4898961010a565b905080856020013511156100ff5760405162461bcd60e51b815260206004820152601f60248201527f56616c75654c7465456e666f726365723a76616c75652d746f6f2d686967680060448201526064015b60405180910390fd5b505050505050505050565b60006020821461016a5760405162461bcd60e51b815260206004820152602560248201527f56616c75654c7465456e666f726365723a696e76616c69642d7465726d732d6c6044820152640cadccee8d60db1b60648201526084016100f6565b61017482846102e5565b9392505050565b60008083601f84011261018d57600080fd5b50813567ffffffffffffffff8111156101a557600080fd5b6020830191508360208285010111156101bd57600080fd5b9250929050565b80356001600160a01b03811681146101db57600080fd5b919050565b60008060008060008060008060c0898b0312156101fc57600080fd5b883567ffffffffffffffff8082111561021457600080fd5b6102208c838d0161017b565b909a50985060208b013591508082111561023957600080fd5b6102458c838d0161017b565b909850965060408b013591508082111561025e57600080fd5b5089016060818c03121561027157600080fd5b93506060890135925061028660808a016101c4565b915061029460a08a016101c4565b90509295985092959890939650565b600080602083850312156102b657600080fd5b823567ffffffffffffffff8111156102cd57600080fd5b6102d98582860161017b565b90969095509350505050565b803560208310156102fe57600019602084900360031b1b165b9291505056fea2646970667358221220cd4bcb89c90c60ef26b293e82752e5ff08228ce4ed86119c5597e63559710ece64736f6c63430008170033", + "nonce": "0xe", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0xaebf3a", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x0ef47d3bcd74141589644bf8cb1ddcb9c84754066dc021f0a0b13aae04adb684", + "transactionIndex": "0x1f", + "blockHash": "0x54b1a293cad019461925469504487488063e0c006b6f58dcd7d0c17a9fa7857c", + "blockNumber": "0x74b5fcc", + "gasUsed": "0x67c14", + "effectiveGasPrice": "0x39fa0c0", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x558", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xc5fc5", + "l1Fee": "0x1fd12a5f20", + "l1GasPrice": "0xcc5ab693", + "l1GasUsed": "0x71d0" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xb5b925", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x875059489c3274cead184256d6c5224b27943422f149efadb68aad8f84775859", + "transactionIndex": "0x20", + "blockHash": "0x54b1a293cad019461925469504487488063e0c006b6f58dcd7d0c17a9fa7857c", + "blockNumber": "0x74b5fcc", + "gasUsed": "0x6f9eb", + "effectiveGasPrice": "0x39fa0c0", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x558", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xc5fc5", + "l1Fee": "0x2257802f6d", + "l1GasPrice": "0xcc5ab693", + "l1GasUsed": "0x7ad8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xbca69b", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x0d24dc342624aa20ed8874892c2a353bb52338cccd65753974e46e2dfa271e4d", + "transactionIndex": "0x21", + "blockHash": "0x54b1a293cad019461925469504487488063e0c006b6f58dcd7d0c17a9fa7857c", + "blockNumber": "0x74b5fcc", + "gasUsed": "0x6ed76", + "effectiveGasPrice": "0x39fa0c0", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x558", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xc5fc5", + "l1Fee": "0x222889022c", + "l1GasPrice": "0xcc5ab693", + "l1GasUsed": "0x7a30" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc14a25", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xfa4e769814b486962e90944e3b1aff0295f9238c6daddac87ce390faa937b602", + "transactionIndex": "0x22", + "blockHash": "0x54b1a293cad019461925469504487488063e0c006b6f58dcd7d0c17a9fa7857c", + "blockNumber": "0x74b5fcc", + "gasUsed": "0x4a38a", + "effectiveGasPrice": "0x39fa0c0", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x558", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xc5fc5", + "l1Fee": "0x162b0086cf", + "l1GasPrice": "0xcc5ab693", + "l1GasUsed": "0x4f4c" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc5b493", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xb74b77ed77a813fa17a814042f42b6131f3c305453950d550f70f67284e0b0ad", + "transactionIndex": "0x23", + "blockHash": "0x54b1a293cad019461925469504487488063e0c006b6f58dcd7d0c17a9fa7857c", + "blockNumber": "0x74b5fcc", + "gasUsed": "0x46a6e", + "effectiveGasPrice": "0x39fa0c0", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x558", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xc5fc5", + "l1Fee": "0x151c64208a", + "l1GasPrice": "0xcc5ab693", + "l1GasUsed": "0x4b84" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xca304d", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x72bba352961a47eee9e7c34e5b21e648d89faf6d39e414a642ee3b4c81ca3c20", + "transactionIndex": "0x24", + "blockHash": "0x54b1a293cad019461925469504487488063e0c006b6f58dcd7d0c17a9fa7857c", + "blockNumber": "0x74b5fcc", + "gasUsed": "0x47bba", + "effectiveGasPrice": "0x39fa0c0", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x558", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xc5fc5", + "l1Fee": "0x155c214bab", + "l1GasPrice": "0xcc5ab693", + "l1GasUsed": "0x4c68" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xceab17", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x9fa13cdad18431ddf1297dc618e0dbad7ddb03e080f10b33beafccd00a918914", + "transactionIndex": "0x25", + "blockHash": "0x54b1a293cad019461925469504487488063e0c006b6f58dcd7d0c17a9fa7857c", + "blockNumber": "0x74b5fcc", + "gasUsed": "0x47aca", + "effectiveGasPrice": "0x39fa0c0", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x558", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xc5fc5", + "l1Fee": "0x1588dbf0ac", + "l1GasPrice": "0xcc5ab693", + "l1GasUsed": "0x4d08" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xd23663", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xae82473a14d1c81c432e68ea25ac2fa3ad10993d6ac10ab1e6d938ffacbeceee", + "transactionIndex": "0x26", + "blockHash": "0x54b1a293cad019461925469504487488063e0c006b6f58dcd7d0c17a9fa7857c", + "blockNumber": "0x74b5fcc", + "gasUsed": "0x38b4c", + "effectiveGasPrice": "0x39fa0c0", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x558", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xc5fc5", + "l1Fee": "0x109706b313", + "l1GasPrice": "0xcc5ab693", + "l1GasUsed": "0x3b58" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1720359255, + "chain": 10, + "commit": null +} \ No newline at end of file diff --git a/broadcast/DeployEnvironmentSetUp.s.sol/10/run-latest.json b/broadcast/DeployEnvironmentSetUp.s.sol/10/run-latest.json new file mode 100644 index 0000000..826d5fc --- /dev/null +++ b/broadcast/DeployEnvironmentSetUp.s.sol/10/run-latest.json @@ -0,0 +1,340 @@ +{ + "transactions": [ + { + "hash": "0x0ef47d3bcd74141589644bf8cb1ddcb9c84754066dc021f0a0b13aae04adb684", + "transactionType": "CREATE2", + "contractName": "DeployedEnforcer", + "contractAddress": "0x5accb9559b56a6c1e3f90e342c85c42d93720d43", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x8f463", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b506106b5806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063481286e6146100515780639751a83d14610081578063b99deb0e14610096578063de723eeb146100b8575b600080fd5b61006461005f366004610410565b6100d0565b6040516001600160a01b0390911681526020015b60405180910390f35b61009461008f366004610497565b6100e5565b005b6100a96100a436600461055a565b6101e4565b6040516100789392919061059c565b6100946100c6366004610497565b5050505050505050565b60006100dc82846102ca565b90505b92915050565b60008060006100f48b8b6101e4565b919450925090506001600160a01b0383163b1561014f576040516001600160a01b03841681527f641dafeb23238fae3ef71c64fced975da90c34dede63890507f3dda6b1e0dfef9060200160405180910390a15050506100c6565b600061015b82846102d7565b9050836001600160a01b0316816001600160a01b0316146101d65760405162461bcd60e51b815260206004820152602a60248201527f4465706c6f796564456e666f726365723a6465706c6f7965642d6164647265736044820152690e65adad2e6dac2e8c6d60b31b60648201526084015b60405180910390fd5b505050505050505050505050565b6000806060603484116102475760405162461bcd60e51b815260206004820152602560248201527f4465706c6f796564456e666f726365723a696e76616c69642d7465726d732d6c6044820152640cadccee8d60db1b60648201526084016101cd565b610255601460008688610602565b61025e9161062c565b60601c9250610271603460148688610602565b61027a91610661565b91506102898460348188610602565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509598949750919550929350505050565b60006100dc83833061035f565b60006102e560008385610389565b9050806001600160a01b03163b60000361031d576040516352c7cd4960e11b81526001600160a01b03821660048201526024016101cd565b6040516001600160a01b03821681527faf3c4b03f515b5a38f3c238fdc24abf10854a2f27f2a85743a71de17e9bc7e7f9060200160405180910390a192915050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6000834710156103b55760405163392efb2b60e21b8152476004820152602481018590526044016101cd565b81516000036103d757604051631328927760e21b815260040160405180910390fd5b8282516020840186f590506001600160a01b03811661040957604051633a0ba96160e11b815260040160405180910390fd5b9392505050565b6000806040838503121561042357600080fd5b50508035926020909101359150565b60008083601f84011261044457600080fd5b50813567ffffffffffffffff81111561045c57600080fd5b60208301915083602082850101111561047457600080fd5b9250929050565b80356001600160a01b038116811461049257600080fd5b919050565b60008060008060008060008060c0898b0312156104b357600080fd5b883567ffffffffffffffff808211156104cb57600080fd5b6104d78c838d01610432565b909a50985060208b01359150808211156104f057600080fd5b6104fc8c838d01610432565b909850965060408b013591508082111561051557600080fd5b5089016060818c03121561052857600080fd5b93506060890135925061053d60808a0161047b565b915061054b60a08a0161047b565b90509295985092959890939650565b6000806020838503121561056d57600080fd5b823567ffffffffffffffff81111561058457600080fd5b61059085828601610432565b90969095509350505050565b60018060a01b03841681526000602084602084015260606040840152835180606085015260005b818110156105df578581018301518582016080015282016105c3565b506000608082860101526080601f19601f83011685010192505050949350505050565b6000808585111561061257600080fd5b8386111561061f57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106595780818660140360031b1b83161692505b505092915050565b803560208310156100df57600019602084900360031b1b169291505056fea2646970667358221220adae6ada7a0e210e98db78555afd35a3b834fe39e89d1ae92e20b35e9cc9358664736f6c63430008170033", + "nonce": "0x7", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x875059489c3274cead184256d6c5224b27943422f149efadb68aad8f84775859", + "transactionType": "CREATE2", + "contractName": "ERC20BalanceGteEnforcer", + "contractAddress": "0xb5d6b1ec6d868a3bae5b7f48178eaa2686a7a087", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xa3337", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061074a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806332a16f4e146100675780638678d6ef1461009f5780639751a83d146100c0578063b5e54492146100d5578063b99deb0e146100f5578063de723eeb14610127575b600080fd5b61008a61007536600461049d565b60016020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100b26100ad3660046104d2565b61013a565b604051908152602001610096565b6100d36100ce366004610557565b61014f565b005b6100b26100e336600461049d565b60006020819052908152604090205481565b61010861010336600461061a565b610289565b604080516001600160a01b039093168352602083019190915201610096565b6100d3610135366004610557565b61032f565b600061014784848461045a565b949350505050565b600061015b8989610289565b509050600061016b33838761045a565b60008181526001602052604090205490915060ff16156101e55760405162461bcd60e51b815260206004820152602a60248201527f455243323042616c616e6365477465456e666f726365723a656e666f726365726044820152690b5a5ccb5b1bd8dad95960b21b60648201526084015b60405180910390fd5b6000818152600160208190526040808320805460ff1916909217909155516370a0823160e01b81526001600160a01b0386811660048301528416906370a0823190602401602060405180830381865afa158015610246573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026a919061065c565b6000928352602083905260409092209190915550505050505050505050565b600080603483146102f15760405162461bcd60e51b815260206004820152602c60248201527f455243323042616c616e6365477465456e666f726365723a696e76616c69642d60448201526b0e8cae4dae65ad8cadccee8d60a31b60648201526084016101dc565b6102ff601460008587610675565b6103089161069f565b60601c915061031a8360148187610675565b610323916106d4565b60001c90509250929050565b60008061033c8a8a610289565b91509150600061034d33848861045a565b600081815260016020526040808220805460ff19169055516370a0823160e01b81526001600160a01b03888116600483015292935090918516906370a0823190602401602060405180830381865afa1580156103ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d1919061065c565b6000838152602081905260409020549091506103ee9084906106f3565b81101561044c5760405162461bcd60e51b815260206004820152602660248201527f455243323042616c616e6365477465456e666f726365723a62616c616e63652d6044820152651b9bdd0b59dd60d21b60648201526084016101dc565b505050505050505050505050565b604080516001600160a01b039485166020808301919091529390941684820152606080850192909252805180850390920182526080909301909252815191012090565b6000602082840312156104af57600080fd5b5035919050565b80356001600160a01b03811681146104cd57600080fd5b919050565b6000806000606084860312156104e757600080fd5b6104f0846104b6565b92506104fe602085016104b6565b9150604084013590509250925092565b60008083601f84011261052057600080fd5b50813567ffffffffffffffff81111561053857600080fd5b60208301915083602082850101111561055057600080fd5b9250929050565b60008060008060008060008060c0898b03121561057357600080fd5b883567ffffffffffffffff8082111561058b57600080fd5b6105978c838d0161050e565b909a50985060208b01359150808211156105b057600080fd5b6105bc8c838d0161050e565b909850965060408b01359150808211156105d557600080fd5b5089016060818c0312156105e857600080fd5b9350606089013592506105fd60808a016104b6565b915061060b60a08a016104b6565b90509295985092959890939650565b6000806020838503121561062d57600080fd5b823567ffffffffffffffff81111561064457600080fd5b6106508582860161050e565b90969095509350505050565b60006020828403121561066e57600080fd5b5051919050565b6000808585111561068557600080fd5b8386111561069257600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106cc5780818660140360031b1b83161692505b505092915050565b803560208310156106ed57600019602084900360031b1b165b92915050565b808201808211156106ed57634e487b7160e01b600052601160045260246000fdfea2646970667358221220706a4bd5217d105228b49e7ecb48d785e4c5a4cbd88c1e0018e40907dafc0c9d64736f6c63430008170033", + "nonce": "0x8", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x0d24dc342624aa20ed8874892c2a353bb52338cccd65753974e46e2dfa271e4d", + "transactionType": "CREATE2", + "contractName": "ERC20TransferAmountEnforcer", + "contractAddress": "0x92ac423b9c111962179a6242e1adb58d02c103be", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x990f4", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061073b806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80639751a83d146100515780639dd5d9ab14610066578063b99deb0e146100a1578063de723eeb146100d3575b600080fd5b61006461005f366004610480565b6100eb565b005b61008e610074366004610543565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b6100b46100af36600461056d565b610383565b604080516001600160a01b039093168352602083019190915201610098565b6100646100e1366004610480565b5050505050505050565b6100f860408501856105af565b90506044146101565760405162461bcd60e51b815260206004820152603160248201526000805160206106e68339815191526044820152700d8d2c85ac2c6e8d2dedc5ad8cadccee8d607b1b60648201526084015b60405180910390fd5b6000806101638a8a610383565b9092509050600061017760208801886105f6565b905063a9059cbb60e01b6001600160a01b03848116908316146101df5760405162461bcd60e51b815260206004820152602c60248201526000805160206106e683398151915260448201526b1b1a590b58dbdb9d1c9858dd60a21b606482015260840161014d565b60006101ee60408a018a6105af565b6101fd91600491600091610618565b61020691610642565b90506001600160e01b0319808216908316146102655760405162461bcd60e51b815260206004820152602a60248201526000805160206106e68339815191526044820152691b1a590b5b595d1a1bd960b21b606482015260840161014d565b600061027460408b018b6105af565b61028391604491602491610618565b61028c91610672565b336000908152602081815260408083208d845290915281208054929350909183919083906102bb908490610691565b92505081905590508581111561032a5760405162461bcd60e51b815260206004820152602e60248201527f45524332305472616e73666572416d6f756e74456e666f726365723a616c6c6f60448201526d1dd85b98d94b595e18d95959195960921b606482015260840161014d565b60408051878152602081018390528b916001600160a01b038b169133917fc026e493323d526061a052b5dd562495120e2f648797a48be61966d3a6beec8d910160405180910390a4505050505050505050505050505050565b600080603483146103dd5760405162461bcd60e51b815260206004820152603060248201526000805160206106e683398151915260448201526f0d8d2c85ae8cae4dae65ad8cadccee8d60831b606482015260840161014d565b6103eb601460008587610618565b6103f4916106b2565b60601c91506104068360148187610618565b61040f91610672565b60001c90509250929050565b60008083601f84011261042d57600080fd5b50813567ffffffffffffffff81111561044557600080fd5b60208301915083602082850101111561045d57600080fd5b9250929050565b80356001600160a01b038116811461047b57600080fd5b919050565b60008060008060008060008060c0898b03121561049c57600080fd5b883567ffffffffffffffff808211156104b457600080fd5b6104c08c838d0161041b565b909a50985060208b01359150808211156104d957600080fd5b6104e58c838d0161041b565b909850965060408b01359150808211156104fe57600080fd5b5089016060818c03121561051157600080fd5b93506060890135925061052660808a01610464565b915061053460a08a01610464565b90509295985092959890939650565b6000806040838503121561055657600080fd5b61055f83610464565b946020939093013593505050565b6000806020838503121561058057600080fd5b823567ffffffffffffffff81111561059757600080fd5b6105a38582860161041b565b90969095509350505050565b6000808335601e198436030181126105c657600080fd5b83018035915067ffffffffffffffff8211156105e157600080fd5b60200191503681900382131561045d57600080fd5b60006020828403121561060857600080fd5b61061182610464565b9392505050565b6000808585111561062857600080fd5b8386111561063557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561066a5780818660040360031b1b83161692505b505092915050565b8035602083101561068b57600019602084900360031b1b165b92915050565b8082018082111561068b57634e487b7160e01b600052601160045260246000fd5b6bffffffffffffffffffffffff19813581811691601485101561066a5760149490940360031b84901b169092169291505056fe45524332305472616e73666572416d6f756e74456e666f726365723a696e7661a2646970667358221220bbaa47e7ff7ca5d260ee2e4ae44f60d5ed447ee0a25335e020538968f33cc37d64736f6c63430008170033", + "nonce": "0x9", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xfa4e769814b486962e90944e3b1aff0295f9238c6daddac87ce390faa937b602", + "transactionType": "CREATE2", + "contractName": "IdEnforcer", + "contractAddress": "0x34152d9f3f8f74338d50703e780389e829b4abac", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x667df", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610486806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063595dce48146100515780639751a83d14610079578063b99deb0e1461008e578063de723eeb146100af575b600080fd5b61006461005f3660046102a8565b6100c7565b60405190151581526020015b60405180910390f35b61008c61008736600461032d565b6100fe565b005b6100a161009c3660046103f0565b610204565b604051908152602001610070565b61008c6100bd36600461032d565b5050505050505050565b6001600160a01b0380841660009081526020818152604080832093861683529290529081206100f69083610267565b949350505050565b600061010a8989610204565b90506101173384836100c7565b156101695760405162461bcd60e51b815260206004820152601a60248201527f4964456e666f726365723a69642d616c72656164792d7573656400000000000060448201526064015b60405180910390fd5b336000908152602081815260408083206001600160a01b03871684528252808320600885901c845290915290208054600160ff84161b179055826001600160a01b0316826001600160a01b0316336001600160a01b03167f6286af1aaf28b34723a53056e5608eabb40c823d1ce093ff371cf08c502431d6846040516101f191815260200190565b60405180910390a4505050505050505050565b6000602082146102565760405162461bcd60e51b815260206004820152601f60248201527f4964456e666f726365723a696e76616c69642d7465726d732d6c656e677468006044820152606401610160565b6102608284610432565b9392505050565b600881901c600090815260208390526040902054600160ff83161b1615155b92915050565b80356001600160a01b03811681146102a357600080fd5b919050565b6000806000606084860312156102bd57600080fd5b6102c68461028c565b92506102d46020850161028c565b9150604084013590509250925092565b60008083601f8401126102f657600080fd5b50813567ffffffffffffffff81111561030e57600080fd5b60208301915083602082850101111561032657600080fd5b9250929050565b60008060008060008060008060c0898b03121561034957600080fd5b883567ffffffffffffffff8082111561036157600080fd5b61036d8c838d016102e4565b909a50985060208b013591508082111561038657600080fd5b6103928c838d016102e4565b909850965060408b01359150808211156103ab57600080fd5b5089016060818c0312156103be57600080fd5b9350606089013592506103d360808a0161028c565b91506103e160a08a0161028c565b90509295985092959890939650565b6000806020838503121561040357600080fd5b823567ffffffffffffffff81111561041a57600080fd5b610426858286016102e4565b90969095509350505050565b8035602083101561028657600019602084900360031b1b169291505056fea264697066735822122028074431512be4166d9bc04a0557354e43d233df6620f59dcf4e6fea83a3a51f64736f6c63430008170033", + "nonce": "0xa", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb74b77ed77a813fa17a814042f42b6131f3c305453950d550f70f67284e0b0ad", + "transactionType": "CREATE2", + "contractName": "LimitedCallsEnforcer", + "contractAddress": "0x4b3adad4a328bee8ba17b86074d92fe7372180cd", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x61904", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610442806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806319054d89146100515780639751a83d1461008b578063b99deb0e146100a0578063de723eeb146100b3575b600080fd5b61007961005f36600461024e565b600060208181529281526040808220909352908152205481565b60405190815260200160405180910390f35b61009e6100993660046102c1565b6100cb565b005b6100796100ae366004610384565b6101bd565b61009e6100c13660046102c1565b5050505050505050565b60006100d789896101bd565b336000908152602081815260408083208884529091528120805492935090918290610101906103c6565b91829055509050818111156101695760405162461bcd60e51b815260206004820152602360248201527f4c696d6974656443616c6c73456e666f726365723a6c696d69742d657863656560448201526219195960ea1b60648201526084015b60405180910390fd5b604080518381526020810183905286916001600160a01b0386169133917f449da07f2c06c9d1a6b19d2454ffe749e8cf991d22f686e076a1a4844c5ff370910160405180910390a450505050505050505050565b6000602082146102215760405162461bcd60e51b815260206004820152602960248201527f4c696d6974656443616c6c73456e666f726365723a696e76616c69642d7465726044820152680dae65ad8cadccee8d60bb1b6064820152608401610160565b61022b82846103ed565b9392505050565b80356001600160a01b038116811461024957600080fd5b919050565b6000806040838503121561026157600080fd5b61026a83610232565b946020939093013593505050565b60008083601f84011261028a57600080fd5b50813567ffffffffffffffff8111156102a257600080fd5b6020830191508360208285010111156102ba57600080fd5b9250929050565b60008060008060008060008060c0898b0312156102dd57600080fd5b883567ffffffffffffffff808211156102f557600080fd5b6103018c838d01610278565b909a50985060208b013591508082111561031a57600080fd5b6103268c838d01610278565b909850965060408b013591508082111561033f57600080fd5b5089016060818c03121561035257600080fd5b93506060890135925061036760808a01610232565b915061037560a08a01610232565b90509295985092959890939650565b6000806020838503121561039757600080fd5b823567ffffffffffffffff8111156103ae57600080fd5b6103ba85828601610278565b90969095509350505050565b6000600182016103e657634e487b7160e01b600052601160045260246000fd5b5060010190565b8035602083101561040657600019602084900360031b1b165b9291505056fea2646970667358221220f78aa8066d472e78f2d898b70704f695cf682a9b2914539b1a5a83b1dd87e31064736f6c63430008170033", + "nonce": "0xb", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x72bba352961a47eee9e7c34e5b21e648d89faf6d39e414a642ee3b4c81ca3c20", + "transactionType": "CREATE2", + "contractName": "NonceEnforcer", + "contractAddress": "0x2f32ff3fc3086d7f63f16fe8d0065390d460b40d", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x68e23", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610457806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80632bd4ed211461005c5780639751a83d14610096578063b99deb0e146100ab578063de723eeb146100be578063f5743c4c146100d6575b600080fd5b61008461006a366004610266565b600060208181529281526040808220909352908152205481565b60405190815260200160405180910390f35b6100a96100a43660046102e2565b6100e9565b005b6100846100b93660046103a5565b610178565b6100a96100cc3660046102e2565b5050505050505050565b6100a96100e43660046103e7565b6101e6565b60006100f58989610178565b336000908152602081815260408083206001600160a01b0388168452909152902054909150811461016d5760405162461bcd60e51b815260206004820152601b60248201527f4e6f6e6365456e666f726365723a696e76616c69642d6e6f6e6365000000000060448201526064015b60405180910390fd5b505050505050505050565b6000602082146101d55760405162461bcd60e51b815260206004820152602260248201527f4e6f6e6365456e666f726365723a696e76616c69642d7465726d732d6c656e676044820152610e8d60f31b6064820152608401610164565b6101df8284610402565b9392505050565b6001600160a01b038116600081815260208181526040808320338085529083529281902080546001810190915590518181529093917fe02d340254c92bc3ad96f0fceb790db939e11c669c1f4c8a549d248f17130b33910160405180910390a35050565b80356001600160a01b038116811461026157600080fd5b919050565b6000806040838503121561027957600080fd5b6102828361024a565b91506102906020840161024a565b90509250929050565b60008083601f8401126102ab57600080fd5b50813567ffffffffffffffff8111156102c357600080fd5b6020830191508360208285010111156102db57600080fd5b9250929050565b60008060008060008060008060c0898b0312156102fe57600080fd5b883567ffffffffffffffff8082111561031657600080fd5b6103228c838d01610299565b909a50985060208b013591508082111561033b57600080fd5b6103478c838d01610299565b909850965060408b013591508082111561036057600080fd5b5089016060818c03121561037357600080fd5b93506060890135925061038860808a0161024a565b915061039660a08a0161024a565b90509295985092959890939650565b600080602083850312156103b857600080fd5b823567ffffffffffffffff8111156103cf57600080fd5b6103db85828601610299565b90969095509350505050565b6000602082840312156103f957600080fd5b6101df8261024a565b8035602083101561041b57600019602084900360031b1b165b9291505056fea2646970667358221220b8ac9ab0759f02df69d888b08c000fa4dfa4048ad7f88931687eeff439dd484a64736f6c63430008170033", + "nonce": "0xc", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x9fa13cdad18431ddf1297dc618e0dbad7ddb03e080f10b33beafccd00a918914", + "transactionType": "CREATE2", + "contractName": "TimestampEnforcer", + "contractAddress": "0x78e05f779490c24bf3bfa135b4112e7003b321cd", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x68cc4", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610455806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610092575b600080fd5b6100596100543660046102b7565b6100aa565b005b61006e61006936600461037a565b6101b2565b604080516001600160801b0393841681529290911660208301520160405180910390f35b6100596100a03660046102b7565b5050505050505050565b6000806100b78a8a6101b2565b90925090506001600160801b0382161561013357816001600160801b031642116101335760405162461bcd60e51b815260206004820152602260248201527f54696d657374616d70456e666f726365723a6561726c792d64656c656761746960448201526137b760f11b60648201526084015b60405180910390fd5b6001600160801b038116156101a657806001600160801b031642106101a65760405162461bcd60e51b8152602060048201526024808201527f54696d657374616d70456e666f726365723a657870697265642d64656c6567616044820152633a34b7b760e11b606482015260840161012a565b50505050505050505050565b600080602083146102145760405162461bcd60e51b815260206004820152602660248201527f54696d657374616d70456e666f726365723a696e76616c69642d7465726d732d6044820152650d8cadccee8d60d31b606482015260840161012a565b61022183601081876103bc565b61022a916103e6565b60801c905061023d6010600085876103bc565b610246916103e6565b60801c91509250929050565b60008083601f84011261026457600080fd5b50813567ffffffffffffffff81111561027c57600080fd5b60208301915083602082850101111561029457600080fd5b9250929050565b80356001600160a01b03811681146102b257600080fd5b919050565b60008060008060008060008060c0898b0312156102d357600080fd5b883567ffffffffffffffff808211156102eb57600080fd5b6102f78c838d01610252565b909a50985060208b013591508082111561031057600080fd5b61031c8c838d01610252565b909850965060408b013591508082111561033557600080fd5b5089016060818c03121561034857600080fd5b93506060890135925061035d60808a0161029b565b915061036b60a08a0161029b565b90509295985092959890939650565b6000806020838503121561038d57600080fd5b823567ffffffffffffffff8111156103a457600080fd5b6103b085828601610252565b90969095509350505050565b600080858511156103cc57600080fd5b838611156103d957600080fd5b5050820193919092039150565b6fffffffffffffffffffffffffffffffff1981358181169160108510156104175780818660100360031b1b83161692505b50509291505056fea2646970667358221220032d822c6d896afe6d14f1080a0918e2996d1c61fe51449e6ecf5841d50e5ea464736f6c63430008170033", + "nonce": "0xd", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xae82473a14d1c81c432e68ea25ac2fa3ad10993d6ac10ab1e6d938ffacbeceee", + "transactionType": "CREATE2", + "contractName": "ValueLteEnforcer", + "contractAddress": "0xfc20ede0a1132e839fbda9d7ed3904ff3c89540f", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x4e4e9", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061033a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610080575b600080fd5b6100596100543660046101e0565b610098565b005b61006e6100693660046102a3565b61010a565b60405190815260200160405180910390f35b61005961008e3660046101e0565b5050505050505050565b60006100a4898961010a565b905080856020013511156100ff5760405162461bcd60e51b815260206004820152601f60248201527f56616c75654c7465456e666f726365723a76616c75652d746f6f2d686967680060448201526064015b60405180910390fd5b505050505050505050565b60006020821461016a5760405162461bcd60e51b815260206004820152602560248201527f56616c75654c7465456e666f726365723a696e76616c69642d7465726d732d6c6044820152640cadccee8d60db1b60648201526084016100f6565b61017482846102e5565b9392505050565b60008083601f84011261018d57600080fd5b50813567ffffffffffffffff8111156101a557600080fd5b6020830191508360208285010111156101bd57600080fd5b9250929050565b80356001600160a01b03811681146101db57600080fd5b919050565b60008060008060008060008060c0898b0312156101fc57600080fd5b883567ffffffffffffffff8082111561021457600080fd5b6102208c838d0161017b565b909a50985060208b013591508082111561023957600080fd5b6102458c838d0161017b565b909850965060408b013591508082111561025e57600080fd5b5089016060818c03121561027157600080fd5b93506060890135925061028660808a016101c4565b915061029460a08a016101c4565b90509295985092959890939650565b600080602083850312156102b657600080fd5b823567ffffffffffffffff8111156102cd57600080fd5b6102d98582860161017b565b90969095509350505050565b803560208310156102fe57600019602084900360031b1b165b9291505056fea2646970667358221220cd4bcb89c90c60ef26b293e82752e5ff08228ce4ed86119c5597e63559710ece64736f6c63430008170033", + "nonce": "0xe", + "chainId": "0xa" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0xaebf3a", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x0ef47d3bcd74141589644bf8cb1ddcb9c84754066dc021f0a0b13aae04adb684", + "transactionIndex": "0x1f", + "blockHash": "0x54b1a293cad019461925469504487488063e0c006b6f58dcd7d0c17a9fa7857c", + "blockNumber": "0x74b5fcc", + "gasUsed": "0x67c14", + "effectiveGasPrice": "0x39fa0c0", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x558", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xc5fc5", + "l1Fee": "0x1fd12a5f20", + "l1GasPrice": "0xcc5ab693", + "l1GasUsed": "0x71d0" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xb5b925", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x875059489c3274cead184256d6c5224b27943422f149efadb68aad8f84775859", + "transactionIndex": "0x20", + "blockHash": "0x54b1a293cad019461925469504487488063e0c006b6f58dcd7d0c17a9fa7857c", + "blockNumber": "0x74b5fcc", + "gasUsed": "0x6f9eb", + "effectiveGasPrice": "0x39fa0c0", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x558", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xc5fc5", + "l1Fee": "0x2257802f6d", + "l1GasPrice": "0xcc5ab693", + "l1GasUsed": "0x7ad8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xbca69b", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x0d24dc342624aa20ed8874892c2a353bb52338cccd65753974e46e2dfa271e4d", + "transactionIndex": "0x21", + "blockHash": "0x54b1a293cad019461925469504487488063e0c006b6f58dcd7d0c17a9fa7857c", + "blockNumber": "0x74b5fcc", + "gasUsed": "0x6ed76", + "effectiveGasPrice": "0x39fa0c0", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x558", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xc5fc5", + "l1Fee": "0x222889022c", + "l1GasPrice": "0xcc5ab693", + "l1GasUsed": "0x7a30" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc14a25", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xfa4e769814b486962e90944e3b1aff0295f9238c6daddac87ce390faa937b602", + "transactionIndex": "0x22", + "blockHash": "0x54b1a293cad019461925469504487488063e0c006b6f58dcd7d0c17a9fa7857c", + "blockNumber": "0x74b5fcc", + "gasUsed": "0x4a38a", + "effectiveGasPrice": "0x39fa0c0", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x558", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xc5fc5", + "l1Fee": "0x162b0086cf", + "l1GasPrice": "0xcc5ab693", + "l1GasUsed": "0x4f4c" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc5b493", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xb74b77ed77a813fa17a814042f42b6131f3c305453950d550f70f67284e0b0ad", + "transactionIndex": "0x23", + "blockHash": "0x54b1a293cad019461925469504487488063e0c006b6f58dcd7d0c17a9fa7857c", + "blockNumber": "0x74b5fcc", + "gasUsed": "0x46a6e", + "effectiveGasPrice": "0x39fa0c0", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x558", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xc5fc5", + "l1Fee": "0x151c64208a", + "l1GasPrice": "0xcc5ab693", + "l1GasUsed": "0x4b84" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xca304d", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x72bba352961a47eee9e7c34e5b21e648d89faf6d39e414a642ee3b4c81ca3c20", + "transactionIndex": "0x24", + "blockHash": "0x54b1a293cad019461925469504487488063e0c006b6f58dcd7d0c17a9fa7857c", + "blockNumber": "0x74b5fcc", + "gasUsed": "0x47bba", + "effectiveGasPrice": "0x39fa0c0", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x558", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xc5fc5", + "l1Fee": "0x155c214bab", + "l1GasPrice": "0xcc5ab693", + "l1GasUsed": "0x4c68" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xceab17", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x9fa13cdad18431ddf1297dc618e0dbad7ddb03e080f10b33beafccd00a918914", + "transactionIndex": "0x25", + "blockHash": "0x54b1a293cad019461925469504487488063e0c006b6f58dcd7d0c17a9fa7857c", + "blockNumber": "0x74b5fcc", + "gasUsed": "0x47aca", + "effectiveGasPrice": "0x39fa0c0", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x558", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xc5fc5", + "l1Fee": "0x1588dbf0ac", + "l1GasPrice": "0xcc5ab693", + "l1GasUsed": "0x4d08" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xd23663", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xae82473a14d1c81c432e68ea25ac2fa3ad10993d6ac10ab1e6d938ffacbeceee", + "transactionIndex": "0x26", + "blockHash": "0x54b1a293cad019461925469504487488063e0c006b6f58dcd7d0c17a9fa7857c", + "blockNumber": "0x74b5fcc", + "gasUsed": "0x38b4c", + "effectiveGasPrice": "0x39fa0c0", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x558", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xc5fc5", + "l1Fee": "0x109706b313", + "l1GasPrice": "0xcc5ab693", + "l1GasUsed": "0x3b58" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1720359255, + "chain": 10, + "commit": null +} \ No newline at end of file diff --git a/broadcast/DeployEnvironmentSetUp.s.sol/137/run-1720358722.json b/broadcast/DeployEnvironmentSetUp.s.sol/137/run-1720358722.json new file mode 100644 index 0000000..ad4498c --- /dev/null +++ b/broadcast/DeployEnvironmentSetUp.s.sol/137/run-1720358722.json @@ -0,0 +1,925 @@ +{ + "transactions": [ + { + "hash": "0xcb39ffe893b9ca1f1c9312c7b2fa2bc55fe118890468834d809012d2bcb4dafd", + "transactionType": "CREATE2", + "contractName": "DelegationManager", + "contractAddress": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "function": null, + "arguments": [ + "0xB0403B32f54d0Bd752113f4009e8B534C6669f44" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x2e52b2", + "value": "0x0", + "input": "0x44656c654761746f7200000000000000000000000000000000000000000000006101606040523480156200001257600080fd5b50604051620029e7380380620029e7833981016040819052620000359162000384565b60408051808201825260118152702232b632b3b0ba34b7b726b0b730b3b2b960791b602080830191909152825180840190935260018352603160f81b9083015290826001600160a01b038116620000a757604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b620000b28162000204565b506001805460ff60a01b19169055620000cd82600262000222565b61012052620000de81600362000222565b61014052815160208084019190912060e052815190820120610100524660a0526200015b60e0516101005160408051600080516020620029c783398151915260208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526000620001706200025b565b9050306001600160a01b0316817f04a46d9007577c7ff1e513b900545162ec25d25991ae3dc60cf26ec01a84806d604051806040016040528060118152602001702232b632b3b0ba34b7b726b0b730b3b2b960791b815250604051806040016040528060018152602001603160f81b81525046604051620001f493929190620003fe565b60405180910390a35050620005e5565b600180546001600160a01b03191690556200021f81620002f1565b50565b600060208351101562000242576200023a8362000341565b905062000255565b816200024f8482620004df565b5060ff90505b92915050565b600060c0516001600160a01b0316306001600160a01b031614801562000282575060a05146145b156200028f575060805190565b620002ec60e0516101005160408051600080516020620029c783398151915260208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b905090565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080829050601f815111156200036f578260405163305a27a960e01b81526004016200009e9190620005ab565b80516200037c82620005c0565b179392505050565b6000602082840312156200039757600080fd5b81516001600160a01b0381168114620003af57600080fd5b9392505050565b6000815180845260005b81811015620003de57602081850181015186830182015201620003c0565b506000602082860101526020601f19601f83011685010191505092915050565b606081526000620004136060830186620003b6565b8281036020840152620004278186620003b6565b915050826040830152949350505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200046357607f821691505b6020821081036200048457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004da576000816000526020600020601f850160051c81016020861015620004b55750805b601f850160051c820191505b81811015620004d657828155600101620004c1565b5050505b505050565b81516001600160401b03811115620004fb57620004fb62000438565b62000513816200050c84546200044e565b846200048a565b602080601f8311600181146200054b5760008415620005325750858301515b600019600386901b1c1916600185901b178555620004d6565b600085815260208120601f198616915b828110156200057c578886015182559484019460019091019084016200055b565b50858210156200059b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602081526000620003af6020830184620003b6565b80516020808301519190811015620004845760001960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516123876200064060003960006113bb0152600061138e015260006112f3015260006112cb01526000611226015260006112500152600061127a01526123876000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80637fade287116100b8578063a3f4df7e1161007c578063a3f4df7e1461028e578063acb8cc49146102cb578063e1520f54146102eb578063e30c3978146102fe578063f2fde38b1461030f578063ffa1ad741461032257600080fd5b80637fade2871461023f57806383ebb771146102525780638456cb591461025a57806384b0196e146102625780638da5cb5b1461027d57600080fd5b806358909ebc1161010a57806358909ebc146101c65780635c975abb146101e75780635daa6539146101f9578063661346071461021c578063715018a61461022f57806379ba50971461023757600080fd5b80631b13cac2146101475780632d40d052146101635780633ed01015146101965780633f4ba83a146101ab57806349934047146101b3575b600080fd5b61015060001981565b6040519081526020015b60405180910390f35b6101866101713660046118c7565b60056020526000908152604090205460ff1681565b604051901515815260200161015a565b6101a96101a43660046118e0565b610346565b005b6101a9610440565b6101a96101c13660046118e0565b610452565b6101cf610a1181565b6040516001600160a01b03909116815260200161015a565b600154600160a01b900460ff16610186565b6101866102073660046118c7565b60046020526000908152604090205460ff1681565b61015061022a3660046118e0565b610542565b6101a961055b565b6101a961056d565b6101a961024d3660046118e0565b6105b6565b6101506106a7565b6101a96106b6565b61026a6106c6565b60405161015a9796959493929190611967565b6000546001600160a01b03166101cf565b6102be604051806040016040528060118152602001702232b632b3b0ba34b7b726b0b730b3b2b960791b81525081565b60405161015a9190611a00565b6102be604051806040016040528060018152602001603160f81b81525081565b6101a96102f9366004611a13565b61070c565b6001546001600160a01b03166101cf565b6101a961031d366004611ac9565b611072565b6102be604051806040016040528060058152602001640312e302e360dc1b81525081565b6103566040820160208301611ac9565b6001600160a01b038116331461037f5760405163b9f0f17160e01b815260040160405180910390fd5b600061038a83610542565b60008181526005602052604090205490915060ff166103bc57604051637952fbad60e11b815260040160405180910390fd5b6000818152600560209081526040909120805460ff191690556103e190840184611ac9565b6001600160a01b03166103fa6040850160208601611ac9565b6001600160a01b0316827f3feadce88fc1b49db633a56fd5307ed6ee18734df83bcc4011daa720c9cd95f1866040516104339190611c18565b60405180910390a4505050565b6104486110e3565b610450611110565b565b6104626040820160208301611ac9565b6001600160a01b038116331461048b5760405163b9f0f17160e01b815260040160405180910390fd5b600061049683610542565b60008181526005602052604090205490915060ff16156104c857604051625ecddb60e01b815260040160405180910390fd5b6000818152600560209081526040909120805460ff191660011790556104f090840184611ac9565b6001600160a01b03166105096040850160208601611ac9565b6001600160a01b0316827fea589ba9473ee1fe77d352c7ed919747715a5d22931b972de9b02a907c66d5dd866040516104339190611c18565b600061055561055083611fae565b611165565b92915050565b6105636110e3565b6104506000611200565b60015433906001600160a01b031681146105aa5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b6105b381611200565b50565b6105c66040820160208301611ac9565b6001600160a01b03811633146105ef5760405163b9f0f17160e01b815260040160405180910390fd5b60006105fa83610542565b60008181526004602052604090205490915060ff161561062d5760405163119b4fd360e11b815260040160405180910390fd5b6000818152600460209081526040909120805460ff1916600117905561065590840184611ac9565b6001600160a01b031661066e6040850160208601611ac9565b6001600160a01b0316827fb9b56ecd70a93a7fcb54a1072d6a9c7ff488f46d6c656bb0a0fa453924658704866040516104339190611c18565b60006106b1611219565b905090565b6106be6110e3565b610450611344565b6000606080600080600060606106da611387565b6106e26113b4565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6107146113e1565b600061072283850185611fba565b905080516000036107465760405163efe957cf60e01b815260040160405180910390fd5b600081516001600160401b0381111561076157610761611ce9565b60405190808252806020026020018201604052801561078a578160200160208202803683370190505b5090506107db6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600080191681526020016060815260200160008152602001606081525090565b336001600160a01b0316836000815181106107f8576107f861206a565b6020026020010151600001516001600160a01b03161415801561084d5750610a116001600160a01b0316836000815181106108355761083561206a565b6020026020010151600001516001600160a01b031614155b1561086b57604051632d618d8160e21b815260040160405180910390fd5b60005b8351811015610a98578381815181106108895761088961206a565b6020026020010151915061089c82611165565b8382815181106108ae576108ae61206a565b6020026020010181815250508160a001515160000361091d57600460008483815181106108dd576108dd61206a565b60209081029190910181015182528101919091526040016000205460ff166109185760405163a9e649e960e01b815260040160405180910390fd5b610a90565b60208201516001600160a01b0381163b6000036109c157600061098761097d6109446106a7565b8786815181106109565761095661206a565b602002602001015160405161190160f01b8152600281019290925260228201526042902090565b8560a0015161140c565b9050816001600160a01b0316816001600160a01b0316146109bb57604051638baa579f60e01b815260040160405180910390fd5b50610a8e565b60006109e06109ce6106a7565b8685815181106109565761095661206a565b60a0850151604051630b135d3f60e11b81529192506000916001600160a01b03851691631626ba7e91610a17918691600401612080565b602060405180830381865afa158015610a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5891906120a1565b6001600160e01b0319169050630b135d3f60e11b8114610a8b57604051638baa579f60e01b815260040160405180910390fd5b50505b505b60010161086e565b5060005b8351811015610c585760056000848381518110610abb57610abb61206a565b60209081029190910181015182528101919091526040016000205460ff1615610af7576040516302dd502960e11b815260040160405180910390fd5b60018451610b0591906120e1565b8114610c0e5782610b178260016120f4565b81518110610b2757610b2761206a565b6020026020010151848281518110610b4157610b4161206a565b60200260200101516040015114610b6b57604051636f6a1b8760e11b815260040160405180910390fd5b600084610b798360016120f4565b81518110610b8957610b8961206a565b6020026020010151600001519050610a116001600160a01b0316816001600160a01b031614158015610bea5750806001600160a01b0316858381518110610bd257610bd261206a565b6020026020010151602001516001600160a01b031614155b15610c0857604051632d618d8160e21b815260040160405180910390fd5b50610c50565b60001960001b848281518110610c2657610c2661206a565b60200260200101516040015114610c5057604051636f6a1b8760e11b815260040160405180910390fd5b600101610a9c565b5060005b8351811015610db8576000848281518110610c7957610c7961206a565b60200260200101516060015190506000848381518110610c9b57610c9b61206a565b602002602001015190506000868481518110610cb957610cb961206a565b602002602001015160200151905060008351905060005b81811015610da8576000858281518110610cec57610cec61206a565b6020026020010151600001519050806001600160a01b0316639751a83d878481518110610d1b57610d1b61206a565b602002602001015160200151888581518110610d3957610d3961206a565b6020026020010151604001518e8989336040518763ffffffff1660e01b8152600401610d6a96959493929190612152565b600060405180830381600087803b158015610d8457600080fd5b505af1158015610d98573d6000803e3d6000fd5b5050505050806001019050610cd0565b5050505050806001019050610c5c565b508260018451610dc891906120e1565b81518110610dd857610dd861206a565b6020026020010151602001516001600160a01b03166326f0aef7856040518263ffffffff1660e01b8152600401610e0f91906121b4565b600060405180830381600087803b158015610e2957600080fd5b505af1158015610e3d573d6000803e3d6000fd5b505084519150505b8015610fc657600084610e596001846120e1565b81518110610e6957610e6961206a565b6020026020010151606001519050600084600184610e8791906120e1565b81518110610e9757610e9761206a565b60200260200101519050600086600185610eb191906120e1565b81518110610ec157610ec161206a565b602002602001015160200151905060008351905060005b81811015610fb0576000858281518110610ef457610ef461206a565b6020026020010151600001519050806001600160a01b031663de723eeb878481518110610f2357610f2361206a565b602002602001015160200151888581518110610f4157610f4161206a565b6020026020010151604001518e8989336040518763ffffffff1660e01b8152600401610f7296959493929190612152565b600060405180830381600087803b158015610f8c57600080fd5b505af1158015610fa0573d6000803e3d6000fd5b5050505050806001019050610ed8565b505050505080610fbf906121c7565b9050610e45565b5060005b835181101561106957336001600160a01b03168460018651610fec91906120e1565b81518110610ffc57610ffc61206a565b6020026020010151602001516001600160a01b03167f40dadaa36c6c2e3d7317e24757451ffb2d603d875f0ad5e92c5dd156573b18738684815181106110445761104461206a565b602002602001015160405161105991906121de565b60405180910390a3600101610fca565b50505050505050565b61107a6110e3565b600180546001600160a01b0383166001600160a01b031990911681179091556110ab6000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000546001600160a01b031633146104505760405163118cdaa760e01b81523360048201526024016105a1565b611118611436565b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000807f88c1d2ecf185adf710588203a5f263f0ff61be0d33da39792cde19ba9aa4331e8360000151846020015185604001516111a58760600151611460565b6080808901516040805160208101989098526001600160a01b03968716908801529490931660608601529184015260a083015260c082015260e0015b60408051601f1981840301815291905280516020909101209392505050565b600180546001600160a01b03191690556105b38161152b565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561127257507f000000000000000000000000000000000000000000000000000000000000000046145b1561129c57507f000000000000000000000000000000000000000000000000000000000000000090565b6106b1604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b61134c6113e1565b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586111483390565b60606106b17f0000000000000000000000000000000000000000000000000000000000000000600261157b565b60606106b17f0000000000000000000000000000000000000000000000000000000000000000600361157b565b600154600160a01b900460ff16156104505760405163d93c066560e01b815260040160405180910390fd5b60008060008061141c8686611626565b92509250925061142c8282611673565b5090949350505050565b600154600160a01b900460ff1661045057604051638dfc202b60e01b815260040160405180910390fd5b60008082516001600160401b0381111561147c5761147c611ce9565b6040519080825280602002602001820160405280156114a5578160200160208202803683370190505b50905060005b83518110156114fb576114d68482815181106114c9576114c961206a565b6020026020010151611730565b8282815181106114e8576114e861206a565b60209081029190910101526001016114ab565b508060405160200161150d91906122cb565b60405160208183030381529060405280519060200120915050919050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606060ff83146115955761158e83611791565b9050610555565b8180546115a190612301565b80601f01602080910402602001604051908101604052809291908181526020018280546115cd90612301565b801561161a5780601f106115ef5761010080835404028352916020019161161a565b820191906000526020600020905b8154815290600101906020018083116115fd57829003601f168201915b50505050509050610555565b600080600083516041036116605760208401516040850151606086015160001a611652888285856117d0565b95509550955050505061166c565b50508151600091506002905b9250925092565b60008260038111156116875761168761233b565b03611690575050565b60018260038111156116a4576116a461233b565b036116c25760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156116d6576116d661233b565b036116f75760405163fce698f760e01b8152600481018290526024016105a1565b600382600381111561170b5761170b61233b565b0361172c576040516335e2f38360e21b8152600481018290526024016105a1565b5050565b6000807f80ad7e1b04ee6d994a125f4714ca0720908bd80ed16063ec8aee4b88e9253e2d83600001518460200151805190602001206040516020016111e1939291909283526001600160a01b03919091166020830152604082015260600190565b6060600061179e8361189f565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561180b5750600091506003905082611895565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561185f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661188b57506000925060019150829050611895565b9250600091508190505b9450945094915050565b600060ff8216601f81111561055557604051632cd44ac360e21b815260040160405180910390fd5b6000602082840312156118d957600080fd5b5035919050565b6000602082840312156118f257600080fd5b81356001600160401b0381111561190857600080fd5b820160c0818503121561191a57600080fd5b9392505050565b6000815180845260005b818110156119475760208185018101518683018201520161192b565b506000602082860101526020601f19601f83011685010191505092915050565b60ff60f81b881681526000602060e0602084015261198860e084018a611921565b838103604085015261199a818a611921565b606085018990526001600160a01b038816608086015260a0850187905284810360c08601528551808252602080880193509091019060005b818110156119ee578351835292840192918401916001016119d2565b50909c9b505050505050505050505050565b60208152600061191a6020830184611921565b600080600060408486031215611a2857600080fd5b83356001600160401b0380821115611a3f57600080fd5b818601915086601f830112611a5357600080fd5b813581811115611a6257600080fd5b876020828501011115611a7457600080fd5b602092830195509350908501359080821115611a8f57600080fd5b50840160608187031215611aa257600080fd5b809150509250925092565b80356001600160a01b0381168114611ac457600080fd5b919050565b600060208284031215611adb57600080fd5b61191a82611aad565b6000808335601e19843603018112611afb57600080fd5b83016020810192503590506001600160401b03811115611b1a57600080fd5b803603821315611b2957600080fd5b9250929050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b88811015611c0a57858403601f19018a52823536899003605e19018112611b98578283fd5b880160606001600160a01b03611bad83611aad565b168652611bbc87830183611ae4565b8289890152611bce8389018284611b30565b925050506040611be081840184611ae4565b935087830382890152611bf4838583611b30565b9d89019d97505050938601935050600101611b73565b509198975050505050505050565b6020815260006001600160a01b0380611c3085611aad565b16602084015280611c4360208601611aad565b16604084015250604083013560608301526060830135601e19843603018112611c6b57600080fd5b83016020810190356001600160401b03811115611c8757600080fd5b8060051b3603821315611c9957600080fd5b60c06080850152611cae60e085018284611b59565b915050608084013560a0840152611cc860a0850185611ae4565b848303601f190160c0860152611cdf838284611b30565b9695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715611d2157611d21611ce9565b60405290565b60405160c081016001600160401b0381118282101715611d2157611d21611ce9565b604051601f8201601f191681016001600160401b0381118282101715611d7157611d71611ce9565b604052919050565b60006001600160401b03821115611d9257611d92611ce9565b5060051b60200190565b600082601f830112611dad57600080fd5b81356001600160401b03811115611dc657611dc6611ce9565b611dd9601f8201601f1916602001611d49565b818152846020838601011115611dee57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f830112611e1c57600080fd5b81356020611e31611e2c83611d79565b611d49565b82815260059290921b84018101918181019086841115611e5057600080fd5b8286015b84811015611eff5780356001600160401b0380821115611e745760008081fd5b908801906060828b03601f1901811315611e8e5760008081fd5b611e96611cff565b611ea1888501611aad565b815260408085013584811115611eb75760008081fd5b611ec58e8b83890101611d9c565b838b015250918401359183831115611edd5760008081fd5b611eeb8d8a85880101611d9c565b908201528652505050918301918301611e54565b509695505050505050565b600060c08284031215611f1c57600080fd5b611f24611d27565b9050611f2f82611aad565b8152611f3d60208301611aad565b60208201526040820135604082015260608201356001600160401b0380821115611f6657600080fd5b611f7285838601611e0b565b60608401526080840135608084015260a0840135915080821115611f9557600080fd5b50611fa284828501611d9c565b60a08301525092915050565b60006105553683611f0a565b60006020808385031215611fcd57600080fd5b82356001600160401b0380821115611fe457600080fd5b818501915085601f830112611ff857600080fd5b8135612006611e2c82611d79565b81815260059190911b8301840190848101908883111561202557600080fd5b8585015b8381101561205d578035858111156120415760008081fd5b61204f8b89838a0101611f0a565b845250918601918601612029565b5098975050505050505050565b634e487b7160e01b600052603260045260246000fd5b8281526040602082015260006120996040830184611921565b949350505050565b6000602082840312156120b357600080fd5b81516001600160e01b03198116811461191a57600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610555576105556120cb565b80820180821115610555576105556120cb565b6001600160a01b0361211882611aad565b1682526020810135602083015260006121346040830183611ae4565b60606040860152612149606086018284611b30565b95945050505050565b60c08152600061216560c0830189611921565b82810360208401526121778189611921565b9050828103604084015261218b8188612107565b606084019690965250506001600160a01b039283166080820152911660a0909101529392505050565b60208152600061191a6020830184612107565b6000816121d6576121d66120cb565b506000190190565b602080825282516001600160a01b0390811683830152838201518116604080850191909152808501516060808601919091528086015160c06080870152805160e0870181905260009594610100600583901b8901810195919493870193919290890190885b8181101561229d5760ff198b8903018352855187815116895289810151858b8b0152612271868b0182611921565b918701518a83038b8901529190506122898183611921565b995050509488019491880191600101612243565b50505050505050608085015160a085015260a08501519150601f198482030160c08501526121498183611921565b815160009082906020808601845b838110156122f5578151855293820193908201906001016122d9565b50929695505050505050565b600181811c9082168061231557607f821691505b60208210810361233557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052602160045260246000fdfea26469706673582212206702181458ece90d9cf27649387478caa2ed36ffd86ba70b239c4be34106280764736f6c634300081700338b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "nonce": "0x0", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x1b99347a0a496c05b1eebb642cfda3f631c5e2a1d77e3253d93de0ecf274c987", + "transactionType": "CREATE2", + "contractName": "MultiSigDeleGator", + "contractAddress": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "function": null, + "arguments": [ + "0xbe4138886cB096bDC1B930F2f0ca7892AA234D78", + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x4162a1", + "value": "0x0", + "input": "0x44656c654761746f72000000000000000000000000000000000000000000000060e0604052306080523480156200001557600080fd5b506040516200396338038062003963833981016040819052620000389162000208565b8181620000446200013e565b6001600160a01b0380831660a081905290821660c0526040517fb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d90600090a26040516001600160a01b038216907fee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a9990600090a250506000197fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c0281905560408051918252517fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c00917f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d03919081900360200190a150505062000247565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156200018f5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001ef5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b0381168114620001ef57600080fd5b600080604083850312156200021c57600080fd5b82516200022981620001f2565b60208401519092506200023c81620001f2565b809150509250929050565b60805160a05160c0516136216200034260003960008181610633015281816108a001528181610b0001528181610bbb01528181610c3c01528181610cba01528181610e1f01528181610ed401528181610f5b015281816110b9015281816111f9015281816112ac0152818161131e0152818161138901528181611521015281816115b4015281816115f6015281816116ec015281816117ca015281816119e0015261240a01526000818161077201528181610b6601528181610d1d01528181610da001528181610e8201528181611130015281816113ec015261174f015260008181611b8201528181611bab015261211901526136216000f3fe60806040526004361061024a5760003560e01c80637df73e2711610139578063bc197c81116100b6578063e3d9109f1161007a578063e3d9109f1461070c578063e75235b81461072c578063ea4d3c9b14610760578063eb12d61e14610794578063f23a6e61146107b4578063ffa1ad74146107d457600080fd5b8063bc197c8114610682578063c399ec88146106a2578063d087d288146106b7578063d7d7442f146106cc578063e1520f54146106ec57600080fd5b8063a24c8f32116100fd578063a24c8f32146105a3578063aaf10f42146105b6578063ad3cb1cc146105e3578063b0d691fe14610621578063b3c650151461065557600080fd5b80637df73e27146104d95780637f07bfdc1461051f5780637fade2871461053f57806394cf795e1461055f578063a0c1deb41461058157600080fd5b80634891161f116101c75780635c1c6dcd1161018b5780635c1c6dcd1461043957806360b5bb3f1461045957806365ee81d8146104795780636af1f3991461049957806378979a80146104b957600080fd5b80634891161f146103d457806349934047146103e95780634a58db19146104095780634f1ef2861461041157806352d1902d1461042457600080fd5b806326f0aef71161020e57806326f0aef71461033457806334fcd5be146103545780633e1b0812146103745780633ed0101514610394578063445140b8146103b457600080fd5b806301ffc9a7146102565780630e316ab71461028b578063150b7a02146102ad5780631626ba7e146102e657806319822f7c1461030657600080fd5b3661025157005b600080fd5b34801561026257600080fd5b506102766102713660046128f4565b610805565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102ab6102a6366004612933565b610895565b005b3480156102b957600080fd5b506102cd6102c8366004612a05565b610ab9565b6040516001600160e01b03199091168152602001610282565b3480156102f257600080fd5b506102cd610301366004612ab8565b610ad4565b34801561031257600080fd5b50610326610321366004612b03565b610af3565b604051908152602001610282565b34801561034057600080fd5b506102ab61034f366004612b6e565b610b5b565b34801561036057600080fd5b506102ab61036f366004612bee565b610bb0565b34801561038057600080fd5b5061032661038f366004612c2f565b610c15565b3480156103a057600080fd5b506102ab6103af366004612c58565b610caf565b3480156103c057600080fd5b506102766103cf366004612c92565b610d87565b3480156103e057600080fd5b50610326601e81565b3480156103f557600080fd5b506102ab610404366004612c58565b610e14565b6102ab610eb7565b6102ab61041f366004612cab565b610f21565b34801561043057600080fd5b50610326610f33565b34801561044557600080fd5b506102ab610454366004612b6e565b610f50565b34801561046557600080fd5b506102ab610474366004612cfa565b610f99565b34801561048557600080fd5b506102ab610494366004612d53565b6110ae565b3480156104a557600080fd5b506102766104b4366004612c92565b611117565b3480156104c557600080fd5b506102ab6104d4366004612db1565b611167565b3480156104e557600080fd5b506102766104f4366004612933565b6001600160a01b031660009081526000805160206135ac833981519152602052604090205460ff1690565b34801561052b57600080fd5b506102ab61053a366004612e2d565b6112a1565b34801561054b57600080fd5b506102ab61055a366004612c58565b61137e565b34801561056b57600080fd5b50610574611421565b6040516102829190612e59565b34801561058d57600080fd5b5060008051602061358c83398151915254610326565b6102ab6105b1366004612cab565b610f29565b3480156105c257600080fd5b506105cb611494565b6040516001600160a01b039091168152602001610282565b3480156105ef57600080fd5b50610614604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102829190612ef6565b34801561062d57600080fd5b506105cb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561066157600080fd5b5061066a6114ba565b6040516001600160401b039091168152602001610282565b34801561068e57600080fd5b506102cd61069d366004612f88565b6114ed565b3480156106ae57600080fd5b50610326611509565b3480156106c357600080fd5b50610326611595565b3480156106d857600080fd5b506102ab6106e7366004612c92565b6115eb565b3480156106f857600080fd5b506102ab610707366004613035565b6116e1565b34801561071857600080fd5b506102ab61072736600461309d565b6117bf565b34801561073857600080fd5b507fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c0254610326565b34801561076c57600080fd5b506105cb7f000000000000000000000000000000000000000000000000000000000000000081565b3480156107a057600080fd5b506102ab6107af366004612933565b6119d5565b3480156107c057600080fd5b506102cd6107cf3660046130d6565b611b5b565b3480156107e057600080fd5b50610614604051806040016040528060058152602001640312e302e360dc1b81525081565b600061080f611b77565b6001600160e01b031982166326f0aef760e01b148061083e57506001600160e01b03198216630a85bd0160e11b145b8061085957506001600160e01b03198216630271189760e51b145b8061087457506001600160e01b031982166301ffc9a760e01b145b8061088f57506001600160e01b03198216630b135d3f60e11b145b92915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906108ce5750333014155b156108ec57604051630796d94560e01b815260040160405180910390fd5b6001600160a01b03811660009081526000805160206135ac833981519152602081905260409091205460ff166109355760405163da0357f760e01b815260040160405180910390fd5b60018101546002820154810361095e576040516361774dcf60e11b815260040160405180910390fd5b60005b61096c600183613154565b811015610a3657836001600160a01b031683600101828154811061099257610992613167565b6000918252602090912001546001600160a01b031603610a2e57826001016001836109bd9190613154565b815481106109cd576109cd613167565b6000918252602090912001546001840180546001600160a01b0390921691839081106109fb576109fb613167565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610a36565b600101610961565b5081600101805480610a4a57610a4a61317d565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038516808352908490526040808320805460ff191690555190917fb0073c14ccc2332b5b461c0d2fb94366f38d3954a82745e74827aa0811c9f98191a2505050565b6000610ac3611b77565b50630a85bd0160e11b949350505050565b6000610ade611b77565b610ae9848484611c1e565b90505b9392505050565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b3e57604051636b31ba1560e11b815260040160405180910390fd5b610b46611b77565b610b508484611dbd565b9050610aec82611e33565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ba457604051630692ce8160e21b815260040160405180910390fd5b610bad81611eca565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610be95750333014155b15610c0757604051630796d94560e01b815260040160405180910390fd5b610c118282611fd4565b5050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610c8b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088f9190613193565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610ce85750333014155b15610d0657604051630796d94560e01b815260040160405180910390fd5b604051633ed0101560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633ed0101590610d529084906004016132db565b600060405180830381600087803b158015610d6c57600080fd5b505af1158015610d80573d6000803e3d6000fd5b5050505050565b6040516316a0682960e11b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632d40d052906024015b602060405180830381865afa158015610df0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088f91906133b6565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610e4d5750333014155b15610e6b57604051630796d94560e01b815260040160405180910390fd5b604051634993404760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634993404790610d529084906004016132db565b610ebf611b77565b60405163b760faf960e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b158015610d6c57600080fd5b610f29612036565b610c1182826120f3565b6000610f3d61210e565b506000805160206135cc83398151915290565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ba457604051636b31ba1560e11b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610fde5750825b90506000826001600160401b03166001148015610ffa5750303b155b905081158015611008575080155b156110265760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561105057845460ff60401b1916600160401b1785555b61105d8888886000612157565b83156110a457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2906020015b60405180910390a15b5050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110e75750333014155b1561110557604051630796d94560e01b815260040160405180910390fd5b61111184848484612157565b50505050565b604051635daa653960e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635daa653990602401610dd3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054869190600160401b900460ff16806111af575080546001600160401b03808416911610155b156111cd5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906112275750333014155b1561124557604051630796d94560e01b815260040160405180910390fd5b61125186868686612157565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906112da5750333014155b156112f857604051630796d94560e01b815260040160405180910390fd5b60405163040b850f60e31b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561136257600080fd5b505af1158015611376573d6000803e3d6000fd5b505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906113b75750333014155b156113d557604051630796d94560e01b815260040160405180910390fd5b604051637fade28760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637fade28790610d529084906004016132db565b606060006000805160206135ac8339815191526001810180546040805160208084028201810190925282815293945083018282801561148957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161146b575b505050505091505090565b60006114b56000805160206135cc833981519152546001600160a01b031690565b905090565b60006114b57ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00546001600160401b031690565b60006114f7611b77565b5063bc197c8160e01b95945050505050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a08231906024015b602060405180830381865afa158015611571573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b59190613193565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401611554565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906116245750333014155b1561164257604051630796d94560e01b815260040160405180910390fd5b806000036116635760405163aabd5a0960e01b815260040160405180910390fd5b60008051602061358c833981519152546000805160206135ac833981519152908211156116a35760405163aabd5a0960e01b815260040160405180910390fd5b600281018290556040518281527f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d039060200160405180910390a15050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480159061171a5750333014155b1561173857604051630796d94560e01b815260040160405180910390fd5b60405163385483d560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e1520f5490611788908690869086906004016133d3565b600060405180830381600087803b1580156117a257600080fd5b505af11580156117b6573d6000803e3d6000fd5b50505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906117f85750333014155b1561181657604051630796d94560e01b815260040160405180910390fd5b6001600160a01b038116158061183557506001600160a01b0381163b15155b1561185357604051634501a91960e01b815260040160405180910390fd5b6001600160a01b03821660009081526000805160206135ac833981519152602081905260409091205460ff1661189c5760405163da0357f760e01b815260040160405180910390fd5b6001600160a01b03821660009081526020829052604090205460ff16156118d657604051631985f4ab60e31b815260040160405180910390fd5b600181015460005b8181101561197057846001600160a01b031683600101828154811061190557611905613167565b6000918252602090912001546001600160a01b031603611968578383600101828154811061193557611935613167565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550611970565b6001016118de565b506001600160a01b03808516600081815260208590526040808220805460ff199081169091559387168083528183208054909516600117909455517f53a7b6f060162826746b07f3ff5cc66b83afad3bc9a57c9f34d7802901c6e8299190a350505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590611a0e5750333014155b15611a2c57604051630796d94560e01b815260040160405180910390fd5b6001600160a01b0381161580611a4b57506001600160a01b0381163b15155b15611a6957604051634501a91960e01b815260040160405180910390fd5b60008051602061358c833981519152546000805160206135ac83398151915290601d1901611aaa57604051630dc92ed360e11b815260040160405180910390fd5b6001600160a01b03821660009081526020829052604090205460ff1615611ae457604051631985f4ab60e31b815260040160405180910390fd5b6001818101805480830182556000918252602080832090910180546001600160a01b0319166001600160a01b038716908117909155808352908490526040808320805460ff191690941790935591517f82b74755d483f0688b80354268454667c377a5684e64a4dbb6820fc11a6276d49190a25050565b6000611b65611b77565b5063f23a6e6160e01b95945050505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611bfe57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611bf26000805160206135cc833981519152546001600160a01b031690565b6001600160a01b031614155b15611c1c5760405163703e46dd60e11b815260040160405180910390fd5b565b7fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c02546000906000805160206135ac83398151915290611c5f9060419061343d565b8314611c7657506001600160e01b03199050610aec565b6000611c83604185613454565b600283015490915060008080805b85811015611da55760008a8a611ca860418561343d565b906041611cb6866001613476565b611cc0919061343d565b92611ccd93929190613489565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929350611d1192508e91508390506123d5565b9350846001600160a01b0316846001600160a01b0316111580611d4d57506001600160a01b03841660009081526020899052604090205460ff16155b15611d6b57506001600160e01b03199750610aec9650505050505050565b82611d75816134b3565b935050858310611d975750630b135d3f60e11b9750610aec9650505050505050565b509192508291600101611c91565b506001600160e01b03199a9950505050505050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c829052603c81208190611e0590611e006101008701876134cc565b611c1e565b90506374eca2c160e11b6001600160e01b0319821601611e2957600091505061088f565b5060019392505050565b8015610bad57604051600090339060001990849084818181858888f193505050503d8060008114611e80576040519150601f19603f3d011682016040523d82523d6000602084013e611e85565b606091505b505060408051848152821515602082015291925033917fa427c7d47f24d01b170779a7600b1d4c0d7cdbabaa0f19c4f0e6182053ffc931910160405180910390a25050565b600080611eda6020840184612933565b6001600160a01b03166020840135611ef560408601866134cc565b604051611f03929190613512565b60006040518083038185875af1925050503d8060008114611f40576040519150601f19603f3d011682016040523d82523d6000602084013e611f45565b606091505b509092509050611f586020840184612933565b6001600160a01b03167f74b56487625d598ffbf59a76c3b58fc1922f54afc86a075bad0c2a8aa05d2ad284602001358484604051611f9893929190613522565b60405180910390a281611fcf578051600003611fc75760405163764bbf1760e01b815260040160405180910390fd5b805181602001fd5b505050565b806000819003611ff757604051635fc74f2160e11b815260040160405180910390fd5b60005b818110156111115761202e84848381811061201757612017613167565b90506020028101906120299190613543565b611eca565b600101611ffa565b60008051602061358c833981519152546000805160206135ac8339815191529060005b818110156120b05782600001600084600101838154811061207c5761207c613167565b60009182526020808320909101546001600160a01b031683528201929092526040019020805460ff19169055600101612059565b506120bf6001830160006128c2565b6000600283018190556040517feb09d532980c3cc73dcad99b80e264204a667a54cbb7b63ec8d68dcb1c7096be9190a15050565b6120fb611b77565b612104826123ff565b610c118282612456565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c1c5760405163703e46dd60e11b815260040160405180910390fd5b60008051602061358c8339815191525483906000805160206135ac8339815191529060008461218f5761218a8285613476565b612191565b835b905085158061219f57508086115b156121bd5760405163aabd5a0960e01b815260040160405180910390fd5b601e8111156121df57604051630dc92ed360e11b815260040160405180910390fd5b84156122735760005b8281101561226457600084600101828154811061220757612207613167565b60009182526020808320909101546001600160a01b0316808352908790526040808320805460ff191690555190925082917fb0073c14ccc2332b5b461c0d2fb94366f38d3954a82745e74827aa0811c9f98191a2506001016121e8565b506122736001840160006128c2565b60005b8481101561239d57600089898381811061229257612292613167565b90506020020160208101906122a79190612933565b6001600160a01b03811660009081526020879052604090205490915060ff16156122e457604051631985f4ab60e31b815260040160405180910390fd5b6001600160a01b038116158061230357506001600160a01b0381163b15155b1561232157604051634501a91960e01b815260040160405180910390fd5b6001858101805480830182556000918252602080832090910180546001600160a01b0319166001600160a01b038616908117909155808352908890526040808320805460ff191690941790935591517f82b74755d483f0688b80354268454667c377a5684e64a4dbb6820fc11a6276d49190a250600101612276565b50600283018690556040518681527f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d039060200161109b565b6000806000806123e58686612518565b9250925092506123f58282612565565b5090949350505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906124385750333014155b15610bad57604051630796d94560e01b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156124b0575060408051601f3d908101601f191682019092526124ad91810190613193565b60015b6124dd57604051634c9c8ce360e01b81526001600160a01b03831660048201526024015b60405180910390fd5b6000805160206135cc833981519152811461250e57604051632a87526960e21b8152600481018290526024016124d4565b611fcf838361261e565b600080600083516041036125525760208401516040850151606086015160001a61254488828585612674565b95509550955050505061255e565b50508151600091506002905b9250925092565b600082600381111561257957612579613563565b03612582575050565b600182600381111561259657612596613563565b036125b45760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156125c8576125c8613563565b036125e95760405163fce698f760e01b8152600481018290526024016124d4565b60038260038111156125fd576125fd613563565b03610c11576040516335e2f38360e21b8152600481018290526024016124d4565b61262782612743565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561266c57611fcf82826127a8565b610c1161281e565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156126af5750600091506003905082612739565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612703573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661272f57506000925060019150829050612739565b9250600091508190505b9450945094915050565b806001600160a01b03163b60000361277957604051634c9c8ce360e01b81526001600160a01b03821660048201526024016124d4565b6000805160206135cc83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516127c59190613579565b600060405180830381855af49150503d8060008114612800576040519150601f19603f3d011682016040523d82523d6000602084013e612805565b606091505b509150915061281585838361283d565b95945050505050565b3415611c1c5760405163b398979f60e01b815260040160405180910390fd5b6060826128525761284d82612899565b610aec565b815115801561286957506001600160a01b0384163b155b1561289257604051639996b31560e01b81526001600160a01b03851660048201526024016124d4565b5080610aec565b8051156128a95780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825590600052602060002090810190610bad91905b808211156128f057600081556001016128dc565b5090565b60006020828403121561290657600080fd5b81356001600160e01b031981168114610aec57600080fd5b6001600160a01b0381168114610bad57600080fd5b60006020828403121561294557600080fd5b8135610aec8161291e565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561298e5761298e612950565b604052919050565b600082601f8301126129a757600080fd5b81356001600160401b038111156129c0576129c0612950565b6129d3601f8201601f1916602001612966565b8181528460208386010111156129e857600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215612a1b57600080fd5b8435612a268161291e565b93506020850135612a368161291e565b92506040850135915060608501356001600160401b03811115612a5857600080fd5b612a6487828801612996565b91505092959194509250565b60008083601f840112612a8257600080fd5b5081356001600160401b03811115612a9957600080fd5b602083019150836020828501011115612ab157600080fd5b9250929050565b600080600060408486031215612acd57600080fd5b8335925060208401356001600160401b03811115612aea57600080fd5b612af686828701612a70565b9497909650939450505050565b600080600060608486031215612b1857600080fd5b83356001600160401b03811115612b2e57600080fd5b84016101208187031215612b4157600080fd5b95602085013595506040909401359392505050565b600060608284031215612b6857600080fd5b50919050565b600060208284031215612b8057600080fd5b81356001600160401b03811115612b9657600080fd5b612ba284828501612b56565b949350505050565b60008083601f840112612bbc57600080fd5b5081356001600160401b03811115612bd357600080fd5b6020830191508360208260051b8501011115612ab157600080fd5b60008060208385031215612c0157600080fd5b82356001600160401b03811115612c1757600080fd5b612c2385828601612baa565b90969095509350505050565b600060208284031215612c4157600080fd5b81356001600160c01b0381168114610aec57600080fd5b600060208284031215612c6a57600080fd5b81356001600160401b03811115612c8057600080fd5b820160c08185031215610aec57600080fd5b600060208284031215612ca457600080fd5b5035919050565b60008060408385031215612cbe57600080fd5b8235612cc98161291e565b915060208301356001600160401b03811115612ce457600080fd5b612cf085828601612996565b9150509250929050565b600080600060408486031215612d0f57600080fd5b83356001600160401b03811115612d2557600080fd5b612d3186828701612baa565b909790965060209590950135949350505050565b8015158114610bad57600080fd5b60008060008060608587031215612d6957600080fd5b84356001600160401b03811115612d7f57600080fd5b612d8b87828801612baa565b909550935050602085013591506040850135612da681612d45565b939692955090935050565b600080600080600060808688031215612dc957600080fd5b85356001600160401b038082168214612de157600080fd5b90955060208701359080821115612df757600080fd5b50612e0488828901612baa565b909550935050604086013591506060860135612e1f81612d45565b809150509295509295909350565b60008060408385031215612e4057600080fd5b8235612e4b8161291e565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b81811015612e9a5783516001600160a01b031683529284019291840191600101612e75565b50909695505050505050565b60005b83811015612ec1578181015183820152602001612ea9565b50506000910152565b60008151808452612ee2816020860160208601612ea6565b601f01601f19169290920160200192915050565b602081526000610aec6020830184612eca565b600082601f830112612f1a57600080fd5b813560206001600160401b03821115612f3557612f35612950565b8160051b612f44828201612966565b9283528481018201928281019087851115612f5e57600080fd5b83870192505b84831015612f7d57823582529183019190830190612f64565b979650505050505050565b600080600080600060a08688031215612fa057600080fd5b8535612fab8161291e565b94506020860135612fbb8161291e565b935060408601356001600160401b0380821115612fd757600080fd5b612fe389838a01612f09565b94506060880135915080821115612ff957600080fd5b61300589838a01612f09565b9350608088013591508082111561301b57600080fd5b5061302888828901612996565b9150509295509295909350565b60008060006040848603121561304a57600080fd5b83356001600160401b038082111561306157600080fd5b61306d87838801612a70565b9095509350602086013591508082111561308657600080fd5b5061309386828701612b56565b9150509250925092565b600080604083850312156130b057600080fd5b82356130bb8161291e565b915060208301356130cb8161291e565b809150509250929050565b600080600080600060a086880312156130ee57600080fd5b85356130f98161291e565b945060208601356131098161291e565b9350604086013592506060860135915060808601356001600160401b0381111561313257600080fd5b61302888828901612996565b634e487b7160e01b600052601160045260246000fd5b8181038181111561088f5761088f61313e565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6000602082840312156131a557600080fd5b5051919050565b6000808335601e198436030181126131c357600080fd5b83016020810192503590506001600160401b038111156131e257600080fd5b803603821315612ab157600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b888110156132cd57858403601f19018a52823536899003605e19018112613259578283fd5b8801606081356132688161291e565b6001600160a01b0316865261327f828801836131ac565b828989015261329183890182846131f1565b9250505060406132a3818401846131ac565b9350878303828901526132b78385836131f1565b9d89019d97505050938601935050600101613234565b509198975050505050505050565b60208152600082356132ec8161291e565b6001600160a01b039081166020848101919091528401359061330d8261291e565b80821660408501525050604083013560608301526060830135601e1984360301811261333857600080fd5b83016020810190356001600160401b0381111561335457600080fd5b8060051b360382131561336657600080fd5b60c0608085015261337b60e08501828461321a565b915050608084013560a084015261339560a08501856131ac565b848303601f190160c08601526133ac8382846131f1565b9695505050505050565b6000602082840312156133c857600080fd5b8151610aec81612d45565b6040815260006133e76040830185876131f1565b828103602084015283356133fa8161291e565b6001600160a01b031681526020848101359082015261341c60408501856131ac565b606060408401526134316060840182846131f1565b98975050505050505050565b808202811582820484141761088f5761088f61313e565b60008261347157634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561088f5761088f61313e565b6000808585111561349957600080fd5b838611156134a657600080fd5b5050820193919092039150565b6000600182016134c5576134c561313e565b5060010190565b6000808335601e198436030181126134e357600080fd5b8301803591506001600160401b038211156134fd57600080fd5b602001915036819003821315612ab157600080fd5b8183823760009101908152919050565b83815282151560208201526060604082015260006128156060830184612eca565b60008235605e1983360301811261355957600080fd5b9190910192915050565b634e487b7160e01b600052602160045260246000fd5b60008251613559818460208701612ea656feb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c01b005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212207f3a1345dd207b3e6a7d8045651ded34698ad5d76b8ff402fdacf6337782f2f664736f6c63430008170033000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d780000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x1", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8624bfadfd4d2eb8c588453cd80fe052753e6f09d112861fb191b0df983c3fab", + "transactionType": "CREATE2", + "contractName": "HybridDeleGator", + "contractAddress": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "function": null, + "arguments": [ + "0xbe4138886cB096bDC1B930F2f0ca7892AA234D78", + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x62d183", + "value": "0x0", + "input": "0x44656c654761746f72000000000000000000000000000000000000000000000060e0604052306080523480156200001557600080fd5b50604051620051483803806200514883398101604081905262000038916200018b565b818162000044620000c1565b6001600160a01b0380831660a081905290821660c0526040517fb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d90600090a26040516001600160a01b038216907fee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a9990600090a250505050620001ca565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620001125760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001725780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b03811681146200017257600080fd5b600080604083850312156200019f57600080fd5b8251620001ac8162000175565b6020840151909250620001bf8162000175565b809150509250929050565b60805160a05160c051614e83620002c5600039600081816105e9015281816107f3015281816108a1015281816109c501528181610a4601528181610ac401528181610c2901528181610cde01528181610d6501528181610dfe01528181610eea01528181610fa50152818161101701528181611082015281816112c401528181611343015281816113c00152818161147f015281816116c4015281816117b501526124480152600081816107290152818161090701528181610b2701528181610baa01528181610c8c01528181610dbc015281816110e50152611727015260008181611a9b01528181611ac401526120b50152614e836000f3fe60806040526004361061023f5760003560e01c80637f07bfdc1161012e578063c399ec88116100ab578063e1520f541161006f578063e1520f54146106f7578063ea4d3c9b14610717578063f23a6e611461074b578063f2fde38b1461076b578063ffa1ad741461078b57600080fd5b8063c399ec8814610658578063c8561e731461066d578063d087d2881461068d578063d37aec92146106a2578063d5d33b55146106d757600080fd5b8063aaf10f42116100f2578063aaf10f4214610584578063ad3cb1cc14610599578063b0d691fe146105d7578063b3c650151461060b578063bc197c811461063857600080fd5b80637f07bfdc146104d25780637fade287146104f25780638da5cb5b146105125780638ebf953314610551578063a24c8f321461057157600080fd5b80633ed01015116101bc57806352d1902d1161018057806352d1902d146104485780635c1c6dcd1461045d5780636af1f3991461047d578063715018a61461049d57806378a68ecf146104b257600080fd5b80633ed01015146103cd578063445140b8146103ed578063499340471461040d5780634a58db191461042d5780634f1ef2861461043557600080fd5b80631c03010a116102035780631c03010a1461032957806326f0aef71461034b5780632ffeaad61461036b57806334fcd5be1461038d5780633e1b0812146103ad57600080fd5b806301ffc9a71461024b578063074feff314610280578063150b7a02146102a25780631626ba7e146102db57806319822f7c146102fb57600080fd5b3661024657005b600080fd5b34801561025757600080fd5b5061026b610266366004613e92565b6107bc565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102a061029b366004613f27565b6107e8565b005b3480156102ae57600080fd5b506102c26102bd366004614096565b610859565b6040516001600160e01b03199091168152602001610277565b3480156102e757600080fd5b506102c26102f6366004614142565b610875565b34801561030757600080fd5b5061031b61031636600461418d565b610894565b604051908152602001610277565b34801561033557600080fd5b50600080516020614dae8339815191525461031b565b34801561035757600080fd5b506102a06103663660046141f8565b6108fc565b34801561037757600080fd5b50610380610951565b604051610277919061422c565b34801561039957600080fd5b506102a06103a8366004614264565b6109ba565b3480156103b957600080fd5b5061031b6103c83660046142a5565b610a1f565b3480156103d957600080fd5b506102a06103e83660046142ce565b610ab9565b3480156103f957600080fd5b5061026b610408366004614308565b610b91565b34801561041957600080fd5b506102a06104283660046142ce565b610c1e565b6102a0610cc1565b6102a0610443366004614321565b610d2b565b34801561045457600080fd5b5061031b610d3d565b34801561046957600080fd5b506102a06104783660046141f8565b610d5a565b34801561048957600080fd5b5061026b610498366004614308565b610da3565b3480156104a957600080fd5b506102a0610df3565b3480156104be57600080fd5b506102a06104cd366004614389565b610e56565b3480156104de57600080fd5b506102a06104ed36600461445b565b610f9a565b3480156104fe57600080fd5b506102a061050d3660046142ce565b611077565b34801561051e57600080fd5b50600080516020614d8e833981519152546001600160a01b03165b6040516001600160a01b039091168152602001610277565b34801561055d57600080fd5b506102a061056c366004613f27565b61111a565b6102a061057f366004614321565b610d33565b34801561059057600080fd5b50610539611236565b3480156105a557600080fd5b506105ca604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161027791906144d7565b3480156105e357600080fd5b506105397f000000000000000000000000000000000000000000000000000000000000000081565b34801561061757600080fd5b5061062061125c565b6040516001600160401b039091168152602001610277565b34801561064457600080fd5b506102c2610653366004614569565b61128f565b34801561066457600080fd5b5061031b6112ac565b34801561067957600080fd5b506102a0610688366004614616565b611338565b34801561069957600080fd5b5061031b6113a1565b3480156106ae57600080fd5b506106c26106bd366004614666565b6113f7565b60408051928352602083019190915201610277565b3480156106e357600080fd5b506102a06106f2366004614666565b611474565b34801561070357600080fd5b506102a061071236600461469b565b6116b9565b34801561072357600080fd5b506105397f000000000000000000000000000000000000000000000000000000000000000081565b34801561075757600080fd5b506102c2610766366004614703565b61178e565b34801561077757600080fd5b506102a061078636600461476b565b6117aa565b34801561079757600080fd5b506105ca604051806040016040528060058152602001640312e302e360dc1b81525081565b60006107c78261180a565b806107e257506001600160e01b031982166307f5828d60e41b145b92915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906108215750333014155b1561083f57604051630796d94560e01b815260040160405180910390fd5b61085087878787878787600161189a565b50505050505050565b6000610863611a90565b50630a85bd0160e11b5b949350505050565b600061087f611a90565b61088a848484611b35565b90505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108df57604051636b31ba1560e11b815260040160405180910390fd5b6108e7611a90565b6108f18484611d59565b905061088d82611dcf565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094557604051630692ce8160e21b815260040160405180910390fd5b61094e81611e66565b50565b60606000600080516020614d8e833981519152600281018054604080516020808402820181019092528281529394508301828280156109af57602002820191906000526020600020905b81548152602001906001019080831161099b575b505050505091505090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906109f35750333014155b15610a1157604051630796d94560e01b815260040160405180910390fd5b610a1b8282611f70565b5050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610a95573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e29190614788565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610af25750333014155b15610b1057604051630796d94560e01b815260040160405180910390fd5b604051633ed0101560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633ed0101590610b5c9084906004016148d0565b600060405180830381600087803b158015610b7657600080fd5b505af1158015610b8a573d6000803e3d6000fd5b5050505050565b6040516316a0682960e11b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632d40d052906024015b602060405180830381865afa158015610bfa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e291906149ac565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610c575750333014155b15610c7557604051630796d94560e01b815260040160405180910390fd5b604051634993404760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634993404790610b5c9084906004016148d0565b610cc9611a90565b60405163b760faf960e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b158015610b7657600080fd5b610d33611fd2565b610a1b828261208f565b6000610d476120aa565b50600080516020614dee83398151915290565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094557604051636b31ba1560e11b815260040160405180910390fd5b604051635daa653960e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635daa653990602401610bdd565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610e2c5750333014155b15610e4a57604051630796d94560e01b815260040160405180910390fd5b610e5460006120f3565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460ff8b81169291600160401b90041680610ea0575080546001600160401b03808416911610155b15610ebe5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610f185750333014155b15610f3657604051630796d94560e01b815260040160405180910390fd5b610f468a8a8a8a8a8a8a8a61189a565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15050505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610fd35750333014155b15610ff157604051630796d94560e01b815260040160405180910390fd5b60405163040b850f60e31b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561105b57600080fd5b505af115801561106f573d6000803e3d6000fd5b505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110b05750333014155b156110ce57604051630796d94560e01b815260040160405180910390fd5b604051637fade28760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637fade28790610b5c9084906004016148d0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b031660008115801561115f5750825b90506000826001600160401b0316600114801561117b5750303b155b905081158015611189575080155b156111a75760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156111d157845460ff60401b1916600160401b1785555b6111e28c8c8c8c8c8c8c600061189a565b831561122857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b6000611257600080516020614dee833981519152546001600160a01b031690565b905090565b60006112577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00546001600160401b031690565b6000611299611a90565b5063bc197c8160e01b5b95945050505050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a08231906024015b602060405180830381865afa158015611314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112579190614788565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906113715750333014155b1561138f57604051630796d94560e01b815260040160405180910390fd5b61139b84848484612195565b50505050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a906044016112f7565b60008080600080516020614d8e8339815191529050600081600101600087876040516020016114279291906149c9565b60408051601f198184030181529181528151602092830120835282820193909352908201600020825180840190935280548084526001909101549290910182905297909650945050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906114ad5750333014155b156114cb57604051630796d94560e01b815260040160405180910390fd5b604051600080516020614d8e833981519152906000906114f190859085906020016149c9565b60408051601f19818403018152828252805160209182012060008181526001808801845290849020858501909452835480865293015491840182905293508115801561153b575080155b1561156157604051631a36430d60e31b8152600481018590526024015b60405180910390fd5b600285015460018114801561157e575085546001600160a01b0316155b1561159c5760405163c4c8547360e01b815260040160405180910390fd5b60005b6115aa6001836149ef565b81101561162f57858760020182815481106115c7576115c7614a02565b90600052602060002001540361162757600287016115e66001846149ef565b815481106115f6576115f6614a02565b906000526020600020015487600201828154811061161657611616614a02565b60009182526020909120015561162f565b60010161159f565b508560020180548061164357611643614a18565b60008281526020808220830160001990810183905590920190925586825260018881018252604080842084815590910192909255815185815290810184905286917facf0e8088062f44f734bbcb5223794fd8bb6f6db1c199cb6a72df119d002a71b910160405180910390a25050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906116f25750333014155b1561171057604051630796d94560e01b815260040160405180910390fd5b60405163385483d560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e1520f549061176090869086908690600401614a2e565b600060405180830381600087803b15801561177a57600080fd5b505af1158015610850573d6000803e3d6000fd5b6000611798611a90565b5063f23a6e6160e01b95945050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906117e35750333014155b1561180157604051630796d94560e01b815260040160405180910390fd5b61094e816120f3565b6000611814611a90565b6001600160e01b031982166326f0aef760e01b148061184357506001600160e01b03198216630a85bd0160e11b145b8061185e57506001600160e01b03198216630271189760e51b145b8061187957506001600160e01b031982166301ffc9a760e01b145b806107e2575050630b135d3f60e11b6001600160e01b03198216145b919050565b856001600160a01b0389161580156118b0575080155b80156118b95750815b156118d7576040516312da594d60e11b815260040160405180910390fd5b80851415806118e65750808314155b156119155760405163a297991b60e01b8152600481018290526024810186905260448101849052606401611558565b8115611a0a57600080516020614dae83398151915254600080516020614d8e833981519152908015611a075760005b818110156119f857600083600201828154811061196357611963614a02565b6000918252602080832090910154808352600180880180845260408086208151808301835281548152938101805485880190815286895293909652869055949093558051925193519194509284927facf0e8088062f44f734bbcb5223794fd8bb6f6db1c199cb6a72df119d002a71b926119e69290918252602082015260400190565b60405180910390a25050600101611944565b50611a07600283016000613e60565b50505b60005b81811015611a7b57611a73898983818110611a2a57611a2a614a02565b9050602002810190611a3c9190614a8c565b898985818110611a4e57611a4e614a02565b90506020020135888886818110611a6757611a67614a02565b90506020020135612195565b600101611a0d565b50611a85896120f3565b505050505050505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611b1757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611b0b600080516020614dee833981519152546001600160a01b031690565b6001600160a01b031614155b15610e545760405163703e46dd60e11b815260040160405180910390fd5b6000816041819003611bd257600080516020614d8e833981519152546001600160a01b03166001600160a01b0316611ba38686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061231292505050565b6001600160a01b031603611bc15750630b135d3f60e11b905061088d565b506001600160e01b0319905061088d565b6060811015611bec57506001600160e01b0319905061088d565b600080516020614d8e8339815191526000611c0a6020828789614ad2565b611c1391614afc565b600081815260018085016020908152604092839020835180850190945280548085529201549083015291925090158015611c4f57506020810151155b15611c6957506001600160e01b0319935061088d92505050565b836060148015611cbd5750611cbd8888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505085516020870151909250905061233c565b15611cd65750630b135d3f60e11b935061088d92505050565b83606014158015611d2b5750611d2b8888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508551602087015190925090506123da565b15611d445750630b135d3f60e11b935061088d92505050565b506001600160e01b0319935061088d92505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c829052603c81208190611da190611d9c610100870187614a8c565b611b35565b90506374eca2c160e11b6001600160e01b0319821601611dc55760009150506107e2565b5060019392505050565b801561094e57604051600090339060001990849084818181858888f193505050503d8060008114611e1c576040519150601f19603f3d011682016040523d82523d6000602084013e611e21565b606091505b505060408051848152821515602082015291925033917fa427c7d47f24d01b170779a7600b1d4c0d7cdbabaa0f19c4f0e6182053ffc931910160405180910390a25050565b600080611e76602084018461476b565b6001600160a01b03166020840135611e916040860186614a8c565b604051611e9f9291906149c9565b60006040518083038185875af1925050503d8060008114611edc576040519150601f19603f3d011682016040523d82523d6000602084013e611ee1565b606091505b509092509050611ef4602084018461476b565b6001600160a01b03167f74b56487625d598ffbf59a76c3b58fc1922f54afc86a075bad0c2a8aa05d2ad284602001358484604051611f3493929190614b1a565b60405180910390a281611f6b578051600003611f635760405163764bbf1760e01b815260040160405180910390fd5b805181602001fd5b505050565b806000819003611f9357604051635fc74f2160e11b815260040160405180910390fd5b60005b8181101561139b57611fca848483818110611fb357611fb3614a02565b9050602002810190611fc59190614b3b565b611e66565b600101611f96565b600080516020614dae83398151915254600080516020614d8e8339815191529060005b818110156120455782600101600084600201838154811061201857612018614a02565b60009182526020808320909101548352820192909252604001812081815560019081019190915501611ff5565b50612054600283016000613e60565b81546001600160a01b03191682556040517feb09d532980c3cc73dcad99b80e264204a667a54cbb7b63ec8d68dcb1c7096be90600090a15050565b612097611a90565b6120a08261243d565b610a1b8282612494565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e545760405163703e46dd60e11b815260040160405180910390fd5b600080516020614dae83398151915254600080516020614d8e8339815191529015801561212757506001600160a01b038216155b156121455760405163c4c8547360e01b815260040160405180910390fd5b80546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b61219f8282612551565b6121c6576040516313c3d61f60e01b81526004810183905260248101829052604401611558565b600084846040516020016121db9291906149c9565b6040516020818303038152906040528051906020012090508484905060000361221757604051637e25658160e11b815260040160405180910390fd5b60008181527fa2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694901602052604090208054600080516020614d8e83398151915291901515806122675750600181015415155b15612288576040516361db108160e01b815260048101849052602401611558565b604080518082018252868152602080820187815260008781526001808801845285822094518555915193820193909355600286018054918201815583529120018490555183907fd00539cb08a7c24166308150d64d603150c01baf89d3d3e4c6063d6db7c6983d90612301908a908a908a908a90614b5b565b60405180910390a250505050505050565b600080600080612322868661255d565b92509250925061233282826125aa565b5090949350505050565b600080600061234a86612663565b91509150600060028860405160200161236591815260200190565b60408051601f198184030181529082905261237f91614b82565b602060405180830381855afa15801561239c573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906123bf9190614788565b90506123ce8184848989612685565b98975050505050505050565b6000806123e685612793565b9050612433866040516020016123fe91815260200190565b60408051601f198184030181529181528301516060840151608085015160a086015160c0870151875160208901518c8c612811565b9695505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906124765750333014155b1561094e57604051630796d94560e01b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156124ee575060408051601f3d908101601f191682019092526124eb91810190614788565b60015b61251657604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611558565b600080516020614dee833981519152811461254757604051632a87526960e21b815260048101829052602401611558565b611f6b83836129b1565b600061088d8383612a07565b600080600083516041036125975760208401516040850151606086015160001a61258988828585612b01565b9550955095505050506125a3565b50508151600091506002905b9250925092565b60008260038111156125be576125be614b94565b036125c7575050565b60018260038111156125db576125db614b94565b036125f95760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561260d5761260d614b94565b0361262e5760405163fce698f760e01b815260048101829052602401611558565b600382600381111561264257612642614b94565b03610a1b576040516335e2f38360e21b815260048101829052602401611558565b6000808280602001905181019061267a9190614baa565b909590945092505050565b60006126a06002600080516020614dce833981519152614bd8565b8411156126af575060006112a3565b6040805160208101889052908101869052606081018590526080810184905260a0810183905260009060c00160405160208183030381529060405290506000806101006001600160a01b0316836040516127099190614b82565b600060405180830381855afa9150503d8060008114612744576040519150601f19603f3d011682016040523d82523d6000602084013e612749565b606091505b50915091508115612779578080602001905181019061276891906149ac565b1515600115151493505050506112a3565b6127868989898989612bd0565b9998505050505050505050565b6127d56040518060e001604052806000815260200160008152602001606081526020016000151581526020016060815260200160608152602001600081525090565b818060200190518101906127e99190614c3f565b60c089015260a088015260808701521515606086015260408501526020840152825250919050565b600060258a51108061284b57506128498a60208151811061283457612834614a02565b01602001516001600160f81b0319168a612cb3565b155b15612858575060006129a3565b6000886128648d612d19565b8960405160200161287793929190614cfe565b60408051601f198184030181528282019091526015825274113a3cb832911d113bb2b130baba34371733b2ba1160591b602083015291506128b981838a612f26565b6128c8576000925050506129a3565b60006002836040516128da9190614b82565b602060405180830381855afa1580156128f7573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061291a9190614788565b9050600060028e83604051602001612933929190614d41565b60408051601f198184030181529082905261294d91614b82565b602060405180830381855afa15801561296a573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061298d9190614788565b905061299c818a8a8a8a612685565b9450505050505b9a9950505050505050505050565b6129ba82612fd5565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156129ff57611f6b828261303a565b610a1b6130a7565b600082158015612a15575081155b80612a2d5750600160601b63ffffffff60c01b031983145b80612a455750600160601b63ffffffff60c01b031982145b15612a52575060006107e2565b6000600160601b63ffffffff60c01b031983840990506000600160601b63ffffffff60c01b0319807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc8709600160601b63ffffffff60c01b031987600160601b63ffffffff60c01b0319898a0909089050600160601b63ffffffff60c01b03197f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b820891909114949350505050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612b3c5750600091506003905082612bc6565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612b90573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612bbc57506000925060019150829050612bc6565b9250600091508190505b9450945094915050565b6000841580612bed5750600080516020614dce8339815191528510155b80612bf6575083155b80612c0f5750600080516020614dce8339815191528410155b15612c1c575060006112a3565b612c268383612a07565b612c32575060006112a3565b6000612c3d856130c6565b90506000600080516020614dce83398151915282890990506000600080516020614dce83398151915283890990506000612c7987878585613138565b9050600080516020614dce833981519152612ca28a600080516020614dce8339815191526149ef565b8208159a9950505050505050505050565b6000600160f81b83811614612cca575060006107e2565b818015612cdd5750600160fa1b83811614155b15612cea575060006107e2565b600160fb1b83811614612d1057600f60fc1b600160fc1b841601612d10575060006107e2565b50600192915050565b60606000612d2683613800565b90506000819050600060028251118015612d7157508160028351612d4a91906149ef565b81518110612d5a57612d5a614a02565b6020910101516001600160f81b031916603d60f81b145b15612d7e57506002612dc9565b60018251118015612dc057508160018351612d9991906149ef565b81518110612da957612da9614a02565b6020910101516001600160f81b031916603d60f81b145b15612dc9575060015b6000818351612dd891906149ef565b90506000816001600160401b03811115612df457612df4613fd3565b6040519080825280601f01601f191660200182016040528015612e1e576020820181803683370190505b50905060005b82811015612f1b57848181518110612e3e57612e3e614a02565b01602001516001600160f81b031916602b60f81b03612e8a57602d60f81b828281518110612e6e57612e6e614a02565b60200101906001600160f81b031916908160001a905350612f13565b848181518110612e9c57612e9c614a02565b01602001516001600160f81b031916602f60f81b03612ecc57605f60f81b828281518110612e6e57612e6e614a02565b848181518110612ede57612ede614a02565b602001015160f81c60f81b828281518110612efb57612efb614a02565b60200101906001600160f81b031916908160001a9053505b600101612e24565b509695505050505050565b825182516000918591859190845b82811015612fc65781612f478289614d63565b10612f5a5760009550505050505061088d565b83612f658289614d63565b81518110612f7557612f75614a02565b602001015160f81c60f81b6001600160f81b031916858281518110612f9c57612f9c614a02565b01602001516001600160f81b03191614612fbe5760009550505050505061088d565b600101612f34565b50600198975050505050505050565b806001600160a01b03163b60000361300b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611558565b600080516020614dee83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516130579190614b82565b600060405180830381855af49150503d8060008114613092576040519150601f19603f3d011682016040523d82523d6000602084013e613097565b606091505b50915091506112a3858383613826565b3415610e545760405163b398979f60e01b815260040160405180910390fd5b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f6080820152600080516020614dce83398151915260a082015260208160c0836005600019fa61313157600080fd5b5192915050565b600080808060ff81808815801561314d575087155b15613161576000965050505050505061086d565b6131ad7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d613882565b9092509050811580156131be575080155b156131ec57600080516020614dce83398151915288600080516020614dce833981519152038a089850600097505b600189841c16600189851c1660011b015b8061321f5760018403935060018a851c1660018a861c1660011b0190506131fd565b50600189841c16600189851c1660011b01955060018603613281577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603613290578a96508993505b6003860361329f578196508093505b60018303925060019550600194505b82600019111561378357600160601b63ffffffff60c01b031984600209600160601b63ffffffff60c01b0319818209600160601b63ffffffff60c01b0319818a09600160601b63ffffffff60c01b03198284099250600160601b63ffffffff60c01b031980600160601b63ffffffff60c01b03198b8d08600160601b63ffffffff60c01b03198c600160601b63ffffffff60c01b0319038e0809600309600160601b63ffffffff60c01b03198985099850600160601b63ffffffff60c01b03198a84099950600160601b63ffffffff60c01b031980836002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319838409089a50600160601b63ffffffff60c01b03198083600160601b63ffffffff60c01b0319038d0882099250600160601b63ffffffff60c01b031983600160601b63ffffffff60c01b03198a870908975060018d881c1660018d891c1660011b0190508061342b5787600160601b63ffffffff60c01b031903975050505050613778565b6001810361347a577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103613489578e93508d92505b60038103613498578593508492505b896134b157509198506001975087965094506137789050565b600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b03198b860908600160601b63ffffffff60c01b03198c600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b03198d88090893508061366a578361366a57600160601b63ffffffff60c01b0319896002600160601b0363ffffffff60c01b0319099450600160601b63ffffffff60c01b03198586099350600160601b63ffffffff60c01b0319848d099250600160601b63ffffffff60c01b03198486099450600160601b63ffffffff60c01b0319808c600160601b63ffffffff60c01b0319038e08600160601b63ffffffff60c01b03198d8f08099050600160601b63ffffffff60c01b0319816003099150600160601b63ffffffff60c01b03198a86099950600160601b63ffffffff60c01b03198b85099a50600160601b63ffffffff60c01b031980846002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319848509089b50600160601b63ffffffff60c01b0319808d600160601b63ffffffff60c01b031903850883099350600160601b63ffffffff60c01b0319808a8709850898505050505050613778565b600160601b63ffffffff60c01b03198485099150600160601b63ffffffff60c01b0319848309600160601b63ffffffff60c01b0319838d099b50600160601b63ffffffff60c01b0319818c099a50600160601b63ffffffff60c01b0319838e09600160601b63ffffffff60c01b031980826002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b031984600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b031987880908089350600160601b63ffffffff60c01b031980838d09600160601b63ffffffff60c01b031985600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b031903860809089a50505050809a50505050505b6001830392506132ae565b60405186606082015260208152602080820152602060408201526002600160601b0363ffffffff60c01b03196080820152600160601b63ffffffff60c01b031960a082015260208160c0836005600019fa6137dd57600080fd5b600160601b63ffffffff60c01b0319815189099c9b505050505050505050505050565b60606107e282604051806060016040528060408152602001614e0e604091396001613910565b60608261383b5761383682613a8f565b61088d565b815115801561385257506001600160a01b0384163b155b1561387b57604051639996b31560e01b81526001600160a01b0385166004820152602401611558565b508061088d565b600080808086613899578585935093505050613907565b846138ab578787935093505050613907565b85881480156138b957508487145b156138da576138cb8888600180613ab8565b929a50909850925090506138f4565b6138e988886001808a8a613c13565b929a50909850925090505b61390088888484613d97565b9350935050505b94509492505050565b60608351600003613930575060408051602081019091526000815261088d565b600082613961576003855160046139479190614d76565b613952906002614d63565b61395c9190614bd8565b613986565b6003855160026139719190614d63565b61397b9190614bd8565b613986906004614d76565b90506000816001600160401b038111156139a2576139a2613fd3565b6040519080825280601f01601f1916602001820160405280156139cc576020820181803683370190505b50905060018501602082018788518901602081018051600082525b82841015613a42576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f81168701518653506001850194506139e7565b905250508515613a8357600388510660018114613a665760028114613a7957613a81565b603d6001830353603d6002830353613a81565b603d60018303535b505b50909695505050505050565b805115613a9f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080600080600160601b63ffffffff60c01b0319876002099350600160601b63ffffffff60c01b03198485099150600160601b63ffffffff60c01b03198289099050600160601b63ffffffff60c01b03198285099250600160601b63ffffffff60c01b03198683099150600160601b63ffffffff60c01b031980600160601b63ffffffff60c01b0319888b08600160601b63ffffffff60c01b031989600160601b63ffffffff60c01b0319038c08096003099550600160601b63ffffffff60c01b031980826002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319888909089350600160601b63ffffffff60c01b03198085600160601b63ffffffff60c01b031903830887099750600160601b63ffffffff60c01b03198584099050600160601b63ffffffff60c01b031980888509600160601b63ffffffff60c01b03190389089250945094509450949050565b60008060008088600003613c3257508492508391506001905080613d8a565b600160601b63ffffffff60c01b0319988903988981898809089450600160601b63ffffffff60c01b03198a600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b03198a8909089550600160601b63ffffffff60c01b03198687099350600160601b63ffffffff60c01b03198685099250600160601b63ffffffff60c01b03198489099150600160601b63ffffffff60c01b03198388099050600160601b63ffffffff60c01b0319848b099750600160601b63ffffffff60c01b031980896002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b031985600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b0319898a0908089350600160601b63ffffffff60c01b031980848b09600160601b63ffffffff60c01b031987600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b0319038d08090892505b9650965096509692505050565b6000806000613da584613e04565b9050600160601b63ffffffff60c01b031981870991506000600160601b63ffffffff60c01b03198287099050600160601b63ffffffff60c01b03198182099150600160601b63ffffffff60c01b03198289099350505094509492505050565b600060405160208152602080820152602060408201528260608201526002600160601b0363ffffffff60c01b03196080820152600160601b63ffffffff60c01b031960a082015260208160c0836005600019fa61313157600080fd5b508054600082559060005260206000209081019061094e91905b80821115613e8e5760008155600101613e7a565b5090565b600060208284031215613ea457600080fd5b81356001600160e01b03198116811461088d57600080fd5b6001600160a01b038116811461094e57600080fd5b803561189581613ebc565b60008083601f840112613eee57600080fd5b5081356001600160401b03811115613f0557600080fd5b6020830191508360208260051b8501011115613f2057600080fd5b9250929050565b60008060008060008060006080888a031215613f4257600080fd5b8735613f4d81613ebc565b965060208801356001600160401b0380821115613f6957600080fd5b613f758b838c01613edc565b909850965060408a0135915080821115613f8e57600080fd5b613f9a8b838c01613edc565b909650945060608a0135915080821115613fb357600080fd5b50613fc08a828b01613edc565b989b979a50959850939692959293505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561401157614011613fd3565b604052919050565b60006001600160401b0382111561403257614032613fd3565b50601f01601f191660200190565b600082601f83011261405157600080fd5b813561406461405f82614019565b613fe9565b81815284602083860101111561407957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156140ac57600080fd5b84356140b781613ebc565b935060208501356140c781613ebc565b92506040850135915060608501356001600160401b038111156140e957600080fd5b6140f587828801614040565b91505092959194509250565b60008083601f84011261411357600080fd5b5081356001600160401b0381111561412a57600080fd5b602083019150836020828501011115613f2057600080fd5b60008060006040848603121561415757600080fd5b8335925060208401356001600160401b0381111561417457600080fd5b61418086828701614101565b9497909650939450505050565b6000806000606084860312156141a257600080fd5b83356001600160401b038111156141b857600080fd5b840161012081870312156141cb57600080fd5b95602085013595506040909401359392505050565b6000606082840312156141f257600080fd5b50919050565b60006020828403121561420a57600080fd5b81356001600160401b0381111561422057600080fd5b61086d848285016141e0565b6020808252825182820181905260009190848201906040850190845b81811015613a8357835183529284019291840191600101614248565b6000806020838503121561427757600080fd5b82356001600160401b0381111561428d57600080fd5b61429985828601613edc565b90969095509350505050565b6000602082840312156142b757600080fd5b81356001600160c01b038116811461088d57600080fd5b6000602082840312156142e057600080fd5b81356001600160401b038111156142f657600080fd5b820160c0818503121561088d57600080fd5b60006020828403121561431a57600080fd5b5035919050565b6000806040838503121561433457600080fd5b823561433f81613ebc565b915060208301356001600160401b0381111561435a57600080fd5b61436685828601614040565b9150509250929050565b801515811461094e57600080fd5b803561189581614370565b600080600080600080600080600060c08a8c0312156143a757600080fd5b893560ff811681146143b857600080fd5b98506143c660208b01613ed1565b975060408a01356001600160401b03808211156143e257600080fd5b6143ee8d838e01613edc565b909950975060608c013591508082111561440757600080fd5b6144138d838e01613edc565b909750955060808c013591508082111561442c57600080fd5b506144398c828d01613edc565b909450925061444c905060a08b0161437e565b90509295985092959850929598565b6000806040838503121561446e57600080fd5b823561447981613ebc565b946020939093013593505050565b60005b838110156144a257818101518382015260200161448a565b50506000910152565b600081518084526144c3816020860160208601614487565b601f01601f19169290920160200192915050565b60208152600061088d60208301846144ab565b600082601f8301126144fb57600080fd5b813560206001600160401b0382111561451657614516613fd3565b8160051b614525828201613fe9565b928352848101820192828101908785111561453f57600080fd5b83870192505b8483101561455e57823582529183019190830190614545565b979650505050505050565b600080600080600060a0868803121561458157600080fd5b853561458c81613ebc565b9450602086013561459c81613ebc565b935060408601356001600160401b03808211156145b857600080fd5b6145c489838a016144ea565b945060608801359150808211156145da57600080fd5b6145e689838a016144ea565b935060808801359150808211156145fc57600080fd5b5061460988828901614040565b9150509295509295909350565b6000806000806060858703121561462c57600080fd5b84356001600160401b0381111561464257600080fd5b61464e87828801614101565b90989097506020870135966040013595509350505050565b6000806020838503121561467957600080fd5b82356001600160401b0381111561468f57600080fd5b61429985828601614101565b6000806000604084860312156146b057600080fd5b83356001600160401b03808211156146c757600080fd5b6146d387838801614101565b909550935060208601359150808211156146ec57600080fd5b506146f9868287016141e0565b9150509250925092565b600080600080600060a0868803121561471b57600080fd5b853561472681613ebc565b9450602086013561473681613ebc565b9350604086013592506060860135915060808601356001600160401b0381111561475f57600080fd5b61460988828901614040565b60006020828403121561477d57600080fd5b813561088d81613ebc565b60006020828403121561479a57600080fd5b5051919050565b6000808335601e198436030181126147b857600080fd5b83016020810192503590506001600160401b038111156147d757600080fd5b803603821315613f2057600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b888110156148c257858403601f19018a52823536899003605e1901811261484e578283fd5b88016060813561485d81613ebc565b6001600160a01b03168652614874828801836147a1565b828989015261488683890182846147e6565b925050506040614898818401846147a1565b9350878303828901526148ac8385836147e6565b9d89019d97505050938601935050600101614829565b509198975050505050505050565b60208152600082356148e181613ebc565b6001600160a01b039081166020848101919091528401359061490282613ebc565b80821660408501525050604083013560608301526060830135601e1984360301811261492d57600080fd5b83016020810190356001600160401b0381111561494957600080fd5b8060051b360382131561495b57600080fd5b60c0608085015261497060e08501828461480f565b915050608084013560a084015261498a60a08501856147a1565b848303601f190160c08601526124338382846147e6565b805161189581614370565b6000602082840312156149be57600080fd5b815161088d81614370565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156107e2576107e26149d9565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b604081526000614a426040830185876147e6565b82810360208401528335614a5581613ebc565b6001600160a01b0316815260208481013590820152614a7760408501856147a1565b606060408401526123ce6060840182846147e6565b6000808335601e19843603018112614aa357600080fd5b8301803591506001600160401b03821115614abd57600080fd5b602001915036819003821315613f2057600080fd5b60008085851115614ae257600080fd5b83861115614aef57600080fd5b5050820193919092039150565b803560208310156107e257600019602084900360031b1b1692915050565b83815282151560208201526060604082015260006112a360608301846144ab565b60008235605e19833603018112614b5157600080fd5b9190910192915050565b606081526000614b6f6060830186886147e6565b6020830194909452506040015292915050565b60008251614b51818460208701614487565b634e487b7160e01b600052602160045260246000fd5b600080600060608486031215614bbf57600080fd5b8351925060208401519150604084015190509250925092565b600082614bf557634e487b7160e01b600052601260045260246000fd5b500490565b600082601f830112614c0b57600080fd5b8151614c1961405f82614019565b818152846020838601011115614c2e57600080fd5b61086d826020830160208701614487565b600080600080600080600080610100898b031215614c5c57600080fd5b88519750602089015196506040890151955060608901516001600160401b0380821115614c8857600080fd5b614c948c838d01614bfa565b9650614ca260808c016149a1565b955060a08b0151915080821115614cb857600080fd5b614cc48c838d01614bfa565b945060c08b0151915080821115614cda57600080fd5b50614ce78b828c01614bfa565b92505060e089015190509295985092959890939650565b60008451614d10818460208901614487565b845190830190614d24818360208901614487565b8451910190614d37818360208801614487565b0195945050505050565b60008351614d53818460208801614487565b9190910191825250602001919050565b808201808211156107e2576107e26149d9565b80820281158282048414176107e2576107e26149d956fea2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694900a2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694902ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212208ea6494b631dfbdfca458a1c0a52311f1cf61e8c8eacea1ff8b3b6e773897baa64736f6c63430008170033000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d780000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x2", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x07c7bb6ffcb9def5f803f0ce9e97f21c8f53b11945f946bb726a470c808dfbc4", + "transactionType": "CREATE2", + "contractName": "AllowedCalldataEnforcer", + "contractAddress": "0x48db3835a873d64a4af2c09f014052407c003bd7", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x7ac98", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061059c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610085575b600080fd5b61005961005436600461035a565b61009d565b005b61006e61006936600461041d565b61020c565b60405161007c92919061045f565b60405180910390f35b61005961009336600461035a565b5050505050505050565b60006060806100ac8b8b61020c565b805191945092506100c060408901896104b6565b90506100cc82866104fd565b11156101375760405162461bcd60e51b815260206004820152602f60248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d60448201526e0c6c2d8d8c8c2e8c25ad8cadccee8d608b1b60648201526084015b60405180910390fd5b61014460408901896104b6565b859061015084836104fd565b9261015d9392919061051e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509294506101a192508491508590506102d9565b6101fe5760405162461bcd60e51b815260206004820152602860248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d60448201526763616c6c6461746160c01b606482015260840161012e565b505050505050505050505050565b6000606060218310156102745760405162461bcd60e51b815260206004820152602a60248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d6044820152697465726d732d73697a6560b01b606482015260840161012e565b61028260206000858761051e565b61028b91610548565b915061029a836020818761051e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250949792965091945050505050565b6000818051906020012083805190602001201490505b92915050565b60008083601f84011261030757600080fd5b50813567ffffffffffffffff81111561031f57600080fd5b60208301915083602082850101111561033757600080fd5b9250929050565b80356001600160a01b038116811461035557600080fd5b919050565b60008060008060008060008060c0898b03121561037657600080fd5b883567ffffffffffffffff8082111561038e57600080fd5b61039a8c838d016102f5565b909a50985060208b01359150808211156103b357600080fd5b6103bf8c838d016102f5565b909850965060408b01359150808211156103d857600080fd5b5089016060818c0312156103eb57600080fd5b93506060890135925061040060808a0161033e565b915061040e60a08a0161033e565b90509295985092959890939650565b6000806020838503121561043057600080fd5b823567ffffffffffffffff81111561044757600080fd5b610453858286016102f5565b90969095509350505050565b8281526000602060406020840152835180604085015260005b8181101561049457858101830151858201606001528201610478565b506000606082860101526060601f19601f830116850101925050509392505050565b6000808335601e198436030181126104cd57600080fd5b83018035915067ffffffffffffffff8211156104e857600080fd5b60200191503681900382131561033757600080fd5b808201808211156102ef57634e487b7160e01b600052601160045260246000fd5b6000808585111561052e57600080fd5b8386111561053b57600080fd5b5050820193919092039150565b803560208310156102ef57600019602084900360031b1b169291505056fea264697066735822122094149f339193c37892b2442e24526e5fff221c6592b2b7cd87732677fcc1c9c464736f6c63430008170033", + "nonce": "0x3", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb982a6be26b531e650ed2ff00679111e6eba9932a64780a001d75030c5636e96", + "transactionType": "CREATE2", + "contractName": "AllowedMethodsEnforcer", + "contractAddress": "0xfd731951bf1c52afccee3e6f14ab656475b76dd4", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x8ba05", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610683806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610084575b600080fd5b6100596100543660046103a7565b61009c565b005b61006e61006936600461046a565b6101ff565b60405161007b91906104ac565b60405180910390f35b6100596100923660046103a7565b5050505050505050565b60046100ab60408601866104fa565b9050101561011a5760405162461bcd60e51b815260206004820152603160248201527f416c6c6f7765644d6574686f6473456e666f726365723a696e76616c69642d616044820152700c6e8d2dedc5ac8c2e8c25ad8cadccee8d607b1b60648201526084015b60405180910390fd5b600061012960408601866104fa565b61013891600491600091610541565b6101419161056b565b9050600061014f8a8a6101ff565b805190915060005b818110156101a4578281815181106101715761017161059b565b60200260200101516001600160e01b031916846001600160e01b0319160361019c5750505050610092565b600101610157565b5060405162461bcd60e51b815260206004820152602960248201527f416c6c6f7765644d6574686f6473456e666f726365723a6d6574686f642d6e6f6044820152681d0b585b1b1bddd95960ba1b6064820152608401610111565b606060008261020f6004826105c7565b156102705760405162461bcd60e51b815260206004820152602b60248201527f416c6c6f7765644d6574686f6473456e666f726365723a696e76616c69642d7460448201526a0cae4dae65ad8cadccee8d60ab1b6064820152608401610111565b61027b6004826105f1565b67ffffffffffffffff81111561029357610293610605565b6040519080825280602002602001820160405280156102bc578160200160208202803683370190505b50925060005b81811015610339578581866102d882600461061b565b926102e593929190610541565b6102ee9161056b565b8484815181106103005761030061059b565b6001600160e01b0319909216602092830291909101909101528261032381610634565b9350610332905060048261061b565b90506102c2565b50505092915050565b60008083601f84011261035457600080fd5b50813567ffffffffffffffff81111561036c57600080fd5b60208301915083602082850101111561038457600080fd5b9250929050565b80356001600160a01b03811681146103a257600080fd5b919050565b60008060008060008060008060c0898b0312156103c357600080fd5b883567ffffffffffffffff808211156103db57600080fd5b6103e78c838d01610342565b909a50985060208b013591508082111561040057600080fd5b61040c8c838d01610342565b909850965060408b013591508082111561042557600080fd5b5089016060818c03121561043857600080fd5b93506060890135925061044d60808a0161038b565b915061045b60a08a0161038b565b90509295985092959890939650565b6000806020838503121561047d57600080fd5b823567ffffffffffffffff81111561049457600080fd5b6104a085828601610342565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156104ee5783516001600160e01b031916835292840192918401916001016104c8565b50909695505050505050565b6000808335601e1984360301811261051157600080fd5b83018035915067ffffffffffffffff82111561052c57600080fd5b60200191503681900382131561038457600080fd5b6000808585111561055157600080fd5b8386111561055e57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156105935780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826105d6576105d66105b1565b500690565b634e487b7160e01b600052601160045260246000fd5b600082610600576106006105b1565b500490565b634e487b7160e01b600052604160045260246000fd5b8082018082111561062e5761062e6105db565b92915050565b600060018201610646576106466105db565b506001019056fea26469706673582212204ec9b63db8ffcc611dbc205c0eb5d3daa906537fc4f6d216704a61e004393bed64736f6c63430008170033", + "nonce": "0x4", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x71ce225e8ee95b2ad11f5c6063ed5f77c6d82256e162f10c62823940e0341385", + "transactionType": "CREATE2", + "contractName": "AllowedTargetsEnforcer", + "contractAddress": "0xbc8673c0afa52d86d991c06881e55b2966920564", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x7f38f", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b506105d9806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610084575b600080fd5b61005961005436600461031e565b61009c565b005b61006e6100693660046103e1565b610174565b60405161007b9190610423565b60405180910390f35b61005961009236600461031e565b5050505050505050565b60006100ab6020860186610470565b905060006100b98a8a610174565b805190915060005b8181101561010c578281815181106100db576100db610492565b60200260200101516001600160a01b0316846001600160a01b0316036101045750505050610092565b6001016100c1565b5060405162461bcd60e51b815260206004820152603160248201527f416c6c6f77656454617267657473456e666f726365723a7461726765742d6164604482015270191c995cdccb5b9bdd0b585b1b1bddd959607a1b60648201526084015b60405180910390fd5b60606000826101846014826104be565b156101e55760405162461bcd60e51b815260206004820152602b60248201527f416c6c6f77656454617267657473456e666f726365723a696e76616c69642d7460448201526a0cae4dae65ad8cadccee8d60ab1b606482015260840161016b565b6101f06014826104e8565b67ffffffffffffffff811115610208576102086104fc565b604051908082528060200260200182016040528015610231578160200160208202803683370190505b50925060005b818110156102b05785818661024d826014610512565b9261025a9392919061052b565b61026391610555565b60601c84848151811061027857610278610492565b6001600160a01b03909216602092830291909101909101528261029a8161058a565b93506102a99050601482610512565b9050610237565b50505092915050565b60008083601f8401126102cb57600080fd5b50813567ffffffffffffffff8111156102e357600080fd5b6020830191508360208285010111156102fb57600080fd5b9250929050565b80356001600160a01b038116811461031957600080fd5b919050565b60008060008060008060008060c0898b03121561033a57600080fd5b883567ffffffffffffffff8082111561035257600080fd5b61035e8c838d016102b9565b909a50985060208b013591508082111561037757600080fd5b6103838c838d016102b9565b909850965060408b013591508082111561039c57600080fd5b5089016060818c0312156103af57600080fd5b9350606089013592506103c460808a01610302565b91506103d260a08a01610302565b90509295985092959890939650565b600080602083850312156103f457600080fd5b823567ffffffffffffffff81111561040b57600080fd5b610417858286016102b9565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156104645783516001600160a01b03168352928401929184019160010161043f565b50909695505050505050565b60006020828403121561048257600080fd5b61048b82610302565b9392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826104cd576104cd6104a8565b500690565b634e487b7160e01b600052601160045260246000fd5b6000826104f7576104f76104a8565b500490565b634e487b7160e01b600052604160045260246000fd5b80820180821115610525576105256104d2565b92915050565b6000808585111561053b57600080fd5b8386111561054857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156105825780818660140360031b1b83161692505b505092915050565b60006001820161059c5761059c6104d2565b506001019056fea26469706673582212204a2e5d298e85989e2cc1b01eb90837481124fb817e6ba907174cafb6c568768564736f6c63430008170033", + "nonce": "0x5", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x12ad77ff78b9eded143f1ffacbbf1a19197fda7a31836b879c21b2f0b1a97b51", + "transactionType": "CREATE2", + "contractName": "BlockNumberEnforcer", + "contractAddress": "0xc15faffa0d879b9263c15a46ce31eacfa2e0e8ae", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6942b", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061045b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610092575b600080fd5b6100596100543660046102bd565b6100aa565b005b61006e610069366004610380565b6101b6565b604080516001600160801b0393841681529290911660208301520160405180910390f35b6100596100a03660046102bd565b5050505050505050565b6000806100b78a8a6101b6565b90925090506001600160801b0382161561013457816001600160801b031643116101345760405162461bcd60e51b8152602060048201526024808201527f426c6f636b4e756d626572456e666f726365723a6561726c792d64656c6567616044820152633a34b7b760e11b60648201526084015b60405180910390fd5b6001600160801b038116156101aa57806001600160801b031643106101aa5760405162461bcd60e51b815260206004820152602660248201527f426c6f636b4e756d626572456e666f726365723a657870697265642d64656c6560448201526533b0ba34b7b760d11b606482015260840161012b565b50505050505050505050565b6000806020831461021a5760405162461bcd60e51b815260206004820152602860248201527f426c6f636b4e756d626572456e666f726365723a696e76616c69642d7465726d6044820152670e65ad8cadccee8d60c31b606482015260840161012b565b6102286010600085876103c2565b610231916103ec565b60801c915061024383601081876103c2565b61024c916103ec565b60801c90509250929050565b60008083601f84011261026a57600080fd5b50813567ffffffffffffffff81111561028257600080fd5b60208301915083602082850101111561029a57600080fd5b9250929050565b80356001600160a01b03811681146102b857600080fd5b919050565b60008060008060008060008060c0898b0312156102d957600080fd5b883567ffffffffffffffff808211156102f157600080fd5b6102fd8c838d01610258565b909a50985060208b013591508082111561031657600080fd5b6103228c838d01610258565b909850965060408b013591508082111561033b57600080fd5b5089016060818c03121561034e57600080fd5b93506060890135925061036360808a016102a1565b915061037160a08a016102a1565b90509295985092959890939650565b6000806020838503121561039357600080fd5b823567ffffffffffffffff8111156103aa57600080fd5b6103b685828601610258565b90969095509350505050565b600080858511156103d257600080fd5b838611156103df57600080fd5b5050820193919092039150565b6fffffffffffffffffffffffffffffffff19813581811691601085101561041d5780818660100360031b1b83161692505b50509291505056fea26469706673582212202f1df071a3b936ee3ad015758f36f43130359bf66ac06d4703490535de194a3864736f6c63430008170033", + "nonce": "0x6", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xc76222c57cd0bba8963e9a489018fa29729e6e8a7a9cad5d95347366f66f099d", + "transactionType": "CREATE2", + "contractName": "DeployedEnforcer", + "contractAddress": "0x5accb9559b56a6c1e3f90e342c85c42d93720d43", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x8f463", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b506106b5806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063481286e6146100515780639751a83d14610081578063b99deb0e14610096578063de723eeb146100b8575b600080fd5b61006461005f366004610410565b6100d0565b6040516001600160a01b0390911681526020015b60405180910390f35b61009461008f366004610497565b6100e5565b005b6100a96100a436600461055a565b6101e4565b6040516100789392919061059c565b6100946100c6366004610497565b5050505050505050565b60006100dc82846102ca565b90505b92915050565b60008060006100f48b8b6101e4565b919450925090506001600160a01b0383163b1561014f576040516001600160a01b03841681527f641dafeb23238fae3ef71c64fced975da90c34dede63890507f3dda6b1e0dfef9060200160405180910390a15050506100c6565b600061015b82846102d7565b9050836001600160a01b0316816001600160a01b0316146101d65760405162461bcd60e51b815260206004820152602a60248201527f4465706c6f796564456e666f726365723a6465706c6f7965642d6164647265736044820152690e65adad2e6dac2e8c6d60b31b60648201526084015b60405180910390fd5b505050505050505050505050565b6000806060603484116102475760405162461bcd60e51b815260206004820152602560248201527f4465706c6f796564456e666f726365723a696e76616c69642d7465726d732d6c6044820152640cadccee8d60db1b60648201526084016101cd565b610255601460008688610602565b61025e9161062c565b60601c9250610271603460148688610602565b61027a91610661565b91506102898460348188610602565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509598949750919550929350505050565b60006100dc83833061035f565b60006102e560008385610389565b9050806001600160a01b03163b60000361031d576040516352c7cd4960e11b81526001600160a01b03821660048201526024016101cd565b6040516001600160a01b03821681527faf3c4b03f515b5a38f3c238fdc24abf10854a2f27f2a85743a71de17e9bc7e7f9060200160405180910390a192915050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6000834710156103b55760405163392efb2b60e21b8152476004820152602481018590526044016101cd565b81516000036103d757604051631328927760e21b815260040160405180910390fd5b8282516020840186f590506001600160a01b03811661040957604051633a0ba96160e11b815260040160405180910390fd5b9392505050565b6000806040838503121561042357600080fd5b50508035926020909101359150565b60008083601f84011261044457600080fd5b50813567ffffffffffffffff81111561045c57600080fd5b60208301915083602082850101111561047457600080fd5b9250929050565b80356001600160a01b038116811461049257600080fd5b919050565b60008060008060008060008060c0898b0312156104b357600080fd5b883567ffffffffffffffff808211156104cb57600080fd5b6104d78c838d01610432565b909a50985060208b01359150808211156104f057600080fd5b6104fc8c838d01610432565b909850965060408b013591508082111561051557600080fd5b5089016060818c03121561052857600080fd5b93506060890135925061053d60808a0161047b565b915061054b60a08a0161047b565b90509295985092959890939650565b6000806020838503121561056d57600080fd5b823567ffffffffffffffff81111561058457600080fd5b61059085828601610432565b90969095509350505050565b60018060a01b03841681526000602084602084015260606040840152835180606085015260005b818110156105df578581018301518582016080015282016105c3565b506000608082860101526080601f19601f83011685010192505050949350505050565b6000808585111561061257600080fd5b8386111561061f57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106595780818660140360031b1b83161692505b505092915050565b803560208310156100df57600019602084900360031b1b169291505056fea2646970667358221220adae6ada7a0e210e98db78555afd35a3b834fe39e89d1ae92e20b35e9cc9358664736f6c63430008170033", + "nonce": "0x7", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x05653e8b67b12ea98443d499c0c21b3f3176bf1b9dc52470ef315ae2328f6129", + "transactionType": "CREATE2", + "contractName": "ERC20BalanceGteEnforcer", + "contractAddress": "0xb5d6b1ec6d868a3bae5b7f48178eaa2686a7a087", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xa3337", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061074a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806332a16f4e146100675780638678d6ef1461009f5780639751a83d146100c0578063b5e54492146100d5578063b99deb0e146100f5578063de723eeb14610127575b600080fd5b61008a61007536600461049d565b60016020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100b26100ad3660046104d2565b61013a565b604051908152602001610096565b6100d36100ce366004610557565b61014f565b005b6100b26100e336600461049d565b60006020819052908152604090205481565b61010861010336600461061a565b610289565b604080516001600160a01b039093168352602083019190915201610096565b6100d3610135366004610557565b61032f565b600061014784848461045a565b949350505050565b600061015b8989610289565b509050600061016b33838761045a565b60008181526001602052604090205490915060ff16156101e55760405162461bcd60e51b815260206004820152602a60248201527f455243323042616c616e6365477465456e666f726365723a656e666f726365726044820152690b5a5ccb5b1bd8dad95960b21b60648201526084015b60405180910390fd5b6000818152600160208190526040808320805460ff1916909217909155516370a0823160e01b81526001600160a01b0386811660048301528416906370a0823190602401602060405180830381865afa158015610246573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026a919061065c565b6000928352602083905260409092209190915550505050505050505050565b600080603483146102f15760405162461bcd60e51b815260206004820152602c60248201527f455243323042616c616e6365477465456e666f726365723a696e76616c69642d60448201526b0e8cae4dae65ad8cadccee8d60a31b60648201526084016101dc565b6102ff601460008587610675565b6103089161069f565b60601c915061031a8360148187610675565b610323916106d4565b60001c90509250929050565b60008061033c8a8a610289565b91509150600061034d33848861045a565b600081815260016020526040808220805460ff19169055516370a0823160e01b81526001600160a01b03888116600483015292935090918516906370a0823190602401602060405180830381865afa1580156103ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d1919061065c565b6000838152602081905260409020549091506103ee9084906106f3565b81101561044c5760405162461bcd60e51b815260206004820152602660248201527f455243323042616c616e6365477465456e666f726365723a62616c616e63652d6044820152651b9bdd0b59dd60d21b60648201526084016101dc565b505050505050505050505050565b604080516001600160a01b039485166020808301919091529390941684820152606080850192909252805180850390920182526080909301909252815191012090565b6000602082840312156104af57600080fd5b5035919050565b80356001600160a01b03811681146104cd57600080fd5b919050565b6000806000606084860312156104e757600080fd5b6104f0846104b6565b92506104fe602085016104b6565b9150604084013590509250925092565b60008083601f84011261052057600080fd5b50813567ffffffffffffffff81111561053857600080fd5b60208301915083602082850101111561055057600080fd5b9250929050565b60008060008060008060008060c0898b03121561057357600080fd5b883567ffffffffffffffff8082111561058b57600080fd5b6105978c838d0161050e565b909a50985060208b01359150808211156105b057600080fd5b6105bc8c838d0161050e565b909850965060408b01359150808211156105d557600080fd5b5089016060818c0312156105e857600080fd5b9350606089013592506105fd60808a016104b6565b915061060b60a08a016104b6565b90509295985092959890939650565b6000806020838503121561062d57600080fd5b823567ffffffffffffffff81111561064457600080fd5b6106508582860161050e565b90969095509350505050565b60006020828403121561066e57600080fd5b5051919050565b6000808585111561068557600080fd5b8386111561069257600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106cc5780818660140360031b1b83161692505b505092915050565b803560208310156106ed57600019602084900360031b1b165b92915050565b808201808211156106ed57634e487b7160e01b600052601160045260246000fdfea2646970667358221220706a4bd5217d105228b49e7ecb48d785e4c5a4cbd88c1e0018e40907dafc0c9d64736f6c63430008170033", + "nonce": "0x8", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x77a5cbe90102a2e3c410fce45de35b1b8573510a680b4ae50092f74ace974ff7", + "transactionType": "CREATE2", + "contractName": "ERC20TransferAmountEnforcer", + "contractAddress": "0x92ac423b9c111962179a6242e1adb58d02c103be", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x990f4", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061073b806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80639751a83d146100515780639dd5d9ab14610066578063b99deb0e146100a1578063de723eeb146100d3575b600080fd5b61006461005f366004610480565b6100eb565b005b61008e610074366004610543565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b6100b46100af36600461056d565b610383565b604080516001600160a01b039093168352602083019190915201610098565b6100646100e1366004610480565b5050505050505050565b6100f860408501856105af565b90506044146101565760405162461bcd60e51b815260206004820152603160248201526000805160206106e68339815191526044820152700d8d2c85ac2c6e8d2dedc5ad8cadccee8d607b1b60648201526084015b60405180910390fd5b6000806101638a8a610383565b9092509050600061017760208801886105f6565b905063a9059cbb60e01b6001600160a01b03848116908316146101df5760405162461bcd60e51b815260206004820152602c60248201526000805160206106e683398151915260448201526b1b1a590b58dbdb9d1c9858dd60a21b606482015260840161014d565b60006101ee60408a018a6105af565b6101fd91600491600091610618565b61020691610642565b90506001600160e01b0319808216908316146102655760405162461bcd60e51b815260206004820152602a60248201526000805160206106e68339815191526044820152691b1a590b5b595d1a1bd960b21b606482015260840161014d565b600061027460408b018b6105af565b61028391604491602491610618565b61028c91610672565b336000908152602081815260408083208d845290915281208054929350909183919083906102bb908490610691565b92505081905590508581111561032a5760405162461bcd60e51b815260206004820152602e60248201527f45524332305472616e73666572416d6f756e74456e666f726365723a616c6c6f60448201526d1dd85b98d94b595e18d95959195960921b606482015260840161014d565b60408051878152602081018390528b916001600160a01b038b169133917fc026e493323d526061a052b5dd562495120e2f648797a48be61966d3a6beec8d910160405180910390a4505050505050505050505050505050565b600080603483146103dd5760405162461bcd60e51b815260206004820152603060248201526000805160206106e683398151915260448201526f0d8d2c85ae8cae4dae65ad8cadccee8d60831b606482015260840161014d565b6103eb601460008587610618565b6103f4916106b2565b60601c91506104068360148187610618565b61040f91610672565b60001c90509250929050565b60008083601f84011261042d57600080fd5b50813567ffffffffffffffff81111561044557600080fd5b60208301915083602082850101111561045d57600080fd5b9250929050565b80356001600160a01b038116811461047b57600080fd5b919050565b60008060008060008060008060c0898b03121561049c57600080fd5b883567ffffffffffffffff808211156104b457600080fd5b6104c08c838d0161041b565b909a50985060208b01359150808211156104d957600080fd5b6104e58c838d0161041b565b909850965060408b01359150808211156104fe57600080fd5b5089016060818c03121561051157600080fd5b93506060890135925061052660808a01610464565b915061053460a08a01610464565b90509295985092959890939650565b6000806040838503121561055657600080fd5b61055f83610464565b946020939093013593505050565b6000806020838503121561058057600080fd5b823567ffffffffffffffff81111561059757600080fd5b6105a38582860161041b565b90969095509350505050565b6000808335601e198436030181126105c657600080fd5b83018035915067ffffffffffffffff8211156105e157600080fd5b60200191503681900382131561045d57600080fd5b60006020828403121561060857600080fd5b61061182610464565b9392505050565b6000808585111561062857600080fd5b8386111561063557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561066a5780818660040360031b1b83161692505b505092915050565b8035602083101561068b57600019602084900360031b1b165b92915050565b8082018082111561068b57634e487b7160e01b600052601160045260246000fd5b6bffffffffffffffffffffffff19813581811691601485101561066a5760149490940360031b84901b169092169291505056fe45524332305472616e73666572416d6f756e74456e666f726365723a696e7661a2646970667358221220bbaa47e7ff7ca5d260ee2e4ae44f60d5ed447ee0a25335e020538968f33cc37d64736f6c63430008170033", + "nonce": "0x9", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x7c20f2fe73f6e1d797edc21935033daccf9cf96e52a96ec47cbd3d3d4d716906", + "transactionType": "CREATE2", + "contractName": "IdEnforcer", + "contractAddress": "0x34152d9f3f8f74338d50703e780389e829b4abac", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x667df", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610486806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063595dce48146100515780639751a83d14610079578063b99deb0e1461008e578063de723eeb146100af575b600080fd5b61006461005f3660046102a8565b6100c7565b60405190151581526020015b60405180910390f35b61008c61008736600461032d565b6100fe565b005b6100a161009c3660046103f0565b610204565b604051908152602001610070565b61008c6100bd36600461032d565b5050505050505050565b6001600160a01b0380841660009081526020818152604080832093861683529290529081206100f69083610267565b949350505050565b600061010a8989610204565b90506101173384836100c7565b156101695760405162461bcd60e51b815260206004820152601a60248201527f4964456e666f726365723a69642d616c72656164792d7573656400000000000060448201526064015b60405180910390fd5b336000908152602081815260408083206001600160a01b03871684528252808320600885901c845290915290208054600160ff84161b179055826001600160a01b0316826001600160a01b0316336001600160a01b03167f6286af1aaf28b34723a53056e5608eabb40c823d1ce093ff371cf08c502431d6846040516101f191815260200190565b60405180910390a4505050505050505050565b6000602082146102565760405162461bcd60e51b815260206004820152601f60248201527f4964456e666f726365723a696e76616c69642d7465726d732d6c656e677468006044820152606401610160565b6102608284610432565b9392505050565b600881901c600090815260208390526040902054600160ff83161b1615155b92915050565b80356001600160a01b03811681146102a357600080fd5b919050565b6000806000606084860312156102bd57600080fd5b6102c68461028c565b92506102d46020850161028c565b9150604084013590509250925092565b60008083601f8401126102f657600080fd5b50813567ffffffffffffffff81111561030e57600080fd5b60208301915083602082850101111561032657600080fd5b9250929050565b60008060008060008060008060c0898b03121561034957600080fd5b883567ffffffffffffffff8082111561036157600080fd5b61036d8c838d016102e4565b909a50985060208b013591508082111561038657600080fd5b6103928c838d016102e4565b909850965060408b01359150808211156103ab57600080fd5b5089016060818c0312156103be57600080fd5b9350606089013592506103d360808a0161028c565b91506103e160a08a0161028c565b90509295985092959890939650565b6000806020838503121561040357600080fd5b823567ffffffffffffffff81111561041a57600080fd5b610426858286016102e4565b90969095509350505050565b8035602083101561028657600019602084900360031b1b169291505056fea264697066735822122028074431512be4166d9bc04a0557354e43d233df6620f59dcf4e6fea83a3a51f64736f6c63430008170033", + "nonce": "0xa", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xfd57c21c61ffadeaf8b92a6c2eed0911580a7ee7159462462634e7d64af809a2", + "transactionType": "CREATE2", + "contractName": "LimitedCallsEnforcer", + "contractAddress": "0x4b3adad4a328bee8ba17b86074d92fe7372180cd", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x61904", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610442806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806319054d89146100515780639751a83d1461008b578063b99deb0e146100a0578063de723eeb146100b3575b600080fd5b61007961005f36600461024e565b600060208181529281526040808220909352908152205481565b60405190815260200160405180910390f35b61009e6100993660046102c1565b6100cb565b005b6100796100ae366004610384565b6101bd565b61009e6100c13660046102c1565b5050505050505050565b60006100d789896101bd565b336000908152602081815260408083208884529091528120805492935090918290610101906103c6565b91829055509050818111156101695760405162461bcd60e51b815260206004820152602360248201527f4c696d6974656443616c6c73456e666f726365723a6c696d69742d657863656560448201526219195960ea1b60648201526084015b60405180910390fd5b604080518381526020810183905286916001600160a01b0386169133917f449da07f2c06c9d1a6b19d2454ffe749e8cf991d22f686e076a1a4844c5ff370910160405180910390a450505050505050505050565b6000602082146102215760405162461bcd60e51b815260206004820152602960248201527f4c696d6974656443616c6c73456e666f726365723a696e76616c69642d7465726044820152680dae65ad8cadccee8d60bb1b6064820152608401610160565b61022b82846103ed565b9392505050565b80356001600160a01b038116811461024957600080fd5b919050565b6000806040838503121561026157600080fd5b61026a83610232565b946020939093013593505050565b60008083601f84011261028a57600080fd5b50813567ffffffffffffffff8111156102a257600080fd5b6020830191508360208285010111156102ba57600080fd5b9250929050565b60008060008060008060008060c0898b0312156102dd57600080fd5b883567ffffffffffffffff808211156102f557600080fd5b6103018c838d01610278565b909a50985060208b013591508082111561031a57600080fd5b6103268c838d01610278565b909850965060408b013591508082111561033f57600080fd5b5089016060818c03121561035257600080fd5b93506060890135925061036760808a01610232565b915061037560a08a01610232565b90509295985092959890939650565b6000806020838503121561039757600080fd5b823567ffffffffffffffff8111156103ae57600080fd5b6103ba85828601610278565b90969095509350505050565b6000600182016103e657634e487b7160e01b600052601160045260246000fd5b5060010190565b8035602083101561040657600019602084900360031b1b165b9291505056fea2646970667358221220f78aa8066d472e78f2d898b70704f695cf682a9b2914539b1a5a83b1dd87e31064736f6c63430008170033", + "nonce": "0xb", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xaf5909bb3552ad8ecbca99408b487b63606d882806167605800398c7c941a11b", + "transactionType": "CREATE2", + "contractName": "NonceEnforcer", + "contractAddress": "0x2f32ff3fc3086d7f63f16fe8d0065390d460b40d", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x68e23", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610457806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80632bd4ed211461005c5780639751a83d14610096578063b99deb0e146100ab578063de723eeb146100be578063f5743c4c146100d6575b600080fd5b61008461006a366004610266565b600060208181529281526040808220909352908152205481565b60405190815260200160405180910390f35b6100a96100a43660046102e2565b6100e9565b005b6100846100b93660046103a5565b610178565b6100a96100cc3660046102e2565b5050505050505050565b6100a96100e43660046103e7565b6101e6565b60006100f58989610178565b336000908152602081815260408083206001600160a01b0388168452909152902054909150811461016d5760405162461bcd60e51b815260206004820152601b60248201527f4e6f6e6365456e666f726365723a696e76616c69642d6e6f6e6365000000000060448201526064015b60405180910390fd5b505050505050505050565b6000602082146101d55760405162461bcd60e51b815260206004820152602260248201527f4e6f6e6365456e666f726365723a696e76616c69642d7465726d732d6c656e676044820152610e8d60f31b6064820152608401610164565b6101df8284610402565b9392505050565b6001600160a01b038116600081815260208181526040808320338085529083529281902080546001810190915590518181529093917fe02d340254c92bc3ad96f0fceb790db939e11c669c1f4c8a549d248f17130b33910160405180910390a35050565b80356001600160a01b038116811461026157600080fd5b919050565b6000806040838503121561027957600080fd5b6102828361024a565b91506102906020840161024a565b90509250929050565b60008083601f8401126102ab57600080fd5b50813567ffffffffffffffff8111156102c357600080fd5b6020830191508360208285010111156102db57600080fd5b9250929050565b60008060008060008060008060c0898b0312156102fe57600080fd5b883567ffffffffffffffff8082111561031657600080fd5b6103228c838d01610299565b909a50985060208b013591508082111561033b57600080fd5b6103478c838d01610299565b909850965060408b013591508082111561036057600080fd5b5089016060818c03121561037357600080fd5b93506060890135925061038860808a0161024a565b915061039660a08a0161024a565b90509295985092959890939650565b600080602083850312156103b857600080fd5b823567ffffffffffffffff8111156103cf57600080fd5b6103db85828601610299565b90969095509350505050565b6000602082840312156103f957600080fd5b6101df8261024a565b8035602083101561041b57600019602084900360031b1b165b9291505056fea2646970667358221220b8ac9ab0759f02df69d888b08c000fa4dfa4048ad7f88931687eeff439dd484a64736f6c63430008170033", + "nonce": "0xc", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x5dc28ca47dee5c10a09386daaa01dabdd7c6ee4e748e1e95edd84483b64db4d2", + "transactionType": "CREATE2", + "contractName": "TimestampEnforcer", + "contractAddress": "0x78e05f779490c24bf3bfa135b4112e7003b321cd", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x68cc4", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610455806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610092575b600080fd5b6100596100543660046102b7565b6100aa565b005b61006e61006936600461037a565b6101b2565b604080516001600160801b0393841681529290911660208301520160405180910390f35b6100596100a03660046102b7565b5050505050505050565b6000806100b78a8a6101b2565b90925090506001600160801b0382161561013357816001600160801b031642116101335760405162461bcd60e51b815260206004820152602260248201527f54696d657374616d70456e666f726365723a6561726c792d64656c656761746960448201526137b760f11b60648201526084015b60405180910390fd5b6001600160801b038116156101a657806001600160801b031642106101a65760405162461bcd60e51b8152602060048201526024808201527f54696d657374616d70456e666f726365723a657870697265642d64656c6567616044820152633a34b7b760e11b606482015260840161012a565b50505050505050505050565b600080602083146102145760405162461bcd60e51b815260206004820152602660248201527f54696d657374616d70456e666f726365723a696e76616c69642d7465726d732d6044820152650d8cadccee8d60d31b606482015260840161012a565b61022183601081876103bc565b61022a916103e6565b60801c905061023d6010600085876103bc565b610246916103e6565b60801c91509250929050565b60008083601f84011261026457600080fd5b50813567ffffffffffffffff81111561027c57600080fd5b60208301915083602082850101111561029457600080fd5b9250929050565b80356001600160a01b03811681146102b257600080fd5b919050565b60008060008060008060008060c0898b0312156102d357600080fd5b883567ffffffffffffffff808211156102eb57600080fd5b6102f78c838d01610252565b909a50985060208b013591508082111561031057600080fd5b61031c8c838d01610252565b909850965060408b013591508082111561033557600080fd5b5089016060818c03121561034857600080fd5b93506060890135925061035d60808a0161029b565b915061036b60a08a0161029b565b90509295985092959890939650565b6000806020838503121561038d57600080fd5b823567ffffffffffffffff8111156103a457600080fd5b6103b085828601610252565b90969095509350505050565b600080858511156103cc57600080fd5b838611156103d957600080fd5b5050820193919092039150565b6fffffffffffffffffffffffffffffffff1981358181169160108510156104175780818660100360031b1b83161692505b50509291505056fea2646970667358221220032d822c6d896afe6d14f1080a0918e2996d1c61fe51449e6ecf5841d50e5ea464736f6c63430008170033", + "nonce": "0xd", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xac746b93bfe440edf52c1b36970057bff853429c26cdfd0a3a782bd0ebd34d5b", + "transactionType": "CREATE2", + "contractName": "ValueLteEnforcer", + "contractAddress": "0xfc20ede0a1132e839fbda9d7ed3904ff3c89540f", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x4e4e9", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061033a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610080575b600080fd5b6100596100543660046101e0565b610098565b005b61006e6100693660046102a3565b61010a565b60405190815260200160405180910390f35b61005961008e3660046101e0565b5050505050505050565b60006100a4898961010a565b905080856020013511156100ff5760405162461bcd60e51b815260206004820152601f60248201527f56616c75654c7465456e666f726365723a76616c75652d746f6f2d686967680060448201526064015b60405180910390fd5b505050505050505050565b60006020821461016a5760405162461bcd60e51b815260206004820152602560248201527f56616c75654c7465456e666f726365723a696e76616c69642d7465726d732d6c6044820152640cadccee8d60db1b60648201526084016100f6565b61017482846102e5565b9392505050565b60008083601f84011261018d57600080fd5b50813567ffffffffffffffff8111156101a557600080fd5b6020830191508360208285010111156101bd57600080fd5b9250929050565b80356001600160a01b03811681146101db57600080fd5b919050565b60008060008060008060008060c0898b0312156101fc57600080fd5b883567ffffffffffffffff8082111561021457600080fd5b6102208c838d0161017b565b909a50985060208b013591508082111561023957600080fd5b6102458c838d0161017b565b909850965060408b013591508082111561025e57600080fd5b5089016060818c03121561027157600080fd5b93506060890135925061028660808a016101c4565b915061029460a08a016101c4565b90509295985092959890939650565b600080602083850312156102b657600080fd5b823567ffffffffffffffff8111156102cd57600080fd5b6102d98582860161017b565b90969095509350505050565b803560208310156102fe57600019602084900360031b1b165b9291505056fea2646970667358221220cd4bcb89c90c60ef26b293e82752e5ff08228ce4ed86119c5597e63559710ece64736f6c63430008170033", + "nonce": "0xe", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0xe9d053", + "logs": [ + { + "address": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44" + ], + "data": "0x", + "blockHash": "0x1feb8408453b2f6d155c95dc6326fe99c84238f454b5c4ca931fe0dbce2f577b", + "blockNumber": "0x38555db", + "transactionHash": "0xcb39ffe893b9ca1f1c9312c7b2fa2bc55fe118890468834d809012d2bcb4dafd", + "transactionIndex": "0x2b", + "logIndex": "0x155", + "removed": false + }, + { + "address": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "topics": [ + "0x04a46d9007577c7ff1e513b900545162ec25d25991ae3dc60cf26ec01a84806d", + "0x66b07eb328d4931ed5059b98c30f82b100a7e08d3471916eacdd2c66d7688c23", + "0x000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d78" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000089000000000000000000000000000000000000000000000000000000000000001144656c65676174696f6e4d616e6167657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013100000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x1feb8408453b2f6d155c95dc6326fe99c84238f454b5c4ca931fe0dbce2f577b", + "blockNumber": "0x38555db", + "transactionHash": "0xcb39ffe893b9ca1f1c9312c7b2fa2bc55fe118890468834d809012d2bcb4dafd", + "transactionIndex": "0x2b", + "logIndex": "0x156", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x000000000000000000000000127685d6dd6683085da4b6a041efcef1681e5c9c" + ], + "data": "0x00000000000000000000000000000000000000000000000000e66c040f39cb5e000000000000000000000000000000000000000000000001227ca44d7827e26e000000000000000000000000000000000000000000000a4e6d879be7c34d59420000000000000000000000000000000000000000000000012196384968ee1710000000000000000000000000000000000000000000000a4e6e6e07ebd28724a0", + "blockHash": "0x1feb8408453b2f6d155c95dc6326fe99c84238f454b5c4ca931fe0dbce2f577b", + "blockNumber": "0x38555db", + "transactionHash": "0xcb39ffe893b9ca1f1c9312c7b2fa2bc55fe118890468834d809012d2bcb4dafd", + "transactionIndex": "0x2b", + "logIndex": "0x157", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000000000000000040000000000000800000004000000000000000004000000000000000000000008000000000000000041000020000000000000000000000040000000000800001000000001000000100000000000000000000020000000000000000000800000000000080000080000000000000480000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000020040000001000000000000080000000000000000108000000020000000000800000000000000000000000000000000000004000000000000100020", + "type": "0x2", + "transactionHash": "0xcb39ffe893b9ca1f1c9312c7b2fa2bc55fe118890468834d809012d2bcb4dafd", + "transactionIndex": "0x2b", + "blockHash": "0x1feb8408453b2f6d155c95dc6326fe99c84238f454b5c4ca931fe0dbce2f577b", + "blockNumber": "0x38555db", + "gasUsed": "0x1faf25", + "effectiveGasPrice": "0x745c057d8", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xfd2309", + "logs": [ + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0x23ec2cc23b3148473d1cbafb1f34469204caa453c995964fe2bd64b20b0123c2", + "blockNumber": "0x38555dd", + "transactionHash": "0x1b99347a0a496c05b1eebb642cfda3f631c5e2a1d77e3253d93de0ecf274c987", + "transactionIndex": "0x4f", + "logIndex": "0x1bf", + "removed": false + }, + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0xb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d", + "0x000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d78" + ], + "data": "0x", + "blockHash": "0x23ec2cc23b3148473d1cbafb1f34469204caa453c995964fe2bd64b20b0123c2", + "blockNumber": "0x38555dd", + "transactionHash": "0x1b99347a0a496c05b1eebb642cfda3f631c5e2a1d77e3253d93de0ecf274c987", + "transactionIndex": "0x4f", + "logIndex": "0x1c0", + "removed": false + }, + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0xee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a99", + "0x0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032" + ], + "data": "0x", + "blockHash": "0x23ec2cc23b3148473d1cbafb1f34469204caa453c995964fe2bd64b20b0123c2", + "blockNumber": "0x38555dd", + "transactionHash": "0x1b99347a0a496c05b1eebb642cfda3f631c5e2a1d77e3253d93de0ecf274c987", + "transactionIndex": "0x4f", + "logIndex": "0x1c1", + "removed": false + }, + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0x78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d03" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x23ec2cc23b3148473d1cbafb1f34469204caa453c995964fe2bd64b20b0123c2", + "blockNumber": "0x38555dd", + "transactionHash": "0x1b99347a0a496c05b1eebb642cfda3f631c5e2a1d77e3253d93de0ecf274c987", + "transactionIndex": "0x4f", + "logIndex": "0x1c2", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x000000000000000000000000127685d6dd6683085da4b6a041efcef1681e5c9c" + ], + "data": "0x00000000000000000000000000000000000000000000000001585d63fe6a9e780000000000000000000000000000000000000000000000012196384744268836000000000000000000000000000000000000000000000a4e910eff94a520c009000000000000000000000000000000000000000000000001203ddae345bbe9be000000000000000000000000000000000000000000000a4e92675cf8a38b5e81", + "blockHash": "0x23ec2cc23b3148473d1cbafb1f34469204caa453c995964fe2bd64b20b0123c2", + "blockNumber": "0x38555dd", + "transactionHash": "0x1b99347a0a496c05b1eebb642cfda3f631c5e2a1d77e3253d93de0ecf274c987", + "transactionIndex": "0x4f", + "logIndex": "0x1c3", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000002000010000000000000000000000200000000000000000000000000000000000000000000000008000000000020810040000020000010000000000100000000000000000800000000000001000000100000000000000000000000000000000000000000000000000200080000080000000000000080000000000000000008800000000000000000000000080000000000000000000200000020000000000000000000000000000000000000000000000000000004000000000000000000001080000000000080000000004000000100000000000000000000000000000000000000000000000800000000004000100000000100020", + "type": "0x2", + "transactionHash": "0x1b99347a0a496c05b1eebb642cfda3f631c5e2a1d77e3253d93de0ecf274c987", + "transactionIndex": "0x4f", + "blockHash": "0x23ec2cc23b3148473d1cbafb1f34469204caa453c995964fe2bd64b20b0123c2", + "blockNumber": "0x38555dd", + "gasUsed": "0x2f5a14", + "effectiveGasPrice": "0x745c05808", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xac44cd", + "logs": [ + { + "address": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0x04d8fb2b55cd050f64b980790a70cd29f7b82c5008bb17092581d7d74639ee93", + "blockNumber": "0x38555e0", + "transactionHash": "0x8624bfadfd4d2eb8c588453cd80fe052753e6f09d112861fb191b0df983c3fab", + "transactionIndex": "0x25", + "logIndex": "0x118", + "removed": false + }, + { + "address": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "topics": [ + "0xb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d", + "0x000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d78" + ], + "data": "0x", + "blockHash": "0x04d8fb2b55cd050f64b980790a70cd29f7b82c5008bb17092581d7d74639ee93", + "blockNumber": "0x38555e0", + "transactionHash": "0x8624bfadfd4d2eb8c588453cd80fe052753e6f09d112861fb191b0df983c3fab", + "transactionIndex": "0x25", + "logIndex": "0x119", + "removed": false + }, + { + "address": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "topics": [ + "0xee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a99", + "0x0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032" + ], + "data": "0x", + "blockHash": "0x04d8fb2b55cd050f64b980790a70cd29f7b82c5008bb17092581d7d74639ee93", + "blockNumber": "0x38555e0", + "transactionHash": "0x8624bfadfd4d2eb8c588453cd80fe052753e6f09d112861fb191b0df983c3fab", + "transactionIndex": "0x25", + "logIndex": "0x11a", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x00000000000000000000000000000000000000000000000001eb882b438b1548000000000000000000000000000000000000000000000001203ddae008b4d7960000000000000000000000000000000000000000000000162875ca4ab3ad18700000000000000000000000000000000000000000000000011e5252b4c529c24e0000000000000000000000000000000000000000000000162a615275f7382db8", + "blockHash": "0x04d8fb2b55cd050f64b980790a70cd29f7b82c5008bb17092581d7d74639ee93", + "blockNumber": "0x38555e0", + "transactionHash": "0x8624bfadfd4d2eb8c588453cd80fe052753e6f09d112861fb191b0df983c3fab", + "transactionIndex": "0x25", + "logIndex": "0x11b", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000002002010000000000000000000000000000000000000000000000000000200000000000000000008000000000000810040000020000010000000000000000000000000040800000000000001000000100000000000000000000000008000000000000000000000000000080000080000000000000080000000000000000008800000000000000000000000080000000000000000000200000020000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000004000100100000000000000000000000000000000200000000000000800000000000000100000000100000", + "type": "0x2", + "transactionHash": "0x8624bfadfd4d2eb8c588453cd80fe052753e6f09d112861fb191b0df983c3fab", + "transactionIndex": "0x25", + "blockHash": "0x04d8fb2b55cd050f64b980790a70cd29f7b82c5008bb17092581d7d74639ee93", + "blockNumber": "0x38555e0", + "gasUsed": "0x43968c", + "effectiveGasPrice": "0x745c05899", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xa0785b", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x00000000000000000000000000000000000000000000000000286a7941ad16a60000000000000000000000000000000000000000000000011e5252afff8fbdea00000000000000000000000000000000000000000000001648005ee61f18ed230000000000000000000000000000000000000000000000011e29e836bde2a7440000000000000000000000000000000000000000000000164828c95f60c603c9", + "blockHash": "0x12f4ec9850c9f23649c9e02a547f5d9ddf76484ed5d65fa8790fda6664e17981", + "blockNumber": "0x38555e2", + "transactionHash": "0x07c7bb6ffcb9def5f803f0ce9e97f21c8f53b11945f946bb726a470c808dfbc4", + "transactionIndex": "0x3c", + "logIndex": "0x13f", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000002000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000040000000000000000000000000000000000000040800000000000001000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0x07c7bb6ffcb9def5f803f0ce9e97f21c8f53b11945f946bb726a470c808dfbc4", + "transactionIndex": "0x3c", + "blockHash": "0x12f4ec9850c9f23649c9e02a547f5d9ddf76484ed5d65fa8790fda6664e17981", + "blockNumber": "0x38555e2", + "gasUsed": "0x58eb1", + "effectiveGasPrice": "0x745c05aed", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xa6ca2b", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x000000000000000000000000000000000000000000000000002df57c29adb2e00000000000000000000000000000000000000000000000011e29e8364c806a0d0000000000000000000000000000000000000000000000164828c95f60c603c90000000000000000000000000000000000000000000000011dfbf2ba22d2b72d0000000000000000000000000000000000000000000000164856bedb8a73b6a9", + "blockHash": "0x12f4ec9850c9f23649c9e02a547f5d9ddf76484ed5d65fa8790fda6664e17981", + "blockNumber": "0x38555e2", + "transactionHash": "0xb982a6be26b531e650ed2ff00679111e6eba9932a64780a001d75030c5636e96", + "transactionIndex": "0x3d", + "logIndex": "0x140", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000002000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000040000000000000000000000000000000000000040800000000000001000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0xb982a6be26b531e650ed2ff00679111e6eba9932a64780a001d75030c5636e96", + "transactionIndex": "0x3d", + "blockHash": "0x12f4ec9850c9f23649c9e02a547f5d9ddf76484ed5d65fa8790fda6664e17981", + "blockNumber": "0x38555e2", + "gasUsed": "0x651d0", + "effectiveGasPrice": "0x745c05aed", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xac8c41", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x0000000000000000000000000000000000000000000000000029e03d14959b840000000000000000000000000000000000000000000000011dfbf2b9a1e38c7d0000000000000000000000000000000000000000000000164856bedb8a73b6a90000000000000000000000000000000000000000000000011dd2127c8d4df0f900000000000000000000000000000000000000000000001648809f189f09522d", + "blockHash": "0x12f4ec9850c9f23649c9e02a547f5d9ddf76484ed5d65fa8790fda6664e17981", + "blockNumber": "0x38555e2", + "transactionHash": "0x71ce225e8ee95b2ad11f5c6063ed5f77c6d82256e162f10c62823940e0341385", + "transactionIndex": "0x3e", + "logIndex": "0x141", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000002000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000040000000000000000000000000000000000000040800000000000001000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0x71ce225e8ee95b2ad11f5c6063ed5f77c6d82256e162f10c62823940e0341385", + "transactionIndex": "0x3e", + "blockHash": "0x12f4ec9850c9f23649c9e02a547f5d9ddf76484ed5d65fa8790fda6664e17981", + "blockNumber": "0x38555e2", + "gasUsed": "0x5c216", + "effectiveGasPrice": "0x745c05aed", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xb10c1b", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x0000000000000000000000000000000000000000000000000020b8cce2d0881c0000000000000000000000000000000000000000000000011dd2127c17d3221f00000000000000000000000000000000000000000000001648809f189f09522d0000000000000000000000000000000000000000000000011db159af35029a0300000000000000000000000000000000000000000000001648a157e581d9da49", + "blockHash": "0x12f4ec9850c9f23649c9e02a547f5d9ddf76484ed5d65fa8790fda6664e17981", + "blockNumber": "0x38555e2", + "transactionHash": "0x12ad77ff78b9eded143f1ffacbbf1a19197fda7a31836b879c21b2f0b1a97b51", + "transactionIndex": "0x3f", + "logIndex": "0x142", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000002000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000040000000000000000000000000000000000000040800000000000001000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0x12ad77ff78b9eded143f1ffacbbf1a19197fda7a31836b879c21b2f0b1a97b51", + "transactionIndex": "0x3f", + "blockHash": "0x12f4ec9850c9f23649c9e02a547f5d9ddf76484ed5d65fa8790fda6664e17981", + "blockNumber": "0x38555e2", + "gasUsed": "0x47fda", + "effectiveGasPrice": "0x745c05aed", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xb7882f", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x000000000000000000000000000000000000000000000000002f28dc3c526a780000000000000000000000000000000000000000000000011db159aed936214d00000000000000000000000000000000000000000000001648a157e581d9da490000000000000000000000000000000000000000000000011d8230d29ce3b6d500000000000000000000000000000000000000000000001648d080c1be2c44c1", + "blockHash": "0x12f4ec9850c9f23649c9e02a547f5d9ddf76484ed5d65fa8790fda6664e17981", + "blockNumber": "0x38555e2", + "transactionHash": "0xc76222c57cd0bba8963e9a489018fa29729e6e8a7a9cad5d95347366f66f099d", + "transactionIndex": "0x40", + "logIndex": "0x143", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000002000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000040000000000000000000000000000000000000040800000000000001000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0xc76222c57cd0bba8963e9a489018fa29729e6e8a7a9cad5d95347366f66f099d", + "transactionIndex": "0x40", + "blockHash": "0x12f4ec9850c9f23649c9e02a547f5d9ddf76484ed5d65fa8790fda6664e17981", + "blockNumber": "0x38555e2", + "gasUsed": "0x67c14", + "effectiveGasPrice": "0x745c05aed", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x10e03f8", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x0000000000000000000000000000000000000000000000000032bc06b33d13020000000000000000000000000000000000000000000000011d8230d218963ac900000000000000000000000000000000000000000000001668b7b238a719b82c0000000000000000000000000000000000000000000000011d4f74cb655927c700000000000000000000000000000000000000000000001668ea6e3f5a56cb2e", + "blockHash": "0x134e9d3cd9a3e3caf114f8d6b7b0c35c8cc36ee215105e16d0c7178241f37c0e", + "blockNumber": "0x38555e4", + "transactionHash": "0x05653e8b67b12ea98443d499c0c21b3f3176bf1b9dc52470ef315ae2328f6129", + "transactionIndex": "0x42", + "logIndex": "0x18d", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000002000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000040000000000000000000000000000000000000040800000000000001000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0x05653e8b67b12ea98443d499c0c21b3f3176bf1b9dc52470ef315ae2328f6129", + "transactionIndex": "0x42", + "blockHash": "0x134e9d3cd9a3e3caf114f8d6b7b0c35c8cc36ee215105e16d0c7178241f37c0e", + "blockNumber": "0x38555e4", + "gasUsed": "0x6f9eb", + "effectiveGasPrice": "0x745c05d8d", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x114f16e", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x0000000000000000000000000000000000000000000000000032616ecf0e8fc40000000000000000000000000000000000000000000000011d4f74cac4b4355a00000000000000000000000000000000000000000000001668ea6e3f5a56cb2e0000000000000000000000000000000000000000000000011d1d135bf5a5a596000000000000000000000000000000000000000000000016691ccfae29655af2", + "blockHash": "0x134e9d3cd9a3e3caf114f8d6b7b0c35c8cc36ee215105e16d0c7178241f37c0e", + "blockNumber": "0x38555e4", + "transactionHash": "0x77a5cbe90102a2e3c410fce45de35b1b8573510a680b4ae50092f74ace974ff7", + "transactionIndex": "0x43", + "logIndex": "0x18e", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000002000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000040000000000000000000000000000000000000040800000000000001000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0x77a5cbe90102a2e3c410fce45de35b1b8573510a680b4ae50092f74ace974ff7", + "transactionIndex": "0x43", + "blockHash": "0x134e9d3cd9a3e3caf114f8d6b7b0c35c8cc36ee215105e16d0c7178241f37c0e", + "blockNumber": "0x38555e4", + "gasUsed": "0x6ed76", + "effectiveGasPrice": "0x745c05d8d", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x71aee7", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x0000000000000000000000000000000000000000000000000021bc5620a5563c0000000000000000000000000000000000000000000000011d1d135b561f8d5c0000000000000000000000000000000000000000000000167cf3324b5d2831d00000000000000000000000000000000000000000000000011cfb5705357a37200000000000000000000000000000000000000000000000167d14eea17dcd880c", + "blockHash": "0x2e889b03e20fd6edb6a4fe5eccad3961fa5da16db273ea66846d225dd8e4f77e", + "blockNumber": "0x38555e6", + "transactionHash": "0x7c20f2fe73f6e1d797edc21935033daccf9cf96e52a96ec47cbd3d3d4d716906", + "transactionIndex": "0x38", + "logIndex": "0xbc", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000002000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000040000000000000000000000000000000000000040800000000000001000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0x7c20f2fe73f6e1d797edc21935033daccf9cf96e52a96ec47cbd3d3d4d716906", + "transactionIndex": "0x38", + "blockHash": "0x2e889b03e20fd6edb6a4fe5eccad3961fa5da16db273ea66846d225dd8e4f77e", + "blockNumber": "0x38555e6", + "gasUsed": "0x4a38a", + "effectiveGasPrice": "0x745c05e3e", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x761955", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x00000000000000000000000000000000000000000000000000201d02afe9c9940000000000000000000000000000000000000000000000011cfb5704c77345f00000000000000000000000000000000000000000000000167d14eea17dcd880c0000000000000000000000000000000000000000000000011cdb3a0217897c5c0000000000000000000000000000000000000000000000167d350ba42db751a0", + "blockHash": "0x2e889b03e20fd6edb6a4fe5eccad3961fa5da16db273ea66846d225dd8e4f77e", + "blockNumber": "0x38555e6", + "transactionHash": "0xfd57c21c61ffadeaf8b92a6c2eed0911580a7ee7159462462634e7d64af809a2", + "transactionIndex": "0x39", + "logIndex": "0xbd", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000002000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000040000000000000000000000000000000000000040800000000000001000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0xfd57c21c61ffadeaf8b92a6c2eed0911580a7ee7159462462634e7d64af809a2", + "transactionIndex": "0x39", + "blockHash": "0x2e889b03e20fd6edb6a4fe5eccad3961fa5da16db273ea66846d225dd8e4f77e", + "blockNumber": "0x38555e6", + "gasUsed": "0x46a6e", + "effectiveGasPrice": "0x745c05e3e", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x45aee8", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x00000000000000000000000000000000000000000000000000209acd29ad9f5c0000000000000000000000000000000000000000000000011cdb3a01aecd1b4c0000000000000000000000000000000000000000000000168f6fc48c85d52e000000000000000000000000000000000000000000000000011cba9f34851f7bf00000000000000000000000000000000000000000000000168f905f59af82cd5c", + "blockHash": "0x797ebd6affe3b08bb41325fb14d152b709dceb1df031a3cf33e9e0f8bcc82811", + "blockNumber": "0x38555e8", + "transactionHash": "0xaf5909bb3552ad8ecbca99408b487b63606d882806167605800398c7c941a11b", + "transactionIndex": "0x3c", + "logIndex": "0xa9", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000002000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000040000000000000000000000000000000000000040800000000000001000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0xaf5909bb3552ad8ecbca99408b487b63606d882806167605800398c7c941a11b", + "transactionIndex": "0x3c", + "blockHash": "0x797ebd6affe3b08bb41325fb14d152b709dceb1df031a3cf33e9e0f8bcc82811", + "blockNumber": "0x38555e8", + "gasUsed": "0x47bba", + "effectiveGasPrice": "0x745c05f01", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x4a29b2", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x000000000000000000000000000000000000000000000000002093fbc56b81bc0000000000000000000000000000000000000000000000011cba9f34175e99920000000000000000000000000000000000000000000000168f905f59af82cd5c0000000000000000000000000000000000000000000000011c9a0b3851f317d60000000000000000000000000000000000000000000000168fb0f35574ee4f18", + "blockHash": "0x797ebd6affe3b08bb41325fb14d152b709dceb1df031a3cf33e9e0f8bcc82811", + "blockNumber": "0x38555e8", + "transactionHash": "0x5dc28ca47dee5c10a09386daaa01dabdd7c6ee4e748e1e95edd84483b64db4d2", + "transactionIndex": "0x3d", + "logIndex": "0xaa", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000002000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000040000000000000000000000000000000000000040800000000000001000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0x5dc28ca47dee5c10a09386daaa01dabdd7c6ee4e748e1e95edd84483b64db4d2", + "transactionIndex": "0x3d", + "blockHash": "0x797ebd6affe3b08bb41325fb14d152b709dceb1df031a3cf33e9e0f8bcc82811", + "blockNumber": "0x38555e8", + "gasUsed": "0x47aca", + "effectiveGasPrice": "0x745c05f01", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x4db4fe", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x0000000000000000000000000000000000000000000000000019c648eef1b1c80000000000000000000000000000000000000000000000011c9a0b37e44928c80000000000000000000000000000000000000000000000168fb0f35574ee4f180000000000000000000000000000000000000000000000011c8044eef55777000000000000000000000000000000000000000000000000168fcab99e63e000e0", + "blockHash": "0x797ebd6affe3b08bb41325fb14d152b709dceb1df031a3cf33e9e0f8bcc82811", + "blockNumber": "0x38555e8", + "transactionHash": "0xac746b93bfe440edf52c1b36970057bff853429c26cdfd0a3a782bd0ebd34d5b", + "transactionIndex": "0x3e", + "logIndex": "0xab", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000002000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000040000000000000000000000000000000000000040800000000000001000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0xac746b93bfe440edf52c1b36970057bff853429c26cdfd0a3a782bd0ebd34d5b", + "transactionIndex": "0x3e", + "blockHash": "0x797ebd6affe3b08bb41325fb14d152b709dceb1df031a3cf33e9e0f8bcc82811", + "blockNumber": "0x38555e8", + "gasUsed": "0x38b4c", + "effectiveGasPrice": "0x745c05f01", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1720358722, + "chain": 137, + "commit": null +} \ No newline at end of file diff --git a/broadcast/DeployEnvironmentSetUp.s.sol/137/run-latest.json b/broadcast/DeployEnvironmentSetUp.s.sol/137/run-latest.json new file mode 100644 index 0000000..ad4498c --- /dev/null +++ b/broadcast/DeployEnvironmentSetUp.s.sol/137/run-latest.json @@ -0,0 +1,925 @@ +{ + "transactions": [ + { + "hash": "0xcb39ffe893b9ca1f1c9312c7b2fa2bc55fe118890468834d809012d2bcb4dafd", + "transactionType": "CREATE2", + "contractName": "DelegationManager", + "contractAddress": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "function": null, + "arguments": [ + "0xB0403B32f54d0Bd752113f4009e8B534C6669f44" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x2e52b2", + "value": "0x0", + "input": "0x44656c654761746f7200000000000000000000000000000000000000000000006101606040523480156200001257600080fd5b50604051620029e7380380620029e7833981016040819052620000359162000384565b60408051808201825260118152702232b632b3b0ba34b7b726b0b730b3b2b960791b602080830191909152825180840190935260018352603160f81b9083015290826001600160a01b038116620000a757604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b620000b28162000204565b506001805460ff60a01b19169055620000cd82600262000222565b61012052620000de81600362000222565b61014052815160208084019190912060e052815190820120610100524660a0526200015b60e0516101005160408051600080516020620029c783398151915260208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526000620001706200025b565b9050306001600160a01b0316817f04a46d9007577c7ff1e513b900545162ec25d25991ae3dc60cf26ec01a84806d604051806040016040528060118152602001702232b632b3b0ba34b7b726b0b730b3b2b960791b815250604051806040016040528060018152602001603160f81b81525046604051620001f493929190620003fe565b60405180910390a35050620005e5565b600180546001600160a01b03191690556200021f81620002f1565b50565b600060208351101562000242576200023a8362000341565b905062000255565b816200024f8482620004df565b5060ff90505b92915050565b600060c0516001600160a01b0316306001600160a01b031614801562000282575060a05146145b156200028f575060805190565b620002ec60e0516101005160408051600080516020620029c783398151915260208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b905090565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080829050601f815111156200036f578260405163305a27a960e01b81526004016200009e9190620005ab565b80516200037c82620005c0565b179392505050565b6000602082840312156200039757600080fd5b81516001600160a01b0381168114620003af57600080fd5b9392505050565b6000815180845260005b81811015620003de57602081850181015186830182015201620003c0565b506000602082860101526020601f19601f83011685010191505092915050565b606081526000620004136060830186620003b6565b8281036020840152620004278186620003b6565b915050826040830152949350505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200046357607f821691505b6020821081036200048457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004da576000816000526020600020601f850160051c81016020861015620004b55750805b601f850160051c820191505b81811015620004d657828155600101620004c1565b5050505b505050565b81516001600160401b03811115620004fb57620004fb62000438565b62000513816200050c84546200044e565b846200048a565b602080601f8311600181146200054b5760008415620005325750858301515b600019600386901b1c1916600185901b178555620004d6565b600085815260208120601f198616915b828110156200057c578886015182559484019460019091019084016200055b565b50858210156200059b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602081526000620003af6020830184620003b6565b80516020808301519190811015620004845760001960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516123876200064060003960006113bb0152600061138e015260006112f3015260006112cb01526000611226015260006112500152600061127a01526123876000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80637fade287116100b8578063a3f4df7e1161007c578063a3f4df7e1461028e578063acb8cc49146102cb578063e1520f54146102eb578063e30c3978146102fe578063f2fde38b1461030f578063ffa1ad741461032257600080fd5b80637fade2871461023f57806383ebb771146102525780638456cb591461025a57806384b0196e146102625780638da5cb5b1461027d57600080fd5b806358909ebc1161010a57806358909ebc146101c65780635c975abb146101e75780635daa6539146101f9578063661346071461021c578063715018a61461022f57806379ba50971461023757600080fd5b80631b13cac2146101475780632d40d052146101635780633ed01015146101965780633f4ba83a146101ab57806349934047146101b3575b600080fd5b61015060001981565b6040519081526020015b60405180910390f35b6101866101713660046118c7565b60056020526000908152604090205460ff1681565b604051901515815260200161015a565b6101a96101a43660046118e0565b610346565b005b6101a9610440565b6101a96101c13660046118e0565b610452565b6101cf610a1181565b6040516001600160a01b03909116815260200161015a565b600154600160a01b900460ff16610186565b6101866102073660046118c7565b60046020526000908152604090205460ff1681565b61015061022a3660046118e0565b610542565b6101a961055b565b6101a961056d565b6101a961024d3660046118e0565b6105b6565b6101506106a7565b6101a96106b6565b61026a6106c6565b60405161015a9796959493929190611967565b6000546001600160a01b03166101cf565b6102be604051806040016040528060118152602001702232b632b3b0ba34b7b726b0b730b3b2b960791b81525081565b60405161015a9190611a00565b6102be604051806040016040528060018152602001603160f81b81525081565b6101a96102f9366004611a13565b61070c565b6001546001600160a01b03166101cf565b6101a961031d366004611ac9565b611072565b6102be604051806040016040528060058152602001640312e302e360dc1b81525081565b6103566040820160208301611ac9565b6001600160a01b038116331461037f5760405163b9f0f17160e01b815260040160405180910390fd5b600061038a83610542565b60008181526005602052604090205490915060ff166103bc57604051637952fbad60e11b815260040160405180910390fd5b6000818152600560209081526040909120805460ff191690556103e190840184611ac9565b6001600160a01b03166103fa6040850160208601611ac9565b6001600160a01b0316827f3feadce88fc1b49db633a56fd5307ed6ee18734df83bcc4011daa720c9cd95f1866040516104339190611c18565b60405180910390a4505050565b6104486110e3565b610450611110565b565b6104626040820160208301611ac9565b6001600160a01b038116331461048b5760405163b9f0f17160e01b815260040160405180910390fd5b600061049683610542565b60008181526005602052604090205490915060ff16156104c857604051625ecddb60e01b815260040160405180910390fd5b6000818152600560209081526040909120805460ff191660011790556104f090840184611ac9565b6001600160a01b03166105096040850160208601611ac9565b6001600160a01b0316827fea589ba9473ee1fe77d352c7ed919747715a5d22931b972de9b02a907c66d5dd866040516104339190611c18565b600061055561055083611fae565b611165565b92915050565b6105636110e3565b6104506000611200565b60015433906001600160a01b031681146105aa5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b6105b381611200565b50565b6105c66040820160208301611ac9565b6001600160a01b03811633146105ef5760405163b9f0f17160e01b815260040160405180910390fd5b60006105fa83610542565b60008181526004602052604090205490915060ff161561062d5760405163119b4fd360e11b815260040160405180910390fd5b6000818152600460209081526040909120805460ff1916600117905561065590840184611ac9565b6001600160a01b031661066e6040850160208601611ac9565b6001600160a01b0316827fb9b56ecd70a93a7fcb54a1072d6a9c7ff488f46d6c656bb0a0fa453924658704866040516104339190611c18565b60006106b1611219565b905090565b6106be6110e3565b610450611344565b6000606080600080600060606106da611387565b6106e26113b4565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6107146113e1565b600061072283850185611fba565b905080516000036107465760405163efe957cf60e01b815260040160405180910390fd5b600081516001600160401b0381111561076157610761611ce9565b60405190808252806020026020018201604052801561078a578160200160208202803683370190505b5090506107db6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600080191681526020016060815260200160008152602001606081525090565b336001600160a01b0316836000815181106107f8576107f861206a565b6020026020010151600001516001600160a01b03161415801561084d5750610a116001600160a01b0316836000815181106108355761083561206a565b6020026020010151600001516001600160a01b031614155b1561086b57604051632d618d8160e21b815260040160405180910390fd5b60005b8351811015610a98578381815181106108895761088961206a565b6020026020010151915061089c82611165565b8382815181106108ae576108ae61206a565b6020026020010181815250508160a001515160000361091d57600460008483815181106108dd576108dd61206a565b60209081029190910181015182528101919091526040016000205460ff166109185760405163a9e649e960e01b815260040160405180910390fd5b610a90565b60208201516001600160a01b0381163b6000036109c157600061098761097d6109446106a7565b8786815181106109565761095661206a565b602002602001015160405161190160f01b8152600281019290925260228201526042902090565b8560a0015161140c565b9050816001600160a01b0316816001600160a01b0316146109bb57604051638baa579f60e01b815260040160405180910390fd5b50610a8e565b60006109e06109ce6106a7565b8685815181106109565761095661206a565b60a0850151604051630b135d3f60e11b81529192506000916001600160a01b03851691631626ba7e91610a17918691600401612080565b602060405180830381865afa158015610a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5891906120a1565b6001600160e01b0319169050630b135d3f60e11b8114610a8b57604051638baa579f60e01b815260040160405180910390fd5b50505b505b60010161086e565b5060005b8351811015610c585760056000848381518110610abb57610abb61206a565b60209081029190910181015182528101919091526040016000205460ff1615610af7576040516302dd502960e11b815260040160405180910390fd5b60018451610b0591906120e1565b8114610c0e5782610b178260016120f4565b81518110610b2757610b2761206a565b6020026020010151848281518110610b4157610b4161206a565b60200260200101516040015114610b6b57604051636f6a1b8760e11b815260040160405180910390fd5b600084610b798360016120f4565b81518110610b8957610b8961206a565b6020026020010151600001519050610a116001600160a01b0316816001600160a01b031614158015610bea5750806001600160a01b0316858381518110610bd257610bd261206a565b6020026020010151602001516001600160a01b031614155b15610c0857604051632d618d8160e21b815260040160405180910390fd5b50610c50565b60001960001b848281518110610c2657610c2661206a565b60200260200101516040015114610c5057604051636f6a1b8760e11b815260040160405180910390fd5b600101610a9c565b5060005b8351811015610db8576000848281518110610c7957610c7961206a565b60200260200101516060015190506000848381518110610c9b57610c9b61206a565b602002602001015190506000868481518110610cb957610cb961206a565b602002602001015160200151905060008351905060005b81811015610da8576000858281518110610cec57610cec61206a565b6020026020010151600001519050806001600160a01b0316639751a83d878481518110610d1b57610d1b61206a565b602002602001015160200151888581518110610d3957610d3961206a565b6020026020010151604001518e8989336040518763ffffffff1660e01b8152600401610d6a96959493929190612152565b600060405180830381600087803b158015610d8457600080fd5b505af1158015610d98573d6000803e3d6000fd5b5050505050806001019050610cd0565b5050505050806001019050610c5c565b508260018451610dc891906120e1565b81518110610dd857610dd861206a565b6020026020010151602001516001600160a01b03166326f0aef7856040518263ffffffff1660e01b8152600401610e0f91906121b4565b600060405180830381600087803b158015610e2957600080fd5b505af1158015610e3d573d6000803e3d6000fd5b505084519150505b8015610fc657600084610e596001846120e1565b81518110610e6957610e6961206a565b6020026020010151606001519050600084600184610e8791906120e1565b81518110610e9757610e9761206a565b60200260200101519050600086600185610eb191906120e1565b81518110610ec157610ec161206a565b602002602001015160200151905060008351905060005b81811015610fb0576000858281518110610ef457610ef461206a565b6020026020010151600001519050806001600160a01b031663de723eeb878481518110610f2357610f2361206a565b602002602001015160200151888581518110610f4157610f4161206a565b6020026020010151604001518e8989336040518763ffffffff1660e01b8152600401610f7296959493929190612152565b600060405180830381600087803b158015610f8c57600080fd5b505af1158015610fa0573d6000803e3d6000fd5b5050505050806001019050610ed8565b505050505080610fbf906121c7565b9050610e45565b5060005b835181101561106957336001600160a01b03168460018651610fec91906120e1565b81518110610ffc57610ffc61206a565b6020026020010151602001516001600160a01b03167f40dadaa36c6c2e3d7317e24757451ffb2d603d875f0ad5e92c5dd156573b18738684815181106110445761104461206a565b602002602001015160405161105991906121de565b60405180910390a3600101610fca565b50505050505050565b61107a6110e3565b600180546001600160a01b0383166001600160a01b031990911681179091556110ab6000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000546001600160a01b031633146104505760405163118cdaa760e01b81523360048201526024016105a1565b611118611436565b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000807f88c1d2ecf185adf710588203a5f263f0ff61be0d33da39792cde19ba9aa4331e8360000151846020015185604001516111a58760600151611460565b6080808901516040805160208101989098526001600160a01b03968716908801529490931660608601529184015260a083015260c082015260e0015b60408051601f1981840301815291905280516020909101209392505050565b600180546001600160a01b03191690556105b38161152b565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561127257507f000000000000000000000000000000000000000000000000000000000000000046145b1561129c57507f000000000000000000000000000000000000000000000000000000000000000090565b6106b1604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b61134c6113e1565b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586111483390565b60606106b17f0000000000000000000000000000000000000000000000000000000000000000600261157b565b60606106b17f0000000000000000000000000000000000000000000000000000000000000000600361157b565b600154600160a01b900460ff16156104505760405163d93c066560e01b815260040160405180910390fd5b60008060008061141c8686611626565b92509250925061142c8282611673565b5090949350505050565b600154600160a01b900460ff1661045057604051638dfc202b60e01b815260040160405180910390fd5b60008082516001600160401b0381111561147c5761147c611ce9565b6040519080825280602002602001820160405280156114a5578160200160208202803683370190505b50905060005b83518110156114fb576114d68482815181106114c9576114c961206a565b6020026020010151611730565b8282815181106114e8576114e861206a565b60209081029190910101526001016114ab565b508060405160200161150d91906122cb565b60405160208183030381529060405280519060200120915050919050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606060ff83146115955761158e83611791565b9050610555565b8180546115a190612301565b80601f01602080910402602001604051908101604052809291908181526020018280546115cd90612301565b801561161a5780601f106115ef5761010080835404028352916020019161161a565b820191906000526020600020905b8154815290600101906020018083116115fd57829003601f168201915b50505050509050610555565b600080600083516041036116605760208401516040850151606086015160001a611652888285856117d0565b95509550955050505061166c565b50508151600091506002905b9250925092565b60008260038111156116875761168761233b565b03611690575050565b60018260038111156116a4576116a461233b565b036116c25760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156116d6576116d661233b565b036116f75760405163fce698f760e01b8152600481018290526024016105a1565b600382600381111561170b5761170b61233b565b0361172c576040516335e2f38360e21b8152600481018290526024016105a1565b5050565b6000807f80ad7e1b04ee6d994a125f4714ca0720908bd80ed16063ec8aee4b88e9253e2d83600001518460200151805190602001206040516020016111e1939291909283526001600160a01b03919091166020830152604082015260600190565b6060600061179e8361189f565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561180b5750600091506003905082611895565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561185f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661188b57506000925060019150829050611895565b9250600091508190505b9450945094915050565b600060ff8216601f81111561055557604051632cd44ac360e21b815260040160405180910390fd5b6000602082840312156118d957600080fd5b5035919050565b6000602082840312156118f257600080fd5b81356001600160401b0381111561190857600080fd5b820160c0818503121561191a57600080fd5b9392505050565b6000815180845260005b818110156119475760208185018101518683018201520161192b565b506000602082860101526020601f19601f83011685010191505092915050565b60ff60f81b881681526000602060e0602084015261198860e084018a611921565b838103604085015261199a818a611921565b606085018990526001600160a01b038816608086015260a0850187905284810360c08601528551808252602080880193509091019060005b818110156119ee578351835292840192918401916001016119d2565b50909c9b505050505050505050505050565b60208152600061191a6020830184611921565b600080600060408486031215611a2857600080fd5b83356001600160401b0380821115611a3f57600080fd5b818601915086601f830112611a5357600080fd5b813581811115611a6257600080fd5b876020828501011115611a7457600080fd5b602092830195509350908501359080821115611a8f57600080fd5b50840160608187031215611aa257600080fd5b809150509250925092565b80356001600160a01b0381168114611ac457600080fd5b919050565b600060208284031215611adb57600080fd5b61191a82611aad565b6000808335601e19843603018112611afb57600080fd5b83016020810192503590506001600160401b03811115611b1a57600080fd5b803603821315611b2957600080fd5b9250929050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b88811015611c0a57858403601f19018a52823536899003605e19018112611b98578283fd5b880160606001600160a01b03611bad83611aad565b168652611bbc87830183611ae4565b8289890152611bce8389018284611b30565b925050506040611be081840184611ae4565b935087830382890152611bf4838583611b30565b9d89019d97505050938601935050600101611b73565b509198975050505050505050565b6020815260006001600160a01b0380611c3085611aad565b16602084015280611c4360208601611aad565b16604084015250604083013560608301526060830135601e19843603018112611c6b57600080fd5b83016020810190356001600160401b03811115611c8757600080fd5b8060051b3603821315611c9957600080fd5b60c06080850152611cae60e085018284611b59565b915050608084013560a0840152611cc860a0850185611ae4565b848303601f190160c0860152611cdf838284611b30565b9695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715611d2157611d21611ce9565b60405290565b60405160c081016001600160401b0381118282101715611d2157611d21611ce9565b604051601f8201601f191681016001600160401b0381118282101715611d7157611d71611ce9565b604052919050565b60006001600160401b03821115611d9257611d92611ce9565b5060051b60200190565b600082601f830112611dad57600080fd5b81356001600160401b03811115611dc657611dc6611ce9565b611dd9601f8201601f1916602001611d49565b818152846020838601011115611dee57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f830112611e1c57600080fd5b81356020611e31611e2c83611d79565b611d49565b82815260059290921b84018101918181019086841115611e5057600080fd5b8286015b84811015611eff5780356001600160401b0380821115611e745760008081fd5b908801906060828b03601f1901811315611e8e5760008081fd5b611e96611cff565b611ea1888501611aad565b815260408085013584811115611eb75760008081fd5b611ec58e8b83890101611d9c565b838b015250918401359183831115611edd5760008081fd5b611eeb8d8a85880101611d9c565b908201528652505050918301918301611e54565b509695505050505050565b600060c08284031215611f1c57600080fd5b611f24611d27565b9050611f2f82611aad565b8152611f3d60208301611aad565b60208201526040820135604082015260608201356001600160401b0380821115611f6657600080fd5b611f7285838601611e0b565b60608401526080840135608084015260a0840135915080821115611f9557600080fd5b50611fa284828501611d9c565b60a08301525092915050565b60006105553683611f0a565b60006020808385031215611fcd57600080fd5b82356001600160401b0380821115611fe457600080fd5b818501915085601f830112611ff857600080fd5b8135612006611e2c82611d79565b81815260059190911b8301840190848101908883111561202557600080fd5b8585015b8381101561205d578035858111156120415760008081fd5b61204f8b89838a0101611f0a565b845250918601918601612029565b5098975050505050505050565b634e487b7160e01b600052603260045260246000fd5b8281526040602082015260006120996040830184611921565b949350505050565b6000602082840312156120b357600080fd5b81516001600160e01b03198116811461191a57600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610555576105556120cb565b80820180821115610555576105556120cb565b6001600160a01b0361211882611aad565b1682526020810135602083015260006121346040830183611ae4565b60606040860152612149606086018284611b30565b95945050505050565b60c08152600061216560c0830189611921565b82810360208401526121778189611921565b9050828103604084015261218b8188612107565b606084019690965250506001600160a01b039283166080820152911660a0909101529392505050565b60208152600061191a6020830184612107565b6000816121d6576121d66120cb565b506000190190565b602080825282516001600160a01b0390811683830152838201518116604080850191909152808501516060808601919091528086015160c06080870152805160e0870181905260009594610100600583901b8901810195919493870193919290890190885b8181101561229d5760ff198b8903018352855187815116895289810151858b8b0152612271868b0182611921565b918701518a83038b8901529190506122898183611921565b995050509488019491880191600101612243565b50505050505050608085015160a085015260a08501519150601f198482030160c08501526121498183611921565b815160009082906020808601845b838110156122f5578151855293820193908201906001016122d9565b50929695505050505050565b600181811c9082168061231557607f821691505b60208210810361233557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052602160045260246000fdfea26469706673582212206702181458ece90d9cf27649387478caa2ed36ffd86ba70b239c4be34106280764736f6c634300081700338b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "nonce": "0x0", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x1b99347a0a496c05b1eebb642cfda3f631c5e2a1d77e3253d93de0ecf274c987", + "transactionType": "CREATE2", + "contractName": "MultiSigDeleGator", + "contractAddress": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "function": null, + "arguments": [ + "0xbe4138886cB096bDC1B930F2f0ca7892AA234D78", + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x4162a1", + "value": "0x0", + "input": "0x44656c654761746f72000000000000000000000000000000000000000000000060e0604052306080523480156200001557600080fd5b506040516200396338038062003963833981016040819052620000389162000208565b8181620000446200013e565b6001600160a01b0380831660a081905290821660c0526040517fb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d90600090a26040516001600160a01b038216907fee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a9990600090a250506000197fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c0281905560408051918252517fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c00917f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d03919081900360200190a150505062000247565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156200018f5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001ef5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b0381168114620001ef57600080fd5b600080604083850312156200021c57600080fd5b82516200022981620001f2565b60208401519092506200023c81620001f2565b809150509250929050565b60805160a05160c0516136216200034260003960008181610633015281816108a001528181610b0001528181610bbb01528181610c3c01528181610cba01528181610e1f01528181610ed401528181610f5b015281816110b9015281816111f9015281816112ac0152818161131e0152818161138901528181611521015281816115b4015281816115f6015281816116ec015281816117ca015281816119e0015261240a01526000818161077201528181610b6601528181610d1d01528181610da001528181610e8201528181611130015281816113ec015261174f015260008181611b8201528181611bab015261211901526136216000f3fe60806040526004361061024a5760003560e01c80637df73e2711610139578063bc197c81116100b6578063e3d9109f1161007a578063e3d9109f1461070c578063e75235b81461072c578063ea4d3c9b14610760578063eb12d61e14610794578063f23a6e61146107b4578063ffa1ad74146107d457600080fd5b8063bc197c8114610682578063c399ec88146106a2578063d087d288146106b7578063d7d7442f146106cc578063e1520f54146106ec57600080fd5b8063a24c8f32116100fd578063a24c8f32146105a3578063aaf10f42146105b6578063ad3cb1cc146105e3578063b0d691fe14610621578063b3c650151461065557600080fd5b80637df73e27146104d95780637f07bfdc1461051f5780637fade2871461053f57806394cf795e1461055f578063a0c1deb41461058157600080fd5b80634891161f116101c75780635c1c6dcd1161018b5780635c1c6dcd1461043957806360b5bb3f1461045957806365ee81d8146104795780636af1f3991461049957806378979a80146104b957600080fd5b80634891161f146103d457806349934047146103e95780634a58db19146104095780634f1ef2861461041157806352d1902d1461042457600080fd5b806326f0aef71161020e57806326f0aef71461033457806334fcd5be146103545780633e1b0812146103745780633ed0101514610394578063445140b8146103b457600080fd5b806301ffc9a7146102565780630e316ab71461028b578063150b7a02146102ad5780631626ba7e146102e657806319822f7c1461030657600080fd5b3661025157005b600080fd5b34801561026257600080fd5b506102766102713660046128f4565b610805565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102ab6102a6366004612933565b610895565b005b3480156102b957600080fd5b506102cd6102c8366004612a05565b610ab9565b6040516001600160e01b03199091168152602001610282565b3480156102f257600080fd5b506102cd610301366004612ab8565b610ad4565b34801561031257600080fd5b50610326610321366004612b03565b610af3565b604051908152602001610282565b34801561034057600080fd5b506102ab61034f366004612b6e565b610b5b565b34801561036057600080fd5b506102ab61036f366004612bee565b610bb0565b34801561038057600080fd5b5061032661038f366004612c2f565b610c15565b3480156103a057600080fd5b506102ab6103af366004612c58565b610caf565b3480156103c057600080fd5b506102766103cf366004612c92565b610d87565b3480156103e057600080fd5b50610326601e81565b3480156103f557600080fd5b506102ab610404366004612c58565b610e14565b6102ab610eb7565b6102ab61041f366004612cab565b610f21565b34801561043057600080fd5b50610326610f33565b34801561044557600080fd5b506102ab610454366004612b6e565b610f50565b34801561046557600080fd5b506102ab610474366004612cfa565b610f99565b34801561048557600080fd5b506102ab610494366004612d53565b6110ae565b3480156104a557600080fd5b506102766104b4366004612c92565b611117565b3480156104c557600080fd5b506102ab6104d4366004612db1565b611167565b3480156104e557600080fd5b506102766104f4366004612933565b6001600160a01b031660009081526000805160206135ac833981519152602052604090205460ff1690565b34801561052b57600080fd5b506102ab61053a366004612e2d565b6112a1565b34801561054b57600080fd5b506102ab61055a366004612c58565b61137e565b34801561056b57600080fd5b50610574611421565b6040516102829190612e59565b34801561058d57600080fd5b5060008051602061358c83398151915254610326565b6102ab6105b1366004612cab565b610f29565b3480156105c257600080fd5b506105cb611494565b6040516001600160a01b039091168152602001610282565b3480156105ef57600080fd5b50610614604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102829190612ef6565b34801561062d57600080fd5b506105cb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561066157600080fd5b5061066a6114ba565b6040516001600160401b039091168152602001610282565b34801561068e57600080fd5b506102cd61069d366004612f88565b6114ed565b3480156106ae57600080fd5b50610326611509565b3480156106c357600080fd5b50610326611595565b3480156106d857600080fd5b506102ab6106e7366004612c92565b6115eb565b3480156106f857600080fd5b506102ab610707366004613035565b6116e1565b34801561071857600080fd5b506102ab61072736600461309d565b6117bf565b34801561073857600080fd5b507fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c0254610326565b34801561076c57600080fd5b506105cb7f000000000000000000000000000000000000000000000000000000000000000081565b3480156107a057600080fd5b506102ab6107af366004612933565b6119d5565b3480156107c057600080fd5b506102cd6107cf3660046130d6565b611b5b565b3480156107e057600080fd5b50610614604051806040016040528060058152602001640312e302e360dc1b81525081565b600061080f611b77565b6001600160e01b031982166326f0aef760e01b148061083e57506001600160e01b03198216630a85bd0160e11b145b8061085957506001600160e01b03198216630271189760e51b145b8061087457506001600160e01b031982166301ffc9a760e01b145b8061088f57506001600160e01b03198216630b135d3f60e11b145b92915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906108ce5750333014155b156108ec57604051630796d94560e01b815260040160405180910390fd5b6001600160a01b03811660009081526000805160206135ac833981519152602081905260409091205460ff166109355760405163da0357f760e01b815260040160405180910390fd5b60018101546002820154810361095e576040516361774dcf60e11b815260040160405180910390fd5b60005b61096c600183613154565b811015610a3657836001600160a01b031683600101828154811061099257610992613167565b6000918252602090912001546001600160a01b031603610a2e57826001016001836109bd9190613154565b815481106109cd576109cd613167565b6000918252602090912001546001840180546001600160a01b0390921691839081106109fb576109fb613167565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610a36565b600101610961565b5081600101805480610a4a57610a4a61317d565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038516808352908490526040808320805460ff191690555190917fb0073c14ccc2332b5b461c0d2fb94366f38d3954a82745e74827aa0811c9f98191a2505050565b6000610ac3611b77565b50630a85bd0160e11b949350505050565b6000610ade611b77565b610ae9848484611c1e565b90505b9392505050565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b3e57604051636b31ba1560e11b815260040160405180910390fd5b610b46611b77565b610b508484611dbd565b9050610aec82611e33565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ba457604051630692ce8160e21b815260040160405180910390fd5b610bad81611eca565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610be95750333014155b15610c0757604051630796d94560e01b815260040160405180910390fd5b610c118282611fd4565b5050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610c8b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088f9190613193565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610ce85750333014155b15610d0657604051630796d94560e01b815260040160405180910390fd5b604051633ed0101560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633ed0101590610d529084906004016132db565b600060405180830381600087803b158015610d6c57600080fd5b505af1158015610d80573d6000803e3d6000fd5b5050505050565b6040516316a0682960e11b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632d40d052906024015b602060405180830381865afa158015610df0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088f91906133b6565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610e4d5750333014155b15610e6b57604051630796d94560e01b815260040160405180910390fd5b604051634993404760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634993404790610d529084906004016132db565b610ebf611b77565b60405163b760faf960e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b158015610d6c57600080fd5b610f29612036565b610c1182826120f3565b6000610f3d61210e565b506000805160206135cc83398151915290565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ba457604051636b31ba1560e11b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610fde5750825b90506000826001600160401b03166001148015610ffa5750303b155b905081158015611008575080155b156110265760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561105057845460ff60401b1916600160401b1785555b61105d8888886000612157565b83156110a457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2906020015b60405180910390a15b5050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110e75750333014155b1561110557604051630796d94560e01b815260040160405180910390fd5b61111184848484612157565b50505050565b604051635daa653960e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635daa653990602401610dd3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054869190600160401b900460ff16806111af575080546001600160401b03808416911610155b156111cd5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906112275750333014155b1561124557604051630796d94560e01b815260040160405180910390fd5b61125186868686612157565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906112da5750333014155b156112f857604051630796d94560e01b815260040160405180910390fd5b60405163040b850f60e31b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561136257600080fd5b505af1158015611376573d6000803e3d6000fd5b505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906113b75750333014155b156113d557604051630796d94560e01b815260040160405180910390fd5b604051637fade28760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637fade28790610d529084906004016132db565b606060006000805160206135ac8339815191526001810180546040805160208084028201810190925282815293945083018282801561148957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161146b575b505050505091505090565b60006114b56000805160206135cc833981519152546001600160a01b031690565b905090565b60006114b57ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00546001600160401b031690565b60006114f7611b77565b5063bc197c8160e01b95945050505050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a08231906024015b602060405180830381865afa158015611571573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b59190613193565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401611554565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906116245750333014155b1561164257604051630796d94560e01b815260040160405180910390fd5b806000036116635760405163aabd5a0960e01b815260040160405180910390fd5b60008051602061358c833981519152546000805160206135ac833981519152908211156116a35760405163aabd5a0960e01b815260040160405180910390fd5b600281018290556040518281527f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d039060200160405180910390a15050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480159061171a5750333014155b1561173857604051630796d94560e01b815260040160405180910390fd5b60405163385483d560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e1520f5490611788908690869086906004016133d3565b600060405180830381600087803b1580156117a257600080fd5b505af11580156117b6573d6000803e3d6000fd5b50505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906117f85750333014155b1561181657604051630796d94560e01b815260040160405180910390fd5b6001600160a01b038116158061183557506001600160a01b0381163b15155b1561185357604051634501a91960e01b815260040160405180910390fd5b6001600160a01b03821660009081526000805160206135ac833981519152602081905260409091205460ff1661189c5760405163da0357f760e01b815260040160405180910390fd5b6001600160a01b03821660009081526020829052604090205460ff16156118d657604051631985f4ab60e31b815260040160405180910390fd5b600181015460005b8181101561197057846001600160a01b031683600101828154811061190557611905613167565b6000918252602090912001546001600160a01b031603611968578383600101828154811061193557611935613167565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550611970565b6001016118de565b506001600160a01b03808516600081815260208590526040808220805460ff199081169091559387168083528183208054909516600117909455517f53a7b6f060162826746b07f3ff5cc66b83afad3bc9a57c9f34d7802901c6e8299190a350505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590611a0e5750333014155b15611a2c57604051630796d94560e01b815260040160405180910390fd5b6001600160a01b0381161580611a4b57506001600160a01b0381163b15155b15611a6957604051634501a91960e01b815260040160405180910390fd5b60008051602061358c833981519152546000805160206135ac83398151915290601d1901611aaa57604051630dc92ed360e11b815260040160405180910390fd5b6001600160a01b03821660009081526020829052604090205460ff1615611ae457604051631985f4ab60e31b815260040160405180910390fd5b6001818101805480830182556000918252602080832090910180546001600160a01b0319166001600160a01b038716908117909155808352908490526040808320805460ff191690941790935591517f82b74755d483f0688b80354268454667c377a5684e64a4dbb6820fc11a6276d49190a25050565b6000611b65611b77565b5063f23a6e6160e01b95945050505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611bfe57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611bf26000805160206135cc833981519152546001600160a01b031690565b6001600160a01b031614155b15611c1c5760405163703e46dd60e11b815260040160405180910390fd5b565b7fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c02546000906000805160206135ac83398151915290611c5f9060419061343d565b8314611c7657506001600160e01b03199050610aec565b6000611c83604185613454565b600283015490915060008080805b85811015611da55760008a8a611ca860418561343d565b906041611cb6866001613476565b611cc0919061343d565b92611ccd93929190613489565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929350611d1192508e91508390506123d5565b9350846001600160a01b0316846001600160a01b0316111580611d4d57506001600160a01b03841660009081526020899052604090205460ff16155b15611d6b57506001600160e01b03199750610aec9650505050505050565b82611d75816134b3565b935050858310611d975750630b135d3f60e11b9750610aec9650505050505050565b509192508291600101611c91565b506001600160e01b03199a9950505050505050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c829052603c81208190611e0590611e006101008701876134cc565b611c1e565b90506374eca2c160e11b6001600160e01b0319821601611e2957600091505061088f565b5060019392505050565b8015610bad57604051600090339060001990849084818181858888f193505050503d8060008114611e80576040519150601f19603f3d011682016040523d82523d6000602084013e611e85565b606091505b505060408051848152821515602082015291925033917fa427c7d47f24d01b170779a7600b1d4c0d7cdbabaa0f19c4f0e6182053ffc931910160405180910390a25050565b600080611eda6020840184612933565b6001600160a01b03166020840135611ef560408601866134cc565b604051611f03929190613512565b60006040518083038185875af1925050503d8060008114611f40576040519150601f19603f3d011682016040523d82523d6000602084013e611f45565b606091505b509092509050611f586020840184612933565b6001600160a01b03167f74b56487625d598ffbf59a76c3b58fc1922f54afc86a075bad0c2a8aa05d2ad284602001358484604051611f9893929190613522565b60405180910390a281611fcf578051600003611fc75760405163764bbf1760e01b815260040160405180910390fd5b805181602001fd5b505050565b806000819003611ff757604051635fc74f2160e11b815260040160405180910390fd5b60005b818110156111115761202e84848381811061201757612017613167565b90506020028101906120299190613543565b611eca565b600101611ffa565b60008051602061358c833981519152546000805160206135ac8339815191529060005b818110156120b05782600001600084600101838154811061207c5761207c613167565b60009182526020808320909101546001600160a01b031683528201929092526040019020805460ff19169055600101612059565b506120bf6001830160006128c2565b6000600283018190556040517feb09d532980c3cc73dcad99b80e264204a667a54cbb7b63ec8d68dcb1c7096be9190a15050565b6120fb611b77565b612104826123ff565b610c118282612456565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c1c5760405163703e46dd60e11b815260040160405180910390fd5b60008051602061358c8339815191525483906000805160206135ac8339815191529060008461218f5761218a8285613476565b612191565b835b905085158061219f57508086115b156121bd5760405163aabd5a0960e01b815260040160405180910390fd5b601e8111156121df57604051630dc92ed360e11b815260040160405180910390fd5b84156122735760005b8281101561226457600084600101828154811061220757612207613167565b60009182526020808320909101546001600160a01b0316808352908790526040808320805460ff191690555190925082917fb0073c14ccc2332b5b461c0d2fb94366f38d3954a82745e74827aa0811c9f98191a2506001016121e8565b506122736001840160006128c2565b60005b8481101561239d57600089898381811061229257612292613167565b90506020020160208101906122a79190612933565b6001600160a01b03811660009081526020879052604090205490915060ff16156122e457604051631985f4ab60e31b815260040160405180910390fd5b6001600160a01b038116158061230357506001600160a01b0381163b15155b1561232157604051634501a91960e01b815260040160405180910390fd5b6001858101805480830182556000918252602080832090910180546001600160a01b0319166001600160a01b038616908117909155808352908890526040808320805460ff191690941790935591517f82b74755d483f0688b80354268454667c377a5684e64a4dbb6820fc11a6276d49190a250600101612276565b50600283018690556040518681527f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d039060200161109b565b6000806000806123e58686612518565b9250925092506123f58282612565565b5090949350505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906124385750333014155b15610bad57604051630796d94560e01b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156124b0575060408051601f3d908101601f191682019092526124ad91810190613193565b60015b6124dd57604051634c9c8ce360e01b81526001600160a01b03831660048201526024015b60405180910390fd5b6000805160206135cc833981519152811461250e57604051632a87526960e21b8152600481018290526024016124d4565b611fcf838361261e565b600080600083516041036125525760208401516040850151606086015160001a61254488828585612674565b95509550955050505061255e565b50508151600091506002905b9250925092565b600082600381111561257957612579613563565b03612582575050565b600182600381111561259657612596613563565b036125b45760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156125c8576125c8613563565b036125e95760405163fce698f760e01b8152600481018290526024016124d4565b60038260038111156125fd576125fd613563565b03610c11576040516335e2f38360e21b8152600481018290526024016124d4565b61262782612743565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561266c57611fcf82826127a8565b610c1161281e565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156126af5750600091506003905082612739565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612703573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661272f57506000925060019150829050612739565b9250600091508190505b9450945094915050565b806001600160a01b03163b60000361277957604051634c9c8ce360e01b81526001600160a01b03821660048201526024016124d4565b6000805160206135cc83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516127c59190613579565b600060405180830381855af49150503d8060008114612800576040519150601f19603f3d011682016040523d82523d6000602084013e612805565b606091505b509150915061281585838361283d565b95945050505050565b3415611c1c5760405163b398979f60e01b815260040160405180910390fd5b6060826128525761284d82612899565b610aec565b815115801561286957506001600160a01b0384163b155b1561289257604051639996b31560e01b81526001600160a01b03851660048201526024016124d4565b5080610aec565b8051156128a95780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825590600052602060002090810190610bad91905b808211156128f057600081556001016128dc565b5090565b60006020828403121561290657600080fd5b81356001600160e01b031981168114610aec57600080fd5b6001600160a01b0381168114610bad57600080fd5b60006020828403121561294557600080fd5b8135610aec8161291e565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561298e5761298e612950565b604052919050565b600082601f8301126129a757600080fd5b81356001600160401b038111156129c0576129c0612950565b6129d3601f8201601f1916602001612966565b8181528460208386010111156129e857600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215612a1b57600080fd5b8435612a268161291e565b93506020850135612a368161291e565b92506040850135915060608501356001600160401b03811115612a5857600080fd5b612a6487828801612996565b91505092959194509250565b60008083601f840112612a8257600080fd5b5081356001600160401b03811115612a9957600080fd5b602083019150836020828501011115612ab157600080fd5b9250929050565b600080600060408486031215612acd57600080fd5b8335925060208401356001600160401b03811115612aea57600080fd5b612af686828701612a70565b9497909650939450505050565b600080600060608486031215612b1857600080fd5b83356001600160401b03811115612b2e57600080fd5b84016101208187031215612b4157600080fd5b95602085013595506040909401359392505050565b600060608284031215612b6857600080fd5b50919050565b600060208284031215612b8057600080fd5b81356001600160401b03811115612b9657600080fd5b612ba284828501612b56565b949350505050565b60008083601f840112612bbc57600080fd5b5081356001600160401b03811115612bd357600080fd5b6020830191508360208260051b8501011115612ab157600080fd5b60008060208385031215612c0157600080fd5b82356001600160401b03811115612c1757600080fd5b612c2385828601612baa565b90969095509350505050565b600060208284031215612c4157600080fd5b81356001600160c01b0381168114610aec57600080fd5b600060208284031215612c6a57600080fd5b81356001600160401b03811115612c8057600080fd5b820160c08185031215610aec57600080fd5b600060208284031215612ca457600080fd5b5035919050565b60008060408385031215612cbe57600080fd5b8235612cc98161291e565b915060208301356001600160401b03811115612ce457600080fd5b612cf085828601612996565b9150509250929050565b600080600060408486031215612d0f57600080fd5b83356001600160401b03811115612d2557600080fd5b612d3186828701612baa565b909790965060209590950135949350505050565b8015158114610bad57600080fd5b60008060008060608587031215612d6957600080fd5b84356001600160401b03811115612d7f57600080fd5b612d8b87828801612baa565b909550935050602085013591506040850135612da681612d45565b939692955090935050565b600080600080600060808688031215612dc957600080fd5b85356001600160401b038082168214612de157600080fd5b90955060208701359080821115612df757600080fd5b50612e0488828901612baa565b909550935050604086013591506060860135612e1f81612d45565b809150509295509295909350565b60008060408385031215612e4057600080fd5b8235612e4b8161291e565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b81811015612e9a5783516001600160a01b031683529284019291840191600101612e75565b50909695505050505050565b60005b83811015612ec1578181015183820152602001612ea9565b50506000910152565b60008151808452612ee2816020860160208601612ea6565b601f01601f19169290920160200192915050565b602081526000610aec6020830184612eca565b600082601f830112612f1a57600080fd5b813560206001600160401b03821115612f3557612f35612950565b8160051b612f44828201612966565b9283528481018201928281019087851115612f5e57600080fd5b83870192505b84831015612f7d57823582529183019190830190612f64565b979650505050505050565b600080600080600060a08688031215612fa057600080fd5b8535612fab8161291e565b94506020860135612fbb8161291e565b935060408601356001600160401b0380821115612fd757600080fd5b612fe389838a01612f09565b94506060880135915080821115612ff957600080fd5b61300589838a01612f09565b9350608088013591508082111561301b57600080fd5b5061302888828901612996565b9150509295509295909350565b60008060006040848603121561304a57600080fd5b83356001600160401b038082111561306157600080fd5b61306d87838801612a70565b9095509350602086013591508082111561308657600080fd5b5061309386828701612b56565b9150509250925092565b600080604083850312156130b057600080fd5b82356130bb8161291e565b915060208301356130cb8161291e565b809150509250929050565b600080600080600060a086880312156130ee57600080fd5b85356130f98161291e565b945060208601356131098161291e565b9350604086013592506060860135915060808601356001600160401b0381111561313257600080fd5b61302888828901612996565b634e487b7160e01b600052601160045260246000fd5b8181038181111561088f5761088f61313e565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6000602082840312156131a557600080fd5b5051919050565b6000808335601e198436030181126131c357600080fd5b83016020810192503590506001600160401b038111156131e257600080fd5b803603821315612ab157600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b888110156132cd57858403601f19018a52823536899003605e19018112613259578283fd5b8801606081356132688161291e565b6001600160a01b0316865261327f828801836131ac565b828989015261329183890182846131f1565b9250505060406132a3818401846131ac565b9350878303828901526132b78385836131f1565b9d89019d97505050938601935050600101613234565b509198975050505050505050565b60208152600082356132ec8161291e565b6001600160a01b039081166020848101919091528401359061330d8261291e565b80821660408501525050604083013560608301526060830135601e1984360301811261333857600080fd5b83016020810190356001600160401b0381111561335457600080fd5b8060051b360382131561336657600080fd5b60c0608085015261337b60e08501828461321a565b915050608084013560a084015261339560a08501856131ac565b848303601f190160c08601526133ac8382846131f1565b9695505050505050565b6000602082840312156133c857600080fd5b8151610aec81612d45565b6040815260006133e76040830185876131f1565b828103602084015283356133fa8161291e565b6001600160a01b031681526020848101359082015261341c60408501856131ac565b606060408401526134316060840182846131f1565b98975050505050505050565b808202811582820484141761088f5761088f61313e565b60008261347157634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561088f5761088f61313e565b6000808585111561349957600080fd5b838611156134a657600080fd5b5050820193919092039150565b6000600182016134c5576134c561313e565b5060010190565b6000808335601e198436030181126134e357600080fd5b8301803591506001600160401b038211156134fd57600080fd5b602001915036819003821315612ab157600080fd5b8183823760009101908152919050565b83815282151560208201526060604082015260006128156060830184612eca565b60008235605e1983360301811261355957600080fd5b9190910192915050565b634e487b7160e01b600052602160045260246000fd5b60008251613559818460208701612ea656feb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c01b005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212207f3a1345dd207b3e6a7d8045651ded34698ad5d76b8ff402fdacf6337782f2f664736f6c63430008170033000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d780000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x1", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8624bfadfd4d2eb8c588453cd80fe052753e6f09d112861fb191b0df983c3fab", + "transactionType": "CREATE2", + "contractName": "HybridDeleGator", + "contractAddress": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "function": null, + "arguments": [ + "0xbe4138886cB096bDC1B930F2f0ca7892AA234D78", + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x62d183", + "value": "0x0", + "input": "0x44656c654761746f72000000000000000000000000000000000000000000000060e0604052306080523480156200001557600080fd5b50604051620051483803806200514883398101604081905262000038916200018b565b818162000044620000c1565b6001600160a01b0380831660a081905290821660c0526040517fb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d90600090a26040516001600160a01b038216907fee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a9990600090a250505050620001ca565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620001125760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001725780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b03811681146200017257600080fd5b600080604083850312156200019f57600080fd5b8251620001ac8162000175565b6020840151909250620001bf8162000175565b809150509250929050565b60805160a05160c051614e83620002c5600039600081816105e9015281816107f3015281816108a1015281816109c501528181610a4601528181610ac401528181610c2901528181610cde01528181610d6501528181610dfe01528181610eea01528181610fa50152818161101701528181611082015281816112c401528181611343015281816113c00152818161147f015281816116c4015281816117b501526124480152600081816107290152818161090701528181610b2701528181610baa01528181610c8c01528181610dbc015281816110e50152611727015260008181611a9b01528181611ac401526120b50152614e836000f3fe60806040526004361061023f5760003560e01c80637f07bfdc1161012e578063c399ec88116100ab578063e1520f541161006f578063e1520f54146106f7578063ea4d3c9b14610717578063f23a6e611461074b578063f2fde38b1461076b578063ffa1ad741461078b57600080fd5b8063c399ec8814610658578063c8561e731461066d578063d087d2881461068d578063d37aec92146106a2578063d5d33b55146106d757600080fd5b8063aaf10f42116100f2578063aaf10f4214610584578063ad3cb1cc14610599578063b0d691fe146105d7578063b3c650151461060b578063bc197c811461063857600080fd5b80637f07bfdc146104d25780637fade287146104f25780638da5cb5b146105125780638ebf953314610551578063a24c8f321461057157600080fd5b80633ed01015116101bc57806352d1902d1161018057806352d1902d146104485780635c1c6dcd1461045d5780636af1f3991461047d578063715018a61461049d57806378a68ecf146104b257600080fd5b80633ed01015146103cd578063445140b8146103ed578063499340471461040d5780634a58db191461042d5780634f1ef2861461043557600080fd5b80631c03010a116102035780631c03010a1461032957806326f0aef71461034b5780632ffeaad61461036b57806334fcd5be1461038d5780633e1b0812146103ad57600080fd5b806301ffc9a71461024b578063074feff314610280578063150b7a02146102a25780631626ba7e146102db57806319822f7c146102fb57600080fd5b3661024657005b600080fd5b34801561025757600080fd5b5061026b610266366004613e92565b6107bc565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102a061029b366004613f27565b6107e8565b005b3480156102ae57600080fd5b506102c26102bd366004614096565b610859565b6040516001600160e01b03199091168152602001610277565b3480156102e757600080fd5b506102c26102f6366004614142565b610875565b34801561030757600080fd5b5061031b61031636600461418d565b610894565b604051908152602001610277565b34801561033557600080fd5b50600080516020614dae8339815191525461031b565b34801561035757600080fd5b506102a06103663660046141f8565b6108fc565b34801561037757600080fd5b50610380610951565b604051610277919061422c565b34801561039957600080fd5b506102a06103a8366004614264565b6109ba565b3480156103b957600080fd5b5061031b6103c83660046142a5565b610a1f565b3480156103d957600080fd5b506102a06103e83660046142ce565b610ab9565b3480156103f957600080fd5b5061026b610408366004614308565b610b91565b34801561041957600080fd5b506102a06104283660046142ce565b610c1e565b6102a0610cc1565b6102a0610443366004614321565b610d2b565b34801561045457600080fd5b5061031b610d3d565b34801561046957600080fd5b506102a06104783660046141f8565b610d5a565b34801561048957600080fd5b5061026b610498366004614308565b610da3565b3480156104a957600080fd5b506102a0610df3565b3480156104be57600080fd5b506102a06104cd366004614389565b610e56565b3480156104de57600080fd5b506102a06104ed36600461445b565b610f9a565b3480156104fe57600080fd5b506102a061050d3660046142ce565b611077565b34801561051e57600080fd5b50600080516020614d8e833981519152546001600160a01b03165b6040516001600160a01b039091168152602001610277565b34801561055d57600080fd5b506102a061056c366004613f27565b61111a565b6102a061057f366004614321565b610d33565b34801561059057600080fd5b50610539611236565b3480156105a557600080fd5b506105ca604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161027791906144d7565b3480156105e357600080fd5b506105397f000000000000000000000000000000000000000000000000000000000000000081565b34801561061757600080fd5b5061062061125c565b6040516001600160401b039091168152602001610277565b34801561064457600080fd5b506102c2610653366004614569565b61128f565b34801561066457600080fd5b5061031b6112ac565b34801561067957600080fd5b506102a0610688366004614616565b611338565b34801561069957600080fd5b5061031b6113a1565b3480156106ae57600080fd5b506106c26106bd366004614666565b6113f7565b60408051928352602083019190915201610277565b3480156106e357600080fd5b506102a06106f2366004614666565b611474565b34801561070357600080fd5b506102a061071236600461469b565b6116b9565b34801561072357600080fd5b506105397f000000000000000000000000000000000000000000000000000000000000000081565b34801561075757600080fd5b506102c2610766366004614703565b61178e565b34801561077757600080fd5b506102a061078636600461476b565b6117aa565b34801561079757600080fd5b506105ca604051806040016040528060058152602001640312e302e360dc1b81525081565b60006107c78261180a565b806107e257506001600160e01b031982166307f5828d60e41b145b92915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906108215750333014155b1561083f57604051630796d94560e01b815260040160405180910390fd5b61085087878787878787600161189a565b50505050505050565b6000610863611a90565b50630a85bd0160e11b5b949350505050565b600061087f611a90565b61088a848484611b35565b90505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108df57604051636b31ba1560e11b815260040160405180910390fd5b6108e7611a90565b6108f18484611d59565b905061088d82611dcf565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094557604051630692ce8160e21b815260040160405180910390fd5b61094e81611e66565b50565b60606000600080516020614d8e833981519152600281018054604080516020808402820181019092528281529394508301828280156109af57602002820191906000526020600020905b81548152602001906001019080831161099b575b505050505091505090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906109f35750333014155b15610a1157604051630796d94560e01b815260040160405180910390fd5b610a1b8282611f70565b5050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610a95573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e29190614788565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610af25750333014155b15610b1057604051630796d94560e01b815260040160405180910390fd5b604051633ed0101560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633ed0101590610b5c9084906004016148d0565b600060405180830381600087803b158015610b7657600080fd5b505af1158015610b8a573d6000803e3d6000fd5b5050505050565b6040516316a0682960e11b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632d40d052906024015b602060405180830381865afa158015610bfa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e291906149ac565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610c575750333014155b15610c7557604051630796d94560e01b815260040160405180910390fd5b604051634993404760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634993404790610b5c9084906004016148d0565b610cc9611a90565b60405163b760faf960e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b158015610b7657600080fd5b610d33611fd2565b610a1b828261208f565b6000610d476120aa565b50600080516020614dee83398151915290565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094557604051636b31ba1560e11b815260040160405180910390fd5b604051635daa653960e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635daa653990602401610bdd565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610e2c5750333014155b15610e4a57604051630796d94560e01b815260040160405180910390fd5b610e5460006120f3565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460ff8b81169291600160401b90041680610ea0575080546001600160401b03808416911610155b15610ebe5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610f185750333014155b15610f3657604051630796d94560e01b815260040160405180910390fd5b610f468a8a8a8a8a8a8a8a61189a565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15050505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610fd35750333014155b15610ff157604051630796d94560e01b815260040160405180910390fd5b60405163040b850f60e31b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561105b57600080fd5b505af115801561106f573d6000803e3d6000fd5b505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110b05750333014155b156110ce57604051630796d94560e01b815260040160405180910390fd5b604051637fade28760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637fade28790610b5c9084906004016148d0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b031660008115801561115f5750825b90506000826001600160401b0316600114801561117b5750303b155b905081158015611189575080155b156111a75760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156111d157845460ff60401b1916600160401b1785555b6111e28c8c8c8c8c8c8c600061189a565b831561122857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b6000611257600080516020614dee833981519152546001600160a01b031690565b905090565b60006112577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00546001600160401b031690565b6000611299611a90565b5063bc197c8160e01b5b95945050505050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a08231906024015b602060405180830381865afa158015611314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112579190614788565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906113715750333014155b1561138f57604051630796d94560e01b815260040160405180910390fd5b61139b84848484612195565b50505050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a906044016112f7565b60008080600080516020614d8e8339815191529050600081600101600087876040516020016114279291906149c9565b60408051601f198184030181529181528151602092830120835282820193909352908201600020825180840190935280548084526001909101549290910182905297909650945050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906114ad5750333014155b156114cb57604051630796d94560e01b815260040160405180910390fd5b604051600080516020614d8e833981519152906000906114f190859085906020016149c9565b60408051601f19818403018152828252805160209182012060008181526001808801845290849020858501909452835480865293015491840182905293508115801561153b575080155b1561156157604051631a36430d60e31b8152600481018590526024015b60405180910390fd5b600285015460018114801561157e575085546001600160a01b0316155b1561159c5760405163c4c8547360e01b815260040160405180910390fd5b60005b6115aa6001836149ef565b81101561162f57858760020182815481106115c7576115c7614a02565b90600052602060002001540361162757600287016115e66001846149ef565b815481106115f6576115f6614a02565b906000526020600020015487600201828154811061161657611616614a02565b60009182526020909120015561162f565b60010161159f565b508560020180548061164357611643614a18565b60008281526020808220830160001990810183905590920190925586825260018881018252604080842084815590910192909255815185815290810184905286917facf0e8088062f44f734bbcb5223794fd8bb6f6db1c199cb6a72df119d002a71b910160405180910390a25050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906116f25750333014155b1561171057604051630796d94560e01b815260040160405180910390fd5b60405163385483d560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e1520f549061176090869086908690600401614a2e565b600060405180830381600087803b15801561177a57600080fd5b505af1158015610850573d6000803e3d6000fd5b6000611798611a90565b5063f23a6e6160e01b95945050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906117e35750333014155b1561180157604051630796d94560e01b815260040160405180910390fd5b61094e816120f3565b6000611814611a90565b6001600160e01b031982166326f0aef760e01b148061184357506001600160e01b03198216630a85bd0160e11b145b8061185e57506001600160e01b03198216630271189760e51b145b8061187957506001600160e01b031982166301ffc9a760e01b145b806107e2575050630b135d3f60e11b6001600160e01b03198216145b919050565b856001600160a01b0389161580156118b0575080155b80156118b95750815b156118d7576040516312da594d60e11b815260040160405180910390fd5b80851415806118e65750808314155b156119155760405163a297991b60e01b8152600481018290526024810186905260448101849052606401611558565b8115611a0a57600080516020614dae83398151915254600080516020614d8e833981519152908015611a075760005b818110156119f857600083600201828154811061196357611963614a02565b6000918252602080832090910154808352600180880180845260408086208151808301835281548152938101805485880190815286895293909652869055949093558051925193519194509284927facf0e8088062f44f734bbcb5223794fd8bb6f6db1c199cb6a72df119d002a71b926119e69290918252602082015260400190565b60405180910390a25050600101611944565b50611a07600283016000613e60565b50505b60005b81811015611a7b57611a73898983818110611a2a57611a2a614a02565b9050602002810190611a3c9190614a8c565b898985818110611a4e57611a4e614a02565b90506020020135888886818110611a6757611a67614a02565b90506020020135612195565b600101611a0d565b50611a85896120f3565b505050505050505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611b1757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611b0b600080516020614dee833981519152546001600160a01b031690565b6001600160a01b031614155b15610e545760405163703e46dd60e11b815260040160405180910390fd5b6000816041819003611bd257600080516020614d8e833981519152546001600160a01b03166001600160a01b0316611ba38686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061231292505050565b6001600160a01b031603611bc15750630b135d3f60e11b905061088d565b506001600160e01b0319905061088d565b6060811015611bec57506001600160e01b0319905061088d565b600080516020614d8e8339815191526000611c0a6020828789614ad2565b611c1391614afc565b600081815260018085016020908152604092839020835180850190945280548085529201549083015291925090158015611c4f57506020810151155b15611c6957506001600160e01b0319935061088d92505050565b836060148015611cbd5750611cbd8888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505085516020870151909250905061233c565b15611cd65750630b135d3f60e11b935061088d92505050565b83606014158015611d2b5750611d2b8888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508551602087015190925090506123da565b15611d445750630b135d3f60e11b935061088d92505050565b506001600160e01b0319935061088d92505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c829052603c81208190611da190611d9c610100870187614a8c565b611b35565b90506374eca2c160e11b6001600160e01b0319821601611dc55760009150506107e2565b5060019392505050565b801561094e57604051600090339060001990849084818181858888f193505050503d8060008114611e1c576040519150601f19603f3d011682016040523d82523d6000602084013e611e21565b606091505b505060408051848152821515602082015291925033917fa427c7d47f24d01b170779a7600b1d4c0d7cdbabaa0f19c4f0e6182053ffc931910160405180910390a25050565b600080611e76602084018461476b565b6001600160a01b03166020840135611e916040860186614a8c565b604051611e9f9291906149c9565b60006040518083038185875af1925050503d8060008114611edc576040519150601f19603f3d011682016040523d82523d6000602084013e611ee1565b606091505b509092509050611ef4602084018461476b565b6001600160a01b03167f74b56487625d598ffbf59a76c3b58fc1922f54afc86a075bad0c2a8aa05d2ad284602001358484604051611f3493929190614b1a565b60405180910390a281611f6b578051600003611f635760405163764bbf1760e01b815260040160405180910390fd5b805181602001fd5b505050565b806000819003611f9357604051635fc74f2160e11b815260040160405180910390fd5b60005b8181101561139b57611fca848483818110611fb357611fb3614a02565b9050602002810190611fc59190614b3b565b611e66565b600101611f96565b600080516020614dae83398151915254600080516020614d8e8339815191529060005b818110156120455782600101600084600201838154811061201857612018614a02565b60009182526020808320909101548352820192909252604001812081815560019081019190915501611ff5565b50612054600283016000613e60565b81546001600160a01b03191682556040517feb09d532980c3cc73dcad99b80e264204a667a54cbb7b63ec8d68dcb1c7096be90600090a15050565b612097611a90565b6120a08261243d565b610a1b8282612494565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e545760405163703e46dd60e11b815260040160405180910390fd5b600080516020614dae83398151915254600080516020614d8e8339815191529015801561212757506001600160a01b038216155b156121455760405163c4c8547360e01b815260040160405180910390fd5b80546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b61219f8282612551565b6121c6576040516313c3d61f60e01b81526004810183905260248101829052604401611558565b600084846040516020016121db9291906149c9565b6040516020818303038152906040528051906020012090508484905060000361221757604051637e25658160e11b815260040160405180910390fd5b60008181527fa2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694901602052604090208054600080516020614d8e83398151915291901515806122675750600181015415155b15612288576040516361db108160e01b815260048101849052602401611558565b604080518082018252868152602080820187815260008781526001808801845285822094518555915193820193909355600286018054918201815583529120018490555183907fd00539cb08a7c24166308150d64d603150c01baf89d3d3e4c6063d6db7c6983d90612301908a908a908a908a90614b5b565b60405180910390a250505050505050565b600080600080612322868661255d565b92509250925061233282826125aa565b5090949350505050565b600080600061234a86612663565b91509150600060028860405160200161236591815260200190565b60408051601f198184030181529082905261237f91614b82565b602060405180830381855afa15801561239c573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906123bf9190614788565b90506123ce8184848989612685565b98975050505050505050565b6000806123e685612793565b9050612433866040516020016123fe91815260200190565b60408051601f198184030181529181528301516060840151608085015160a086015160c0870151875160208901518c8c612811565b9695505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906124765750333014155b1561094e57604051630796d94560e01b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156124ee575060408051601f3d908101601f191682019092526124eb91810190614788565b60015b61251657604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611558565b600080516020614dee833981519152811461254757604051632a87526960e21b815260048101829052602401611558565b611f6b83836129b1565b600061088d8383612a07565b600080600083516041036125975760208401516040850151606086015160001a61258988828585612b01565b9550955095505050506125a3565b50508151600091506002905b9250925092565b60008260038111156125be576125be614b94565b036125c7575050565b60018260038111156125db576125db614b94565b036125f95760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561260d5761260d614b94565b0361262e5760405163fce698f760e01b815260048101829052602401611558565b600382600381111561264257612642614b94565b03610a1b576040516335e2f38360e21b815260048101829052602401611558565b6000808280602001905181019061267a9190614baa565b909590945092505050565b60006126a06002600080516020614dce833981519152614bd8565b8411156126af575060006112a3565b6040805160208101889052908101869052606081018590526080810184905260a0810183905260009060c00160405160208183030381529060405290506000806101006001600160a01b0316836040516127099190614b82565b600060405180830381855afa9150503d8060008114612744576040519150601f19603f3d011682016040523d82523d6000602084013e612749565b606091505b50915091508115612779578080602001905181019061276891906149ac565b1515600115151493505050506112a3565b6127868989898989612bd0565b9998505050505050505050565b6127d56040518060e001604052806000815260200160008152602001606081526020016000151581526020016060815260200160608152602001600081525090565b818060200190518101906127e99190614c3f565b60c089015260a088015260808701521515606086015260408501526020840152825250919050565b600060258a51108061284b57506128498a60208151811061283457612834614a02565b01602001516001600160f81b0319168a612cb3565b155b15612858575060006129a3565b6000886128648d612d19565b8960405160200161287793929190614cfe565b60408051601f198184030181528282019091526015825274113a3cb832911d113bb2b130baba34371733b2ba1160591b602083015291506128b981838a612f26565b6128c8576000925050506129a3565b60006002836040516128da9190614b82565b602060405180830381855afa1580156128f7573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061291a9190614788565b9050600060028e83604051602001612933929190614d41565b60408051601f198184030181529082905261294d91614b82565b602060405180830381855afa15801561296a573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061298d9190614788565b905061299c818a8a8a8a612685565b9450505050505b9a9950505050505050505050565b6129ba82612fd5565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156129ff57611f6b828261303a565b610a1b6130a7565b600082158015612a15575081155b80612a2d5750600160601b63ffffffff60c01b031983145b80612a455750600160601b63ffffffff60c01b031982145b15612a52575060006107e2565b6000600160601b63ffffffff60c01b031983840990506000600160601b63ffffffff60c01b0319807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc8709600160601b63ffffffff60c01b031987600160601b63ffffffff60c01b0319898a0909089050600160601b63ffffffff60c01b03197f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b820891909114949350505050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612b3c5750600091506003905082612bc6565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612b90573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612bbc57506000925060019150829050612bc6565b9250600091508190505b9450945094915050565b6000841580612bed5750600080516020614dce8339815191528510155b80612bf6575083155b80612c0f5750600080516020614dce8339815191528410155b15612c1c575060006112a3565b612c268383612a07565b612c32575060006112a3565b6000612c3d856130c6565b90506000600080516020614dce83398151915282890990506000600080516020614dce83398151915283890990506000612c7987878585613138565b9050600080516020614dce833981519152612ca28a600080516020614dce8339815191526149ef565b8208159a9950505050505050505050565b6000600160f81b83811614612cca575060006107e2565b818015612cdd5750600160fa1b83811614155b15612cea575060006107e2565b600160fb1b83811614612d1057600f60fc1b600160fc1b841601612d10575060006107e2565b50600192915050565b60606000612d2683613800565b90506000819050600060028251118015612d7157508160028351612d4a91906149ef565b81518110612d5a57612d5a614a02565b6020910101516001600160f81b031916603d60f81b145b15612d7e57506002612dc9565b60018251118015612dc057508160018351612d9991906149ef565b81518110612da957612da9614a02565b6020910101516001600160f81b031916603d60f81b145b15612dc9575060015b6000818351612dd891906149ef565b90506000816001600160401b03811115612df457612df4613fd3565b6040519080825280601f01601f191660200182016040528015612e1e576020820181803683370190505b50905060005b82811015612f1b57848181518110612e3e57612e3e614a02565b01602001516001600160f81b031916602b60f81b03612e8a57602d60f81b828281518110612e6e57612e6e614a02565b60200101906001600160f81b031916908160001a905350612f13565b848181518110612e9c57612e9c614a02565b01602001516001600160f81b031916602f60f81b03612ecc57605f60f81b828281518110612e6e57612e6e614a02565b848181518110612ede57612ede614a02565b602001015160f81c60f81b828281518110612efb57612efb614a02565b60200101906001600160f81b031916908160001a9053505b600101612e24565b509695505050505050565b825182516000918591859190845b82811015612fc65781612f478289614d63565b10612f5a5760009550505050505061088d565b83612f658289614d63565b81518110612f7557612f75614a02565b602001015160f81c60f81b6001600160f81b031916858281518110612f9c57612f9c614a02565b01602001516001600160f81b03191614612fbe5760009550505050505061088d565b600101612f34565b50600198975050505050505050565b806001600160a01b03163b60000361300b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611558565b600080516020614dee83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516130579190614b82565b600060405180830381855af49150503d8060008114613092576040519150601f19603f3d011682016040523d82523d6000602084013e613097565b606091505b50915091506112a3858383613826565b3415610e545760405163b398979f60e01b815260040160405180910390fd5b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f6080820152600080516020614dce83398151915260a082015260208160c0836005600019fa61313157600080fd5b5192915050565b600080808060ff81808815801561314d575087155b15613161576000965050505050505061086d565b6131ad7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d613882565b9092509050811580156131be575080155b156131ec57600080516020614dce83398151915288600080516020614dce833981519152038a089850600097505b600189841c16600189851c1660011b015b8061321f5760018403935060018a851c1660018a861c1660011b0190506131fd565b50600189841c16600189851c1660011b01955060018603613281577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603613290578a96508993505b6003860361329f578196508093505b60018303925060019550600194505b82600019111561378357600160601b63ffffffff60c01b031984600209600160601b63ffffffff60c01b0319818209600160601b63ffffffff60c01b0319818a09600160601b63ffffffff60c01b03198284099250600160601b63ffffffff60c01b031980600160601b63ffffffff60c01b03198b8d08600160601b63ffffffff60c01b03198c600160601b63ffffffff60c01b0319038e0809600309600160601b63ffffffff60c01b03198985099850600160601b63ffffffff60c01b03198a84099950600160601b63ffffffff60c01b031980836002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319838409089a50600160601b63ffffffff60c01b03198083600160601b63ffffffff60c01b0319038d0882099250600160601b63ffffffff60c01b031983600160601b63ffffffff60c01b03198a870908975060018d881c1660018d891c1660011b0190508061342b5787600160601b63ffffffff60c01b031903975050505050613778565b6001810361347a577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103613489578e93508d92505b60038103613498578593508492505b896134b157509198506001975087965094506137789050565b600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b03198b860908600160601b63ffffffff60c01b03198c600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b03198d88090893508061366a578361366a57600160601b63ffffffff60c01b0319896002600160601b0363ffffffff60c01b0319099450600160601b63ffffffff60c01b03198586099350600160601b63ffffffff60c01b0319848d099250600160601b63ffffffff60c01b03198486099450600160601b63ffffffff60c01b0319808c600160601b63ffffffff60c01b0319038e08600160601b63ffffffff60c01b03198d8f08099050600160601b63ffffffff60c01b0319816003099150600160601b63ffffffff60c01b03198a86099950600160601b63ffffffff60c01b03198b85099a50600160601b63ffffffff60c01b031980846002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319848509089b50600160601b63ffffffff60c01b0319808d600160601b63ffffffff60c01b031903850883099350600160601b63ffffffff60c01b0319808a8709850898505050505050613778565b600160601b63ffffffff60c01b03198485099150600160601b63ffffffff60c01b0319848309600160601b63ffffffff60c01b0319838d099b50600160601b63ffffffff60c01b0319818c099a50600160601b63ffffffff60c01b0319838e09600160601b63ffffffff60c01b031980826002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b031984600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b031987880908089350600160601b63ffffffff60c01b031980838d09600160601b63ffffffff60c01b031985600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b031903860809089a50505050809a50505050505b6001830392506132ae565b60405186606082015260208152602080820152602060408201526002600160601b0363ffffffff60c01b03196080820152600160601b63ffffffff60c01b031960a082015260208160c0836005600019fa6137dd57600080fd5b600160601b63ffffffff60c01b0319815189099c9b505050505050505050505050565b60606107e282604051806060016040528060408152602001614e0e604091396001613910565b60608261383b5761383682613a8f565b61088d565b815115801561385257506001600160a01b0384163b155b1561387b57604051639996b31560e01b81526001600160a01b0385166004820152602401611558565b508061088d565b600080808086613899578585935093505050613907565b846138ab578787935093505050613907565b85881480156138b957508487145b156138da576138cb8888600180613ab8565b929a50909850925090506138f4565b6138e988886001808a8a613c13565b929a50909850925090505b61390088888484613d97565b9350935050505b94509492505050565b60608351600003613930575060408051602081019091526000815261088d565b600082613961576003855160046139479190614d76565b613952906002614d63565b61395c9190614bd8565b613986565b6003855160026139719190614d63565b61397b9190614bd8565b613986906004614d76565b90506000816001600160401b038111156139a2576139a2613fd3565b6040519080825280601f01601f1916602001820160405280156139cc576020820181803683370190505b50905060018501602082018788518901602081018051600082525b82841015613a42576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f81168701518653506001850194506139e7565b905250508515613a8357600388510660018114613a665760028114613a7957613a81565b603d6001830353603d6002830353613a81565b603d60018303535b505b50909695505050505050565b805115613a9f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080600080600160601b63ffffffff60c01b0319876002099350600160601b63ffffffff60c01b03198485099150600160601b63ffffffff60c01b03198289099050600160601b63ffffffff60c01b03198285099250600160601b63ffffffff60c01b03198683099150600160601b63ffffffff60c01b031980600160601b63ffffffff60c01b0319888b08600160601b63ffffffff60c01b031989600160601b63ffffffff60c01b0319038c08096003099550600160601b63ffffffff60c01b031980826002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319888909089350600160601b63ffffffff60c01b03198085600160601b63ffffffff60c01b031903830887099750600160601b63ffffffff60c01b03198584099050600160601b63ffffffff60c01b031980888509600160601b63ffffffff60c01b03190389089250945094509450949050565b60008060008088600003613c3257508492508391506001905080613d8a565b600160601b63ffffffff60c01b0319988903988981898809089450600160601b63ffffffff60c01b03198a600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b03198a8909089550600160601b63ffffffff60c01b03198687099350600160601b63ffffffff60c01b03198685099250600160601b63ffffffff60c01b03198489099150600160601b63ffffffff60c01b03198388099050600160601b63ffffffff60c01b0319848b099750600160601b63ffffffff60c01b031980896002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b031985600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b0319898a0908089350600160601b63ffffffff60c01b031980848b09600160601b63ffffffff60c01b031987600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b0319038d08090892505b9650965096509692505050565b6000806000613da584613e04565b9050600160601b63ffffffff60c01b031981870991506000600160601b63ffffffff60c01b03198287099050600160601b63ffffffff60c01b03198182099150600160601b63ffffffff60c01b03198289099350505094509492505050565b600060405160208152602080820152602060408201528260608201526002600160601b0363ffffffff60c01b03196080820152600160601b63ffffffff60c01b031960a082015260208160c0836005600019fa61313157600080fd5b508054600082559060005260206000209081019061094e91905b80821115613e8e5760008155600101613e7a565b5090565b600060208284031215613ea457600080fd5b81356001600160e01b03198116811461088d57600080fd5b6001600160a01b038116811461094e57600080fd5b803561189581613ebc565b60008083601f840112613eee57600080fd5b5081356001600160401b03811115613f0557600080fd5b6020830191508360208260051b8501011115613f2057600080fd5b9250929050565b60008060008060008060006080888a031215613f4257600080fd5b8735613f4d81613ebc565b965060208801356001600160401b0380821115613f6957600080fd5b613f758b838c01613edc565b909850965060408a0135915080821115613f8e57600080fd5b613f9a8b838c01613edc565b909650945060608a0135915080821115613fb357600080fd5b50613fc08a828b01613edc565b989b979a50959850939692959293505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561401157614011613fd3565b604052919050565b60006001600160401b0382111561403257614032613fd3565b50601f01601f191660200190565b600082601f83011261405157600080fd5b813561406461405f82614019565b613fe9565b81815284602083860101111561407957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156140ac57600080fd5b84356140b781613ebc565b935060208501356140c781613ebc565b92506040850135915060608501356001600160401b038111156140e957600080fd5b6140f587828801614040565b91505092959194509250565b60008083601f84011261411357600080fd5b5081356001600160401b0381111561412a57600080fd5b602083019150836020828501011115613f2057600080fd5b60008060006040848603121561415757600080fd5b8335925060208401356001600160401b0381111561417457600080fd5b61418086828701614101565b9497909650939450505050565b6000806000606084860312156141a257600080fd5b83356001600160401b038111156141b857600080fd5b840161012081870312156141cb57600080fd5b95602085013595506040909401359392505050565b6000606082840312156141f257600080fd5b50919050565b60006020828403121561420a57600080fd5b81356001600160401b0381111561422057600080fd5b61086d848285016141e0565b6020808252825182820181905260009190848201906040850190845b81811015613a8357835183529284019291840191600101614248565b6000806020838503121561427757600080fd5b82356001600160401b0381111561428d57600080fd5b61429985828601613edc565b90969095509350505050565b6000602082840312156142b757600080fd5b81356001600160c01b038116811461088d57600080fd5b6000602082840312156142e057600080fd5b81356001600160401b038111156142f657600080fd5b820160c0818503121561088d57600080fd5b60006020828403121561431a57600080fd5b5035919050565b6000806040838503121561433457600080fd5b823561433f81613ebc565b915060208301356001600160401b0381111561435a57600080fd5b61436685828601614040565b9150509250929050565b801515811461094e57600080fd5b803561189581614370565b600080600080600080600080600060c08a8c0312156143a757600080fd5b893560ff811681146143b857600080fd5b98506143c660208b01613ed1565b975060408a01356001600160401b03808211156143e257600080fd5b6143ee8d838e01613edc565b909950975060608c013591508082111561440757600080fd5b6144138d838e01613edc565b909750955060808c013591508082111561442c57600080fd5b506144398c828d01613edc565b909450925061444c905060a08b0161437e565b90509295985092959850929598565b6000806040838503121561446e57600080fd5b823561447981613ebc565b946020939093013593505050565b60005b838110156144a257818101518382015260200161448a565b50506000910152565b600081518084526144c3816020860160208601614487565b601f01601f19169290920160200192915050565b60208152600061088d60208301846144ab565b600082601f8301126144fb57600080fd5b813560206001600160401b0382111561451657614516613fd3565b8160051b614525828201613fe9565b928352848101820192828101908785111561453f57600080fd5b83870192505b8483101561455e57823582529183019190830190614545565b979650505050505050565b600080600080600060a0868803121561458157600080fd5b853561458c81613ebc565b9450602086013561459c81613ebc565b935060408601356001600160401b03808211156145b857600080fd5b6145c489838a016144ea565b945060608801359150808211156145da57600080fd5b6145e689838a016144ea565b935060808801359150808211156145fc57600080fd5b5061460988828901614040565b9150509295509295909350565b6000806000806060858703121561462c57600080fd5b84356001600160401b0381111561464257600080fd5b61464e87828801614101565b90989097506020870135966040013595509350505050565b6000806020838503121561467957600080fd5b82356001600160401b0381111561468f57600080fd5b61429985828601614101565b6000806000604084860312156146b057600080fd5b83356001600160401b03808211156146c757600080fd5b6146d387838801614101565b909550935060208601359150808211156146ec57600080fd5b506146f9868287016141e0565b9150509250925092565b600080600080600060a0868803121561471b57600080fd5b853561472681613ebc565b9450602086013561473681613ebc565b9350604086013592506060860135915060808601356001600160401b0381111561475f57600080fd5b61460988828901614040565b60006020828403121561477d57600080fd5b813561088d81613ebc565b60006020828403121561479a57600080fd5b5051919050565b6000808335601e198436030181126147b857600080fd5b83016020810192503590506001600160401b038111156147d757600080fd5b803603821315613f2057600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b888110156148c257858403601f19018a52823536899003605e1901811261484e578283fd5b88016060813561485d81613ebc565b6001600160a01b03168652614874828801836147a1565b828989015261488683890182846147e6565b925050506040614898818401846147a1565b9350878303828901526148ac8385836147e6565b9d89019d97505050938601935050600101614829565b509198975050505050505050565b60208152600082356148e181613ebc565b6001600160a01b039081166020848101919091528401359061490282613ebc565b80821660408501525050604083013560608301526060830135601e1984360301811261492d57600080fd5b83016020810190356001600160401b0381111561494957600080fd5b8060051b360382131561495b57600080fd5b60c0608085015261497060e08501828461480f565b915050608084013560a084015261498a60a08501856147a1565b848303601f190160c08601526124338382846147e6565b805161189581614370565b6000602082840312156149be57600080fd5b815161088d81614370565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156107e2576107e26149d9565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b604081526000614a426040830185876147e6565b82810360208401528335614a5581613ebc565b6001600160a01b0316815260208481013590820152614a7760408501856147a1565b606060408401526123ce6060840182846147e6565b6000808335601e19843603018112614aa357600080fd5b8301803591506001600160401b03821115614abd57600080fd5b602001915036819003821315613f2057600080fd5b60008085851115614ae257600080fd5b83861115614aef57600080fd5b5050820193919092039150565b803560208310156107e257600019602084900360031b1b1692915050565b83815282151560208201526060604082015260006112a360608301846144ab565b60008235605e19833603018112614b5157600080fd5b9190910192915050565b606081526000614b6f6060830186886147e6565b6020830194909452506040015292915050565b60008251614b51818460208701614487565b634e487b7160e01b600052602160045260246000fd5b600080600060608486031215614bbf57600080fd5b8351925060208401519150604084015190509250925092565b600082614bf557634e487b7160e01b600052601260045260246000fd5b500490565b600082601f830112614c0b57600080fd5b8151614c1961405f82614019565b818152846020838601011115614c2e57600080fd5b61086d826020830160208701614487565b600080600080600080600080610100898b031215614c5c57600080fd5b88519750602089015196506040890151955060608901516001600160401b0380821115614c8857600080fd5b614c948c838d01614bfa565b9650614ca260808c016149a1565b955060a08b0151915080821115614cb857600080fd5b614cc48c838d01614bfa565b945060c08b0151915080821115614cda57600080fd5b50614ce78b828c01614bfa565b92505060e089015190509295985092959890939650565b60008451614d10818460208901614487565b845190830190614d24818360208901614487565b8451910190614d37818360208801614487565b0195945050505050565b60008351614d53818460208801614487565b9190910191825250602001919050565b808201808211156107e2576107e26149d9565b80820281158282048414176107e2576107e26149d956fea2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694900a2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694902ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212208ea6494b631dfbdfca458a1c0a52311f1cf61e8c8eacea1ff8b3b6e773897baa64736f6c63430008170033000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d780000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x2", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x07c7bb6ffcb9def5f803f0ce9e97f21c8f53b11945f946bb726a470c808dfbc4", + "transactionType": "CREATE2", + "contractName": "AllowedCalldataEnforcer", + "contractAddress": "0x48db3835a873d64a4af2c09f014052407c003bd7", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x7ac98", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061059c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610085575b600080fd5b61005961005436600461035a565b61009d565b005b61006e61006936600461041d565b61020c565b60405161007c92919061045f565b60405180910390f35b61005961009336600461035a565b5050505050505050565b60006060806100ac8b8b61020c565b805191945092506100c060408901896104b6565b90506100cc82866104fd565b11156101375760405162461bcd60e51b815260206004820152602f60248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d60448201526e0c6c2d8d8c8c2e8c25ad8cadccee8d608b1b60648201526084015b60405180910390fd5b61014460408901896104b6565b859061015084836104fd565b9261015d9392919061051e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509294506101a192508491508590506102d9565b6101fe5760405162461bcd60e51b815260206004820152602860248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d60448201526763616c6c6461746160c01b606482015260840161012e565b505050505050505050505050565b6000606060218310156102745760405162461bcd60e51b815260206004820152602a60248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d6044820152697465726d732d73697a6560b01b606482015260840161012e565b61028260206000858761051e565b61028b91610548565b915061029a836020818761051e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250949792965091945050505050565b6000818051906020012083805190602001201490505b92915050565b60008083601f84011261030757600080fd5b50813567ffffffffffffffff81111561031f57600080fd5b60208301915083602082850101111561033757600080fd5b9250929050565b80356001600160a01b038116811461035557600080fd5b919050565b60008060008060008060008060c0898b03121561037657600080fd5b883567ffffffffffffffff8082111561038e57600080fd5b61039a8c838d016102f5565b909a50985060208b01359150808211156103b357600080fd5b6103bf8c838d016102f5565b909850965060408b01359150808211156103d857600080fd5b5089016060818c0312156103eb57600080fd5b93506060890135925061040060808a0161033e565b915061040e60a08a0161033e565b90509295985092959890939650565b6000806020838503121561043057600080fd5b823567ffffffffffffffff81111561044757600080fd5b610453858286016102f5565b90969095509350505050565b8281526000602060406020840152835180604085015260005b8181101561049457858101830151858201606001528201610478565b506000606082860101526060601f19601f830116850101925050509392505050565b6000808335601e198436030181126104cd57600080fd5b83018035915067ffffffffffffffff8211156104e857600080fd5b60200191503681900382131561033757600080fd5b808201808211156102ef57634e487b7160e01b600052601160045260246000fd5b6000808585111561052e57600080fd5b8386111561053b57600080fd5b5050820193919092039150565b803560208310156102ef57600019602084900360031b1b169291505056fea264697066735822122094149f339193c37892b2442e24526e5fff221c6592b2b7cd87732677fcc1c9c464736f6c63430008170033", + "nonce": "0x3", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb982a6be26b531e650ed2ff00679111e6eba9932a64780a001d75030c5636e96", + "transactionType": "CREATE2", + "contractName": "AllowedMethodsEnforcer", + "contractAddress": "0xfd731951bf1c52afccee3e6f14ab656475b76dd4", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x8ba05", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610683806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610084575b600080fd5b6100596100543660046103a7565b61009c565b005b61006e61006936600461046a565b6101ff565b60405161007b91906104ac565b60405180910390f35b6100596100923660046103a7565b5050505050505050565b60046100ab60408601866104fa565b9050101561011a5760405162461bcd60e51b815260206004820152603160248201527f416c6c6f7765644d6574686f6473456e666f726365723a696e76616c69642d616044820152700c6e8d2dedc5ac8c2e8c25ad8cadccee8d607b1b60648201526084015b60405180910390fd5b600061012960408601866104fa565b61013891600491600091610541565b6101419161056b565b9050600061014f8a8a6101ff565b805190915060005b818110156101a4578281815181106101715761017161059b565b60200260200101516001600160e01b031916846001600160e01b0319160361019c5750505050610092565b600101610157565b5060405162461bcd60e51b815260206004820152602960248201527f416c6c6f7765644d6574686f6473456e666f726365723a6d6574686f642d6e6f6044820152681d0b585b1b1bddd95960ba1b6064820152608401610111565b606060008261020f6004826105c7565b156102705760405162461bcd60e51b815260206004820152602b60248201527f416c6c6f7765644d6574686f6473456e666f726365723a696e76616c69642d7460448201526a0cae4dae65ad8cadccee8d60ab1b6064820152608401610111565b61027b6004826105f1565b67ffffffffffffffff81111561029357610293610605565b6040519080825280602002602001820160405280156102bc578160200160208202803683370190505b50925060005b81811015610339578581866102d882600461061b565b926102e593929190610541565b6102ee9161056b565b8484815181106103005761030061059b565b6001600160e01b0319909216602092830291909101909101528261032381610634565b9350610332905060048261061b565b90506102c2565b50505092915050565b60008083601f84011261035457600080fd5b50813567ffffffffffffffff81111561036c57600080fd5b60208301915083602082850101111561038457600080fd5b9250929050565b80356001600160a01b03811681146103a257600080fd5b919050565b60008060008060008060008060c0898b0312156103c357600080fd5b883567ffffffffffffffff808211156103db57600080fd5b6103e78c838d01610342565b909a50985060208b013591508082111561040057600080fd5b61040c8c838d01610342565b909850965060408b013591508082111561042557600080fd5b5089016060818c03121561043857600080fd5b93506060890135925061044d60808a0161038b565b915061045b60a08a0161038b565b90509295985092959890939650565b6000806020838503121561047d57600080fd5b823567ffffffffffffffff81111561049457600080fd5b6104a085828601610342565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156104ee5783516001600160e01b031916835292840192918401916001016104c8565b50909695505050505050565b6000808335601e1984360301811261051157600080fd5b83018035915067ffffffffffffffff82111561052c57600080fd5b60200191503681900382131561038457600080fd5b6000808585111561055157600080fd5b8386111561055e57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156105935780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826105d6576105d66105b1565b500690565b634e487b7160e01b600052601160045260246000fd5b600082610600576106006105b1565b500490565b634e487b7160e01b600052604160045260246000fd5b8082018082111561062e5761062e6105db565b92915050565b600060018201610646576106466105db565b506001019056fea26469706673582212204ec9b63db8ffcc611dbc205c0eb5d3daa906537fc4f6d216704a61e004393bed64736f6c63430008170033", + "nonce": "0x4", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x71ce225e8ee95b2ad11f5c6063ed5f77c6d82256e162f10c62823940e0341385", + "transactionType": "CREATE2", + "contractName": "AllowedTargetsEnforcer", + "contractAddress": "0xbc8673c0afa52d86d991c06881e55b2966920564", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x7f38f", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b506105d9806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610084575b600080fd5b61005961005436600461031e565b61009c565b005b61006e6100693660046103e1565b610174565b60405161007b9190610423565b60405180910390f35b61005961009236600461031e565b5050505050505050565b60006100ab6020860186610470565b905060006100b98a8a610174565b805190915060005b8181101561010c578281815181106100db576100db610492565b60200260200101516001600160a01b0316846001600160a01b0316036101045750505050610092565b6001016100c1565b5060405162461bcd60e51b815260206004820152603160248201527f416c6c6f77656454617267657473456e666f726365723a7461726765742d6164604482015270191c995cdccb5b9bdd0b585b1b1bddd959607a1b60648201526084015b60405180910390fd5b60606000826101846014826104be565b156101e55760405162461bcd60e51b815260206004820152602b60248201527f416c6c6f77656454617267657473456e666f726365723a696e76616c69642d7460448201526a0cae4dae65ad8cadccee8d60ab1b606482015260840161016b565b6101f06014826104e8565b67ffffffffffffffff811115610208576102086104fc565b604051908082528060200260200182016040528015610231578160200160208202803683370190505b50925060005b818110156102b05785818661024d826014610512565b9261025a9392919061052b565b61026391610555565b60601c84848151811061027857610278610492565b6001600160a01b03909216602092830291909101909101528261029a8161058a565b93506102a99050601482610512565b9050610237565b50505092915050565b60008083601f8401126102cb57600080fd5b50813567ffffffffffffffff8111156102e357600080fd5b6020830191508360208285010111156102fb57600080fd5b9250929050565b80356001600160a01b038116811461031957600080fd5b919050565b60008060008060008060008060c0898b03121561033a57600080fd5b883567ffffffffffffffff8082111561035257600080fd5b61035e8c838d016102b9565b909a50985060208b013591508082111561037757600080fd5b6103838c838d016102b9565b909850965060408b013591508082111561039c57600080fd5b5089016060818c0312156103af57600080fd5b9350606089013592506103c460808a01610302565b91506103d260a08a01610302565b90509295985092959890939650565b600080602083850312156103f457600080fd5b823567ffffffffffffffff81111561040b57600080fd5b610417858286016102b9565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156104645783516001600160a01b03168352928401929184019160010161043f565b50909695505050505050565b60006020828403121561048257600080fd5b61048b82610302565b9392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826104cd576104cd6104a8565b500690565b634e487b7160e01b600052601160045260246000fd5b6000826104f7576104f76104a8565b500490565b634e487b7160e01b600052604160045260246000fd5b80820180821115610525576105256104d2565b92915050565b6000808585111561053b57600080fd5b8386111561054857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156105825780818660140360031b1b83161692505b505092915050565b60006001820161059c5761059c6104d2565b506001019056fea26469706673582212204a2e5d298e85989e2cc1b01eb90837481124fb817e6ba907174cafb6c568768564736f6c63430008170033", + "nonce": "0x5", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x12ad77ff78b9eded143f1ffacbbf1a19197fda7a31836b879c21b2f0b1a97b51", + "transactionType": "CREATE2", + "contractName": "BlockNumberEnforcer", + "contractAddress": "0xc15faffa0d879b9263c15a46ce31eacfa2e0e8ae", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6942b", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061045b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610092575b600080fd5b6100596100543660046102bd565b6100aa565b005b61006e610069366004610380565b6101b6565b604080516001600160801b0393841681529290911660208301520160405180910390f35b6100596100a03660046102bd565b5050505050505050565b6000806100b78a8a6101b6565b90925090506001600160801b0382161561013457816001600160801b031643116101345760405162461bcd60e51b8152602060048201526024808201527f426c6f636b4e756d626572456e666f726365723a6561726c792d64656c6567616044820152633a34b7b760e11b60648201526084015b60405180910390fd5b6001600160801b038116156101aa57806001600160801b031643106101aa5760405162461bcd60e51b815260206004820152602660248201527f426c6f636b4e756d626572456e666f726365723a657870697265642d64656c6560448201526533b0ba34b7b760d11b606482015260840161012b565b50505050505050505050565b6000806020831461021a5760405162461bcd60e51b815260206004820152602860248201527f426c6f636b4e756d626572456e666f726365723a696e76616c69642d7465726d6044820152670e65ad8cadccee8d60c31b606482015260840161012b565b6102286010600085876103c2565b610231916103ec565b60801c915061024383601081876103c2565b61024c916103ec565b60801c90509250929050565b60008083601f84011261026a57600080fd5b50813567ffffffffffffffff81111561028257600080fd5b60208301915083602082850101111561029a57600080fd5b9250929050565b80356001600160a01b03811681146102b857600080fd5b919050565b60008060008060008060008060c0898b0312156102d957600080fd5b883567ffffffffffffffff808211156102f157600080fd5b6102fd8c838d01610258565b909a50985060208b013591508082111561031657600080fd5b6103228c838d01610258565b909850965060408b013591508082111561033b57600080fd5b5089016060818c03121561034e57600080fd5b93506060890135925061036360808a016102a1565b915061037160a08a016102a1565b90509295985092959890939650565b6000806020838503121561039357600080fd5b823567ffffffffffffffff8111156103aa57600080fd5b6103b685828601610258565b90969095509350505050565b600080858511156103d257600080fd5b838611156103df57600080fd5b5050820193919092039150565b6fffffffffffffffffffffffffffffffff19813581811691601085101561041d5780818660100360031b1b83161692505b50509291505056fea26469706673582212202f1df071a3b936ee3ad015758f36f43130359bf66ac06d4703490535de194a3864736f6c63430008170033", + "nonce": "0x6", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xc76222c57cd0bba8963e9a489018fa29729e6e8a7a9cad5d95347366f66f099d", + "transactionType": "CREATE2", + "contractName": "DeployedEnforcer", + "contractAddress": "0x5accb9559b56a6c1e3f90e342c85c42d93720d43", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x8f463", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b506106b5806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063481286e6146100515780639751a83d14610081578063b99deb0e14610096578063de723eeb146100b8575b600080fd5b61006461005f366004610410565b6100d0565b6040516001600160a01b0390911681526020015b60405180910390f35b61009461008f366004610497565b6100e5565b005b6100a96100a436600461055a565b6101e4565b6040516100789392919061059c565b6100946100c6366004610497565b5050505050505050565b60006100dc82846102ca565b90505b92915050565b60008060006100f48b8b6101e4565b919450925090506001600160a01b0383163b1561014f576040516001600160a01b03841681527f641dafeb23238fae3ef71c64fced975da90c34dede63890507f3dda6b1e0dfef9060200160405180910390a15050506100c6565b600061015b82846102d7565b9050836001600160a01b0316816001600160a01b0316146101d65760405162461bcd60e51b815260206004820152602a60248201527f4465706c6f796564456e666f726365723a6465706c6f7965642d6164647265736044820152690e65adad2e6dac2e8c6d60b31b60648201526084015b60405180910390fd5b505050505050505050505050565b6000806060603484116102475760405162461bcd60e51b815260206004820152602560248201527f4465706c6f796564456e666f726365723a696e76616c69642d7465726d732d6c6044820152640cadccee8d60db1b60648201526084016101cd565b610255601460008688610602565b61025e9161062c565b60601c9250610271603460148688610602565b61027a91610661565b91506102898460348188610602565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509598949750919550929350505050565b60006100dc83833061035f565b60006102e560008385610389565b9050806001600160a01b03163b60000361031d576040516352c7cd4960e11b81526001600160a01b03821660048201526024016101cd565b6040516001600160a01b03821681527faf3c4b03f515b5a38f3c238fdc24abf10854a2f27f2a85743a71de17e9bc7e7f9060200160405180910390a192915050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6000834710156103b55760405163392efb2b60e21b8152476004820152602481018590526044016101cd565b81516000036103d757604051631328927760e21b815260040160405180910390fd5b8282516020840186f590506001600160a01b03811661040957604051633a0ba96160e11b815260040160405180910390fd5b9392505050565b6000806040838503121561042357600080fd5b50508035926020909101359150565b60008083601f84011261044457600080fd5b50813567ffffffffffffffff81111561045c57600080fd5b60208301915083602082850101111561047457600080fd5b9250929050565b80356001600160a01b038116811461049257600080fd5b919050565b60008060008060008060008060c0898b0312156104b357600080fd5b883567ffffffffffffffff808211156104cb57600080fd5b6104d78c838d01610432565b909a50985060208b01359150808211156104f057600080fd5b6104fc8c838d01610432565b909850965060408b013591508082111561051557600080fd5b5089016060818c03121561052857600080fd5b93506060890135925061053d60808a0161047b565b915061054b60a08a0161047b565b90509295985092959890939650565b6000806020838503121561056d57600080fd5b823567ffffffffffffffff81111561058457600080fd5b61059085828601610432565b90969095509350505050565b60018060a01b03841681526000602084602084015260606040840152835180606085015260005b818110156105df578581018301518582016080015282016105c3565b506000608082860101526080601f19601f83011685010192505050949350505050565b6000808585111561061257600080fd5b8386111561061f57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106595780818660140360031b1b83161692505b505092915050565b803560208310156100df57600019602084900360031b1b169291505056fea2646970667358221220adae6ada7a0e210e98db78555afd35a3b834fe39e89d1ae92e20b35e9cc9358664736f6c63430008170033", + "nonce": "0x7", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x05653e8b67b12ea98443d499c0c21b3f3176bf1b9dc52470ef315ae2328f6129", + "transactionType": "CREATE2", + "contractName": "ERC20BalanceGteEnforcer", + "contractAddress": "0xb5d6b1ec6d868a3bae5b7f48178eaa2686a7a087", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xa3337", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061074a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806332a16f4e146100675780638678d6ef1461009f5780639751a83d146100c0578063b5e54492146100d5578063b99deb0e146100f5578063de723eeb14610127575b600080fd5b61008a61007536600461049d565b60016020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100b26100ad3660046104d2565b61013a565b604051908152602001610096565b6100d36100ce366004610557565b61014f565b005b6100b26100e336600461049d565b60006020819052908152604090205481565b61010861010336600461061a565b610289565b604080516001600160a01b039093168352602083019190915201610096565b6100d3610135366004610557565b61032f565b600061014784848461045a565b949350505050565b600061015b8989610289565b509050600061016b33838761045a565b60008181526001602052604090205490915060ff16156101e55760405162461bcd60e51b815260206004820152602a60248201527f455243323042616c616e6365477465456e666f726365723a656e666f726365726044820152690b5a5ccb5b1bd8dad95960b21b60648201526084015b60405180910390fd5b6000818152600160208190526040808320805460ff1916909217909155516370a0823160e01b81526001600160a01b0386811660048301528416906370a0823190602401602060405180830381865afa158015610246573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026a919061065c565b6000928352602083905260409092209190915550505050505050505050565b600080603483146102f15760405162461bcd60e51b815260206004820152602c60248201527f455243323042616c616e6365477465456e666f726365723a696e76616c69642d60448201526b0e8cae4dae65ad8cadccee8d60a31b60648201526084016101dc565b6102ff601460008587610675565b6103089161069f565b60601c915061031a8360148187610675565b610323916106d4565b60001c90509250929050565b60008061033c8a8a610289565b91509150600061034d33848861045a565b600081815260016020526040808220805460ff19169055516370a0823160e01b81526001600160a01b03888116600483015292935090918516906370a0823190602401602060405180830381865afa1580156103ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d1919061065c565b6000838152602081905260409020549091506103ee9084906106f3565b81101561044c5760405162461bcd60e51b815260206004820152602660248201527f455243323042616c616e6365477465456e666f726365723a62616c616e63652d6044820152651b9bdd0b59dd60d21b60648201526084016101dc565b505050505050505050505050565b604080516001600160a01b039485166020808301919091529390941684820152606080850192909252805180850390920182526080909301909252815191012090565b6000602082840312156104af57600080fd5b5035919050565b80356001600160a01b03811681146104cd57600080fd5b919050565b6000806000606084860312156104e757600080fd5b6104f0846104b6565b92506104fe602085016104b6565b9150604084013590509250925092565b60008083601f84011261052057600080fd5b50813567ffffffffffffffff81111561053857600080fd5b60208301915083602082850101111561055057600080fd5b9250929050565b60008060008060008060008060c0898b03121561057357600080fd5b883567ffffffffffffffff8082111561058b57600080fd5b6105978c838d0161050e565b909a50985060208b01359150808211156105b057600080fd5b6105bc8c838d0161050e565b909850965060408b01359150808211156105d557600080fd5b5089016060818c0312156105e857600080fd5b9350606089013592506105fd60808a016104b6565b915061060b60a08a016104b6565b90509295985092959890939650565b6000806020838503121561062d57600080fd5b823567ffffffffffffffff81111561064457600080fd5b6106508582860161050e565b90969095509350505050565b60006020828403121561066e57600080fd5b5051919050565b6000808585111561068557600080fd5b8386111561069257600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106cc5780818660140360031b1b83161692505b505092915050565b803560208310156106ed57600019602084900360031b1b165b92915050565b808201808211156106ed57634e487b7160e01b600052601160045260246000fdfea2646970667358221220706a4bd5217d105228b49e7ecb48d785e4c5a4cbd88c1e0018e40907dafc0c9d64736f6c63430008170033", + "nonce": "0x8", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x77a5cbe90102a2e3c410fce45de35b1b8573510a680b4ae50092f74ace974ff7", + "transactionType": "CREATE2", + "contractName": "ERC20TransferAmountEnforcer", + "contractAddress": "0x92ac423b9c111962179a6242e1adb58d02c103be", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x990f4", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061073b806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80639751a83d146100515780639dd5d9ab14610066578063b99deb0e146100a1578063de723eeb146100d3575b600080fd5b61006461005f366004610480565b6100eb565b005b61008e610074366004610543565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b6100b46100af36600461056d565b610383565b604080516001600160a01b039093168352602083019190915201610098565b6100646100e1366004610480565b5050505050505050565b6100f860408501856105af565b90506044146101565760405162461bcd60e51b815260206004820152603160248201526000805160206106e68339815191526044820152700d8d2c85ac2c6e8d2dedc5ad8cadccee8d607b1b60648201526084015b60405180910390fd5b6000806101638a8a610383565b9092509050600061017760208801886105f6565b905063a9059cbb60e01b6001600160a01b03848116908316146101df5760405162461bcd60e51b815260206004820152602c60248201526000805160206106e683398151915260448201526b1b1a590b58dbdb9d1c9858dd60a21b606482015260840161014d565b60006101ee60408a018a6105af565b6101fd91600491600091610618565b61020691610642565b90506001600160e01b0319808216908316146102655760405162461bcd60e51b815260206004820152602a60248201526000805160206106e68339815191526044820152691b1a590b5b595d1a1bd960b21b606482015260840161014d565b600061027460408b018b6105af565b61028391604491602491610618565b61028c91610672565b336000908152602081815260408083208d845290915281208054929350909183919083906102bb908490610691565b92505081905590508581111561032a5760405162461bcd60e51b815260206004820152602e60248201527f45524332305472616e73666572416d6f756e74456e666f726365723a616c6c6f60448201526d1dd85b98d94b595e18d95959195960921b606482015260840161014d565b60408051878152602081018390528b916001600160a01b038b169133917fc026e493323d526061a052b5dd562495120e2f648797a48be61966d3a6beec8d910160405180910390a4505050505050505050505050505050565b600080603483146103dd5760405162461bcd60e51b815260206004820152603060248201526000805160206106e683398151915260448201526f0d8d2c85ae8cae4dae65ad8cadccee8d60831b606482015260840161014d565b6103eb601460008587610618565b6103f4916106b2565b60601c91506104068360148187610618565b61040f91610672565b60001c90509250929050565b60008083601f84011261042d57600080fd5b50813567ffffffffffffffff81111561044557600080fd5b60208301915083602082850101111561045d57600080fd5b9250929050565b80356001600160a01b038116811461047b57600080fd5b919050565b60008060008060008060008060c0898b03121561049c57600080fd5b883567ffffffffffffffff808211156104b457600080fd5b6104c08c838d0161041b565b909a50985060208b01359150808211156104d957600080fd5b6104e58c838d0161041b565b909850965060408b01359150808211156104fe57600080fd5b5089016060818c03121561051157600080fd5b93506060890135925061052660808a01610464565b915061053460a08a01610464565b90509295985092959890939650565b6000806040838503121561055657600080fd5b61055f83610464565b946020939093013593505050565b6000806020838503121561058057600080fd5b823567ffffffffffffffff81111561059757600080fd5b6105a38582860161041b565b90969095509350505050565b6000808335601e198436030181126105c657600080fd5b83018035915067ffffffffffffffff8211156105e157600080fd5b60200191503681900382131561045d57600080fd5b60006020828403121561060857600080fd5b61061182610464565b9392505050565b6000808585111561062857600080fd5b8386111561063557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561066a5780818660040360031b1b83161692505b505092915050565b8035602083101561068b57600019602084900360031b1b165b92915050565b8082018082111561068b57634e487b7160e01b600052601160045260246000fd5b6bffffffffffffffffffffffff19813581811691601485101561066a5760149490940360031b84901b169092169291505056fe45524332305472616e73666572416d6f756e74456e666f726365723a696e7661a2646970667358221220bbaa47e7ff7ca5d260ee2e4ae44f60d5ed447ee0a25335e020538968f33cc37d64736f6c63430008170033", + "nonce": "0x9", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x7c20f2fe73f6e1d797edc21935033daccf9cf96e52a96ec47cbd3d3d4d716906", + "transactionType": "CREATE2", + "contractName": "IdEnforcer", + "contractAddress": "0x34152d9f3f8f74338d50703e780389e829b4abac", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x667df", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610486806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063595dce48146100515780639751a83d14610079578063b99deb0e1461008e578063de723eeb146100af575b600080fd5b61006461005f3660046102a8565b6100c7565b60405190151581526020015b60405180910390f35b61008c61008736600461032d565b6100fe565b005b6100a161009c3660046103f0565b610204565b604051908152602001610070565b61008c6100bd36600461032d565b5050505050505050565b6001600160a01b0380841660009081526020818152604080832093861683529290529081206100f69083610267565b949350505050565b600061010a8989610204565b90506101173384836100c7565b156101695760405162461bcd60e51b815260206004820152601a60248201527f4964456e666f726365723a69642d616c72656164792d7573656400000000000060448201526064015b60405180910390fd5b336000908152602081815260408083206001600160a01b03871684528252808320600885901c845290915290208054600160ff84161b179055826001600160a01b0316826001600160a01b0316336001600160a01b03167f6286af1aaf28b34723a53056e5608eabb40c823d1ce093ff371cf08c502431d6846040516101f191815260200190565b60405180910390a4505050505050505050565b6000602082146102565760405162461bcd60e51b815260206004820152601f60248201527f4964456e666f726365723a696e76616c69642d7465726d732d6c656e677468006044820152606401610160565b6102608284610432565b9392505050565b600881901c600090815260208390526040902054600160ff83161b1615155b92915050565b80356001600160a01b03811681146102a357600080fd5b919050565b6000806000606084860312156102bd57600080fd5b6102c68461028c565b92506102d46020850161028c565b9150604084013590509250925092565b60008083601f8401126102f657600080fd5b50813567ffffffffffffffff81111561030e57600080fd5b60208301915083602082850101111561032657600080fd5b9250929050565b60008060008060008060008060c0898b03121561034957600080fd5b883567ffffffffffffffff8082111561036157600080fd5b61036d8c838d016102e4565b909a50985060208b013591508082111561038657600080fd5b6103928c838d016102e4565b909850965060408b01359150808211156103ab57600080fd5b5089016060818c0312156103be57600080fd5b9350606089013592506103d360808a0161028c565b91506103e160a08a0161028c565b90509295985092959890939650565b6000806020838503121561040357600080fd5b823567ffffffffffffffff81111561041a57600080fd5b610426858286016102e4565b90969095509350505050565b8035602083101561028657600019602084900360031b1b169291505056fea264697066735822122028074431512be4166d9bc04a0557354e43d233df6620f59dcf4e6fea83a3a51f64736f6c63430008170033", + "nonce": "0xa", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xfd57c21c61ffadeaf8b92a6c2eed0911580a7ee7159462462634e7d64af809a2", + "transactionType": "CREATE2", + "contractName": "LimitedCallsEnforcer", + "contractAddress": "0x4b3adad4a328bee8ba17b86074d92fe7372180cd", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x61904", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610442806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806319054d89146100515780639751a83d1461008b578063b99deb0e146100a0578063de723eeb146100b3575b600080fd5b61007961005f36600461024e565b600060208181529281526040808220909352908152205481565b60405190815260200160405180910390f35b61009e6100993660046102c1565b6100cb565b005b6100796100ae366004610384565b6101bd565b61009e6100c13660046102c1565b5050505050505050565b60006100d789896101bd565b336000908152602081815260408083208884529091528120805492935090918290610101906103c6565b91829055509050818111156101695760405162461bcd60e51b815260206004820152602360248201527f4c696d6974656443616c6c73456e666f726365723a6c696d69742d657863656560448201526219195960ea1b60648201526084015b60405180910390fd5b604080518381526020810183905286916001600160a01b0386169133917f449da07f2c06c9d1a6b19d2454ffe749e8cf991d22f686e076a1a4844c5ff370910160405180910390a450505050505050505050565b6000602082146102215760405162461bcd60e51b815260206004820152602960248201527f4c696d6974656443616c6c73456e666f726365723a696e76616c69642d7465726044820152680dae65ad8cadccee8d60bb1b6064820152608401610160565b61022b82846103ed565b9392505050565b80356001600160a01b038116811461024957600080fd5b919050565b6000806040838503121561026157600080fd5b61026a83610232565b946020939093013593505050565b60008083601f84011261028a57600080fd5b50813567ffffffffffffffff8111156102a257600080fd5b6020830191508360208285010111156102ba57600080fd5b9250929050565b60008060008060008060008060c0898b0312156102dd57600080fd5b883567ffffffffffffffff808211156102f557600080fd5b6103018c838d01610278565b909a50985060208b013591508082111561031a57600080fd5b6103268c838d01610278565b909850965060408b013591508082111561033f57600080fd5b5089016060818c03121561035257600080fd5b93506060890135925061036760808a01610232565b915061037560a08a01610232565b90509295985092959890939650565b6000806020838503121561039757600080fd5b823567ffffffffffffffff8111156103ae57600080fd5b6103ba85828601610278565b90969095509350505050565b6000600182016103e657634e487b7160e01b600052601160045260246000fd5b5060010190565b8035602083101561040657600019602084900360031b1b165b9291505056fea2646970667358221220f78aa8066d472e78f2d898b70704f695cf682a9b2914539b1a5a83b1dd87e31064736f6c63430008170033", + "nonce": "0xb", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xaf5909bb3552ad8ecbca99408b487b63606d882806167605800398c7c941a11b", + "transactionType": "CREATE2", + "contractName": "NonceEnforcer", + "contractAddress": "0x2f32ff3fc3086d7f63f16fe8d0065390d460b40d", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x68e23", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610457806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80632bd4ed211461005c5780639751a83d14610096578063b99deb0e146100ab578063de723eeb146100be578063f5743c4c146100d6575b600080fd5b61008461006a366004610266565b600060208181529281526040808220909352908152205481565b60405190815260200160405180910390f35b6100a96100a43660046102e2565b6100e9565b005b6100846100b93660046103a5565b610178565b6100a96100cc3660046102e2565b5050505050505050565b6100a96100e43660046103e7565b6101e6565b60006100f58989610178565b336000908152602081815260408083206001600160a01b0388168452909152902054909150811461016d5760405162461bcd60e51b815260206004820152601b60248201527f4e6f6e6365456e666f726365723a696e76616c69642d6e6f6e6365000000000060448201526064015b60405180910390fd5b505050505050505050565b6000602082146101d55760405162461bcd60e51b815260206004820152602260248201527f4e6f6e6365456e666f726365723a696e76616c69642d7465726d732d6c656e676044820152610e8d60f31b6064820152608401610164565b6101df8284610402565b9392505050565b6001600160a01b038116600081815260208181526040808320338085529083529281902080546001810190915590518181529093917fe02d340254c92bc3ad96f0fceb790db939e11c669c1f4c8a549d248f17130b33910160405180910390a35050565b80356001600160a01b038116811461026157600080fd5b919050565b6000806040838503121561027957600080fd5b6102828361024a565b91506102906020840161024a565b90509250929050565b60008083601f8401126102ab57600080fd5b50813567ffffffffffffffff8111156102c357600080fd5b6020830191508360208285010111156102db57600080fd5b9250929050565b60008060008060008060008060c0898b0312156102fe57600080fd5b883567ffffffffffffffff8082111561031657600080fd5b6103228c838d01610299565b909a50985060208b013591508082111561033b57600080fd5b6103478c838d01610299565b909850965060408b013591508082111561036057600080fd5b5089016060818c03121561037357600080fd5b93506060890135925061038860808a0161024a565b915061039660a08a0161024a565b90509295985092959890939650565b600080602083850312156103b857600080fd5b823567ffffffffffffffff8111156103cf57600080fd5b6103db85828601610299565b90969095509350505050565b6000602082840312156103f957600080fd5b6101df8261024a565b8035602083101561041b57600019602084900360031b1b165b9291505056fea2646970667358221220b8ac9ab0759f02df69d888b08c000fa4dfa4048ad7f88931687eeff439dd484a64736f6c63430008170033", + "nonce": "0xc", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x5dc28ca47dee5c10a09386daaa01dabdd7c6ee4e748e1e95edd84483b64db4d2", + "transactionType": "CREATE2", + "contractName": "TimestampEnforcer", + "contractAddress": "0x78e05f779490c24bf3bfa135b4112e7003b321cd", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x68cc4", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610455806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610092575b600080fd5b6100596100543660046102b7565b6100aa565b005b61006e61006936600461037a565b6101b2565b604080516001600160801b0393841681529290911660208301520160405180910390f35b6100596100a03660046102b7565b5050505050505050565b6000806100b78a8a6101b2565b90925090506001600160801b0382161561013357816001600160801b031642116101335760405162461bcd60e51b815260206004820152602260248201527f54696d657374616d70456e666f726365723a6561726c792d64656c656761746960448201526137b760f11b60648201526084015b60405180910390fd5b6001600160801b038116156101a657806001600160801b031642106101a65760405162461bcd60e51b8152602060048201526024808201527f54696d657374616d70456e666f726365723a657870697265642d64656c6567616044820152633a34b7b760e11b606482015260840161012a565b50505050505050505050565b600080602083146102145760405162461bcd60e51b815260206004820152602660248201527f54696d657374616d70456e666f726365723a696e76616c69642d7465726d732d6044820152650d8cadccee8d60d31b606482015260840161012a565b61022183601081876103bc565b61022a916103e6565b60801c905061023d6010600085876103bc565b610246916103e6565b60801c91509250929050565b60008083601f84011261026457600080fd5b50813567ffffffffffffffff81111561027c57600080fd5b60208301915083602082850101111561029457600080fd5b9250929050565b80356001600160a01b03811681146102b257600080fd5b919050565b60008060008060008060008060c0898b0312156102d357600080fd5b883567ffffffffffffffff808211156102eb57600080fd5b6102f78c838d01610252565b909a50985060208b013591508082111561031057600080fd5b61031c8c838d01610252565b909850965060408b013591508082111561033557600080fd5b5089016060818c03121561034857600080fd5b93506060890135925061035d60808a0161029b565b915061036b60a08a0161029b565b90509295985092959890939650565b6000806020838503121561038d57600080fd5b823567ffffffffffffffff8111156103a457600080fd5b6103b085828601610252565b90969095509350505050565b600080858511156103cc57600080fd5b838611156103d957600080fd5b5050820193919092039150565b6fffffffffffffffffffffffffffffffff1981358181169160108510156104175780818660100360031b1b83161692505b50509291505056fea2646970667358221220032d822c6d896afe6d14f1080a0918e2996d1c61fe51449e6ecf5841d50e5ea464736f6c63430008170033", + "nonce": "0xd", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xac746b93bfe440edf52c1b36970057bff853429c26cdfd0a3a782bd0ebd34d5b", + "transactionType": "CREATE2", + "contractName": "ValueLteEnforcer", + "contractAddress": "0xfc20ede0a1132e839fbda9d7ed3904ff3c89540f", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x4e4e9", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061033a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610080575b600080fd5b6100596100543660046101e0565b610098565b005b61006e6100693660046102a3565b61010a565b60405190815260200160405180910390f35b61005961008e3660046101e0565b5050505050505050565b60006100a4898961010a565b905080856020013511156100ff5760405162461bcd60e51b815260206004820152601f60248201527f56616c75654c7465456e666f726365723a76616c75652d746f6f2d686967680060448201526064015b60405180910390fd5b505050505050505050565b60006020821461016a5760405162461bcd60e51b815260206004820152602560248201527f56616c75654c7465456e666f726365723a696e76616c69642d7465726d732d6c6044820152640cadccee8d60db1b60648201526084016100f6565b61017482846102e5565b9392505050565b60008083601f84011261018d57600080fd5b50813567ffffffffffffffff8111156101a557600080fd5b6020830191508360208285010111156101bd57600080fd5b9250929050565b80356001600160a01b03811681146101db57600080fd5b919050565b60008060008060008060008060c0898b0312156101fc57600080fd5b883567ffffffffffffffff8082111561021457600080fd5b6102208c838d0161017b565b909a50985060208b013591508082111561023957600080fd5b6102458c838d0161017b565b909850965060408b013591508082111561025e57600080fd5b5089016060818c03121561027157600080fd5b93506060890135925061028660808a016101c4565b915061029460a08a016101c4565b90509295985092959890939650565b600080602083850312156102b657600080fd5b823567ffffffffffffffff8111156102cd57600080fd5b6102d98582860161017b565b90969095509350505050565b803560208310156102fe57600019602084900360031b1b165b9291505056fea2646970667358221220cd4bcb89c90c60ef26b293e82752e5ff08228ce4ed86119c5597e63559710ece64736f6c63430008170033", + "nonce": "0xe", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0xe9d053", + "logs": [ + { + "address": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44" + ], + "data": "0x", + "blockHash": "0x1feb8408453b2f6d155c95dc6326fe99c84238f454b5c4ca931fe0dbce2f577b", + "blockNumber": "0x38555db", + "transactionHash": "0xcb39ffe893b9ca1f1c9312c7b2fa2bc55fe118890468834d809012d2bcb4dafd", + "transactionIndex": "0x2b", + "logIndex": "0x155", + "removed": false + }, + { + "address": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "topics": [ + "0x04a46d9007577c7ff1e513b900545162ec25d25991ae3dc60cf26ec01a84806d", + "0x66b07eb328d4931ed5059b98c30f82b100a7e08d3471916eacdd2c66d7688c23", + "0x000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d78" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000089000000000000000000000000000000000000000000000000000000000000001144656c65676174696f6e4d616e6167657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013100000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x1feb8408453b2f6d155c95dc6326fe99c84238f454b5c4ca931fe0dbce2f577b", + "blockNumber": "0x38555db", + "transactionHash": "0xcb39ffe893b9ca1f1c9312c7b2fa2bc55fe118890468834d809012d2bcb4dafd", + "transactionIndex": "0x2b", + "logIndex": "0x156", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x000000000000000000000000127685d6dd6683085da4b6a041efcef1681e5c9c" + ], + "data": "0x00000000000000000000000000000000000000000000000000e66c040f39cb5e000000000000000000000000000000000000000000000001227ca44d7827e26e000000000000000000000000000000000000000000000a4e6d879be7c34d59420000000000000000000000000000000000000000000000012196384968ee1710000000000000000000000000000000000000000000000a4e6e6e07ebd28724a0", + "blockHash": "0x1feb8408453b2f6d155c95dc6326fe99c84238f454b5c4ca931fe0dbce2f577b", + "blockNumber": "0x38555db", + "transactionHash": "0xcb39ffe893b9ca1f1c9312c7b2fa2bc55fe118890468834d809012d2bcb4dafd", + "transactionIndex": "0x2b", + "logIndex": "0x157", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000000000000000040000000000000800000004000000000000000004000000000000000000000008000000000000000041000020000000000000000000000040000000000800001000000001000000100000000000000000000020000000000000000000800000000000080000080000000000000480000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000020040000001000000000000080000000000000000108000000020000000000800000000000000000000000000000000000004000000000000100020", + "type": "0x2", + "transactionHash": "0xcb39ffe893b9ca1f1c9312c7b2fa2bc55fe118890468834d809012d2bcb4dafd", + "transactionIndex": "0x2b", + "blockHash": "0x1feb8408453b2f6d155c95dc6326fe99c84238f454b5c4ca931fe0dbce2f577b", + "blockNumber": "0x38555db", + "gasUsed": "0x1faf25", + "effectiveGasPrice": "0x745c057d8", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xfd2309", + "logs": [ + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0x23ec2cc23b3148473d1cbafb1f34469204caa453c995964fe2bd64b20b0123c2", + "blockNumber": "0x38555dd", + "transactionHash": "0x1b99347a0a496c05b1eebb642cfda3f631c5e2a1d77e3253d93de0ecf274c987", + "transactionIndex": "0x4f", + "logIndex": "0x1bf", + "removed": false + }, + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0xb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d", + "0x000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d78" + ], + "data": "0x", + "blockHash": "0x23ec2cc23b3148473d1cbafb1f34469204caa453c995964fe2bd64b20b0123c2", + "blockNumber": "0x38555dd", + "transactionHash": "0x1b99347a0a496c05b1eebb642cfda3f631c5e2a1d77e3253d93de0ecf274c987", + "transactionIndex": "0x4f", + "logIndex": "0x1c0", + "removed": false + }, + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0xee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a99", + "0x0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032" + ], + "data": "0x", + "blockHash": "0x23ec2cc23b3148473d1cbafb1f34469204caa453c995964fe2bd64b20b0123c2", + "blockNumber": "0x38555dd", + "transactionHash": "0x1b99347a0a496c05b1eebb642cfda3f631c5e2a1d77e3253d93de0ecf274c987", + "transactionIndex": "0x4f", + "logIndex": "0x1c1", + "removed": false + }, + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0x78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d03" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x23ec2cc23b3148473d1cbafb1f34469204caa453c995964fe2bd64b20b0123c2", + "blockNumber": "0x38555dd", + "transactionHash": "0x1b99347a0a496c05b1eebb642cfda3f631c5e2a1d77e3253d93de0ecf274c987", + "transactionIndex": "0x4f", + "logIndex": "0x1c2", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x000000000000000000000000127685d6dd6683085da4b6a041efcef1681e5c9c" + ], + "data": "0x00000000000000000000000000000000000000000000000001585d63fe6a9e780000000000000000000000000000000000000000000000012196384744268836000000000000000000000000000000000000000000000a4e910eff94a520c009000000000000000000000000000000000000000000000001203ddae345bbe9be000000000000000000000000000000000000000000000a4e92675cf8a38b5e81", + "blockHash": "0x23ec2cc23b3148473d1cbafb1f34469204caa453c995964fe2bd64b20b0123c2", + "blockNumber": "0x38555dd", + "transactionHash": "0x1b99347a0a496c05b1eebb642cfda3f631c5e2a1d77e3253d93de0ecf274c987", + "transactionIndex": "0x4f", + "logIndex": "0x1c3", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000002000010000000000000000000000200000000000000000000000000000000000000000000000008000000000020810040000020000010000000000100000000000000000800000000000001000000100000000000000000000000000000000000000000000000000200080000080000000000000080000000000000000008800000000000000000000000080000000000000000000200000020000000000000000000000000000000000000000000000000000004000000000000000000001080000000000080000000004000000100000000000000000000000000000000000000000000000800000000004000100000000100020", + "type": "0x2", + "transactionHash": "0x1b99347a0a496c05b1eebb642cfda3f631c5e2a1d77e3253d93de0ecf274c987", + "transactionIndex": "0x4f", + "blockHash": "0x23ec2cc23b3148473d1cbafb1f34469204caa453c995964fe2bd64b20b0123c2", + "blockNumber": "0x38555dd", + "gasUsed": "0x2f5a14", + "effectiveGasPrice": "0x745c05808", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xac44cd", + "logs": [ + { + "address": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0x04d8fb2b55cd050f64b980790a70cd29f7b82c5008bb17092581d7d74639ee93", + "blockNumber": "0x38555e0", + "transactionHash": "0x8624bfadfd4d2eb8c588453cd80fe052753e6f09d112861fb191b0df983c3fab", + "transactionIndex": "0x25", + "logIndex": "0x118", + "removed": false + }, + { + "address": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "topics": [ + "0xb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d", + "0x000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d78" + ], + "data": "0x", + "blockHash": "0x04d8fb2b55cd050f64b980790a70cd29f7b82c5008bb17092581d7d74639ee93", + "blockNumber": "0x38555e0", + "transactionHash": "0x8624bfadfd4d2eb8c588453cd80fe052753e6f09d112861fb191b0df983c3fab", + "transactionIndex": "0x25", + "logIndex": "0x119", + "removed": false + }, + { + "address": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "topics": [ + "0xee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a99", + "0x0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032" + ], + "data": "0x", + "blockHash": "0x04d8fb2b55cd050f64b980790a70cd29f7b82c5008bb17092581d7d74639ee93", + "blockNumber": "0x38555e0", + "transactionHash": "0x8624bfadfd4d2eb8c588453cd80fe052753e6f09d112861fb191b0df983c3fab", + "transactionIndex": "0x25", + "logIndex": "0x11a", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x00000000000000000000000000000000000000000000000001eb882b438b1548000000000000000000000000000000000000000000000001203ddae008b4d7960000000000000000000000000000000000000000000000162875ca4ab3ad18700000000000000000000000000000000000000000000000011e5252b4c529c24e0000000000000000000000000000000000000000000000162a615275f7382db8", + "blockHash": "0x04d8fb2b55cd050f64b980790a70cd29f7b82c5008bb17092581d7d74639ee93", + "blockNumber": "0x38555e0", + "transactionHash": "0x8624bfadfd4d2eb8c588453cd80fe052753e6f09d112861fb191b0df983c3fab", + "transactionIndex": "0x25", + "logIndex": "0x11b", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000002002010000000000000000000000000000000000000000000000000000200000000000000000008000000000000810040000020000010000000000000000000000000040800000000000001000000100000000000000000000000008000000000000000000000000000080000080000000000000080000000000000000008800000000000000000000000080000000000000000000200000020000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000004000100100000000000000000000000000000000200000000000000800000000000000100000000100000", + "type": "0x2", + "transactionHash": "0x8624bfadfd4d2eb8c588453cd80fe052753e6f09d112861fb191b0df983c3fab", + "transactionIndex": "0x25", + "blockHash": "0x04d8fb2b55cd050f64b980790a70cd29f7b82c5008bb17092581d7d74639ee93", + "blockNumber": "0x38555e0", + "gasUsed": "0x43968c", + "effectiveGasPrice": "0x745c05899", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xa0785b", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x00000000000000000000000000000000000000000000000000286a7941ad16a60000000000000000000000000000000000000000000000011e5252afff8fbdea00000000000000000000000000000000000000000000001648005ee61f18ed230000000000000000000000000000000000000000000000011e29e836bde2a7440000000000000000000000000000000000000000000000164828c95f60c603c9", + "blockHash": "0x12f4ec9850c9f23649c9e02a547f5d9ddf76484ed5d65fa8790fda6664e17981", + "blockNumber": "0x38555e2", + "transactionHash": "0x07c7bb6ffcb9def5f803f0ce9e97f21c8f53b11945f946bb726a470c808dfbc4", + "transactionIndex": "0x3c", + "logIndex": "0x13f", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000002000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000040000000000000000000000000000000000000040800000000000001000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0x07c7bb6ffcb9def5f803f0ce9e97f21c8f53b11945f946bb726a470c808dfbc4", + "transactionIndex": "0x3c", + "blockHash": "0x12f4ec9850c9f23649c9e02a547f5d9ddf76484ed5d65fa8790fda6664e17981", + "blockNumber": "0x38555e2", + "gasUsed": "0x58eb1", + "effectiveGasPrice": "0x745c05aed", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xa6ca2b", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x000000000000000000000000000000000000000000000000002df57c29adb2e00000000000000000000000000000000000000000000000011e29e8364c806a0d0000000000000000000000000000000000000000000000164828c95f60c603c90000000000000000000000000000000000000000000000011dfbf2ba22d2b72d0000000000000000000000000000000000000000000000164856bedb8a73b6a9", + "blockHash": "0x12f4ec9850c9f23649c9e02a547f5d9ddf76484ed5d65fa8790fda6664e17981", + "blockNumber": "0x38555e2", + "transactionHash": "0xb982a6be26b531e650ed2ff00679111e6eba9932a64780a001d75030c5636e96", + "transactionIndex": "0x3d", + "logIndex": "0x140", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000002000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000040000000000000000000000000000000000000040800000000000001000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0xb982a6be26b531e650ed2ff00679111e6eba9932a64780a001d75030c5636e96", + "transactionIndex": "0x3d", + "blockHash": "0x12f4ec9850c9f23649c9e02a547f5d9ddf76484ed5d65fa8790fda6664e17981", + "blockNumber": "0x38555e2", + "gasUsed": "0x651d0", + "effectiveGasPrice": "0x745c05aed", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xac8c41", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x0000000000000000000000000000000000000000000000000029e03d14959b840000000000000000000000000000000000000000000000011dfbf2b9a1e38c7d0000000000000000000000000000000000000000000000164856bedb8a73b6a90000000000000000000000000000000000000000000000011dd2127c8d4df0f900000000000000000000000000000000000000000000001648809f189f09522d", + "blockHash": "0x12f4ec9850c9f23649c9e02a547f5d9ddf76484ed5d65fa8790fda6664e17981", + "blockNumber": "0x38555e2", + "transactionHash": "0x71ce225e8ee95b2ad11f5c6063ed5f77c6d82256e162f10c62823940e0341385", + "transactionIndex": "0x3e", + "logIndex": "0x141", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000002000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000040000000000000000000000000000000000000040800000000000001000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0x71ce225e8ee95b2ad11f5c6063ed5f77c6d82256e162f10c62823940e0341385", + "transactionIndex": "0x3e", + "blockHash": "0x12f4ec9850c9f23649c9e02a547f5d9ddf76484ed5d65fa8790fda6664e17981", + "blockNumber": "0x38555e2", + "gasUsed": "0x5c216", + "effectiveGasPrice": "0x745c05aed", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xb10c1b", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x0000000000000000000000000000000000000000000000000020b8cce2d0881c0000000000000000000000000000000000000000000000011dd2127c17d3221f00000000000000000000000000000000000000000000001648809f189f09522d0000000000000000000000000000000000000000000000011db159af35029a0300000000000000000000000000000000000000000000001648a157e581d9da49", + "blockHash": "0x12f4ec9850c9f23649c9e02a547f5d9ddf76484ed5d65fa8790fda6664e17981", + "blockNumber": "0x38555e2", + "transactionHash": "0x12ad77ff78b9eded143f1ffacbbf1a19197fda7a31836b879c21b2f0b1a97b51", + "transactionIndex": "0x3f", + "logIndex": "0x142", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000002000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000040000000000000000000000000000000000000040800000000000001000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0x12ad77ff78b9eded143f1ffacbbf1a19197fda7a31836b879c21b2f0b1a97b51", + "transactionIndex": "0x3f", + "blockHash": "0x12f4ec9850c9f23649c9e02a547f5d9ddf76484ed5d65fa8790fda6664e17981", + "blockNumber": "0x38555e2", + "gasUsed": "0x47fda", + "effectiveGasPrice": "0x745c05aed", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xb7882f", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x000000000000000000000000000000000000000000000000002f28dc3c526a780000000000000000000000000000000000000000000000011db159aed936214d00000000000000000000000000000000000000000000001648a157e581d9da490000000000000000000000000000000000000000000000011d8230d29ce3b6d500000000000000000000000000000000000000000000001648d080c1be2c44c1", + "blockHash": "0x12f4ec9850c9f23649c9e02a547f5d9ddf76484ed5d65fa8790fda6664e17981", + "blockNumber": "0x38555e2", + "transactionHash": "0xc76222c57cd0bba8963e9a489018fa29729e6e8a7a9cad5d95347366f66f099d", + "transactionIndex": "0x40", + "logIndex": "0x143", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000002000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000040000000000000000000000000000000000000040800000000000001000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0xc76222c57cd0bba8963e9a489018fa29729e6e8a7a9cad5d95347366f66f099d", + "transactionIndex": "0x40", + "blockHash": "0x12f4ec9850c9f23649c9e02a547f5d9ddf76484ed5d65fa8790fda6664e17981", + "blockNumber": "0x38555e2", + "gasUsed": "0x67c14", + "effectiveGasPrice": "0x745c05aed", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x10e03f8", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x0000000000000000000000000000000000000000000000000032bc06b33d13020000000000000000000000000000000000000000000000011d8230d218963ac900000000000000000000000000000000000000000000001668b7b238a719b82c0000000000000000000000000000000000000000000000011d4f74cb655927c700000000000000000000000000000000000000000000001668ea6e3f5a56cb2e", + "blockHash": "0x134e9d3cd9a3e3caf114f8d6b7b0c35c8cc36ee215105e16d0c7178241f37c0e", + "blockNumber": "0x38555e4", + "transactionHash": "0x05653e8b67b12ea98443d499c0c21b3f3176bf1b9dc52470ef315ae2328f6129", + "transactionIndex": "0x42", + "logIndex": "0x18d", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000002000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000040000000000000000000000000000000000000040800000000000001000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0x05653e8b67b12ea98443d499c0c21b3f3176bf1b9dc52470ef315ae2328f6129", + "transactionIndex": "0x42", + "blockHash": "0x134e9d3cd9a3e3caf114f8d6b7b0c35c8cc36ee215105e16d0c7178241f37c0e", + "blockNumber": "0x38555e4", + "gasUsed": "0x6f9eb", + "effectiveGasPrice": "0x745c05d8d", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x114f16e", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x0000000000000000000000000000000000000000000000000032616ecf0e8fc40000000000000000000000000000000000000000000000011d4f74cac4b4355a00000000000000000000000000000000000000000000001668ea6e3f5a56cb2e0000000000000000000000000000000000000000000000011d1d135bf5a5a596000000000000000000000000000000000000000000000016691ccfae29655af2", + "blockHash": "0x134e9d3cd9a3e3caf114f8d6b7b0c35c8cc36ee215105e16d0c7178241f37c0e", + "blockNumber": "0x38555e4", + "transactionHash": "0x77a5cbe90102a2e3c410fce45de35b1b8573510a680b4ae50092f74ace974ff7", + "transactionIndex": "0x43", + "logIndex": "0x18e", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000002000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000040000000000000000000000000000000000000040800000000000001000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0x77a5cbe90102a2e3c410fce45de35b1b8573510a680b4ae50092f74ace974ff7", + "transactionIndex": "0x43", + "blockHash": "0x134e9d3cd9a3e3caf114f8d6b7b0c35c8cc36ee215105e16d0c7178241f37c0e", + "blockNumber": "0x38555e4", + "gasUsed": "0x6ed76", + "effectiveGasPrice": "0x745c05d8d", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x71aee7", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x0000000000000000000000000000000000000000000000000021bc5620a5563c0000000000000000000000000000000000000000000000011d1d135b561f8d5c0000000000000000000000000000000000000000000000167cf3324b5d2831d00000000000000000000000000000000000000000000000011cfb5705357a37200000000000000000000000000000000000000000000000167d14eea17dcd880c", + "blockHash": "0x2e889b03e20fd6edb6a4fe5eccad3961fa5da16db273ea66846d225dd8e4f77e", + "blockNumber": "0x38555e6", + "transactionHash": "0x7c20f2fe73f6e1d797edc21935033daccf9cf96e52a96ec47cbd3d3d4d716906", + "transactionIndex": "0x38", + "logIndex": "0xbc", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000002000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000040000000000000000000000000000000000000040800000000000001000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0x7c20f2fe73f6e1d797edc21935033daccf9cf96e52a96ec47cbd3d3d4d716906", + "transactionIndex": "0x38", + "blockHash": "0x2e889b03e20fd6edb6a4fe5eccad3961fa5da16db273ea66846d225dd8e4f77e", + "blockNumber": "0x38555e6", + "gasUsed": "0x4a38a", + "effectiveGasPrice": "0x745c05e3e", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x761955", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x00000000000000000000000000000000000000000000000000201d02afe9c9940000000000000000000000000000000000000000000000011cfb5704c77345f00000000000000000000000000000000000000000000000167d14eea17dcd880c0000000000000000000000000000000000000000000000011cdb3a0217897c5c0000000000000000000000000000000000000000000000167d350ba42db751a0", + "blockHash": "0x2e889b03e20fd6edb6a4fe5eccad3961fa5da16db273ea66846d225dd8e4f77e", + "blockNumber": "0x38555e6", + "transactionHash": "0xfd57c21c61ffadeaf8b92a6c2eed0911580a7ee7159462462634e7d64af809a2", + "transactionIndex": "0x39", + "logIndex": "0xbd", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000002000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000040000000000000000000000000000000000000040800000000000001000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0xfd57c21c61ffadeaf8b92a6c2eed0911580a7ee7159462462634e7d64af809a2", + "transactionIndex": "0x39", + "blockHash": "0x2e889b03e20fd6edb6a4fe5eccad3961fa5da16db273ea66846d225dd8e4f77e", + "blockNumber": "0x38555e6", + "gasUsed": "0x46a6e", + "effectiveGasPrice": "0x745c05e3e", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x45aee8", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x00000000000000000000000000000000000000000000000000209acd29ad9f5c0000000000000000000000000000000000000000000000011cdb3a01aecd1b4c0000000000000000000000000000000000000000000000168f6fc48c85d52e000000000000000000000000000000000000000000000000011cba9f34851f7bf00000000000000000000000000000000000000000000000168f905f59af82cd5c", + "blockHash": "0x797ebd6affe3b08bb41325fb14d152b709dceb1df031a3cf33e9e0f8bcc82811", + "blockNumber": "0x38555e8", + "transactionHash": "0xaf5909bb3552ad8ecbca99408b487b63606d882806167605800398c7c941a11b", + "transactionIndex": "0x3c", + "logIndex": "0xa9", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000002000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000040000000000000000000000000000000000000040800000000000001000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0xaf5909bb3552ad8ecbca99408b487b63606d882806167605800398c7c941a11b", + "transactionIndex": "0x3c", + "blockHash": "0x797ebd6affe3b08bb41325fb14d152b709dceb1df031a3cf33e9e0f8bcc82811", + "blockNumber": "0x38555e8", + "gasUsed": "0x47bba", + "effectiveGasPrice": "0x745c05f01", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x4a29b2", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x000000000000000000000000000000000000000000000000002093fbc56b81bc0000000000000000000000000000000000000000000000011cba9f34175e99920000000000000000000000000000000000000000000000168f905f59af82cd5c0000000000000000000000000000000000000000000000011c9a0b3851f317d60000000000000000000000000000000000000000000000168fb0f35574ee4f18", + "blockHash": "0x797ebd6affe3b08bb41325fb14d152b709dceb1df031a3cf33e9e0f8bcc82811", + "blockNumber": "0x38555e8", + "transactionHash": "0x5dc28ca47dee5c10a09386daaa01dabdd7c6ee4e748e1e95edd84483b64db4d2", + "transactionIndex": "0x3d", + "logIndex": "0xaa", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000002000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000040000000000000000000000000000000000000040800000000000001000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0x5dc28ca47dee5c10a09386daaa01dabdd7c6ee4e748e1e95edd84483b64db4d2", + "transactionIndex": "0x3d", + "blockHash": "0x797ebd6affe3b08bb41325fb14d152b709dceb1df031a3cf33e9e0f8bcc82811", + "blockNumber": "0x38555e8", + "gasUsed": "0x47aca", + "effectiveGasPrice": "0x745c05f01", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x4db4fe", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "0x00000000000000000000000069f5c4d08f6bc8cd29fe5f004d46fb566270868d" + ], + "data": "0x0000000000000000000000000000000000000000000000000019c648eef1b1c80000000000000000000000000000000000000000000000011c9a0b37e44928c80000000000000000000000000000000000000000000000168fb0f35574ee4f180000000000000000000000000000000000000000000000011c8044eef55777000000000000000000000000000000000000000000000000168fcab99e63e000e0", + "blockHash": "0x797ebd6affe3b08bb41325fb14d152b709dceb1df031a3cf33e9e0f8bcc82811", + "blockNumber": "0x38555e8", + "transactionHash": "0xac746b93bfe440edf52c1b36970057bff853429c26cdfd0a3a782bd0ebd34d5b", + "transactionIndex": "0x3e", + "logIndex": "0xab", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000002000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000040000000000000000000000000000000000000040800000000000001000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0xac746b93bfe440edf52c1b36970057bff853429c26cdfd0a3a782bd0ebd34d5b", + "transactionIndex": "0x3e", + "blockHash": "0x797ebd6affe3b08bb41325fb14d152b709dceb1df031a3cf33e9e0f8bcc82811", + "blockNumber": "0x38555e8", + "gasUsed": "0x38b4c", + "effectiveGasPrice": "0x745c05f01", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1720358722, + "chain": 137, + "commit": null +} \ No newline at end of file diff --git a/broadcast/DeployEnvironmentSetUp.s.sol/42161/run-1720358427.json b/broadcast/DeployEnvironmentSetUp.s.sol/42161/run-1720358427.json new file mode 100644 index 0000000..4095e43 --- /dev/null +++ b/broadcast/DeployEnvironmentSetUp.s.sol/42161/run-1720358427.json @@ -0,0 +1,703 @@ +{ + "transactions": [ + { + "hash": "0x0413fbd3e00b075713b22e27c24137522940fba946a68b592b158aef4b4e62fa", + "transactionType": "CREATE2", + "contractName": "DelegationManager", + "contractAddress": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "function": null, + "arguments": [ + "0xB0403B32f54d0Bd752113f4009e8B534C6669f44" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x31a3ce", + "value": "0x0", + "input": "0x44656c654761746f7200000000000000000000000000000000000000000000006101606040523480156200001257600080fd5b50604051620029e7380380620029e7833981016040819052620000359162000384565b60408051808201825260118152702232b632b3b0ba34b7b726b0b730b3b2b960791b602080830191909152825180840190935260018352603160f81b9083015290826001600160a01b038116620000a757604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b620000b28162000204565b506001805460ff60a01b19169055620000cd82600262000222565b61012052620000de81600362000222565b61014052815160208084019190912060e052815190820120610100524660a0526200015b60e0516101005160408051600080516020620029c783398151915260208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526000620001706200025b565b9050306001600160a01b0316817f04a46d9007577c7ff1e513b900545162ec25d25991ae3dc60cf26ec01a84806d604051806040016040528060118152602001702232b632b3b0ba34b7b726b0b730b3b2b960791b815250604051806040016040528060018152602001603160f81b81525046604051620001f493929190620003fe565b60405180910390a35050620005e5565b600180546001600160a01b03191690556200021f81620002f1565b50565b600060208351101562000242576200023a8362000341565b905062000255565b816200024f8482620004df565b5060ff90505b92915050565b600060c0516001600160a01b0316306001600160a01b031614801562000282575060a05146145b156200028f575060805190565b620002ec60e0516101005160408051600080516020620029c783398151915260208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b905090565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080829050601f815111156200036f578260405163305a27a960e01b81526004016200009e9190620005ab565b80516200037c82620005c0565b179392505050565b6000602082840312156200039757600080fd5b81516001600160a01b0381168114620003af57600080fd5b9392505050565b6000815180845260005b81811015620003de57602081850181015186830182015201620003c0565b506000602082860101526020601f19601f83011685010191505092915050565b606081526000620004136060830186620003b6565b8281036020840152620004278186620003b6565b915050826040830152949350505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200046357607f821691505b6020821081036200048457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004da576000816000526020600020601f850160051c81016020861015620004b55750805b601f850160051c820191505b81811015620004d657828155600101620004c1565b5050505b505050565b81516001600160401b03811115620004fb57620004fb62000438565b62000513816200050c84546200044e565b846200048a565b602080601f8311600181146200054b5760008415620005325750858301515b600019600386901b1c1916600185901b178555620004d6565b600085815260208120601f198616915b828110156200057c578886015182559484019460019091019084016200055b565b50858210156200059b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602081526000620003af6020830184620003b6565b80516020808301519190811015620004845760001960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516123876200064060003960006113bb0152600061138e015260006112f3015260006112cb01526000611226015260006112500152600061127a01526123876000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80637fade287116100b8578063a3f4df7e1161007c578063a3f4df7e1461028e578063acb8cc49146102cb578063e1520f54146102eb578063e30c3978146102fe578063f2fde38b1461030f578063ffa1ad741461032257600080fd5b80637fade2871461023f57806383ebb771146102525780638456cb591461025a57806384b0196e146102625780638da5cb5b1461027d57600080fd5b806358909ebc1161010a57806358909ebc146101c65780635c975abb146101e75780635daa6539146101f9578063661346071461021c578063715018a61461022f57806379ba50971461023757600080fd5b80631b13cac2146101475780632d40d052146101635780633ed01015146101965780633f4ba83a146101ab57806349934047146101b3575b600080fd5b61015060001981565b6040519081526020015b60405180910390f35b6101866101713660046118c7565b60056020526000908152604090205460ff1681565b604051901515815260200161015a565b6101a96101a43660046118e0565b610346565b005b6101a9610440565b6101a96101c13660046118e0565b610452565b6101cf610a1181565b6040516001600160a01b03909116815260200161015a565b600154600160a01b900460ff16610186565b6101866102073660046118c7565b60046020526000908152604090205460ff1681565b61015061022a3660046118e0565b610542565b6101a961055b565b6101a961056d565b6101a961024d3660046118e0565b6105b6565b6101506106a7565b6101a96106b6565b61026a6106c6565b60405161015a9796959493929190611967565b6000546001600160a01b03166101cf565b6102be604051806040016040528060118152602001702232b632b3b0ba34b7b726b0b730b3b2b960791b81525081565b60405161015a9190611a00565b6102be604051806040016040528060018152602001603160f81b81525081565b6101a96102f9366004611a13565b61070c565b6001546001600160a01b03166101cf565b6101a961031d366004611ac9565b611072565b6102be604051806040016040528060058152602001640312e302e360dc1b81525081565b6103566040820160208301611ac9565b6001600160a01b038116331461037f5760405163b9f0f17160e01b815260040160405180910390fd5b600061038a83610542565b60008181526005602052604090205490915060ff166103bc57604051637952fbad60e11b815260040160405180910390fd5b6000818152600560209081526040909120805460ff191690556103e190840184611ac9565b6001600160a01b03166103fa6040850160208601611ac9565b6001600160a01b0316827f3feadce88fc1b49db633a56fd5307ed6ee18734df83bcc4011daa720c9cd95f1866040516104339190611c18565b60405180910390a4505050565b6104486110e3565b610450611110565b565b6104626040820160208301611ac9565b6001600160a01b038116331461048b5760405163b9f0f17160e01b815260040160405180910390fd5b600061049683610542565b60008181526005602052604090205490915060ff16156104c857604051625ecddb60e01b815260040160405180910390fd5b6000818152600560209081526040909120805460ff191660011790556104f090840184611ac9565b6001600160a01b03166105096040850160208601611ac9565b6001600160a01b0316827fea589ba9473ee1fe77d352c7ed919747715a5d22931b972de9b02a907c66d5dd866040516104339190611c18565b600061055561055083611fae565b611165565b92915050565b6105636110e3565b6104506000611200565b60015433906001600160a01b031681146105aa5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b6105b381611200565b50565b6105c66040820160208301611ac9565b6001600160a01b03811633146105ef5760405163b9f0f17160e01b815260040160405180910390fd5b60006105fa83610542565b60008181526004602052604090205490915060ff161561062d5760405163119b4fd360e11b815260040160405180910390fd5b6000818152600460209081526040909120805460ff1916600117905561065590840184611ac9565b6001600160a01b031661066e6040850160208601611ac9565b6001600160a01b0316827fb9b56ecd70a93a7fcb54a1072d6a9c7ff488f46d6c656bb0a0fa453924658704866040516104339190611c18565b60006106b1611219565b905090565b6106be6110e3565b610450611344565b6000606080600080600060606106da611387565b6106e26113b4565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6107146113e1565b600061072283850185611fba565b905080516000036107465760405163efe957cf60e01b815260040160405180910390fd5b600081516001600160401b0381111561076157610761611ce9565b60405190808252806020026020018201604052801561078a578160200160208202803683370190505b5090506107db6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600080191681526020016060815260200160008152602001606081525090565b336001600160a01b0316836000815181106107f8576107f861206a565b6020026020010151600001516001600160a01b03161415801561084d5750610a116001600160a01b0316836000815181106108355761083561206a565b6020026020010151600001516001600160a01b031614155b1561086b57604051632d618d8160e21b815260040160405180910390fd5b60005b8351811015610a98578381815181106108895761088961206a565b6020026020010151915061089c82611165565b8382815181106108ae576108ae61206a565b6020026020010181815250508160a001515160000361091d57600460008483815181106108dd576108dd61206a565b60209081029190910181015182528101919091526040016000205460ff166109185760405163a9e649e960e01b815260040160405180910390fd5b610a90565b60208201516001600160a01b0381163b6000036109c157600061098761097d6109446106a7565b8786815181106109565761095661206a565b602002602001015160405161190160f01b8152600281019290925260228201526042902090565b8560a0015161140c565b9050816001600160a01b0316816001600160a01b0316146109bb57604051638baa579f60e01b815260040160405180910390fd5b50610a8e565b60006109e06109ce6106a7565b8685815181106109565761095661206a565b60a0850151604051630b135d3f60e11b81529192506000916001600160a01b03851691631626ba7e91610a17918691600401612080565b602060405180830381865afa158015610a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5891906120a1565b6001600160e01b0319169050630b135d3f60e11b8114610a8b57604051638baa579f60e01b815260040160405180910390fd5b50505b505b60010161086e565b5060005b8351811015610c585760056000848381518110610abb57610abb61206a565b60209081029190910181015182528101919091526040016000205460ff1615610af7576040516302dd502960e11b815260040160405180910390fd5b60018451610b0591906120e1565b8114610c0e5782610b178260016120f4565b81518110610b2757610b2761206a565b6020026020010151848281518110610b4157610b4161206a565b60200260200101516040015114610b6b57604051636f6a1b8760e11b815260040160405180910390fd5b600084610b798360016120f4565b81518110610b8957610b8961206a565b6020026020010151600001519050610a116001600160a01b0316816001600160a01b031614158015610bea5750806001600160a01b0316858381518110610bd257610bd261206a565b6020026020010151602001516001600160a01b031614155b15610c0857604051632d618d8160e21b815260040160405180910390fd5b50610c50565b60001960001b848281518110610c2657610c2661206a565b60200260200101516040015114610c5057604051636f6a1b8760e11b815260040160405180910390fd5b600101610a9c565b5060005b8351811015610db8576000848281518110610c7957610c7961206a565b60200260200101516060015190506000848381518110610c9b57610c9b61206a565b602002602001015190506000868481518110610cb957610cb961206a565b602002602001015160200151905060008351905060005b81811015610da8576000858281518110610cec57610cec61206a565b6020026020010151600001519050806001600160a01b0316639751a83d878481518110610d1b57610d1b61206a565b602002602001015160200151888581518110610d3957610d3961206a565b6020026020010151604001518e8989336040518763ffffffff1660e01b8152600401610d6a96959493929190612152565b600060405180830381600087803b158015610d8457600080fd5b505af1158015610d98573d6000803e3d6000fd5b5050505050806001019050610cd0565b5050505050806001019050610c5c565b508260018451610dc891906120e1565b81518110610dd857610dd861206a565b6020026020010151602001516001600160a01b03166326f0aef7856040518263ffffffff1660e01b8152600401610e0f91906121b4565b600060405180830381600087803b158015610e2957600080fd5b505af1158015610e3d573d6000803e3d6000fd5b505084519150505b8015610fc657600084610e596001846120e1565b81518110610e6957610e6961206a565b6020026020010151606001519050600084600184610e8791906120e1565b81518110610e9757610e9761206a565b60200260200101519050600086600185610eb191906120e1565b81518110610ec157610ec161206a565b602002602001015160200151905060008351905060005b81811015610fb0576000858281518110610ef457610ef461206a565b6020026020010151600001519050806001600160a01b031663de723eeb878481518110610f2357610f2361206a565b602002602001015160200151888581518110610f4157610f4161206a565b6020026020010151604001518e8989336040518763ffffffff1660e01b8152600401610f7296959493929190612152565b600060405180830381600087803b158015610f8c57600080fd5b505af1158015610fa0573d6000803e3d6000fd5b5050505050806001019050610ed8565b505050505080610fbf906121c7565b9050610e45565b5060005b835181101561106957336001600160a01b03168460018651610fec91906120e1565b81518110610ffc57610ffc61206a565b6020026020010151602001516001600160a01b03167f40dadaa36c6c2e3d7317e24757451ffb2d603d875f0ad5e92c5dd156573b18738684815181106110445761104461206a565b602002602001015160405161105991906121de565b60405180910390a3600101610fca565b50505050505050565b61107a6110e3565b600180546001600160a01b0383166001600160a01b031990911681179091556110ab6000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000546001600160a01b031633146104505760405163118cdaa760e01b81523360048201526024016105a1565b611118611436565b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000807f88c1d2ecf185adf710588203a5f263f0ff61be0d33da39792cde19ba9aa4331e8360000151846020015185604001516111a58760600151611460565b6080808901516040805160208101989098526001600160a01b03968716908801529490931660608601529184015260a083015260c082015260e0015b60408051601f1981840301815291905280516020909101209392505050565b600180546001600160a01b03191690556105b38161152b565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561127257507f000000000000000000000000000000000000000000000000000000000000000046145b1561129c57507f000000000000000000000000000000000000000000000000000000000000000090565b6106b1604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b61134c6113e1565b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586111483390565b60606106b17f0000000000000000000000000000000000000000000000000000000000000000600261157b565b60606106b17f0000000000000000000000000000000000000000000000000000000000000000600361157b565b600154600160a01b900460ff16156104505760405163d93c066560e01b815260040160405180910390fd5b60008060008061141c8686611626565b92509250925061142c8282611673565b5090949350505050565b600154600160a01b900460ff1661045057604051638dfc202b60e01b815260040160405180910390fd5b60008082516001600160401b0381111561147c5761147c611ce9565b6040519080825280602002602001820160405280156114a5578160200160208202803683370190505b50905060005b83518110156114fb576114d68482815181106114c9576114c961206a565b6020026020010151611730565b8282815181106114e8576114e861206a565b60209081029190910101526001016114ab565b508060405160200161150d91906122cb565b60405160208183030381529060405280519060200120915050919050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606060ff83146115955761158e83611791565b9050610555565b8180546115a190612301565b80601f01602080910402602001604051908101604052809291908181526020018280546115cd90612301565b801561161a5780601f106115ef5761010080835404028352916020019161161a565b820191906000526020600020905b8154815290600101906020018083116115fd57829003601f168201915b50505050509050610555565b600080600083516041036116605760208401516040850151606086015160001a611652888285856117d0565b95509550955050505061166c565b50508151600091506002905b9250925092565b60008260038111156116875761168761233b565b03611690575050565b60018260038111156116a4576116a461233b565b036116c25760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156116d6576116d661233b565b036116f75760405163fce698f760e01b8152600481018290526024016105a1565b600382600381111561170b5761170b61233b565b0361172c576040516335e2f38360e21b8152600481018290526024016105a1565b5050565b6000807f80ad7e1b04ee6d994a125f4714ca0720908bd80ed16063ec8aee4b88e9253e2d83600001518460200151805190602001206040516020016111e1939291909283526001600160a01b03919091166020830152604082015260600190565b6060600061179e8361189f565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561180b5750600091506003905082611895565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561185f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661188b57506000925060019150829050611895565b9250600091508190505b9450945094915050565b600060ff8216601f81111561055557604051632cd44ac360e21b815260040160405180910390fd5b6000602082840312156118d957600080fd5b5035919050565b6000602082840312156118f257600080fd5b81356001600160401b0381111561190857600080fd5b820160c0818503121561191a57600080fd5b9392505050565b6000815180845260005b818110156119475760208185018101518683018201520161192b565b506000602082860101526020601f19601f83011685010191505092915050565b60ff60f81b881681526000602060e0602084015261198860e084018a611921565b838103604085015261199a818a611921565b606085018990526001600160a01b038816608086015260a0850187905284810360c08601528551808252602080880193509091019060005b818110156119ee578351835292840192918401916001016119d2565b50909c9b505050505050505050505050565b60208152600061191a6020830184611921565b600080600060408486031215611a2857600080fd5b83356001600160401b0380821115611a3f57600080fd5b818601915086601f830112611a5357600080fd5b813581811115611a6257600080fd5b876020828501011115611a7457600080fd5b602092830195509350908501359080821115611a8f57600080fd5b50840160608187031215611aa257600080fd5b809150509250925092565b80356001600160a01b0381168114611ac457600080fd5b919050565b600060208284031215611adb57600080fd5b61191a82611aad565b6000808335601e19843603018112611afb57600080fd5b83016020810192503590506001600160401b03811115611b1a57600080fd5b803603821315611b2957600080fd5b9250929050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b88811015611c0a57858403601f19018a52823536899003605e19018112611b98578283fd5b880160606001600160a01b03611bad83611aad565b168652611bbc87830183611ae4565b8289890152611bce8389018284611b30565b925050506040611be081840184611ae4565b935087830382890152611bf4838583611b30565b9d89019d97505050938601935050600101611b73565b509198975050505050505050565b6020815260006001600160a01b0380611c3085611aad565b16602084015280611c4360208601611aad565b16604084015250604083013560608301526060830135601e19843603018112611c6b57600080fd5b83016020810190356001600160401b03811115611c8757600080fd5b8060051b3603821315611c9957600080fd5b60c06080850152611cae60e085018284611b59565b915050608084013560a0840152611cc860a0850185611ae4565b848303601f190160c0860152611cdf838284611b30565b9695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715611d2157611d21611ce9565b60405290565b60405160c081016001600160401b0381118282101715611d2157611d21611ce9565b604051601f8201601f191681016001600160401b0381118282101715611d7157611d71611ce9565b604052919050565b60006001600160401b03821115611d9257611d92611ce9565b5060051b60200190565b600082601f830112611dad57600080fd5b81356001600160401b03811115611dc657611dc6611ce9565b611dd9601f8201601f1916602001611d49565b818152846020838601011115611dee57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f830112611e1c57600080fd5b81356020611e31611e2c83611d79565b611d49565b82815260059290921b84018101918181019086841115611e5057600080fd5b8286015b84811015611eff5780356001600160401b0380821115611e745760008081fd5b908801906060828b03601f1901811315611e8e5760008081fd5b611e96611cff565b611ea1888501611aad565b815260408085013584811115611eb75760008081fd5b611ec58e8b83890101611d9c565b838b015250918401359183831115611edd5760008081fd5b611eeb8d8a85880101611d9c565b908201528652505050918301918301611e54565b509695505050505050565b600060c08284031215611f1c57600080fd5b611f24611d27565b9050611f2f82611aad565b8152611f3d60208301611aad565b60208201526040820135604082015260608201356001600160401b0380821115611f6657600080fd5b611f7285838601611e0b565b60608401526080840135608084015260a0840135915080821115611f9557600080fd5b50611fa284828501611d9c565b60a08301525092915050565b60006105553683611f0a565b60006020808385031215611fcd57600080fd5b82356001600160401b0380821115611fe457600080fd5b818501915085601f830112611ff857600080fd5b8135612006611e2c82611d79565b81815260059190911b8301840190848101908883111561202557600080fd5b8585015b8381101561205d578035858111156120415760008081fd5b61204f8b89838a0101611f0a565b845250918601918601612029565b5098975050505050505050565b634e487b7160e01b600052603260045260246000fd5b8281526040602082015260006120996040830184611921565b949350505050565b6000602082840312156120b357600080fd5b81516001600160e01b03198116811461191a57600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610555576105556120cb565b80820180821115610555576105556120cb565b6001600160a01b0361211882611aad565b1682526020810135602083015260006121346040830183611ae4565b60606040860152612149606086018284611b30565b95945050505050565b60c08152600061216560c0830189611921565b82810360208401526121778189611921565b9050828103604084015261218b8188612107565b606084019690965250506001600160a01b039283166080820152911660a0909101529392505050565b60208152600061191a6020830184612107565b6000816121d6576121d66120cb565b506000190190565b602080825282516001600160a01b0390811683830152838201518116604080850191909152808501516060808601919091528086015160c06080870152805160e0870181905260009594610100600583901b8901810195919493870193919290890190885b8181101561229d5760ff198b8903018352855187815116895289810151858b8b0152612271868b0182611921565b918701518a83038b8901529190506122898183611921565b995050509488019491880191600101612243565b50505050505050608085015160a085015260a08501519150601f198482030160c08501526121498183611921565b815160009082906020808601845b838110156122f5578151855293820193908201906001016122d9565b50929695505050505050565b600181811c9082168061231557607f821691505b60208210810361233557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052602160045260246000fdfea26469706673582212206702181458ece90d9cf27649387478caa2ed36ffd86ba70b239c4be34106280764736f6c634300081700338b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "nonce": "0x0", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8972f6398b77eb12b7e6139b223f72eb1a620fbb5f897f8534c2b3ab2882c3dd", + "transactionType": "CREATE2", + "contractName": "MultiSigDeleGator", + "contractAddress": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "function": null, + "arguments": [ + "0xbe4138886cB096bDC1B930F2f0ca7892AA234D78", + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x47ca99", + "value": "0x0", + "input": "0x44656c654761746f72000000000000000000000000000000000000000000000060e0604052306080523480156200001557600080fd5b506040516200396338038062003963833981016040819052620000389162000208565b8181620000446200013e565b6001600160a01b0380831660a081905290821660c0526040517fb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d90600090a26040516001600160a01b038216907fee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a9990600090a250506000197fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c0281905560408051918252517fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c00917f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d03919081900360200190a150505062000247565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156200018f5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001ef5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b0381168114620001ef57600080fd5b600080604083850312156200021c57600080fd5b82516200022981620001f2565b60208401519092506200023c81620001f2565b809150509250929050565b60805160a05160c0516136216200034260003960008181610633015281816108a001528181610b0001528181610bbb01528181610c3c01528181610cba01528181610e1f01528181610ed401528181610f5b015281816110b9015281816111f9015281816112ac0152818161131e0152818161138901528181611521015281816115b4015281816115f6015281816116ec015281816117ca015281816119e0015261240a01526000818161077201528181610b6601528181610d1d01528181610da001528181610e8201528181611130015281816113ec015261174f015260008181611b8201528181611bab015261211901526136216000f3fe60806040526004361061024a5760003560e01c80637df73e2711610139578063bc197c81116100b6578063e3d9109f1161007a578063e3d9109f1461070c578063e75235b81461072c578063ea4d3c9b14610760578063eb12d61e14610794578063f23a6e61146107b4578063ffa1ad74146107d457600080fd5b8063bc197c8114610682578063c399ec88146106a2578063d087d288146106b7578063d7d7442f146106cc578063e1520f54146106ec57600080fd5b8063a24c8f32116100fd578063a24c8f32146105a3578063aaf10f42146105b6578063ad3cb1cc146105e3578063b0d691fe14610621578063b3c650151461065557600080fd5b80637df73e27146104d95780637f07bfdc1461051f5780637fade2871461053f57806394cf795e1461055f578063a0c1deb41461058157600080fd5b80634891161f116101c75780635c1c6dcd1161018b5780635c1c6dcd1461043957806360b5bb3f1461045957806365ee81d8146104795780636af1f3991461049957806378979a80146104b957600080fd5b80634891161f146103d457806349934047146103e95780634a58db19146104095780634f1ef2861461041157806352d1902d1461042457600080fd5b806326f0aef71161020e57806326f0aef71461033457806334fcd5be146103545780633e1b0812146103745780633ed0101514610394578063445140b8146103b457600080fd5b806301ffc9a7146102565780630e316ab71461028b578063150b7a02146102ad5780631626ba7e146102e657806319822f7c1461030657600080fd5b3661025157005b600080fd5b34801561026257600080fd5b506102766102713660046128f4565b610805565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102ab6102a6366004612933565b610895565b005b3480156102b957600080fd5b506102cd6102c8366004612a05565b610ab9565b6040516001600160e01b03199091168152602001610282565b3480156102f257600080fd5b506102cd610301366004612ab8565b610ad4565b34801561031257600080fd5b50610326610321366004612b03565b610af3565b604051908152602001610282565b34801561034057600080fd5b506102ab61034f366004612b6e565b610b5b565b34801561036057600080fd5b506102ab61036f366004612bee565b610bb0565b34801561038057600080fd5b5061032661038f366004612c2f565b610c15565b3480156103a057600080fd5b506102ab6103af366004612c58565b610caf565b3480156103c057600080fd5b506102766103cf366004612c92565b610d87565b3480156103e057600080fd5b50610326601e81565b3480156103f557600080fd5b506102ab610404366004612c58565b610e14565b6102ab610eb7565b6102ab61041f366004612cab565b610f21565b34801561043057600080fd5b50610326610f33565b34801561044557600080fd5b506102ab610454366004612b6e565b610f50565b34801561046557600080fd5b506102ab610474366004612cfa565b610f99565b34801561048557600080fd5b506102ab610494366004612d53565b6110ae565b3480156104a557600080fd5b506102766104b4366004612c92565b611117565b3480156104c557600080fd5b506102ab6104d4366004612db1565b611167565b3480156104e557600080fd5b506102766104f4366004612933565b6001600160a01b031660009081526000805160206135ac833981519152602052604090205460ff1690565b34801561052b57600080fd5b506102ab61053a366004612e2d565b6112a1565b34801561054b57600080fd5b506102ab61055a366004612c58565b61137e565b34801561056b57600080fd5b50610574611421565b6040516102829190612e59565b34801561058d57600080fd5b5060008051602061358c83398151915254610326565b6102ab6105b1366004612cab565b610f29565b3480156105c257600080fd5b506105cb611494565b6040516001600160a01b039091168152602001610282565b3480156105ef57600080fd5b50610614604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102829190612ef6565b34801561062d57600080fd5b506105cb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561066157600080fd5b5061066a6114ba565b6040516001600160401b039091168152602001610282565b34801561068e57600080fd5b506102cd61069d366004612f88565b6114ed565b3480156106ae57600080fd5b50610326611509565b3480156106c357600080fd5b50610326611595565b3480156106d857600080fd5b506102ab6106e7366004612c92565b6115eb565b3480156106f857600080fd5b506102ab610707366004613035565b6116e1565b34801561071857600080fd5b506102ab61072736600461309d565b6117bf565b34801561073857600080fd5b507fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c0254610326565b34801561076c57600080fd5b506105cb7f000000000000000000000000000000000000000000000000000000000000000081565b3480156107a057600080fd5b506102ab6107af366004612933565b6119d5565b3480156107c057600080fd5b506102cd6107cf3660046130d6565b611b5b565b3480156107e057600080fd5b50610614604051806040016040528060058152602001640312e302e360dc1b81525081565b600061080f611b77565b6001600160e01b031982166326f0aef760e01b148061083e57506001600160e01b03198216630a85bd0160e11b145b8061085957506001600160e01b03198216630271189760e51b145b8061087457506001600160e01b031982166301ffc9a760e01b145b8061088f57506001600160e01b03198216630b135d3f60e11b145b92915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906108ce5750333014155b156108ec57604051630796d94560e01b815260040160405180910390fd5b6001600160a01b03811660009081526000805160206135ac833981519152602081905260409091205460ff166109355760405163da0357f760e01b815260040160405180910390fd5b60018101546002820154810361095e576040516361774dcf60e11b815260040160405180910390fd5b60005b61096c600183613154565b811015610a3657836001600160a01b031683600101828154811061099257610992613167565b6000918252602090912001546001600160a01b031603610a2e57826001016001836109bd9190613154565b815481106109cd576109cd613167565b6000918252602090912001546001840180546001600160a01b0390921691839081106109fb576109fb613167565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610a36565b600101610961565b5081600101805480610a4a57610a4a61317d565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038516808352908490526040808320805460ff191690555190917fb0073c14ccc2332b5b461c0d2fb94366f38d3954a82745e74827aa0811c9f98191a2505050565b6000610ac3611b77565b50630a85bd0160e11b949350505050565b6000610ade611b77565b610ae9848484611c1e565b90505b9392505050565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b3e57604051636b31ba1560e11b815260040160405180910390fd5b610b46611b77565b610b508484611dbd565b9050610aec82611e33565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ba457604051630692ce8160e21b815260040160405180910390fd5b610bad81611eca565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610be95750333014155b15610c0757604051630796d94560e01b815260040160405180910390fd5b610c118282611fd4565b5050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610c8b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088f9190613193565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610ce85750333014155b15610d0657604051630796d94560e01b815260040160405180910390fd5b604051633ed0101560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633ed0101590610d529084906004016132db565b600060405180830381600087803b158015610d6c57600080fd5b505af1158015610d80573d6000803e3d6000fd5b5050505050565b6040516316a0682960e11b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632d40d052906024015b602060405180830381865afa158015610df0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088f91906133b6565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610e4d5750333014155b15610e6b57604051630796d94560e01b815260040160405180910390fd5b604051634993404760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634993404790610d529084906004016132db565b610ebf611b77565b60405163b760faf960e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b158015610d6c57600080fd5b610f29612036565b610c1182826120f3565b6000610f3d61210e565b506000805160206135cc83398151915290565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ba457604051636b31ba1560e11b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610fde5750825b90506000826001600160401b03166001148015610ffa5750303b155b905081158015611008575080155b156110265760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561105057845460ff60401b1916600160401b1785555b61105d8888886000612157565b83156110a457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2906020015b60405180910390a15b5050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110e75750333014155b1561110557604051630796d94560e01b815260040160405180910390fd5b61111184848484612157565b50505050565b604051635daa653960e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635daa653990602401610dd3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054869190600160401b900460ff16806111af575080546001600160401b03808416911610155b156111cd5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906112275750333014155b1561124557604051630796d94560e01b815260040160405180910390fd5b61125186868686612157565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906112da5750333014155b156112f857604051630796d94560e01b815260040160405180910390fd5b60405163040b850f60e31b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561136257600080fd5b505af1158015611376573d6000803e3d6000fd5b505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906113b75750333014155b156113d557604051630796d94560e01b815260040160405180910390fd5b604051637fade28760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637fade28790610d529084906004016132db565b606060006000805160206135ac8339815191526001810180546040805160208084028201810190925282815293945083018282801561148957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161146b575b505050505091505090565b60006114b56000805160206135cc833981519152546001600160a01b031690565b905090565b60006114b57ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00546001600160401b031690565b60006114f7611b77565b5063bc197c8160e01b95945050505050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a08231906024015b602060405180830381865afa158015611571573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b59190613193565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401611554565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906116245750333014155b1561164257604051630796d94560e01b815260040160405180910390fd5b806000036116635760405163aabd5a0960e01b815260040160405180910390fd5b60008051602061358c833981519152546000805160206135ac833981519152908211156116a35760405163aabd5a0960e01b815260040160405180910390fd5b600281018290556040518281527f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d039060200160405180910390a15050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480159061171a5750333014155b1561173857604051630796d94560e01b815260040160405180910390fd5b60405163385483d560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e1520f5490611788908690869086906004016133d3565b600060405180830381600087803b1580156117a257600080fd5b505af11580156117b6573d6000803e3d6000fd5b50505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906117f85750333014155b1561181657604051630796d94560e01b815260040160405180910390fd5b6001600160a01b038116158061183557506001600160a01b0381163b15155b1561185357604051634501a91960e01b815260040160405180910390fd5b6001600160a01b03821660009081526000805160206135ac833981519152602081905260409091205460ff1661189c5760405163da0357f760e01b815260040160405180910390fd5b6001600160a01b03821660009081526020829052604090205460ff16156118d657604051631985f4ab60e31b815260040160405180910390fd5b600181015460005b8181101561197057846001600160a01b031683600101828154811061190557611905613167565b6000918252602090912001546001600160a01b031603611968578383600101828154811061193557611935613167565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550611970565b6001016118de565b506001600160a01b03808516600081815260208590526040808220805460ff199081169091559387168083528183208054909516600117909455517f53a7b6f060162826746b07f3ff5cc66b83afad3bc9a57c9f34d7802901c6e8299190a350505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590611a0e5750333014155b15611a2c57604051630796d94560e01b815260040160405180910390fd5b6001600160a01b0381161580611a4b57506001600160a01b0381163b15155b15611a6957604051634501a91960e01b815260040160405180910390fd5b60008051602061358c833981519152546000805160206135ac83398151915290601d1901611aaa57604051630dc92ed360e11b815260040160405180910390fd5b6001600160a01b03821660009081526020829052604090205460ff1615611ae457604051631985f4ab60e31b815260040160405180910390fd5b6001818101805480830182556000918252602080832090910180546001600160a01b0319166001600160a01b038716908117909155808352908490526040808320805460ff191690941790935591517f82b74755d483f0688b80354268454667c377a5684e64a4dbb6820fc11a6276d49190a25050565b6000611b65611b77565b5063f23a6e6160e01b95945050505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611bfe57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611bf26000805160206135cc833981519152546001600160a01b031690565b6001600160a01b031614155b15611c1c5760405163703e46dd60e11b815260040160405180910390fd5b565b7fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c02546000906000805160206135ac83398151915290611c5f9060419061343d565b8314611c7657506001600160e01b03199050610aec565b6000611c83604185613454565b600283015490915060008080805b85811015611da55760008a8a611ca860418561343d565b906041611cb6866001613476565b611cc0919061343d565b92611ccd93929190613489565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929350611d1192508e91508390506123d5565b9350846001600160a01b0316846001600160a01b0316111580611d4d57506001600160a01b03841660009081526020899052604090205460ff16155b15611d6b57506001600160e01b03199750610aec9650505050505050565b82611d75816134b3565b935050858310611d975750630b135d3f60e11b9750610aec9650505050505050565b509192508291600101611c91565b506001600160e01b03199a9950505050505050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c829052603c81208190611e0590611e006101008701876134cc565b611c1e565b90506374eca2c160e11b6001600160e01b0319821601611e2957600091505061088f565b5060019392505050565b8015610bad57604051600090339060001990849084818181858888f193505050503d8060008114611e80576040519150601f19603f3d011682016040523d82523d6000602084013e611e85565b606091505b505060408051848152821515602082015291925033917fa427c7d47f24d01b170779a7600b1d4c0d7cdbabaa0f19c4f0e6182053ffc931910160405180910390a25050565b600080611eda6020840184612933565b6001600160a01b03166020840135611ef560408601866134cc565b604051611f03929190613512565b60006040518083038185875af1925050503d8060008114611f40576040519150601f19603f3d011682016040523d82523d6000602084013e611f45565b606091505b509092509050611f586020840184612933565b6001600160a01b03167f74b56487625d598ffbf59a76c3b58fc1922f54afc86a075bad0c2a8aa05d2ad284602001358484604051611f9893929190613522565b60405180910390a281611fcf578051600003611fc75760405163764bbf1760e01b815260040160405180910390fd5b805181602001fd5b505050565b806000819003611ff757604051635fc74f2160e11b815260040160405180910390fd5b60005b818110156111115761202e84848381811061201757612017613167565b90506020028101906120299190613543565b611eca565b600101611ffa565b60008051602061358c833981519152546000805160206135ac8339815191529060005b818110156120b05782600001600084600101838154811061207c5761207c613167565b60009182526020808320909101546001600160a01b031683528201929092526040019020805460ff19169055600101612059565b506120bf6001830160006128c2565b6000600283018190556040517feb09d532980c3cc73dcad99b80e264204a667a54cbb7b63ec8d68dcb1c7096be9190a15050565b6120fb611b77565b612104826123ff565b610c118282612456565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c1c5760405163703e46dd60e11b815260040160405180910390fd5b60008051602061358c8339815191525483906000805160206135ac8339815191529060008461218f5761218a8285613476565b612191565b835b905085158061219f57508086115b156121bd5760405163aabd5a0960e01b815260040160405180910390fd5b601e8111156121df57604051630dc92ed360e11b815260040160405180910390fd5b84156122735760005b8281101561226457600084600101828154811061220757612207613167565b60009182526020808320909101546001600160a01b0316808352908790526040808320805460ff191690555190925082917fb0073c14ccc2332b5b461c0d2fb94366f38d3954a82745e74827aa0811c9f98191a2506001016121e8565b506122736001840160006128c2565b60005b8481101561239d57600089898381811061229257612292613167565b90506020020160208101906122a79190612933565b6001600160a01b03811660009081526020879052604090205490915060ff16156122e457604051631985f4ab60e31b815260040160405180910390fd5b6001600160a01b038116158061230357506001600160a01b0381163b15155b1561232157604051634501a91960e01b815260040160405180910390fd5b6001858101805480830182556000918252602080832090910180546001600160a01b0319166001600160a01b038616908117909155808352908890526040808320805460ff191690941790935591517f82b74755d483f0688b80354268454667c377a5684e64a4dbb6820fc11a6276d49190a250600101612276565b50600283018690556040518681527f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d039060200161109b565b6000806000806123e58686612518565b9250925092506123f58282612565565b5090949350505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906124385750333014155b15610bad57604051630796d94560e01b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156124b0575060408051601f3d908101601f191682019092526124ad91810190613193565b60015b6124dd57604051634c9c8ce360e01b81526001600160a01b03831660048201526024015b60405180910390fd5b6000805160206135cc833981519152811461250e57604051632a87526960e21b8152600481018290526024016124d4565b611fcf838361261e565b600080600083516041036125525760208401516040850151606086015160001a61254488828585612674565b95509550955050505061255e565b50508151600091506002905b9250925092565b600082600381111561257957612579613563565b03612582575050565b600182600381111561259657612596613563565b036125b45760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156125c8576125c8613563565b036125e95760405163fce698f760e01b8152600481018290526024016124d4565b60038260038111156125fd576125fd613563565b03610c11576040516335e2f38360e21b8152600481018290526024016124d4565b61262782612743565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561266c57611fcf82826127a8565b610c1161281e565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156126af5750600091506003905082612739565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612703573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661272f57506000925060019150829050612739565b9250600091508190505b9450945094915050565b806001600160a01b03163b60000361277957604051634c9c8ce360e01b81526001600160a01b03821660048201526024016124d4565b6000805160206135cc83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516127c59190613579565b600060405180830381855af49150503d8060008114612800576040519150601f19603f3d011682016040523d82523d6000602084013e612805565b606091505b509150915061281585838361283d565b95945050505050565b3415611c1c5760405163b398979f60e01b815260040160405180910390fd5b6060826128525761284d82612899565b610aec565b815115801561286957506001600160a01b0384163b155b1561289257604051639996b31560e01b81526001600160a01b03851660048201526024016124d4565b5080610aec565b8051156128a95780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825590600052602060002090810190610bad91905b808211156128f057600081556001016128dc565b5090565b60006020828403121561290657600080fd5b81356001600160e01b031981168114610aec57600080fd5b6001600160a01b0381168114610bad57600080fd5b60006020828403121561294557600080fd5b8135610aec8161291e565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561298e5761298e612950565b604052919050565b600082601f8301126129a757600080fd5b81356001600160401b038111156129c0576129c0612950565b6129d3601f8201601f1916602001612966565b8181528460208386010111156129e857600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215612a1b57600080fd5b8435612a268161291e565b93506020850135612a368161291e565b92506040850135915060608501356001600160401b03811115612a5857600080fd5b612a6487828801612996565b91505092959194509250565b60008083601f840112612a8257600080fd5b5081356001600160401b03811115612a9957600080fd5b602083019150836020828501011115612ab157600080fd5b9250929050565b600080600060408486031215612acd57600080fd5b8335925060208401356001600160401b03811115612aea57600080fd5b612af686828701612a70565b9497909650939450505050565b600080600060608486031215612b1857600080fd5b83356001600160401b03811115612b2e57600080fd5b84016101208187031215612b4157600080fd5b95602085013595506040909401359392505050565b600060608284031215612b6857600080fd5b50919050565b600060208284031215612b8057600080fd5b81356001600160401b03811115612b9657600080fd5b612ba284828501612b56565b949350505050565b60008083601f840112612bbc57600080fd5b5081356001600160401b03811115612bd357600080fd5b6020830191508360208260051b8501011115612ab157600080fd5b60008060208385031215612c0157600080fd5b82356001600160401b03811115612c1757600080fd5b612c2385828601612baa565b90969095509350505050565b600060208284031215612c4157600080fd5b81356001600160c01b0381168114610aec57600080fd5b600060208284031215612c6a57600080fd5b81356001600160401b03811115612c8057600080fd5b820160c08185031215610aec57600080fd5b600060208284031215612ca457600080fd5b5035919050565b60008060408385031215612cbe57600080fd5b8235612cc98161291e565b915060208301356001600160401b03811115612ce457600080fd5b612cf085828601612996565b9150509250929050565b600080600060408486031215612d0f57600080fd5b83356001600160401b03811115612d2557600080fd5b612d3186828701612baa565b909790965060209590950135949350505050565b8015158114610bad57600080fd5b60008060008060608587031215612d6957600080fd5b84356001600160401b03811115612d7f57600080fd5b612d8b87828801612baa565b909550935050602085013591506040850135612da681612d45565b939692955090935050565b600080600080600060808688031215612dc957600080fd5b85356001600160401b038082168214612de157600080fd5b90955060208701359080821115612df757600080fd5b50612e0488828901612baa565b909550935050604086013591506060860135612e1f81612d45565b809150509295509295909350565b60008060408385031215612e4057600080fd5b8235612e4b8161291e565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b81811015612e9a5783516001600160a01b031683529284019291840191600101612e75565b50909695505050505050565b60005b83811015612ec1578181015183820152602001612ea9565b50506000910152565b60008151808452612ee2816020860160208601612ea6565b601f01601f19169290920160200192915050565b602081526000610aec6020830184612eca565b600082601f830112612f1a57600080fd5b813560206001600160401b03821115612f3557612f35612950565b8160051b612f44828201612966565b9283528481018201928281019087851115612f5e57600080fd5b83870192505b84831015612f7d57823582529183019190830190612f64565b979650505050505050565b600080600080600060a08688031215612fa057600080fd5b8535612fab8161291e565b94506020860135612fbb8161291e565b935060408601356001600160401b0380821115612fd757600080fd5b612fe389838a01612f09565b94506060880135915080821115612ff957600080fd5b61300589838a01612f09565b9350608088013591508082111561301b57600080fd5b5061302888828901612996565b9150509295509295909350565b60008060006040848603121561304a57600080fd5b83356001600160401b038082111561306157600080fd5b61306d87838801612a70565b9095509350602086013591508082111561308657600080fd5b5061309386828701612b56565b9150509250925092565b600080604083850312156130b057600080fd5b82356130bb8161291e565b915060208301356130cb8161291e565b809150509250929050565b600080600080600060a086880312156130ee57600080fd5b85356130f98161291e565b945060208601356131098161291e565b9350604086013592506060860135915060808601356001600160401b0381111561313257600080fd5b61302888828901612996565b634e487b7160e01b600052601160045260246000fd5b8181038181111561088f5761088f61313e565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6000602082840312156131a557600080fd5b5051919050565b6000808335601e198436030181126131c357600080fd5b83016020810192503590506001600160401b038111156131e257600080fd5b803603821315612ab157600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b888110156132cd57858403601f19018a52823536899003605e19018112613259578283fd5b8801606081356132688161291e565b6001600160a01b0316865261327f828801836131ac565b828989015261329183890182846131f1565b9250505060406132a3818401846131ac565b9350878303828901526132b78385836131f1565b9d89019d97505050938601935050600101613234565b509198975050505050505050565b60208152600082356132ec8161291e565b6001600160a01b039081166020848101919091528401359061330d8261291e565b80821660408501525050604083013560608301526060830135601e1984360301811261333857600080fd5b83016020810190356001600160401b0381111561335457600080fd5b8060051b360382131561336657600080fd5b60c0608085015261337b60e08501828461321a565b915050608084013560a084015261339560a08501856131ac565b848303601f190160c08601526133ac8382846131f1565b9695505050505050565b6000602082840312156133c857600080fd5b8151610aec81612d45565b6040815260006133e76040830185876131f1565b828103602084015283356133fa8161291e565b6001600160a01b031681526020848101359082015261341c60408501856131ac565b606060408401526134316060840182846131f1565b98975050505050505050565b808202811582820484141761088f5761088f61313e565b60008261347157634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561088f5761088f61313e565b6000808585111561349957600080fd5b838611156134a657600080fd5b5050820193919092039150565b6000600182016134c5576134c561313e565b5060010190565b6000808335601e198436030181126134e357600080fd5b8301803591506001600160401b038211156134fd57600080fd5b602001915036819003821315612ab157600080fd5b8183823760009101908152919050565b83815282151560208201526060604082015260006128156060830184612eca565b60008235605e1983360301811261355957600080fd5b9190910192915050565b634e487b7160e01b600052602160045260246000fd5b60008251613559818460208701612ea656feb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c01b005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212207f3a1345dd207b3e6a7d8045651ded34698ad5d76b8ff402fdacf6337782f2f664736f6c63430008170033000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d780000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x1", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xd5220582e356158edb6a05d6fef319e0d99e8e7a736c4d6bab2aed89360e82a0", + "transactionType": "CREATE2", + "contractName": "HybridDeleGator", + "contractAddress": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "function": null, + "arguments": [ + "0xbe4138886cB096bDC1B930F2f0ca7892AA234D78", + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x663eaa", + "value": "0x0", + "input": "0x44656c654761746f72000000000000000000000000000000000000000000000060e0604052306080523480156200001557600080fd5b50604051620051483803806200514883398101604081905262000038916200018b565b818162000044620000c1565b6001600160a01b0380831660a081905290821660c0526040517fb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d90600090a26040516001600160a01b038216907fee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a9990600090a250505050620001ca565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620001125760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001725780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b03811681146200017257600080fd5b600080604083850312156200019f57600080fd5b8251620001ac8162000175565b6020840151909250620001bf8162000175565b809150509250929050565b60805160a05160c051614e83620002c5600039600081816105e9015281816107f3015281816108a1015281816109c501528181610a4601528181610ac401528181610c2901528181610cde01528181610d6501528181610dfe01528181610eea01528181610fa50152818161101701528181611082015281816112c401528181611343015281816113c00152818161147f015281816116c4015281816117b501526124480152600081816107290152818161090701528181610b2701528181610baa01528181610c8c01528181610dbc015281816110e50152611727015260008181611a9b01528181611ac401526120b50152614e836000f3fe60806040526004361061023f5760003560e01c80637f07bfdc1161012e578063c399ec88116100ab578063e1520f541161006f578063e1520f54146106f7578063ea4d3c9b14610717578063f23a6e611461074b578063f2fde38b1461076b578063ffa1ad741461078b57600080fd5b8063c399ec8814610658578063c8561e731461066d578063d087d2881461068d578063d37aec92146106a2578063d5d33b55146106d757600080fd5b8063aaf10f42116100f2578063aaf10f4214610584578063ad3cb1cc14610599578063b0d691fe146105d7578063b3c650151461060b578063bc197c811461063857600080fd5b80637f07bfdc146104d25780637fade287146104f25780638da5cb5b146105125780638ebf953314610551578063a24c8f321461057157600080fd5b80633ed01015116101bc57806352d1902d1161018057806352d1902d146104485780635c1c6dcd1461045d5780636af1f3991461047d578063715018a61461049d57806378a68ecf146104b257600080fd5b80633ed01015146103cd578063445140b8146103ed578063499340471461040d5780634a58db191461042d5780634f1ef2861461043557600080fd5b80631c03010a116102035780631c03010a1461032957806326f0aef71461034b5780632ffeaad61461036b57806334fcd5be1461038d5780633e1b0812146103ad57600080fd5b806301ffc9a71461024b578063074feff314610280578063150b7a02146102a25780631626ba7e146102db57806319822f7c146102fb57600080fd5b3661024657005b600080fd5b34801561025757600080fd5b5061026b610266366004613e92565b6107bc565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102a061029b366004613f27565b6107e8565b005b3480156102ae57600080fd5b506102c26102bd366004614096565b610859565b6040516001600160e01b03199091168152602001610277565b3480156102e757600080fd5b506102c26102f6366004614142565b610875565b34801561030757600080fd5b5061031b61031636600461418d565b610894565b604051908152602001610277565b34801561033557600080fd5b50600080516020614dae8339815191525461031b565b34801561035757600080fd5b506102a06103663660046141f8565b6108fc565b34801561037757600080fd5b50610380610951565b604051610277919061422c565b34801561039957600080fd5b506102a06103a8366004614264565b6109ba565b3480156103b957600080fd5b5061031b6103c83660046142a5565b610a1f565b3480156103d957600080fd5b506102a06103e83660046142ce565b610ab9565b3480156103f957600080fd5b5061026b610408366004614308565b610b91565b34801561041957600080fd5b506102a06104283660046142ce565b610c1e565b6102a0610cc1565b6102a0610443366004614321565b610d2b565b34801561045457600080fd5b5061031b610d3d565b34801561046957600080fd5b506102a06104783660046141f8565b610d5a565b34801561048957600080fd5b5061026b610498366004614308565b610da3565b3480156104a957600080fd5b506102a0610df3565b3480156104be57600080fd5b506102a06104cd366004614389565b610e56565b3480156104de57600080fd5b506102a06104ed36600461445b565b610f9a565b3480156104fe57600080fd5b506102a061050d3660046142ce565b611077565b34801561051e57600080fd5b50600080516020614d8e833981519152546001600160a01b03165b6040516001600160a01b039091168152602001610277565b34801561055d57600080fd5b506102a061056c366004613f27565b61111a565b6102a061057f366004614321565b610d33565b34801561059057600080fd5b50610539611236565b3480156105a557600080fd5b506105ca604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161027791906144d7565b3480156105e357600080fd5b506105397f000000000000000000000000000000000000000000000000000000000000000081565b34801561061757600080fd5b5061062061125c565b6040516001600160401b039091168152602001610277565b34801561064457600080fd5b506102c2610653366004614569565b61128f565b34801561066457600080fd5b5061031b6112ac565b34801561067957600080fd5b506102a0610688366004614616565b611338565b34801561069957600080fd5b5061031b6113a1565b3480156106ae57600080fd5b506106c26106bd366004614666565b6113f7565b60408051928352602083019190915201610277565b3480156106e357600080fd5b506102a06106f2366004614666565b611474565b34801561070357600080fd5b506102a061071236600461469b565b6116b9565b34801561072357600080fd5b506105397f000000000000000000000000000000000000000000000000000000000000000081565b34801561075757600080fd5b506102c2610766366004614703565b61178e565b34801561077757600080fd5b506102a061078636600461476b565b6117aa565b34801561079757600080fd5b506105ca604051806040016040528060058152602001640312e302e360dc1b81525081565b60006107c78261180a565b806107e257506001600160e01b031982166307f5828d60e41b145b92915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906108215750333014155b1561083f57604051630796d94560e01b815260040160405180910390fd5b61085087878787878787600161189a565b50505050505050565b6000610863611a90565b50630a85bd0160e11b5b949350505050565b600061087f611a90565b61088a848484611b35565b90505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108df57604051636b31ba1560e11b815260040160405180910390fd5b6108e7611a90565b6108f18484611d59565b905061088d82611dcf565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094557604051630692ce8160e21b815260040160405180910390fd5b61094e81611e66565b50565b60606000600080516020614d8e833981519152600281018054604080516020808402820181019092528281529394508301828280156109af57602002820191906000526020600020905b81548152602001906001019080831161099b575b505050505091505090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906109f35750333014155b15610a1157604051630796d94560e01b815260040160405180910390fd5b610a1b8282611f70565b5050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610a95573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e29190614788565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610af25750333014155b15610b1057604051630796d94560e01b815260040160405180910390fd5b604051633ed0101560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633ed0101590610b5c9084906004016148d0565b600060405180830381600087803b158015610b7657600080fd5b505af1158015610b8a573d6000803e3d6000fd5b5050505050565b6040516316a0682960e11b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632d40d052906024015b602060405180830381865afa158015610bfa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e291906149ac565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610c575750333014155b15610c7557604051630796d94560e01b815260040160405180910390fd5b604051634993404760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634993404790610b5c9084906004016148d0565b610cc9611a90565b60405163b760faf960e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b158015610b7657600080fd5b610d33611fd2565b610a1b828261208f565b6000610d476120aa565b50600080516020614dee83398151915290565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094557604051636b31ba1560e11b815260040160405180910390fd5b604051635daa653960e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635daa653990602401610bdd565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610e2c5750333014155b15610e4a57604051630796d94560e01b815260040160405180910390fd5b610e5460006120f3565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460ff8b81169291600160401b90041680610ea0575080546001600160401b03808416911610155b15610ebe5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610f185750333014155b15610f3657604051630796d94560e01b815260040160405180910390fd5b610f468a8a8a8a8a8a8a8a61189a565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15050505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610fd35750333014155b15610ff157604051630796d94560e01b815260040160405180910390fd5b60405163040b850f60e31b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561105b57600080fd5b505af115801561106f573d6000803e3d6000fd5b505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110b05750333014155b156110ce57604051630796d94560e01b815260040160405180910390fd5b604051637fade28760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637fade28790610b5c9084906004016148d0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b031660008115801561115f5750825b90506000826001600160401b0316600114801561117b5750303b155b905081158015611189575080155b156111a75760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156111d157845460ff60401b1916600160401b1785555b6111e28c8c8c8c8c8c8c600061189a565b831561122857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b6000611257600080516020614dee833981519152546001600160a01b031690565b905090565b60006112577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00546001600160401b031690565b6000611299611a90565b5063bc197c8160e01b5b95945050505050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a08231906024015b602060405180830381865afa158015611314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112579190614788565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906113715750333014155b1561138f57604051630796d94560e01b815260040160405180910390fd5b61139b84848484612195565b50505050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a906044016112f7565b60008080600080516020614d8e8339815191529050600081600101600087876040516020016114279291906149c9565b60408051601f198184030181529181528151602092830120835282820193909352908201600020825180840190935280548084526001909101549290910182905297909650945050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906114ad5750333014155b156114cb57604051630796d94560e01b815260040160405180910390fd5b604051600080516020614d8e833981519152906000906114f190859085906020016149c9565b60408051601f19818403018152828252805160209182012060008181526001808801845290849020858501909452835480865293015491840182905293508115801561153b575080155b1561156157604051631a36430d60e31b8152600481018590526024015b60405180910390fd5b600285015460018114801561157e575085546001600160a01b0316155b1561159c5760405163c4c8547360e01b815260040160405180910390fd5b60005b6115aa6001836149ef565b81101561162f57858760020182815481106115c7576115c7614a02565b90600052602060002001540361162757600287016115e66001846149ef565b815481106115f6576115f6614a02565b906000526020600020015487600201828154811061161657611616614a02565b60009182526020909120015561162f565b60010161159f565b508560020180548061164357611643614a18565b60008281526020808220830160001990810183905590920190925586825260018881018252604080842084815590910192909255815185815290810184905286917facf0e8088062f44f734bbcb5223794fd8bb6f6db1c199cb6a72df119d002a71b910160405180910390a25050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906116f25750333014155b1561171057604051630796d94560e01b815260040160405180910390fd5b60405163385483d560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e1520f549061176090869086908690600401614a2e565b600060405180830381600087803b15801561177a57600080fd5b505af1158015610850573d6000803e3d6000fd5b6000611798611a90565b5063f23a6e6160e01b95945050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906117e35750333014155b1561180157604051630796d94560e01b815260040160405180910390fd5b61094e816120f3565b6000611814611a90565b6001600160e01b031982166326f0aef760e01b148061184357506001600160e01b03198216630a85bd0160e11b145b8061185e57506001600160e01b03198216630271189760e51b145b8061187957506001600160e01b031982166301ffc9a760e01b145b806107e2575050630b135d3f60e11b6001600160e01b03198216145b919050565b856001600160a01b0389161580156118b0575080155b80156118b95750815b156118d7576040516312da594d60e11b815260040160405180910390fd5b80851415806118e65750808314155b156119155760405163a297991b60e01b8152600481018290526024810186905260448101849052606401611558565b8115611a0a57600080516020614dae83398151915254600080516020614d8e833981519152908015611a075760005b818110156119f857600083600201828154811061196357611963614a02565b6000918252602080832090910154808352600180880180845260408086208151808301835281548152938101805485880190815286895293909652869055949093558051925193519194509284927facf0e8088062f44f734bbcb5223794fd8bb6f6db1c199cb6a72df119d002a71b926119e69290918252602082015260400190565b60405180910390a25050600101611944565b50611a07600283016000613e60565b50505b60005b81811015611a7b57611a73898983818110611a2a57611a2a614a02565b9050602002810190611a3c9190614a8c565b898985818110611a4e57611a4e614a02565b90506020020135888886818110611a6757611a67614a02565b90506020020135612195565b600101611a0d565b50611a85896120f3565b505050505050505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611b1757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611b0b600080516020614dee833981519152546001600160a01b031690565b6001600160a01b031614155b15610e545760405163703e46dd60e11b815260040160405180910390fd5b6000816041819003611bd257600080516020614d8e833981519152546001600160a01b03166001600160a01b0316611ba38686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061231292505050565b6001600160a01b031603611bc15750630b135d3f60e11b905061088d565b506001600160e01b0319905061088d565b6060811015611bec57506001600160e01b0319905061088d565b600080516020614d8e8339815191526000611c0a6020828789614ad2565b611c1391614afc565b600081815260018085016020908152604092839020835180850190945280548085529201549083015291925090158015611c4f57506020810151155b15611c6957506001600160e01b0319935061088d92505050565b836060148015611cbd5750611cbd8888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505085516020870151909250905061233c565b15611cd65750630b135d3f60e11b935061088d92505050565b83606014158015611d2b5750611d2b8888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508551602087015190925090506123da565b15611d445750630b135d3f60e11b935061088d92505050565b506001600160e01b0319935061088d92505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c829052603c81208190611da190611d9c610100870187614a8c565b611b35565b90506374eca2c160e11b6001600160e01b0319821601611dc55760009150506107e2565b5060019392505050565b801561094e57604051600090339060001990849084818181858888f193505050503d8060008114611e1c576040519150601f19603f3d011682016040523d82523d6000602084013e611e21565b606091505b505060408051848152821515602082015291925033917fa427c7d47f24d01b170779a7600b1d4c0d7cdbabaa0f19c4f0e6182053ffc931910160405180910390a25050565b600080611e76602084018461476b565b6001600160a01b03166020840135611e916040860186614a8c565b604051611e9f9291906149c9565b60006040518083038185875af1925050503d8060008114611edc576040519150601f19603f3d011682016040523d82523d6000602084013e611ee1565b606091505b509092509050611ef4602084018461476b565b6001600160a01b03167f74b56487625d598ffbf59a76c3b58fc1922f54afc86a075bad0c2a8aa05d2ad284602001358484604051611f3493929190614b1a565b60405180910390a281611f6b578051600003611f635760405163764bbf1760e01b815260040160405180910390fd5b805181602001fd5b505050565b806000819003611f9357604051635fc74f2160e11b815260040160405180910390fd5b60005b8181101561139b57611fca848483818110611fb357611fb3614a02565b9050602002810190611fc59190614b3b565b611e66565b600101611f96565b600080516020614dae83398151915254600080516020614d8e8339815191529060005b818110156120455782600101600084600201838154811061201857612018614a02565b60009182526020808320909101548352820192909252604001812081815560019081019190915501611ff5565b50612054600283016000613e60565b81546001600160a01b03191682556040517feb09d532980c3cc73dcad99b80e264204a667a54cbb7b63ec8d68dcb1c7096be90600090a15050565b612097611a90565b6120a08261243d565b610a1b8282612494565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e545760405163703e46dd60e11b815260040160405180910390fd5b600080516020614dae83398151915254600080516020614d8e8339815191529015801561212757506001600160a01b038216155b156121455760405163c4c8547360e01b815260040160405180910390fd5b80546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b61219f8282612551565b6121c6576040516313c3d61f60e01b81526004810183905260248101829052604401611558565b600084846040516020016121db9291906149c9565b6040516020818303038152906040528051906020012090508484905060000361221757604051637e25658160e11b815260040160405180910390fd5b60008181527fa2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694901602052604090208054600080516020614d8e83398151915291901515806122675750600181015415155b15612288576040516361db108160e01b815260048101849052602401611558565b604080518082018252868152602080820187815260008781526001808801845285822094518555915193820193909355600286018054918201815583529120018490555183907fd00539cb08a7c24166308150d64d603150c01baf89d3d3e4c6063d6db7c6983d90612301908a908a908a908a90614b5b565b60405180910390a250505050505050565b600080600080612322868661255d565b92509250925061233282826125aa565b5090949350505050565b600080600061234a86612663565b91509150600060028860405160200161236591815260200190565b60408051601f198184030181529082905261237f91614b82565b602060405180830381855afa15801561239c573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906123bf9190614788565b90506123ce8184848989612685565b98975050505050505050565b6000806123e685612793565b9050612433866040516020016123fe91815260200190565b60408051601f198184030181529181528301516060840151608085015160a086015160c0870151875160208901518c8c612811565b9695505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906124765750333014155b1561094e57604051630796d94560e01b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156124ee575060408051601f3d908101601f191682019092526124eb91810190614788565b60015b61251657604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611558565b600080516020614dee833981519152811461254757604051632a87526960e21b815260048101829052602401611558565b611f6b83836129b1565b600061088d8383612a07565b600080600083516041036125975760208401516040850151606086015160001a61258988828585612b01565b9550955095505050506125a3565b50508151600091506002905b9250925092565b60008260038111156125be576125be614b94565b036125c7575050565b60018260038111156125db576125db614b94565b036125f95760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561260d5761260d614b94565b0361262e5760405163fce698f760e01b815260048101829052602401611558565b600382600381111561264257612642614b94565b03610a1b576040516335e2f38360e21b815260048101829052602401611558565b6000808280602001905181019061267a9190614baa565b909590945092505050565b60006126a06002600080516020614dce833981519152614bd8565b8411156126af575060006112a3565b6040805160208101889052908101869052606081018590526080810184905260a0810183905260009060c00160405160208183030381529060405290506000806101006001600160a01b0316836040516127099190614b82565b600060405180830381855afa9150503d8060008114612744576040519150601f19603f3d011682016040523d82523d6000602084013e612749565b606091505b50915091508115612779578080602001905181019061276891906149ac565b1515600115151493505050506112a3565b6127868989898989612bd0565b9998505050505050505050565b6127d56040518060e001604052806000815260200160008152602001606081526020016000151581526020016060815260200160608152602001600081525090565b818060200190518101906127e99190614c3f565b60c089015260a088015260808701521515606086015260408501526020840152825250919050565b600060258a51108061284b57506128498a60208151811061283457612834614a02565b01602001516001600160f81b0319168a612cb3565b155b15612858575060006129a3565b6000886128648d612d19565b8960405160200161287793929190614cfe565b60408051601f198184030181528282019091526015825274113a3cb832911d113bb2b130baba34371733b2ba1160591b602083015291506128b981838a612f26565b6128c8576000925050506129a3565b60006002836040516128da9190614b82565b602060405180830381855afa1580156128f7573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061291a9190614788565b9050600060028e83604051602001612933929190614d41565b60408051601f198184030181529082905261294d91614b82565b602060405180830381855afa15801561296a573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061298d9190614788565b905061299c818a8a8a8a612685565b9450505050505b9a9950505050505050505050565b6129ba82612fd5565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156129ff57611f6b828261303a565b610a1b6130a7565b600082158015612a15575081155b80612a2d5750600160601b63ffffffff60c01b031983145b80612a455750600160601b63ffffffff60c01b031982145b15612a52575060006107e2565b6000600160601b63ffffffff60c01b031983840990506000600160601b63ffffffff60c01b0319807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc8709600160601b63ffffffff60c01b031987600160601b63ffffffff60c01b0319898a0909089050600160601b63ffffffff60c01b03197f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b820891909114949350505050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612b3c5750600091506003905082612bc6565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612b90573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612bbc57506000925060019150829050612bc6565b9250600091508190505b9450945094915050565b6000841580612bed5750600080516020614dce8339815191528510155b80612bf6575083155b80612c0f5750600080516020614dce8339815191528410155b15612c1c575060006112a3565b612c268383612a07565b612c32575060006112a3565b6000612c3d856130c6565b90506000600080516020614dce83398151915282890990506000600080516020614dce83398151915283890990506000612c7987878585613138565b9050600080516020614dce833981519152612ca28a600080516020614dce8339815191526149ef565b8208159a9950505050505050505050565b6000600160f81b83811614612cca575060006107e2565b818015612cdd5750600160fa1b83811614155b15612cea575060006107e2565b600160fb1b83811614612d1057600f60fc1b600160fc1b841601612d10575060006107e2565b50600192915050565b60606000612d2683613800565b90506000819050600060028251118015612d7157508160028351612d4a91906149ef565b81518110612d5a57612d5a614a02565b6020910101516001600160f81b031916603d60f81b145b15612d7e57506002612dc9565b60018251118015612dc057508160018351612d9991906149ef565b81518110612da957612da9614a02565b6020910101516001600160f81b031916603d60f81b145b15612dc9575060015b6000818351612dd891906149ef565b90506000816001600160401b03811115612df457612df4613fd3565b6040519080825280601f01601f191660200182016040528015612e1e576020820181803683370190505b50905060005b82811015612f1b57848181518110612e3e57612e3e614a02565b01602001516001600160f81b031916602b60f81b03612e8a57602d60f81b828281518110612e6e57612e6e614a02565b60200101906001600160f81b031916908160001a905350612f13565b848181518110612e9c57612e9c614a02565b01602001516001600160f81b031916602f60f81b03612ecc57605f60f81b828281518110612e6e57612e6e614a02565b848181518110612ede57612ede614a02565b602001015160f81c60f81b828281518110612efb57612efb614a02565b60200101906001600160f81b031916908160001a9053505b600101612e24565b509695505050505050565b825182516000918591859190845b82811015612fc65781612f478289614d63565b10612f5a5760009550505050505061088d565b83612f658289614d63565b81518110612f7557612f75614a02565b602001015160f81c60f81b6001600160f81b031916858281518110612f9c57612f9c614a02565b01602001516001600160f81b03191614612fbe5760009550505050505061088d565b600101612f34565b50600198975050505050505050565b806001600160a01b03163b60000361300b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611558565b600080516020614dee83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516130579190614b82565b600060405180830381855af49150503d8060008114613092576040519150601f19603f3d011682016040523d82523d6000602084013e613097565b606091505b50915091506112a3858383613826565b3415610e545760405163b398979f60e01b815260040160405180910390fd5b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f6080820152600080516020614dce83398151915260a082015260208160c0836005600019fa61313157600080fd5b5192915050565b600080808060ff81808815801561314d575087155b15613161576000965050505050505061086d565b6131ad7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d613882565b9092509050811580156131be575080155b156131ec57600080516020614dce83398151915288600080516020614dce833981519152038a089850600097505b600189841c16600189851c1660011b015b8061321f5760018403935060018a851c1660018a861c1660011b0190506131fd565b50600189841c16600189851c1660011b01955060018603613281577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603613290578a96508993505b6003860361329f578196508093505b60018303925060019550600194505b82600019111561378357600160601b63ffffffff60c01b031984600209600160601b63ffffffff60c01b0319818209600160601b63ffffffff60c01b0319818a09600160601b63ffffffff60c01b03198284099250600160601b63ffffffff60c01b031980600160601b63ffffffff60c01b03198b8d08600160601b63ffffffff60c01b03198c600160601b63ffffffff60c01b0319038e0809600309600160601b63ffffffff60c01b03198985099850600160601b63ffffffff60c01b03198a84099950600160601b63ffffffff60c01b031980836002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319838409089a50600160601b63ffffffff60c01b03198083600160601b63ffffffff60c01b0319038d0882099250600160601b63ffffffff60c01b031983600160601b63ffffffff60c01b03198a870908975060018d881c1660018d891c1660011b0190508061342b5787600160601b63ffffffff60c01b031903975050505050613778565b6001810361347a577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103613489578e93508d92505b60038103613498578593508492505b896134b157509198506001975087965094506137789050565b600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b03198b860908600160601b63ffffffff60c01b03198c600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b03198d88090893508061366a578361366a57600160601b63ffffffff60c01b0319896002600160601b0363ffffffff60c01b0319099450600160601b63ffffffff60c01b03198586099350600160601b63ffffffff60c01b0319848d099250600160601b63ffffffff60c01b03198486099450600160601b63ffffffff60c01b0319808c600160601b63ffffffff60c01b0319038e08600160601b63ffffffff60c01b03198d8f08099050600160601b63ffffffff60c01b0319816003099150600160601b63ffffffff60c01b03198a86099950600160601b63ffffffff60c01b03198b85099a50600160601b63ffffffff60c01b031980846002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319848509089b50600160601b63ffffffff60c01b0319808d600160601b63ffffffff60c01b031903850883099350600160601b63ffffffff60c01b0319808a8709850898505050505050613778565b600160601b63ffffffff60c01b03198485099150600160601b63ffffffff60c01b0319848309600160601b63ffffffff60c01b0319838d099b50600160601b63ffffffff60c01b0319818c099a50600160601b63ffffffff60c01b0319838e09600160601b63ffffffff60c01b031980826002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b031984600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b031987880908089350600160601b63ffffffff60c01b031980838d09600160601b63ffffffff60c01b031985600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b031903860809089a50505050809a50505050505b6001830392506132ae565b60405186606082015260208152602080820152602060408201526002600160601b0363ffffffff60c01b03196080820152600160601b63ffffffff60c01b031960a082015260208160c0836005600019fa6137dd57600080fd5b600160601b63ffffffff60c01b0319815189099c9b505050505050505050505050565b60606107e282604051806060016040528060408152602001614e0e604091396001613910565b60608261383b5761383682613a8f565b61088d565b815115801561385257506001600160a01b0384163b155b1561387b57604051639996b31560e01b81526001600160a01b0385166004820152602401611558565b508061088d565b600080808086613899578585935093505050613907565b846138ab578787935093505050613907565b85881480156138b957508487145b156138da576138cb8888600180613ab8565b929a50909850925090506138f4565b6138e988886001808a8a613c13565b929a50909850925090505b61390088888484613d97565b9350935050505b94509492505050565b60608351600003613930575060408051602081019091526000815261088d565b600082613961576003855160046139479190614d76565b613952906002614d63565b61395c9190614bd8565b613986565b6003855160026139719190614d63565b61397b9190614bd8565b613986906004614d76565b90506000816001600160401b038111156139a2576139a2613fd3565b6040519080825280601f01601f1916602001820160405280156139cc576020820181803683370190505b50905060018501602082018788518901602081018051600082525b82841015613a42576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f81168701518653506001850194506139e7565b905250508515613a8357600388510660018114613a665760028114613a7957613a81565b603d6001830353603d6002830353613a81565b603d60018303535b505b50909695505050505050565b805115613a9f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080600080600160601b63ffffffff60c01b0319876002099350600160601b63ffffffff60c01b03198485099150600160601b63ffffffff60c01b03198289099050600160601b63ffffffff60c01b03198285099250600160601b63ffffffff60c01b03198683099150600160601b63ffffffff60c01b031980600160601b63ffffffff60c01b0319888b08600160601b63ffffffff60c01b031989600160601b63ffffffff60c01b0319038c08096003099550600160601b63ffffffff60c01b031980826002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319888909089350600160601b63ffffffff60c01b03198085600160601b63ffffffff60c01b031903830887099750600160601b63ffffffff60c01b03198584099050600160601b63ffffffff60c01b031980888509600160601b63ffffffff60c01b03190389089250945094509450949050565b60008060008088600003613c3257508492508391506001905080613d8a565b600160601b63ffffffff60c01b0319988903988981898809089450600160601b63ffffffff60c01b03198a600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b03198a8909089550600160601b63ffffffff60c01b03198687099350600160601b63ffffffff60c01b03198685099250600160601b63ffffffff60c01b03198489099150600160601b63ffffffff60c01b03198388099050600160601b63ffffffff60c01b0319848b099750600160601b63ffffffff60c01b031980896002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b031985600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b0319898a0908089350600160601b63ffffffff60c01b031980848b09600160601b63ffffffff60c01b031987600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b0319038d08090892505b9650965096509692505050565b6000806000613da584613e04565b9050600160601b63ffffffff60c01b031981870991506000600160601b63ffffffff60c01b03198287099050600160601b63ffffffff60c01b03198182099150600160601b63ffffffff60c01b03198289099350505094509492505050565b600060405160208152602080820152602060408201528260608201526002600160601b0363ffffffff60c01b03196080820152600160601b63ffffffff60c01b031960a082015260208160c0836005600019fa61313157600080fd5b508054600082559060005260206000209081019061094e91905b80821115613e8e5760008155600101613e7a565b5090565b600060208284031215613ea457600080fd5b81356001600160e01b03198116811461088d57600080fd5b6001600160a01b038116811461094e57600080fd5b803561189581613ebc565b60008083601f840112613eee57600080fd5b5081356001600160401b03811115613f0557600080fd5b6020830191508360208260051b8501011115613f2057600080fd5b9250929050565b60008060008060008060006080888a031215613f4257600080fd5b8735613f4d81613ebc565b965060208801356001600160401b0380821115613f6957600080fd5b613f758b838c01613edc565b909850965060408a0135915080821115613f8e57600080fd5b613f9a8b838c01613edc565b909650945060608a0135915080821115613fb357600080fd5b50613fc08a828b01613edc565b989b979a50959850939692959293505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561401157614011613fd3565b604052919050565b60006001600160401b0382111561403257614032613fd3565b50601f01601f191660200190565b600082601f83011261405157600080fd5b813561406461405f82614019565b613fe9565b81815284602083860101111561407957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156140ac57600080fd5b84356140b781613ebc565b935060208501356140c781613ebc565b92506040850135915060608501356001600160401b038111156140e957600080fd5b6140f587828801614040565b91505092959194509250565b60008083601f84011261411357600080fd5b5081356001600160401b0381111561412a57600080fd5b602083019150836020828501011115613f2057600080fd5b60008060006040848603121561415757600080fd5b8335925060208401356001600160401b0381111561417457600080fd5b61418086828701614101565b9497909650939450505050565b6000806000606084860312156141a257600080fd5b83356001600160401b038111156141b857600080fd5b840161012081870312156141cb57600080fd5b95602085013595506040909401359392505050565b6000606082840312156141f257600080fd5b50919050565b60006020828403121561420a57600080fd5b81356001600160401b0381111561422057600080fd5b61086d848285016141e0565b6020808252825182820181905260009190848201906040850190845b81811015613a8357835183529284019291840191600101614248565b6000806020838503121561427757600080fd5b82356001600160401b0381111561428d57600080fd5b61429985828601613edc565b90969095509350505050565b6000602082840312156142b757600080fd5b81356001600160c01b038116811461088d57600080fd5b6000602082840312156142e057600080fd5b81356001600160401b038111156142f657600080fd5b820160c0818503121561088d57600080fd5b60006020828403121561431a57600080fd5b5035919050565b6000806040838503121561433457600080fd5b823561433f81613ebc565b915060208301356001600160401b0381111561435a57600080fd5b61436685828601614040565b9150509250929050565b801515811461094e57600080fd5b803561189581614370565b600080600080600080600080600060c08a8c0312156143a757600080fd5b893560ff811681146143b857600080fd5b98506143c660208b01613ed1565b975060408a01356001600160401b03808211156143e257600080fd5b6143ee8d838e01613edc565b909950975060608c013591508082111561440757600080fd5b6144138d838e01613edc565b909750955060808c013591508082111561442c57600080fd5b506144398c828d01613edc565b909450925061444c905060a08b0161437e565b90509295985092959850929598565b6000806040838503121561446e57600080fd5b823561447981613ebc565b946020939093013593505050565b60005b838110156144a257818101518382015260200161448a565b50506000910152565b600081518084526144c3816020860160208601614487565b601f01601f19169290920160200192915050565b60208152600061088d60208301846144ab565b600082601f8301126144fb57600080fd5b813560206001600160401b0382111561451657614516613fd3565b8160051b614525828201613fe9565b928352848101820192828101908785111561453f57600080fd5b83870192505b8483101561455e57823582529183019190830190614545565b979650505050505050565b600080600080600060a0868803121561458157600080fd5b853561458c81613ebc565b9450602086013561459c81613ebc565b935060408601356001600160401b03808211156145b857600080fd5b6145c489838a016144ea565b945060608801359150808211156145da57600080fd5b6145e689838a016144ea565b935060808801359150808211156145fc57600080fd5b5061460988828901614040565b9150509295509295909350565b6000806000806060858703121561462c57600080fd5b84356001600160401b0381111561464257600080fd5b61464e87828801614101565b90989097506020870135966040013595509350505050565b6000806020838503121561467957600080fd5b82356001600160401b0381111561468f57600080fd5b61429985828601614101565b6000806000604084860312156146b057600080fd5b83356001600160401b03808211156146c757600080fd5b6146d387838801614101565b909550935060208601359150808211156146ec57600080fd5b506146f9868287016141e0565b9150509250925092565b600080600080600060a0868803121561471b57600080fd5b853561472681613ebc565b9450602086013561473681613ebc565b9350604086013592506060860135915060808601356001600160401b0381111561475f57600080fd5b61460988828901614040565b60006020828403121561477d57600080fd5b813561088d81613ebc565b60006020828403121561479a57600080fd5b5051919050565b6000808335601e198436030181126147b857600080fd5b83016020810192503590506001600160401b038111156147d757600080fd5b803603821315613f2057600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b888110156148c257858403601f19018a52823536899003605e1901811261484e578283fd5b88016060813561485d81613ebc565b6001600160a01b03168652614874828801836147a1565b828989015261488683890182846147e6565b925050506040614898818401846147a1565b9350878303828901526148ac8385836147e6565b9d89019d97505050938601935050600101614829565b509198975050505050505050565b60208152600082356148e181613ebc565b6001600160a01b039081166020848101919091528401359061490282613ebc565b80821660408501525050604083013560608301526060830135601e1984360301811261492d57600080fd5b83016020810190356001600160401b0381111561494957600080fd5b8060051b360382131561495b57600080fd5b60c0608085015261497060e08501828461480f565b915050608084013560a084015261498a60a08501856147a1565b848303601f190160c08601526124338382846147e6565b805161189581614370565b6000602082840312156149be57600080fd5b815161088d81614370565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156107e2576107e26149d9565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b604081526000614a426040830185876147e6565b82810360208401528335614a5581613ebc565b6001600160a01b0316815260208481013590820152614a7760408501856147a1565b606060408401526123ce6060840182846147e6565b6000808335601e19843603018112614aa357600080fd5b8301803591506001600160401b03821115614abd57600080fd5b602001915036819003821315613f2057600080fd5b60008085851115614ae257600080fd5b83861115614aef57600080fd5b5050820193919092039150565b803560208310156107e257600019602084900360031b1b1692915050565b83815282151560208201526060604082015260006112a360608301846144ab565b60008235605e19833603018112614b5157600080fd5b9190910192915050565b606081526000614b6f6060830186886147e6565b6020830194909452506040015292915050565b60008251614b51818460208701614487565b634e487b7160e01b600052602160045260246000fd5b600080600060608486031215614bbf57600080fd5b8351925060208401519150604084015190509250925092565b600082614bf557634e487b7160e01b600052601260045260246000fd5b500490565b600082601f830112614c0b57600080fd5b8151614c1961405f82614019565b818152846020838601011115614c2e57600080fd5b61086d826020830160208701614487565b600080600080600080600080610100898b031215614c5c57600080fd5b88519750602089015196506040890151955060608901516001600160401b0380821115614c8857600080fd5b614c948c838d01614bfa565b9650614ca260808c016149a1565b955060a08b0151915080821115614cb857600080fd5b614cc48c838d01614bfa565b945060c08b0151915080821115614cda57600080fd5b50614ce78b828c01614bfa565b92505060e089015190509295985092959890939650565b60008451614d10818460208901614487565b845190830190614d24818360208901614487565b8451910190614d37818360208801614487565b0195945050505050565b60008351614d53818460208801614487565b9190910191825250602001919050565b808201808211156107e2576107e26149d9565b80820281158282048414176107e2576107e26149d956fea2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694900a2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694902ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212208ea6494b631dfbdfca458a1c0a52311f1cf61e8c8eacea1ff8b3b6e773897baa64736f6c63430008170033000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d780000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x2", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x12ec78cfe2faa12eec47fdf21d25ce2210c5fe59086054d476ec1b27ea30c8d3", + "transactionType": "CREATE2", + "contractName": "AllowedCalldataEnforcer", + "contractAddress": "0x48db3835a873d64a4af2c09f014052407c003bd7", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x8b796", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061059c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610085575b600080fd5b61005961005436600461035a565b61009d565b005b61006e61006936600461041d565b61020c565b60405161007c92919061045f565b60405180910390f35b61005961009336600461035a565b5050505050505050565b60006060806100ac8b8b61020c565b805191945092506100c060408901896104b6565b90506100cc82866104fd565b11156101375760405162461bcd60e51b815260206004820152602f60248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d60448201526e0c6c2d8d8c8c2e8c25ad8cadccee8d608b1b60648201526084015b60405180910390fd5b61014460408901896104b6565b859061015084836104fd565b9261015d9392919061051e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509294506101a192508491508590506102d9565b6101fe5760405162461bcd60e51b815260206004820152602860248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d60448201526763616c6c6461746160c01b606482015260840161012e565b505050505050505050505050565b6000606060218310156102745760405162461bcd60e51b815260206004820152602a60248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d6044820152697465726d732d73697a6560b01b606482015260840161012e565b61028260206000858761051e565b61028b91610548565b915061029a836020818761051e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250949792965091945050505050565b6000818051906020012083805190602001201490505b92915050565b60008083601f84011261030757600080fd5b50813567ffffffffffffffff81111561031f57600080fd5b60208301915083602082850101111561033757600080fd5b9250929050565b80356001600160a01b038116811461035557600080fd5b919050565b60008060008060008060008060c0898b03121561037657600080fd5b883567ffffffffffffffff8082111561038e57600080fd5b61039a8c838d016102f5565b909a50985060208b01359150808211156103b357600080fd5b6103bf8c838d016102f5565b909850965060408b01359150808211156103d857600080fd5b5089016060818c0312156103eb57600080fd5b93506060890135925061040060808a0161033e565b915061040e60a08a0161033e565b90509295985092959890939650565b6000806020838503121561043057600080fd5b823567ffffffffffffffff81111561044757600080fd5b610453858286016102f5565b90969095509350505050565b8281526000602060406020840152835180604085015260005b8181101561049457858101830151858201606001528201610478565b506000606082860101526060601f19601f830116850101925050509392505050565b6000808335601e198436030181126104cd57600080fd5b83018035915067ffffffffffffffff8211156104e857600080fd5b60200191503681900382131561033757600080fd5b808201808211156102ef57634e487b7160e01b600052601160045260246000fd5b6000808585111561052e57600080fd5b8386111561053b57600080fd5b5050820193919092039150565b803560208310156102ef57600019602084900360031b1b169291505056fea264697066735822122094149f339193c37892b2442e24526e5fff221c6592b2b7cd87732677fcc1c9c464736f6c63430008170033", + "nonce": "0x3", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xc73a23153176dbe22460e8e0e1564dfa06829a50c18d071be08e45ec3badefdd", + "transactionType": "CREATE2", + "contractName": "AllowedMethodsEnforcer", + "contractAddress": "0xfd731951bf1c52afccee3e6f14ab656475b76dd4", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xa0d6a", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610683806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610084575b600080fd5b6100596100543660046103a7565b61009c565b005b61006e61006936600461046a565b6101ff565b60405161007b91906104ac565b60405180910390f35b6100596100923660046103a7565b5050505050505050565b60046100ab60408601866104fa565b9050101561011a5760405162461bcd60e51b815260206004820152603160248201527f416c6c6f7765644d6574686f6473456e666f726365723a696e76616c69642d616044820152700c6e8d2dedc5ac8c2e8c25ad8cadccee8d607b1b60648201526084015b60405180910390fd5b600061012960408601866104fa565b61013891600491600091610541565b6101419161056b565b9050600061014f8a8a6101ff565b805190915060005b818110156101a4578281815181106101715761017161059b565b60200260200101516001600160e01b031916846001600160e01b0319160361019c5750505050610092565b600101610157565b5060405162461bcd60e51b815260206004820152602960248201527f416c6c6f7765644d6574686f6473456e666f726365723a6d6574686f642d6e6f6044820152681d0b585b1b1bddd95960ba1b6064820152608401610111565b606060008261020f6004826105c7565b156102705760405162461bcd60e51b815260206004820152602b60248201527f416c6c6f7765644d6574686f6473456e666f726365723a696e76616c69642d7460448201526a0cae4dae65ad8cadccee8d60ab1b6064820152608401610111565b61027b6004826105f1565b67ffffffffffffffff81111561029357610293610605565b6040519080825280602002602001820160405280156102bc578160200160208202803683370190505b50925060005b81811015610339578581866102d882600461061b565b926102e593929190610541565b6102ee9161056b565b8484815181106103005761030061059b565b6001600160e01b0319909216602092830291909101909101528261032381610634565b9350610332905060048261061b565b90506102c2565b50505092915050565b60008083601f84011261035457600080fd5b50813567ffffffffffffffff81111561036c57600080fd5b60208301915083602082850101111561038457600080fd5b9250929050565b80356001600160a01b03811681146103a257600080fd5b919050565b60008060008060008060008060c0898b0312156103c357600080fd5b883567ffffffffffffffff808211156103db57600080fd5b6103e78c838d01610342565b909a50985060208b013591508082111561040057600080fd5b61040c8c838d01610342565b909850965060408b013591508082111561042557600080fd5b5089016060818c03121561043857600080fd5b93506060890135925061044d60808a0161038b565b915061045b60a08a0161038b565b90509295985092959890939650565b6000806020838503121561047d57600080fd5b823567ffffffffffffffff81111561049457600080fd5b6104a085828601610342565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156104ee5783516001600160e01b031916835292840192918401916001016104c8565b50909695505050505050565b6000808335601e1984360301811261051157600080fd5b83018035915067ffffffffffffffff82111561052c57600080fd5b60200191503681900382131561038457600080fd5b6000808585111561055157600080fd5b8386111561055e57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156105935780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826105d6576105d66105b1565b500690565b634e487b7160e01b600052601160045260246000fd5b600082610600576106006105b1565b500490565b634e487b7160e01b600052604160045260246000fd5b8082018082111561062e5761062e6105db565b92915050565b600060018201610646576106466105db565b506001019056fea26469706673582212204ec9b63db8ffcc611dbc205c0eb5d3daa906537fc4f6d216704a61e004393bed64736f6c63430008170033", + "nonce": "0x4", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x37bba227c218a22525118d8f9b8a863ac46ebbfd7858edb6506a1039ca45269f", + "transactionType": "CREATE2", + "contractName": "AllowedTargetsEnforcer", + "contractAddress": "0xbc8673c0afa52d86d991c06881e55b2966920564", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x92061", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b506105d9806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610084575b600080fd5b61005961005436600461031e565b61009c565b005b61006e6100693660046103e1565b610174565b60405161007b9190610423565b60405180910390f35b61005961009236600461031e565b5050505050505050565b60006100ab6020860186610470565b905060006100b98a8a610174565b805190915060005b8181101561010c578281815181106100db576100db610492565b60200260200101516001600160a01b0316846001600160a01b0316036101045750505050610092565b6001016100c1565b5060405162461bcd60e51b815260206004820152603160248201527f416c6c6f77656454617267657473456e666f726365723a7461726765742d6164604482015270191c995cdccb5b9bdd0b585b1b1bddd959607a1b60648201526084015b60405180910390fd5b60606000826101846014826104be565b156101e55760405162461bcd60e51b815260206004820152602b60248201527f416c6c6f77656454617267657473456e666f726365723a696e76616c69642d7460448201526a0cae4dae65ad8cadccee8d60ab1b606482015260840161016b565b6101f06014826104e8565b67ffffffffffffffff811115610208576102086104fc565b604051908082528060200260200182016040528015610231578160200160208202803683370190505b50925060005b818110156102b05785818661024d826014610512565b9261025a9392919061052b565b61026391610555565b60601c84848151811061027857610278610492565b6001600160a01b03909216602092830291909101909101528261029a8161058a565b93506102a99050601482610512565b9050610237565b50505092915050565b60008083601f8401126102cb57600080fd5b50813567ffffffffffffffff8111156102e357600080fd5b6020830191508360208285010111156102fb57600080fd5b9250929050565b80356001600160a01b038116811461031957600080fd5b919050565b60008060008060008060008060c0898b03121561033a57600080fd5b883567ffffffffffffffff8082111561035257600080fd5b61035e8c838d016102b9565b909a50985060208b013591508082111561037757600080fd5b6103838c838d016102b9565b909850965060408b013591508082111561039c57600080fd5b5089016060818c0312156103af57600080fd5b9350606089013592506103c460808a01610302565b91506103d260a08a01610302565b90509295985092959890939650565b600080602083850312156103f457600080fd5b823567ffffffffffffffff81111561040b57600080fd5b610417858286016102b9565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156104645783516001600160a01b03168352928401929184019160010161043f565b50909695505050505050565b60006020828403121561048257600080fd5b61048b82610302565b9392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826104cd576104cd6104a8565b500690565b634e487b7160e01b600052601160045260246000fd5b6000826104f7576104f76104a8565b500490565b634e487b7160e01b600052604160045260246000fd5b80820180821115610525576105256104d2565b92915050565b6000808585111561053b57600080fd5b8386111561054857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156105825780818660140360031b1b83161692505b505092915050565b60006001820161059c5761059c6104d2565b506001019056fea26469706673582212204a2e5d298e85989e2cc1b01eb90837481124fb817e6ba907174cafb6c568768564736f6c63430008170033", + "nonce": "0x5", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x1551f34b1997c08f6afb939d3a425f361ca2b863a2baa20dac4baa4051b35471", + "transactionType": "CREATE2", + "contractName": "BlockNumberEnforcer", + "contractAddress": "0xc15faffa0d879b9263c15a46ce31eacfa2e0e8ae", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x71d86", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061045b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610092575b600080fd5b6100596100543660046102bd565b6100aa565b005b61006e610069366004610380565b6101b6565b604080516001600160801b0393841681529290911660208301520160405180910390f35b6100596100a03660046102bd565b5050505050505050565b6000806100b78a8a6101b6565b90925090506001600160801b0382161561013457816001600160801b031643116101345760405162461bcd60e51b8152602060048201526024808201527f426c6f636b4e756d626572456e666f726365723a6561726c792d64656c6567616044820152633a34b7b760e11b60648201526084015b60405180910390fd5b6001600160801b038116156101aa57806001600160801b031643106101aa5760405162461bcd60e51b815260206004820152602660248201527f426c6f636b4e756d626572456e666f726365723a657870697265642d64656c6560448201526533b0ba34b7b760d11b606482015260840161012b565b50505050505050505050565b6000806020831461021a5760405162461bcd60e51b815260206004820152602860248201527f426c6f636b4e756d626572456e666f726365723a696e76616c69642d7465726d6044820152670e65ad8cadccee8d60c31b606482015260840161012b565b6102286010600085876103c2565b610231916103ec565b60801c915061024383601081876103c2565b61024c916103ec565b60801c90509250929050565b60008083601f84011261026a57600080fd5b50813567ffffffffffffffff81111561028257600080fd5b60208301915083602082850101111561029a57600080fd5b9250929050565b80356001600160a01b03811681146102b857600080fd5b919050565b60008060008060008060008060c0898b0312156102d957600080fd5b883567ffffffffffffffff808211156102f157600080fd5b6102fd8c838d01610258565b909a50985060208b013591508082111561031657600080fd5b6103228c838d01610258565b909850965060408b013591508082111561033b57600080fd5b5089016060818c03121561034e57600080fd5b93506060890135925061036360808a016102a1565b915061037160a08a016102a1565b90509295985092959890939650565b6000806020838503121561039357600080fd5b823567ffffffffffffffff8111156103aa57600080fd5b6103b685828601610258565b90969095509350505050565b600080858511156103d257600080fd5b838611156103df57600080fd5b5050820193919092039150565b6fffffffffffffffffffffffffffffffff19813581811691601085101561041d5780818660100360031b1b83161692505b50509291505056fea26469706673582212202f1df071a3b936ee3ad015758f36f43130359bf66ac06d4703490535de194a3864736f6c63430008170033", + "nonce": "0x6", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xceae3288dba246ffd7a2366af50e11ca7ad8dd3a7ab89e12044a134b4474783f", + "transactionType": "CREATE2", + "contractName": "DeployedEnforcer", + "contractAddress": "0x5accb9559b56a6c1e3f90e342c85c42d93720d43", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xa62bf", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b506106b5806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063481286e6146100515780639751a83d14610081578063b99deb0e14610096578063de723eeb146100b8575b600080fd5b61006461005f366004610410565b6100d0565b6040516001600160a01b0390911681526020015b60405180910390f35b61009461008f366004610497565b6100e5565b005b6100a96100a436600461055a565b6101e4565b6040516100789392919061059c565b6100946100c6366004610497565b5050505050505050565b60006100dc82846102ca565b90505b92915050565b60008060006100f48b8b6101e4565b919450925090506001600160a01b0383163b1561014f576040516001600160a01b03841681527f641dafeb23238fae3ef71c64fced975da90c34dede63890507f3dda6b1e0dfef9060200160405180910390a15050506100c6565b600061015b82846102d7565b9050836001600160a01b0316816001600160a01b0316146101d65760405162461bcd60e51b815260206004820152602a60248201527f4465706c6f796564456e666f726365723a6465706c6f7965642d6164647265736044820152690e65adad2e6dac2e8c6d60b31b60648201526084015b60405180910390fd5b505050505050505050505050565b6000806060603484116102475760405162461bcd60e51b815260206004820152602560248201527f4465706c6f796564456e666f726365723a696e76616c69642d7465726d732d6c6044820152640cadccee8d60db1b60648201526084016101cd565b610255601460008688610602565b61025e9161062c565b60601c9250610271603460148688610602565b61027a91610661565b91506102898460348188610602565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509598949750919550929350505050565b60006100dc83833061035f565b60006102e560008385610389565b9050806001600160a01b03163b60000361031d576040516352c7cd4960e11b81526001600160a01b03821660048201526024016101cd565b6040516001600160a01b03821681527faf3c4b03f515b5a38f3c238fdc24abf10854a2f27f2a85743a71de17e9bc7e7f9060200160405180910390a192915050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6000834710156103b55760405163392efb2b60e21b8152476004820152602481018590526044016101cd565b81516000036103d757604051631328927760e21b815260040160405180910390fd5b8282516020840186f590506001600160a01b03811661040957604051633a0ba96160e11b815260040160405180910390fd5b9392505050565b6000806040838503121561042357600080fd5b50508035926020909101359150565b60008083601f84011261044457600080fd5b50813567ffffffffffffffff81111561045c57600080fd5b60208301915083602082850101111561047457600080fd5b9250929050565b80356001600160a01b038116811461049257600080fd5b919050565b60008060008060008060008060c0898b0312156104b357600080fd5b883567ffffffffffffffff808211156104cb57600080fd5b6104d78c838d01610432565b909a50985060208b01359150808211156104f057600080fd5b6104fc8c838d01610432565b909850965060408b013591508082111561051557600080fd5b5089016060818c03121561052857600080fd5b93506060890135925061053d60808a0161047b565b915061054b60a08a0161047b565b90509295985092959890939650565b6000806020838503121561056d57600080fd5b823567ffffffffffffffff81111561058457600080fd5b61059085828601610432565b90969095509350505050565b60018060a01b03841681526000602084602084015260606040840152835180606085015260005b818110156105df578581018301518582016080015282016105c3565b506000608082860101526080601f19601f83011685010192505050949350505050565b6000808585111561061257600080fd5b8386111561061f57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106595780818660140360031b1b83161692505b505092915050565b803560208310156100df57600019602084900360031b1b169291505056fea2646970667358221220adae6ada7a0e210e98db78555afd35a3b834fe39e89d1ae92e20b35e9cc9358664736f6c63430008170033", + "nonce": "0x7", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xa9dfb2ef47f3d790239af73579f1ac4e93c0a6cfc67a7907232d859ed5d51c91", + "transactionType": "CREATE2", + "contractName": "ERC20BalanceGteEnforcer", + "contractAddress": "0xb5d6b1ec6d868a3bae5b7f48178eaa2686a7a087", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xb04bf", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061074a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806332a16f4e146100675780638678d6ef1461009f5780639751a83d146100c0578063b5e54492146100d5578063b99deb0e146100f5578063de723eeb14610127575b600080fd5b61008a61007536600461049d565b60016020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100b26100ad3660046104d2565b61013a565b604051908152602001610096565b6100d36100ce366004610557565b61014f565b005b6100b26100e336600461049d565b60006020819052908152604090205481565b61010861010336600461061a565b610289565b604080516001600160a01b039093168352602083019190915201610096565b6100d3610135366004610557565b61032f565b600061014784848461045a565b949350505050565b600061015b8989610289565b509050600061016b33838761045a565b60008181526001602052604090205490915060ff16156101e55760405162461bcd60e51b815260206004820152602a60248201527f455243323042616c616e6365477465456e666f726365723a656e666f726365726044820152690b5a5ccb5b1bd8dad95960b21b60648201526084015b60405180910390fd5b6000818152600160208190526040808320805460ff1916909217909155516370a0823160e01b81526001600160a01b0386811660048301528416906370a0823190602401602060405180830381865afa158015610246573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026a919061065c565b6000928352602083905260409092209190915550505050505050505050565b600080603483146102f15760405162461bcd60e51b815260206004820152602c60248201527f455243323042616c616e6365477465456e666f726365723a696e76616c69642d60448201526b0e8cae4dae65ad8cadccee8d60a31b60648201526084016101dc565b6102ff601460008587610675565b6103089161069f565b60601c915061031a8360148187610675565b610323916106d4565b60001c90509250929050565b60008061033c8a8a610289565b91509150600061034d33848861045a565b600081815260016020526040808220805460ff19169055516370a0823160e01b81526001600160a01b03888116600483015292935090918516906370a0823190602401602060405180830381865afa1580156103ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d1919061065c565b6000838152602081905260409020549091506103ee9084906106f3565b81101561044c5760405162461bcd60e51b815260206004820152602660248201527f455243323042616c616e6365477465456e666f726365723a62616c616e63652d6044820152651b9bdd0b59dd60d21b60648201526084016101dc565b505050505050505050505050565b604080516001600160a01b039485166020808301919091529390941684820152606080850192909252805180850390920182526080909301909252815191012090565b6000602082840312156104af57600080fd5b5035919050565b80356001600160a01b03811681146104cd57600080fd5b919050565b6000806000606084860312156104e757600080fd5b6104f0846104b6565b92506104fe602085016104b6565b9150604084013590509250925092565b60008083601f84011261052057600080fd5b50813567ffffffffffffffff81111561053857600080fd5b60208301915083602082850101111561055057600080fd5b9250929050565b60008060008060008060008060c0898b03121561057357600080fd5b883567ffffffffffffffff8082111561058b57600080fd5b6105978c838d0161050e565b909a50985060208b01359150808211156105b057600080fd5b6105bc8c838d0161050e565b909850965060408b01359150808211156105d557600080fd5b5089016060818c0312156105e857600080fd5b9350606089013592506105fd60808a016104b6565b915061060b60a08a016104b6565b90509295985092959890939650565b6000806020838503121561062d57600080fd5b823567ffffffffffffffff81111561064457600080fd5b6106508582860161050e565b90969095509350505050565b60006020828403121561066e57600080fd5b5051919050565b6000808585111561068557600080fd5b8386111561069257600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106cc5780818660140360031b1b83161692505b505092915050565b803560208310156106ed57600019602084900360031b1b165b92915050565b808201808211156106ed57634e487b7160e01b600052601160045260246000fdfea2646970667358221220706a4bd5217d105228b49e7ecb48d785e4c5a4cbd88c1e0018e40907dafc0c9d64736f6c63430008170033", + "nonce": "0x8", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe99ba1894b63c71293772c9348540dba0d82f7e79b2ccd1c8998b2a78a015ec2", + "transactionType": "CREATE2", + "contractName": "ERC20TransferAmountEnforcer", + "contractAddress": "0x92ac423b9c111962179a6242e1adb58d02c103be", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xaff7d", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061073b806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80639751a83d146100515780639dd5d9ab14610066578063b99deb0e146100a1578063de723eeb146100d3575b600080fd5b61006461005f366004610480565b6100eb565b005b61008e610074366004610543565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b6100b46100af36600461056d565b610383565b604080516001600160a01b039093168352602083019190915201610098565b6100646100e1366004610480565b5050505050505050565b6100f860408501856105af565b90506044146101565760405162461bcd60e51b815260206004820152603160248201526000805160206106e68339815191526044820152700d8d2c85ac2c6e8d2dedc5ad8cadccee8d607b1b60648201526084015b60405180910390fd5b6000806101638a8a610383565b9092509050600061017760208801886105f6565b905063a9059cbb60e01b6001600160a01b03848116908316146101df5760405162461bcd60e51b815260206004820152602c60248201526000805160206106e683398151915260448201526b1b1a590b58dbdb9d1c9858dd60a21b606482015260840161014d565b60006101ee60408a018a6105af565b6101fd91600491600091610618565b61020691610642565b90506001600160e01b0319808216908316146102655760405162461bcd60e51b815260206004820152602a60248201526000805160206106e68339815191526044820152691b1a590b5b595d1a1bd960b21b606482015260840161014d565b600061027460408b018b6105af565b61028391604491602491610618565b61028c91610672565b336000908152602081815260408083208d845290915281208054929350909183919083906102bb908490610691565b92505081905590508581111561032a5760405162461bcd60e51b815260206004820152602e60248201527f45524332305472616e73666572416d6f756e74456e666f726365723a616c6c6f60448201526d1dd85b98d94b595e18d95959195960921b606482015260840161014d565b60408051878152602081018390528b916001600160a01b038b169133917fc026e493323d526061a052b5dd562495120e2f648797a48be61966d3a6beec8d910160405180910390a4505050505050505050505050505050565b600080603483146103dd5760405162461bcd60e51b815260206004820152603060248201526000805160206106e683398151915260448201526f0d8d2c85ae8cae4dae65ad8cadccee8d60831b606482015260840161014d565b6103eb601460008587610618565b6103f4916106b2565b60601c91506104068360148187610618565b61040f91610672565b60001c90509250929050565b60008083601f84011261042d57600080fd5b50813567ffffffffffffffff81111561044557600080fd5b60208301915083602082850101111561045d57600080fd5b9250929050565b80356001600160a01b038116811461047b57600080fd5b919050565b60008060008060008060008060c0898b03121561049c57600080fd5b883567ffffffffffffffff808211156104b457600080fd5b6104c08c838d0161041b565b909a50985060208b01359150808211156104d957600080fd5b6104e58c838d0161041b565b909850965060408b01359150808211156104fe57600080fd5b5089016060818c03121561051157600080fd5b93506060890135925061052660808a01610464565b915061053460a08a01610464565b90509295985092959890939650565b6000806040838503121561055657600080fd5b61055f83610464565b946020939093013593505050565b6000806020838503121561058057600080fd5b823567ffffffffffffffff81111561059757600080fd5b6105a38582860161041b565b90969095509350505050565b6000808335601e198436030181126105c657600080fd5b83018035915067ffffffffffffffff8211156105e157600080fd5b60200191503681900382131561045d57600080fd5b60006020828403121561060857600080fd5b61061182610464565b9392505050565b6000808585111561062857600080fd5b8386111561063557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561066a5780818660040360031b1b83161692505b505092915050565b8035602083101561068b57600019602084900360031b1b165b92915050565b8082018082111561068b57634e487b7160e01b600052601160045260246000fd5b6bffffffffffffffffffffffff19813581811691601485101561066a5760149490940360031b84901b169092169291505056fe45524332305472616e73666572416d6f756e74456e666f726365723a696e7661a2646970667358221220bbaa47e7ff7ca5d260ee2e4ae44f60d5ed447ee0a25335e020538968f33cc37d64736f6c63430008170033", + "nonce": "0x9", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x4c25e82f011255811f5b3ed8f9199e2b8c644f9d2cae03471180fe326c001f8f", + "transactionType": "CREATE2", + "contractName": "IdEnforcer", + "contractAddress": "0x34152d9f3f8f74338d50703e780389e829b4abac", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x769bd", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610486806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063595dce48146100515780639751a83d14610079578063b99deb0e1461008e578063de723eeb146100af575b600080fd5b61006461005f3660046102a8565b6100c7565b60405190151581526020015b60405180910390f35b61008c61008736600461032d565b6100fe565b005b6100a161009c3660046103f0565b610204565b604051908152602001610070565b61008c6100bd36600461032d565b5050505050505050565b6001600160a01b0380841660009081526020818152604080832093861683529290529081206100f69083610267565b949350505050565b600061010a8989610204565b90506101173384836100c7565b156101695760405162461bcd60e51b815260206004820152601a60248201527f4964456e666f726365723a69642d616c72656164792d7573656400000000000060448201526064015b60405180910390fd5b336000908152602081815260408083206001600160a01b03871684528252808320600885901c845290915290208054600160ff84161b179055826001600160a01b0316826001600160a01b0316336001600160a01b03167f6286af1aaf28b34723a53056e5608eabb40c823d1ce093ff371cf08c502431d6846040516101f191815260200190565b60405180910390a4505050505050505050565b6000602082146102565760405162461bcd60e51b815260206004820152601f60248201527f4964456e666f726365723a696e76616c69642d7465726d732d6c656e677468006044820152606401610160565b6102608284610432565b9392505050565b600881901c600090815260208390526040902054600160ff83161b1615155b92915050565b80356001600160a01b03811681146102a357600080fd5b919050565b6000806000606084860312156102bd57600080fd5b6102c68461028c565b92506102d46020850161028c565b9150604084013590509250925092565b60008083601f8401126102f657600080fd5b50813567ffffffffffffffff81111561030e57600080fd5b60208301915083602082850101111561032657600080fd5b9250929050565b60008060008060008060008060c0898b03121561034957600080fd5b883567ffffffffffffffff8082111561036157600080fd5b61036d8c838d016102e4565b909a50985060208b013591508082111561038657600080fd5b6103928c838d016102e4565b909850965060408b01359150808211156103ab57600080fd5b5089016060818c0312156103be57600080fd5b9350606089013592506103d360808a0161028c565b91506103e160a08a0161028c565b90509295985092959890939650565b6000806020838503121561040357600080fd5b823567ffffffffffffffff81111561041a57600080fd5b610426858286016102e4565b90969095509350505050565b8035602083101561028657600019602084900360031b1b169291505056fea264697066735822122028074431512be4166d9bc04a0557354e43d233df6620f59dcf4e6fea83a3a51f64736f6c63430008170033", + "nonce": "0xa", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x700b18b1dc06fb9638f7b4dae5754b88e7f479a6fc34dc36b95c3ab049124041", + "transactionType": "CREATE2", + "contractName": "LimitedCallsEnforcer", + "contractAddress": "0x4b3adad4a328bee8ba17b86074d92fe7372180cd", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x71f8a", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610442806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806319054d89146100515780639751a83d1461008b578063b99deb0e146100a0578063de723eeb146100b3575b600080fd5b61007961005f36600461024e565b600060208181529281526040808220909352908152205481565b60405190815260200160405180910390f35b61009e6100993660046102c1565b6100cb565b005b6100796100ae366004610384565b6101bd565b61009e6100c13660046102c1565b5050505050505050565b60006100d789896101bd565b336000908152602081815260408083208884529091528120805492935090918290610101906103c6565b91829055509050818111156101695760405162461bcd60e51b815260206004820152602360248201527f4c696d6974656443616c6c73456e666f726365723a6c696d69742d657863656560448201526219195960ea1b60648201526084015b60405180910390fd5b604080518381526020810183905286916001600160a01b0386169133917f449da07f2c06c9d1a6b19d2454ffe749e8cf991d22f686e076a1a4844c5ff370910160405180910390a450505050505050505050565b6000602082146102215760405162461bcd60e51b815260206004820152602960248201527f4c696d6974656443616c6c73456e666f726365723a696e76616c69642d7465726044820152680dae65ad8cadccee8d60bb1b6064820152608401610160565b61022b82846103ed565b9392505050565b80356001600160a01b038116811461024957600080fd5b919050565b6000806040838503121561026157600080fd5b61026a83610232565b946020939093013593505050565b60008083601f84011261028a57600080fd5b50813567ffffffffffffffff8111156102a257600080fd5b6020830191508360208285010111156102ba57600080fd5b9250929050565b60008060008060008060008060c0898b0312156102dd57600080fd5b883567ffffffffffffffff808211156102f557600080fd5b6103018c838d01610278565b909a50985060208b013591508082111561031a57600080fd5b6103268c838d01610278565b909850965060408b013591508082111561033f57600080fd5b5089016060818c03121561035257600080fd5b93506060890135925061036760808a01610232565b915061037560a08a01610232565b90509295985092959890939650565b6000806020838503121561039757600080fd5b823567ffffffffffffffff8111156103ae57600080fd5b6103ba85828601610278565b90969095509350505050565b6000600182016103e657634e487b7160e01b600052601160045260246000fd5b5060010190565b8035602083101561040657600019602084900360031b1b165b9291505056fea2646970667358221220f78aa8066d472e78f2d898b70704f695cf682a9b2914539b1a5a83b1dd87e31064736f6c63430008170033", + "nonce": "0xb", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8eb960a412bac4568a560de045590f3eb23e9d412676721850b53b1bb1f68297", + "transactionType": "CREATE2", + "contractName": "NonceEnforcer", + "contractAddress": "0x2f32ff3fc3086d7f63f16fe8d0065390d460b40d", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x72e5b", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610457806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80632bd4ed211461005c5780639751a83d14610096578063b99deb0e146100ab578063de723eeb146100be578063f5743c4c146100d6575b600080fd5b61008461006a366004610266565b600060208181529281526040808220909352908152205481565b60405190815260200160405180910390f35b6100a96100a43660046102e2565b6100e9565b005b6100846100b93660046103a5565b610178565b6100a96100cc3660046102e2565b5050505050505050565b6100a96100e43660046103e7565b6101e6565b60006100f58989610178565b336000908152602081815260408083206001600160a01b0388168452909152902054909150811461016d5760405162461bcd60e51b815260206004820152601b60248201527f4e6f6e6365456e666f726365723a696e76616c69642d6e6f6e6365000000000060448201526064015b60405180910390fd5b505050505050505050565b6000602082146101d55760405162461bcd60e51b815260206004820152602260248201527f4e6f6e6365456e666f726365723a696e76616c69642d7465726d732d6c656e676044820152610e8d60f31b6064820152608401610164565b6101df8284610402565b9392505050565b6001600160a01b038116600081815260208181526040808320338085529083529281902080546001810190915590518181529093917fe02d340254c92bc3ad96f0fceb790db939e11c669c1f4c8a549d248f17130b33910160405180910390a35050565b80356001600160a01b038116811461026157600080fd5b919050565b6000806040838503121561027957600080fd5b6102828361024a565b91506102906020840161024a565b90509250929050565b60008083601f8401126102ab57600080fd5b50813567ffffffffffffffff8111156102c357600080fd5b6020830191508360208285010111156102db57600080fd5b9250929050565b60008060008060008060008060c0898b0312156102fe57600080fd5b883567ffffffffffffffff8082111561031657600080fd5b6103228c838d01610299565b909a50985060208b013591508082111561033b57600080fd5b6103478c838d01610299565b909850965060408b013591508082111561036057600080fd5b5089016060818c03121561037357600080fd5b93506060890135925061038860808a0161024a565b915061039660a08a0161024a565b90509295985092959890939650565b600080602083850312156103b857600080fd5b823567ffffffffffffffff8111156103cf57600080fd5b6103db85828601610299565b90969095509350505050565b6000602082840312156103f957600080fd5b6101df8261024a565b8035602083101561041b57600019602084900360031b1b165b9291505056fea2646970667358221220b8ac9ab0759f02df69d888b08c000fa4dfa4048ad7f88931687eeff439dd484a64736f6c63430008170033", + "nonce": "0xc", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x827802bb0f6622dd66d57de040c633e6f678b7843c8835e6137d0f2c8f03f7b4", + "transactionType": "CREATE2", + "contractName": "TimestampEnforcer", + "contractAddress": "0x78e05f779490c24bf3bfa135b4112e7003b321cd", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x71c58", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610455806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610092575b600080fd5b6100596100543660046102b7565b6100aa565b005b61006e61006936600461037a565b6101b2565b604080516001600160801b0393841681529290911660208301520160405180910390f35b6100596100a03660046102b7565b5050505050505050565b6000806100b78a8a6101b2565b90925090506001600160801b0382161561013357816001600160801b031642116101335760405162461bcd60e51b815260206004820152602260248201527f54696d657374616d70456e666f726365723a6561726c792d64656c656761746960448201526137b760f11b60648201526084015b60405180910390fd5b6001600160801b038116156101a657806001600160801b031642106101a65760405162461bcd60e51b8152602060048201526024808201527f54696d657374616d70456e666f726365723a657870697265642d64656c6567616044820152633a34b7b760e11b606482015260840161012a565b50505050505050505050565b600080602083146102145760405162461bcd60e51b815260206004820152602660248201527f54696d657374616d70456e666f726365723a696e76616c69642d7465726d732d6044820152650d8cadccee8d60d31b606482015260840161012a565b61022183601081876103bc565b61022a916103e6565b60801c905061023d6010600085876103bc565b610246916103e6565b60801c91509250929050565b60008083601f84011261026457600080fd5b50813567ffffffffffffffff81111561027c57600080fd5b60208301915083602082850101111561029457600080fd5b9250929050565b80356001600160a01b03811681146102b257600080fd5b919050565b60008060008060008060008060c0898b0312156102d357600080fd5b883567ffffffffffffffff808211156102eb57600080fd5b6102f78c838d01610252565b909a50985060208b013591508082111561031057600080fd5b61031c8c838d01610252565b909850965060408b013591508082111561033557600080fd5b5089016060818c03121561034857600080fd5b93506060890135925061035d60808a0161029b565b915061036b60a08a0161029b565b90509295985092959890939650565b6000806020838503121561038d57600080fd5b823567ffffffffffffffff8111156103a457600080fd5b6103b085828601610252565b90969095509350505050565b600080858511156103cc57600080fd5b838611156103d957600080fd5b5050820193919092039150565b6fffffffffffffffffffffffffffffffff1981358181169160108510156104175780818660100360031b1b83161692505b50509291505056fea2646970667358221220032d822c6d896afe6d14f1080a0918e2996d1c61fe51449e6ecf5841d50e5ea464736f6c63430008170033", + "nonce": "0xd", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xd851c91e994de7a8f91e28b25cd3ce117636a3d4301999ffd212fc626ab6212e", + "transactionType": "CREATE2", + "contractName": "ValueLteEnforcer", + "contractAddress": "0xfc20ede0a1132e839fbda9d7ed3904ff3c89540f", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x5b811", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061033a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610080575b600080fd5b6100596100543660046101e0565b610098565b005b61006e6100693660046102a3565b61010a565b60405190815260200160405180910390f35b61005961008e3660046101e0565b5050505050505050565b60006100a4898961010a565b905080856020013511156100ff5760405162461bcd60e51b815260206004820152601f60248201527f56616c75654c7465456e666f726365723a76616c75652d746f6f2d686967680060448201526064015b60405180910390fd5b505050505050505050565b60006020821461016a5760405162461bcd60e51b815260206004820152602560248201527f56616c75654c7465456e666f726365723a696e76616c69642d7465726d732d6c6044820152640cadccee8d60db1b60648201526084016100f6565b61017482846102e5565b9392505050565b60008083601f84011261018d57600080fd5b50813567ffffffffffffffff8111156101a557600080fd5b6020830191508360208285010111156101bd57600080fd5b9250929050565b80356001600160a01b03811681146101db57600080fd5b919050565b60008060008060008060008060c0898b0312156101fc57600080fd5b883567ffffffffffffffff8082111561021457600080fd5b6102208c838d0161017b565b909a50985060208b013591508082111561023957600080fd5b6102458c838d0161017b565b909850965060408b013591508082111561025e57600080fd5b5089016060818c03121561027157600080fd5b93506060890135925061028660808a016101c4565b915061029460a08a016101c4565b90509295985092959890939650565b600080602083850312156102b657600080fd5b823567ffffffffffffffff8111156102cd57600080fd5b6102d98582860161017b565b90969095509350505050565b803560208310156102fe57600019602084900360031b1b165b9291505056fea2646970667358221220cd4bcb89c90c60ef26b293e82752e5ff08228ce4ed86119c5597e63559710ece64736f6c63430008170033", + "nonce": "0xe", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x611eb8", + "logs": [ + { + "address": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44" + ], + "data": "0x", + "blockHash": "0x164ec1cd8802456cf9de9f8ff53443674aa86bdb6cb13b46ff53be63505b1a52", + "blockNumber": "0xdb130e7", + "transactionHash": "0x0413fbd3e00b075713b22e27c24137522940fba946a68b592b158aef4b4e62fa", + "transactionIndex": "0x19", + "logIndex": "0x49", + "removed": false + }, + { + "address": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "topics": [ + "0x04a46d9007577c7ff1e513b900545162ec25d25991ae3dc60cf26ec01a84806d", + "0xe7f4f1f0c55f96ecea405a30bdd6b9dbc3317221da834d38c7bb57ce89a84023", + "0x000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d78" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000a4b1000000000000000000000000000000000000000000000000000000000000001144656c65676174696f6e4d616e6167657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013100000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x164ec1cd8802456cf9de9f8ff53443674aa86bdb6cb13b46ff53be63505b1a52", + "blockNumber": "0xdb130e7", + "transactionHash": "0x0413fbd3e00b075713b22e27c24137522940fba946a68b592b158aef4b4e62fa", + "transactionIndex": "0x19", + "logIndex": "0x4a", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000000000000000000000000004000800000004000000000000000000000000000000000000000000000000000000000041000020000000000000000000000040000000000000001000000001000000000000000000000000000020000000000000000400800000000000080000000000000000000480000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000008000000020000000000800000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x0413fbd3e00b075713b22e27c24137522940fba946a68b592b158aef4b4e62fa", + "transactionIndex": "0x19", + "blockHash": "0x164ec1cd8802456cf9de9f8ff53443674aa86bdb6cb13b46ff53be63505b1a52", + "blockNumber": "0xdb130e7", + "gasUsed": "0x244041", + "effectiveGasPrice": "0xddc570", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0x4911c", + "l1BlockNumber": "0x13510a3" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x378f89", + "logs": [ + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0x5d9f0c87037c30adf54e7c5b6bb69541363a0728f6b80fe6216493ca8b797579", + "blockNumber": "0xdb13108", + "transactionHash": "0x8972f6398b77eb12b7e6139b223f72eb1a620fbb5f897f8534c2b3ab2882c3dd", + "transactionIndex": "0x4", + "logIndex": "0x3", + "removed": false + }, + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0xb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d", + "0x000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d78" + ], + "data": "0x", + "blockHash": "0x5d9f0c87037c30adf54e7c5b6bb69541363a0728f6b80fe6216493ca8b797579", + "blockNumber": "0xdb13108", + "transactionHash": "0x8972f6398b77eb12b7e6139b223f72eb1a620fbb5f897f8534c2b3ab2882c3dd", + "transactionIndex": "0x4", + "logIndex": "0x4", + "removed": false + }, + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0xee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a99", + "0x0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032" + ], + "data": "0x", + "blockHash": "0x5d9f0c87037c30adf54e7c5b6bb69541363a0728f6b80fe6216493ca8b797579", + "blockNumber": "0xdb13108", + "transactionHash": "0x8972f6398b77eb12b7e6139b223f72eb1a620fbb5f897f8534c2b3ab2882c3dd", + "transactionIndex": "0x4", + "logIndex": "0x5", + "removed": false + }, + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0x78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d03" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x5d9f0c87037c30adf54e7c5b6bb69541363a0728f6b80fe6216493ca8b797579", + "blockNumber": "0xdb13108", + "transactionHash": "0x8972f6398b77eb12b7e6139b223f72eb1a620fbb5f897f8534c2b3ab2882c3dd", + "transactionIndex": "0x4", + "logIndex": "0x6", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000002000010000000000000000000000200000000000000000000000000000000000000000000000000000000000020810000000020000010000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200080000000000000000000080000000000000000008800000000000000000000000080000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000001080000000000000000000004000000000000000000000000000000000000000000000000000000800000000000000100000000000000", + "type": "0x2", + "transactionHash": "0x8972f6398b77eb12b7e6139b223f72eb1a620fbb5f897f8534c2b3ab2882c3dd", + "transactionIndex": "0x4", + "blockHash": "0x5d9f0c87037c30adf54e7c5b6bb69541363a0728f6b80fe6216493ca8b797579", + "blockNumber": "0xdb13108", + "gasUsed": "0x34b7e0", + "effectiveGasPrice": "0xe0a7b8", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0x55dcc", + "l1BlockNumber": "0x13510a4" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x4ba870", + "logs": [ + { + "address": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0xf512883e7f74a18ebe01a19d1a48a831943f3c90617593493b4d422ad1d7e5f9", + "blockNumber": "0xdb13145", + "transactionHash": "0xd5220582e356158edb6a05d6fef319e0d99e8e7a736c4d6bab2aed89360e82a0", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + }, + { + "address": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "topics": [ + "0xb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d", + "0x000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d78" + ], + "data": "0x", + "blockHash": "0xf512883e7f74a18ebe01a19d1a48a831943f3c90617593493b4d422ad1d7e5f9", + "blockNumber": "0xdb13145", + "transactionHash": "0xd5220582e356158edb6a05d6fef319e0d99e8e7a736c4d6bab2aed89360e82a0", + "transactionIndex": "0x1", + "logIndex": "0x1", + "removed": false + }, + { + "address": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "topics": [ + "0xee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a99", + "0x0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032" + ], + "data": "0x", + "blockHash": "0xf512883e7f74a18ebe01a19d1a48a831943f3c90617593493b4d422ad1d7e5f9", + "blockNumber": "0xdb13145", + "transactionHash": "0xd5220582e356158edb6a05d6fef319e0d99e8e7a736c4d6bab2aed89360e82a0", + "transactionIndex": "0x1", + "logIndex": "0x2", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000810000000020000010000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000080000000000000000000080000000000000000008800000000000000000000000080000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000100000000000000000000000000000000000200000000000000800000000000000100000000000000", + "type": "0x2", + "transactionHash": "0xd5220582e356158edb6a05d6fef319e0d99e8e7a736c4d6bab2aed89360e82a0", + "transactionIndex": "0x1", + "blockHash": "0xf512883e7f74a18ebe01a19d1a48a831943f3c90617593493b4d422ad1d7e5f9", + "blockNumber": "0xdb13145", + "gasUsed": "0x4ba870", + "effectiveGasPrice": "0xd28a70", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0x811e4", + "l1BlockNumber": "0x13510a6" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x150fd8", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x12ec78cfe2faa12eec47fdf21d25ce2210c5fe59086054d476ec1b27ea30c8d3", + "transactionIndex": "0x7", + "blockHash": "0xc9f71b2b807bf734263357b9d7778e5ff2addb35493882380b62f0fa079f720f", + "blockNumber": "0xdb13165", + "gasUsed": "0x6765e", + "effectiveGasPrice": "0xccd580", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0xe7ad", + "l1BlockNumber": "0x13510a6" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xf108a", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xc73a23153176dbe22460e8e0e1564dfa06829a50c18d071be08e45ec3badefdd", + "transactionIndex": "0x5", + "blockHash": "0xd368565cf8c6d9784a575973103a2652db56a8f782874cfa4c09fcd977146b3c", + "blockNumber": "0xdb13185", + "gasUsed": "0x75cc5", + "effectiveGasPrice": "0xcae950", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0x10af5", + "l1BlockNumber": "0x13510a7" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x11e2a5", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x37bba227c218a22525118d8f9b8a863ac46ebbfd7858edb6506a1039ca45269f", + "transactionIndex": "0x3", + "blockHash": "0x311680e0d88b969f433b7e4801880afe83c173c6fb8733dbf42fb10a0bf9f887", + "blockNumber": "0xdb131a5", + "gasUsed": "0x6a9fa", + "effectiveGasPrice": "0xdbf0b0", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0xe7e4", + "l1BlockNumber": "0x13510a7" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x11234a", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x1551f34b1997c08f6afb939d3a425f361ca2b863a2baa20dac4baa4051b35471", + "transactionIndex": "0x3", + "blockHash": "0xbccd6827264e9117320f4fb66ab4f35036a1b0e63c58692f5aa88cf2aabce131", + "blockNumber": "0xdb131a9", + "gasUsed": "0x53182", + "effectiveGasPrice": "0xddb9b8", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0xb1a8", + "l1BlockNumber": "0x13510a8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x125655", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xceae3288dba246ffd7a2366af50e11ca7ad8dd3a7ab89e12044a134b4474783f", + "transactionIndex": "0x4", + "blockHash": "0xf19afb8d77577cb769c28386fdf15bb983d9d30281ba411efd12ed1985412e99", + "blockNumber": "0xdb131ac", + "gasUsed": "0x78228", + "effectiveGasPrice": "0xde2718", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0x10614", + "l1BlockNumber": "0x13510a8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xd62fe", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xa9dfb2ef47f3d790239af73579f1ac4e93c0a6cfc67a7907232d859ed5d51c91", + "transactionIndex": "0x2", + "blockHash": "0x035aad6113452169b3e69461c50b03700efcabcaed243b8fa93bcedfdf058434", + "blockNumber": "0xdb131b0", + "gasUsed": "0x7fd9a", + "effectiveGasPrice": "0xde6980", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0x103af", + "l1BlockNumber": "0x13510a8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x13c034", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xe99ba1894b63c71293772c9348540dba0d82f7e79b2ccd1c8998b2a78a015ec2", + "transactionIndex": "0x6", + "blockHash": "0x35928407c07319e78476e5138ad3790a7654c0a3a1c06005a0fddd1724634f19", + "blockNumber": "0xdb131b4", + "gasUsed": "0x7f6b5", + "effectiveGasPrice": "0xde5dc8", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0x1093f", + "l1BlockNumber": "0x13510a8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x71210", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x4c25e82f011255811f5b3ed8f9199e2b8c644f9d2cae03471180fe326c001f8f", + "transactionIndex": "0x3", + "blockHash": "0xd50b4c907a38aef9e27eff2ffdbc823eb92c57e4a655eeb51b5b62098d8f8c01", + "blockNumber": "0xdb131b8", + "gasUsed": "0x56224", + "effectiveGasPrice": "0xdfb970", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0xbe9a", + "l1BlockNumber": "0x13510a8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x528de", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x700b18b1dc06fb9638f7b4dae5754b88e7f479a6fc34dc36b95c3ab049124041", + "transactionIndex": "0x1", + "blockHash": "0x93bf5b752ed364d6fda136d247f6ba339600e0d4285336c65ee46fa7580cfb49", + "blockNumber": "0xdb131bc", + "gasUsed": "0x528de", + "effectiveGasPrice": "0xdf4058", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0xbe70", + "l1BlockNumber": "0x13510a8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x60dae", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x8eb960a412bac4568a560de045590f3eb23e9d412676721850b53b1bb1f68297", + "transactionIndex": "0x2", + "blockHash": "0x37171e1d6560542d1b5f2e68e71f5267f1f2709302480d4690cb92a0c4d15f16", + "blockNumber": "0xdb131dc", + "gasUsed": "0x534bf", + "effectiveGasPrice": "0xe2d268", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0xb905", + "l1BlockNumber": "0x13510a8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x52ba5", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x827802bb0f6622dd66d57de040c633e6f678b7843c8835e6137d0f2c8f03f7b4", + "transactionIndex": "0x1", + "blockHash": "0xade1486f7dd5253caeb82a55a03f9e382d2104d141980904aefa42d8b35fb8d9", + "blockNumber": "0xdb13218", + "gasUsed": "0x52ba5", + "effectiveGasPrice": "0xdebb88", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0xb0db", + "l1BlockNumber": "0x13510a9" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x42466", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xd851c91e994de7a8f91e28b25cd3ce117636a3d4301999ffd212fc626ab6212e", + "transactionIndex": "0x1", + "blockHash": "0xe467b6083831fa99897dc312284147f54c347992813eaa09f4b8663793a601da", + "blockNumber": "0xdb1321c", + "gasUsed": "0x42466", + "effectiveGasPrice": "0xdd6f80", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0x991a", + "l1BlockNumber": "0x13510a9" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1720358427, + "chain": 42161, + "commit": null +} \ No newline at end of file diff --git a/broadcast/DeployEnvironmentSetUp.s.sol/42161/run-latest.json b/broadcast/DeployEnvironmentSetUp.s.sol/42161/run-latest.json new file mode 100644 index 0000000..4095e43 --- /dev/null +++ b/broadcast/DeployEnvironmentSetUp.s.sol/42161/run-latest.json @@ -0,0 +1,703 @@ +{ + "transactions": [ + { + "hash": "0x0413fbd3e00b075713b22e27c24137522940fba946a68b592b158aef4b4e62fa", + "transactionType": "CREATE2", + "contractName": "DelegationManager", + "contractAddress": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "function": null, + "arguments": [ + "0xB0403B32f54d0Bd752113f4009e8B534C6669f44" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x31a3ce", + "value": "0x0", + "input": "0x44656c654761746f7200000000000000000000000000000000000000000000006101606040523480156200001257600080fd5b50604051620029e7380380620029e7833981016040819052620000359162000384565b60408051808201825260118152702232b632b3b0ba34b7b726b0b730b3b2b960791b602080830191909152825180840190935260018352603160f81b9083015290826001600160a01b038116620000a757604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b620000b28162000204565b506001805460ff60a01b19169055620000cd82600262000222565b61012052620000de81600362000222565b61014052815160208084019190912060e052815190820120610100524660a0526200015b60e0516101005160408051600080516020620029c783398151915260208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526000620001706200025b565b9050306001600160a01b0316817f04a46d9007577c7ff1e513b900545162ec25d25991ae3dc60cf26ec01a84806d604051806040016040528060118152602001702232b632b3b0ba34b7b726b0b730b3b2b960791b815250604051806040016040528060018152602001603160f81b81525046604051620001f493929190620003fe565b60405180910390a35050620005e5565b600180546001600160a01b03191690556200021f81620002f1565b50565b600060208351101562000242576200023a8362000341565b905062000255565b816200024f8482620004df565b5060ff90505b92915050565b600060c0516001600160a01b0316306001600160a01b031614801562000282575060a05146145b156200028f575060805190565b620002ec60e0516101005160408051600080516020620029c783398151915260208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b905090565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080829050601f815111156200036f578260405163305a27a960e01b81526004016200009e9190620005ab565b80516200037c82620005c0565b179392505050565b6000602082840312156200039757600080fd5b81516001600160a01b0381168114620003af57600080fd5b9392505050565b6000815180845260005b81811015620003de57602081850181015186830182015201620003c0565b506000602082860101526020601f19601f83011685010191505092915050565b606081526000620004136060830186620003b6565b8281036020840152620004278186620003b6565b915050826040830152949350505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200046357607f821691505b6020821081036200048457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004da576000816000526020600020601f850160051c81016020861015620004b55750805b601f850160051c820191505b81811015620004d657828155600101620004c1565b5050505b505050565b81516001600160401b03811115620004fb57620004fb62000438565b62000513816200050c84546200044e565b846200048a565b602080601f8311600181146200054b5760008415620005325750858301515b600019600386901b1c1916600185901b178555620004d6565b600085815260208120601f198616915b828110156200057c578886015182559484019460019091019084016200055b565b50858210156200059b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602081526000620003af6020830184620003b6565b80516020808301519190811015620004845760001960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516123876200064060003960006113bb0152600061138e015260006112f3015260006112cb01526000611226015260006112500152600061127a01526123876000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80637fade287116100b8578063a3f4df7e1161007c578063a3f4df7e1461028e578063acb8cc49146102cb578063e1520f54146102eb578063e30c3978146102fe578063f2fde38b1461030f578063ffa1ad741461032257600080fd5b80637fade2871461023f57806383ebb771146102525780638456cb591461025a57806384b0196e146102625780638da5cb5b1461027d57600080fd5b806358909ebc1161010a57806358909ebc146101c65780635c975abb146101e75780635daa6539146101f9578063661346071461021c578063715018a61461022f57806379ba50971461023757600080fd5b80631b13cac2146101475780632d40d052146101635780633ed01015146101965780633f4ba83a146101ab57806349934047146101b3575b600080fd5b61015060001981565b6040519081526020015b60405180910390f35b6101866101713660046118c7565b60056020526000908152604090205460ff1681565b604051901515815260200161015a565b6101a96101a43660046118e0565b610346565b005b6101a9610440565b6101a96101c13660046118e0565b610452565b6101cf610a1181565b6040516001600160a01b03909116815260200161015a565b600154600160a01b900460ff16610186565b6101866102073660046118c7565b60046020526000908152604090205460ff1681565b61015061022a3660046118e0565b610542565b6101a961055b565b6101a961056d565b6101a961024d3660046118e0565b6105b6565b6101506106a7565b6101a96106b6565b61026a6106c6565b60405161015a9796959493929190611967565b6000546001600160a01b03166101cf565b6102be604051806040016040528060118152602001702232b632b3b0ba34b7b726b0b730b3b2b960791b81525081565b60405161015a9190611a00565b6102be604051806040016040528060018152602001603160f81b81525081565b6101a96102f9366004611a13565b61070c565b6001546001600160a01b03166101cf565b6101a961031d366004611ac9565b611072565b6102be604051806040016040528060058152602001640312e302e360dc1b81525081565b6103566040820160208301611ac9565b6001600160a01b038116331461037f5760405163b9f0f17160e01b815260040160405180910390fd5b600061038a83610542565b60008181526005602052604090205490915060ff166103bc57604051637952fbad60e11b815260040160405180910390fd5b6000818152600560209081526040909120805460ff191690556103e190840184611ac9565b6001600160a01b03166103fa6040850160208601611ac9565b6001600160a01b0316827f3feadce88fc1b49db633a56fd5307ed6ee18734df83bcc4011daa720c9cd95f1866040516104339190611c18565b60405180910390a4505050565b6104486110e3565b610450611110565b565b6104626040820160208301611ac9565b6001600160a01b038116331461048b5760405163b9f0f17160e01b815260040160405180910390fd5b600061049683610542565b60008181526005602052604090205490915060ff16156104c857604051625ecddb60e01b815260040160405180910390fd5b6000818152600560209081526040909120805460ff191660011790556104f090840184611ac9565b6001600160a01b03166105096040850160208601611ac9565b6001600160a01b0316827fea589ba9473ee1fe77d352c7ed919747715a5d22931b972de9b02a907c66d5dd866040516104339190611c18565b600061055561055083611fae565b611165565b92915050565b6105636110e3565b6104506000611200565b60015433906001600160a01b031681146105aa5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b6105b381611200565b50565b6105c66040820160208301611ac9565b6001600160a01b03811633146105ef5760405163b9f0f17160e01b815260040160405180910390fd5b60006105fa83610542565b60008181526004602052604090205490915060ff161561062d5760405163119b4fd360e11b815260040160405180910390fd5b6000818152600460209081526040909120805460ff1916600117905561065590840184611ac9565b6001600160a01b031661066e6040850160208601611ac9565b6001600160a01b0316827fb9b56ecd70a93a7fcb54a1072d6a9c7ff488f46d6c656bb0a0fa453924658704866040516104339190611c18565b60006106b1611219565b905090565b6106be6110e3565b610450611344565b6000606080600080600060606106da611387565b6106e26113b4565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6107146113e1565b600061072283850185611fba565b905080516000036107465760405163efe957cf60e01b815260040160405180910390fd5b600081516001600160401b0381111561076157610761611ce9565b60405190808252806020026020018201604052801561078a578160200160208202803683370190505b5090506107db6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600080191681526020016060815260200160008152602001606081525090565b336001600160a01b0316836000815181106107f8576107f861206a565b6020026020010151600001516001600160a01b03161415801561084d5750610a116001600160a01b0316836000815181106108355761083561206a565b6020026020010151600001516001600160a01b031614155b1561086b57604051632d618d8160e21b815260040160405180910390fd5b60005b8351811015610a98578381815181106108895761088961206a565b6020026020010151915061089c82611165565b8382815181106108ae576108ae61206a565b6020026020010181815250508160a001515160000361091d57600460008483815181106108dd576108dd61206a565b60209081029190910181015182528101919091526040016000205460ff166109185760405163a9e649e960e01b815260040160405180910390fd5b610a90565b60208201516001600160a01b0381163b6000036109c157600061098761097d6109446106a7565b8786815181106109565761095661206a565b602002602001015160405161190160f01b8152600281019290925260228201526042902090565b8560a0015161140c565b9050816001600160a01b0316816001600160a01b0316146109bb57604051638baa579f60e01b815260040160405180910390fd5b50610a8e565b60006109e06109ce6106a7565b8685815181106109565761095661206a565b60a0850151604051630b135d3f60e11b81529192506000916001600160a01b03851691631626ba7e91610a17918691600401612080565b602060405180830381865afa158015610a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5891906120a1565b6001600160e01b0319169050630b135d3f60e11b8114610a8b57604051638baa579f60e01b815260040160405180910390fd5b50505b505b60010161086e565b5060005b8351811015610c585760056000848381518110610abb57610abb61206a565b60209081029190910181015182528101919091526040016000205460ff1615610af7576040516302dd502960e11b815260040160405180910390fd5b60018451610b0591906120e1565b8114610c0e5782610b178260016120f4565b81518110610b2757610b2761206a565b6020026020010151848281518110610b4157610b4161206a565b60200260200101516040015114610b6b57604051636f6a1b8760e11b815260040160405180910390fd5b600084610b798360016120f4565b81518110610b8957610b8961206a565b6020026020010151600001519050610a116001600160a01b0316816001600160a01b031614158015610bea5750806001600160a01b0316858381518110610bd257610bd261206a565b6020026020010151602001516001600160a01b031614155b15610c0857604051632d618d8160e21b815260040160405180910390fd5b50610c50565b60001960001b848281518110610c2657610c2661206a565b60200260200101516040015114610c5057604051636f6a1b8760e11b815260040160405180910390fd5b600101610a9c565b5060005b8351811015610db8576000848281518110610c7957610c7961206a565b60200260200101516060015190506000848381518110610c9b57610c9b61206a565b602002602001015190506000868481518110610cb957610cb961206a565b602002602001015160200151905060008351905060005b81811015610da8576000858281518110610cec57610cec61206a565b6020026020010151600001519050806001600160a01b0316639751a83d878481518110610d1b57610d1b61206a565b602002602001015160200151888581518110610d3957610d3961206a565b6020026020010151604001518e8989336040518763ffffffff1660e01b8152600401610d6a96959493929190612152565b600060405180830381600087803b158015610d8457600080fd5b505af1158015610d98573d6000803e3d6000fd5b5050505050806001019050610cd0565b5050505050806001019050610c5c565b508260018451610dc891906120e1565b81518110610dd857610dd861206a565b6020026020010151602001516001600160a01b03166326f0aef7856040518263ffffffff1660e01b8152600401610e0f91906121b4565b600060405180830381600087803b158015610e2957600080fd5b505af1158015610e3d573d6000803e3d6000fd5b505084519150505b8015610fc657600084610e596001846120e1565b81518110610e6957610e6961206a565b6020026020010151606001519050600084600184610e8791906120e1565b81518110610e9757610e9761206a565b60200260200101519050600086600185610eb191906120e1565b81518110610ec157610ec161206a565b602002602001015160200151905060008351905060005b81811015610fb0576000858281518110610ef457610ef461206a565b6020026020010151600001519050806001600160a01b031663de723eeb878481518110610f2357610f2361206a565b602002602001015160200151888581518110610f4157610f4161206a565b6020026020010151604001518e8989336040518763ffffffff1660e01b8152600401610f7296959493929190612152565b600060405180830381600087803b158015610f8c57600080fd5b505af1158015610fa0573d6000803e3d6000fd5b5050505050806001019050610ed8565b505050505080610fbf906121c7565b9050610e45565b5060005b835181101561106957336001600160a01b03168460018651610fec91906120e1565b81518110610ffc57610ffc61206a565b6020026020010151602001516001600160a01b03167f40dadaa36c6c2e3d7317e24757451ffb2d603d875f0ad5e92c5dd156573b18738684815181106110445761104461206a565b602002602001015160405161105991906121de565b60405180910390a3600101610fca565b50505050505050565b61107a6110e3565b600180546001600160a01b0383166001600160a01b031990911681179091556110ab6000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000546001600160a01b031633146104505760405163118cdaa760e01b81523360048201526024016105a1565b611118611436565b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000807f88c1d2ecf185adf710588203a5f263f0ff61be0d33da39792cde19ba9aa4331e8360000151846020015185604001516111a58760600151611460565b6080808901516040805160208101989098526001600160a01b03968716908801529490931660608601529184015260a083015260c082015260e0015b60408051601f1981840301815291905280516020909101209392505050565b600180546001600160a01b03191690556105b38161152b565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561127257507f000000000000000000000000000000000000000000000000000000000000000046145b1561129c57507f000000000000000000000000000000000000000000000000000000000000000090565b6106b1604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b61134c6113e1565b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586111483390565b60606106b17f0000000000000000000000000000000000000000000000000000000000000000600261157b565b60606106b17f0000000000000000000000000000000000000000000000000000000000000000600361157b565b600154600160a01b900460ff16156104505760405163d93c066560e01b815260040160405180910390fd5b60008060008061141c8686611626565b92509250925061142c8282611673565b5090949350505050565b600154600160a01b900460ff1661045057604051638dfc202b60e01b815260040160405180910390fd5b60008082516001600160401b0381111561147c5761147c611ce9565b6040519080825280602002602001820160405280156114a5578160200160208202803683370190505b50905060005b83518110156114fb576114d68482815181106114c9576114c961206a565b6020026020010151611730565b8282815181106114e8576114e861206a565b60209081029190910101526001016114ab565b508060405160200161150d91906122cb565b60405160208183030381529060405280519060200120915050919050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606060ff83146115955761158e83611791565b9050610555565b8180546115a190612301565b80601f01602080910402602001604051908101604052809291908181526020018280546115cd90612301565b801561161a5780601f106115ef5761010080835404028352916020019161161a565b820191906000526020600020905b8154815290600101906020018083116115fd57829003601f168201915b50505050509050610555565b600080600083516041036116605760208401516040850151606086015160001a611652888285856117d0565b95509550955050505061166c565b50508151600091506002905b9250925092565b60008260038111156116875761168761233b565b03611690575050565b60018260038111156116a4576116a461233b565b036116c25760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156116d6576116d661233b565b036116f75760405163fce698f760e01b8152600481018290526024016105a1565b600382600381111561170b5761170b61233b565b0361172c576040516335e2f38360e21b8152600481018290526024016105a1565b5050565b6000807f80ad7e1b04ee6d994a125f4714ca0720908bd80ed16063ec8aee4b88e9253e2d83600001518460200151805190602001206040516020016111e1939291909283526001600160a01b03919091166020830152604082015260600190565b6060600061179e8361189f565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561180b5750600091506003905082611895565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561185f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661188b57506000925060019150829050611895565b9250600091508190505b9450945094915050565b600060ff8216601f81111561055557604051632cd44ac360e21b815260040160405180910390fd5b6000602082840312156118d957600080fd5b5035919050565b6000602082840312156118f257600080fd5b81356001600160401b0381111561190857600080fd5b820160c0818503121561191a57600080fd5b9392505050565b6000815180845260005b818110156119475760208185018101518683018201520161192b565b506000602082860101526020601f19601f83011685010191505092915050565b60ff60f81b881681526000602060e0602084015261198860e084018a611921565b838103604085015261199a818a611921565b606085018990526001600160a01b038816608086015260a0850187905284810360c08601528551808252602080880193509091019060005b818110156119ee578351835292840192918401916001016119d2565b50909c9b505050505050505050505050565b60208152600061191a6020830184611921565b600080600060408486031215611a2857600080fd5b83356001600160401b0380821115611a3f57600080fd5b818601915086601f830112611a5357600080fd5b813581811115611a6257600080fd5b876020828501011115611a7457600080fd5b602092830195509350908501359080821115611a8f57600080fd5b50840160608187031215611aa257600080fd5b809150509250925092565b80356001600160a01b0381168114611ac457600080fd5b919050565b600060208284031215611adb57600080fd5b61191a82611aad565b6000808335601e19843603018112611afb57600080fd5b83016020810192503590506001600160401b03811115611b1a57600080fd5b803603821315611b2957600080fd5b9250929050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b88811015611c0a57858403601f19018a52823536899003605e19018112611b98578283fd5b880160606001600160a01b03611bad83611aad565b168652611bbc87830183611ae4565b8289890152611bce8389018284611b30565b925050506040611be081840184611ae4565b935087830382890152611bf4838583611b30565b9d89019d97505050938601935050600101611b73565b509198975050505050505050565b6020815260006001600160a01b0380611c3085611aad565b16602084015280611c4360208601611aad565b16604084015250604083013560608301526060830135601e19843603018112611c6b57600080fd5b83016020810190356001600160401b03811115611c8757600080fd5b8060051b3603821315611c9957600080fd5b60c06080850152611cae60e085018284611b59565b915050608084013560a0840152611cc860a0850185611ae4565b848303601f190160c0860152611cdf838284611b30565b9695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715611d2157611d21611ce9565b60405290565b60405160c081016001600160401b0381118282101715611d2157611d21611ce9565b604051601f8201601f191681016001600160401b0381118282101715611d7157611d71611ce9565b604052919050565b60006001600160401b03821115611d9257611d92611ce9565b5060051b60200190565b600082601f830112611dad57600080fd5b81356001600160401b03811115611dc657611dc6611ce9565b611dd9601f8201601f1916602001611d49565b818152846020838601011115611dee57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f830112611e1c57600080fd5b81356020611e31611e2c83611d79565b611d49565b82815260059290921b84018101918181019086841115611e5057600080fd5b8286015b84811015611eff5780356001600160401b0380821115611e745760008081fd5b908801906060828b03601f1901811315611e8e5760008081fd5b611e96611cff565b611ea1888501611aad565b815260408085013584811115611eb75760008081fd5b611ec58e8b83890101611d9c565b838b015250918401359183831115611edd5760008081fd5b611eeb8d8a85880101611d9c565b908201528652505050918301918301611e54565b509695505050505050565b600060c08284031215611f1c57600080fd5b611f24611d27565b9050611f2f82611aad565b8152611f3d60208301611aad565b60208201526040820135604082015260608201356001600160401b0380821115611f6657600080fd5b611f7285838601611e0b565b60608401526080840135608084015260a0840135915080821115611f9557600080fd5b50611fa284828501611d9c565b60a08301525092915050565b60006105553683611f0a565b60006020808385031215611fcd57600080fd5b82356001600160401b0380821115611fe457600080fd5b818501915085601f830112611ff857600080fd5b8135612006611e2c82611d79565b81815260059190911b8301840190848101908883111561202557600080fd5b8585015b8381101561205d578035858111156120415760008081fd5b61204f8b89838a0101611f0a565b845250918601918601612029565b5098975050505050505050565b634e487b7160e01b600052603260045260246000fd5b8281526040602082015260006120996040830184611921565b949350505050565b6000602082840312156120b357600080fd5b81516001600160e01b03198116811461191a57600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610555576105556120cb565b80820180821115610555576105556120cb565b6001600160a01b0361211882611aad565b1682526020810135602083015260006121346040830183611ae4565b60606040860152612149606086018284611b30565b95945050505050565b60c08152600061216560c0830189611921565b82810360208401526121778189611921565b9050828103604084015261218b8188612107565b606084019690965250506001600160a01b039283166080820152911660a0909101529392505050565b60208152600061191a6020830184612107565b6000816121d6576121d66120cb565b506000190190565b602080825282516001600160a01b0390811683830152838201518116604080850191909152808501516060808601919091528086015160c06080870152805160e0870181905260009594610100600583901b8901810195919493870193919290890190885b8181101561229d5760ff198b8903018352855187815116895289810151858b8b0152612271868b0182611921565b918701518a83038b8901529190506122898183611921565b995050509488019491880191600101612243565b50505050505050608085015160a085015260a08501519150601f198482030160c08501526121498183611921565b815160009082906020808601845b838110156122f5578151855293820193908201906001016122d9565b50929695505050505050565b600181811c9082168061231557607f821691505b60208210810361233557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052602160045260246000fdfea26469706673582212206702181458ece90d9cf27649387478caa2ed36ffd86ba70b239c4be34106280764736f6c634300081700338b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "nonce": "0x0", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8972f6398b77eb12b7e6139b223f72eb1a620fbb5f897f8534c2b3ab2882c3dd", + "transactionType": "CREATE2", + "contractName": "MultiSigDeleGator", + "contractAddress": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "function": null, + "arguments": [ + "0xbe4138886cB096bDC1B930F2f0ca7892AA234D78", + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x47ca99", + "value": "0x0", + "input": "0x44656c654761746f72000000000000000000000000000000000000000000000060e0604052306080523480156200001557600080fd5b506040516200396338038062003963833981016040819052620000389162000208565b8181620000446200013e565b6001600160a01b0380831660a081905290821660c0526040517fb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d90600090a26040516001600160a01b038216907fee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a9990600090a250506000197fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c0281905560408051918252517fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c00917f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d03919081900360200190a150505062000247565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156200018f5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001ef5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b0381168114620001ef57600080fd5b600080604083850312156200021c57600080fd5b82516200022981620001f2565b60208401519092506200023c81620001f2565b809150509250929050565b60805160a05160c0516136216200034260003960008181610633015281816108a001528181610b0001528181610bbb01528181610c3c01528181610cba01528181610e1f01528181610ed401528181610f5b015281816110b9015281816111f9015281816112ac0152818161131e0152818161138901528181611521015281816115b4015281816115f6015281816116ec015281816117ca015281816119e0015261240a01526000818161077201528181610b6601528181610d1d01528181610da001528181610e8201528181611130015281816113ec015261174f015260008181611b8201528181611bab015261211901526136216000f3fe60806040526004361061024a5760003560e01c80637df73e2711610139578063bc197c81116100b6578063e3d9109f1161007a578063e3d9109f1461070c578063e75235b81461072c578063ea4d3c9b14610760578063eb12d61e14610794578063f23a6e61146107b4578063ffa1ad74146107d457600080fd5b8063bc197c8114610682578063c399ec88146106a2578063d087d288146106b7578063d7d7442f146106cc578063e1520f54146106ec57600080fd5b8063a24c8f32116100fd578063a24c8f32146105a3578063aaf10f42146105b6578063ad3cb1cc146105e3578063b0d691fe14610621578063b3c650151461065557600080fd5b80637df73e27146104d95780637f07bfdc1461051f5780637fade2871461053f57806394cf795e1461055f578063a0c1deb41461058157600080fd5b80634891161f116101c75780635c1c6dcd1161018b5780635c1c6dcd1461043957806360b5bb3f1461045957806365ee81d8146104795780636af1f3991461049957806378979a80146104b957600080fd5b80634891161f146103d457806349934047146103e95780634a58db19146104095780634f1ef2861461041157806352d1902d1461042457600080fd5b806326f0aef71161020e57806326f0aef71461033457806334fcd5be146103545780633e1b0812146103745780633ed0101514610394578063445140b8146103b457600080fd5b806301ffc9a7146102565780630e316ab71461028b578063150b7a02146102ad5780631626ba7e146102e657806319822f7c1461030657600080fd5b3661025157005b600080fd5b34801561026257600080fd5b506102766102713660046128f4565b610805565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102ab6102a6366004612933565b610895565b005b3480156102b957600080fd5b506102cd6102c8366004612a05565b610ab9565b6040516001600160e01b03199091168152602001610282565b3480156102f257600080fd5b506102cd610301366004612ab8565b610ad4565b34801561031257600080fd5b50610326610321366004612b03565b610af3565b604051908152602001610282565b34801561034057600080fd5b506102ab61034f366004612b6e565b610b5b565b34801561036057600080fd5b506102ab61036f366004612bee565b610bb0565b34801561038057600080fd5b5061032661038f366004612c2f565b610c15565b3480156103a057600080fd5b506102ab6103af366004612c58565b610caf565b3480156103c057600080fd5b506102766103cf366004612c92565b610d87565b3480156103e057600080fd5b50610326601e81565b3480156103f557600080fd5b506102ab610404366004612c58565b610e14565b6102ab610eb7565b6102ab61041f366004612cab565b610f21565b34801561043057600080fd5b50610326610f33565b34801561044557600080fd5b506102ab610454366004612b6e565b610f50565b34801561046557600080fd5b506102ab610474366004612cfa565b610f99565b34801561048557600080fd5b506102ab610494366004612d53565b6110ae565b3480156104a557600080fd5b506102766104b4366004612c92565b611117565b3480156104c557600080fd5b506102ab6104d4366004612db1565b611167565b3480156104e557600080fd5b506102766104f4366004612933565b6001600160a01b031660009081526000805160206135ac833981519152602052604090205460ff1690565b34801561052b57600080fd5b506102ab61053a366004612e2d565b6112a1565b34801561054b57600080fd5b506102ab61055a366004612c58565b61137e565b34801561056b57600080fd5b50610574611421565b6040516102829190612e59565b34801561058d57600080fd5b5060008051602061358c83398151915254610326565b6102ab6105b1366004612cab565b610f29565b3480156105c257600080fd5b506105cb611494565b6040516001600160a01b039091168152602001610282565b3480156105ef57600080fd5b50610614604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102829190612ef6565b34801561062d57600080fd5b506105cb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561066157600080fd5b5061066a6114ba565b6040516001600160401b039091168152602001610282565b34801561068e57600080fd5b506102cd61069d366004612f88565b6114ed565b3480156106ae57600080fd5b50610326611509565b3480156106c357600080fd5b50610326611595565b3480156106d857600080fd5b506102ab6106e7366004612c92565b6115eb565b3480156106f857600080fd5b506102ab610707366004613035565b6116e1565b34801561071857600080fd5b506102ab61072736600461309d565b6117bf565b34801561073857600080fd5b507fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c0254610326565b34801561076c57600080fd5b506105cb7f000000000000000000000000000000000000000000000000000000000000000081565b3480156107a057600080fd5b506102ab6107af366004612933565b6119d5565b3480156107c057600080fd5b506102cd6107cf3660046130d6565b611b5b565b3480156107e057600080fd5b50610614604051806040016040528060058152602001640312e302e360dc1b81525081565b600061080f611b77565b6001600160e01b031982166326f0aef760e01b148061083e57506001600160e01b03198216630a85bd0160e11b145b8061085957506001600160e01b03198216630271189760e51b145b8061087457506001600160e01b031982166301ffc9a760e01b145b8061088f57506001600160e01b03198216630b135d3f60e11b145b92915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906108ce5750333014155b156108ec57604051630796d94560e01b815260040160405180910390fd5b6001600160a01b03811660009081526000805160206135ac833981519152602081905260409091205460ff166109355760405163da0357f760e01b815260040160405180910390fd5b60018101546002820154810361095e576040516361774dcf60e11b815260040160405180910390fd5b60005b61096c600183613154565b811015610a3657836001600160a01b031683600101828154811061099257610992613167565b6000918252602090912001546001600160a01b031603610a2e57826001016001836109bd9190613154565b815481106109cd576109cd613167565b6000918252602090912001546001840180546001600160a01b0390921691839081106109fb576109fb613167565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610a36565b600101610961565b5081600101805480610a4a57610a4a61317d565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038516808352908490526040808320805460ff191690555190917fb0073c14ccc2332b5b461c0d2fb94366f38d3954a82745e74827aa0811c9f98191a2505050565b6000610ac3611b77565b50630a85bd0160e11b949350505050565b6000610ade611b77565b610ae9848484611c1e565b90505b9392505050565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b3e57604051636b31ba1560e11b815260040160405180910390fd5b610b46611b77565b610b508484611dbd565b9050610aec82611e33565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ba457604051630692ce8160e21b815260040160405180910390fd5b610bad81611eca565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610be95750333014155b15610c0757604051630796d94560e01b815260040160405180910390fd5b610c118282611fd4565b5050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610c8b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088f9190613193565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610ce85750333014155b15610d0657604051630796d94560e01b815260040160405180910390fd5b604051633ed0101560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633ed0101590610d529084906004016132db565b600060405180830381600087803b158015610d6c57600080fd5b505af1158015610d80573d6000803e3d6000fd5b5050505050565b6040516316a0682960e11b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632d40d052906024015b602060405180830381865afa158015610df0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088f91906133b6565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610e4d5750333014155b15610e6b57604051630796d94560e01b815260040160405180910390fd5b604051634993404760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634993404790610d529084906004016132db565b610ebf611b77565b60405163b760faf960e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b158015610d6c57600080fd5b610f29612036565b610c1182826120f3565b6000610f3d61210e565b506000805160206135cc83398151915290565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ba457604051636b31ba1560e11b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610fde5750825b90506000826001600160401b03166001148015610ffa5750303b155b905081158015611008575080155b156110265760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561105057845460ff60401b1916600160401b1785555b61105d8888886000612157565b83156110a457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2906020015b60405180910390a15b5050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110e75750333014155b1561110557604051630796d94560e01b815260040160405180910390fd5b61111184848484612157565b50505050565b604051635daa653960e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635daa653990602401610dd3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054869190600160401b900460ff16806111af575080546001600160401b03808416911610155b156111cd5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906112275750333014155b1561124557604051630796d94560e01b815260040160405180910390fd5b61125186868686612157565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906112da5750333014155b156112f857604051630796d94560e01b815260040160405180910390fd5b60405163040b850f60e31b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561136257600080fd5b505af1158015611376573d6000803e3d6000fd5b505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906113b75750333014155b156113d557604051630796d94560e01b815260040160405180910390fd5b604051637fade28760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637fade28790610d529084906004016132db565b606060006000805160206135ac8339815191526001810180546040805160208084028201810190925282815293945083018282801561148957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161146b575b505050505091505090565b60006114b56000805160206135cc833981519152546001600160a01b031690565b905090565b60006114b57ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00546001600160401b031690565b60006114f7611b77565b5063bc197c8160e01b95945050505050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a08231906024015b602060405180830381865afa158015611571573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b59190613193565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401611554565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906116245750333014155b1561164257604051630796d94560e01b815260040160405180910390fd5b806000036116635760405163aabd5a0960e01b815260040160405180910390fd5b60008051602061358c833981519152546000805160206135ac833981519152908211156116a35760405163aabd5a0960e01b815260040160405180910390fd5b600281018290556040518281527f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d039060200160405180910390a15050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480159061171a5750333014155b1561173857604051630796d94560e01b815260040160405180910390fd5b60405163385483d560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e1520f5490611788908690869086906004016133d3565b600060405180830381600087803b1580156117a257600080fd5b505af11580156117b6573d6000803e3d6000fd5b50505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906117f85750333014155b1561181657604051630796d94560e01b815260040160405180910390fd5b6001600160a01b038116158061183557506001600160a01b0381163b15155b1561185357604051634501a91960e01b815260040160405180910390fd5b6001600160a01b03821660009081526000805160206135ac833981519152602081905260409091205460ff1661189c5760405163da0357f760e01b815260040160405180910390fd5b6001600160a01b03821660009081526020829052604090205460ff16156118d657604051631985f4ab60e31b815260040160405180910390fd5b600181015460005b8181101561197057846001600160a01b031683600101828154811061190557611905613167565b6000918252602090912001546001600160a01b031603611968578383600101828154811061193557611935613167565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550611970565b6001016118de565b506001600160a01b03808516600081815260208590526040808220805460ff199081169091559387168083528183208054909516600117909455517f53a7b6f060162826746b07f3ff5cc66b83afad3bc9a57c9f34d7802901c6e8299190a350505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590611a0e5750333014155b15611a2c57604051630796d94560e01b815260040160405180910390fd5b6001600160a01b0381161580611a4b57506001600160a01b0381163b15155b15611a6957604051634501a91960e01b815260040160405180910390fd5b60008051602061358c833981519152546000805160206135ac83398151915290601d1901611aaa57604051630dc92ed360e11b815260040160405180910390fd5b6001600160a01b03821660009081526020829052604090205460ff1615611ae457604051631985f4ab60e31b815260040160405180910390fd5b6001818101805480830182556000918252602080832090910180546001600160a01b0319166001600160a01b038716908117909155808352908490526040808320805460ff191690941790935591517f82b74755d483f0688b80354268454667c377a5684e64a4dbb6820fc11a6276d49190a25050565b6000611b65611b77565b5063f23a6e6160e01b95945050505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611bfe57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611bf26000805160206135cc833981519152546001600160a01b031690565b6001600160a01b031614155b15611c1c5760405163703e46dd60e11b815260040160405180910390fd5b565b7fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c02546000906000805160206135ac83398151915290611c5f9060419061343d565b8314611c7657506001600160e01b03199050610aec565b6000611c83604185613454565b600283015490915060008080805b85811015611da55760008a8a611ca860418561343d565b906041611cb6866001613476565b611cc0919061343d565b92611ccd93929190613489565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929350611d1192508e91508390506123d5565b9350846001600160a01b0316846001600160a01b0316111580611d4d57506001600160a01b03841660009081526020899052604090205460ff16155b15611d6b57506001600160e01b03199750610aec9650505050505050565b82611d75816134b3565b935050858310611d975750630b135d3f60e11b9750610aec9650505050505050565b509192508291600101611c91565b506001600160e01b03199a9950505050505050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c829052603c81208190611e0590611e006101008701876134cc565b611c1e565b90506374eca2c160e11b6001600160e01b0319821601611e2957600091505061088f565b5060019392505050565b8015610bad57604051600090339060001990849084818181858888f193505050503d8060008114611e80576040519150601f19603f3d011682016040523d82523d6000602084013e611e85565b606091505b505060408051848152821515602082015291925033917fa427c7d47f24d01b170779a7600b1d4c0d7cdbabaa0f19c4f0e6182053ffc931910160405180910390a25050565b600080611eda6020840184612933565b6001600160a01b03166020840135611ef560408601866134cc565b604051611f03929190613512565b60006040518083038185875af1925050503d8060008114611f40576040519150601f19603f3d011682016040523d82523d6000602084013e611f45565b606091505b509092509050611f586020840184612933565b6001600160a01b03167f74b56487625d598ffbf59a76c3b58fc1922f54afc86a075bad0c2a8aa05d2ad284602001358484604051611f9893929190613522565b60405180910390a281611fcf578051600003611fc75760405163764bbf1760e01b815260040160405180910390fd5b805181602001fd5b505050565b806000819003611ff757604051635fc74f2160e11b815260040160405180910390fd5b60005b818110156111115761202e84848381811061201757612017613167565b90506020028101906120299190613543565b611eca565b600101611ffa565b60008051602061358c833981519152546000805160206135ac8339815191529060005b818110156120b05782600001600084600101838154811061207c5761207c613167565b60009182526020808320909101546001600160a01b031683528201929092526040019020805460ff19169055600101612059565b506120bf6001830160006128c2565b6000600283018190556040517feb09d532980c3cc73dcad99b80e264204a667a54cbb7b63ec8d68dcb1c7096be9190a15050565b6120fb611b77565b612104826123ff565b610c118282612456565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c1c5760405163703e46dd60e11b815260040160405180910390fd5b60008051602061358c8339815191525483906000805160206135ac8339815191529060008461218f5761218a8285613476565b612191565b835b905085158061219f57508086115b156121bd5760405163aabd5a0960e01b815260040160405180910390fd5b601e8111156121df57604051630dc92ed360e11b815260040160405180910390fd5b84156122735760005b8281101561226457600084600101828154811061220757612207613167565b60009182526020808320909101546001600160a01b0316808352908790526040808320805460ff191690555190925082917fb0073c14ccc2332b5b461c0d2fb94366f38d3954a82745e74827aa0811c9f98191a2506001016121e8565b506122736001840160006128c2565b60005b8481101561239d57600089898381811061229257612292613167565b90506020020160208101906122a79190612933565b6001600160a01b03811660009081526020879052604090205490915060ff16156122e457604051631985f4ab60e31b815260040160405180910390fd5b6001600160a01b038116158061230357506001600160a01b0381163b15155b1561232157604051634501a91960e01b815260040160405180910390fd5b6001858101805480830182556000918252602080832090910180546001600160a01b0319166001600160a01b038616908117909155808352908890526040808320805460ff191690941790935591517f82b74755d483f0688b80354268454667c377a5684e64a4dbb6820fc11a6276d49190a250600101612276565b50600283018690556040518681527f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d039060200161109b565b6000806000806123e58686612518565b9250925092506123f58282612565565b5090949350505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906124385750333014155b15610bad57604051630796d94560e01b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156124b0575060408051601f3d908101601f191682019092526124ad91810190613193565b60015b6124dd57604051634c9c8ce360e01b81526001600160a01b03831660048201526024015b60405180910390fd5b6000805160206135cc833981519152811461250e57604051632a87526960e21b8152600481018290526024016124d4565b611fcf838361261e565b600080600083516041036125525760208401516040850151606086015160001a61254488828585612674565b95509550955050505061255e565b50508151600091506002905b9250925092565b600082600381111561257957612579613563565b03612582575050565b600182600381111561259657612596613563565b036125b45760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156125c8576125c8613563565b036125e95760405163fce698f760e01b8152600481018290526024016124d4565b60038260038111156125fd576125fd613563565b03610c11576040516335e2f38360e21b8152600481018290526024016124d4565b61262782612743565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561266c57611fcf82826127a8565b610c1161281e565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156126af5750600091506003905082612739565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612703573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661272f57506000925060019150829050612739565b9250600091508190505b9450945094915050565b806001600160a01b03163b60000361277957604051634c9c8ce360e01b81526001600160a01b03821660048201526024016124d4565b6000805160206135cc83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516127c59190613579565b600060405180830381855af49150503d8060008114612800576040519150601f19603f3d011682016040523d82523d6000602084013e612805565b606091505b509150915061281585838361283d565b95945050505050565b3415611c1c5760405163b398979f60e01b815260040160405180910390fd5b6060826128525761284d82612899565b610aec565b815115801561286957506001600160a01b0384163b155b1561289257604051639996b31560e01b81526001600160a01b03851660048201526024016124d4565b5080610aec565b8051156128a95780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825590600052602060002090810190610bad91905b808211156128f057600081556001016128dc565b5090565b60006020828403121561290657600080fd5b81356001600160e01b031981168114610aec57600080fd5b6001600160a01b0381168114610bad57600080fd5b60006020828403121561294557600080fd5b8135610aec8161291e565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561298e5761298e612950565b604052919050565b600082601f8301126129a757600080fd5b81356001600160401b038111156129c0576129c0612950565b6129d3601f8201601f1916602001612966565b8181528460208386010111156129e857600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215612a1b57600080fd5b8435612a268161291e565b93506020850135612a368161291e565b92506040850135915060608501356001600160401b03811115612a5857600080fd5b612a6487828801612996565b91505092959194509250565b60008083601f840112612a8257600080fd5b5081356001600160401b03811115612a9957600080fd5b602083019150836020828501011115612ab157600080fd5b9250929050565b600080600060408486031215612acd57600080fd5b8335925060208401356001600160401b03811115612aea57600080fd5b612af686828701612a70565b9497909650939450505050565b600080600060608486031215612b1857600080fd5b83356001600160401b03811115612b2e57600080fd5b84016101208187031215612b4157600080fd5b95602085013595506040909401359392505050565b600060608284031215612b6857600080fd5b50919050565b600060208284031215612b8057600080fd5b81356001600160401b03811115612b9657600080fd5b612ba284828501612b56565b949350505050565b60008083601f840112612bbc57600080fd5b5081356001600160401b03811115612bd357600080fd5b6020830191508360208260051b8501011115612ab157600080fd5b60008060208385031215612c0157600080fd5b82356001600160401b03811115612c1757600080fd5b612c2385828601612baa565b90969095509350505050565b600060208284031215612c4157600080fd5b81356001600160c01b0381168114610aec57600080fd5b600060208284031215612c6a57600080fd5b81356001600160401b03811115612c8057600080fd5b820160c08185031215610aec57600080fd5b600060208284031215612ca457600080fd5b5035919050565b60008060408385031215612cbe57600080fd5b8235612cc98161291e565b915060208301356001600160401b03811115612ce457600080fd5b612cf085828601612996565b9150509250929050565b600080600060408486031215612d0f57600080fd5b83356001600160401b03811115612d2557600080fd5b612d3186828701612baa565b909790965060209590950135949350505050565b8015158114610bad57600080fd5b60008060008060608587031215612d6957600080fd5b84356001600160401b03811115612d7f57600080fd5b612d8b87828801612baa565b909550935050602085013591506040850135612da681612d45565b939692955090935050565b600080600080600060808688031215612dc957600080fd5b85356001600160401b038082168214612de157600080fd5b90955060208701359080821115612df757600080fd5b50612e0488828901612baa565b909550935050604086013591506060860135612e1f81612d45565b809150509295509295909350565b60008060408385031215612e4057600080fd5b8235612e4b8161291e565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b81811015612e9a5783516001600160a01b031683529284019291840191600101612e75565b50909695505050505050565b60005b83811015612ec1578181015183820152602001612ea9565b50506000910152565b60008151808452612ee2816020860160208601612ea6565b601f01601f19169290920160200192915050565b602081526000610aec6020830184612eca565b600082601f830112612f1a57600080fd5b813560206001600160401b03821115612f3557612f35612950565b8160051b612f44828201612966565b9283528481018201928281019087851115612f5e57600080fd5b83870192505b84831015612f7d57823582529183019190830190612f64565b979650505050505050565b600080600080600060a08688031215612fa057600080fd5b8535612fab8161291e565b94506020860135612fbb8161291e565b935060408601356001600160401b0380821115612fd757600080fd5b612fe389838a01612f09565b94506060880135915080821115612ff957600080fd5b61300589838a01612f09565b9350608088013591508082111561301b57600080fd5b5061302888828901612996565b9150509295509295909350565b60008060006040848603121561304a57600080fd5b83356001600160401b038082111561306157600080fd5b61306d87838801612a70565b9095509350602086013591508082111561308657600080fd5b5061309386828701612b56565b9150509250925092565b600080604083850312156130b057600080fd5b82356130bb8161291e565b915060208301356130cb8161291e565b809150509250929050565b600080600080600060a086880312156130ee57600080fd5b85356130f98161291e565b945060208601356131098161291e565b9350604086013592506060860135915060808601356001600160401b0381111561313257600080fd5b61302888828901612996565b634e487b7160e01b600052601160045260246000fd5b8181038181111561088f5761088f61313e565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6000602082840312156131a557600080fd5b5051919050565b6000808335601e198436030181126131c357600080fd5b83016020810192503590506001600160401b038111156131e257600080fd5b803603821315612ab157600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b888110156132cd57858403601f19018a52823536899003605e19018112613259578283fd5b8801606081356132688161291e565b6001600160a01b0316865261327f828801836131ac565b828989015261329183890182846131f1565b9250505060406132a3818401846131ac565b9350878303828901526132b78385836131f1565b9d89019d97505050938601935050600101613234565b509198975050505050505050565b60208152600082356132ec8161291e565b6001600160a01b039081166020848101919091528401359061330d8261291e565b80821660408501525050604083013560608301526060830135601e1984360301811261333857600080fd5b83016020810190356001600160401b0381111561335457600080fd5b8060051b360382131561336657600080fd5b60c0608085015261337b60e08501828461321a565b915050608084013560a084015261339560a08501856131ac565b848303601f190160c08601526133ac8382846131f1565b9695505050505050565b6000602082840312156133c857600080fd5b8151610aec81612d45565b6040815260006133e76040830185876131f1565b828103602084015283356133fa8161291e565b6001600160a01b031681526020848101359082015261341c60408501856131ac565b606060408401526134316060840182846131f1565b98975050505050505050565b808202811582820484141761088f5761088f61313e565b60008261347157634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561088f5761088f61313e565b6000808585111561349957600080fd5b838611156134a657600080fd5b5050820193919092039150565b6000600182016134c5576134c561313e565b5060010190565b6000808335601e198436030181126134e357600080fd5b8301803591506001600160401b038211156134fd57600080fd5b602001915036819003821315612ab157600080fd5b8183823760009101908152919050565b83815282151560208201526060604082015260006128156060830184612eca565b60008235605e1983360301811261355957600080fd5b9190910192915050565b634e487b7160e01b600052602160045260246000fd5b60008251613559818460208701612ea656feb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c01b005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212207f3a1345dd207b3e6a7d8045651ded34698ad5d76b8ff402fdacf6337782f2f664736f6c63430008170033000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d780000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x1", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xd5220582e356158edb6a05d6fef319e0d99e8e7a736c4d6bab2aed89360e82a0", + "transactionType": "CREATE2", + "contractName": "HybridDeleGator", + "contractAddress": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "function": null, + "arguments": [ + "0xbe4138886cB096bDC1B930F2f0ca7892AA234D78", + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x663eaa", + "value": "0x0", + "input": "0x44656c654761746f72000000000000000000000000000000000000000000000060e0604052306080523480156200001557600080fd5b50604051620051483803806200514883398101604081905262000038916200018b565b818162000044620000c1565b6001600160a01b0380831660a081905290821660c0526040517fb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d90600090a26040516001600160a01b038216907fee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a9990600090a250505050620001ca565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620001125760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001725780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b03811681146200017257600080fd5b600080604083850312156200019f57600080fd5b8251620001ac8162000175565b6020840151909250620001bf8162000175565b809150509250929050565b60805160a05160c051614e83620002c5600039600081816105e9015281816107f3015281816108a1015281816109c501528181610a4601528181610ac401528181610c2901528181610cde01528181610d6501528181610dfe01528181610eea01528181610fa50152818161101701528181611082015281816112c401528181611343015281816113c00152818161147f015281816116c4015281816117b501526124480152600081816107290152818161090701528181610b2701528181610baa01528181610c8c01528181610dbc015281816110e50152611727015260008181611a9b01528181611ac401526120b50152614e836000f3fe60806040526004361061023f5760003560e01c80637f07bfdc1161012e578063c399ec88116100ab578063e1520f541161006f578063e1520f54146106f7578063ea4d3c9b14610717578063f23a6e611461074b578063f2fde38b1461076b578063ffa1ad741461078b57600080fd5b8063c399ec8814610658578063c8561e731461066d578063d087d2881461068d578063d37aec92146106a2578063d5d33b55146106d757600080fd5b8063aaf10f42116100f2578063aaf10f4214610584578063ad3cb1cc14610599578063b0d691fe146105d7578063b3c650151461060b578063bc197c811461063857600080fd5b80637f07bfdc146104d25780637fade287146104f25780638da5cb5b146105125780638ebf953314610551578063a24c8f321461057157600080fd5b80633ed01015116101bc57806352d1902d1161018057806352d1902d146104485780635c1c6dcd1461045d5780636af1f3991461047d578063715018a61461049d57806378a68ecf146104b257600080fd5b80633ed01015146103cd578063445140b8146103ed578063499340471461040d5780634a58db191461042d5780634f1ef2861461043557600080fd5b80631c03010a116102035780631c03010a1461032957806326f0aef71461034b5780632ffeaad61461036b57806334fcd5be1461038d5780633e1b0812146103ad57600080fd5b806301ffc9a71461024b578063074feff314610280578063150b7a02146102a25780631626ba7e146102db57806319822f7c146102fb57600080fd5b3661024657005b600080fd5b34801561025757600080fd5b5061026b610266366004613e92565b6107bc565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102a061029b366004613f27565b6107e8565b005b3480156102ae57600080fd5b506102c26102bd366004614096565b610859565b6040516001600160e01b03199091168152602001610277565b3480156102e757600080fd5b506102c26102f6366004614142565b610875565b34801561030757600080fd5b5061031b61031636600461418d565b610894565b604051908152602001610277565b34801561033557600080fd5b50600080516020614dae8339815191525461031b565b34801561035757600080fd5b506102a06103663660046141f8565b6108fc565b34801561037757600080fd5b50610380610951565b604051610277919061422c565b34801561039957600080fd5b506102a06103a8366004614264565b6109ba565b3480156103b957600080fd5b5061031b6103c83660046142a5565b610a1f565b3480156103d957600080fd5b506102a06103e83660046142ce565b610ab9565b3480156103f957600080fd5b5061026b610408366004614308565b610b91565b34801561041957600080fd5b506102a06104283660046142ce565b610c1e565b6102a0610cc1565b6102a0610443366004614321565b610d2b565b34801561045457600080fd5b5061031b610d3d565b34801561046957600080fd5b506102a06104783660046141f8565b610d5a565b34801561048957600080fd5b5061026b610498366004614308565b610da3565b3480156104a957600080fd5b506102a0610df3565b3480156104be57600080fd5b506102a06104cd366004614389565b610e56565b3480156104de57600080fd5b506102a06104ed36600461445b565b610f9a565b3480156104fe57600080fd5b506102a061050d3660046142ce565b611077565b34801561051e57600080fd5b50600080516020614d8e833981519152546001600160a01b03165b6040516001600160a01b039091168152602001610277565b34801561055d57600080fd5b506102a061056c366004613f27565b61111a565b6102a061057f366004614321565b610d33565b34801561059057600080fd5b50610539611236565b3480156105a557600080fd5b506105ca604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161027791906144d7565b3480156105e357600080fd5b506105397f000000000000000000000000000000000000000000000000000000000000000081565b34801561061757600080fd5b5061062061125c565b6040516001600160401b039091168152602001610277565b34801561064457600080fd5b506102c2610653366004614569565b61128f565b34801561066457600080fd5b5061031b6112ac565b34801561067957600080fd5b506102a0610688366004614616565b611338565b34801561069957600080fd5b5061031b6113a1565b3480156106ae57600080fd5b506106c26106bd366004614666565b6113f7565b60408051928352602083019190915201610277565b3480156106e357600080fd5b506102a06106f2366004614666565b611474565b34801561070357600080fd5b506102a061071236600461469b565b6116b9565b34801561072357600080fd5b506105397f000000000000000000000000000000000000000000000000000000000000000081565b34801561075757600080fd5b506102c2610766366004614703565b61178e565b34801561077757600080fd5b506102a061078636600461476b565b6117aa565b34801561079757600080fd5b506105ca604051806040016040528060058152602001640312e302e360dc1b81525081565b60006107c78261180a565b806107e257506001600160e01b031982166307f5828d60e41b145b92915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906108215750333014155b1561083f57604051630796d94560e01b815260040160405180910390fd5b61085087878787878787600161189a565b50505050505050565b6000610863611a90565b50630a85bd0160e11b5b949350505050565b600061087f611a90565b61088a848484611b35565b90505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108df57604051636b31ba1560e11b815260040160405180910390fd5b6108e7611a90565b6108f18484611d59565b905061088d82611dcf565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094557604051630692ce8160e21b815260040160405180910390fd5b61094e81611e66565b50565b60606000600080516020614d8e833981519152600281018054604080516020808402820181019092528281529394508301828280156109af57602002820191906000526020600020905b81548152602001906001019080831161099b575b505050505091505090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906109f35750333014155b15610a1157604051630796d94560e01b815260040160405180910390fd5b610a1b8282611f70565b5050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610a95573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e29190614788565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610af25750333014155b15610b1057604051630796d94560e01b815260040160405180910390fd5b604051633ed0101560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633ed0101590610b5c9084906004016148d0565b600060405180830381600087803b158015610b7657600080fd5b505af1158015610b8a573d6000803e3d6000fd5b5050505050565b6040516316a0682960e11b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632d40d052906024015b602060405180830381865afa158015610bfa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e291906149ac565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610c575750333014155b15610c7557604051630796d94560e01b815260040160405180910390fd5b604051634993404760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634993404790610b5c9084906004016148d0565b610cc9611a90565b60405163b760faf960e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b158015610b7657600080fd5b610d33611fd2565b610a1b828261208f565b6000610d476120aa565b50600080516020614dee83398151915290565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094557604051636b31ba1560e11b815260040160405180910390fd5b604051635daa653960e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635daa653990602401610bdd565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610e2c5750333014155b15610e4a57604051630796d94560e01b815260040160405180910390fd5b610e5460006120f3565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460ff8b81169291600160401b90041680610ea0575080546001600160401b03808416911610155b15610ebe5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610f185750333014155b15610f3657604051630796d94560e01b815260040160405180910390fd5b610f468a8a8a8a8a8a8a8a61189a565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15050505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610fd35750333014155b15610ff157604051630796d94560e01b815260040160405180910390fd5b60405163040b850f60e31b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561105b57600080fd5b505af115801561106f573d6000803e3d6000fd5b505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110b05750333014155b156110ce57604051630796d94560e01b815260040160405180910390fd5b604051637fade28760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637fade28790610b5c9084906004016148d0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b031660008115801561115f5750825b90506000826001600160401b0316600114801561117b5750303b155b905081158015611189575080155b156111a75760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156111d157845460ff60401b1916600160401b1785555b6111e28c8c8c8c8c8c8c600061189a565b831561122857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b6000611257600080516020614dee833981519152546001600160a01b031690565b905090565b60006112577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00546001600160401b031690565b6000611299611a90565b5063bc197c8160e01b5b95945050505050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a08231906024015b602060405180830381865afa158015611314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112579190614788565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906113715750333014155b1561138f57604051630796d94560e01b815260040160405180910390fd5b61139b84848484612195565b50505050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a906044016112f7565b60008080600080516020614d8e8339815191529050600081600101600087876040516020016114279291906149c9565b60408051601f198184030181529181528151602092830120835282820193909352908201600020825180840190935280548084526001909101549290910182905297909650945050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906114ad5750333014155b156114cb57604051630796d94560e01b815260040160405180910390fd5b604051600080516020614d8e833981519152906000906114f190859085906020016149c9565b60408051601f19818403018152828252805160209182012060008181526001808801845290849020858501909452835480865293015491840182905293508115801561153b575080155b1561156157604051631a36430d60e31b8152600481018590526024015b60405180910390fd5b600285015460018114801561157e575085546001600160a01b0316155b1561159c5760405163c4c8547360e01b815260040160405180910390fd5b60005b6115aa6001836149ef565b81101561162f57858760020182815481106115c7576115c7614a02565b90600052602060002001540361162757600287016115e66001846149ef565b815481106115f6576115f6614a02565b906000526020600020015487600201828154811061161657611616614a02565b60009182526020909120015561162f565b60010161159f565b508560020180548061164357611643614a18565b60008281526020808220830160001990810183905590920190925586825260018881018252604080842084815590910192909255815185815290810184905286917facf0e8088062f44f734bbcb5223794fd8bb6f6db1c199cb6a72df119d002a71b910160405180910390a25050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906116f25750333014155b1561171057604051630796d94560e01b815260040160405180910390fd5b60405163385483d560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e1520f549061176090869086908690600401614a2e565b600060405180830381600087803b15801561177a57600080fd5b505af1158015610850573d6000803e3d6000fd5b6000611798611a90565b5063f23a6e6160e01b95945050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906117e35750333014155b1561180157604051630796d94560e01b815260040160405180910390fd5b61094e816120f3565b6000611814611a90565b6001600160e01b031982166326f0aef760e01b148061184357506001600160e01b03198216630a85bd0160e11b145b8061185e57506001600160e01b03198216630271189760e51b145b8061187957506001600160e01b031982166301ffc9a760e01b145b806107e2575050630b135d3f60e11b6001600160e01b03198216145b919050565b856001600160a01b0389161580156118b0575080155b80156118b95750815b156118d7576040516312da594d60e11b815260040160405180910390fd5b80851415806118e65750808314155b156119155760405163a297991b60e01b8152600481018290526024810186905260448101849052606401611558565b8115611a0a57600080516020614dae83398151915254600080516020614d8e833981519152908015611a075760005b818110156119f857600083600201828154811061196357611963614a02565b6000918252602080832090910154808352600180880180845260408086208151808301835281548152938101805485880190815286895293909652869055949093558051925193519194509284927facf0e8088062f44f734bbcb5223794fd8bb6f6db1c199cb6a72df119d002a71b926119e69290918252602082015260400190565b60405180910390a25050600101611944565b50611a07600283016000613e60565b50505b60005b81811015611a7b57611a73898983818110611a2a57611a2a614a02565b9050602002810190611a3c9190614a8c565b898985818110611a4e57611a4e614a02565b90506020020135888886818110611a6757611a67614a02565b90506020020135612195565b600101611a0d565b50611a85896120f3565b505050505050505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611b1757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611b0b600080516020614dee833981519152546001600160a01b031690565b6001600160a01b031614155b15610e545760405163703e46dd60e11b815260040160405180910390fd5b6000816041819003611bd257600080516020614d8e833981519152546001600160a01b03166001600160a01b0316611ba38686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061231292505050565b6001600160a01b031603611bc15750630b135d3f60e11b905061088d565b506001600160e01b0319905061088d565b6060811015611bec57506001600160e01b0319905061088d565b600080516020614d8e8339815191526000611c0a6020828789614ad2565b611c1391614afc565b600081815260018085016020908152604092839020835180850190945280548085529201549083015291925090158015611c4f57506020810151155b15611c6957506001600160e01b0319935061088d92505050565b836060148015611cbd5750611cbd8888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505085516020870151909250905061233c565b15611cd65750630b135d3f60e11b935061088d92505050565b83606014158015611d2b5750611d2b8888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508551602087015190925090506123da565b15611d445750630b135d3f60e11b935061088d92505050565b506001600160e01b0319935061088d92505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c829052603c81208190611da190611d9c610100870187614a8c565b611b35565b90506374eca2c160e11b6001600160e01b0319821601611dc55760009150506107e2565b5060019392505050565b801561094e57604051600090339060001990849084818181858888f193505050503d8060008114611e1c576040519150601f19603f3d011682016040523d82523d6000602084013e611e21565b606091505b505060408051848152821515602082015291925033917fa427c7d47f24d01b170779a7600b1d4c0d7cdbabaa0f19c4f0e6182053ffc931910160405180910390a25050565b600080611e76602084018461476b565b6001600160a01b03166020840135611e916040860186614a8c565b604051611e9f9291906149c9565b60006040518083038185875af1925050503d8060008114611edc576040519150601f19603f3d011682016040523d82523d6000602084013e611ee1565b606091505b509092509050611ef4602084018461476b565b6001600160a01b03167f74b56487625d598ffbf59a76c3b58fc1922f54afc86a075bad0c2a8aa05d2ad284602001358484604051611f3493929190614b1a565b60405180910390a281611f6b578051600003611f635760405163764bbf1760e01b815260040160405180910390fd5b805181602001fd5b505050565b806000819003611f9357604051635fc74f2160e11b815260040160405180910390fd5b60005b8181101561139b57611fca848483818110611fb357611fb3614a02565b9050602002810190611fc59190614b3b565b611e66565b600101611f96565b600080516020614dae83398151915254600080516020614d8e8339815191529060005b818110156120455782600101600084600201838154811061201857612018614a02565b60009182526020808320909101548352820192909252604001812081815560019081019190915501611ff5565b50612054600283016000613e60565b81546001600160a01b03191682556040517feb09d532980c3cc73dcad99b80e264204a667a54cbb7b63ec8d68dcb1c7096be90600090a15050565b612097611a90565b6120a08261243d565b610a1b8282612494565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e545760405163703e46dd60e11b815260040160405180910390fd5b600080516020614dae83398151915254600080516020614d8e8339815191529015801561212757506001600160a01b038216155b156121455760405163c4c8547360e01b815260040160405180910390fd5b80546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b61219f8282612551565b6121c6576040516313c3d61f60e01b81526004810183905260248101829052604401611558565b600084846040516020016121db9291906149c9565b6040516020818303038152906040528051906020012090508484905060000361221757604051637e25658160e11b815260040160405180910390fd5b60008181527fa2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694901602052604090208054600080516020614d8e83398151915291901515806122675750600181015415155b15612288576040516361db108160e01b815260048101849052602401611558565b604080518082018252868152602080820187815260008781526001808801845285822094518555915193820193909355600286018054918201815583529120018490555183907fd00539cb08a7c24166308150d64d603150c01baf89d3d3e4c6063d6db7c6983d90612301908a908a908a908a90614b5b565b60405180910390a250505050505050565b600080600080612322868661255d565b92509250925061233282826125aa565b5090949350505050565b600080600061234a86612663565b91509150600060028860405160200161236591815260200190565b60408051601f198184030181529082905261237f91614b82565b602060405180830381855afa15801561239c573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906123bf9190614788565b90506123ce8184848989612685565b98975050505050505050565b6000806123e685612793565b9050612433866040516020016123fe91815260200190565b60408051601f198184030181529181528301516060840151608085015160a086015160c0870151875160208901518c8c612811565b9695505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906124765750333014155b1561094e57604051630796d94560e01b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156124ee575060408051601f3d908101601f191682019092526124eb91810190614788565b60015b61251657604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611558565b600080516020614dee833981519152811461254757604051632a87526960e21b815260048101829052602401611558565b611f6b83836129b1565b600061088d8383612a07565b600080600083516041036125975760208401516040850151606086015160001a61258988828585612b01565b9550955095505050506125a3565b50508151600091506002905b9250925092565b60008260038111156125be576125be614b94565b036125c7575050565b60018260038111156125db576125db614b94565b036125f95760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561260d5761260d614b94565b0361262e5760405163fce698f760e01b815260048101829052602401611558565b600382600381111561264257612642614b94565b03610a1b576040516335e2f38360e21b815260048101829052602401611558565b6000808280602001905181019061267a9190614baa565b909590945092505050565b60006126a06002600080516020614dce833981519152614bd8565b8411156126af575060006112a3565b6040805160208101889052908101869052606081018590526080810184905260a0810183905260009060c00160405160208183030381529060405290506000806101006001600160a01b0316836040516127099190614b82565b600060405180830381855afa9150503d8060008114612744576040519150601f19603f3d011682016040523d82523d6000602084013e612749565b606091505b50915091508115612779578080602001905181019061276891906149ac565b1515600115151493505050506112a3565b6127868989898989612bd0565b9998505050505050505050565b6127d56040518060e001604052806000815260200160008152602001606081526020016000151581526020016060815260200160608152602001600081525090565b818060200190518101906127e99190614c3f565b60c089015260a088015260808701521515606086015260408501526020840152825250919050565b600060258a51108061284b57506128498a60208151811061283457612834614a02565b01602001516001600160f81b0319168a612cb3565b155b15612858575060006129a3565b6000886128648d612d19565b8960405160200161287793929190614cfe565b60408051601f198184030181528282019091526015825274113a3cb832911d113bb2b130baba34371733b2ba1160591b602083015291506128b981838a612f26565b6128c8576000925050506129a3565b60006002836040516128da9190614b82565b602060405180830381855afa1580156128f7573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061291a9190614788565b9050600060028e83604051602001612933929190614d41565b60408051601f198184030181529082905261294d91614b82565b602060405180830381855afa15801561296a573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061298d9190614788565b905061299c818a8a8a8a612685565b9450505050505b9a9950505050505050505050565b6129ba82612fd5565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156129ff57611f6b828261303a565b610a1b6130a7565b600082158015612a15575081155b80612a2d5750600160601b63ffffffff60c01b031983145b80612a455750600160601b63ffffffff60c01b031982145b15612a52575060006107e2565b6000600160601b63ffffffff60c01b031983840990506000600160601b63ffffffff60c01b0319807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc8709600160601b63ffffffff60c01b031987600160601b63ffffffff60c01b0319898a0909089050600160601b63ffffffff60c01b03197f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b820891909114949350505050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612b3c5750600091506003905082612bc6565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612b90573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612bbc57506000925060019150829050612bc6565b9250600091508190505b9450945094915050565b6000841580612bed5750600080516020614dce8339815191528510155b80612bf6575083155b80612c0f5750600080516020614dce8339815191528410155b15612c1c575060006112a3565b612c268383612a07565b612c32575060006112a3565b6000612c3d856130c6565b90506000600080516020614dce83398151915282890990506000600080516020614dce83398151915283890990506000612c7987878585613138565b9050600080516020614dce833981519152612ca28a600080516020614dce8339815191526149ef565b8208159a9950505050505050505050565b6000600160f81b83811614612cca575060006107e2565b818015612cdd5750600160fa1b83811614155b15612cea575060006107e2565b600160fb1b83811614612d1057600f60fc1b600160fc1b841601612d10575060006107e2565b50600192915050565b60606000612d2683613800565b90506000819050600060028251118015612d7157508160028351612d4a91906149ef565b81518110612d5a57612d5a614a02565b6020910101516001600160f81b031916603d60f81b145b15612d7e57506002612dc9565b60018251118015612dc057508160018351612d9991906149ef565b81518110612da957612da9614a02565b6020910101516001600160f81b031916603d60f81b145b15612dc9575060015b6000818351612dd891906149ef565b90506000816001600160401b03811115612df457612df4613fd3565b6040519080825280601f01601f191660200182016040528015612e1e576020820181803683370190505b50905060005b82811015612f1b57848181518110612e3e57612e3e614a02565b01602001516001600160f81b031916602b60f81b03612e8a57602d60f81b828281518110612e6e57612e6e614a02565b60200101906001600160f81b031916908160001a905350612f13565b848181518110612e9c57612e9c614a02565b01602001516001600160f81b031916602f60f81b03612ecc57605f60f81b828281518110612e6e57612e6e614a02565b848181518110612ede57612ede614a02565b602001015160f81c60f81b828281518110612efb57612efb614a02565b60200101906001600160f81b031916908160001a9053505b600101612e24565b509695505050505050565b825182516000918591859190845b82811015612fc65781612f478289614d63565b10612f5a5760009550505050505061088d565b83612f658289614d63565b81518110612f7557612f75614a02565b602001015160f81c60f81b6001600160f81b031916858281518110612f9c57612f9c614a02565b01602001516001600160f81b03191614612fbe5760009550505050505061088d565b600101612f34565b50600198975050505050505050565b806001600160a01b03163b60000361300b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611558565b600080516020614dee83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516130579190614b82565b600060405180830381855af49150503d8060008114613092576040519150601f19603f3d011682016040523d82523d6000602084013e613097565b606091505b50915091506112a3858383613826565b3415610e545760405163b398979f60e01b815260040160405180910390fd5b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f6080820152600080516020614dce83398151915260a082015260208160c0836005600019fa61313157600080fd5b5192915050565b600080808060ff81808815801561314d575087155b15613161576000965050505050505061086d565b6131ad7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d613882565b9092509050811580156131be575080155b156131ec57600080516020614dce83398151915288600080516020614dce833981519152038a089850600097505b600189841c16600189851c1660011b015b8061321f5760018403935060018a851c1660018a861c1660011b0190506131fd565b50600189841c16600189851c1660011b01955060018603613281577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603613290578a96508993505b6003860361329f578196508093505b60018303925060019550600194505b82600019111561378357600160601b63ffffffff60c01b031984600209600160601b63ffffffff60c01b0319818209600160601b63ffffffff60c01b0319818a09600160601b63ffffffff60c01b03198284099250600160601b63ffffffff60c01b031980600160601b63ffffffff60c01b03198b8d08600160601b63ffffffff60c01b03198c600160601b63ffffffff60c01b0319038e0809600309600160601b63ffffffff60c01b03198985099850600160601b63ffffffff60c01b03198a84099950600160601b63ffffffff60c01b031980836002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319838409089a50600160601b63ffffffff60c01b03198083600160601b63ffffffff60c01b0319038d0882099250600160601b63ffffffff60c01b031983600160601b63ffffffff60c01b03198a870908975060018d881c1660018d891c1660011b0190508061342b5787600160601b63ffffffff60c01b031903975050505050613778565b6001810361347a577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103613489578e93508d92505b60038103613498578593508492505b896134b157509198506001975087965094506137789050565b600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b03198b860908600160601b63ffffffff60c01b03198c600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b03198d88090893508061366a578361366a57600160601b63ffffffff60c01b0319896002600160601b0363ffffffff60c01b0319099450600160601b63ffffffff60c01b03198586099350600160601b63ffffffff60c01b0319848d099250600160601b63ffffffff60c01b03198486099450600160601b63ffffffff60c01b0319808c600160601b63ffffffff60c01b0319038e08600160601b63ffffffff60c01b03198d8f08099050600160601b63ffffffff60c01b0319816003099150600160601b63ffffffff60c01b03198a86099950600160601b63ffffffff60c01b03198b85099a50600160601b63ffffffff60c01b031980846002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319848509089b50600160601b63ffffffff60c01b0319808d600160601b63ffffffff60c01b031903850883099350600160601b63ffffffff60c01b0319808a8709850898505050505050613778565b600160601b63ffffffff60c01b03198485099150600160601b63ffffffff60c01b0319848309600160601b63ffffffff60c01b0319838d099b50600160601b63ffffffff60c01b0319818c099a50600160601b63ffffffff60c01b0319838e09600160601b63ffffffff60c01b031980826002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b031984600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b031987880908089350600160601b63ffffffff60c01b031980838d09600160601b63ffffffff60c01b031985600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b031903860809089a50505050809a50505050505b6001830392506132ae565b60405186606082015260208152602080820152602060408201526002600160601b0363ffffffff60c01b03196080820152600160601b63ffffffff60c01b031960a082015260208160c0836005600019fa6137dd57600080fd5b600160601b63ffffffff60c01b0319815189099c9b505050505050505050505050565b60606107e282604051806060016040528060408152602001614e0e604091396001613910565b60608261383b5761383682613a8f565b61088d565b815115801561385257506001600160a01b0384163b155b1561387b57604051639996b31560e01b81526001600160a01b0385166004820152602401611558565b508061088d565b600080808086613899578585935093505050613907565b846138ab578787935093505050613907565b85881480156138b957508487145b156138da576138cb8888600180613ab8565b929a50909850925090506138f4565b6138e988886001808a8a613c13565b929a50909850925090505b61390088888484613d97565b9350935050505b94509492505050565b60608351600003613930575060408051602081019091526000815261088d565b600082613961576003855160046139479190614d76565b613952906002614d63565b61395c9190614bd8565b613986565b6003855160026139719190614d63565b61397b9190614bd8565b613986906004614d76565b90506000816001600160401b038111156139a2576139a2613fd3565b6040519080825280601f01601f1916602001820160405280156139cc576020820181803683370190505b50905060018501602082018788518901602081018051600082525b82841015613a42576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f81168701518653506001850194506139e7565b905250508515613a8357600388510660018114613a665760028114613a7957613a81565b603d6001830353603d6002830353613a81565b603d60018303535b505b50909695505050505050565b805115613a9f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080600080600160601b63ffffffff60c01b0319876002099350600160601b63ffffffff60c01b03198485099150600160601b63ffffffff60c01b03198289099050600160601b63ffffffff60c01b03198285099250600160601b63ffffffff60c01b03198683099150600160601b63ffffffff60c01b031980600160601b63ffffffff60c01b0319888b08600160601b63ffffffff60c01b031989600160601b63ffffffff60c01b0319038c08096003099550600160601b63ffffffff60c01b031980826002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319888909089350600160601b63ffffffff60c01b03198085600160601b63ffffffff60c01b031903830887099750600160601b63ffffffff60c01b03198584099050600160601b63ffffffff60c01b031980888509600160601b63ffffffff60c01b03190389089250945094509450949050565b60008060008088600003613c3257508492508391506001905080613d8a565b600160601b63ffffffff60c01b0319988903988981898809089450600160601b63ffffffff60c01b03198a600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b03198a8909089550600160601b63ffffffff60c01b03198687099350600160601b63ffffffff60c01b03198685099250600160601b63ffffffff60c01b03198489099150600160601b63ffffffff60c01b03198388099050600160601b63ffffffff60c01b0319848b099750600160601b63ffffffff60c01b031980896002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b031985600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b0319898a0908089350600160601b63ffffffff60c01b031980848b09600160601b63ffffffff60c01b031987600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b0319038d08090892505b9650965096509692505050565b6000806000613da584613e04565b9050600160601b63ffffffff60c01b031981870991506000600160601b63ffffffff60c01b03198287099050600160601b63ffffffff60c01b03198182099150600160601b63ffffffff60c01b03198289099350505094509492505050565b600060405160208152602080820152602060408201528260608201526002600160601b0363ffffffff60c01b03196080820152600160601b63ffffffff60c01b031960a082015260208160c0836005600019fa61313157600080fd5b508054600082559060005260206000209081019061094e91905b80821115613e8e5760008155600101613e7a565b5090565b600060208284031215613ea457600080fd5b81356001600160e01b03198116811461088d57600080fd5b6001600160a01b038116811461094e57600080fd5b803561189581613ebc565b60008083601f840112613eee57600080fd5b5081356001600160401b03811115613f0557600080fd5b6020830191508360208260051b8501011115613f2057600080fd5b9250929050565b60008060008060008060006080888a031215613f4257600080fd5b8735613f4d81613ebc565b965060208801356001600160401b0380821115613f6957600080fd5b613f758b838c01613edc565b909850965060408a0135915080821115613f8e57600080fd5b613f9a8b838c01613edc565b909650945060608a0135915080821115613fb357600080fd5b50613fc08a828b01613edc565b989b979a50959850939692959293505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561401157614011613fd3565b604052919050565b60006001600160401b0382111561403257614032613fd3565b50601f01601f191660200190565b600082601f83011261405157600080fd5b813561406461405f82614019565b613fe9565b81815284602083860101111561407957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156140ac57600080fd5b84356140b781613ebc565b935060208501356140c781613ebc565b92506040850135915060608501356001600160401b038111156140e957600080fd5b6140f587828801614040565b91505092959194509250565b60008083601f84011261411357600080fd5b5081356001600160401b0381111561412a57600080fd5b602083019150836020828501011115613f2057600080fd5b60008060006040848603121561415757600080fd5b8335925060208401356001600160401b0381111561417457600080fd5b61418086828701614101565b9497909650939450505050565b6000806000606084860312156141a257600080fd5b83356001600160401b038111156141b857600080fd5b840161012081870312156141cb57600080fd5b95602085013595506040909401359392505050565b6000606082840312156141f257600080fd5b50919050565b60006020828403121561420a57600080fd5b81356001600160401b0381111561422057600080fd5b61086d848285016141e0565b6020808252825182820181905260009190848201906040850190845b81811015613a8357835183529284019291840191600101614248565b6000806020838503121561427757600080fd5b82356001600160401b0381111561428d57600080fd5b61429985828601613edc565b90969095509350505050565b6000602082840312156142b757600080fd5b81356001600160c01b038116811461088d57600080fd5b6000602082840312156142e057600080fd5b81356001600160401b038111156142f657600080fd5b820160c0818503121561088d57600080fd5b60006020828403121561431a57600080fd5b5035919050565b6000806040838503121561433457600080fd5b823561433f81613ebc565b915060208301356001600160401b0381111561435a57600080fd5b61436685828601614040565b9150509250929050565b801515811461094e57600080fd5b803561189581614370565b600080600080600080600080600060c08a8c0312156143a757600080fd5b893560ff811681146143b857600080fd5b98506143c660208b01613ed1565b975060408a01356001600160401b03808211156143e257600080fd5b6143ee8d838e01613edc565b909950975060608c013591508082111561440757600080fd5b6144138d838e01613edc565b909750955060808c013591508082111561442c57600080fd5b506144398c828d01613edc565b909450925061444c905060a08b0161437e565b90509295985092959850929598565b6000806040838503121561446e57600080fd5b823561447981613ebc565b946020939093013593505050565b60005b838110156144a257818101518382015260200161448a565b50506000910152565b600081518084526144c3816020860160208601614487565b601f01601f19169290920160200192915050565b60208152600061088d60208301846144ab565b600082601f8301126144fb57600080fd5b813560206001600160401b0382111561451657614516613fd3565b8160051b614525828201613fe9565b928352848101820192828101908785111561453f57600080fd5b83870192505b8483101561455e57823582529183019190830190614545565b979650505050505050565b600080600080600060a0868803121561458157600080fd5b853561458c81613ebc565b9450602086013561459c81613ebc565b935060408601356001600160401b03808211156145b857600080fd5b6145c489838a016144ea565b945060608801359150808211156145da57600080fd5b6145e689838a016144ea565b935060808801359150808211156145fc57600080fd5b5061460988828901614040565b9150509295509295909350565b6000806000806060858703121561462c57600080fd5b84356001600160401b0381111561464257600080fd5b61464e87828801614101565b90989097506020870135966040013595509350505050565b6000806020838503121561467957600080fd5b82356001600160401b0381111561468f57600080fd5b61429985828601614101565b6000806000604084860312156146b057600080fd5b83356001600160401b03808211156146c757600080fd5b6146d387838801614101565b909550935060208601359150808211156146ec57600080fd5b506146f9868287016141e0565b9150509250925092565b600080600080600060a0868803121561471b57600080fd5b853561472681613ebc565b9450602086013561473681613ebc565b9350604086013592506060860135915060808601356001600160401b0381111561475f57600080fd5b61460988828901614040565b60006020828403121561477d57600080fd5b813561088d81613ebc565b60006020828403121561479a57600080fd5b5051919050565b6000808335601e198436030181126147b857600080fd5b83016020810192503590506001600160401b038111156147d757600080fd5b803603821315613f2057600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b888110156148c257858403601f19018a52823536899003605e1901811261484e578283fd5b88016060813561485d81613ebc565b6001600160a01b03168652614874828801836147a1565b828989015261488683890182846147e6565b925050506040614898818401846147a1565b9350878303828901526148ac8385836147e6565b9d89019d97505050938601935050600101614829565b509198975050505050505050565b60208152600082356148e181613ebc565b6001600160a01b039081166020848101919091528401359061490282613ebc565b80821660408501525050604083013560608301526060830135601e1984360301811261492d57600080fd5b83016020810190356001600160401b0381111561494957600080fd5b8060051b360382131561495b57600080fd5b60c0608085015261497060e08501828461480f565b915050608084013560a084015261498a60a08501856147a1565b848303601f190160c08601526124338382846147e6565b805161189581614370565b6000602082840312156149be57600080fd5b815161088d81614370565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156107e2576107e26149d9565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b604081526000614a426040830185876147e6565b82810360208401528335614a5581613ebc565b6001600160a01b0316815260208481013590820152614a7760408501856147a1565b606060408401526123ce6060840182846147e6565b6000808335601e19843603018112614aa357600080fd5b8301803591506001600160401b03821115614abd57600080fd5b602001915036819003821315613f2057600080fd5b60008085851115614ae257600080fd5b83861115614aef57600080fd5b5050820193919092039150565b803560208310156107e257600019602084900360031b1b1692915050565b83815282151560208201526060604082015260006112a360608301846144ab565b60008235605e19833603018112614b5157600080fd5b9190910192915050565b606081526000614b6f6060830186886147e6565b6020830194909452506040015292915050565b60008251614b51818460208701614487565b634e487b7160e01b600052602160045260246000fd5b600080600060608486031215614bbf57600080fd5b8351925060208401519150604084015190509250925092565b600082614bf557634e487b7160e01b600052601260045260246000fd5b500490565b600082601f830112614c0b57600080fd5b8151614c1961405f82614019565b818152846020838601011115614c2e57600080fd5b61086d826020830160208701614487565b600080600080600080600080610100898b031215614c5c57600080fd5b88519750602089015196506040890151955060608901516001600160401b0380821115614c8857600080fd5b614c948c838d01614bfa565b9650614ca260808c016149a1565b955060a08b0151915080821115614cb857600080fd5b614cc48c838d01614bfa565b945060c08b0151915080821115614cda57600080fd5b50614ce78b828c01614bfa565b92505060e089015190509295985092959890939650565b60008451614d10818460208901614487565b845190830190614d24818360208901614487565b8451910190614d37818360208801614487565b0195945050505050565b60008351614d53818460208801614487565b9190910191825250602001919050565b808201808211156107e2576107e26149d9565b80820281158282048414176107e2576107e26149d956fea2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694900a2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694902ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212208ea6494b631dfbdfca458a1c0a52311f1cf61e8c8eacea1ff8b3b6e773897baa64736f6c63430008170033000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d780000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x2", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x12ec78cfe2faa12eec47fdf21d25ce2210c5fe59086054d476ec1b27ea30c8d3", + "transactionType": "CREATE2", + "contractName": "AllowedCalldataEnforcer", + "contractAddress": "0x48db3835a873d64a4af2c09f014052407c003bd7", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x8b796", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061059c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610085575b600080fd5b61005961005436600461035a565b61009d565b005b61006e61006936600461041d565b61020c565b60405161007c92919061045f565b60405180910390f35b61005961009336600461035a565b5050505050505050565b60006060806100ac8b8b61020c565b805191945092506100c060408901896104b6565b90506100cc82866104fd565b11156101375760405162461bcd60e51b815260206004820152602f60248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d60448201526e0c6c2d8d8c8c2e8c25ad8cadccee8d608b1b60648201526084015b60405180910390fd5b61014460408901896104b6565b859061015084836104fd565b9261015d9392919061051e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509294506101a192508491508590506102d9565b6101fe5760405162461bcd60e51b815260206004820152602860248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d60448201526763616c6c6461746160c01b606482015260840161012e565b505050505050505050505050565b6000606060218310156102745760405162461bcd60e51b815260206004820152602a60248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d6044820152697465726d732d73697a6560b01b606482015260840161012e565b61028260206000858761051e565b61028b91610548565b915061029a836020818761051e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250949792965091945050505050565b6000818051906020012083805190602001201490505b92915050565b60008083601f84011261030757600080fd5b50813567ffffffffffffffff81111561031f57600080fd5b60208301915083602082850101111561033757600080fd5b9250929050565b80356001600160a01b038116811461035557600080fd5b919050565b60008060008060008060008060c0898b03121561037657600080fd5b883567ffffffffffffffff8082111561038e57600080fd5b61039a8c838d016102f5565b909a50985060208b01359150808211156103b357600080fd5b6103bf8c838d016102f5565b909850965060408b01359150808211156103d857600080fd5b5089016060818c0312156103eb57600080fd5b93506060890135925061040060808a0161033e565b915061040e60a08a0161033e565b90509295985092959890939650565b6000806020838503121561043057600080fd5b823567ffffffffffffffff81111561044757600080fd5b610453858286016102f5565b90969095509350505050565b8281526000602060406020840152835180604085015260005b8181101561049457858101830151858201606001528201610478565b506000606082860101526060601f19601f830116850101925050509392505050565b6000808335601e198436030181126104cd57600080fd5b83018035915067ffffffffffffffff8211156104e857600080fd5b60200191503681900382131561033757600080fd5b808201808211156102ef57634e487b7160e01b600052601160045260246000fd5b6000808585111561052e57600080fd5b8386111561053b57600080fd5b5050820193919092039150565b803560208310156102ef57600019602084900360031b1b169291505056fea264697066735822122094149f339193c37892b2442e24526e5fff221c6592b2b7cd87732677fcc1c9c464736f6c63430008170033", + "nonce": "0x3", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xc73a23153176dbe22460e8e0e1564dfa06829a50c18d071be08e45ec3badefdd", + "transactionType": "CREATE2", + "contractName": "AllowedMethodsEnforcer", + "contractAddress": "0xfd731951bf1c52afccee3e6f14ab656475b76dd4", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xa0d6a", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610683806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610084575b600080fd5b6100596100543660046103a7565b61009c565b005b61006e61006936600461046a565b6101ff565b60405161007b91906104ac565b60405180910390f35b6100596100923660046103a7565b5050505050505050565b60046100ab60408601866104fa565b9050101561011a5760405162461bcd60e51b815260206004820152603160248201527f416c6c6f7765644d6574686f6473456e666f726365723a696e76616c69642d616044820152700c6e8d2dedc5ac8c2e8c25ad8cadccee8d607b1b60648201526084015b60405180910390fd5b600061012960408601866104fa565b61013891600491600091610541565b6101419161056b565b9050600061014f8a8a6101ff565b805190915060005b818110156101a4578281815181106101715761017161059b565b60200260200101516001600160e01b031916846001600160e01b0319160361019c5750505050610092565b600101610157565b5060405162461bcd60e51b815260206004820152602960248201527f416c6c6f7765644d6574686f6473456e666f726365723a6d6574686f642d6e6f6044820152681d0b585b1b1bddd95960ba1b6064820152608401610111565b606060008261020f6004826105c7565b156102705760405162461bcd60e51b815260206004820152602b60248201527f416c6c6f7765644d6574686f6473456e666f726365723a696e76616c69642d7460448201526a0cae4dae65ad8cadccee8d60ab1b6064820152608401610111565b61027b6004826105f1565b67ffffffffffffffff81111561029357610293610605565b6040519080825280602002602001820160405280156102bc578160200160208202803683370190505b50925060005b81811015610339578581866102d882600461061b565b926102e593929190610541565b6102ee9161056b565b8484815181106103005761030061059b565b6001600160e01b0319909216602092830291909101909101528261032381610634565b9350610332905060048261061b565b90506102c2565b50505092915050565b60008083601f84011261035457600080fd5b50813567ffffffffffffffff81111561036c57600080fd5b60208301915083602082850101111561038457600080fd5b9250929050565b80356001600160a01b03811681146103a257600080fd5b919050565b60008060008060008060008060c0898b0312156103c357600080fd5b883567ffffffffffffffff808211156103db57600080fd5b6103e78c838d01610342565b909a50985060208b013591508082111561040057600080fd5b61040c8c838d01610342565b909850965060408b013591508082111561042557600080fd5b5089016060818c03121561043857600080fd5b93506060890135925061044d60808a0161038b565b915061045b60a08a0161038b565b90509295985092959890939650565b6000806020838503121561047d57600080fd5b823567ffffffffffffffff81111561049457600080fd5b6104a085828601610342565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156104ee5783516001600160e01b031916835292840192918401916001016104c8565b50909695505050505050565b6000808335601e1984360301811261051157600080fd5b83018035915067ffffffffffffffff82111561052c57600080fd5b60200191503681900382131561038457600080fd5b6000808585111561055157600080fd5b8386111561055e57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156105935780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826105d6576105d66105b1565b500690565b634e487b7160e01b600052601160045260246000fd5b600082610600576106006105b1565b500490565b634e487b7160e01b600052604160045260246000fd5b8082018082111561062e5761062e6105db565b92915050565b600060018201610646576106466105db565b506001019056fea26469706673582212204ec9b63db8ffcc611dbc205c0eb5d3daa906537fc4f6d216704a61e004393bed64736f6c63430008170033", + "nonce": "0x4", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x37bba227c218a22525118d8f9b8a863ac46ebbfd7858edb6506a1039ca45269f", + "transactionType": "CREATE2", + "contractName": "AllowedTargetsEnforcer", + "contractAddress": "0xbc8673c0afa52d86d991c06881e55b2966920564", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x92061", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b506105d9806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610084575b600080fd5b61005961005436600461031e565b61009c565b005b61006e6100693660046103e1565b610174565b60405161007b9190610423565b60405180910390f35b61005961009236600461031e565b5050505050505050565b60006100ab6020860186610470565b905060006100b98a8a610174565b805190915060005b8181101561010c578281815181106100db576100db610492565b60200260200101516001600160a01b0316846001600160a01b0316036101045750505050610092565b6001016100c1565b5060405162461bcd60e51b815260206004820152603160248201527f416c6c6f77656454617267657473456e666f726365723a7461726765742d6164604482015270191c995cdccb5b9bdd0b585b1b1bddd959607a1b60648201526084015b60405180910390fd5b60606000826101846014826104be565b156101e55760405162461bcd60e51b815260206004820152602b60248201527f416c6c6f77656454617267657473456e666f726365723a696e76616c69642d7460448201526a0cae4dae65ad8cadccee8d60ab1b606482015260840161016b565b6101f06014826104e8565b67ffffffffffffffff811115610208576102086104fc565b604051908082528060200260200182016040528015610231578160200160208202803683370190505b50925060005b818110156102b05785818661024d826014610512565b9261025a9392919061052b565b61026391610555565b60601c84848151811061027857610278610492565b6001600160a01b03909216602092830291909101909101528261029a8161058a565b93506102a99050601482610512565b9050610237565b50505092915050565b60008083601f8401126102cb57600080fd5b50813567ffffffffffffffff8111156102e357600080fd5b6020830191508360208285010111156102fb57600080fd5b9250929050565b80356001600160a01b038116811461031957600080fd5b919050565b60008060008060008060008060c0898b03121561033a57600080fd5b883567ffffffffffffffff8082111561035257600080fd5b61035e8c838d016102b9565b909a50985060208b013591508082111561037757600080fd5b6103838c838d016102b9565b909850965060408b013591508082111561039c57600080fd5b5089016060818c0312156103af57600080fd5b9350606089013592506103c460808a01610302565b91506103d260a08a01610302565b90509295985092959890939650565b600080602083850312156103f457600080fd5b823567ffffffffffffffff81111561040b57600080fd5b610417858286016102b9565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156104645783516001600160a01b03168352928401929184019160010161043f565b50909695505050505050565b60006020828403121561048257600080fd5b61048b82610302565b9392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826104cd576104cd6104a8565b500690565b634e487b7160e01b600052601160045260246000fd5b6000826104f7576104f76104a8565b500490565b634e487b7160e01b600052604160045260246000fd5b80820180821115610525576105256104d2565b92915050565b6000808585111561053b57600080fd5b8386111561054857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156105825780818660140360031b1b83161692505b505092915050565b60006001820161059c5761059c6104d2565b506001019056fea26469706673582212204a2e5d298e85989e2cc1b01eb90837481124fb817e6ba907174cafb6c568768564736f6c63430008170033", + "nonce": "0x5", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x1551f34b1997c08f6afb939d3a425f361ca2b863a2baa20dac4baa4051b35471", + "transactionType": "CREATE2", + "contractName": "BlockNumberEnforcer", + "contractAddress": "0xc15faffa0d879b9263c15a46ce31eacfa2e0e8ae", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x71d86", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061045b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610092575b600080fd5b6100596100543660046102bd565b6100aa565b005b61006e610069366004610380565b6101b6565b604080516001600160801b0393841681529290911660208301520160405180910390f35b6100596100a03660046102bd565b5050505050505050565b6000806100b78a8a6101b6565b90925090506001600160801b0382161561013457816001600160801b031643116101345760405162461bcd60e51b8152602060048201526024808201527f426c6f636b4e756d626572456e666f726365723a6561726c792d64656c6567616044820152633a34b7b760e11b60648201526084015b60405180910390fd5b6001600160801b038116156101aa57806001600160801b031643106101aa5760405162461bcd60e51b815260206004820152602660248201527f426c6f636b4e756d626572456e666f726365723a657870697265642d64656c6560448201526533b0ba34b7b760d11b606482015260840161012b565b50505050505050505050565b6000806020831461021a5760405162461bcd60e51b815260206004820152602860248201527f426c6f636b4e756d626572456e666f726365723a696e76616c69642d7465726d6044820152670e65ad8cadccee8d60c31b606482015260840161012b565b6102286010600085876103c2565b610231916103ec565b60801c915061024383601081876103c2565b61024c916103ec565b60801c90509250929050565b60008083601f84011261026a57600080fd5b50813567ffffffffffffffff81111561028257600080fd5b60208301915083602082850101111561029a57600080fd5b9250929050565b80356001600160a01b03811681146102b857600080fd5b919050565b60008060008060008060008060c0898b0312156102d957600080fd5b883567ffffffffffffffff808211156102f157600080fd5b6102fd8c838d01610258565b909a50985060208b013591508082111561031657600080fd5b6103228c838d01610258565b909850965060408b013591508082111561033b57600080fd5b5089016060818c03121561034e57600080fd5b93506060890135925061036360808a016102a1565b915061037160a08a016102a1565b90509295985092959890939650565b6000806020838503121561039357600080fd5b823567ffffffffffffffff8111156103aa57600080fd5b6103b685828601610258565b90969095509350505050565b600080858511156103d257600080fd5b838611156103df57600080fd5b5050820193919092039150565b6fffffffffffffffffffffffffffffffff19813581811691601085101561041d5780818660100360031b1b83161692505b50509291505056fea26469706673582212202f1df071a3b936ee3ad015758f36f43130359bf66ac06d4703490535de194a3864736f6c63430008170033", + "nonce": "0x6", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xceae3288dba246ffd7a2366af50e11ca7ad8dd3a7ab89e12044a134b4474783f", + "transactionType": "CREATE2", + "contractName": "DeployedEnforcer", + "contractAddress": "0x5accb9559b56a6c1e3f90e342c85c42d93720d43", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xa62bf", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b506106b5806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063481286e6146100515780639751a83d14610081578063b99deb0e14610096578063de723eeb146100b8575b600080fd5b61006461005f366004610410565b6100d0565b6040516001600160a01b0390911681526020015b60405180910390f35b61009461008f366004610497565b6100e5565b005b6100a96100a436600461055a565b6101e4565b6040516100789392919061059c565b6100946100c6366004610497565b5050505050505050565b60006100dc82846102ca565b90505b92915050565b60008060006100f48b8b6101e4565b919450925090506001600160a01b0383163b1561014f576040516001600160a01b03841681527f641dafeb23238fae3ef71c64fced975da90c34dede63890507f3dda6b1e0dfef9060200160405180910390a15050506100c6565b600061015b82846102d7565b9050836001600160a01b0316816001600160a01b0316146101d65760405162461bcd60e51b815260206004820152602a60248201527f4465706c6f796564456e666f726365723a6465706c6f7965642d6164647265736044820152690e65adad2e6dac2e8c6d60b31b60648201526084015b60405180910390fd5b505050505050505050505050565b6000806060603484116102475760405162461bcd60e51b815260206004820152602560248201527f4465706c6f796564456e666f726365723a696e76616c69642d7465726d732d6c6044820152640cadccee8d60db1b60648201526084016101cd565b610255601460008688610602565b61025e9161062c565b60601c9250610271603460148688610602565b61027a91610661565b91506102898460348188610602565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509598949750919550929350505050565b60006100dc83833061035f565b60006102e560008385610389565b9050806001600160a01b03163b60000361031d576040516352c7cd4960e11b81526001600160a01b03821660048201526024016101cd565b6040516001600160a01b03821681527faf3c4b03f515b5a38f3c238fdc24abf10854a2f27f2a85743a71de17e9bc7e7f9060200160405180910390a192915050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6000834710156103b55760405163392efb2b60e21b8152476004820152602481018590526044016101cd565b81516000036103d757604051631328927760e21b815260040160405180910390fd5b8282516020840186f590506001600160a01b03811661040957604051633a0ba96160e11b815260040160405180910390fd5b9392505050565b6000806040838503121561042357600080fd5b50508035926020909101359150565b60008083601f84011261044457600080fd5b50813567ffffffffffffffff81111561045c57600080fd5b60208301915083602082850101111561047457600080fd5b9250929050565b80356001600160a01b038116811461049257600080fd5b919050565b60008060008060008060008060c0898b0312156104b357600080fd5b883567ffffffffffffffff808211156104cb57600080fd5b6104d78c838d01610432565b909a50985060208b01359150808211156104f057600080fd5b6104fc8c838d01610432565b909850965060408b013591508082111561051557600080fd5b5089016060818c03121561052857600080fd5b93506060890135925061053d60808a0161047b565b915061054b60a08a0161047b565b90509295985092959890939650565b6000806020838503121561056d57600080fd5b823567ffffffffffffffff81111561058457600080fd5b61059085828601610432565b90969095509350505050565b60018060a01b03841681526000602084602084015260606040840152835180606085015260005b818110156105df578581018301518582016080015282016105c3565b506000608082860101526080601f19601f83011685010192505050949350505050565b6000808585111561061257600080fd5b8386111561061f57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106595780818660140360031b1b83161692505b505092915050565b803560208310156100df57600019602084900360031b1b169291505056fea2646970667358221220adae6ada7a0e210e98db78555afd35a3b834fe39e89d1ae92e20b35e9cc9358664736f6c63430008170033", + "nonce": "0x7", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xa9dfb2ef47f3d790239af73579f1ac4e93c0a6cfc67a7907232d859ed5d51c91", + "transactionType": "CREATE2", + "contractName": "ERC20BalanceGteEnforcer", + "contractAddress": "0xb5d6b1ec6d868a3bae5b7f48178eaa2686a7a087", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xb04bf", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061074a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806332a16f4e146100675780638678d6ef1461009f5780639751a83d146100c0578063b5e54492146100d5578063b99deb0e146100f5578063de723eeb14610127575b600080fd5b61008a61007536600461049d565b60016020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100b26100ad3660046104d2565b61013a565b604051908152602001610096565b6100d36100ce366004610557565b61014f565b005b6100b26100e336600461049d565b60006020819052908152604090205481565b61010861010336600461061a565b610289565b604080516001600160a01b039093168352602083019190915201610096565b6100d3610135366004610557565b61032f565b600061014784848461045a565b949350505050565b600061015b8989610289565b509050600061016b33838761045a565b60008181526001602052604090205490915060ff16156101e55760405162461bcd60e51b815260206004820152602a60248201527f455243323042616c616e6365477465456e666f726365723a656e666f726365726044820152690b5a5ccb5b1bd8dad95960b21b60648201526084015b60405180910390fd5b6000818152600160208190526040808320805460ff1916909217909155516370a0823160e01b81526001600160a01b0386811660048301528416906370a0823190602401602060405180830381865afa158015610246573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026a919061065c565b6000928352602083905260409092209190915550505050505050505050565b600080603483146102f15760405162461bcd60e51b815260206004820152602c60248201527f455243323042616c616e6365477465456e666f726365723a696e76616c69642d60448201526b0e8cae4dae65ad8cadccee8d60a31b60648201526084016101dc565b6102ff601460008587610675565b6103089161069f565b60601c915061031a8360148187610675565b610323916106d4565b60001c90509250929050565b60008061033c8a8a610289565b91509150600061034d33848861045a565b600081815260016020526040808220805460ff19169055516370a0823160e01b81526001600160a01b03888116600483015292935090918516906370a0823190602401602060405180830381865afa1580156103ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d1919061065c565b6000838152602081905260409020549091506103ee9084906106f3565b81101561044c5760405162461bcd60e51b815260206004820152602660248201527f455243323042616c616e6365477465456e666f726365723a62616c616e63652d6044820152651b9bdd0b59dd60d21b60648201526084016101dc565b505050505050505050505050565b604080516001600160a01b039485166020808301919091529390941684820152606080850192909252805180850390920182526080909301909252815191012090565b6000602082840312156104af57600080fd5b5035919050565b80356001600160a01b03811681146104cd57600080fd5b919050565b6000806000606084860312156104e757600080fd5b6104f0846104b6565b92506104fe602085016104b6565b9150604084013590509250925092565b60008083601f84011261052057600080fd5b50813567ffffffffffffffff81111561053857600080fd5b60208301915083602082850101111561055057600080fd5b9250929050565b60008060008060008060008060c0898b03121561057357600080fd5b883567ffffffffffffffff8082111561058b57600080fd5b6105978c838d0161050e565b909a50985060208b01359150808211156105b057600080fd5b6105bc8c838d0161050e565b909850965060408b01359150808211156105d557600080fd5b5089016060818c0312156105e857600080fd5b9350606089013592506105fd60808a016104b6565b915061060b60a08a016104b6565b90509295985092959890939650565b6000806020838503121561062d57600080fd5b823567ffffffffffffffff81111561064457600080fd5b6106508582860161050e565b90969095509350505050565b60006020828403121561066e57600080fd5b5051919050565b6000808585111561068557600080fd5b8386111561069257600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106cc5780818660140360031b1b83161692505b505092915050565b803560208310156106ed57600019602084900360031b1b165b92915050565b808201808211156106ed57634e487b7160e01b600052601160045260246000fdfea2646970667358221220706a4bd5217d105228b49e7ecb48d785e4c5a4cbd88c1e0018e40907dafc0c9d64736f6c63430008170033", + "nonce": "0x8", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe99ba1894b63c71293772c9348540dba0d82f7e79b2ccd1c8998b2a78a015ec2", + "transactionType": "CREATE2", + "contractName": "ERC20TransferAmountEnforcer", + "contractAddress": "0x92ac423b9c111962179a6242e1adb58d02c103be", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xaff7d", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061073b806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80639751a83d146100515780639dd5d9ab14610066578063b99deb0e146100a1578063de723eeb146100d3575b600080fd5b61006461005f366004610480565b6100eb565b005b61008e610074366004610543565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b6100b46100af36600461056d565b610383565b604080516001600160a01b039093168352602083019190915201610098565b6100646100e1366004610480565b5050505050505050565b6100f860408501856105af565b90506044146101565760405162461bcd60e51b815260206004820152603160248201526000805160206106e68339815191526044820152700d8d2c85ac2c6e8d2dedc5ad8cadccee8d607b1b60648201526084015b60405180910390fd5b6000806101638a8a610383565b9092509050600061017760208801886105f6565b905063a9059cbb60e01b6001600160a01b03848116908316146101df5760405162461bcd60e51b815260206004820152602c60248201526000805160206106e683398151915260448201526b1b1a590b58dbdb9d1c9858dd60a21b606482015260840161014d565b60006101ee60408a018a6105af565b6101fd91600491600091610618565b61020691610642565b90506001600160e01b0319808216908316146102655760405162461bcd60e51b815260206004820152602a60248201526000805160206106e68339815191526044820152691b1a590b5b595d1a1bd960b21b606482015260840161014d565b600061027460408b018b6105af565b61028391604491602491610618565b61028c91610672565b336000908152602081815260408083208d845290915281208054929350909183919083906102bb908490610691565b92505081905590508581111561032a5760405162461bcd60e51b815260206004820152602e60248201527f45524332305472616e73666572416d6f756e74456e666f726365723a616c6c6f60448201526d1dd85b98d94b595e18d95959195960921b606482015260840161014d565b60408051878152602081018390528b916001600160a01b038b169133917fc026e493323d526061a052b5dd562495120e2f648797a48be61966d3a6beec8d910160405180910390a4505050505050505050505050505050565b600080603483146103dd5760405162461bcd60e51b815260206004820152603060248201526000805160206106e683398151915260448201526f0d8d2c85ae8cae4dae65ad8cadccee8d60831b606482015260840161014d565b6103eb601460008587610618565b6103f4916106b2565b60601c91506104068360148187610618565b61040f91610672565b60001c90509250929050565b60008083601f84011261042d57600080fd5b50813567ffffffffffffffff81111561044557600080fd5b60208301915083602082850101111561045d57600080fd5b9250929050565b80356001600160a01b038116811461047b57600080fd5b919050565b60008060008060008060008060c0898b03121561049c57600080fd5b883567ffffffffffffffff808211156104b457600080fd5b6104c08c838d0161041b565b909a50985060208b01359150808211156104d957600080fd5b6104e58c838d0161041b565b909850965060408b01359150808211156104fe57600080fd5b5089016060818c03121561051157600080fd5b93506060890135925061052660808a01610464565b915061053460a08a01610464565b90509295985092959890939650565b6000806040838503121561055657600080fd5b61055f83610464565b946020939093013593505050565b6000806020838503121561058057600080fd5b823567ffffffffffffffff81111561059757600080fd5b6105a38582860161041b565b90969095509350505050565b6000808335601e198436030181126105c657600080fd5b83018035915067ffffffffffffffff8211156105e157600080fd5b60200191503681900382131561045d57600080fd5b60006020828403121561060857600080fd5b61061182610464565b9392505050565b6000808585111561062857600080fd5b8386111561063557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561066a5780818660040360031b1b83161692505b505092915050565b8035602083101561068b57600019602084900360031b1b165b92915050565b8082018082111561068b57634e487b7160e01b600052601160045260246000fd5b6bffffffffffffffffffffffff19813581811691601485101561066a5760149490940360031b84901b169092169291505056fe45524332305472616e73666572416d6f756e74456e666f726365723a696e7661a2646970667358221220bbaa47e7ff7ca5d260ee2e4ae44f60d5ed447ee0a25335e020538968f33cc37d64736f6c63430008170033", + "nonce": "0x9", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x4c25e82f011255811f5b3ed8f9199e2b8c644f9d2cae03471180fe326c001f8f", + "transactionType": "CREATE2", + "contractName": "IdEnforcer", + "contractAddress": "0x34152d9f3f8f74338d50703e780389e829b4abac", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x769bd", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610486806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063595dce48146100515780639751a83d14610079578063b99deb0e1461008e578063de723eeb146100af575b600080fd5b61006461005f3660046102a8565b6100c7565b60405190151581526020015b60405180910390f35b61008c61008736600461032d565b6100fe565b005b6100a161009c3660046103f0565b610204565b604051908152602001610070565b61008c6100bd36600461032d565b5050505050505050565b6001600160a01b0380841660009081526020818152604080832093861683529290529081206100f69083610267565b949350505050565b600061010a8989610204565b90506101173384836100c7565b156101695760405162461bcd60e51b815260206004820152601a60248201527f4964456e666f726365723a69642d616c72656164792d7573656400000000000060448201526064015b60405180910390fd5b336000908152602081815260408083206001600160a01b03871684528252808320600885901c845290915290208054600160ff84161b179055826001600160a01b0316826001600160a01b0316336001600160a01b03167f6286af1aaf28b34723a53056e5608eabb40c823d1ce093ff371cf08c502431d6846040516101f191815260200190565b60405180910390a4505050505050505050565b6000602082146102565760405162461bcd60e51b815260206004820152601f60248201527f4964456e666f726365723a696e76616c69642d7465726d732d6c656e677468006044820152606401610160565b6102608284610432565b9392505050565b600881901c600090815260208390526040902054600160ff83161b1615155b92915050565b80356001600160a01b03811681146102a357600080fd5b919050565b6000806000606084860312156102bd57600080fd5b6102c68461028c565b92506102d46020850161028c565b9150604084013590509250925092565b60008083601f8401126102f657600080fd5b50813567ffffffffffffffff81111561030e57600080fd5b60208301915083602082850101111561032657600080fd5b9250929050565b60008060008060008060008060c0898b03121561034957600080fd5b883567ffffffffffffffff8082111561036157600080fd5b61036d8c838d016102e4565b909a50985060208b013591508082111561038657600080fd5b6103928c838d016102e4565b909850965060408b01359150808211156103ab57600080fd5b5089016060818c0312156103be57600080fd5b9350606089013592506103d360808a0161028c565b91506103e160a08a0161028c565b90509295985092959890939650565b6000806020838503121561040357600080fd5b823567ffffffffffffffff81111561041a57600080fd5b610426858286016102e4565b90969095509350505050565b8035602083101561028657600019602084900360031b1b169291505056fea264697066735822122028074431512be4166d9bc04a0557354e43d233df6620f59dcf4e6fea83a3a51f64736f6c63430008170033", + "nonce": "0xa", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x700b18b1dc06fb9638f7b4dae5754b88e7f479a6fc34dc36b95c3ab049124041", + "transactionType": "CREATE2", + "contractName": "LimitedCallsEnforcer", + "contractAddress": "0x4b3adad4a328bee8ba17b86074d92fe7372180cd", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x71f8a", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610442806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806319054d89146100515780639751a83d1461008b578063b99deb0e146100a0578063de723eeb146100b3575b600080fd5b61007961005f36600461024e565b600060208181529281526040808220909352908152205481565b60405190815260200160405180910390f35b61009e6100993660046102c1565b6100cb565b005b6100796100ae366004610384565b6101bd565b61009e6100c13660046102c1565b5050505050505050565b60006100d789896101bd565b336000908152602081815260408083208884529091528120805492935090918290610101906103c6565b91829055509050818111156101695760405162461bcd60e51b815260206004820152602360248201527f4c696d6974656443616c6c73456e666f726365723a6c696d69742d657863656560448201526219195960ea1b60648201526084015b60405180910390fd5b604080518381526020810183905286916001600160a01b0386169133917f449da07f2c06c9d1a6b19d2454ffe749e8cf991d22f686e076a1a4844c5ff370910160405180910390a450505050505050505050565b6000602082146102215760405162461bcd60e51b815260206004820152602960248201527f4c696d6974656443616c6c73456e666f726365723a696e76616c69642d7465726044820152680dae65ad8cadccee8d60bb1b6064820152608401610160565b61022b82846103ed565b9392505050565b80356001600160a01b038116811461024957600080fd5b919050565b6000806040838503121561026157600080fd5b61026a83610232565b946020939093013593505050565b60008083601f84011261028a57600080fd5b50813567ffffffffffffffff8111156102a257600080fd5b6020830191508360208285010111156102ba57600080fd5b9250929050565b60008060008060008060008060c0898b0312156102dd57600080fd5b883567ffffffffffffffff808211156102f557600080fd5b6103018c838d01610278565b909a50985060208b013591508082111561031a57600080fd5b6103268c838d01610278565b909850965060408b013591508082111561033f57600080fd5b5089016060818c03121561035257600080fd5b93506060890135925061036760808a01610232565b915061037560a08a01610232565b90509295985092959890939650565b6000806020838503121561039757600080fd5b823567ffffffffffffffff8111156103ae57600080fd5b6103ba85828601610278565b90969095509350505050565b6000600182016103e657634e487b7160e01b600052601160045260246000fd5b5060010190565b8035602083101561040657600019602084900360031b1b165b9291505056fea2646970667358221220f78aa8066d472e78f2d898b70704f695cf682a9b2914539b1a5a83b1dd87e31064736f6c63430008170033", + "nonce": "0xb", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8eb960a412bac4568a560de045590f3eb23e9d412676721850b53b1bb1f68297", + "transactionType": "CREATE2", + "contractName": "NonceEnforcer", + "contractAddress": "0x2f32ff3fc3086d7f63f16fe8d0065390d460b40d", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x72e5b", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610457806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80632bd4ed211461005c5780639751a83d14610096578063b99deb0e146100ab578063de723eeb146100be578063f5743c4c146100d6575b600080fd5b61008461006a366004610266565b600060208181529281526040808220909352908152205481565b60405190815260200160405180910390f35b6100a96100a43660046102e2565b6100e9565b005b6100846100b93660046103a5565b610178565b6100a96100cc3660046102e2565b5050505050505050565b6100a96100e43660046103e7565b6101e6565b60006100f58989610178565b336000908152602081815260408083206001600160a01b0388168452909152902054909150811461016d5760405162461bcd60e51b815260206004820152601b60248201527f4e6f6e6365456e666f726365723a696e76616c69642d6e6f6e6365000000000060448201526064015b60405180910390fd5b505050505050505050565b6000602082146101d55760405162461bcd60e51b815260206004820152602260248201527f4e6f6e6365456e666f726365723a696e76616c69642d7465726d732d6c656e676044820152610e8d60f31b6064820152608401610164565b6101df8284610402565b9392505050565b6001600160a01b038116600081815260208181526040808320338085529083529281902080546001810190915590518181529093917fe02d340254c92bc3ad96f0fceb790db939e11c669c1f4c8a549d248f17130b33910160405180910390a35050565b80356001600160a01b038116811461026157600080fd5b919050565b6000806040838503121561027957600080fd5b6102828361024a565b91506102906020840161024a565b90509250929050565b60008083601f8401126102ab57600080fd5b50813567ffffffffffffffff8111156102c357600080fd5b6020830191508360208285010111156102db57600080fd5b9250929050565b60008060008060008060008060c0898b0312156102fe57600080fd5b883567ffffffffffffffff8082111561031657600080fd5b6103228c838d01610299565b909a50985060208b013591508082111561033b57600080fd5b6103478c838d01610299565b909850965060408b013591508082111561036057600080fd5b5089016060818c03121561037357600080fd5b93506060890135925061038860808a0161024a565b915061039660a08a0161024a565b90509295985092959890939650565b600080602083850312156103b857600080fd5b823567ffffffffffffffff8111156103cf57600080fd5b6103db85828601610299565b90969095509350505050565b6000602082840312156103f957600080fd5b6101df8261024a565b8035602083101561041b57600019602084900360031b1b165b9291505056fea2646970667358221220b8ac9ab0759f02df69d888b08c000fa4dfa4048ad7f88931687eeff439dd484a64736f6c63430008170033", + "nonce": "0xc", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x827802bb0f6622dd66d57de040c633e6f678b7843c8835e6137d0f2c8f03f7b4", + "transactionType": "CREATE2", + "contractName": "TimestampEnforcer", + "contractAddress": "0x78e05f779490c24bf3bfa135b4112e7003b321cd", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x71c58", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610455806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610092575b600080fd5b6100596100543660046102b7565b6100aa565b005b61006e61006936600461037a565b6101b2565b604080516001600160801b0393841681529290911660208301520160405180910390f35b6100596100a03660046102b7565b5050505050505050565b6000806100b78a8a6101b2565b90925090506001600160801b0382161561013357816001600160801b031642116101335760405162461bcd60e51b815260206004820152602260248201527f54696d657374616d70456e666f726365723a6561726c792d64656c656761746960448201526137b760f11b60648201526084015b60405180910390fd5b6001600160801b038116156101a657806001600160801b031642106101a65760405162461bcd60e51b8152602060048201526024808201527f54696d657374616d70456e666f726365723a657870697265642d64656c6567616044820152633a34b7b760e11b606482015260840161012a565b50505050505050505050565b600080602083146102145760405162461bcd60e51b815260206004820152602660248201527f54696d657374616d70456e666f726365723a696e76616c69642d7465726d732d6044820152650d8cadccee8d60d31b606482015260840161012a565b61022183601081876103bc565b61022a916103e6565b60801c905061023d6010600085876103bc565b610246916103e6565b60801c91509250929050565b60008083601f84011261026457600080fd5b50813567ffffffffffffffff81111561027c57600080fd5b60208301915083602082850101111561029457600080fd5b9250929050565b80356001600160a01b03811681146102b257600080fd5b919050565b60008060008060008060008060c0898b0312156102d357600080fd5b883567ffffffffffffffff808211156102eb57600080fd5b6102f78c838d01610252565b909a50985060208b013591508082111561031057600080fd5b61031c8c838d01610252565b909850965060408b013591508082111561033557600080fd5b5089016060818c03121561034857600080fd5b93506060890135925061035d60808a0161029b565b915061036b60a08a0161029b565b90509295985092959890939650565b6000806020838503121561038d57600080fd5b823567ffffffffffffffff8111156103a457600080fd5b6103b085828601610252565b90969095509350505050565b600080858511156103cc57600080fd5b838611156103d957600080fd5b5050820193919092039150565b6fffffffffffffffffffffffffffffffff1981358181169160108510156104175780818660100360031b1b83161692505b50509291505056fea2646970667358221220032d822c6d896afe6d14f1080a0918e2996d1c61fe51449e6ecf5841d50e5ea464736f6c63430008170033", + "nonce": "0xd", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xd851c91e994de7a8f91e28b25cd3ce117636a3d4301999ffd212fc626ab6212e", + "transactionType": "CREATE2", + "contractName": "ValueLteEnforcer", + "contractAddress": "0xfc20ede0a1132e839fbda9d7ed3904ff3c89540f", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x5b811", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061033a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610080575b600080fd5b6100596100543660046101e0565b610098565b005b61006e6100693660046102a3565b61010a565b60405190815260200160405180910390f35b61005961008e3660046101e0565b5050505050505050565b60006100a4898961010a565b905080856020013511156100ff5760405162461bcd60e51b815260206004820152601f60248201527f56616c75654c7465456e666f726365723a76616c75652d746f6f2d686967680060448201526064015b60405180910390fd5b505050505050505050565b60006020821461016a5760405162461bcd60e51b815260206004820152602560248201527f56616c75654c7465456e666f726365723a696e76616c69642d7465726d732d6c6044820152640cadccee8d60db1b60648201526084016100f6565b61017482846102e5565b9392505050565b60008083601f84011261018d57600080fd5b50813567ffffffffffffffff8111156101a557600080fd5b6020830191508360208285010111156101bd57600080fd5b9250929050565b80356001600160a01b03811681146101db57600080fd5b919050565b60008060008060008060008060c0898b0312156101fc57600080fd5b883567ffffffffffffffff8082111561021457600080fd5b6102208c838d0161017b565b909a50985060208b013591508082111561023957600080fd5b6102458c838d0161017b565b909850965060408b013591508082111561025e57600080fd5b5089016060818c03121561027157600080fd5b93506060890135925061028660808a016101c4565b915061029460a08a016101c4565b90509295985092959890939650565b600080602083850312156102b657600080fd5b823567ffffffffffffffff8111156102cd57600080fd5b6102d98582860161017b565b90969095509350505050565b803560208310156102fe57600019602084900360031b1b165b9291505056fea2646970667358221220cd4bcb89c90c60ef26b293e82752e5ff08228ce4ed86119c5597e63559710ece64736f6c63430008170033", + "nonce": "0xe", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x611eb8", + "logs": [ + { + "address": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44" + ], + "data": "0x", + "blockHash": "0x164ec1cd8802456cf9de9f8ff53443674aa86bdb6cb13b46ff53be63505b1a52", + "blockNumber": "0xdb130e7", + "transactionHash": "0x0413fbd3e00b075713b22e27c24137522940fba946a68b592b158aef4b4e62fa", + "transactionIndex": "0x19", + "logIndex": "0x49", + "removed": false + }, + { + "address": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "topics": [ + "0x04a46d9007577c7ff1e513b900545162ec25d25991ae3dc60cf26ec01a84806d", + "0xe7f4f1f0c55f96ecea405a30bdd6b9dbc3317221da834d38c7bb57ce89a84023", + "0x000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d78" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000a4b1000000000000000000000000000000000000000000000000000000000000001144656c65676174696f6e4d616e6167657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013100000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x164ec1cd8802456cf9de9f8ff53443674aa86bdb6cb13b46ff53be63505b1a52", + "blockNumber": "0xdb130e7", + "transactionHash": "0x0413fbd3e00b075713b22e27c24137522940fba946a68b592b158aef4b4e62fa", + "transactionIndex": "0x19", + "logIndex": "0x4a", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000000000000000000000000004000800000004000000000000000000000000000000000000000000000000000000000041000020000000000000000000000040000000000000001000000001000000000000000000000000000020000000000000000400800000000000080000000000000000000480000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000008000000020000000000800000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x0413fbd3e00b075713b22e27c24137522940fba946a68b592b158aef4b4e62fa", + "transactionIndex": "0x19", + "blockHash": "0x164ec1cd8802456cf9de9f8ff53443674aa86bdb6cb13b46ff53be63505b1a52", + "blockNumber": "0xdb130e7", + "gasUsed": "0x244041", + "effectiveGasPrice": "0xddc570", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0x4911c", + "l1BlockNumber": "0x13510a3" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x378f89", + "logs": [ + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0x5d9f0c87037c30adf54e7c5b6bb69541363a0728f6b80fe6216493ca8b797579", + "blockNumber": "0xdb13108", + "transactionHash": "0x8972f6398b77eb12b7e6139b223f72eb1a620fbb5f897f8534c2b3ab2882c3dd", + "transactionIndex": "0x4", + "logIndex": "0x3", + "removed": false + }, + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0xb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d", + "0x000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d78" + ], + "data": "0x", + "blockHash": "0x5d9f0c87037c30adf54e7c5b6bb69541363a0728f6b80fe6216493ca8b797579", + "blockNumber": "0xdb13108", + "transactionHash": "0x8972f6398b77eb12b7e6139b223f72eb1a620fbb5f897f8534c2b3ab2882c3dd", + "transactionIndex": "0x4", + "logIndex": "0x4", + "removed": false + }, + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0xee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a99", + "0x0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032" + ], + "data": "0x", + "blockHash": "0x5d9f0c87037c30adf54e7c5b6bb69541363a0728f6b80fe6216493ca8b797579", + "blockNumber": "0xdb13108", + "transactionHash": "0x8972f6398b77eb12b7e6139b223f72eb1a620fbb5f897f8534c2b3ab2882c3dd", + "transactionIndex": "0x4", + "logIndex": "0x5", + "removed": false + }, + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0x78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d03" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0x5d9f0c87037c30adf54e7c5b6bb69541363a0728f6b80fe6216493ca8b797579", + "blockNumber": "0xdb13108", + "transactionHash": "0x8972f6398b77eb12b7e6139b223f72eb1a620fbb5f897f8534c2b3ab2882c3dd", + "transactionIndex": "0x4", + "logIndex": "0x6", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000002000010000000000000000000000200000000000000000000000000000000000000000000000000000000000020810000000020000010000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200080000000000000000000080000000000000000008800000000000000000000000080000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000001080000000000000000000004000000000000000000000000000000000000000000000000000000800000000000000100000000000000", + "type": "0x2", + "transactionHash": "0x8972f6398b77eb12b7e6139b223f72eb1a620fbb5f897f8534c2b3ab2882c3dd", + "transactionIndex": "0x4", + "blockHash": "0x5d9f0c87037c30adf54e7c5b6bb69541363a0728f6b80fe6216493ca8b797579", + "blockNumber": "0xdb13108", + "gasUsed": "0x34b7e0", + "effectiveGasPrice": "0xe0a7b8", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0x55dcc", + "l1BlockNumber": "0x13510a4" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x4ba870", + "logs": [ + { + "address": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0xf512883e7f74a18ebe01a19d1a48a831943f3c90617593493b4d422ad1d7e5f9", + "blockNumber": "0xdb13145", + "transactionHash": "0xd5220582e356158edb6a05d6fef319e0d99e8e7a736c4d6bab2aed89360e82a0", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + }, + { + "address": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "topics": [ + "0xb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d", + "0x000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d78" + ], + "data": "0x", + "blockHash": "0xf512883e7f74a18ebe01a19d1a48a831943f3c90617593493b4d422ad1d7e5f9", + "blockNumber": "0xdb13145", + "transactionHash": "0xd5220582e356158edb6a05d6fef319e0d99e8e7a736c4d6bab2aed89360e82a0", + "transactionIndex": "0x1", + "logIndex": "0x1", + "removed": false + }, + { + "address": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "topics": [ + "0xee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a99", + "0x0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032" + ], + "data": "0x", + "blockHash": "0xf512883e7f74a18ebe01a19d1a48a831943f3c90617593493b4d422ad1d7e5f9", + "blockNumber": "0xdb13145", + "transactionHash": "0xd5220582e356158edb6a05d6fef319e0d99e8e7a736c4d6bab2aed89360e82a0", + "transactionIndex": "0x1", + "logIndex": "0x2", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000810000000020000010000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000080000000000000000000080000000000000000008800000000000000000000000080000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000100000000000000000000000000000000000200000000000000800000000000000100000000000000", + "type": "0x2", + "transactionHash": "0xd5220582e356158edb6a05d6fef319e0d99e8e7a736c4d6bab2aed89360e82a0", + "transactionIndex": "0x1", + "blockHash": "0xf512883e7f74a18ebe01a19d1a48a831943f3c90617593493b4d422ad1d7e5f9", + "blockNumber": "0xdb13145", + "gasUsed": "0x4ba870", + "effectiveGasPrice": "0xd28a70", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0x811e4", + "l1BlockNumber": "0x13510a6" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x150fd8", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x12ec78cfe2faa12eec47fdf21d25ce2210c5fe59086054d476ec1b27ea30c8d3", + "transactionIndex": "0x7", + "blockHash": "0xc9f71b2b807bf734263357b9d7778e5ff2addb35493882380b62f0fa079f720f", + "blockNumber": "0xdb13165", + "gasUsed": "0x6765e", + "effectiveGasPrice": "0xccd580", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0xe7ad", + "l1BlockNumber": "0x13510a6" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xf108a", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xc73a23153176dbe22460e8e0e1564dfa06829a50c18d071be08e45ec3badefdd", + "transactionIndex": "0x5", + "blockHash": "0xd368565cf8c6d9784a575973103a2652db56a8f782874cfa4c09fcd977146b3c", + "blockNumber": "0xdb13185", + "gasUsed": "0x75cc5", + "effectiveGasPrice": "0xcae950", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0x10af5", + "l1BlockNumber": "0x13510a7" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x11e2a5", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x37bba227c218a22525118d8f9b8a863ac46ebbfd7858edb6506a1039ca45269f", + "transactionIndex": "0x3", + "blockHash": "0x311680e0d88b969f433b7e4801880afe83c173c6fb8733dbf42fb10a0bf9f887", + "blockNumber": "0xdb131a5", + "gasUsed": "0x6a9fa", + "effectiveGasPrice": "0xdbf0b0", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0xe7e4", + "l1BlockNumber": "0x13510a7" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x11234a", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x1551f34b1997c08f6afb939d3a425f361ca2b863a2baa20dac4baa4051b35471", + "transactionIndex": "0x3", + "blockHash": "0xbccd6827264e9117320f4fb66ab4f35036a1b0e63c58692f5aa88cf2aabce131", + "blockNumber": "0xdb131a9", + "gasUsed": "0x53182", + "effectiveGasPrice": "0xddb9b8", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0xb1a8", + "l1BlockNumber": "0x13510a8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x125655", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xceae3288dba246ffd7a2366af50e11ca7ad8dd3a7ab89e12044a134b4474783f", + "transactionIndex": "0x4", + "blockHash": "0xf19afb8d77577cb769c28386fdf15bb983d9d30281ba411efd12ed1985412e99", + "blockNumber": "0xdb131ac", + "gasUsed": "0x78228", + "effectiveGasPrice": "0xde2718", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0x10614", + "l1BlockNumber": "0x13510a8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xd62fe", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xa9dfb2ef47f3d790239af73579f1ac4e93c0a6cfc67a7907232d859ed5d51c91", + "transactionIndex": "0x2", + "blockHash": "0x035aad6113452169b3e69461c50b03700efcabcaed243b8fa93bcedfdf058434", + "blockNumber": "0xdb131b0", + "gasUsed": "0x7fd9a", + "effectiveGasPrice": "0xde6980", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0x103af", + "l1BlockNumber": "0x13510a8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x13c034", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xe99ba1894b63c71293772c9348540dba0d82f7e79b2ccd1c8998b2a78a015ec2", + "transactionIndex": "0x6", + "blockHash": "0x35928407c07319e78476e5138ad3790a7654c0a3a1c06005a0fddd1724634f19", + "blockNumber": "0xdb131b4", + "gasUsed": "0x7f6b5", + "effectiveGasPrice": "0xde5dc8", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0x1093f", + "l1BlockNumber": "0x13510a8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x71210", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x4c25e82f011255811f5b3ed8f9199e2b8c644f9d2cae03471180fe326c001f8f", + "transactionIndex": "0x3", + "blockHash": "0xd50b4c907a38aef9e27eff2ffdbc823eb92c57e4a655eeb51b5b62098d8f8c01", + "blockNumber": "0xdb131b8", + "gasUsed": "0x56224", + "effectiveGasPrice": "0xdfb970", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0xbe9a", + "l1BlockNumber": "0x13510a8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x528de", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x700b18b1dc06fb9638f7b4dae5754b88e7f479a6fc34dc36b95c3ab049124041", + "transactionIndex": "0x1", + "blockHash": "0x93bf5b752ed364d6fda136d247f6ba339600e0d4285336c65ee46fa7580cfb49", + "blockNumber": "0xdb131bc", + "gasUsed": "0x528de", + "effectiveGasPrice": "0xdf4058", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0xbe70", + "l1BlockNumber": "0x13510a8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x60dae", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x8eb960a412bac4568a560de045590f3eb23e9d412676721850b53b1bb1f68297", + "transactionIndex": "0x2", + "blockHash": "0x37171e1d6560542d1b5f2e68e71f5267f1f2709302480d4690cb92a0c4d15f16", + "blockNumber": "0xdb131dc", + "gasUsed": "0x534bf", + "effectiveGasPrice": "0xe2d268", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0xb905", + "l1BlockNumber": "0x13510a8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x52ba5", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x827802bb0f6622dd66d57de040c633e6f678b7843c8835e6137d0f2c8f03f7b4", + "transactionIndex": "0x1", + "blockHash": "0xade1486f7dd5253caeb82a55a03f9e382d2104d141980904aefa42d8b35fb8d9", + "blockNumber": "0xdb13218", + "gasUsed": "0x52ba5", + "effectiveGasPrice": "0xdebb88", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0xb0db", + "l1BlockNumber": "0x13510a9" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x42466", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xd851c91e994de7a8f91e28b25cd3ce117636a3d4301999ffd212fc626ab6212e", + "transactionIndex": "0x1", + "blockHash": "0xe467b6083831fa99897dc312284147f54c347992813eaa09f4b8663793a601da", + "blockNumber": "0xdb1321c", + "gasUsed": "0x42466", + "effectiveGasPrice": "0xdd6f80", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "gasUsedForL1": "0x991a", + "l1BlockNumber": "0x13510a9" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1720358427, + "chain": 42161, + "commit": null +} \ No newline at end of file diff --git a/broadcast/DeployEnvironmentSetUp.s.sol/59144/run-1720356824.json b/broadcast/DeployEnvironmentSetUp.s.sol/59144/run-1720356824.json new file mode 100644 index 0000000..1962eff --- /dev/null +++ b/broadcast/DeployEnvironmentSetUp.s.sol/59144/run-1720356824.json @@ -0,0 +1,673 @@ +{ + "transactions": [ + { + "hash": "0xc401aa79e52a75ffe318ff1de2f04fc1cb5fa12fafbe141eed57f86463e8c668", + "transactionType": "CREATE2", + "contractName": "DelegationManager", + "contractAddress": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "function": null, + "arguments": [ + "0xB0403B32f54d0Bd752113f4009e8B534C6669f44" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x2e52b2", + "value": "0x0", + "input": "0x44656c654761746f7200000000000000000000000000000000000000000000006101606040523480156200001257600080fd5b50604051620029e7380380620029e7833981016040819052620000359162000384565b60408051808201825260118152702232b632b3b0ba34b7b726b0b730b3b2b960791b602080830191909152825180840190935260018352603160f81b9083015290826001600160a01b038116620000a757604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b620000b28162000204565b506001805460ff60a01b19169055620000cd82600262000222565b61012052620000de81600362000222565b61014052815160208084019190912060e052815190820120610100524660a0526200015b60e0516101005160408051600080516020620029c783398151915260208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526000620001706200025b565b9050306001600160a01b0316817f04a46d9007577c7ff1e513b900545162ec25d25991ae3dc60cf26ec01a84806d604051806040016040528060118152602001702232b632b3b0ba34b7b726b0b730b3b2b960791b815250604051806040016040528060018152602001603160f81b81525046604051620001f493929190620003fe565b60405180910390a35050620005e5565b600180546001600160a01b03191690556200021f81620002f1565b50565b600060208351101562000242576200023a8362000341565b905062000255565b816200024f8482620004df565b5060ff90505b92915050565b600060c0516001600160a01b0316306001600160a01b031614801562000282575060a05146145b156200028f575060805190565b620002ec60e0516101005160408051600080516020620029c783398151915260208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b905090565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080829050601f815111156200036f578260405163305a27a960e01b81526004016200009e9190620005ab565b80516200037c82620005c0565b179392505050565b6000602082840312156200039757600080fd5b81516001600160a01b0381168114620003af57600080fd5b9392505050565b6000815180845260005b81811015620003de57602081850181015186830182015201620003c0565b506000602082860101526020601f19601f83011685010191505092915050565b606081526000620004136060830186620003b6565b8281036020840152620004278186620003b6565b915050826040830152949350505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200046357607f821691505b6020821081036200048457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004da576000816000526020600020601f850160051c81016020861015620004b55750805b601f850160051c820191505b81811015620004d657828155600101620004c1565b5050505b505050565b81516001600160401b03811115620004fb57620004fb62000438565b62000513816200050c84546200044e565b846200048a565b602080601f8311600181146200054b5760008415620005325750858301515b600019600386901b1c1916600185901b178555620004d6565b600085815260208120601f198616915b828110156200057c578886015182559484019460019091019084016200055b565b50858210156200059b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602081526000620003af6020830184620003b6565b80516020808301519190811015620004845760001960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516123876200064060003960006113bb0152600061138e015260006112f3015260006112cb01526000611226015260006112500152600061127a01526123876000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80637fade287116100b8578063a3f4df7e1161007c578063a3f4df7e1461028e578063acb8cc49146102cb578063e1520f54146102eb578063e30c3978146102fe578063f2fde38b1461030f578063ffa1ad741461032257600080fd5b80637fade2871461023f57806383ebb771146102525780638456cb591461025a57806384b0196e146102625780638da5cb5b1461027d57600080fd5b806358909ebc1161010a57806358909ebc146101c65780635c975abb146101e75780635daa6539146101f9578063661346071461021c578063715018a61461022f57806379ba50971461023757600080fd5b80631b13cac2146101475780632d40d052146101635780633ed01015146101965780633f4ba83a146101ab57806349934047146101b3575b600080fd5b61015060001981565b6040519081526020015b60405180910390f35b6101866101713660046118c7565b60056020526000908152604090205460ff1681565b604051901515815260200161015a565b6101a96101a43660046118e0565b610346565b005b6101a9610440565b6101a96101c13660046118e0565b610452565b6101cf610a1181565b6040516001600160a01b03909116815260200161015a565b600154600160a01b900460ff16610186565b6101866102073660046118c7565b60046020526000908152604090205460ff1681565b61015061022a3660046118e0565b610542565b6101a961055b565b6101a961056d565b6101a961024d3660046118e0565b6105b6565b6101506106a7565b6101a96106b6565b61026a6106c6565b60405161015a9796959493929190611967565b6000546001600160a01b03166101cf565b6102be604051806040016040528060118152602001702232b632b3b0ba34b7b726b0b730b3b2b960791b81525081565b60405161015a9190611a00565b6102be604051806040016040528060018152602001603160f81b81525081565b6101a96102f9366004611a13565b61070c565b6001546001600160a01b03166101cf565b6101a961031d366004611ac9565b611072565b6102be604051806040016040528060058152602001640312e302e360dc1b81525081565b6103566040820160208301611ac9565b6001600160a01b038116331461037f5760405163b9f0f17160e01b815260040160405180910390fd5b600061038a83610542565b60008181526005602052604090205490915060ff166103bc57604051637952fbad60e11b815260040160405180910390fd5b6000818152600560209081526040909120805460ff191690556103e190840184611ac9565b6001600160a01b03166103fa6040850160208601611ac9565b6001600160a01b0316827f3feadce88fc1b49db633a56fd5307ed6ee18734df83bcc4011daa720c9cd95f1866040516104339190611c18565b60405180910390a4505050565b6104486110e3565b610450611110565b565b6104626040820160208301611ac9565b6001600160a01b038116331461048b5760405163b9f0f17160e01b815260040160405180910390fd5b600061049683610542565b60008181526005602052604090205490915060ff16156104c857604051625ecddb60e01b815260040160405180910390fd5b6000818152600560209081526040909120805460ff191660011790556104f090840184611ac9565b6001600160a01b03166105096040850160208601611ac9565b6001600160a01b0316827fea589ba9473ee1fe77d352c7ed919747715a5d22931b972de9b02a907c66d5dd866040516104339190611c18565b600061055561055083611fae565b611165565b92915050565b6105636110e3565b6104506000611200565b60015433906001600160a01b031681146105aa5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b6105b381611200565b50565b6105c66040820160208301611ac9565b6001600160a01b03811633146105ef5760405163b9f0f17160e01b815260040160405180910390fd5b60006105fa83610542565b60008181526004602052604090205490915060ff161561062d5760405163119b4fd360e11b815260040160405180910390fd5b6000818152600460209081526040909120805460ff1916600117905561065590840184611ac9565b6001600160a01b031661066e6040850160208601611ac9565b6001600160a01b0316827fb9b56ecd70a93a7fcb54a1072d6a9c7ff488f46d6c656bb0a0fa453924658704866040516104339190611c18565b60006106b1611219565b905090565b6106be6110e3565b610450611344565b6000606080600080600060606106da611387565b6106e26113b4565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6107146113e1565b600061072283850185611fba565b905080516000036107465760405163efe957cf60e01b815260040160405180910390fd5b600081516001600160401b0381111561076157610761611ce9565b60405190808252806020026020018201604052801561078a578160200160208202803683370190505b5090506107db6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600080191681526020016060815260200160008152602001606081525090565b336001600160a01b0316836000815181106107f8576107f861206a565b6020026020010151600001516001600160a01b03161415801561084d5750610a116001600160a01b0316836000815181106108355761083561206a565b6020026020010151600001516001600160a01b031614155b1561086b57604051632d618d8160e21b815260040160405180910390fd5b60005b8351811015610a98578381815181106108895761088961206a565b6020026020010151915061089c82611165565b8382815181106108ae576108ae61206a565b6020026020010181815250508160a001515160000361091d57600460008483815181106108dd576108dd61206a565b60209081029190910181015182528101919091526040016000205460ff166109185760405163a9e649e960e01b815260040160405180910390fd5b610a90565b60208201516001600160a01b0381163b6000036109c157600061098761097d6109446106a7565b8786815181106109565761095661206a565b602002602001015160405161190160f01b8152600281019290925260228201526042902090565b8560a0015161140c565b9050816001600160a01b0316816001600160a01b0316146109bb57604051638baa579f60e01b815260040160405180910390fd5b50610a8e565b60006109e06109ce6106a7565b8685815181106109565761095661206a565b60a0850151604051630b135d3f60e11b81529192506000916001600160a01b03851691631626ba7e91610a17918691600401612080565b602060405180830381865afa158015610a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5891906120a1565b6001600160e01b0319169050630b135d3f60e11b8114610a8b57604051638baa579f60e01b815260040160405180910390fd5b50505b505b60010161086e565b5060005b8351811015610c585760056000848381518110610abb57610abb61206a565b60209081029190910181015182528101919091526040016000205460ff1615610af7576040516302dd502960e11b815260040160405180910390fd5b60018451610b0591906120e1565b8114610c0e5782610b178260016120f4565b81518110610b2757610b2761206a565b6020026020010151848281518110610b4157610b4161206a565b60200260200101516040015114610b6b57604051636f6a1b8760e11b815260040160405180910390fd5b600084610b798360016120f4565b81518110610b8957610b8961206a565b6020026020010151600001519050610a116001600160a01b0316816001600160a01b031614158015610bea5750806001600160a01b0316858381518110610bd257610bd261206a565b6020026020010151602001516001600160a01b031614155b15610c0857604051632d618d8160e21b815260040160405180910390fd5b50610c50565b60001960001b848281518110610c2657610c2661206a565b60200260200101516040015114610c5057604051636f6a1b8760e11b815260040160405180910390fd5b600101610a9c565b5060005b8351811015610db8576000848281518110610c7957610c7961206a565b60200260200101516060015190506000848381518110610c9b57610c9b61206a565b602002602001015190506000868481518110610cb957610cb961206a565b602002602001015160200151905060008351905060005b81811015610da8576000858281518110610cec57610cec61206a565b6020026020010151600001519050806001600160a01b0316639751a83d878481518110610d1b57610d1b61206a565b602002602001015160200151888581518110610d3957610d3961206a565b6020026020010151604001518e8989336040518763ffffffff1660e01b8152600401610d6a96959493929190612152565b600060405180830381600087803b158015610d8457600080fd5b505af1158015610d98573d6000803e3d6000fd5b5050505050806001019050610cd0565b5050505050806001019050610c5c565b508260018451610dc891906120e1565b81518110610dd857610dd861206a565b6020026020010151602001516001600160a01b03166326f0aef7856040518263ffffffff1660e01b8152600401610e0f91906121b4565b600060405180830381600087803b158015610e2957600080fd5b505af1158015610e3d573d6000803e3d6000fd5b505084519150505b8015610fc657600084610e596001846120e1565b81518110610e6957610e6961206a565b6020026020010151606001519050600084600184610e8791906120e1565b81518110610e9757610e9761206a565b60200260200101519050600086600185610eb191906120e1565b81518110610ec157610ec161206a565b602002602001015160200151905060008351905060005b81811015610fb0576000858281518110610ef457610ef461206a565b6020026020010151600001519050806001600160a01b031663de723eeb878481518110610f2357610f2361206a565b602002602001015160200151888581518110610f4157610f4161206a565b6020026020010151604001518e8989336040518763ffffffff1660e01b8152600401610f7296959493929190612152565b600060405180830381600087803b158015610f8c57600080fd5b505af1158015610fa0573d6000803e3d6000fd5b5050505050806001019050610ed8565b505050505080610fbf906121c7565b9050610e45565b5060005b835181101561106957336001600160a01b03168460018651610fec91906120e1565b81518110610ffc57610ffc61206a565b6020026020010151602001516001600160a01b03167f40dadaa36c6c2e3d7317e24757451ffb2d603d875f0ad5e92c5dd156573b18738684815181106110445761104461206a565b602002602001015160405161105991906121de565b60405180910390a3600101610fca565b50505050505050565b61107a6110e3565b600180546001600160a01b0383166001600160a01b031990911681179091556110ab6000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000546001600160a01b031633146104505760405163118cdaa760e01b81523360048201526024016105a1565b611118611436565b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000807f88c1d2ecf185adf710588203a5f263f0ff61be0d33da39792cde19ba9aa4331e8360000151846020015185604001516111a58760600151611460565b6080808901516040805160208101989098526001600160a01b03968716908801529490931660608601529184015260a083015260c082015260e0015b60408051601f1981840301815291905280516020909101209392505050565b600180546001600160a01b03191690556105b38161152b565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561127257507f000000000000000000000000000000000000000000000000000000000000000046145b1561129c57507f000000000000000000000000000000000000000000000000000000000000000090565b6106b1604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b61134c6113e1565b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586111483390565b60606106b17f0000000000000000000000000000000000000000000000000000000000000000600261157b565b60606106b17f0000000000000000000000000000000000000000000000000000000000000000600361157b565b600154600160a01b900460ff16156104505760405163d93c066560e01b815260040160405180910390fd5b60008060008061141c8686611626565b92509250925061142c8282611673565b5090949350505050565b600154600160a01b900460ff1661045057604051638dfc202b60e01b815260040160405180910390fd5b60008082516001600160401b0381111561147c5761147c611ce9565b6040519080825280602002602001820160405280156114a5578160200160208202803683370190505b50905060005b83518110156114fb576114d68482815181106114c9576114c961206a565b6020026020010151611730565b8282815181106114e8576114e861206a565b60209081029190910101526001016114ab565b508060405160200161150d91906122cb565b60405160208183030381529060405280519060200120915050919050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606060ff83146115955761158e83611791565b9050610555565b8180546115a190612301565b80601f01602080910402602001604051908101604052809291908181526020018280546115cd90612301565b801561161a5780601f106115ef5761010080835404028352916020019161161a565b820191906000526020600020905b8154815290600101906020018083116115fd57829003601f168201915b50505050509050610555565b600080600083516041036116605760208401516040850151606086015160001a611652888285856117d0565b95509550955050505061166c565b50508151600091506002905b9250925092565b60008260038111156116875761168761233b565b03611690575050565b60018260038111156116a4576116a461233b565b036116c25760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156116d6576116d661233b565b036116f75760405163fce698f760e01b8152600481018290526024016105a1565b600382600381111561170b5761170b61233b565b0361172c576040516335e2f38360e21b8152600481018290526024016105a1565b5050565b6000807f80ad7e1b04ee6d994a125f4714ca0720908bd80ed16063ec8aee4b88e9253e2d83600001518460200151805190602001206040516020016111e1939291909283526001600160a01b03919091166020830152604082015260600190565b6060600061179e8361189f565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561180b5750600091506003905082611895565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561185f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661188b57506000925060019150829050611895565b9250600091508190505b9450945094915050565b600060ff8216601f81111561055557604051632cd44ac360e21b815260040160405180910390fd5b6000602082840312156118d957600080fd5b5035919050565b6000602082840312156118f257600080fd5b81356001600160401b0381111561190857600080fd5b820160c0818503121561191a57600080fd5b9392505050565b6000815180845260005b818110156119475760208185018101518683018201520161192b565b506000602082860101526020601f19601f83011685010191505092915050565b60ff60f81b881681526000602060e0602084015261198860e084018a611921565b838103604085015261199a818a611921565b606085018990526001600160a01b038816608086015260a0850187905284810360c08601528551808252602080880193509091019060005b818110156119ee578351835292840192918401916001016119d2565b50909c9b505050505050505050505050565b60208152600061191a6020830184611921565b600080600060408486031215611a2857600080fd5b83356001600160401b0380821115611a3f57600080fd5b818601915086601f830112611a5357600080fd5b813581811115611a6257600080fd5b876020828501011115611a7457600080fd5b602092830195509350908501359080821115611a8f57600080fd5b50840160608187031215611aa257600080fd5b809150509250925092565b80356001600160a01b0381168114611ac457600080fd5b919050565b600060208284031215611adb57600080fd5b61191a82611aad565b6000808335601e19843603018112611afb57600080fd5b83016020810192503590506001600160401b03811115611b1a57600080fd5b803603821315611b2957600080fd5b9250929050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b88811015611c0a57858403601f19018a52823536899003605e19018112611b98578283fd5b880160606001600160a01b03611bad83611aad565b168652611bbc87830183611ae4565b8289890152611bce8389018284611b30565b925050506040611be081840184611ae4565b935087830382890152611bf4838583611b30565b9d89019d97505050938601935050600101611b73565b509198975050505050505050565b6020815260006001600160a01b0380611c3085611aad565b16602084015280611c4360208601611aad565b16604084015250604083013560608301526060830135601e19843603018112611c6b57600080fd5b83016020810190356001600160401b03811115611c8757600080fd5b8060051b3603821315611c9957600080fd5b60c06080850152611cae60e085018284611b59565b915050608084013560a0840152611cc860a0850185611ae4565b848303601f190160c0860152611cdf838284611b30565b9695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715611d2157611d21611ce9565b60405290565b60405160c081016001600160401b0381118282101715611d2157611d21611ce9565b604051601f8201601f191681016001600160401b0381118282101715611d7157611d71611ce9565b604052919050565b60006001600160401b03821115611d9257611d92611ce9565b5060051b60200190565b600082601f830112611dad57600080fd5b81356001600160401b03811115611dc657611dc6611ce9565b611dd9601f8201601f1916602001611d49565b818152846020838601011115611dee57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f830112611e1c57600080fd5b81356020611e31611e2c83611d79565b611d49565b82815260059290921b84018101918181019086841115611e5057600080fd5b8286015b84811015611eff5780356001600160401b0380821115611e745760008081fd5b908801906060828b03601f1901811315611e8e5760008081fd5b611e96611cff565b611ea1888501611aad565b815260408085013584811115611eb75760008081fd5b611ec58e8b83890101611d9c565b838b015250918401359183831115611edd5760008081fd5b611eeb8d8a85880101611d9c565b908201528652505050918301918301611e54565b509695505050505050565b600060c08284031215611f1c57600080fd5b611f24611d27565b9050611f2f82611aad565b8152611f3d60208301611aad565b60208201526040820135604082015260608201356001600160401b0380821115611f6657600080fd5b611f7285838601611e0b565b60608401526080840135608084015260a0840135915080821115611f9557600080fd5b50611fa284828501611d9c565b60a08301525092915050565b60006105553683611f0a565b60006020808385031215611fcd57600080fd5b82356001600160401b0380821115611fe457600080fd5b818501915085601f830112611ff857600080fd5b8135612006611e2c82611d79565b81815260059190911b8301840190848101908883111561202557600080fd5b8585015b8381101561205d578035858111156120415760008081fd5b61204f8b89838a0101611f0a565b845250918601918601612029565b5098975050505050505050565b634e487b7160e01b600052603260045260246000fd5b8281526040602082015260006120996040830184611921565b949350505050565b6000602082840312156120b357600080fd5b81516001600160e01b03198116811461191a57600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610555576105556120cb565b80820180821115610555576105556120cb565b6001600160a01b0361211882611aad565b1682526020810135602083015260006121346040830183611ae4565b60606040860152612149606086018284611b30565b95945050505050565b60c08152600061216560c0830189611921565b82810360208401526121778189611921565b9050828103604084015261218b8188612107565b606084019690965250506001600160a01b039283166080820152911660a0909101529392505050565b60208152600061191a6020830184612107565b6000816121d6576121d66120cb565b506000190190565b602080825282516001600160a01b0390811683830152838201518116604080850191909152808501516060808601919091528086015160c06080870152805160e0870181905260009594610100600583901b8901810195919493870193919290890190885b8181101561229d5760ff198b8903018352855187815116895289810151858b8b0152612271868b0182611921565b918701518a83038b8901529190506122898183611921565b995050509488019491880191600101612243565b50505050505050608085015160a085015260a08501519150601f198482030160c08501526121498183611921565b815160009082906020808601845b838110156122f5578151855293820193908201906001016122d9565b50929695505050505050565b600181811c9082168061231557607f821691505b60208210810361233557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052602160045260246000fdfea26469706673582212206702181458ece90d9cf27649387478caa2ed36ffd86ba70b239c4be34106280764736f6c634300081700338b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "nonce": "0x0", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xfd3fd79c2ab17cfeb1be4d2cfcb9ce9ee1fed331d029a564bc96192fbbdc2bda", + "transactionType": "CREATE2", + "contractName": "MultiSigDeleGator", + "contractAddress": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "function": null, + "arguments": [ + "0xbe4138886cB096bDC1B930F2f0ca7892AA234D78", + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x4162a1", + "value": "0x0", + "input": "0x44656c654761746f72000000000000000000000000000000000000000000000060e0604052306080523480156200001557600080fd5b506040516200396338038062003963833981016040819052620000389162000208565b8181620000446200013e565b6001600160a01b0380831660a081905290821660c0526040517fb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d90600090a26040516001600160a01b038216907fee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a9990600090a250506000197fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c0281905560408051918252517fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c00917f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d03919081900360200190a150505062000247565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156200018f5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001ef5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b0381168114620001ef57600080fd5b600080604083850312156200021c57600080fd5b82516200022981620001f2565b60208401519092506200023c81620001f2565b809150509250929050565b60805160a05160c0516136216200034260003960008181610633015281816108a001528181610b0001528181610bbb01528181610c3c01528181610cba01528181610e1f01528181610ed401528181610f5b015281816110b9015281816111f9015281816112ac0152818161131e0152818161138901528181611521015281816115b4015281816115f6015281816116ec015281816117ca015281816119e0015261240a01526000818161077201528181610b6601528181610d1d01528181610da001528181610e8201528181611130015281816113ec015261174f015260008181611b8201528181611bab015261211901526136216000f3fe60806040526004361061024a5760003560e01c80637df73e2711610139578063bc197c81116100b6578063e3d9109f1161007a578063e3d9109f1461070c578063e75235b81461072c578063ea4d3c9b14610760578063eb12d61e14610794578063f23a6e61146107b4578063ffa1ad74146107d457600080fd5b8063bc197c8114610682578063c399ec88146106a2578063d087d288146106b7578063d7d7442f146106cc578063e1520f54146106ec57600080fd5b8063a24c8f32116100fd578063a24c8f32146105a3578063aaf10f42146105b6578063ad3cb1cc146105e3578063b0d691fe14610621578063b3c650151461065557600080fd5b80637df73e27146104d95780637f07bfdc1461051f5780637fade2871461053f57806394cf795e1461055f578063a0c1deb41461058157600080fd5b80634891161f116101c75780635c1c6dcd1161018b5780635c1c6dcd1461043957806360b5bb3f1461045957806365ee81d8146104795780636af1f3991461049957806378979a80146104b957600080fd5b80634891161f146103d457806349934047146103e95780634a58db19146104095780634f1ef2861461041157806352d1902d1461042457600080fd5b806326f0aef71161020e57806326f0aef71461033457806334fcd5be146103545780633e1b0812146103745780633ed0101514610394578063445140b8146103b457600080fd5b806301ffc9a7146102565780630e316ab71461028b578063150b7a02146102ad5780631626ba7e146102e657806319822f7c1461030657600080fd5b3661025157005b600080fd5b34801561026257600080fd5b506102766102713660046128f4565b610805565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102ab6102a6366004612933565b610895565b005b3480156102b957600080fd5b506102cd6102c8366004612a05565b610ab9565b6040516001600160e01b03199091168152602001610282565b3480156102f257600080fd5b506102cd610301366004612ab8565b610ad4565b34801561031257600080fd5b50610326610321366004612b03565b610af3565b604051908152602001610282565b34801561034057600080fd5b506102ab61034f366004612b6e565b610b5b565b34801561036057600080fd5b506102ab61036f366004612bee565b610bb0565b34801561038057600080fd5b5061032661038f366004612c2f565b610c15565b3480156103a057600080fd5b506102ab6103af366004612c58565b610caf565b3480156103c057600080fd5b506102766103cf366004612c92565b610d87565b3480156103e057600080fd5b50610326601e81565b3480156103f557600080fd5b506102ab610404366004612c58565b610e14565b6102ab610eb7565b6102ab61041f366004612cab565b610f21565b34801561043057600080fd5b50610326610f33565b34801561044557600080fd5b506102ab610454366004612b6e565b610f50565b34801561046557600080fd5b506102ab610474366004612cfa565b610f99565b34801561048557600080fd5b506102ab610494366004612d53565b6110ae565b3480156104a557600080fd5b506102766104b4366004612c92565b611117565b3480156104c557600080fd5b506102ab6104d4366004612db1565b611167565b3480156104e557600080fd5b506102766104f4366004612933565b6001600160a01b031660009081526000805160206135ac833981519152602052604090205460ff1690565b34801561052b57600080fd5b506102ab61053a366004612e2d565b6112a1565b34801561054b57600080fd5b506102ab61055a366004612c58565b61137e565b34801561056b57600080fd5b50610574611421565b6040516102829190612e59565b34801561058d57600080fd5b5060008051602061358c83398151915254610326565b6102ab6105b1366004612cab565b610f29565b3480156105c257600080fd5b506105cb611494565b6040516001600160a01b039091168152602001610282565b3480156105ef57600080fd5b50610614604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102829190612ef6565b34801561062d57600080fd5b506105cb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561066157600080fd5b5061066a6114ba565b6040516001600160401b039091168152602001610282565b34801561068e57600080fd5b506102cd61069d366004612f88565b6114ed565b3480156106ae57600080fd5b50610326611509565b3480156106c357600080fd5b50610326611595565b3480156106d857600080fd5b506102ab6106e7366004612c92565b6115eb565b3480156106f857600080fd5b506102ab610707366004613035565b6116e1565b34801561071857600080fd5b506102ab61072736600461309d565b6117bf565b34801561073857600080fd5b507fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c0254610326565b34801561076c57600080fd5b506105cb7f000000000000000000000000000000000000000000000000000000000000000081565b3480156107a057600080fd5b506102ab6107af366004612933565b6119d5565b3480156107c057600080fd5b506102cd6107cf3660046130d6565b611b5b565b3480156107e057600080fd5b50610614604051806040016040528060058152602001640312e302e360dc1b81525081565b600061080f611b77565b6001600160e01b031982166326f0aef760e01b148061083e57506001600160e01b03198216630a85bd0160e11b145b8061085957506001600160e01b03198216630271189760e51b145b8061087457506001600160e01b031982166301ffc9a760e01b145b8061088f57506001600160e01b03198216630b135d3f60e11b145b92915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906108ce5750333014155b156108ec57604051630796d94560e01b815260040160405180910390fd5b6001600160a01b03811660009081526000805160206135ac833981519152602081905260409091205460ff166109355760405163da0357f760e01b815260040160405180910390fd5b60018101546002820154810361095e576040516361774dcf60e11b815260040160405180910390fd5b60005b61096c600183613154565b811015610a3657836001600160a01b031683600101828154811061099257610992613167565b6000918252602090912001546001600160a01b031603610a2e57826001016001836109bd9190613154565b815481106109cd576109cd613167565b6000918252602090912001546001840180546001600160a01b0390921691839081106109fb576109fb613167565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610a36565b600101610961565b5081600101805480610a4a57610a4a61317d565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038516808352908490526040808320805460ff191690555190917fb0073c14ccc2332b5b461c0d2fb94366f38d3954a82745e74827aa0811c9f98191a2505050565b6000610ac3611b77565b50630a85bd0160e11b949350505050565b6000610ade611b77565b610ae9848484611c1e565b90505b9392505050565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b3e57604051636b31ba1560e11b815260040160405180910390fd5b610b46611b77565b610b508484611dbd565b9050610aec82611e33565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ba457604051630692ce8160e21b815260040160405180910390fd5b610bad81611eca565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610be95750333014155b15610c0757604051630796d94560e01b815260040160405180910390fd5b610c118282611fd4565b5050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610c8b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088f9190613193565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610ce85750333014155b15610d0657604051630796d94560e01b815260040160405180910390fd5b604051633ed0101560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633ed0101590610d529084906004016132db565b600060405180830381600087803b158015610d6c57600080fd5b505af1158015610d80573d6000803e3d6000fd5b5050505050565b6040516316a0682960e11b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632d40d052906024015b602060405180830381865afa158015610df0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088f91906133b6565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610e4d5750333014155b15610e6b57604051630796d94560e01b815260040160405180910390fd5b604051634993404760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634993404790610d529084906004016132db565b610ebf611b77565b60405163b760faf960e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b158015610d6c57600080fd5b610f29612036565b610c1182826120f3565b6000610f3d61210e565b506000805160206135cc83398151915290565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ba457604051636b31ba1560e11b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610fde5750825b90506000826001600160401b03166001148015610ffa5750303b155b905081158015611008575080155b156110265760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561105057845460ff60401b1916600160401b1785555b61105d8888886000612157565b83156110a457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2906020015b60405180910390a15b5050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110e75750333014155b1561110557604051630796d94560e01b815260040160405180910390fd5b61111184848484612157565b50505050565b604051635daa653960e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635daa653990602401610dd3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054869190600160401b900460ff16806111af575080546001600160401b03808416911610155b156111cd5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906112275750333014155b1561124557604051630796d94560e01b815260040160405180910390fd5b61125186868686612157565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906112da5750333014155b156112f857604051630796d94560e01b815260040160405180910390fd5b60405163040b850f60e31b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561136257600080fd5b505af1158015611376573d6000803e3d6000fd5b505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906113b75750333014155b156113d557604051630796d94560e01b815260040160405180910390fd5b604051637fade28760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637fade28790610d529084906004016132db565b606060006000805160206135ac8339815191526001810180546040805160208084028201810190925282815293945083018282801561148957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161146b575b505050505091505090565b60006114b56000805160206135cc833981519152546001600160a01b031690565b905090565b60006114b57ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00546001600160401b031690565b60006114f7611b77565b5063bc197c8160e01b95945050505050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a08231906024015b602060405180830381865afa158015611571573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b59190613193565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401611554565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906116245750333014155b1561164257604051630796d94560e01b815260040160405180910390fd5b806000036116635760405163aabd5a0960e01b815260040160405180910390fd5b60008051602061358c833981519152546000805160206135ac833981519152908211156116a35760405163aabd5a0960e01b815260040160405180910390fd5b600281018290556040518281527f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d039060200160405180910390a15050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480159061171a5750333014155b1561173857604051630796d94560e01b815260040160405180910390fd5b60405163385483d560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e1520f5490611788908690869086906004016133d3565b600060405180830381600087803b1580156117a257600080fd5b505af11580156117b6573d6000803e3d6000fd5b50505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906117f85750333014155b1561181657604051630796d94560e01b815260040160405180910390fd5b6001600160a01b038116158061183557506001600160a01b0381163b15155b1561185357604051634501a91960e01b815260040160405180910390fd5b6001600160a01b03821660009081526000805160206135ac833981519152602081905260409091205460ff1661189c5760405163da0357f760e01b815260040160405180910390fd5b6001600160a01b03821660009081526020829052604090205460ff16156118d657604051631985f4ab60e31b815260040160405180910390fd5b600181015460005b8181101561197057846001600160a01b031683600101828154811061190557611905613167565b6000918252602090912001546001600160a01b031603611968578383600101828154811061193557611935613167565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550611970565b6001016118de565b506001600160a01b03808516600081815260208590526040808220805460ff199081169091559387168083528183208054909516600117909455517f53a7b6f060162826746b07f3ff5cc66b83afad3bc9a57c9f34d7802901c6e8299190a350505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590611a0e5750333014155b15611a2c57604051630796d94560e01b815260040160405180910390fd5b6001600160a01b0381161580611a4b57506001600160a01b0381163b15155b15611a6957604051634501a91960e01b815260040160405180910390fd5b60008051602061358c833981519152546000805160206135ac83398151915290601d1901611aaa57604051630dc92ed360e11b815260040160405180910390fd5b6001600160a01b03821660009081526020829052604090205460ff1615611ae457604051631985f4ab60e31b815260040160405180910390fd5b6001818101805480830182556000918252602080832090910180546001600160a01b0319166001600160a01b038716908117909155808352908490526040808320805460ff191690941790935591517f82b74755d483f0688b80354268454667c377a5684e64a4dbb6820fc11a6276d49190a25050565b6000611b65611b77565b5063f23a6e6160e01b95945050505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611bfe57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611bf26000805160206135cc833981519152546001600160a01b031690565b6001600160a01b031614155b15611c1c5760405163703e46dd60e11b815260040160405180910390fd5b565b7fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c02546000906000805160206135ac83398151915290611c5f9060419061343d565b8314611c7657506001600160e01b03199050610aec565b6000611c83604185613454565b600283015490915060008080805b85811015611da55760008a8a611ca860418561343d565b906041611cb6866001613476565b611cc0919061343d565b92611ccd93929190613489565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929350611d1192508e91508390506123d5565b9350846001600160a01b0316846001600160a01b0316111580611d4d57506001600160a01b03841660009081526020899052604090205460ff16155b15611d6b57506001600160e01b03199750610aec9650505050505050565b82611d75816134b3565b935050858310611d975750630b135d3f60e11b9750610aec9650505050505050565b509192508291600101611c91565b506001600160e01b03199a9950505050505050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c829052603c81208190611e0590611e006101008701876134cc565b611c1e565b90506374eca2c160e11b6001600160e01b0319821601611e2957600091505061088f565b5060019392505050565b8015610bad57604051600090339060001990849084818181858888f193505050503d8060008114611e80576040519150601f19603f3d011682016040523d82523d6000602084013e611e85565b606091505b505060408051848152821515602082015291925033917fa427c7d47f24d01b170779a7600b1d4c0d7cdbabaa0f19c4f0e6182053ffc931910160405180910390a25050565b600080611eda6020840184612933565b6001600160a01b03166020840135611ef560408601866134cc565b604051611f03929190613512565b60006040518083038185875af1925050503d8060008114611f40576040519150601f19603f3d011682016040523d82523d6000602084013e611f45565b606091505b509092509050611f586020840184612933565b6001600160a01b03167f74b56487625d598ffbf59a76c3b58fc1922f54afc86a075bad0c2a8aa05d2ad284602001358484604051611f9893929190613522565b60405180910390a281611fcf578051600003611fc75760405163764bbf1760e01b815260040160405180910390fd5b805181602001fd5b505050565b806000819003611ff757604051635fc74f2160e11b815260040160405180910390fd5b60005b818110156111115761202e84848381811061201757612017613167565b90506020028101906120299190613543565b611eca565b600101611ffa565b60008051602061358c833981519152546000805160206135ac8339815191529060005b818110156120b05782600001600084600101838154811061207c5761207c613167565b60009182526020808320909101546001600160a01b031683528201929092526040019020805460ff19169055600101612059565b506120bf6001830160006128c2565b6000600283018190556040517feb09d532980c3cc73dcad99b80e264204a667a54cbb7b63ec8d68dcb1c7096be9190a15050565b6120fb611b77565b612104826123ff565b610c118282612456565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c1c5760405163703e46dd60e11b815260040160405180910390fd5b60008051602061358c8339815191525483906000805160206135ac8339815191529060008461218f5761218a8285613476565b612191565b835b905085158061219f57508086115b156121bd5760405163aabd5a0960e01b815260040160405180910390fd5b601e8111156121df57604051630dc92ed360e11b815260040160405180910390fd5b84156122735760005b8281101561226457600084600101828154811061220757612207613167565b60009182526020808320909101546001600160a01b0316808352908790526040808320805460ff191690555190925082917fb0073c14ccc2332b5b461c0d2fb94366f38d3954a82745e74827aa0811c9f98191a2506001016121e8565b506122736001840160006128c2565b60005b8481101561239d57600089898381811061229257612292613167565b90506020020160208101906122a79190612933565b6001600160a01b03811660009081526020879052604090205490915060ff16156122e457604051631985f4ab60e31b815260040160405180910390fd5b6001600160a01b038116158061230357506001600160a01b0381163b15155b1561232157604051634501a91960e01b815260040160405180910390fd5b6001858101805480830182556000918252602080832090910180546001600160a01b0319166001600160a01b038616908117909155808352908890526040808320805460ff191690941790935591517f82b74755d483f0688b80354268454667c377a5684e64a4dbb6820fc11a6276d49190a250600101612276565b50600283018690556040518681527f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d039060200161109b565b6000806000806123e58686612518565b9250925092506123f58282612565565b5090949350505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906124385750333014155b15610bad57604051630796d94560e01b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156124b0575060408051601f3d908101601f191682019092526124ad91810190613193565b60015b6124dd57604051634c9c8ce360e01b81526001600160a01b03831660048201526024015b60405180910390fd5b6000805160206135cc833981519152811461250e57604051632a87526960e21b8152600481018290526024016124d4565b611fcf838361261e565b600080600083516041036125525760208401516040850151606086015160001a61254488828585612674565b95509550955050505061255e565b50508151600091506002905b9250925092565b600082600381111561257957612579613563565b03612582575050565b600182600381111561259657612596613563565b036125b45760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156125c8576125c8613563565b036125e95760405163fce698f760e01b8152600481018290526024016124d4565b60038260038111156125fd576125fd613563565b03610c11576040516335e2f38360e21b8152600481018290526024016124d4565b61262782612743565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561266c57611fcf82826127a8565b610c1161281e565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156126af5750600091506003905082612739565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612703573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661272f57506000925060019150829050612739565b9250600091508190505b9450945094915050565b806001600160a01b03163b60000361277957604051634c9c8ce360e01b81526001600160a01b03821660048201526024016124d4565b6000805160206135cc83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516127c59190613579565b600060405180830381855af49150503d8060008114612800576040519150601f19603f3d011682016040523d82523d6000602084013e612805565b606091505b509150915061281585838361283d565b95945050505050565b3415611c1c5760405163b398979f60e01b815260040160405180910390fd5b6060826128525761284d82612899565b610aec565b815115801561286957506001600160a01b0384163b155b1561289257604051639996b31560e01b81526001600160a01b03851660048201526024016124d4565b5080610aec565b8051156128a95780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825590600052602060002090810190610bad91905b808211156128f057600081556001016128dc565b5090565b60006020828403121561290657600080fd5b81356001600160e01b031981168114610aec57600080fd5b6001600160a01b0381168114610bad57600080fd5b60006020828403121561294557600080fd5b8135610aec8161291e565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561298e5761298e612950565b604052919050565b600082601f8301126129a757600080fd5b81356001600160401b038111156129c0576129c0612950565b6129d3601f8201601f1916602001612966565b8181528460208386010111156129e857600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215612a1b57600080fd5b8435612a268161291e565b93506020850135612a368161291e565b92506040850135915060608501356001600160401b03811115612a5857600080fd5b612a6487828801612996565b91505092959194509250565b60008083601f840112612a8257600080fd5b5081356001600160401b03811115612a9957600080fd5b602083019150836020828501011115612ab157600080fd5b9250929050565b600080600060408486031215612acd57600080fd5b8335925060208401356001600160401b03811115612aea57600080fd5b612af686828701612a70565b9497909650939450505050565b600080600060608486031215612b1857600080fd5b83356001600160401b03811115612b2e57600080fd5b84016101208187031215612b4157600080fd5b95602085013595506040909401359392505050565b600060608284031215612b6857600080fd5b50919050565b600060208284031215612b8057600080fd5b81356001600160401b03811115612b9657600080fd5b612ba284828501612b56565b949350505050565b60008083601f840112612bbc57600080fd5b5081356001600160401b03811115612bd357600080fd5b6020830191508360208260051b8501011115612ab157600080fd5b60008060208385031215612c0157600080fd5b82356001600160401b03811115612c1757600080fd5b612c2385828601612baa565b90969095509350505050565b600060208284031215612c4157600080fd5b81356001600160c01b0381168114610aec57600080fd5b600060208284031215612c6a57600080fd5b81356001600160401b03811115612c8057600080fd5b820160c08185031215610aec57600080fd5b600060208284031215612ca457600080fd5b5035919050565b60008060408385031215612cbe57600080fd5b8235612cc98161291e565b915060208301356001600160401b03811115612ce457600080fd5b612cf085828601612996565b9150509250929050565b600080600060408486031215612d0f57600080fd5b83356001600160401b03811115612d2557600080fd5b612d3186828701612baa565b909790965060209590950135949350505050565b8015158114610bad57600080fd5b60008060008060608587031215612d6957600080fd5b84356001600160401b03811115612d7f57600080fd5b612d8b87828801612baa565b909550935050602085013591506040850135612da681612d45565b939692955090935050565b600080600080600060808688031215612dc957600080fd5b85356001600160401b038082168214612de157600080fd5b90955060208701359080821115612df757600080fd5b50612e0488828901612baa565b909550935050604086013591506060860135612e1f81612d45565b809150509295509295909350565b60008060408385031215612e4057600080fd5b8235612e4b8161291e565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b81811015612e9a5783516001600160a01b031683529284019291840191600101612e75565b50909695505050505050565b60005b83811015612ec1578181015183820152602001612ea9565b50506000910152565b60008151808452612ee2816020860160208601612ea6565b601f01601f19169290920160200192915050565b602081526000610aec6020830184612eca565b600082601f830112612f1a57600080fd5b813560206001600160401b03821115612f3557612f35612950565b8160051b612f44828201612966565b9283528481018201928281019087851115612f5e57600080fd5b83870192505b84831015612f7d57823582529183019190830190612f64565b979650505050505050565b600080600080600060a08688031215612fa057600080fd5b8535612fab8161291e565b94506020860135612fbb8161291e565b935060408601356001600160401b0380821115612fd757600080fd5b612fe389838a01612f09565b94506060880135915080821115612ff957600080fd5b61300589838a01612f09565b9350608088013591508082111561301b57600080fd5b5061302888828901612996565b9150509295509295909350565b60008060006040848603121561304a57600080fd5b83356001600160401b038082111561306157600080fd5b61306d87838801612a70565b9095509350602086013591508082111561308657600080fd5b5061309386828701612b56565b9150509250925092565b600080604083850312156130b057600080fd5b82356130bb8161291e565b915060208301356130cb8161291e565b809150509250929050565b600080600080600060a086880312156130ee57600080fd5b85356130f98161291e565b945060208601356131098161291e565b9350604086013592506060860135915060808601356001600160401b0381111561313257600080fd5b61302888828901612996565b634e487b7160e01b600052601160045260246000fd5b8181038181111561088f5761088f61313e565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6000602082840312156131a557600080fd5b5051919050565b6000808335601e198436030181126131c357600080fd5b83016020810192503590506001600160401b038111156131e257600080fd5b803603821315612ab157600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b888110156132cd57858403601f19018a52823536899003605e19018112613259578283fd5b8801606081356132688161291e565b6001600160a01b0316865261327f828801836131ac565b828989015261329183890182846131f1565b9250505060406132a3818401846131ac565b9350878303828901526132b78385836131f1565b9d89019d97505050938601935050600101613234565b509198975050505050505050565b60208152600082356132ec8161291e565b6001600160a01b039081166020848101919091528401359061330d8261291e565b80821660408501525050604083013560608301526060830135601e1984360301811261333857600080fd5b83016020810190356001600160401b0381111561335457600080fd5b8060051b360382131561336657600080fd5b60c0608085015261337b60e08501828461321a565b915050608084013560a084015261339560a08501856131ac565b848303601f190160c08601526133ac8382846131f1565b9695505050505050565b6000602082840312156133c857600080fd5b8151610aec81612d45565b6040815260006133e76040830185876131f1565b828103602084015283356133fa8161291e565b6001600160a01b031681526020848101359082015261341c60408501856131ac565b606060408401526134316060840182846131f1565b98975050505050505050565b808202811582820484141761088f5761088f61313e565b60008261347157634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561088f5761088f61313e565b6000808585111561349957600080fd5b838611156134a657600080fd5b5050820193919092039150565b6000600182016134c5576134c561313e565b5060010190565b6000808335601e198436030181126134e357600080fd5b8301803591506001600160401b038211156134fd57600080fd5b602001915036819003821315612ab157600080fd5b8183823760009101908152919050565b83815282151560208201526060604082015260006128156060830184612eca565b60008235605e1983360301811261355957600080fd5b9190910192915050565b634e487b7160e01b600052602160045260246000fd5b60008251613559818460208701612ea656feb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c01b005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212207f3a1345dd207b3e6a7d8045651ded34698ad5d76b8ff402fdacf6337782f2f664736f6c63430008170033000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d780000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x1", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb193634c8a35853ca5a8dda2cd6f9c1ae1ab401f5022b6d7081fc672a26e6069", + "transactionType": "CREATE2", + "contractName": "HybridDeleGator", + "contractAddress": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "function": null, + "arguments": [ + "0xbe4138886cB096bDC1B930F2f0ca7892AA234D78", + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x62d183", + "value": "0x0", + "input": "0x44656c654761746f72000000000000000000000000000000000000000000000060e0604052306080523480156200001557600080fd5b50604051620051483803806200514883398101604081905262000038916200018b565b818162000044620000c1565b6001600160a01b0380831660a081905290821660c0526040517fb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d90600090a26040516001600160a01b038216907fee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a9990600090a250505050620001ca565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620001125760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001725780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b03811681146200017257600080fd5b600080604083850312156200019f57600080fd5b8251620001ac8162000175565b6020840151909250620001bf8162000175565b809150509250929050565b60805160a05160c051614e83620002c5600039600081816105e9015281816107f3015281816108a1015281816109c501528181610a4601528181610ac401528181610c2901528181610cde01528181610d6501528181610dfe01528181610eea01528181610fa50152818161101701528181611082015281816112c401528181611343015281816113c00152818161147f015281816116c4015281816117b501526124480152600081816107290152818161090701528181610b2701528181610baa01528181610c8c01528181610dbc015281816110e50152611727015260008181611a9b01528181611ac401526120b50152614e836000f3fe60806040526004361061023f5760003560e01c80637f07bfdc1161012e578063c399ec88116100ab578063e1520f541161006f578063e1520f54146106f7578063ea4d3c9b14610717578063f23a6e611461074b578063f2fde38b1461076b578063ffa1ad741461078b57600080fd5b8063c399ec8814610658578063c8561e731461066d578063d087d2881461068d578063d37aec92146106a2578063d5d33b55146106d757600080fd5b8063aaf10f42116100f2578063aaf10f4214610584578063ad3cb1cc14610599578063b0d691fe146105d7578063b3c650151461060b578063bc197c811461063857600080fd5b80637f07bfdc146104d25780637fade287146104f25780638da5cb5b146105125780638ebf953314610551578063a24c8f321461057157600080fd5b80633ed01015116101bc57806352d1902d1161018057806352d1902d146104485780635c1c6dcd1461045d5780636af1f3991461047d578063715018a61461049d57806378a68ecf146104b257600080fd5b80633ed01015146103cd578063445140b8146103ed578063499340471461040d5780634a58db191461042d5780634f1ef2861461043557600080fd5b80631c03010a116102035780631c03010a1461032957806326f0aef71461034b5780632ffeaad61461036b57806334fcd5be1461038d5780633e1b0812146103ad57600080fd5b806301ffc9a71461024b578063074feff314610280578063150b7a02146102a25780631626ba7e146102db57806319822f7c146102fb57600080fd5b3661024657005b600080fd5b34801561025757600080fd5b5061026b610266366004613e92565b6107bc565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102a061029b366004613f27565b6107e8565b005b3480156102ae57600080fd5b506102c26102bd366004614096565b610859565b6040516001600160e01b03199091168152602001610277565b3480156102e757600080fd5b506102c26102f6366004614142565b610875565b34801561030757600080fd5b5061031b61031636600461418d565b610894565b604051908152602001610277565b34801561033557600080fd5b50600080516020614dae8339815191525461031b565b34801561035757600080fd5b506102a06103663660046141f8565b6108fc565b34801561037757600080fd5b50610380610951565b604051610277919061422c565b34801561039957600080fd5b506102a06103a8366004614264565b6109ba565b3480156103b957600080fd5b5061031b6103c83660046142a5565b610a1f565b3480156103d957600080fd5b506102a06103e83660046142ce565b610ab9565b3480156103f957600080fd5b5061026b610408366004614308565b610b91565b34801561041957600080fd5b506102a06104283660046142ce565b610c1e565b6102a0610cc1565b6102a0610443366004614321565b610d2b565b34801561045457600080fd5b5061031b610d3d565b34801561046957600080fd5b506102a06104783660046141f8565b610d5a565b34801561048957600080fd5b5061026b610498366004614308565b610da3565b3480156104a957600080fd5b506102a0610df3565b3480156104be57600080fd5b506102a06104cd366004614389565b610e56565b3480156104de57600080fd5b506102a06104ed36600461445b565b610f9a565b3480156104fe57600080fd5b506102a061050d3660046142ce565b611077565b34801561051e57600080fd5b50600080516020614d8e833981519152546001600160a01b03165b6040516001600160a01b039091168152602001610277565b34801561055d57600080fd5b506102a061056c366004613f27565b61111a565b6102a061057f366004614321565b610d33565b34801561059057600080fd5b50610539611236565b3480156105a557600080fd5b506105ca604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161027791906144d7565b3480156105e357600080fd5b506105397f000000000000000000000000000000000000000000000000000000000000000081565b34801561061757600080fd5b5061062061125c565b6040516001600160401b039091168152602001610277565b34801561064457600080fd5b506102c2610653366004614569565b61128f565b34801561066457600080fd5b5061031b6112ac565b34801561067957600080fd5b506102a0610688366004614616565b611338565b34801561069957600080fd5b5061031b6113a1565b3480156106ae57600080fd5b506106c26106bd366004614666565b6113f7565b60408051928352602083019190915201610277565b3480156106e357600080fd5b506102a06106f2366004614666565b611474565b34801561070357600080fd5b506102a061071236600461469b565b6116b9565b34801561072357600080fd5b506105397f000000000000000000000000000000000000000000000000000000000000000081565b34801561075757600080fd5b506102c2610766366004614703565b61178e565b34801561077757600080fd5b506102a061078636600461476b565b6117aa565b34801561079757600080fd5b506105ca604051806040016040528060058152602001640312e302e360dc1b81525081565b60006107c78261180a565b806107e257506001600160e01b031982166307f5828d60e41b145b92915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906108215750333014155b1561083f57604051630796d94560e01b815260040160405180910390fd5b61085087878787878787600161189a565b50505050505050565b6000610863611a90565b50630a85bd0160e11b5b949350505050565b600061087f611a90565b61088a848484611b35565b90505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108df57604051636b31ba1560e11b815260040160405180910390fd5b6108e7611a90565b6108f18484611d59565b905061088d82611dcf565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094557604051630692ce8160e21b815260040160405180910390fd5b61094e81611e66565b50565b60606000600080516020614d8e833981519152600281018054604080516020808402820181019092528281529394508301828280156109af57602002820191906000526020600020905b81548152602001906001019080831161099b575b505050505091505090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906109f35750333014155b15610a1157604051630796d94560e01b815260040160405180910390fd5b610a1b8282611f70565b5050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610a95573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e29190614788565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610af25750333014155b15610b1057604051630796d94560e01b815260040160405180910390fd5b604051633ed0101560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633ed0101590610b5c9084906004016148d0565b600060405180830381600087803b158015610b7657600080fd5b505af1158015610b8a573d6000803e3d6000fd5b5050505050565b6040516316a0682960e11b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632d40d052906024015b602060405180830381865afa158015610bfa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e291906149ac565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610c575750333014155b15610c7557604051630796d94560e01b815260040160405180910390fd5b604051634993404760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634993404790610b5c9084906004016148d0565b610cc9611a90565b60405163b760faf960e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b158015610b7657600080fd5b610d33611fd2565b610a1b828261208f565b6000610d476120aa565b50600080516020614dee83398151915290565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094557604051636b31ba1560e11b815260040160405180910390fd5b604051635daa653960e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635daa653990602401610bdd565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610e2c5750333014155b15610e4a57604051630796d94560e01b815260040160405180910390fd5b610e5460006120f3565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460ff8b81169291600160401b90041680610ea0575080546001600160401b03808416911610155b15610ebe5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610f185750333014155b15610f3657604051630796d94560e01b815260040160405180910390fd5b610f468a8a8a8a8a8a8a8a61189a565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15050505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610fd35750333014155b15610ff157604051630796d94560e01b815260040160405180910390fd5b60405163040b850f60e31b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561105b57600080fd5b505af115801561106f573d6000803e3d6000fd5b505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110b05750333014155b156110ce57604051630796d94560e01b815260040160405180910390fd5b604051637fade28760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637fade28790610b5c9084906004016148d0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b031660008115801561115f5750825b90506000826001600160401b0316600114801561117b5750303b155b905081158015611189575080155b156111a75760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156111d157845460ff60401b1916600160401b1785555b6111e28c8c8c8c8c8c8c600061189a565b831561122857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b6000611257600080516020614dee833981519152546001600160a01b031690565b905090565b60006112577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00546001600160401b031690565b6000611299611a90565b5063bc197c8160e01b5b95945050505050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a08231906024015b602060405180830381865afa158015611314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112579190614788565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906113715750333014155b1561138f57604051630796d94560e01b815260040160405180910390fd5b61139b84848484612195565b50505050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a906044016112f7565b60008080600080516020614d8e8339815191529050600081600101600087876040516020016114279291906149c9565b60408051601f198184030181529181528151602092830120835282820193909352908201600020825180840190935280548084526001909101549290910182905297909650945050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906114ad5750333014155b156114cb57604051630796d94560e01b815260040160405180910390fd5b604051600080516020614d8e833981519152906000906114f190859085906020016149c9565b60408051601f19818403018152828252805160209182012060008181526001808801845290849020858501909452835480865293015491840182905293508115801561153b575080155b1561156157604051631a36430d60e31b8152600481018590526024015b60405180910390fd5b600285015460018114801561157e575085546001600160a01b0316155b1561159c5760405163c4c8547360e01b815260040160405180910390fd5b60005b6115aa6001836149ef565b81101561162f57858760020182815481106115c7576115c7614a02565b90600052602060002001540361162757600287016115e66001846149ef565b815481106115f6576115f6614a02565b906000526020600020015487600201828154811061161657611616614a02565b60009182526020909120015561162f565b60010161159f565b508560020180548061164357611643614a18565b60008281526020808220830160001990810183905590920190925586825260018881018252604080842084815590910192909255815185815290810184905286917facf0e8088062f44f734bbcb5223794fd8bb6f6db1c199cb6a72df119d002a71b910160405180910390a25050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906116f25750333014155b1561171057604051630796d94560e01b815260040160405180910390fd5b60405163385483d560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e1520f549061176090869086908690600401614a2e565b600060405180830381600087803b15801561177a57600080fd5b505af1158015610850573d6000803e3d6000fd5b6000611798611a90565b5063f23a6e6160e01b95945050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906117e35750333014155b1561180157604051630796d94560e01b815260040160405180910390fd5b61094e816120f3565b6000611814611a90565b6001600160e01b031982166326f0aef760e01b148061184357506001600160e01b03198216630a85bd0160e11b145b8061185e57506001600160e01b03198216630271189760e51b145b8061187957506001600160e01b031982166301ffc9a760e01b145b806107e2575050630b135d3f60e11b6001600160e01b03198216145b919050565b856001600160a01b0389161580156118b0575080155b80156118b95750815b156118d7576040516312da594d60e11b815260040160405180910390fd5b80851415806118e65750808314155b156119155760405163a297991b60e01b8152600481018290526024810186905260448101849052606401611558565b8115611a0a57600080516020614dae83398151915254600080516020614d8e833981519152908015611a075760005b818110156119f857600083600201828154811061196357611963614a02565b6000918252602080832090910154808352600180880180845260408086208151808301835281548152938101805485880190815286895293909652869055949093558051925193519194509284927facf0e8088062f44f734bbcb5223794fd8bb6f6db1c199cb6a72df119d002a71b926119e69290918252602082015260400190565b60405180910390a25050600101611944565b50611a07600283016000613e60565b50505b60005b81811015611a7b57611a73898983818110611a2a57611a2a614a02565b9050602002810190611a3c9190614a8c565b898985818110611a4e57611a4e614a02565b90506020020135888886818110611a6757611a67614a02565b90506020020135612195565b600101611a0d565b50611a85896120f3565b505050505050505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611b1757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611b0b600080516020614dee833981519152546001600160a01b031690565b6001600160a01b031614155b15610e545760405163703e46dd60e11b815260040160405180910390fd5b6000816041819003611bd257600080516020614d8e833981519152546001600160a01b03166001600160a01b0316611ba38686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061231292505050565b6001600160a01b031603611bc15750630b135d3f60e11b905061088d565b506001600160e01b0319905061088d565b6060811015611bec57506001600160e01b0319905061088d565b600080516020614d8e8339815191526000611c0a6020828789614ad2565b611c1391614afc565b600081815260018085016020908152604092839020835180850190945280548085529201549083015291925090158015611c4f57506020810151155b15611c6957506001600160e01b0319935061088d92505050565b836060148015611cbd5750611cbd8888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505085516020870151909250905061233c565b15611cd65750630b135d3f60e11b935061088d92505050565b83606014158015611d2b5750611d2b8888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508551602087015190925090506123da565b15611d445750630b135d3f60e11b935061088d92505050565b506001600160e01b0319935061088d92505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c829052603c81208190611da190611d9c610100870187614a8c565b611b35565b90506374eca2c160e11b6001600160e01b0319821601611dc55760009150506107e2565b5060019392505050565b801561094e57604051600090339060001990849084818181858888f193505050503d8060008114611e1c576040519150601f19603f3d011682016040523d82523d6000602084013e611e21565b606091505b505060408051848152821515602082015291925033917fa427c7d47f24d01b170779a7600b1d4c0d7cdbabaa0f19c4f0e6182053ffc931910160405180910390a25050565b600080611e76602084018461476b565b6001600160a01b03166020840135611e916040860186614a8c565b604051611e9f9291906149c9565b60006040518083038185875af1925050503d8060008114611edc576040519150601f19603f3d011682016040523d82523d6000602084013e611ee1565b606091505b509092509050611ef4602084018461476b565b6001600160a01b03167f74b56487625d598ffbf59a76c3b58fc1922f54afc86a075bad0c2a8aa05d2ad284602001358484604051611f3493929190614b1a565b60405180910390a281611f6b578051600003611f635760405163764bbf1760e01b815260040160405180910390fd5b805181602001fd5b505050565b806000819003611f9357604051635fc74f2160e11b815260040160405180910390fd5b60005b8181101561139b57611fca848483818110611fb357611fb3614a02565b9050602002810190611fc59190614b3b565b611e66565b600101611f96565b600080516020614dae83398151915254600080516020614d8e8339815191529060005b818110156120455782600101600084600201838154811061201857612018614a02565b60009182526020808320909101548352820192909252604001812081815560019081019190915501611ff5565b50612054600283016000613e60565b81546001600160a01b03191682556040517feb09d532980c3cc73dcad99b80e264204a667a54cbb7b63ec8d68dcb1c7096be90600090a15050565b612097611a90565b6120a08261243d565b610a1b8282612494565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e545760405163703e46dd60e11b815260040160405180910390fd5b600080516020614dae83398151915254600080516020614d8e8339815191529015801561212757506001600160a01b038216155b156121455760405163c4c8547360e01b815260040160405180910390fd5b80546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b61219f8282612551565b6121c6576040516313c3d61f60e01b81526004810183905260248101829052604401611558565b600084846040516020016121db9291906149c9565b6040516020818303038152906040528051906020012090508484905060000361221757604051637e25658160e11b815260040160405180910390fd5b60008181527fa2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694901602052604090208054600080516020614d8e83398151915291901515806122675750600181015415155b15612288576040516361db108160e01b815260048101849052602401611558565b604080518082018252868152602080820187815260008781526001808801845285822094518555915193820193909355600286018054918201815583529120018490555183907fd00539cb08a7c24166308150d64d603150c01baf89d3d3e4c6063d6db7c6983d90612301908a908a908a908a90614b5b565b60405180910390a250505050505050565b600080600080612322868661255d565b92509250925061233282826125aa565b5090949350505050565b600080600061234a86612663565b91509150600060028860405160200161236591815260200190565b60408051601f198184030181529082905261237f91614b82565b602060405180830381855afa15801561239c573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906123bf9190614788565b90506123ce8184848989612685565b98975050505050505050565b6000806123e685612793565b9050612433866040516020016123fe91815260200190565b60408051601f198184030181529181528301516060840151608085015160a086015160c0870151875160208901518c8c612811565b9695505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906124765750333014155b1561094e57604051630796d94560e01b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156124ee575060408051601f3d908101601f191682019092526124eb91810190614788565b60015b61251657604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611558565b600080516020614dee833981519152811461254757604051632a87526960e21b815260048101829052602401611558565b611f6b83836129b1565b600061088d8383612a07565b600080600083516041036125975760208401516040850151606086015160001a61258988828585612b01565b9550955095505050506125a3565b50508151600091506002905b9250925092565b60008260038111156125be576125be614b94565b036125c7575050565b60018260038111156125db576125db614b94565b036125f95760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561260d5761260d614b94565b0361262e5760405163fce698f760e01b815260048101829052602401611558565b600382600381111561264257612642614b94565b03610a1b576040516335e2f38360e21b815260048101829052602401611558565b6000808280602001905181019061267a9190614baa565b909590945092505050565b60006126a06002600080516020614dce833981519152614bd8565b8411156126af575060006112a3565b6040805160208101889052908101869052606081018590526080810184905260a0810183905260009060c00160405160208183030381529060405290506000806101006001600160a01b0316836040516127099190614b82565b600060405180830381855afa9150503d8060008114612744576040519150601f19603f3d011682016040523d82523d6000602084013e612749565b606091505b50915091508115612779578080602001905181019061276891906149ac565b1515600115151493505050506112a3565b6127868989898989612bd0565b9998505050505050505050565b6127d56040518060e001604052806000815260200160008152602001606081526020016000151581526020016060815260200160608152602001600081525090565b818060200190518101906127e99190614c3f565b60c089015260a088015260808701521515606086015260408501526020840152825250919050565b600060258a51108061284b57506128498a60208151811061283457612834614a02565b01602001516001600160f81b0319168a612cb3565b155b15612858575060006129a3565b6000886128648d612d19565b8960405160200161287793929190614cfe565b60408051601f198184030181528282019091526015825274113a3cb832911d113bb2b130baba34371733b2ba1160591b602083015291506128b981838a612f26565b6128c8576000925050506129a3565b60006002836040516128da9190614b82565b602060405180830381855afa1580156128f7573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061291a9190614788565b9050600060028e83604051602001612933929190614d41565b60408051601f198184030181529082905261294d91614b82565b602060405180830381855afa15801561296a573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061298d9190614788565b905061299c818a8a8a8a612685565b9450505050505b9a9950505050505050505050565b6129ba82612fd5565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156129ff57611f6b828261303a565b610a1b6130a7565b600082158015612a15575081155b80612a2d5750600160601b63ffffffff60c01b031983145b80612a455750600160601b63ffffffff60c01b031982145b15612a52575060006107e2565b6000600160601b63ffffffff60c01b031983840990506000600160601b63ffffffff60c01b0319807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc8709600160601b63ffffffff60c01b031987600160601b63ffffffff60c01b0319898a0909089050600160601b63ffffffff60c01b03197f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b820891909114949350505050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612b3c5750600091506003905082612bc6565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612b90573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612bbc57506000925060019150829050612bc6565b9250600091508190505b9450945094915050565b6000841580612bed5750600080516020614dce8339815191528510155b80612bf6575083155b80612c0f5750600080516020614dce8339815191528410155b15612c1c575060006112a3565b612c268383612a07565b612c32575060006112a3565b6000612c3d856130c6565b90506000600080516020614dce83398151915282890990506000600080516020614dce83398151915283890990506000612c7987878585613138565b9050600080516020614dce833981519152612ca28a600080516020614dce8339815191526149ef565b8208159a9950505050505050505050565b6000600160f81b83811614612cca575060006107e2565b818015612cdd5750600160fa1b83811614155b15612cea575060006107e2565b600160fb1b83811614612d1057600f60fc1b600160fc1b841601612d10575060006107e2565b50600192915050565b60606000612d2683613800565b90506000819050600060028251118015612d7157508160028351612d4a91906149ef565b81518110612d5a57612d5a614a02565b6020910101516001600160f81b031916603d60f81b145b15612d7e57506002612dc9565b60018251118015612dc057508160018351612d9991906149ef565b81518110612da957612da9614a02565b6020910101516001600160f81b031916603d60f81b145b15612dc9575060015b6000818351612dd891906149ef565b90506000816001600160401b03811115612df457612df4613fd3565b6040519080825280601f01601f191660200182016040528015612e1e576020820181803683370190505b50905060005b82811015612f1b57848181518110612e3e57612e3e614a02565b01602001516001600160f81b031916602b60f81b03612e8a57602d60f81b828281518110612e6e57612e6e614a02565b60200101906001600160f81b031916908160001a905350612f13565b848181518110612e9c57612e9c614a02565b01602001516001600160f81b031916602f60f81b03612ecc57605f60f81b828281518110612e6e57612e6e614a02565b848181518110612ede57612ede614a02565b602001015160f81c60f81b828281518110612efb57612efb614a02565b60200101906001600160f81b031916908160001a9053505b600101612e24565b509695505050505050565b825182516000918591859190845b82811015612fc65781612f478289614d63565b10612f5a5760009550505050505061088d565b83612f658289614d63565b81518110612f7557612f75614a02565b602001015160f81c60f81b6001600160f81b031916858281518110612f9c57612f9c614a02565b01602001516001600160f81b03191614612fbe5760009550505050505061088d565b600101612f34565b50600198975050505050505050565b806001600160a01b03163b60000361300b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611558565b600080516020614dee83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516130579190614b82565b600060405180830381855af49150503d8060008114613092576040519150601f19603f3d011682016040523d82523d6000602084013e613097565b606091505b50915091506112a3858383613826565b3415610e545760405163b398979f60e01b815260040160405180910390fd5b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f6080820152600080516020614dce83398151915260a082015260208160c0836005600019fa61313157600080fd5b5192915050565b600080808060ff81808815801561314d575087155b15613161576000965050505050505061086d565b6131ad7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d613882565b9092509050811580156131be575080155b156131ec57600080516020614dce83398151915288600080516020614dce833981519152038a089850600097505b600189841c16600189851c1660011b015b8061321f5760018403935060018a851c1660018a861c1660011b0190506131fd565b50600189841c16600189851c1660011b01955060018603613281577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603613290578a96508993505b6003860361329f578196508093505b60018303925060019550600194505b82600019111561378357600160601b63ffffffff60c01b031984600209600160601b63ffffffff60c01b0319818209600160601b63ffffffff60c01b0319818a09600160601b63ffffffff60c01b03198284099250600160601b63ffffffff60c01b031980600160601b63ffffffff60c01b03198b8d08600160601b63ffffffff60c01b03198c600160601b63ffffffff60c01b0319038e0809600309600160601b63ffffffff60c01b03198985099850600160601b63ffffffff60c01b03198a84099950600160601b63ffffffff60c01b031980836002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319838409089a50600160601b63ffffffff60c01b03198083600160601b63ffffffff60c01b0319038d0882099250600160601b63ffffffff60c01b031983600160601b63ffffffff60c01b03198a870908975060018d881c1660018d891c1660011b0190508061342b5787600160601b63ffffffff60c01b031903975050505050613778565b6001810361347a577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103613489578e93508d92505b60038103613498578593508492505b896134b157509198506001975087965094506137789050565b600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b03198b860908600160601b63ffffffff60c01b03198c600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b03198d88090893508061366a578361366a57600160601b63ffffffff60c01b0319896002600160601b0363ffffffff60c01b0319099450600160601b63ffffffff60c01b03198586099350600160601b63ffffffff60c01b0319848d099250600160601b63ffffffff60c01b03198486099450600160601b63ffffffff60c01b0319808c600160601b63ffffffff60c01b0319038e08600160601b63ffffffff60c01b03198d8f08099050600160601b63ffffffff60c01b0319816003099150600160601b63ffffffff60c01b03198a86099950600160601b63ffffffff60c01b03198b85099a50600160601b63ffffffff60c01b031980846002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319848509089b50600160601b63ffffffff60c01b0319808d600160601b63ffffffff60c01b031903850883099350600160601b63ffffffff60c01b0319808a8709850898505050505050613778565b600160601b63ffffffff60c01b03198485099150600160601b63ffffffff60c01b0319848309600160601b63ffffffff60c01b0319838d099b50600160601b63ffffffff60c01b0319818c099a50600160601b63ffffffff60c01b0319838e09600160601b63ffffffff60c01b031980826002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b031984600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b031987880908089350600160601b63ffffffff60c01b031980838d09600160601b63ffffffff60c01b031985600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b031903860809089a50505050809a50505050505b6001830392506132ae565b60405186606082015260208152602080820152602060408201526002600160601b0363ffffffff60c01b03196080820152600160601b63ffffffff60c01b031960a082015260208160c0836005600019fa6137dd57600080fd5b600160601b63ffffffff60c01b0319815189099c9b505050505050505050505050565b60606107e282604051806060016040528060408152602001614e0e604091396001613910565b60608261383b5761383682613a8f565b61088d565b815115801561385257506001600160a01b0384163b155b1561387b57604051639996b31560e01b81526001600160a01b0385166004820152602401611558565b508061088d565b600080808086613899578585935093505050613907565b846138ab578787935093505050613907565b85881480156138b957508487145b156138da576138cb8888600180613ab8565b929a50909850925090506138f4565b6138e988886001808a8a613c13565b929a50909850925090505b61390088888484613d97565b9350935050505b94509492505050565b60608351600003613930575060408051602081019091526000815261088d565b600082613961576003855160046139479190614d76565b613952906002614d63565b61395c9190614bd8565b613986565b6003855160026139719190614d63565b61397b9190614bd8565b613986906004614d76565b90506000816001600160401b038111156139a2576139a2613fd3565b6040519080825280601f01601f1916602001820160405280156139cc576020820181803683370190505b50905060018501602082018788518901602081018051600082525b82841015613a42576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f81168701518653506001850194506139e7565b905250508515613a8357600388510660018114613a665760028114613a7957613a81565b603d6001830353603d6002830353613a81565b603d60018303535b505b50909695505050505050565b805115613a9f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080600080600160601b63ffffffff60c01b0319876002099350600160601b63ffffffff60c01b03198485099150600160601b63ffffffff60c01b03198289099050600160601b63ffffffff60c01b03198285099250600160601b63ffffffff60c01b03198683099150600160601b63ffffffff60c01b031980600160601b63ffffffff60c01b0319888b08600160601b63ffffffff60c01b031989600160601b63ffffffff60c01b0319038c08096003099550600160601b63ffffffff60c01b031980826002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319888909089350600160601b63ffffffff60c01b03198085600160601b63ffffffff60c01b031903830887099750600160601b63ffffffff60c01b03198584099050600160601b63ffffffff60c01b031980888509600160601b63ffffffff60c01b03190389089250945094509450949050565b60008060008088600003613c3257508492508391506001905080613d8a565b600160601b63ffffffff60c01b0319988903988981898809089450600160601b63ffffffff60c01b03198a600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b03198a8909089550600160601b63ffffffff60c01b03198687099350600160601b63ffffffff60c01b03198685099250600160601b63ffffffff60c01b03198489099150600160601b63ffffffff60c01b03198388099050600160601b63ffffffff60c01b0319848b099750600160601b63ffffffff60c01b031980896002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b031985600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b0319898a0908089350600160601b63ffffffff60c01b031980848b09600160601b63ffffffff60c01b031987600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b0319038d08090892505b9650965096509692505050565b6000806000613da584613e04565b9050600160601b63ffffffff60c01b031981870991506000600160601b63ffffffff60c01b03198287099050600160601b63ffffffff60c01b03198182099150600160601b63ffffffff60c01b03198289099350505094509492505050565b600060405160208152602080820152602060408201528260608201526002600160601b0363ffffffff60c01b03196080820152600160601b63ffffffff60c01b031960a082015260208160c0836005600019fa61313157600080fd5b508054600082559060005260206000209081019061094e91905b80821115613e8e5760008155600101613e7a565b5090565b600060208284031215613ea457600080fd5b81356001600160e01b03198116811461088d57600080fd5b6001600160a01b038116811461094e57600080fd5b803561189581613ebc565b60008083601f840112613eee57600080fd5b5081356001600160401b03811115613f0557600080fd5b6020830191508360208260051b8501011115613f2057600080fd5b9250929050565b60008060008060008060006080888a031215613f4257600080fd5b8735613f4d81613ebc565b965060208801356001600160401b0380821115613f6957600080fd5b613f758b838c01613edc565b909850965060408a0135915080821115613f8e57600080fd5b613f9a8b838c01613edc565b909650945060608a0135915080821115613fb357600080fd5b50613fc08a828b01613edc565b989b979a50959850939692959293505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561401157614011613fd3565b604052919050565b60006001600160401b0382111561403257614032613fd3565b50601f01601f191660200190565b600082601f83011261405157600080fd5b813561406461405f82614019565b613fe9565b81815284602083860101111561407957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156140ac57600080fd5b84356140b781613ebc565b935060208501356140c781613ebc565b92506040850135915060608501356001600160401b038111156140e957600080fd5b6140f587828801614040565b91505092959194509250565b60008083601f84011261411357600080fd5b5081356001600160401b0381111561412a57600080fd5b602083019150836020828501011115613f2057600080fd5b60008060006040848603121561415757600080fd5b8335925060208401356001600160401b0381111561417457600080fd5b61418086828701614101565b9497909650939450505050565b6000806000606084860312156141a257600080fd5b83356001600160401b038111156141b857600080fd5b840161012081870312156141cb57600080fd5b95602085013595506040909401359392505050565b6000606082840312156141f257600080fd5b50919050565b60006020828403121561420a57600080fd5b81356001600160401b0381111561422057600080fd5b61086d848285016141e0565b6020808252825182820181905260009190848201906040850190845b81811015613a8357835183529284019291840191600101614248565b6000806020838503121561427757600080fd5b82356001600160401b0381111561428d57600080fd5b61429985828601613edc565b90969095509350505050565b6000602082840312156142b757600080fd5b81356001600160c01b038116811461088d57600080fd5b6000602082840312156142e057600080fd5b81356001600160401b038111156142f657600080fd5b820160c0818503121561088d57600080fd5b60006020828403121561431a57600080fd5b5035919050565b6000806040838503121561433457600080fd5b823561433f81613ebc565b915060208301356001600160401b0381111561435a57600080fd5b61436685828601614040565b9150509250929050565b801515811461094e57600080fd5b803561189581614370565b600080600080600080600080600060c08a8c0312156143a757600080fd5b893560ff811681146143b857600080fd5b98506143c660208b01613ed1565b975060408a01356001600160401b03808211156143e257600080fd5b6143ee8d838e01613edc565b909950975060608c013591508082111561440757600080fd5b6144138d838e01613edc565b909750955060808c013591508082111561442c57600080fd5b506144398c828d01613edc565b909450925061444c905060a08b0161437e565b90509295985092959850929598565b6000806040838503121561446e57600080fd5b823561447981613ebc565b946020939093013593505050565b60005b838110156144a257818101518382015260200161448a565b50506000910152565b600081518084526144c3816020860160208601614487565b601f01601f19169290920160200192915050565b60208152600061088d60208301846144ab565b600082601f8301126144fb57600080fd5b813560206001600160401b0382111561451657614516613fd3565b8160051b614525828201613fe9565b928352848101820192828101908785111561453f57600080fd5b83870192505b8483101561455e57823582529183019190830190614545565b979650505050505050565b600080600080600060a0868803121561458157600080fd5b853561458c81613ebc565b9450602086013561459c81613ebc565b935060408601356001600160401b03808211156145b857600080fd5b6145c489838a016144ea565b945060608801359150808211156145da57600080fd5b6145e689838a016144ea565b935060808801359150808211156145fc57600080fd5b5061460988828901614040565b9150509295509295909350565b6000806000806060858703121561462c57600080fd5b84356001600160401b0381111561464257600080fd5b61464e87828801614101565b90989097506020870135966040013595509350505050565b6000806020838503121561467957600080fd5b82356001600160401b0381111561468f57600080fd5b61429985828601614101565b6000806000604084860312156146b057600080fd5b83356001600160401b03808211156146c757600080fd5b6146d387838801614101565b909550935060208601359150808211156146ec57600080fd5b506146f9868287016141e0565b9150509250925092565b600080600080600060a0868803121561471b57600080fd5b853561472681613ebc565b9450602086013561473681613ebc565b9350604086013592506060860135915060808601356001600160401b0381111561475f57600080fd5b61460988828901614040565b60006020828403121561477d57600080fd5b813561088d81613ebc565b60006020828403121561479a57600080fd5b5051919050565b6000808335601e198436030181126147b857600080fd5b83016020810192503590506001600160401b038111156147d757600080fd5b803603821315613f2057600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b888110156148c257858403601f19018a52823536899003605e1901811261484e578283fd5b88016060813561485d81613ebc565b6001600160a01b03168652614874828801836147a1565b828989015261488683890182846147e6565b925050506040614898818401846147a1565b9350878303828901526148ac8385836147e6565b9d89019d97505050938601935050600101614829565b509198975050505050505050565b60208152600082356148e181613ebc565b6001600160a01b039081166020848101919091528401359061490282613ebc565b80821660408501525050604083013560608301526060830135601e1984360301811261492d57600080fd5b83016020810190356001600160401b0381111561494957600080fd5b8060051b360382131561495b57600080fd5b60c0608085015261497060e08501828461480f565b915050608084013560a084015261498a60a08501856147a1565b848303601f190160c08601526124338382846147e6565b805161189581614370565b6000602082840312156149be57600080fd5b815161088d81614370565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156107e2576107e26149d9565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b604081526000614a426040830185876147e6565b82810360208401528335614a5581613ebc565b6001600160a01b0316815260208481013590820152614a7760408501856147a1565b606060408401526123ce6060840182846147e6565b6000808335601e19843603018112614aa357600080fd5b8301803591506001600160401b03821115614abd57600080fd5b602001915036819003821315613f2057600080fd5b60008085851115614ae257600080fd5b83861115614aef57600080fd5b5050820193919092039150565b803560208310156107e257600019602084900360031b1b1692915050565b83815282151560208201526060604082015260006112a360608301846144ab565b60008235605e19833603018112614b5157600080fd5b9190910192915050565b606081526000614b6f6060830186886147e6565b6020830194909452506040015292915050565b60008251614b51818460208701614487565b634e487b7160e01b600052602160045260246000fd5b600080600060608486031215614bbf57600080fd5b8351925060208401519150604084015190509250925092565b600082614bf557634e487b7160e01b600052601260045260246000fd5b500490565b600082601f830112614c0b57600080fd5b8151614c1961405f82614019565b818152846020838601011115614c2e57600080fd5b61086d826020830160208701614487565b600080600080600080600080610100898b031215614c5c57600080fd5b88519750602089015196506040890151955060608901516001600160401b0380821115614c8857600080fd5b614c948c838d01614bfa565b9650614ca260808c016149a1565b955060a08b0151915080821115614cb857600080fd5b614cc48c838d01614bfa565b945060c08b0151915080821115614cda57600080fd5b50614ce78b828c01614bfa565b92505060e089015190509295985092959890939650565b60008451614d10818460208901614487565b845190830190614d24818360208901614487565b8451910190614d37818360208801614487565b0195945050505050565b60008351614d53818460208801614487565b9190910191825250602001919050565b808201808211156107e2576107e26149d9565b80820281158282048414176107e2576107e26149d956fea2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694900a2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694902ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212208ea6494b631dfbdfca458a1c0a52311f1cf61e8c8eacea1ff8b3b6e773897baa64736f6c63430008170033000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d780000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x2", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe4c27ddf1a20409ed468c1926a70151442bab0d7bf1424b073c42cc13fd36e1e", + "transactionType": "CREATE2", + "contractName": "AllowedCalldataEnforcer", + "contractAddress": "0x48db3835a873d64a4af2c09f014052407c003bd7", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x7ac98", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061059c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610085575b600080fd5b61005961005436600461035a565b61009d565b005b61006e61006936600461041d565b61020c565b60405161007c92919061045f565b60405180910390f35b61005961009336600461035a565b5050505050505050565b60006060806100ac8b8b61020c565b805191945092506100c060408901896104b6565b90506100cc82866104fd565b11156101375760405162461bcd60e51b815260206004820152602f60248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d60448201526e0c6c2d8d8c8c2e8c25ad8cadccee8d608b1b60648201526084015b60405180910390fd5b61014460408901896104b6565b859061015084836104fd565b9261015d9392919061051e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509294506101a192508491508590506102d9565b6101fe5760405162461bcd60e51b815260206004820152602860248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d60448201526763616c6c6461746160c01b606482015260840161012e565b505050505050505050505050565b6000606060218310156102745760405162461bcd60e51b815260206004820152602a60248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d6044820152697465726d732d73697a6560b01b606482015260840161012e565b61028260206000858761051e565b61028b91610548565b915061029a836020818761051e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250949792965091945050505050565b6000818051906020012083805190602001201490505b92915050565b60008083601f84011261030757600080fd5b50813567ffffffffffffffff81111561031f57600080fd5b60208301915083602082850101111561033757600080fd5b9250929050565b80356001600160a01b038116811461035557600080fd5b919050565b60008060008060008060008060c0898b03121561037657600080fd5b883567ffffffffffffffff8082111561038e57600080fd5b61039a8c838d016102f5565b909a50985060208b01359150808211156103b357600080fd5b6103bf8c838d016102f5565b909850965060408b01359150808211156103d857600080fd5b5089016060818c0312156103eb57600080fd5b93506060890135925061040060808a0161033e565b915061040e60a08a0161033e565b90509295985092959890939650565b6000806020838503121561043057600080fd5b823567ffffffffffffffff81111561044757600080fd5b610453858286016102f5565b90969095509350505050565b8281526000602060406020840152835180604085015260005b8181101561049457858101830151858201606001528201610478565b506000606082860101526060601f19601f830116850101925050509392505050565b6000808335601e198436030181126104cd57600080fd5b83018035915067ffffffffffffffff8211156104e857600080fd5b60200191503681900382131561033757600080fd5b808201808211156102ef57634e487b7160e01b600052601160045260246000fd5b6000808585111561052e57600080fd5b8386111561053b57600080fd5b5050820193919092039150565b803560208310156102ef57600019602084900360031b1b169291505056fea264697066735822122094149f339193c37892b2442e24526e5fff221c6592b2b7cd87732677fcc1c9c464736f6c63430008170033", + "nonce": "0x3", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x1fea0515a7b0fc7ef67d87dfbac1c5a5c8f89bccd62ede5eabddb784d3e43d4f", + "transactionType": "CREATE2", + "contractName": "AllowedMethodsEnforcer", + "contractAddress": "0xfd731951bf1c52afccee3e6f14ab656475b76dd4", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x8ba05", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610683806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610084575b600080fd5b6100596100543660046103a7565b61009c565b005b61006e61006936600461046a565b6101ff565b60405161007b91906104ac565b60405180910390f35b6100596100923660046103a7565b5050505050505050565b60046100ab60408601866104fa565b9050101561011a5760405162461bcd60e51b815260206004820152603160248201527f416c6c6f7765644d6574686f6473456e666f726365723a696e76616c69642d616044820152700c6e8d2dedc5ac8c2e8c25ad8cadccee8d607b1b60648201526084015b60405180910390fd5b600061012960408601866104fa565b61013891600491600091610541565b6101419161056b565b9050600061014f8a8a6101ff565b805190915060005b818110156101a4578281815181106101715761017161059b565b60200260200101516001600160e01b031916846001600160e01b0319160361019c5750505050610092565b600101610157565b5060405162461bcd60e51b815260206004820152602960248201527f416c6c6f7765644d6574686f6473456e666f726365723a6d6574686f642d6e6f6044820152681d0b585b1b1bddd95960ba1b6064820152608401610111565b606060008261020f6004826105c7565b156102705760405162461bcd60e51b815260206004820152602b60248201527f416c6c6f7765644d6574686f6473456e666f726365723a696e76616c69642d7460448201526a0cae4dae65ad8cadccee8d60ab1b6064820152608401610111565b61027b6004826105f1565b67ffffffffffffffff81111561029357610293610605565b6040519080825280602002602001820160405280156102bc578160200160208202803683370190505b50925060005b81811015610339578581866102d882600461061b565b926102e593929190610541565b6102ee9161056b565b8484815181106103005761030061059b565b6001600160e01b0319909216602092830291909101909101528261032381610634565b9350610332905060048261061b565b90506102c2565b50505092915050565b60008083601f84011261035457600080fd5b50813567ffffffffffffffff81111561036c57600080fd5b60208301915083602082850101111561038457600080fd5b9250929050565b80356001600160a01b03811681146103a257600080fd5b919050565b60008060008060008060008060c0898b0312156103c357600080fd5b883567ffffffffffffffff808211156103db57600080fd5b6103e78c838d01610342565b909a50985060208b013591508082111561040057600080fd5b61040c8c838d01610342565b909850965060408b013591508082111561042557600080fd5b5089016060818c03121561043857600080fd5b93506060890135925061044d60808a0161038b565b915061045b60a08a0161038b565b90509295985092959890939650565b6000806020838503121561047d57600080fd5b823567ffffffffffffffff81111561049457600080fd5b6104a085828601610342565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156104ee5783516001600160e01b031916835292840192918401916001016104c8565b50909695505050505050565b6000808335601e1984360301811261051157600080fd5b83018035915067ffffffffffffffff82111561052c57600080fd5b60200191503681900382131561038457600080fd5b6000808585111561055157600080fd5b8386111561055e57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156105935780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826105d6576105d66105b1565b500690565b634e487b7160e01b600052601160045260246000fd5b600082610600576106006105b1565b500490565b634e487b7160e01b600052604160045260246000fd5b8082018082111561062e5761062e6105db565b92915050565b600060018201610646576106466105db565b506001019056fea26469706673582212204ec9b63db8ffcc611dbc205c0eb5d3daa906537fc4f6d216704a61e004393bed64736f6c63430008170033", + "nonce": "0x4", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xd42e14c91f7e5a8226fb41942b6c789baff681a79f28ce7d183b3a3e1a616b9a", + "transactionType": "CREATE2", + "contractName": "AllowedTargetsEnforcer", + "contractAddress": "0xbc8673c0afa52d86d991c06881e55b2966920564", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x7f38f", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b506105d9806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610084575b600080fd5b61005961005436600461031e565b61009c565b005b61006e6100693660046103e1565b610174565b60405161007b9190610423565b60405180910390f35b61005961009236600461031e565b5050505050505050565b60006100ab6020860186610470565b905060006100b98a8a610174565b805190915060005b8181101561010c578281815181106100db576100db610492565b60200260200101516001600160a01b0316846001600160a01b0316036101045750505050610092565b6001016100c1565b5060405162461bcd60e51b815260206004820152603160248201527f416c6c6f77656454617267657473456e666f726365723a7461726765742d6164604482015270191c995cdccb5b9bdd0b585b1b1bddd959607a1b60648201526084015b60405180910390fd5b60606000826101846014826104be565b156101e55760405162461bcd60e51b815260206004820152602b60248201527f416c6c6f77656454617267657473456e666f726365723a696e76616c69642d7460448201526a0cae4dae65ad8cadccee8d60ab1b606482015260840161016b565b6101f06014826104e8565b67ffffffffffffffff811115610208576102086104fc565b604051908082528060200260200182016040528015610231578160200160208202803683370190505b50925060005b818110156102b05785818661024d826014610512565b9261025a9392919061052b565b61026391610555565b60601c84848151811061027857610278610492565b6001600160a01b03909216602092830291909101909101528261029a8161058a565b93506102a99050601482610512565b9050610237565b50505092915050565b60008083601f8401126102cb57600080fd5b50813567ffffffffffffffff8111156102e357600080fd5b6020830191508360208285010111156102fb57600080fd5b9250929050565b80356001600160a01b038116811461031957600080fd5b919050565b60008060008060008060008060c0898b03121561033a57600080fd5b883567ffffffffffffffff8082111561035257600080fd5b61035e8c838d016102b9565b909a50985060208b013591508082111561037757600080fd5b6103838c838d016102b9565b909850965060408b013591508082111561039c57600080fd5b5089016060818c0312156103af57600080fd5b9350606089013592506103c460808a01610302565b91506103d260a08a01610302565b90509295985092959890939650565b600080602083850312156103f457600080fd5b823567ffffffffffffffff81111561040b57600080fd5b610417858286016102b9565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156104645783516001600160a01b03168352928401929184019160010161043f565b50909695505050505050565b60006020828403121561048257600080fd5b61048b82610302565b9392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826104cd576104cd6104a8565b500690565b634e487b7160e01b600052601160045260246000fd5b6000826104f7576104f76104a8565b500490565b634e487b7160e01b600052604160045260246000fd5b80820180821115610525576105256104d2565b92915050565b6000808585111561053b57600080fd5b8386111561054857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156105825780818660140360031b1b83161692505b505092915050565b60006001820161059c5761059c6104d2565b506001019056fea26469706673582212204a2e5d298e85989e2cc1b01eb90837481124fb817e6ba907174cafb6c568768564736f6c63430008170033", + "nonce": "0x5", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xece04f176117704c838ce67bb1c68576add1e18349aaa4753ba5967c9467bad9", + "transactionType": "CREATE2", + "contractName": "BlockNumberEnforcer", + "contractAddress": "0xc15faffa0d879b9263c15a46ce31eacfa2e0e8ae", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6942b", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061045b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610092575b600080fd5b6100596100543660046102bd565b6100aa565b005b61006e610069366004610380565b6101b6565b604080516001600160801b0393841681529290911660208301520160405180910390f35b6100596100a03660046102bd565b5050505050505050565b6000806100b78a8a6101b6565b90925090506001600160801b0382161561013457816001600160801b031643116101345760405162461bcd60e51b8152602060048201526024808201527f426c6f636b4e756d626572456e666f726365723a6561726c792d64656c6567616044820152633a34b7b760e11b60648201526084015b60405180910390fd5b6001600160801b038116156101aa57806001600160801b031643106101aa5760405162461bcd60e51b815260206004820152602660248201527f426c6f636b4e756d626572456e666f726365723a657870697265642d64656c6560448201526533b0ba34b7b760d11b606482015260840161012b565b50505050505050505050565b6000806020831461021a5760405162461bcd60e51b815260206004820152602860248201527f426c6f636b4e756d626572456e666f726365723a696e76616c69642d7465726d6044820152670e65ad8cadccee8d60c31b606482015260840161012b565b6102286010600085876103c2565b610231916103ec565b60801c915061024383601081876103c2565b61024c916103ec565b60801c90509250929050565b60008083601f84011261026a57600080fd5b50813567ffffffffffffffff81111561028257600080fd5b60208301915083602082850101111561029a57600080fd5b9250929050565b80356001600160a01b03811681146102b857600080fd5b919050565b60008060008060008060008060c0898b0312156102d957600080fd5b883567ffffffffffffffff808211156102f157600080fd5b6102fd8c838d01610258565b909a50985060208b013591508082111561031657600080fd5b6103228c838d01610258565b909850965060408b013591508082111561033b57600080fd5b5089016060818c03121561034e57600080fd5b93506060890135925061036360808a016102a1565b915061037160a08a016102a1565b90509295985092959890939650565b6000806020838503121561039357600080fd5b823567ffffffffffffffff8111156103aa57600080fd5b6103b685828601610258565b90969095509350505050565b600080858511156103d257600080fd5b838611156103df57600080fd5b5050820193919092039150565b6fffffffffffffffffffffffffffffffff19813581811691601085101561041d5780818660100360031b1b83161692505b50509291505056fea26469706673582212202f1df071a3b936ee3ad015758f36f43130359bf66ac06d4703490535de194a3864736f6c63430008170033", + "nonce": "0x6", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x14130fe294aaa9b80daec0fc91256312f186055e5c057f62a5fd532a103abf6c", + "transactionType": "CREATE2", + "contractName": "DeployedEnforcer", + "contractAddress": "0x5accb9559b56a6c1e3f90e342c85c42d93720d43", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x8f463", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b506106b5806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063481286e6146100515780639751a83d14610081578063b99deb0e14610096578063de723eeb146100b8575b600080fd5b61006461005f366004610410565b6100d0565b6040516001600160a01b0390911681526020015b60405180910390f35b61009461008f366004610497565b6100e5565b005b6100a96100a436600461055a565b6101e4565b6040516100789392919061059c565b6100946100c6366004610497565b5050505050505050565b60006100dc82846102ca565b90505b92915050565b60008060006100f48b8b6101e4565b919450925090506001600160a01b0383163b1561014f576040516001600160a01b03841681527f641dafeb23238fae3ef71c64fced975da90c34dede63890507f3dda6b1e0dfef9060200160405180910390a15050506100c6565b600061015b82846102d7565b9050836001600160a01b0316816001600160a01b0316146101d65760405162461bcd60e51b815260206004820152602a60248201527f4465706c6f796564456e666f726365723a6465706c6f7965642d6164647265736044820152690e65adad2e6dac2e8c6d60b31b60648201526084015b60405180910390fd5b505050505050505050505050565b6000806060603484116102475760405162461bcd60e51b815260206004820152602560248201527f4465706c6f796564456e666f726365723a696e76616c69642d7465726d732d6c6044820152640cadccee8d60db1b60648201526084016101cd565b610255601460008688610602565b61025e9161062c565b60601c9250610271603460148688610602565b61027a91610661565b91506102898460348188610602565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509598949750919550929350505050565b60006100dc83833061035f565b60006102e560008385610389565b9050806001600160a01b03163b60000361031d576040516352c7cd4960e11b81526001600160a01b03821660048201526024016101cd565b6040516001600160a01b03821681527faf3c4b03f515b5a38f3c238fdc24abf10854a2f27f2a85743a71de17e9bc7e7f9060200160405180910390a192915050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6000834710156103b55760405163392efb2b60e21b8152476004820152602481018590526044016101cd565b81516000036103d757604051631328927760e21b815260040160405180910390fd5b8282516020840186f590506001600160a01b03811661040957604051633a0ba96160e11b815260040160405180910390fd5b9392505050565b6000806040838503121561042357600080fd5b50508035926020909101359150565b60008083601f84011261044457600080fd5b50813567ffffffffffffffff81111561045c57600080fd5b60208301915083602082850101111561047457600080fd5b9250929050565b80356001600160a01b038116811461049257600080fd5b919050565b60008060008060008060008060c0898b0312156104b357600080fd5b883567ffffffffffffffff808211156104cb57600080fd5b6104d78c838d01610432565b909a50985060208b01359150808211156104f057600080fd5b6104fc8c838d01610432565b909850965060408b013591508082111561051557600080fd5b5089016060818c03121561052857600080fd5b93506060890135925061053d60808a0161047b565b915061054b60a08a0161047b565b90509295985092959890939650565b6000806020838503121561056d57600080fd5b823567ffffffffffffffff81111561058457600080fd5b61059085828601610432565b90969095509350505050565b60018060a01b03841681526000602084602084015260606040840152835180606085015260005b818110156105df578581018301518582016080015282016105c3565b506000608082860101526080601f19601f83011685010192505050949350505050565b6000808585111561061257600080fd5b8386111561061f57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106595780818660140360031b1b83161692505b505092915050565b803560208310156100df57600019602084900360031b1b169291505056fea2646970667358221220adae6ada7a0e210e98db78555afd35a3b834fe39e89d1ae92e20b35e9cc9358664736f6c63430008170033", + "nonce": "0x7", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x3eb1b1d29d58ec8402fe3de7911c2e7a722e549fe5b26c411d2d75483e4824df", + "transactionType": "CREATE2", + "contractName": "ERC20BalanceGteEnforcer", + "contractAddress": "0xb5d6b1ec6d868a3bae5b7f48178eaa2686a7a087", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xa3337", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061074a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806332a16f4e146100675780638678d6ef1461009f5780639751a83d146100c0578063b5e54492146100d5578063b99deb0e146100f5578063de723eeb14610127575b600080fd5b61008a61007536600461049d565b60016020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100b26100ad3660046104d2565b61013a565b604051908152602001610096565b6100d36100ce366004610557565b61014f565b005b6100b26100e336600461049d565b60006020819052908152604090205481565b61010861010336600461061a565b610289565b604080516001600160a01b039093168352602083019190915201610096565b6100d3610135366004610557565b61032f565b600061014784848461045a565b949350505050565b600061015b8989610289565b509050600061016b33838761045a565b60008181526001602052604090205490915060ff16156101e55760405162461bcd60e51b815260206004820152602a60248201527f455243323042616c616e6365477465456e666f726365723a656e666f726365726044820152690b5a5ccb5b1bd8dad95960b21b60648201526084015b60405180910390fd5b6000818152600160208190526040808320805460ff1916909217909155516370a0823160e01b81526001600160a01b0386811660048301528416906370a0823190602401602060405180830381865afa158015610246573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026a919061065c565b6000928352602083905260409092209190915550505050505050505050565b600080603483146102f15760405162461bcd60e51b815260206004820152602c60248201527f455243323042616c616e6365477465456e666f726365723a696e76616c69642d60448201526b0e8cae4dae65ad8cadccee8d60a31b60648201526084016101dc565b6102ff601460008587610675565b6103089161069f565b60601c915061031a8360148187610675565b610323916106d4565b60001c90509250929050565b60008061033c8a8a610289565b91509150600061034d33848861045a565b600081815260016020526040808220805460ff19169055516370a0823160e01b81526001600160a01b03888116600483015292935090918516906370a0823190602401602060405180830381865afa1580156103ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d1919061065c565b6000838152602081905260409020549091506103ee9084906106f3565b81101561044c5760405162461bcd60e51b815260206004820152602660248201527f455243323042616c616e6365477465456e666f726365723a62616c616e63652d6044820152651b9bdd0b59dd60d21b60648201526084016101dc565b505050505050505050505050565b604080516001600160a01b039485166020808301919091529390941684820152606080850192909252805180850390920182526080909301909252815191012090565b6000602082840312156104af57600080fd5b5035919050565b80356001600160a01b03811681146104cd57600080fd5b919050565b6000806000606084860312156104e757600080fd5b6104f0846104b6565b92506104fe602085016104b6565b9150604084013590509250925092565b60008083601f84011261052057600080fd5b50813567ffffffffffffffff81111561053857600080fd5b60208301915083602082850101111561055057600080fd5b9250929050565b60008060008060008060008060c0898b03121561057357600080fd5b883567ffffffffffffffff8082111561058b57600080fd5b6105978c838d0161050e565b909a50985060208b01359150808211156105b057600080fd5b6105bc8c838d0161050e565b909850965060408b01359150808211156105d557600080fd5b5089016060818c0312156105e857600080fd5b9350606089013592506105fd60808a016104b6565b915061060b60a08a016104b6565b90509295985092959890939650565b6000806020838503121561062d57600080fd5b823567ffffffffffffffff81111561064457600080fd5b6106508582860161050e565b90969095509350505050565b60006020828403121561066e57600080fd5b5051919050565b6000808585111561068557600080fd5b8386111561069257600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106cc5780818660140360031b1b83161692505b505092915050565b803560208310156106ed57600019602084900360031b1b165b92915050565b808201808211156106ed57634e487b7160e01b600052601160045260246000fdfea2646970667358221220706a4bd5217d105228b49e7ecb48d785e4c5a4cbd88c1e0018e40907dafc0c9d64736f6c63430008170033", + "nonce": "0x8", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x07ab4b9a75b4afe943696391e1aebb2219cb78198a13ef9db3dfe67ca792789d", + "transactionType": "CREATE2", + "contractName": "ERC20TransferAmountEnforcer", + "contractAddress": "0x92ac423b9c111962179a6242e1adb58d02c103be", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x990f4", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061073b806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80639751a83d146100515780639dd5d9ab14610066578063b99deb0e146100a1578063de723eeb146100d3575b600080fd5b61006461005f366004610480565b6100eb565b005b61008e610074366004610543565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b6100b46100af36600461056d565b610383565b604080516001600160a01b039093168352602083019190915201610098565b6100646100e1366004610480565b5050505050505050565b6100f860408501856105af565b90506044146101565760405162461bcd60e51b815260206004820152603160248201526000805160206106e68339815191526044820152700d8d2c85ac2c6e8d2dedc5ad8cadccee8d607b1b60648201526084015b60405180910390fd5b6000806101638a8a610383565b9092509050600061017760208801886105f6565b905063a9059cbb60e01b6001600160a01b03848116908316146101df5760405162461bcd60e51b815260206004820152602c60248201526000805160206106e683398151915260448201526b1b1a590b58dbdb9d1c9858dd60a21b606482015260840161014d565b60006101ee60408a018a6105af565b6101fd91600491600091610618565b61020691610642565b90506001600160e01b0319808216908316146102655760405162461bcd60e51b815260206004820152602a60248201526000805160206106e68339815191526044820152691b1a590b5b595d1a1bd960b21b606482015260840161014d565b600061027460408b018b6105af565b61028391604491602491610618565b61028c91610672565b336000908152602081815260408083208d845290915281208054929350909183919083906102bb908490610691565b92505081905590508581111561032a5760405162461bcd60e51b815260206004820152602e60248201527f45524332305472616e73666572416d6f756e74456e666f726365723a616c6c6f60448201526d1dd85b98d94b595e18d95959195960921b606482015260840161014d565b60408051878152602081018390528b916001600160a01b038b169133917fc026e493323d526061a052b5dd562495120e2f648797a48be61966d3a6beec8d910160405180910390a4505050505050505050505050505050565b600080603483146103dd5760405162461bcd60e51b815260206004820152603060248201526000805160206106e683398151915260448201526f0d8d2c85ae8cae4dae65ad8cadccee8d60831b606482015260840161014d565b6103eb601460008587610618565b6103f4916106b2565b60601c91506104068360148187610618565b61040f91610672565b60001c90509250929050565b60008083601f84011261042d57600080fd5b50813567ffffffffffffffff81111561044557600080fd5b60208301915083602082850101111561045d57600080fd5b9250929050565b80356001600160a01b038116811461047b57600080fd5b919050565b60008060008060008060008060c0898b03121561049c57600080fd5b883567ffffffffffffffff808211156104b457600080fd5b6104c08c838d0161041b565b909a50985060208b01359150808211156104d957600080fd5b6104e58c838d0161041b565b909850965060408b01359150808211156104fe57600080fd5b5089016060818c03121561051157600080fd5b93506060890135925061052660808a01610464565b915061053460a08a01610464565b90509295985092959890939650565b6000806040838503121561055657600080fd5b61055f83610464565b946020939093013593505050565b6000806020838503121561058057600080fd5b823567ffffffffffffffff81111561059757600080fd5b6105a38582860161041b565b90969095509350505050565b6000808335601e198436030181126105c657600080fd5b83018035915067ffffffffffffffff8211156105e157600080fd5b60200191503681900382131561045d57600080fd5b60006020828403121561060857600080fd5b61061182610464565b9392505050565b6000808585111561062857600080fd5b8386111561063557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561066a5780818660040360031b1b83161692505b505092915050565b8035602083101561068b57600019602084900360031b1b165b92915050565b8082018082111561068b57634e487b7160e01b600052601160045260246000fd5b6bffffffffffffffffffffffff19813581811691601485101561066a5760149490940360031b84901b169092169291505056fe45524332305472616e73666572416d6f756e74456e666f726365723a696e7661a2646970667358221220bbaa47e7ff7ca5d260ee2e4ae44f60d5ed447ee0a25335e020538968f33cc37d64736f6c63430008170033", + "nonce": "0x9", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x833f7c0bcea43bc2752e2afa5047b64bc31bc2190becab94cba87a5ec79eed98", + "transactionType": "CREATE2", + "contractName": "IdEnforcer", + "contractAddress": "0x34152d9f3f8f74338d50703e780389e829b4abac", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x667df", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610486806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063595dce48146100515780639751a83d14610079578063b99deb0e1461008e578063de723eeb146100af575b600080fd5b61006461005f3660046102a8565b6100c7565b60405190151581526020015b60405180910390f35b61008c61008736600461032d565b6100fe565b005b6100a161009c3660046103f0565b610204565b604051908152602001610070565b61008c6100bd36600461032d565b5050505050505050565b6001600160a01b0380841660009081526020818152604080832093861683529290529081206100f69083610267565b949350505050565b600061010a8989610204565b90506101173384836100c7565b156101695760405162461bcd60e51b815260206004820152601a60248201527f4964456e666f726365723a69642d616c72656164792d7573656400000000000060448201526064015b60405180910390fd5b336000908152602081815260408083206001600160a01b03871684528252808320600885901c845290915290208054600160ff84161b179055826001600160a01b0316826001600160a01b0316336001600160a01b03167f6286af1aaf28b34723a53056e5608eabb40c823d1ce093ff371cf08c502431d6846040516101f191815260200190565b60405180910390a4505050505050505050565b6000602082146102565760405162461bcd60e51b815260206004820152601f60248201527f4964456e666f726365723a696e76616c69642d7465726d732d6c656e677468006044820152606401610160565b6102608284610432565b9392505050565b600881901c600090815260208390526040902054600160ff83161b1615155b92915050565b80356001600160a01b03811681146102a357600080fd5b919050565b6000806000606084860312156102bd57600080fd5b6102c68461028c565b92506102d46020850161028c565b9150604084013590509250925092565b60008083601f8401126102f657600080fd5b50813567ffffffffffffffff81111561030e57600080fd5b60208301915083602082850101111561032657600080fd5b9250929050565b60008060008060008060008060c0898b03121561034957600080fd5b883567ffffffffffffffff8082111561036157600080fd5b61036d8c838d016102e4565b909a50985060208b013591508082111561038657600080fd5b6103928c838d016102e4565b909850965060408b01359150808211156103ab57600080fd5b5089016060818c0312156103be57600080fd5b9350606089013592506103d360808a0161028c565b91506103e160a08a0161028c565b90509295985092959890939650565b6000806020838503121561040357600080fd5b823567ffffffffffffffff81111561041a57600080fd5b610426858286016102e4565b90969095509350505050565b8035602083101561028657600019602084900360031b1b169291505056fea264697066735822122028074431512be4166d9bc04a0557354e43d233df6620f59dcf4e6fea83a3a51f64736f6c63430008170033", + "nonce": "0xa", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xfa8833091d05ab547a09ca7690a05a7324d6117841d3636f839a1483e63d29e3", + "transactionType": "CREATE2", + "contractName": "LimitedCallsEnforcer", + "contractAddress": "0x4b3adad4a328bee8ba17b86074d92fe7372180cd", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x61904", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610442806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806319054d89146100515780639751a83d1461008b578063b99deb0e146100a0578063de723eeb146100b3575b600080fd5b61007961005f36600461024e565b600060208181529281526040808220909352908152205481565b60405190815260200160405180910390f35b61009e6100993660046102c1565b6100cb565b005b6100796100ae366004610384565b6101bd565b61009e6100c13660046102c1565b5050505050505050565b60006100d789896101bd565b336000908152602081815260408083208884529091528120805492935090918290610101906103c6565b91829055509050818111156101695760405162461bcd60e51b815260206004820152602360248201527f4c696d6974656443616c6c73456e666f726365723a6c696d69742d657863656560448201526219195960ea1b60648201526084015b60405180910390fd5b604080518381526020810183905286916001600160a01b0386169133917f449da07f2c06c9d1a6b19d2454ffe749e8cf991d22f686e076a1a4844c5ff370910160405180910390a450505050505050505050565b6000602082146102215760405162461bcd60e51b815260206004820152602960248201527f4c696d6974656443616c6c73456e666f726365723a696e76616c69642d7465726044820152680dae65ad8cadccee8d60bb1b6064820152608401610160565b61022b82846103ed565b9392505050565b80356001600160a01b038116811461024957600080fd5b919050565b6000806040838503121561026157600080fd5b61026a83610232565b946020939093013593505050565b60008083601f84011261028a57600080fd5b50813567ffffffffffffffff8111156102a257600080fd5b6020830191508360208285010111156102ba57600080fd5b9250929050565b60008060008060008060008060c0898b0312156102dd57600080fd5b883567ffffffffffffffff808211156102f557600080fd5b6103018c838d01610278565b909a50985060208b013591508082111561031a57600080fd5b6103268c838d01610278565b909850965060408b013591508082111561033f57600080fd5b5089016060818c03121561035257600080fd5b93506060890135925061036760808a01610232565b915061037560a08a01610232565b90509295985092959890939650565b6000806020838503121561039757600080fd5b823567ffffffffffffffff8111156103ae57600080fd5b6103ba85828601610278565b90969095509350505050565b6000600182016103e657634e487b7160e01b600052601160045260246000fd5b5060010190565b8035602083101561040657600019602084900360031b1b165b9291505056fea2646970667358221220f78aa8066d472e78f2d898b70704f695cf682a9b2914539b1a5a83b1dd87e31064736f6c63430008170033", + "nonce": "0xb", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x29de9a429163e8c8a0a8c6cae9f50c61cb49ac1c593c5c96d0cbd9eeaa09c0f1", + "transactionType": "CREATE2", + "contractName": "NonceEnforcer", + "contractAddress": "0x2f32ff3fc3086d7f63f16fe8d0065390d460b40d", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x68e23", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610457806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80632bd4ed211461005c5780639751a83d14610096578063b99deb0e146100ab578063de723eeb146100be578063f5743c4c146100d6575b600080fd5b61008461006a366004610266565b600060208181529281526040808220909352908152205481565b60405190815260200160405180910390f35b6100a96100a43660046102e2565b6100e9565b005b6100846100b93660046103a5565b610178565b6100a96100cc3660046102e2565b5050505050505050565b6100a96100e43660046103e7565b6101e6565b60006100f58989610178565b336000908152602081815260408083206001600160a01b0388168452909152902054909150811461016d5760405162461bcd60e51b815260206004820152601b60248201527f4e6f6e6365456e666f726365723a696e76616c69642d6e6f6e6365000000000060448201526064015b60405180910390fd5b505050505050505050565b6000602082146101d55760405162461bcd60e51b815260206004820152602260248201527f4e6f6e6365456e666f726365723a696e76616c69642d7465726d732d6c656e676044820152610e8d60f31b6064820152608401610164565b6101df8284610402565b9392505050565b6001600160a01b038116600081815260208181526040808320338085529083529281902080546001810190915590518181529093917fe02d340254c92bc3ad96f0fceb790db939e11c669c1f4c8a549d248f17130b33910160405180910390a35050565b80356001600160a01b038116811461026157600080fd5b919050565b6000806040838503121561027957600080fd5b6102828361024a565b91506102906020840161024a565b90509250929050565b60008083601f8401126102ab57600080fd5b50813567ffffffffffffffff8111156102c357600080fd5b6020830191508360208285010111156102db57600080fd5b9250929050565b60008060008060008060008060c0898b0312156102fe57600080fd5b883567ffffffffffffffff8082111561031657600080fd5b6103228c838d01610299565b909a50985060208b013591508082111561033b57600080fd5b6103478c838d01610299565b909850965060408b013591508082111561036057600080fd5b5089016060818c03121561037357600080fd5b93506060890135925061038860808a0161024a565b915061039660a08a0161024a565b90509295985092959890939650565b600080602083850312156103b857600080fd5b823567ffffffffffffffff8111156103cf57600080fd5b6103db85828601610299565b90969095509350505050565b6000602082840312156103f957600080fd5b6101df8261024a565b8035602083101561041b57600019602084900360031b1b165b9291505056fea2646970667358221220b8ac9ab0759f02df69d888b08c000fa4dfa4048ad7f88931687eeff439dd484a64736f6c63430008170033", + "nonce": "0xc", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x90f82929b07026741ef6691b46cdbdcc94987df529a5a7d4fac6a7b42d5dbf04", + "transactionType": "CREATE2", + "contractName": "TimestampEnforcer", + "contractAddress": "0x78e05f779490c24bf3bfa135b4112e7003b321cd", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x68cc4", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610455806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610092575b600080fd5b6100596100543660046102b7565b6100aa565b005b61006e61006936600461037a565b6101b2565b604080516001600160801b0393841681529290911660208301520160405180910390f35b6100596100a03660046102b7565b5050505050505050565b6000806100b78a8a6101b2565b90925090506001600160801b0382161561013357816001600160801b031642116101335760405162461bcd60e51b815260206004820152602260248201527f54696d657374616d70456e666f726365723a6561726c792d64656c656761746960448201526137b760f11b60648201526084015b60405180910390fd5b6001600160801b038116156101a657806001600160801b031642106101a65760405162461bcd60e51b8152602060048201526024808201527f54696d657374616d70456e666f726365723a657870697265642d64656c6567616044820152633a34b7b760e11b606482015260840161012a565b50505050505050505050565b600080602083146102145760405162461bcd60e51b815260206004820152602660248201527f54696d657374616d70456e666f726365723a696e76616c69642d7465726d732d6044820152650d8cadccee8d60d31b606482015260840161012a565b61022183601081876103bc565b61022a916103e6565b60801c905061023d6010600085876103bc565b610246916103e6565b60801c91509250929050565b60008083601f84011261026457600080fd5b50813567ffffffffffffffff81111561027c57600080fd5b60208301915083602082850101111561029457600080fd5b9250929050565b80356001600160a01b03811681146102b257600080fd5b919050565b60008060008060008060008060c0898b0312156102d357600080fd5b883567ffffffffffffffff808211156102eb57600080fd5b6102f78c838d01610252565b909a50985060208b013591508082111561031057600080fd5b61031c8c838d01610252565b909850965060408b013591508082111561033557600080fd5b5089016060818c03121561034857600080fd5b93506060890135925061035d60808a0161029b565b915061036b60a08a0161029b565b90509295985092959890939650565b6000806020838503121561038d57600080fd5b823567ffffffffffffffff8111156103a457600080fd5b6103b085828601610252565b90969095509350505050565b600080858511156103cc57600080fd5b838611156103d957600080fd5b5050820193919092039150565b6fffffffffffffffffffffffffffffffff1981358181169160108510156104175780818660100360031b1b83161692505b50509291505056fea2646970667358221220032d822c6d896afe6d14f1080a0918e2996d1c61fe51449e6ecf5841d50e5ea464736f6c63430008170033", + "nonce": "0xd", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x98322939a0f3308f8a28788f9a2a24b724630f10d560dc13f3dbb6b6532e1d9f", + "transactionType": "CREATE2", + "contractName": "ValueLteEnforcer", + "contractAddress": "0xfc20ede0a1132e839fbda9d7ed3904ff3c89540f", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x4e4e9", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061033a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610080575b600080fd5b6100596100543660046101e0565b610098565b005b61006e6100693660046102a3565b61010a565b60405190815260200160405180910390f35b61005961008e3660046101e0565b5050505050505050565b60006100a4898961010a565b905080856020013511156100ff5760405162461bcd60e51b815260206004820152601f60248201527f56616c75654c7465456e666f726365723a76616c75652d746f6f2d686967680060448201526064015b60405180910390fd5b505050505050505050565b60006020821461016a5760405162461bcd60e51b815260206004820152602560248201527f56616c75654c7465456e666f726365723a696e76616c69642d7465726d732d6c6044820152640cadccee8d60db1b60648201526084016100f6565b61017482846102e5565b9392505050565b60008083601f84011261018d57600080fd5b50813567ffffffffffffffff8111156101a557600080fd5b6020830191508360208285010111156101bd57600080fd5b9250929050565b80356001600160a01b03811681146101db57600080fd5b919050565b60008060008060008060008060c0898b0312156101fc57600080fd5b883567ffffffffffffffff8082111561021457600080fd5b6102208c838d0161017b565b909a50985060208b013591508082111561023957600080fd5b6102458c838d0161017b565b909850965060408b013591508082111561025e57600080fd5b5089016060818c03121561027157600080fd5b93506060890135925061028660808a016101c4565b915061029460a08a016101c4565b90509295985092959890939650565b600080602083850312156102b657600080fd5b823567ffffffffffffffff8111156102cd57600080fd5b6102d98582860161017b565b90969095509350505050565b803560208310156102fe57600019602084900360031b1b165b9291505056fea2646970667358221220cd4bcb89c90c60ef26b293e82752e5ff08228ce4ed86119c5597e63559710ece64736f6c63430008170033", + "nonce": "0xe", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x28ded0", + "logs": [ + { + "address": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44" + ], + "data": "0x", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "transactionHash": "0xc401aa79e52a75ffe318ff1de2f04fc1cb5fa12fafbe141eed57f86463e8c668", + "transactionIndex": "0x4", + "logIndex": "0xb", + "removed": false + }, + { + "address": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "topics": [ + "0x04a46d9007577c7ff1e513b900545162ec25d25991ae3dc60cf26ec01a84806d", + "0x4f0aeb4a10068c847f74592d99da8ec1544209094c304a8c9d1773c2a425a343", + "0x000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d78" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000e708000000000000000000000000000000000000000000000000000000000000001144656c65676174696f6e4d616e6167657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013100000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "transactionHash": "0xc401aa79e52a75ffe318ff1de2f04fc1cb5fa12fafbe141eed57f86463e8c668", + "transactionIndex": "0x4", + "logIndex": "0xc", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000000000000000000000000000000800000004000000000000000000000000000000000000000000000000000000000041400020000000000000000000000040000000000000001000000001400000000000000000000000000020000000000000000000800000000000080000000000000000000480000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000008000000020000000000800000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xc401aa79e52a75ffe318ff1de2f04fc1cb5fa12fafbe141eed57f86463e8c668", + "transactionIndex": "0x4", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x1fac83", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x583548", + "logs": [ + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "transactionHash": "0xfd3fd79c2ab17cfeb1be4d2cfcb9ce9ee1fed331d029a564bc96192fbbdc2bda", + "transactionIndex": "0x5", + "logIndex": "0xd", + "removed": false + }, + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0xb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d", + "0x000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d78" + ], + "data": "0x", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "transactionHash": "0xfd3fd79c2ab17cfeb1be4d2cfcb9ce9ee1fed331d029a564bc96192fbbdc2bda", + "transactionIndex": "0x5", + "logIndex": "0xe", + "removed": false + }, + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0xee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a99", + "0x0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032" + ], + "data": "0x", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "transactionHash": "0xfd3fd79c2ab17cfeb1be4d2cfcb9ce9ee1fed331d029a564bc96192fbbdc2bda", + "transactionIndex": "0x5", + "logIndex": "0xf", + "removed": false + }, + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0x78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d03" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "transactionHash": "0xfd3fd79c2ab17cfeb1be4d2cfcb9ce9ee1fed331d029a564bc96192fbbdc2bda", + "transactionIndex": "0x5", + "logIndex": "0x10", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000002000010000000000000000000000200000000000000000000000000000000000000000000000000000000000020810000000020000010000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200080000000000000000000080000000000000000008800000000000000000000000080000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000001080000000000000000000004000000000000000000000000000000000000000000000000000000800000000000000100000000000000", + "type": "0x2", + "transactionHash": "0xfd3fd79c2ab17cfeb1be4d2cfcb9ce9ee1fed331d029a564bc96192fbbdc2bda", + "transactionIndex": "0x5", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x2f5678", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x9bc6ba", + "logs": [ + { + "address": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "transactionHash": "0xb193634c8a35853ca5a8dda2cd6f9c1ae1ab401f5022b6d7081fc672a26e6069", + "transactionIndex": "0x6", + "logIndex": "0x11", + "removed": false + }, + { + "address": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "topics": [ + "0xb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d", + "0x000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d78" + ], + "data": "0x", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "transactionHash": "0xb193634c8a35853ca5a8dda2cd6f9c1ae1ab401f5022b6d7081fc672a26e6069", + "transactionIndex": "0x6", + "logIndex": "0x12", + "removed": false + }, + { + "address": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "topics": [ + "0xee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a99", + "0x0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032" + ], + "data": "0x", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "transactionHash": "0xb193634c8a35853ca5a8dda2cd6f9c1ae1ab401f5022b6d7081fc672a26e6069", + "transactionIndex": "0x6", + "logIndex": "0x13", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000810000000020000010000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000080000000000000000000080000000000000000008800000000000000000000000080000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000100000000000000000000000000000000000200000000000000800000000000000100000000000000", + "type": "0x2", + "transactionHash": "0xb193634c8a35853ca5a8dda2cd6f9c1ae1ab401f5022b6d7081fc672a26e6069", + "transactionIndex": "0x6", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x439172", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xa1550f", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xe4c27ddf1a20409ed468c1926a70151442bab0d7bf1424b073c42cc13fd36e1e", + "transactionIndex": "0x7", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x58e55", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xa7a673", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x1fea0515a7b0fc7ef67d87dfbac1c5a5c8f89bccd62ede5eabddb784d3e43d4f", + "transactionIndex": "0x8", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x65164", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xad6829", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xd42e14c91f7e5a8226fb41942b6c789baff681a79f28ce7d183b3a3e1a616b9a", + "transactionIndex": "0x9", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x5c1b6", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xb1e7bb", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xece04f176117704c838ce67bb1c68576add1e18349aaa4753ba5967c9467bad9", + "transactionIndex": "0xa", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x47f92", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xb86361", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x14130fe294aaa9b80daec0fc91256312f186055e5c057f62a5fd532a103abf6c", + "transactionIndex": "0xb", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x67ba6", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xbf5cd4", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x3eb1b1d29d58ec8402fe3de7911c2e7a722e549fe5b26c411d2d75483e4824df", + "transactionIndex": "0xc", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x6f973", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc649d4", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x07ab4b9a75b4afe943696391e1aebb2219cb78198a13ef9db3dfe67ca792789d", + "transactionIndex": "0xd", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x6ed00", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xcaed12", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x833f7c0bcea43bc2752e2afa5047b64bc31bc2190becab94cba87a5ec79eed98", + "transactionIndex": "0xe", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x4a33e", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xcf5738", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xfa8833091d05ab547a09ca7690a05a7324d6117841d3636f839a1483e63d29e3", + "transactionIndex": "0xf", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x46a26", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xd3d2aa", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x29de9a429163e8c8a0a8c6cae9f50c61cb49ac1c593c5c96d0cbd9eeaa09c0f1", + "transactionIndex": "0x10", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x47b72", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xd84d2c", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x90f82929b07026741ef6691b46cdbdcc94987df529a5a7d4fac6a7b42d5dbf04", + "transactionIndex": "0x11", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x47a82", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xdbd842", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x98322939a0f3308f8a28788f9a2a24b724630f10d560dc13f3dbb6b6532e1d9f", + "transactionIndex": "0x12", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x38b16", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1720356824, + "chain": 59144, + "commit": null +} \ No newline at end of file diff --git a/broadcast/DeployEnvironmentSetUp.s.sol/59144/run-latest.json b/broadcast/DeployEnvironmentSetUp.s.sol/59144/run-latest.json new file mode 100644 index 0000000..1962eff --- /dev/null +++ b/broadcast/DeployEnvironmentSetUp.s.sol/59144/run-latest.json @@ -0,0 +1,673 @@ +{ + "transactions": [ + { + "hash": "0xc401aa79e52a75ffe318ff1de2f04fc1cb5fa12fafbe141eed57f86463e8c668", + "transactionType": "CREATE2", + "contractName": "DelegationManager", + "contractAddress": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "function": null, + "arguments": [ + "0xB0403B32f54d0Bd752113f4009e8B534C6669f44" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x2e52b2", + "value": "0x0", + "input": "0x44656c654761746f7200000000000000000000000000000000000000000000006101606040523480156200001257600080fd5b50604051620029e7380380620029e7833981016040819052620000359162000384565b60408051808201825260118152702232b632b3b0ba34b7b726b0b730b3b2b960791b602080830191909152825180840190935260018352603160f81b9083015290826001600160a01b038116620000a757604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b620000b28162000204565b506001805460ff60a01b19169055620000cd82600262000222565b61012052620000de81600362000222565b61014052815160208084019190912060e052815190820120610100524660a0526200015b60e0516101005160408051600080516020620029c783398151915260208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526000620001706200025b565b9050306001600160a01b0316817f04a46d9007577c7ff1e513b900545162ec25d25991ae3dc60cf26ec01a84806d604051806040016040528060118152602001702232b632b3b0ba34b7b726b0b730b3b2b960791b815250604051806040016040528060018152602001603160f81b81525046604051620001f493929190620003fe565b60405180910390a35050620005e5565b600180546001600160a01b03191690556200021f81620002f1565b50565b600060208351101562000242576200023a8362000341565b905062000255565b816200024f8482620004df565b5060ff90505b92915050565b600060c0516001600160a01b0316306001600160a01b031614801562000282575060a05146145b156200028f575060805190565b620002ec60e0516101005160408051600080516020620029c783398151915260208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b905090565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080829050601f815111156200036f578260405163305a27a960e01b81526004016200009e9190620005ab565b80516200037c82620005c0565b179392505050565b6000602082840312156200039757600080fd5b81516001600160a01b0381168114620003af57600080fd5b9392505050565b6000815180845260005b81811015620003de57602081850181015186830182015201620003c0565b506000602082860101526020601f19601f83011685010191505092915050565b606081526000620004136060830186620003b6565b8281036020840152620004278186620003b6565b915050826040830152949350505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200046357607f821691505b6020821081036200048457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004da576000816000526020600020601f850160051c81016020861015620004b55750805b601f850160051c820191505b81811015620004d657828155600101620004c1565b5050505b505050565b81516001600160401b03811115620004fb57620004fb62000438565b62000513816200050c84546200044e565b846200048a565b602080601f8311600181146200054b5760008415620005325750858301515b600019600386901b1c1916600185901b178555620004d6565b600085815260208120601f198616915b828110156200057c578886015182559484019460019091019084016200055b565b50858210156200059b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602081526000620003af6020830184620003b6565b80516020808301519190811015620004845760001960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516123876200064060003960006113bb0152600061138e015260006112f3015260006112cb01526000611226015260006112500152600061127a01526123876000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80637fade287116100b8578063a3f4df7e1161007c578063a3f4df7e1461028e578063acb8cc49146102cb578063e1520f54146102eb578063e30c3978146102fe578063f2fde38b1461030f578063ffa1ad741461032257600080fd5b80637fade2871461023f57806383ebb771146102525780638456cb591461025a57806384b0196e146102625780638da5cb5b1461027d57600080fd5b806358909ebc1161010a57806358909ebc146101c65780635c975abb146101e75780635daa6539146101f9578063661346071461021c578063715018a61461022f57806379ba50971461023757600080fd5b80631b13cac2146101475780632d40d052146101635780633ed01015146101965780633f4ba83a146101ab57806349934047146101b3575b600080fd5b61015060001981565b6040519081526020015b60405180910390f35b6101866101713660046118c7565b60056020526000908152604090205460ff1681565b604051901515815260200161015a565b6101a96101a43660046118e0565b610346565b005b6101a9610440565b6101a96101c13660046118e0565b610452565b6101cf610a1181565b6040516001600160a01b03909116815260200161015a565b600154600160a01b900460ff16610186565b6101866102073660046118c7565b60046020526000908152604090205460ff1681565b61015061022a3660046118e0565b610542565b6101a961055b565b6101a961056d565b6101a961024d3660046118e0565b6105b6565b6101506106a7565b6101a96106b6565b61026a6106c6565b60405161015a9796959493929190611967565b6000546001600160a01b03166101cf565b6102be604051806040016040528060118152602001702232b632b3b0ba34b7b726b0b730b3b2b960791b81525081565b60405161015a9190611a00565b6102be604051806040016040528060018152602001603160f81b81525081565b6101a96102f9366004611a13565b61070c565b6001546001600160a01b03166101cf565b6101a961031d366004611ac9565b611072565b6102be604051806040016040528060058152602001640312e302e360dc1b81525081565b6103566040820160208301611ac9565b6001600160a01b038116331461037f5760405163b9f0f17160e01b815260040160405180910390fd5b600061038a83610542565b60008181526005602052604090205490915060ff166103bc57604051637952fbad60e11b815260040160405180910390fd5b6000818152600560209081526040909120805460ff191690556103e190840184611ac9565b6001600160a01b03166103fa6040850160208601611ac9565b6001600160a01b0316827f3feadce88fc1b49db633a56fd5307ed6ee18734df83bcc4011daa720c9cd95f1866040516104339190611c18565b60405180910390a4505050565b6104486110e3565b610450611110565b565b6104626040820160208301611ac9565b6001600160a01b038116331461048b5760405163b9f0f17160e01b815260040160405180910390fd5b600061049683610542565b60008181526005602052604090205490915060ff16156104c857604051625ecddb60e01b815260040160405180910390fd5b6000818152600560209081526040909120805460ff191660011790556104f090840184611ac9565b6001600160a01b03166105096040850160208601611ac9565b6001600160a01b0316827fea589ba9473ee1fe77d352c7ed919747715a5d22931b972de9b02a907c66d5dd866040516104339190611c18565b600061055561055083611fae565b611165565b92915050565b6105636110e3565b6104506000611200565b60015433906001600160a01b031681146105aa5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b6105b381611200565b50565b6105c66040820160208301611ac9565b6001600160a01b03811633146105ef5760405163b9f0f17160e01b815260040160405180910390fd5b60006105fa83610542565b60008181526004602052604090205490915060ff161561062d5760405163119b4fd360e11b815260040160405180910390fd5b6000818152600460209081526040909120805460ff1916600117905561065590840184611ac9565b6001600160a01b031661066e6040850160208601611ac9565b6001600160a01b0316827fb9b56ecd70a93a7fcb54a1072d6a9c7ff488f46d6c656bb0a0fa453924658704866040516104339190611c18565b60006106b1611219565b905090565b6106be6110e3565b610450611344565b6000606080600080600060606106da611387565b6106e26113b4565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6107146113e1565b600061072283850185611fba565b905080516000036107465760405163efe957cf60e01b815260040160405180910390fd5b600081516001600160401b0381111561076157610761611ce9565b60405190808252806020026020018201604052801561078a578160200160208202803683370190505b5090506107db6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600080191681526020016060815260200160008152602001606081525090565b336001600160a01b0316836000815181106107f8576107f861206a565b6020026020010151600001516001600160a01b03161415801561084d5750610a116001600160a01b0316836000815181106108355761083561206a565b6020026020010151600001516001600160a01b031614155b1561086b57604051632d618d8160e21b815260040160405180910390fd5b60005b8351811015610a98578381815181106108895761088961206a565b6020026020010151915061089c82611165565b8382815181106108ae576108ae61206a565b6020026020010181815250508160a001515160000361091d57600460008483815181106108dd576108dd61206a565b60209081029190910181015182528101919091526040016000205460ff166109185760405163a9e649e960e01b815260040160405180910390fd5b610a90565b60208201516001600160a01b0381163b6000036109c157600061098761097d6109446106a7565b8786815181106109565761095661206a565b602002602001015160405161190160f01b8152600281019290925260228201526042902090565b8560a0015161140c565b9050816001600160a01b0316816001600160a01b0316146109bb57604051638baa579f60e01b815260040160405180910390fd5b50610a8e565b60006109e06109ce6106a7565b8685815181106109565761095661206a565b60a0850151604051630b135d3f60e11b81529192506000916001600160a01b03851691631626ba7e91610a17918691600401612080565b602060405180830381865afa158015610a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5891906120a1565b6001600160e01b0319169050630b135d3f60e11b8114610a8b57604051638baa579f60e01b815260040160405180910390fd5b50505b505b60010161086e565b5060005b8351811015610c585760056000848381518110610abb57610abb61206a565b60209081029190910181015182528101919091526040016000205460ff1615610af7576040516302dd502960e11b815260040160405180910390fd5b60018451610b0591906120e1565b8114610c0e5782610b178260016120f4565b81518110610b2757610b2761206a565b6020026020010151848281518110610b4157610b4161206a565b60200260200101516040015114610b6b57604051636f6a1b8760e11b815260040160405180910390fd5b600084610b798360016120f4565b81518110610b8957610b8961206a565b6020026020010151600001519050610a116001600160a01b0316816001600160a01b031614158015610bea5750806001600160a01b0316858381518110610bd257610bd261206a565b6020026020010151602001516001600160a01b031614155b15610c0857604051632d618d8160e21b815260040160405180910390fd5b50610c50565b60001960001b848281518110610c2657610c2661206a565b60200260200101516040015114610c5057604051636f6a1b8760e11b815260040160405180910390fd5b600101610a9c565b5060005b8351811015610db8576000848281518110610c7957610c7961206a565b60200260200101516060015190506000848381518110610c9b57610c9b61206a565b602002602001015190506000868481518110610cb957610cb961206a565b602002602001015160200151905060008351905060005b81811015610da8576000858281518110610cec57610cec61206a565b6020026020010151600001519050806001600160a01b0316639751a83d878481518110610d1b57610d1b61206a565b602002602001015160200151888581518110610d3957610d3961206a565b6020026020010151604001518e8989336040518763ffffffff1660e01b8152600401610d6a96959493929190612152565b600060405180830381600087803b158015610d8457600080fd5b505af1158015610d98573d6000803e3d6000fd5b5050505050806001019050610cd0565b5050505050806001019050610c5c565b508260018451610dc891906120e1565b81518110610dd857610dd861206a565b6020026020010151602001516001600160a01b03166326f0aef7856040518263ffffffff1660e01b8152600401610e0f91906121b4565b600060405180830381600087803b158015610e2957600080fd5b505af1158015610e3d573d6000803e3d6000fd5b505084519150505b8015610fc657600084610e596001846120e1565b81518110610e6957610e6961206a565b6020026020010151606001519050600084600184610e8791906120e1565b81518110610e9757610e9761206a565b60200260200101519050600086600185610eb191906120e1565b81518110610ec157610ec161206a565b602002602001015160200151905060008351905060005b81811015610fb0576000858281518110610ef457610ef461206a565b6020026020010151600001519050806001600160a01b031663de723eeb878481518110610f2357610f2361206a565b602002602001015160200151888581518110610f4157610f4161206a565b6020026020010151604001518e8989336040518763ffffffff1660e01b8152600401610f7296959493929190612152565b600060405180830381600087803b158015610f8c57600080fd5b505af1158015610fa0573d6000803e3d6000fd5b5050505050806001019050610ed8565b505050505080610fbf906121c7565b9050610e45565b5060005b835181101561106957336001600160a01b03168460018651610fec91906120e1565b81518110610ffc57610ffc61206a565b6020026020010151602001516001600160a01b03167f40dadaa36c6c2e3d7317e24757451ffb2d603d875f0ad5e92c5dd156573b18738684815181106110445761104461206a565b602002602001015160405161105991906121de565b60405180910390a3600101610fca565b50505050505050565b61107a6110e3565b600180546001600160a01b0383166001600160a01b031990911681179091556110ab6000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000546001600160a01b031633146104505760405163118cdaa760e01b81523360048201526024016105a1565b611118611436565b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000807f88c1d2ecf185adf710588203a5f263f0ff61be0d33da39792cde19ba9aa4331e8360000151846020015185604001516111a58760600151611460565b6080808901516040805160208101989098526001600160a01b03968716908801529490931660608601529184015260a083015260c082015260e0015b60408051601f1981840301815291905280516020909101209392505050565b600180546001600160a01b03191690556105b38161152b565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561127257507f000000000000000000000000000000000000000000000000000000000000000046145b1561129c57507f000000000000000000000000000000000000000000000000000000000000000090565b6106b1604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b61134c6113e1565b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586111483390565b60606106b17f0000000000000000000000000000000000000000000000000000000000000000600261157b565b60606106b17f0000000000000000000000000000000000000000000000000000000000000000600361157b565b600154600160a01b900460ff16156104505760405163d93c066560e01b815260040160405180910390fd5b60008060008061141c8686611626565b92509250925061142c8282611673565b5090949350505050565b600154600160a01b900460ff1661045057604051638dfc202b60e01b815260040160405180910390fd5b60008082516001600160401b0381111561147c5761147c611ce9565b6040519080825280602002602001820160405280156114a5578160200160208202803683370190505b50905060005b83518110156114fb576114d68482815181106114c9576114c961206a565b6020026020010151611730565b8282815181106114e8576114e861206a565b60209081029190910101526001016114ab565b508060405160200161150d91906122cb565b60405160208183030381529060405280519060200120915050919050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606060ff83146115955761158e83611791565b9050610555565b8180546115a190612301565b80601f01602080910402602001604051908101604052809291908181526020018280546115cd90612301565b801561161a5780601f106115ef5761010080835404028352916020019161161a565b820191906000526020600020905b8154815290600101906020018083116115fd57829003601f168201915b50505050509050610555565b600080600083516041036116605760208401516040850151606086015160001a611652888285856117d0565b95509550955050505061166c565b50508151600091506002905b9250925092565b60008260038111156116875761168761233b565b03611690575050565b60018260038111156116a4576116a461233b565b036116c25760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156116d6576116d661233b565b036116f75760405163fce698f760e01b8152600481018290526024016105a1565b600382600381111561170b5761170b61233b565b0361172c576040516335e2f38360e21b8152600481018290526024016105a1565b5050565b6000807f80ad7e1b04ee6d994a125f4714ca0720908bd80ed16063ec8aee4b88e9253e2d83600001518460200151805190602001206040516020016111e1939291909283526001600160a01b03919091166020830152604082015260600190565b6060600061179e8361189f565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561180b5750600091506003905082611895565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561185f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661188b57506000925060019150829050611895565b9250600091508190505b9450945094915050565b600060ff8216601f81111561055557604051632cd44ac360e21b815260040160405180910390fd5b6000602082840312156118d957600080fd5b5035919050565b6000602082840312156118f257600080fd5b81356001600160401b0381111561190857600080fd5b820160c0818503121561191a57600080fd5b9392505050565b6000815180845260005b818110156119475760208185018101518683018201520161192b565b506000602082860101526020601f19601f83011685010191505092915050565b60ff60f81b881681526000602060e0602084015261198860e084018a611921565b838103604085015261199a818a611921565b606085018990526001600160a01b038816608086015260a0850187905284810360c08601528551808252602080880193509091019060005b818110156119ee578351835292840192918401916001016119d2565b50909c9b505050505050505050505050565b60208152600061191a6020830184611921565b600080600060408486031215611a2857600080fd5b83356001600160401b0380821115611a3f57600080fd5b818601915086601f830112611a5357600080fd5b813581811115611a6257600080fd5b876020828501011115611a7457600080fd5b602092830195509350908501359080821115611a8f57600080fd5b50840160608187031215611aa257600080fd5b809150509250925092565b80356001600160a01b0381168114611ac457600080fd5b919050565b600060208284031215611adb57600080fd5b61191a82611aad565b6000808335601e19843603018112611afb57600080fd5b83016020810192503590506001600160401b03811115611b1a57600080fd5b803603821315611b2957600080fd5b9250929050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b88811015611c0a57858403601f19018a52823536899003605e19018112611b98578283fd5b880160606001600160a01b03611bad83611aad565b168652611bbc87830183611ae4565b8289890152611bce8389018284611b30565b925050506040611be081840184611ae4565b935087830382890152611bf4838583611b30565b9d89019d97505050938601935050600101611b73565b509198975050505050505050565b6020815260006001600160a01b0380611c3085611aad565b16602084015280611c4360208601611aad565b16604084015250604083013560608301526060830135601e19843603018112611c6b57600080fd5b83016020810190356001600160401b03811115611c8757600080fd5b8060051b3603821315611c9957600080fd5b60c06080850152611cae60e085018284611b59565b915050608084013560a0840152611cc860a0850185611ae4565b848303601f190160c0860152611cdf838284611b30565b9695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715611d2157611d21611ce9565b60405290565b60405160c081016001600160401b0381118282101715611d2157611d21611ce9565b604051601f8201601f191681016001600160401b0381118282101715611d7157611d71611ce9565b604052919050565b60006001600160401b03821115611d9257611d92611ce9565b5060051b60200190565b600082601f830112611dad57600080fd5b81356001600160401b03811115611dc657611dc6611ce9565b611dd9601f8201601f1916602001611d49565b818152846020838601011115611dee57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f830112611e1c57600080fd5b81356020611e31611e2c83611d79565b611d49565b82815260059290921b84018101918181019086841115611e5057600080fd5b8286015b84811015611eff5780356001600160401b0380821115611e745760008081fd5b908801906060828b03601f1901811315611e8e5760008081fd5b611e96611cff565b611ea1888501611aad565b815260408085013584811115611eb75760008081fd5b611ec58e8b83890101611d9c565b838b015250918401359183831115611edd5760008081fd5b611eeb8d8a85880101611d9c565b908201528652505050918301918301611e54565b509695505050505050565b600060c08284031215611f1c57600080fd5b611f24611d27565b9050611f2f82611aad565b8152611f3d60208301611aad565b60208201526040820135604082015260608201356001600160401b0380821115611f6657600080fd5b611f7285838601611e0b565b60608401526080840135608084015260a0840135915080821115611f9557600080fd5b50611fa284828501611d9c565b60a08301525092915050565b60006105553683611f0a565b60006020808385031215611fcd57600080fd5b82356001600160401b0380821115611fe457600080fd5b818501915085601f830112611ff857600080fd5b8135612006611e2c82611d79565b81815260059190911b8301840190848101908883111561202557600080fd5b8585015b8381101561205d578035858111156120415760008081fd5b61204f8b89838a0101611f0a565b845250918601918601612029565b5098975050505050505050565b634e487b7160e01b600052603260045260246000fd5b8281526040602082015260006120996040830184611921565b949350505050565b6000602082840312156120b357600080fd5b81516001600160e01b03198116811461191a57600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610555576105556120cb565b80820180821115610555576105556120cb565b6001600160a01b0361211882611aad565b1682526020810135602083015260006121346040830183611ae4565b60606040860152612149606086018284611b30565b95945050505050565b60c08152600061216560c0830189611921565b82810360208401526121778189611921565b9050828103604084015261218b8188612107565b606084019690965250506001600160a01b039283166080820152911660a0909101529392505050565b60208152600061191a6020830184612107565b6000816121d6576121d66120cb565b506000190190565b602080825282516001600160a01b0390811683830152838201518116604080850191909152808501516060808601919091528086015160c06080870152805160e0870181905260009594610100600583901b8901810195919493870193919290890190885b8181101561229d5760ff198b8903018352855187815116895289810151858b8b0152612271868b0182611921565b918701518a83038b8901529190506122898183611921565b995050509488019491880191600101612243565b50505050505050608085015160a085015260a08501519150601f198482030160c08501526121498183611921565b815160009082906020808601845b838110156122f5578151855293820193908201906001016122d9565b50929695505050505050565b600181811c9082168061231557607f821691505b60208210810361233557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052602160045260246000fdfea26469706673582212206702181458ece90d9cf27649387478caa2ed36ffd86ba70b239c4be34106280764736f6c634300081700338b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "nonce": "0x0", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xfd3fd79c2ab17cfeb1be4d2cfcb9ce9ee1fed331d029a564bc96192fbbdc2bda", + "transactionType": "CREATE2", + "contractName": "MultiSigDeleGator", + "contractAddress": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "function": null, + "arguments": [ + "0xbe4138886cB096bDC1B930F2f0ca7892AA234D78", + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x4162a1", + "value": "0x0", + "input": "0x44656c654761746f72000000000000000000000000000000000000000000000060e0604052306080523480156200001557600080fd5b506040516200396338038062003963833981016040819052620000389162000208565b8181620000446200013e565b6001600160a01b0380831660a081905290821660c0526040517fb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d90600090a26040516001600160a01b038216907fee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a9990600090a250506000197fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c0281905560408051918252517fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c00917f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d03919081900360200190a150505062000247565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156200018f5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001ef5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b0381168114620001ef57600080fd5b600080604083850312156200021c57600080fd5b82516200022981620001f2565b60208401519092506200023c81620001f2565b809150509250929050565b60805160a05160c0516136216200034260003960008181610633015281816108a001528181610b0001528181610bbb01528181610c3c01528181610cba01528181610e1f01528181610ed401528181610f5b015281816110b9015281816111f9015281816112ac0152818161131e0152818161138901528181611521015281816115b4015281816115f6015281816116ec015281816117ca015281816119e0015261240a01526000818161077201528181610b6601528181610d1d01528181610da001528181610e8201528181611130015281816113ec015261174f015260008181611b8201528181611bab015261211901526136216000f3fe60806040526004361061024a5760003560e01c80637df73e2711610139578063bc197c81116100b6578063e3d9109f1161007a578063e3d9109f1461070c578063e75235b81461072c578063ea4d3c9b14610760578063eb12d61e14610794578063f23a6e61146107b4578063ffa1ad74146107d457600080fd5b8063bc197c8114610682578063c399ec88146106a2578063d087d288146106b7578063d7d7442f146106cc578063e1520f54146106ec57600080fd5b8063a24c8f32116100fd578063a24c8f32146105a3578063aaf10f42146105b6578063ad3cb1cc146105e3578063b0d691fe14610621578063b3c650151461065557600080fd5b80637df73e27146104d95780637f07bfdc1461051f5780637fade2871461053f57806394cf795e1461055f578063a0c1deb41461058157600080fd5b80634891161f116101c75780635c1c6dcd1161018b5780635c1c6dcd1461043957806360b5bb3f1461045957806365ee81d8146104795780636af1f3991461049957806378979a80146104b957600080fd5b80634891161f146103d457806349934047146103e95780634a58db19146104095780634f1ef2861461041157806352d1902d1461042457600080fd5b806326f0aef71161020e57806326f0aef71461033457806334fcd5be146103545780633e1b0812146103745780633ed0101514610394578063445140b8146103b457600080fd5b806301ffc9a7146102565780630e316ab71461028b578063150b7a02146102ad5780631626ba7e146102e657806319822f7c1461030657600080fd5b3661025157005b600080fd5b34801561026257600080fd5b506102766102713660046128f4565b610805565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102ab6102a6366004612933565b610895565b005b3480156102b957600080fd5b506102cd6102c8366004612a05565b610ab9565b6040516001600160e01b03199091168152602001610282565b3480156102f257600080fd5b506102cd610301366004612ab8565b610ad4565b34801561031257600080fd5b50610326610321366004612b03565b610af3565b604051908152602001610282565b34801561034057600080fd5b506102ab61034f366004612b6e565b610b5b565b34801561036057600080fd5b506102ab61036f366004612bee565b610bb0565b34801561038057600080fd5b5061032661038f366004612c2f565b610c15565b3480156103a057600080fd5b506102ab6103af366004612c58565b610caf565b3480156103c057600080fd5b506102766103cf366004612c92565b610d87565b3480156103e057600080fd5b50610326601e81565b3480156103f557600080fd5b506102ab610404366004612c58565b610e14565b6102ab610eb7565b6102ab61041f366004612cab565b610f21565b34801561043057600080fd5b50610326610f33565b34801561044557600080fd5b506102ab610454366004612b6e565b610f50565b34801561046557600080fd5b506102ab610474366004612cfa565b610f99565b34801561048557600080fd5b506102ab610494366004612d53565b6110ae565b3480156104a557600080fd5b506102766104b4366004612c92565b611117565b3480156104c557600080fd5b506102ab6104d4366004612db1565b611167565b3480156104e557600080fd5b506102766104f4366004612933565b6001600160a01b031660009081526000805160206135ac833981519152602052604090205460ff1690565b34801561052b57600080fd5b506102ab61053a366004612e2d565b6112a1565b34801561054b57600080fd5b506102ab61055a366004612c58565b61137e565b34801561056b57600080fd5b50610574611421565b6040516102829190612e59565b34801561058d57600080fd5b5060008051602061358c83398151915254610326565b6102ab6105b1366004612cab565b610f29565b3480156105c257600080fd5b506105cb611494565b6040516001600160a01b039091168152602001610282565b3480156105ef57600080fd5b50610614604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102829190612ef6565b34801561062d57600080fd5b506105cb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561066157600080fd5b5061066a6114ba565b6040516001600160401b039091168152602001610282565b34801561068e57600080fd5b506102cd61069d366004612f88565b6114ed565b3480156106ae57600080fd5b50610326611509565b3480156106c357600080fd5b50610326611595565b3480156106d857600080fd5b506102ab6106e7366004612c92565b6115eb565b3480156106f857600080fd5b506102ab610707366004613035565b6116e1565b34801561071857600080fd5b506102ab61072736600461309d565b6117bf565b34801561073857600080fd5b507fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c0254610326565b34801561076c57600080fd5b506105cb7f000000000000000000000000000000000000000000000000000000000000000081565b3480156107a057600080fd5b506102ab6107af366004612933565b6119d5565b3480156107c057600080fd5b506102cd6107cf3660046130d6565b611b5b565b3480156107e057600080fd5b50610614604051806040016040528060058152602001640312e302e360dc1b81525081565b600061080f611b77565b6001600160e01b031982166326f0aef760e01b148061083e57506001600160e01b03198216630a85bd0160e11b145b8061085957506001600160e01b03198216630271189760e51b145b8061087457506001600160e01b031982166301ffc9a760e01b145b8061088f57506001600160e01b03198216630b135d3f60e11b145b92915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906108ce5750333014155b156108ec57604051630796d94560e01b815260040160405180910390fd5b6001600160a01b03811660009081526000805160206135ac833981519152602081905260409091205460ff166109355760405163da0357f760e01b815260040160405180910390fd5b60018101546002820154810361095e576040516361774dcf60e11b815260040160405180910390fd5b60005b61096c600183613154565b811015610a3657836001600160a01b031683600101828154811061099257610992613167565b6000918252602090912001546001600160a01b031603610a2e57826001016001836109bd9190613154565b815481106109cd576109cd613167565b6000918252602090912001546001840180546001600160a01b0390921691839081106109fb576109fb613167565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610a36565b600101610961565b5081600101805480610a4a57610a4a61317d565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038516808352908490526040808320805460ff191690555190917fb0073c14ccc2332b5b461c0d2fb94366f38d3954a82745e74827aa0811c9f98191a2505050565b6000610ac3611b77565b50630a85bd0160e11b949350505050565b6000610ade611b77565b610ae9848484611c1e565b90505b9392505050565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b3e57604051636b31ba1560e11b815260040160405180910390fd5b610b46611b77565b610b508484611dbd565b9050610aec82611e33565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ba457604051630692ce8160e21b815260040160405180910390fd5b610bad81611eca565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610be95750333014155b15610c0757604051630796d94560e01b815260040160405180910390fd5b610c118282611fd4565b5050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610c8b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088f9190613193565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610ce85750333014155b15610d0657604051630796d94560e01b815260040160405180910390fd5b604051633ed0101560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633ed0101590610d529084906004016132db565b600060405180830381600087803b158015610d6c57600080fd5b505af1158015610d80573d6000803e3d6000fd5b5050505050565b6040516316a0682960e11b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632d40d052906024015b602060405180830381865afa158015610df0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088f91906133b6565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610e4d5750333014155b15610e6b57604051630796d94560e01b815260040160405180910390fd5b604051634993404760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634993404790610d529084906004016132db565b610ebf611b77565b60405163b760faf960e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b158015610d6c57600080fd5b610f29612036565b610c1182826120f3565b6000610f3d61210e565b506000805160206135cc83398151915290565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ba457604051636b31ba1560e11b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610fde5750825b90506000826001600160401b03166001148015610ffa5750303b155b905081158015611008575080155b156110265760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561105057845460ff60401b1916600160401b1785555b61105d8888886000612157565b83156110a457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2906020015b60405180910390a15b5050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110e75750333014155b1561110557604051630796d94560e01b815260040160405180910390fd5b61111184848484612157565b50505050565b604051635daa653960e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635daa653990602401610dd3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054869190600160401b900460ff16806111af575080546001600160401b03808416911610155b156111cd5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906112275750333014155b1561124557604051630796d94560e01b815260040160405180910390fd5b61125186868686612157565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906112da5750333014155b156112f857604051630796d94560e01b815260040160405180910390fd5b60405163040b850f60e31b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561136257600080fd5b505af1158015611376573d6000803e3d6000fd5b505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906113b75750333014155b156113d557604051630796d94560e01b815260040160405180910390fd5b604051637fade28760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637fade28790610d529084906004016132db565b606060006000805160206135ac8339815191526001810180546040805160208084028201810190925282815293945083018282801561148957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161146b575b505050505091505090565b60006114b56000805160206135cc833981519152546001600160a01b031690565b905090565b60006114b57ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00546001600160401b031690565b60006114f7611b77565b5063bc197c8160e01b95945050505050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a08231906024015b602060405180830381865afa158015611571573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b59190613193565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401611554565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906116245750333014155b1561164257604051630796d94560e01b815260040160405180910390fd5b806000036116635760405163aabd5a0960e01b815260040160405180910390fd5b60008051602061358c833981519152546000805160206135ac833981519152908211156116a35760405163aabd5a0960e01b815260040160405180910390fd5b600281018290556040518281527f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d039060200160405180910390a15050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480159061171a5750333014155b1561173857604051630796d94560e01b815260040160405180910390fd5b60405163385483d560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e1520f5490611788908690869086906004016133d3565b600060405180830381600087803b1580156117a257600080fd5b505af11580156117b6573d6000803e3d6000fd5b50505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906117f85750333014155b1561181657604051630796d94560e01b815260040160405180910390fd5b6001600160a01b038116158061183557506001600160a01b0381163b15155b1561185357604051634501a91960e01b815260040160405180910390fd5b6001600160a01b03821660009081526000805160206135ac833981519152602081905260409091205460ff1661189c5760405163da0357f760e01b815260040160405180910390fd5b6001600160a01b03821660009081526020829052604090205460ff16156118d657604051631985f4ab60e31b815260040160405180910390fd5b600181015460005b8181101561197057846001600160a01b031683600101828154811061190557611905613167565b6000918252602090912001546001600160a01b031603611968578383600101828154811061193557611935613167565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550611970565b6001016118de565b506001600160a01b03808516600081815260208590526040808220805460ff199081169091559387168083528183208054909516600117909455517f53a7b6f060162826746b07f3ff5cc66b83afad3bc9a57c9f34d7802901c6e8299190a350505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590611a0e5750333014155b15611a2c57604051630796d94560e01b815260040160405180910390fd5b6001600160a01b0381161580611a4b57506001600160a01b0381163b15155b15611a6957604051634501a91960e01b815260040160405180910390fd5b60008051602061358c833981519152546000805160206135ac83398151915290601d1901611aaa57604051630dc92ed360e11b815260040160405180910390fd5b6001600160a01b03821660009081526020829052604090205460ff1615611ae457604051631985f4ab60e31b815260040160405180910390fd5b6001818101805480830182556000918252602080832090910180546001600160a01b0319166001600160a01b038716908117909155808352908490526040808320805460ff191690941790935591517f82b74755d483f0688b80354268454667c377a5684e64a4dbb6820fc11a6276d49190a25050565b6000611b65611b77565b5063f23a6e6160e01b95945050505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611bfe57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611bf26000805160206135cc833981519152546001600160a01b031690565b6001600160a01b031614155b15611c1c5760405163703e46dd60e11b815260040160405180910390fd5b565b7fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c02546000906000805160206135ac83398151915290611c5f9060419061343d565b8314611c7657506001600160e01b03199050610aec565b6000611c83604185613454565b600283015490915060008080805b85811015611da55760008a8a611ca860418561343d565b906041611cb6866001613476565b611cc0919061343d565b92611ccd93929190613489565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929350611d1192508e91508390506123d5565b9350846001600160a01b0316846001600160a01b0316111580611d4d57506001600160a01b03841660009081526020899052604090205460ff16155b15611d6b57506001600160e01b03199750610aec9650505050505050565b82611d75816134b3565b935050858310611d975750630b135d3f60e11b9750610aec9650505050505050565b509192508291600101611c91565b506001600160e01b03199a9950505050505050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c829052603c81208190611e0590611e006101008701876134cc565b611c1e565b90506374eca2c160e11b6001600160e01b0319821601611e2957600091505061088f565b5060019392505050565b8015610bad57604051600090339060001990849084818181858888f193505050503d8060008114611e80576040519150601f19603f3d011682016040523d82523d6000602084013e611e85565b606091505b505060408051848152821515602082015291925033917fa427c7d47f24d01b170779a7600b1d4c0d7cdbabaa0f19c4f0e6182053ffc931910160405180910390a25050565b600080611eda6020840184612933565b6001600160a01b03166020840135611ef560408601866134cc565b604051611f03929190613512565b60006040518083038185875af1925050503d8060008114611f40576040519150601f19603f3d011682016040523d82523d6000602084013e611f45565b606091505b509092509050611f586020840184612933565b6001600160a01b03167f74b56487625d598ffbf59a76c3b58fc1922f54afc86a075bad0c2a8aa05d2ad284602001358484604051611f9893929190613522565b60405180910390a281611fcf578051600003611fc75760405163764bbf1760e01b815260040160405180910390fd5b805181602001fd5b505050565b806000819003611ff757604051635fc74f2160e11b815260040160405180910390fd5b60005b818110156111115761202e84848381811061201757612017613167565b90506020028101906120299190613543565b611eca565b600101611ffa565b60008051602061358c833981519152546000805160206135ac8339815191529060005b818110156120b05782600001600084600101838154811061207c5761207c613167565b60009182526020808320909101546001600160a01b031683528201929092526040019020805460ff19169055600101612059565b506120bf6001830160006128c2565b6000600283018190556040517feb09d532980c3cc73dcad99b80e264204a667a54cbb7b63ec8d68dcb1c7096be9190a15050565b6120fb611b77565b612104826123ff565b610c118282612456565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c1c5760405163703e46dd60e11b815260040160405180910390fd5b60008051602061358c8339815191525483906000805160206135ac8339815191529060008461218f5761218a8285613476565b612191565b835b905085158061219f57508086115b156121bd5760405163aabd5a0960e01b815260040160405180910390fd5b601e8111156121df57604051630dc92ed360e11b815260040160405180910390fd5b84156122735760005b8281101561226457600084600101828154811061220757612207613167565b60009182526020808320909101546001600160a01b0316808352908790526040808320805460ff191690555190925082917fb0073c14ccc2332b5b461c0d2fb94366f38d3954a82745e74827aa0811c9f98191a2506001016121e8565b506122736001840160006128c2565b60005b8481101561239d57600089898381811061229257612292613167565b90506020020160208101906122a79190612933565b6001600160a01b03811660009081526020879052604090205490915060ff16156122e457604051631985f4ab60e31b815260040160405180910390fd5b6001600160a01b038116158061230357506001600160a01b0381163b15155b1561232157604051634501a91960e01b815260040160405180910390fd5b6001858101805480830182556000918252602080832090910180546001600160a01b0319166001600160a01b038616908117909155808352908890526040808320805460ff191690941790935591517f82b74755d483f0688b80354268454667c377a5684e64a4dbb6820fc11a6276d49190a250600101612276565b50600283018690556040518681527f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d039060200161109b565b6000806000806123e58686612518565b9250925092506123f58282612565565b5090949350505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906124385750333014155b15610bad57604051630796d94560e01b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156124b0575060408051601f3d908101601f191682019092526124ad91810190613193565b60015b6124dd57604051634c9c8ce360e01b81526001600160a01b03831660048201526024015b60405180910390fd5b6000805160206135cc833981519152811461250e57604051632a87526960e21b8152600481018290526024016124d4565b611fcf838361261e565b600080600083516041036125525760208401516040850151606086015160001a61254488828585612674565b95509550955050505061255e565b50508151600091506002905b9250925092565b600082600381111561257957612579613563565b03612582575050565b600182600381111561259657612596613563565b036125b45760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156125c8576125c8613563565b036125e95760405163fce698f760e01b8152600481018290526024016124d4565b60038260038111156125fd576125fd613563565b03610c11576040516335e2f38360e21b8152600481018290526024016124d4565b61262782612743565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561266c57611fcf82826127a8565b610c1161281e565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156126af5750600091506003905082612739565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612703573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661272f57506000925060019150829050612739565b9250600091508190505b9450945094915050565b806001600160a01b03163b60000361277957604051634c9c8ce360e01b81526001600160a01b03821660048201526024016124d4565b6000805160206135cc83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516127c59190613579565b600060405180830381855af49150503d8060008114612800576040519150601f19603f3d011682016040523d82523d6000602084013e612805565b606091505b509150915061281585838361283d565b95945050505050565b3415611c1c5760405163b398979f60e01b815260040160405180910390fd5b6060826128525761284d82612899565b610aec565b815115801561286957506001600160a01b0384163b155b1561289257604051639996b31560e01b81526001600160a01b03851660048201526024016124d4565b5080610aec565b8051156128a95780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825590600052602060002090810190610bad91905b808211156128f057600081556001016128dc565b5090565b60006020828403121561290657600080fd5b81356001600160e01b031981168114610aec57600080fd5b6001600160a01b0381168114610bad57600080fd5b60006020828403121561294557600080fd5b8135610aec8161291e565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561298e5761298e612950565b604052919050565b600082601f8301126129a757600080fd5b81356001600160401b038111156129c0576129c0612950565b6129d3601f8201601f1916602001612966565b8181528460208386010111156129e857600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215612a1b57600080fd5b8435612a268161291e565b93506020850135612a368161291e565b92506040850135915060608501356001600160401b03811115612a5857600080fd5b612a6487828801612996565b91505092959194509250565b60008083601f840112612a8257600080fd5b5081356001600160401b03811115612a9957600080fd5b602083019150836020828501011115612ab157600080fd5b9250929050565b600080600060408486031215612acd57600080fd5b8335925060208401356001600160401b03811115612aea57600080fd5b612af686828701612a70565b9497909650939450505050565b600080600060608486031215612b1857600080fd5b83356001600160401b03811115612b2e57600080fd5b84016101208187031215612b4157600080fd5b95602085013595506040909401359392505050565b600060608284031215612b6857600080fd5b50919050565b600060208284031215612b8057600080fd5b81356001600160401b03811115612b9657600080fd5b612ba284828501612b56565b949350505050565b60008083601f840112612bbc57600080fd5b5081356001600160401b03811115612bd357600080fd5b6020830191508360208260051b8501011115612ab157600080fd5b60008060208385031215612c0157600080fd5b82356001600160401b03811115612c1757600080fd5b612c2385828601612baa565b90969095509350505050565b600060208284031215612c4157600080fd5b81356001600160c01b0381168114610aec57600080fd5b600060208284031215612c6a57600080fd5b81356001600160401b03811115612c8057600080fd5b820160c08185031215610aec57600080fd5b600060208284031215612ca457600080fd5b5035919050565b60008060408385031215612cbe57600080fd5b8235612cc98161291e565b915060208301356001600160401b03811115612ce457600080fd5b612cf085828601612996565b9150509250929050565b600080600060408486031215612d0f57600080fd5b83356001600160401b03811115612d2557600080fd5b612d3186828701612baa565b909790965060209590950135949350505050565b8015158114610bad57600080fd5b60008060008060608587031215612d6957600080fd5b84356001600160401b03811115612d7f57600080fd5b612d8b87828801612baa565b909550935050602085013591506040850135612da681612d45565b939692955090935050565b600080600080600060808688031215612dc957600080fd5b85356001600160401b038082168214612de157600080fd5b90955060208701359080821115612df757600080fd5b50612e0488828901612baa565b909550935050604086013591506060860135612e1f81612d45565b809150509295509295909350565b60008060408385031215612e4057600080fd5b8235612e4b8161291e565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b81811015612e9a5783516001600160a01b031683529284019291840191600101612e75565b50909695505050505050565b60005b83811015612ec1578181015183820152602001612ea9565b50506000910152565b60008151808452612ee2816020860160208601612ea6565b601f01601f19169290920160200192915050565b602081526000610aec6020830184612eca565b600082601f830112612f1a57600080fd5b813560206001600160401b03821115612f3557612f35612950565b8160051b612f44828201612966565b9283528481018201928281019087851115612f5e57600080fd5b83870192505b84831015612f7d57823582529183019190830190612f64565b979650505050505050565b600080600080600060a08688031215612fa057600080fd5b8535612fab8161291e565b94506020860135612fbb8161291e565b935060408601356001600160401b0380821115612fd757600080fd5b612fe389838a01612f09565b94506060880135915080821115612ff957600080fd5b61300589838a01612f09565b9350608088013591508082111561301b57600080fd5b5061302888828901612996565b9150509295509295909350565b60008060006040848603121561304a57600080fd5b83356001600160401b038082111561306157600080fd5b61306d87838801612a70565b9095509350602086013591508082111561308657600080fd5b5061309386828701612b56565b9150509250925092565b600080604083850312156130b057600080fd5b82356130bb8161291e565b915060208301356130cb8161291e565b809150509250929050565b600080600080600060a086880312156130ee57600080fd5b85356130f98161291e565b945060208601356131098161291e565b9350604086013592506060860135915060808601356001600160401b0381111561313257600080fd5b61302888828901612996565b634e487b7160e01b600052601160045260246000fd5b8181038181111561088f5761088f61313e565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6000602082840312156131a557600080fd5b5051919050565b6000808335601e198436030181126131c357600080fd5b83016020810192503590506001600160401b038111156131e257600080fd5b803603821315612ab157600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b888110156132cd57858403601f19018a52823536899003605e19018112613259578283fd5b8801606081356132688161291e565b6001600160a01b0316865261327f828801836131ac565b828989015261329183890182846131f1565b9250505060406132a3818401846131ac565b9350878303828901526132b78385836131f1565b9d89019d97505050938601935050600101613234565b509198975050505050505050565b60208152600082356132ec8161291e565b6001600160a01b039081166020848101919091528401359061330d8261291e565b80821660408501525050604083013560608301526060830135601e1984360301811261333857600080fd5b83016020810190356001600160401b0381111561335457600080fd5b8060051b360382131561336657600080fd5b60c0608085015261337b60e08501828461321a565b915050608084013560a084015261339560a08501856131ac565b848303601f190160c08601526133ac8382846131f1565b9695505050505050565b6000602082840312156133c857600080fd5b8151610aec81612d45565b6040815260006133e76040830185876131f1565b828103602084015283356133fa8161291e565b6001600160a01b031681526020848101359082015261341c60408501856131ac565b606060408401526134316060840182846131f1565b98975050505050505050565b808202811582820484141761088f5761088f61313e565b60008261347157634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561088f5761088f61313e565b6000808585111561349957600080fd5b838611156134a657600080fd5b5050820193919092039150565b6000600182016134c5576134c561313e565b5060010190565b6000808335601e198436030181126134e357600080fd5b8301803591506001600160401b038211156134fd57600080fd5b602001915036819003821315612ab157600080fd5b8183823760009101908152919050565b83815282151560208201526060604082015260006128156060830184612eca565b60008235605e1983360301811261355957600080fd5b9190910192915050565b634e487b7160e01b600052602160045260246000fd5b60008251613559818460208701612ea656feb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c01b005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212207f3a1345dd207b3e6a7d8045651ded34698ad5d76b8ff402fdacf6337782f2f664736f6c63430008170033000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d780000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x1", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb193634c8a35853ca5a8dda2cd6f9c1ae1ab401f5022b6d7081fc672a26e6069", + "transactionType": "CREATE2", + "contractName": "HybridDeleGator", + "contractAddress": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "function": null, + "arguments": [ + "0xbe4138886cB096bDC1B930F2f0ca7892AA234D78", + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x62d183", + "value": "0x0", + "input": "0x44656c654761746f72000000000000000000000000000000000000000000000060e0604052306080523480156200001557600080fd5b50604051620051483803806200514883398101604081905262000038916200018b565b818162000044620000c1565b6001600160a01b0380831660a081905290821660c0526040517fb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d90600090a26040516001600160a01b038216907fee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a9990600090a250505050620001ca565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620001125760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001725780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b03811681146200017257600080fd5b600080604083850312156200019f57600080fd5b8251620001ac8162000175565b6020840151909250620001bf8162000175565b809150509250929050565b60805160a05160c051614e83620002c5600039600081816105e9015281816107f3015281816108a1015281816109c501528181610a4601528181610ac401528181610c2901528181610cde01528181610d6501528181610dfe01528181610eea01528181610fa50152818161101701528181611082015281816112c401528181611343015281816113c00152818161147f015281816116c4015281816117b501526124480152600081816107290152818161090701528181610b2701528181610baa01528181610c8c01528181610dbc015281816110e50152611727015260008181611a9b01528181611ac401526120b50152614e836000f3fe60806040526004361061023f5760003560e01c80637f07bfdc1161012e578063c399ec88116100ab578063e1520f541161006f578063e1520f54146106f7578063ea4d3c9b14610717578063f23a6e611461074b578063f2fde38b1461076b578063ffa1ad741461078b57600080fd5b8063c399ec8814610658578063c8561e731461066d578063d087d2881461068d578063d37aec92146106a2578063d5d33b55146106d757600080fd5b8063aaf10f42116100f2578063aaf10f4214610584578063ad3cb1cc14610599578063b0d691fe146105d7578063b3c650151461060b578063bc197c811461063857600080fd5b80637f07bfdc146104d25780637fade287146104f25780638da5cb5b146105125780638ebf953314610551578063a24c8f321461057157600080fd5b80633ed01015116101bc57806352d1902d1161018057806352d1902d146104485780635c1c6dcd1461045d5780636af1f3991461047d578063715018a61461049d57806378a68ecf146104b257600080fd5b80633ed01015146103cd578063445140b8146103ed578063499340471461040d5780634a58db191461042d5780634f1ef2861461043557600080fd5b80631c03010a116102035780631c03010a1461032957806326f0aef71461034b5780632ffeaad61461036b57806334fcd5be1461038d5780633e1b0812146103ad57600080fd5b806301ffc9a71461024b578063074feff314610280578063150b7a02146102a25780631626ba7e146102db57806319822f7c146102fb57600080fd5b3661024657005b600080fd5b34801561025757600080fd5b5061026b610266366004613e92565b6107bc565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102a061029b366004613f27565b6107e8565b005b3480156102ae57600080fd5b506102c26102bd366004614096565b610859565b6040516001600160e01b03199091168152602001610277565b3480156102e757600080fd5b506102c26102f6366004614142565b610875565b34801561030757600080fd5b5061031b61031636600461418d565b610894565b604051908152602001610277565b34801561033557600080fd5b50600080516020614dae8339815191525461031b565b34801561035757600080fd5b506102a06103663660046141f8565b6108fc565b34801561037757600080fd5b50610380610951565b604051610277919061422c565b34801561039957600080fd5b506102a06103a8366004614264565b6109ba565b3480156103b957600080fd5b5061031b6103c83660046142a5565b610a1f565b3480156103d957600080fd5b506102a06103e83660046142ce565b610ab9565b3480156103f957600080fd5b5061026b610408366004614308565b610b91565b34801561041957600080fd5b506102a06104283660046142ce565b610c1e565b6102a0610cc1565b6102a0610443366004614321565b610d2b565b34801561045457600080fd5b5061031b610d3d565b34801561046957600080fd5b506102a06104783660046141f8565b610d5a565b34801561048957600080fd5b5061026b610498366004614308565b610da3565b3480156104a957600080fd5b506102a0610df3565b3480156104be57600080fd5b506102a06104cd366004614389565b610e56565b3480156104de57600080fd5b506102a06104ed36600461445b565b610f9a565b3480156104fe57600080fd5b506102a061050d3660046142ce565b611077565b34801561051e57600080fd5b50600080516020614d8e833981519152546001600160a01b03165b6040516001600160a01b039091168152602001610277565b34801561055d57600080fd5b506102a061056c366004613f27565b61111a565b6102a061057f366004614321565b610d33565b34801561059057600080fd5b50610539611236565b3480156105a557600080fd5b506105ca604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161027791906144d7565b3480156105e357600080fd5b506105397f000000000000000000000000000000000000000000000000000000000000000081565b34801561061757600080fd5b5061062061125c565b6040516001600160401b039091168152602001610277565b34801561064457600080fd5b506102c2610653366004614569565b61128f565b34801561066457600080fd5b5061031b6112ac565b34801561067957600080fd5b506102a0610688366004614616565b611338565b34801561069957600080fd5b5061031b6113a1565b3480156106ae57600080fd5b506106c26106bd366004614666565b6113f7565b60408051928352602083019190915201610277565b3480156106e357600080fd5b506102a06106f2366004614666565b611474565b34801561070357600080fd5b506102a061071236600461469b565b6116b9565b34801561072357600080fd5b506105397f000000000000000000000000000000000000000000000000000000000000000081565b34801561075757600080fd5b506102c2610766366004614703565b61178e565b34801561077757600080fd5b506102a061078636600461476b565b6117aa565b34801561079757600080fd5b506105ca604051806040016040528060058152602001640312e302e360dc1b81525081565b60006107c78261180a565b806107e257506001600160e01b031982166307f5828d60e41b145b92915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906108215750333014155b1561083f57604051630796d94560e01b815260040160405180910390fd5b61085087878787878787600161189a565b50505050505050565b6000610863611a90565b50630a85bd0160e11b5b949350505050565b600061087f611a90565b61088a848484611b35565b90505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108df57604051636b31ba1560e11b815260040160405180910390fd5b6108e7611a90565b6108f18484611d59565b905061088d82611dcf565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094557604051630692ce8160e21b815260040160405180910390fd5b61094e81611e66565b50565b60606000600080516020614d8e833981519152600281018054604080516020808402820181019092528281529394508301828280156109af57602002820191906000526020600020905b81548152602001906001019080831161099b575b505050505091505090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906109f35750333014155b15610a1157604051630796d94560e01b815260040160405180910390fd5b610a1b8282611f70565b5050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610a95573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e29190614788565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610af25750333014155b15610b1057604051630796d94560e01b815260040160405180910390fd5b604051633ed0101560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633ed0101590610b5c9084906004016148d0565b600060405180830381600087803b158015610b7657600080fd5b505af1158015610b8a573d6000803e3d6000fd5b5050505050565b6040516316a0682960e11b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632d40d052906024015b602060405180830381865afa158015610bfa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e291906149ac565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610c575750333014155b15610c7557604051630796d94560e01b815260040160405180910390fd5b604051634993404760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634993404790610b5c9084906004016148d0565b610cc9611a90565b60405163b760faf960e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b158015610b7657600080fd5b610d33611fd2565b610a1b828261208f565b6000610d476120aa565b50600080516020614dee83398151915290565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094557604051636b31ba1560e11b815260040160405180910390fd5b604051635daa653960e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635daa653990602401610bdd565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610e2c5750333014155b15610e4a57604051630796d94560e01b815260040160405180910390fd5b610e5460006120f3565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460ff8b81169291600160401b90041680610ea0575080546001600160401b03808416911610155b15610ebe5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610f185750333014155b15610f3657604051630796d94560e01b815260040160405180910390fd5b610f468a8a8a8a8a8a8a8a61189a565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15050505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610fd35750333014155b15610ff157604051630796d94560e01b815260040160405180910390fd5b60405163040b850f60e31b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561105b57600080fd5b505af115801561106f573d6000803e3d6000fd5b505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110b05750333014155b156110ce57604051630796d94560e01b815260040160405180910390fd5b604051637fade28760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637fade28790610b5c9084906004016148d0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b031660008115801561115f5750825b90506000826001600160401b0316600114801561117b5750303b155b905081158015611189575080155b156111a75760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156111d157845460ff60401b1916600160401b1785555b6111e28c8c8c8c8c8c8c600061189a565b831561122857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b6000611257600080516020614dee833981519152546001600160a01b031690565b905090565b60006112577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00546001600160401b031690565b6000611299611a90565b5063bc197c8160e01b5b95945050505050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a08231906024015b602060405180830381865afa158015611314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112579190614788565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906113715750333014155b1561138f57604051630796d94560e01b815260040160405180910390fd5b61139b84848484612195565b50505050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a906044016112f7565b60008080600080516020614d8e8339815191529050600081600101600087876040516020016114279291906149c9565b60408051601f198184030181529181528151602092830120835282820193909352908201600020825180840190935280548084526001909101549290910182905297909650945050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906114ad5750333014155b156114cb57604051630796d94560e01b815260040160405180910390fd5b604051600080516020614d8e833981519152906000906114f190859085906020016149c9565b60408051601f19818403018152828252805160209182012060008181526001808801845290849020858501909452835480865293015491840182905293508115801561153b575080155b1561156157604051631a36430d60e31b8152600481018590526024015b60405180910390fd5b600285015460018114801561157e575085546001600160a01b0316155b1561159c5760405163c4c8547360e01b815260040160405180910390fd5b60005b6115aa6001836149ef565b81101561162f57858760020182815481106115c7576115c7614a02565b90600052602060002001540361162757600287016115e66001846149ef565b815481106115f6576115f6614a02565b906000526020600020015487600201828154811061161657611616614a02565b60009182526020909120015561162f565b60010161159f565b508560020180548061164357611643614a18565b60008281526020808220830160001990810183905590920190925586825260018881018252604080842084815590910192909255815185815290810184905286917facf0e8088062f44f734bbcb5223794fd8bb6f6db1c199cb6a72df119d002a71b910160405180910390a25050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906116f25750333014155b1561171057604051630796d94560e01b815260040160405180910390fd5b60405163385483d560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e1520f549061176090869086908690600401614a2e565b600060405180830381600087803b15801561177a57600080fd5b505af1158015610850573d6000803e3d6000fd5b6000611798611a90565b5063f23a6e6160e01b95945050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906117e35750333014155b1561180157604051630796d94560e01b815260040160405180910390fd5b61094e816120f3565b6000611814611a90565b6001600160e01b031982166326f0aef760e01b148061184357506001600160e01b03198216630a85bd0160e11b145b8061185e57506001600160e01b03198216630271189760e51b145b8061187957506001600160e01b031982166301ffc9a760e01b145b806107e2575050630b135d3f60e11b6001600160e01b03198216145b919050565b856001600160a01b0389161580156118b0575080155b80156118b95750815b156118d7576040516312da594d60e11b815260040160405180910390fd5b80851415806118e65750808314155b156119155760405163a297991b60e01b8152600481018290526024810186905260448101849052606401611558565b8115611a0a57600080516020614dae83398151915254600080516020614d8e833981519152908015611a075760005b818110156119f857600083600201828154811061196357611963614a02565b6000918252602080832090910154808352600180880180845260408086208151808301835281548152938101805485880190815286895293909652869055949093558051925193519194509284927facf0e8088062f44f734bbcb5223794fd8bb6f6db1c199cb6a72df119d002a71b926119e69290918252602082015260400190565b60405180910390a25050600101611944565b50611a07600283016000613e60565b50505b60005b81811015611a7b57611a73898983818110611a2a57611a2a614a02565b9050602002810190611a3c9190614a8c565b898985818110611a4e57611a4e614a02565b90506020020135888886818110611a6757611a67614a02565b90506020020135612195565b600101611a0d565b50611a85896120f3565b505050505050505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611b1757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611b0b600080516020614dee833981519152546001600160a01b031690565b6001600160a01b031614155b15610e545760405163703e46dd60e11b815260040160405180910390fd5b6000816041819003611bd257600080516020614d8e833981519152546001600160a01b03166001600160a01b0316611ba38686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061231292505050565b6001600160a01b031603611bc15750630b135d3f60e11b905061088d565b506001600160e01b0319905061088d565b6060811015611bec57506001600160e01b0319905061088d565b600080516020614d8e8339815191526000611c0a6020828789614ad2565b611c1391614afc565b600081815260018085016020908152604092839020835180850190945280548085529201549083015291925090158015611c4f57506020810151155b15611c6957506001600160e01b0319935061088d92505050565b836060148015611cbd5750611cbd8888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505085516020870151909250905061233c565b15611cd65750630b135d3f60e11b935061088d92505050565b83606014158015611d2b5750611d2b8888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508551602087015190925090506123da565b15611d445750630b135d3f60e11b935061088d92505050565b506001600160e01b0319935061088d92505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c829052603c81208190611da190611d9c610100870187614a8c565b611b35565b90506374eca2c160e11b6001600160e01b0319821601611dc55760009150506107e2565b5060019392505050565b801561094e57604051600090339060001990849084818181858888f193505050503d8060008114611e1c576040519150601f19603f3d011682016040523d82523d6000602084013e611e21565b606091505b505060408051848152821515602082015291925033917fa427c7d47f24d01b170779a7600b1d4c0d7cdbabaa0f19c4f0e6182053ffc931910160405180910390a25050565b600080611e76602084018461476b565b6001600160a01b03166020840135611e916040860186614a8c565b604051611e9f9291906149c9565b60006040518083038185875af1925050503d8060008114611edc576040519150601f19603f3d011682016040523d82523d6000602084013e611ee1565b606091505b509092509050611ef4602084018461476b565b6001600160a01b03167f74b56487625d598ffbf59a76c3b58fc1922f54afc86a075bad0c2a8aa05d2ad284602001358484604051611f3493929190614b1a565b60405180910390a281611f6b578051600003611f635760405163764bbf1760e01b815260040160405180910390fd5b805181602001fd5b505050565b806000819003611f9357604051635fc74f2160e11b815260040160405180910390fd5b60005b8181101561139b57611fca848483818110611fb357611fb3614a02565b9050602002810190611fc59190614b3b565b611e66565b600101611f96565b600080516020614dae83398151915254600080516020614d8e8339815191529060005b818110156120455782600101600084600201838154811061201857612018614a02565b60009182526020808320909101548352820192909252604001812081815560019081019190915501611ff5565b50612054600283016000613e60565b81546001600160a01b03191682556040517feb09d532980c3cc73dcad99b80e264204a667a54cbb7b63ec8d68dcb1c7096be90600090a15050565b612097611a90565b6120a08261243d565b610a1b8282612494565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e545760405163703e46dd60e11b815260040160405180910390fd5b600080516020614dae83398151915254600080516020614d8e8339815191529015801561212757506001600160a01b038216155b156121455760405163c4c8547360e01b815260040160405180910390fd5b80546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b61219f8282612551565b6121c6576040516313c3d61f60e01b81526004810183905260248101829052604401611558565b600084846040516020016121db9291906149c9565b6040516020818303038152906040528051906020012090508484905060000361221757604051637e25658160e11b815260040160405180910390fd5b60008181527fa2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694901602052604090208054600080516020614d8e83398151915291901515806122675750600181015415155b15612288576040516361db108160e01b815260048101849052602401611558565b604080518082018252868152602080820187815260008781526001808801845285822094518555915193820193909355600286018054918201815583529120018490555183907fd00539cb08a7c24166308150d64d603150c01baf89d3d3e4c6063d6db7c6983d90612301908a908a908a908a90614b5b565b60405180910390a250505050505050565b600080600080612322868661255d565b92509250925061233282826125aa565b5090949350505050565b600080600061234a86612663565b91509150600060028860405160200161236591815260200190565b60408051601f198184030181529082905261237f91614b82565b602060405180830381855afa15801561239c573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906123bf9190614788565b90506123ce8184848989612685565b98975050505050505050565b6000806123e685612793565b9050612433866040516020016123fe91815260200190565b60408051601f198184030181529181528301516060840151608085015160a086015160c0870151875160208901518c8c612811565b9695505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906124765750333014155b1561094e57604051630796d94560e01b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156124ee575060408051601f3d908101601f191682019092526124eb91810190614788565b60015b61251657604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611558565b600080516020614dee833981519152811461254757604051632a87526960e21b815260048101829052602401611558565b611f6b83836129b1565b600061088d8383612a07565b600080600083516041036125975760208401516040850151606086015160001a61258988828585612b01565b9550955095505050506125a3565b50508151600091506002905b9250925092565b60008260038111156125be576125be614b94565b036125c7575050565b60018260038111156125db576125db614b94565b036125f95760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561260d5761260d614b94565b0361262e5760405163fce698f760e01b815260048101829052602401611558565b600382600381111561264257612642614b94565b03610a1b576040516335e2f38360e21b815260048101829052602401611558565b6000808280602001905181019061267a9190614baa565b909590945092505050565b60006126a06002600080516020614dce833981519152614bd8565b8411156126af575060006112a3565b6040805160208101889052908101869052606081018590526080810184905260a0810183905260009060c00160405160208183030381529060405290506000806101006001600160a01b0316836040516127099190614b82565b600060405180830381855afa9150503d8060008114612744576040519150601f19603f3d011682016040523d82523d6000602084013e612749565b606091505b50915091508115612779578080602001905181019061276891906149ac565b1515600115151493505050506112a3565b6127868989898989612bd0565b9998505050505050505050565b6127d56040518060e001604052806000815260200160008152602001606081526020016000151581526020016060815260200160608152602001600081525090565b818060200190518101906127e99190614c3f565b60c089015260a088015260808701521515606086015260408501526020840152825250919050565b600060258a51108061284b57506128498a60208151811061283457612834614a02565b01602001516001600160f81b0319168a612cb3565b155b15612858575060006129a3565b6000886128648d612d19565b8960405160200161287793929190614cfe565b60408051601f198184030181528282019091526015825274113a3cb832911d113bb2b130baba34371733b2ba1160591b602083015291506128b981838a612f26565b6128c8576000925050506129a3565b60006002836040516128da9190614b82565b602060405180830381855afa1580156128f7573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061291a9190614788565b9050600060028e83604051602001612933929190614d41565b60408051601f198184030181529082905261294d91614b82565b602060405180830381855afa15801561296a573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061298d9190614788565b905061299c818a8a8a8a612685565b9450505050505b9a9950505050505050505050565b6129ba82612fd5565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156129ff57611f6b828261303a565b610a1b6130a7565b600082158015612a15575081155b80612a2d5750600160601b63ffffffff60c01b031983145b80612a455750600160601b63ffffffff60c01b031982145b15612a52575060006107e2565b6000600160601b63ffffffff60c01b031983840990506000600160601b63ffffffff60c01b0319807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc8709600160601b63ffffffff60c01b031987600160601b63ffffffff60c01b0319898a0909089050600160601b63ffffffff60c01b03197f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b820891909114949350505050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612b3c5750600091506003905082612bc6565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612b90573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612bbc57506000925060019150829050612bc6565b9250600091508190505b9450945094915050565b6000841580612bed5750600080516020614dce8339815191528510155b80612bf6575083155b80612c0f5750600080516020614dce8339815191528410155b15612c1c575060006112a3565b612c268383612a07565b612c32575060006112a3565b6000612c3d856130c6565b90506000600080516020614dce83398151915282890990506000600080516020614dce83398151915283890990506000612c7987878585613138565b9050600080516020614dce833981519152612ca28a600080516020614dce8339815191526149ef565b8208159a9950505050505050505050565b6000600160f81b83811614612cca575060006107e2565b818015612cdd5750600160fa1b83811614155b15612cea575060006107e2565b600160fb1b83811614612d1057600f60fc1b600160fc1b841601612d10575060006107e2565b50600192915050565b60606000612d2683613800565b90506000819050600060028251118015612d7157508160028351612d4a91906149ef565b81518110612d5a57612d5a614a02565b6020910101516001600160f81b031916603d60f81b145b15612d7e57506002612dc9565b60018251118015612dc057508160018351612d9991906149ef565b81518110612da957612da9614a02565b6020910101516001600160f81b031916603d60f81b145b15612dc9575060015b6000818351612dd891906149ef565b90506000816001600160401b03811115612df457612df4613fd3565b6040519080825280601f01601f191660200182016040528015612e1e576020820181803683370190505b50905060005b82811015612f1b57848181518110612e3e57612e3e614a02565b01602001516001600160f81b031916602b60f81b03612e8a57602d60f81b828281518110612e6e57612e6e614a02565b60200101906001600160f81b031916908160001a905350612f13565b848181518110612e9c57612e9c614a02565b01602001516001600160f81b031916602f60f81b03612ecc57605f60f81b828281518110612e6e57612e6e614a02565b848181518110612ede57612ede614a02565b602001015160f81c60f81b828281518110612efb57612efb614a02565b60200101906001600160f81b031916908160001a9053505b600101612e24565b509695505050505050565b825182516000918591859190845b82811015612fc65781612f478289614d63565b10612f5a5760009550505050505061088d565b83612f658289614d63565b81518110612f7557612f75614a02565b602001015160f81c60f81b6001600160f81b031916858281518110612f9c57612f9c614a02565b01602001516001600160f81b03191614612fbe5760009550505050505061088d565b600101612f34565b50600198975050505050505050565b806001600160a01b03163b60000361300b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611558565b600080516020614dee83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516130579190614b82565b600060405180830381855af49150503d8060008114613092576040519150601f19603f3d011682016040523d82523d6000602084013e613097565b606091505b50915091506112a3858383613826565b3415610e545760405163b398979f60e01b815260040160405180910390fd5b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f6080820152600080516020614dce83398151915260a082015260208160c0836005600019fa61313157600080fd5b5192915050565b600080808060ff81808815801561314d575087155b15613161576000965050505050505061086d565b6131ad7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d613882565b9092509050811580156131be575080155b156131ec57600080516020614dce83398151915288600080516020614dce833981519152038a089850600097505b600189841c16600189851c1660011b015b8061321f5760018403935060018a851c1660018a861c1660011b0190506131fd565b50600189841c16600189851c1660011b01955060018603613281577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603613290578a96508993505b6003860361329f578196508093505b60018303925060019550600194505b82600019111561378357600160601b63ffffffff60c01b031984600209600160601b63ffffffff60c01b0319818209600160601b63ffffffff60c01b0319818a09600160601b63ffffffff60c01b03198284099250600160601b63ffffffff60c01b031980600160601b63ffffffff60c01b03198b8d08600160601b63ffffffff60c01b03198c600160601b63ffffffff60c01b0319038e0809600309600160601b63ffffffff60c01b03198985099850600160601b63ffffffff60c01b03198a84099950600160601b63ffffffff60c01b031980836002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319838409089a50600160601b63ffffffff60c01b03198083600160601b63ffffffff60c01b0319038d0882099250600160601b63ffffffff60c01b031983600160601b63ffffffff60c01b03198a870908975060018d881c1660018d891c1660011b0190508061342b5787600160601b63ffffffff60c01b031903975050505050613778565b6001810361347a577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103613489578e93508d92505b60038103613498578593508492505b896134b157509198506001975087965094506137789050565b600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b03198b860908600160601b63ffffffff60c01b03198c600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b03198d88090893508061366a578361366a57600160601b63ffffffff60c01b0319896002600160601b0363ffffffff60c01b0319099450600160601b63ffffffff60c01b03198586099350600160601b63ffffffff60c01b0319848d099250600160601b63ffffffff60c01b03198486099450600160601b63ffffffff60c01b0319808c600160601b63ffffffff60c01b0319038e08600160601b63ffffffff60c01b03198d8f08099050600160601b63ffffffff60c01b0319816003099150600160601b63ffffffff60c01b03198a86099950600160601b63ffffffff60c01b03198b85099a50600160601b63ffffffff60c01b031980846002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319848509089b50600160601b63ffffffff60c01b0319808d600160601b63ffffffff60c01b031903850883099350600160601b63ffffffff60c01b0319808a8709850898505050505050613778565b600160601b63ffffffff60c01b03198485099150600160601b63ffffffff60c01b0319848309600160601b63ffffffff60c01b0319838d099b50600160601b63ffffffff60c01b0319818c099a50600160601b63ffffffff60c01b0319838e09600160601b63ffffffff60c01b031980826002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b031984600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b031987880908089350600160601b63ffffffff60c01b031980838d09600160601b63ffffffff60c01b031985600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b031903860809089a50505050809a50505050505b6001830392506132ae565b60405186606082015260208152602080820152602060408201526002600160601b0363ffffffff60c01b03196080820152600160601b63ffffffff60c01b031960a082015260208160c0836005600019fa6137dd57600080fd5b600160601b63ffffffff60c01b0319815189099c9b505050505050505050505050565b60606107e282604051806060016040528060408152602001614e0e604091396001613910565b60608261383b5761383682613a8f565b61088d565b815115801561385257506001600160a01b0384163b155b1561387b57604051639996b31560e01b81526001600160a01b0385166004820152602401611558565b508061088d565b600080808086613899578585935093505050613907565b846138ab578787935093505050613907565b85881480156138b957508487145b156138da576138cb8888600180613ab8565b929a50909850925090506138f4565b6138e988886001808a8a613c13565b929a50909850925090505b61390088888484613d97565b9350935050505b94509492505050565b60608351600003613930575060408051602081019091526000815261088d565b600082613961576003855160046139479190614d76565b613952906002614d63565b61395c9190614bd8565b613986565b6003855160026139719190614d63565b61397b9190614bd8565b613986906004614d76565b90506000816001600160401b038111156139a2576139a2613fd3565b6040519080825280601f01601f1916602001820160405280156139cc576020820181803683370190505b50905060018501602082018788518901602081018051600082525b82841015613a42576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f81168701518653506001850194506139e7565b905250508515613a8357600388510660018114613a665760028114613a7957613a81565b603d6001830353603d6002830353613a81565b603d60018303535b505b50909695505050505050565b805115613a9f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080600080600160601b63ffffffff60c01b0319876002099350600160601b63ffffffff60c01b03198485099150600160601b63ffffffff60c01b03198289099050600160601b63ffffffff60c01b03198285099250600160601b63ffffffff60c01b03198683099150600160601b63ffffffff60c01b031980600160601b63ffffffff60c01b0319888b08600160601b63ffffffff60c01b031989600160601b63ffffffff60c01b0319038c08096003099550600160601b63ffffffff60c01b031980826002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319888909089350600160601b63ffffffff60c01b03198085600160601b63ffffffff60c01b031903830887099750600160601b63ffffffff60c01b03198584099050600160601b63ffffffff60c01b031980888509600160601b63ffffffff60c01b03190389089250945094509450949050565b60008060008088600003613c3257508492508391506001905080613d8a565b600160601b63ffffffff60c01b0319988903988981898809089450600160601b63ffffffff60c01b03198a600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b03198a8909089550600160601b63ffffffff60c01b03198687099350600160601b63ffffffff60c01b03198685099250600160601b63ffffffff60c01b03198489099150600160601b63ffffffff60c01b03198388099050600160601b63ffffffff60c01b0319848b099750600160601b63ffffffff60c01b031980896002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b031985600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b0319898a0908089350600160601b63ffffffff60c01b031980848b09600160601b63ffffffff60c01b031987600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b0319038d08090892505b9650965096509692505050565b6000806000613da584613e04565b9050600160601b63ffffffff60c01b031981870991506000600160601b63ffffffff60c01b03198287099050600160601b63ffffffff60c01b03198182099150600160601b63ffffffff60c01b03198289099350505094509492505050565b600060405160208152602080820152602060408201528260608201526002600160601b0363ffffffff60c01b03196080820152600160601b63ffffffff60c01b031960a082015260208160c0836005600019fa61313157600080fd5b508054600082559060005260206000209081019061094e91905b80821115613e8e5760008155600101613e7a565b5090565b600060208284031215613ea457600080fd5b81356001600160e01b03198116811461088d57600080fd5b6001600160a01b038116811461094e57600080fd5b803561189581613ebc565b60008083601f840112613eee57600080fd5b5081356001600160401b03811115613f0557600080fd5b6020830191508360208260051b8501011115613f2057600080fd5b9250929050565b60008060008060008060006080888a031215613f4257600080fd5b8735613f4d81613ebc565b965060208801356001600160401b0380821115613f6957600080fd5b613f758b838c01613edc565b909850965060408a0135915080821115613f8e57600080fd5b613f9a8b838c01613edc565b909650945060608a0135915080821115613fb357600080fd5b50613fc08a828b01613edc565b989b979a50959850939692959293505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561401157614011613fd3565b604052919050565b60006001600160401b0382111561403257614032613fd3565b50601f01601f191660200190565b600082601f83011261405157600080fd5b813561406461405f82614019565b613fe9565b81815284602083860101111561407957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156140ac57600080fd5b84356140b781613ebc565b935060208501356140c781613ebc565b92506040850135915060608501356001600160401b038111156140e957600080fd5b6140f587828801614040565b91505092959194509250565b60008083601f84011261411357600080fd5b5081356001600160401b0381111561412a57600080fd5b602083019150836020828501011115613f2057600080fd5b60008060006040848603121561415757600080fd5b8335925060208401356001600160401b0381111561417457600080fd5b61418086828701614101565b9497909650939450505050565b6000806000606084860312156141a257600080fd5b83356001600160401b038111156141b857600080fd5b840161012081870312156141cb57600080fd5b95602085013595506040909401359392505050565b6000606082840312156141f257600080fd5b50919050565b60006020828403121561420a57600080fd5b81356001600160401b0381111561422057600080fd5b61086d848285016141e0565b6020808252825182820181905260009190848201906040850190845b81811015613a8357835183529284019291840191600101614248565b6000806020838503121561427757600080fd5b82356001600160401b0381111561428d57600080fd5b61429985828601613edc565b90969095509350505050565b6000602082840312156142b757600080fd5b81356001600160c01b038116811461088d57600080fd5b6000602082840312156142e057600080fd5b81356001600160401b038111156142f657600080fd5b820160c0818503121561088d57600080fd5b60006020828403121561431a57600080fd5b5035919050565b6000806040838503121561433457600080fd5b823561433f81613ebc565b915060208301356001600160401b0381111561435a57600080fd5b61436685828601614040565b9150509250929050565b801515811461094e57600080fd5b803561189581614370565b600080600080600080600080600060c08a8c0312156143a757600080fd5b893560ff811681146143b857600080fd5b98506143c660208b01613ed1565b975060408a01356001600160401b03808211156143e257600080fd5b6143ee8d838e01613edc565b909950975060608c013591508082111561440757600080fd5b6144138d838e01613edc565b909750955060808c013591508082111561442c57600080fd5b506144398c828d01613edc565b909450925061444c905060a08b0161437e565b90509295985092959850929598565b6000806040838503121561446e57600080fd5b823561447981613ebc565b946020939093013593505050565b60005b838110156144a257818101518382015260200161448a565b50506000910152565b600081518084526144c3816020860160208601614487565b601f01601f19169290920160200192915050565b60208152600061088d60208301846144ab565b600082601f8301126144fb57600080fd5b813560206001600160401b0382111561451657614516613fd3565b8160051b614525828201613fe9565b928352848101820192828101908785111561453f57600080fd5b83870192505b8483101561455e57823582529183019190830190614545565b979650505050505050565b600080600080600060a0868803121561458157600080fd5b853561458c81613ebc565b9450602086013561459c81613ebc565b935060408601356001600160401b03808211156145b857600080fd5b6145c489838a016144ea565b945060608801359150808211156145da57600080fd5b6145e689838a016144ea565b935060808801359150808211156145fc57600080fd5b5061460988828901614040565b9150509295509295909350565b6000806000806060858703121561462c57600080fd5b84356001600160401b0381111561464257600080fd5b61464e87828801614101565b90989097506020870135966040013595509350505050565b6000806020838503121561467957600080fd5b82356001600160401b0381111561468f57600080fd5b61429985828601614101565b6000806000604084860312156146b057600080fd5b83356001600160401b03808211156146c757600080fd5b6146d387838801614101565b909550935060208601359150808211156146ec57600080fd5b506146f9868287016141e0565b9150509250925092565b600080600080600060a0868803121561471b57600080fd5b853561472681613ebc565b9450602086013561473681613ebc565b9350604086013592506060860135915060808601356001600160401b0381111561475f57600080fd5b61460988828901614040565b60006020828403121561477d57600080fd5b813561088d81613ebc565b60006020828403121561479a57600080fd5b5051919050565b6000808335601e198436030181126147b857600080fd5b83016020810192503590506001600160401b038111156147d757600080fd5b803603821315613f2057600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b888110156148c257858403601f19018a52823536899003605e1901811261484e578283fd5b88016060813561485d81613ebc565b6001600160a01b03168652614874828801836147a1565b828989015261488683890182846147e6565b925050506040614898818401846147a1565b9350878303828901526148ac8385836147e6565b9d89019d97505050938601935050600101614829565b509198975050505050505050565b60208152600082356148e181613ebc565b6001600160a01b039081166020848101919091528401359061490282613ebc565b80821660408501525050604083013560608301526060830135601e1984360301811261492d57600080fd5b83016020810190356001600160401b0381111561494957600080fd5b8060051b360382131561495b57600080fd5b60c0608085015261497060e08501828461480f565b915050608084013560a084015261498a60a08501856147a1565b848303601f190160c08601526124338382846147e6565b805161189581614370565b6000602082840312156149be57600080fd5b815161088d81614370565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156107e2576107e26149d9565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b604081526000614a426040830185876147e6565b82810360208401528335614a5581613ebc565b6001600160a01b0316815260208481013590820152614a7760408501856147a1565b606060408401526123ce6060840182846147e6565b6000808335601e19843603018112614aa357600080fd5b8301803591506001600160401b03821115614abd57600080fd5b602001915036819003821315613f2057600080fd5b60008085851115614ae257600080fd5b83861115614aef57600080fd5b5050820193919092039150565b803560208310156107e257600019602084900360031b1b1692915050565b83815282151560208201526060604082015260006112a360608301846144ab565b60008235605e19833603018112614b5157600080fd5b9190910192915050565b606081526000614b6f6060830186886147e6565b6020830194909452506040015292915050565b60008251614b51818460208701614487565b634e487b7160e01b600052602160045260246000fd5b600080600060608486031215614bbf57600080fd5b8351925060208401519150604084015190509250925092565b600082614bf557634e487b7160e01b600052601260045260246000fd5b500490565b600082601f830112614c0b57600080fd5b8151614c1961405f82614019565b818152846020838601011115614c2e57600080fd5b61086d826020830160208701614487565b600080600080600080600080610100898b031215614c5c57600080fd5b88519750602089015196506040890151955060608901516001600160401b0380821115614c8857600080fd5b614c948c838d01614bfa565b9650614ca260808c016149a1565b955060a08b0151915080821115614cb857600080fd5b614cc48c838d01614bfa565b945060c08b0151915080821115614cda57600080fd5b50614ce78b828c01614bfa565b92505060e089015190509295985092959890939650565b60008451614d10818460208901614487565b845190830190614d24818360208901614487565b8451910190614d37818360208801614487565b0195945050505050565b60008351614d53818460208801614487565b9190910191825250602001919050565b808201808211156107e2576107e26149d9565b80820281158282048414176107e2576107e26149d956fea2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694900a2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694902ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212208ea6494b631dfbdfca458a1c0a52311f1cf61e8c8eacea1ff8b3b6e773897baa64736f6c63430008170033000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d780000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x2", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe4c27ddf1a20409ed468c1926a70151442bab0d7bf1424b073c42cc13fd36e1e", + "transactionType": "CREATE2", + "contractName": "AllowedCalldataEnforcer", + "contractAddress": "0x48db3835a873d64a4af2c09f014052407c003bd7", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x7ac98", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061059c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610085575b600080fd5b61005961005436600461035a565b61009d565b005b61006e61006936600461041d565b61020c565b60405161007c92919061045f565b60405180910390f35b61005961009336600461035a565b5050505050505050565b60006060806100ac8b8b61020c565b805191945092506100c060408901896104b6565b90506100cc82866104fd565b11156101375760405162461bcd60e51b815260206004820152602f60248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d60448201526e0c6c2d8d8c8c2e8c25ad8cadccee8d608b1b60648201526084015b60405180910390fd5b61014460408901896104b6565b859061015084836104fd565b9261015d9392919061051e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509294506101a192508491508590506102d9565b6101fe5760405162461bcd60e51b815260206004820152602860248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d60448201526763616c6c6461746160c01b606482015260840161012e565b505050505050505050505050565b6000606060218310156102745760405162461bcd60e51b815260206004820152602a60248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d6044820152697465726d732d73697a6560b01b606482015260840161012e565b61028260206000858761051e565b61028b91610548565b915061029a836020818761051e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250949792965091945050505050565b6000818051906020012083805190602001201490505b92915050565b60008083601f84011261030757600080fd5b50813567ffffffffffffffff81111561031f57600080fd5b60208301915083602082850101111561033757600080fd5b9250929050565b80356001600160a01b038116811461035557600080fd5b919050565b60008060008060008060008060c0898b03121561037657600080fd5b883567ffffffffffffffff8082111561038e57600080fd5b61039a8c838d016102f5565b909a50985060208b01359150808211156103b357600080fd5b6103bf8c838d016102f5565b909850965060408b01359150808211156103d857600080fd5b5089016060818c0312156103eb57600080fd5b93506060890135925061040060808a0161033e565b915061040e60a08a0161033e565b90509295985092959890939650565b6000806020838503121561043057600080fd5b823567ffffffffffffffff81111561044757600080fd5b610453858286016102f5565b90969095509350505050565b8281526000602060406020840152835180604085015260005b8181101561049457858101830151858201606001528201610478565b506000606082860101526060601f19601f830116850101925050509392505050565b6000808335601e198436030181126104cd57600080fd5b83018035915067ffffffffffffffff8211156104e857600080fd5b60200191503681900382131561033757600080fd5b808201808211156102ef57634e487b7160e01b600052601160045260246000fd5b6000808585111561052e57600080fd5b8386111561053b57600080fd5b5050820193919092039150565b803560208310156102ef57600019602084900360031b1b169291505056fea264697066735822122094149f339193c37892b2442e24526e5fff221c6592b2b7cd87732677fcc1c9c464736f6c63430008170033", + "nonce": "0x3", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x1fea0515a7b0fc7ef67d87dfbac1c5a5c8f89bccd62ede5eabddb784d3e43d4f", + "transactionType": "CREATE2", + "contractName": "AllowedMethodsEnforcer", + "contractAddress": "0xfd731951bf1c52afccee3e6f14ab656475b76dd4", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x8ba05", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610683806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610084575b600080fd5b6100596100543660046103a7565b61009c565b005b61006e61006936600461046a565b6101ff565b60405161007b91906104ac565b60405180910390f35b6100596100923660046103a7565b5050505050505050565b60046100ab60408601866104fa565b9050101561011a5760405162461bcd60e51b815260206004820152603160248201527f416c6c6f7765644d6574686f6473456e666f726365723a696e76616c69642d616044820152700c6e8d2dedc5ac8c2e8c25ad8cadccee8d607b1b60648201526084015b60405180910390fd5b600061012960408601866104fa565b61013891600491600091610541565b6101419161056b565b9050600061014f8a8a6101ff565b805190915060005b818110156101a4578281815181106101715761017161059b565b60200260200101516001600160e01b031916846001600160e01b0319160361019c5750505050610092565b600101610157565b5060405162461bcd60e51b815260206004820152602960248201527f416c6c6f7765644d6574686f6473456e666f726365723a6d6574686f642d6e6f6044820152681d0b585b1b1bddd95960ba1b6064820152608401610111565b606060008261020f6004826105c7565b156102705760405162461bcd60e51b815260206004820152602b60248201527f416c6c6f7765644d6574686f6473456e666f726365723a696e76616c69642d7460448201526a0cae4dae65ad8cadccee8d60ab1b6064820152608401610111565b61027b6004826105f1565b67ffffffffffffffff81111561029357610293610605565b6040519080825280602002602001820160405280156102bc578160200160208202803683370190505b50925060005b81811015610339578581866102d882600461061b565b926102e593929190610541565b6102ee9161056b565b8484815181106103005761030061059b565b6001600160e01b0319909216602092830291909101909101528261032381610634565b9350610332905060048261061b565b90506102c2565b50505092915050565b60008083601f84011261035457600080fd5b50813567ffffffffffffffff81111561036c57600080fd5b60208301915083602082850101111561038457600080fd5b9250929050565b80356001600160a01b03811681146103a257600080fd5b919050565b60008060008060008060008060c0898b0312156103c357600080fd5b883567ffffffffffffffff808211156103db57600080fd5b6103e78c838d01610342565b909a50985060208b013591508082111561040057600080fd5b61040c8c838d01610342565b909850965060408b013591508082111561042557600080fd5b5089016060818c03121561043857600080fd5b93506060890135925061044d60808a0161038b565b915061045b60a08a0161038b565b90509295985092959890939650565b6000806020838503121561047d57600080fd5b823567ffffffffffffffff81111561049457600080fd5b6104a085828601610342565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156104ee5783516001600160e01b031916835292840192918401916001016104c8565b50909695505050505050565b6000808335601e1984360301811261051157600080fd5b83018035915067ffffffffffffffff82111561052c57600080fd5b60200191503681900382131561038457600080fd5b6000808585111561055157600080fd5b8386111561055e57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156105935780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826105d6576105d66105b1565b500690565b634e487b7160e01b600052601160045260246000fd5b600082610600576106006105b1565b500490565b634e487b7160e01b600052604160045260246000fd5b8082018082111561062e5761062e6105db565b92915050565b600060018201610646576106466105db565b506001019056fea26469706673582212204ec9b63db8ffcc611dbc205c0eb5d3daa906537fc4f6d216704a61e004393bed64736f6c63430008170033", + "nonce": "0x4", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xd42e14c91f7e5a8226fb41942b6c789baff681a79f28ce7d183b3a3e1a616b9a", + "transactionType": "CREATE2", + "contractName": "AllowedTargetsEnforcer", + "contractAddress": "0xbc8673c0afa52d86d991c06881e55b2966920564", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x7f38f", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b506105d9806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610084575b600080fd5b61005961005436600461031e565b61009c565b005b61006e6100693660046103e1565b610174565b60405161007b9190610423565b60405180910390f35b61005961009236600461031e565b5050505050505050565b60006100ab6020860186610470565b905060006100b98a8a610174565b805190915060005b8181101561010c578281815181106100db576100db610492565b60200260200101516001600160a01b0316846001600160a01b0316036101045750505050610092565b6001016100c1565b5060405162461bcd60e51b815260206004820152603160248201527f416c6c6f77656454617267657473456e666f726365723a7461726765742d6164604482015270191c995cdccb5b9bdd0b585b1b1bddd959607a1b60648201526084015b60405180910390fd5b60606000826101846014826104be565b156101e55760405162461bcd60e51b815260206004820152602b60248201527f416c6c6f77656454617267657473456e666f726365723a696e76616c69642d7460448201526a0cae4dae65ad8cadccee8d60ab1b606482015260840161016b565b6101f06014826104e8565b67ffffffffffffffff811115610208576102086104fc565b604051908082528060200260200182016040528015610231578160200160208202803683370190505b50925060005b818110156102b05785818661024d826014610512565b9261025a9392919061052b565b61026391610555565b60601c84848151811061027857610278610492565b6001600160a01b03909216602092830291909101909101528261029a8161058a565b93506102a99050601482610512565b9050610237565b50505092915050565b60008083601f8401126102cb57600080fd5b50813567ffffffffffffffff8111156102e357600080fd5b6020830191508360208285010111156102fb57600080fd5b9250929050565b80356001600160a01b038116811461031957600080fd5b919050565b60008060008060008060008060c0898b03121561033a57600080fd5b883567ffffffffffffffff8082111561035257600080fd5b61035e8c838d016102b9565b909a50985060208b013591508082111561037757600080fd5b6103838c838d016102b9565b909850965060408b013591508082111561039c57600080fd5b5089016060818c0312156103af57600080fd5b9350606089013592506103c460808a01610302565b91506103d260a08a01610302565b90509295985092959890939650565b600080602083850312156103f457600080fd5b823567ffffffffffffffff81111561040b57600080fd5b610417858286016102b9565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156104645783516001600160a01b03168352928401929184019160010161043f565b50909695505050505050565b60006020828403121561048257600080fd5b61048b82610302565b9392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826104cd576104cd6104a8565b500690565b634e487b7160e01b600052601160045260246000fd5b6000826104f7576104f76104a8565b500490565b634e487b7160e01b600052604160045260246000fd5b80820180821115610525576105256104d2565b92915050565b6000808585111561053b57600080fd5b8386111561054857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156105825780818660140360031b1b83161692505b505092915050565b60006001820161059c5761059c6104d2565b506001019056fea26469706673582212204a2e5d298e85989e2cc1b01eb90837481124fb817e6ba907174cafb6c568768564736f6c63430008170033", + "nonce": "0x5", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xece04f176117704c838ce67bb1c68576add1e18349aaa4753ba5967c9467bad9", + "transactionType": "CREATE2", + "contractName": "BlockNumberEnforcer", + "contractAddress": "0xc15faffa0d879b9263c15a46ce31eacfa2e0e8ae", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6942b", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061045b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610092575b600080fd5b6100596100543660046102bd565b6100aa565b005b61006e610069366004610380565b6101b6565b604080516001600160801b0393841681529290911660208301520160405180910390f35b6100596100a03660046102bd565b5050505050505050565b6000806100b78a8a6101b6565b90925090506001600160801b0382161561013457816001600160801b031643116101345760405162461bcd60e51b8152602060048201526024808201527f426c6f636b4e756d626572456e666f726365723a6561726c792d64656c6567616044820152633a34b7b760e11b60648201526084015b60405180910390fd5b6001600160801b038116156101aa57806001600160801b031643106101aa5760405162461bcd60e51b815260206004820152602660248201527f426c6f636b4e756d626572456e666f726365723a657870697265642d64656c6560448201526533b0ba34b7b760d11b606482015260840161012b565b50505050505050505050565b6000806020831461021a5760405162461bcd60e51b815260206004820152602860248201527f426c6f636b4e756d626572456e666f726365723a696e76616c69642d7465726d6044820152670e65ad8cadccee8d60c31b606482015260840161012b565b6102286010600085876103c2565b610231916103ec565b60801c915061024383601081876103c2565b61024c916103ec565b60801c90509250929050565b60008083601f84011261026a57600080fd5b50813567ffffffffffffffff81111561028257600080fd5b60208301915083602082850101111561029a57600080fd5b9250929050565b80356001600160a01b03811681146102b857600080fd5b919050565b60008060008060008060008060c0898b0312156102d957600080fd5b883567ffffffffffffffff808211156102f157600080fd5b6102fd8c838d01610258565b909a50985060208b013591508082111561031657600080fd5b6103228c838d01610258565b909850965060408b013591508082111561033b57600080fd5b5089016060818c03121561034e57600080fd5b93506060890135925061036360808a016102a1565b915061037160a08a016102a1565b90509295985092959890939650565b6000806020838503121561039357600080fd5b823567ffffffffffffffff8111156103aa57600080fd5b6103b685828601610258565b90969095509350505050565b600080858511156103d257600080fd5b838611156103df57600080fd5b5050820193919092039150565b6fffffffffffffffffffffffffffffffff19813581811691601085101561041d5780818660100360031b1b83161692505b50509291505056fea26469706673582212202f1df071a3b936ee3ad015758f36f43130359bf66ac06d4703490535de194a3864736f6c63430008170033", + "nonce": "0x6", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x14130fe294aaa9b80daec0fc91256312f186055e5c057f62a5fd532a103abf6c", + "transactionType": "CREATE2", + "contractName": "DeployedEnforcer", + "contractAddress": "0x5accb9559b56a6c1e3f90e342c85c42d93720d43", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x8f463", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b506106b5806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063481286e6146100515780639751a83d14610081578063b99deb0e14610096578063de723eeb146100b8575b600080fd5b61006461005f366004610410565b6100d0565b6040516001600160a01b0390911681526020015b60405180910390f35b61009461008f366004610497565b6100e5565b005b6100a96100a436600461055a565b6101e4565b6040516100789392919061059c565b6100946100c6366004610497565b5050505050505050565b60006100dc82846102ca565b90505b92915050565b60008060006100f48b8b6101e4565b919450925090506001600160a01b0383163b1561014f576040516001600160a01b03841681527f641dafeb23238fae3ef71c64fced975da90c34dede63890507f3dda6b1e0dfef9060200160405180910390a15050506100c6565b600061015b82846102d7565b9050836001600160a01b0316816001600160a01b0316146101d65760405162461bcd60e51b815260206004820152602a60248201527f4465706c6f796564456e666f726365723a6465706c6f7965642d6164647265736044820152690e65adad2e6dac2e8c6d60b31b60648201526084015b60405180910390fd5b505050505050505050505050565b6000806060603484116102475760405162461bcd60e51b815260206004820152602560248201527f4465706c6f796564456e666f726365723a696e76616c69642d7465726d732d6c6044820152640cadccee8d60db1b60648201526084016101cd565b610255601460008688610602565b61025e9161062c565b60601c9250610271603460148688610602565b61027a91610661565b91506102898460348188610602565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509598949750919550929350505050565b60006100dc83833061035f565b60006102e560008385610389565b9050806001600160a01b03163b60000361031d576040516352c7cd4960e11b81526001600160a01b03821660048201526024016101cd565b6040516001600160a01b03821681527faf3c4b03f515b5a38f3c238fdc24abf10854a2f27f2a85743a71de17e9bc7e7f9060200160405180910390a192915050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6000834710156103b55760405163392efb2b60e21b8152476004820152602481018590526044016101cd565b81516000036103d757604051631328927760e21b815260040160405180910390fd5b8282516020840186f590506001600160a01b03811661040957604051633a0ba96160e11b815260040160405180910390fd5b9392505050565b6000806040838503121561042357600080fd5b50508035926020909101359150565b60008083601f84011261044457600080fd5b50813567ffffffffffffffff81111561045c57600080fd5b60208301915083602082850101111561047457600080fd5b9250929050565b80356001600160a01b038116811461049257600080fd5b919050565b60008060008060008060008060c0898b0312156104b357600080fd5b883567ffffffffffffffff808211156104cb57600080fd5b6104d78c838d01610432565b909a50985060208b01359150808211156104f057600080fd5b6104fc8c838d01610432565b909850965060408b013591508082111561051557600080fd5b5089016060818c03121561052857600080fd5b93506060890135925061053d60808a0161047b565b915061054b60a08a0161047b565b90509295985092959890939650565b6000806020838503121561056d57600080fd5b823567ffffffffffffffff81111561058457600080fd5b61059085828601610432565b90969095509350505050565b60018060a01b03841681526000602084602084015260606040840152835180606085015260005b818110156105df578581018301518582016080015282016105c3565b506000608082860101526080601f19601f83011685010192505050949350505050565b6000808585111561061257600080fd5b8386111561061f57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106595780818660140360031b1b83161692505b505092915050565b803560208310156100df57600019602084900360031b1b169291505056fea2646970667358221220adae6ada7a0e210e98db78555afd35a3b834fe39e89d1ae92e20b35e9cc9358664736f6c63430008170033", + "nonce": "0x7", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x3eb1b1d29d58ec8402fe3de7911c2e7a722e549fe5b26c411d2d75483e4824df", + "transactionType": "CREATE2", + "contractName": "ERC20BalanceGteEnforcer", + "contractAddress": "0xb5d6b1ec6d868a3bae5b7f48178eaa2686a7a087", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xa3337", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061074a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806332a16f4e146100675780638678d6ef1461009f5780639751a83d146100c0578063b5e54492146100d5578063b99deb0e146100f5578063de723eeb14610127575b600080fd5b61008a61007536600461049d565b60016020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100b26100ad3660046104d2565b61013a565b604051908152602001610096565b6100d36100ce366004610557565b61014f565b005b6100b26100e336600461049d565b60006020819052908152604090205481565b61010861010336600461061a565b610289565b604080516001600160a01b039093168352602083019190915201610096565b6100d3610135366004610557565b61032f565b600061014784848461045a565b949350505050565b600061015b8989610289565b509050600061016b33838761045a565b60008181526001602052604090205490915060ff16156101e55760405162461bcd60e51b815260206004820152602a60248201527f455243323042616c616e6365477465456e666f726365723a656e666f726365726044820152690b5a5ccb5b1bd8dad95960b21b60648201526084015b60405180910390fd5b6000818152600160208190526040808320805460ff1916909217909155516370a0823160e01b81526001600160a01b0386811660048301528416906370a0823190602401602060405180830381865afa158015610246573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026a919061065c565b6000928352602083905260409092209190915550505050505050505050565b600080603483146102f15760405162461bcd60e51b815260206004820152602c60248201527f455243323042616c616e6365477465456e666f726365723a696e76616c69642d60448201526b0e8cae4dae65ad8cadccee8d60a31b60648201526084016101dc565b6102ff601460008587610675565b6103089161069f565b60601c915061031a8360148187610675565b610323916106d4565b60001c90509250929050565b60008061033c8a8a610289565b91509150600061034d33848861045a565b600081815260016020526040808220805460ff19169055516370a0823160e01b81526001600160a01b03888116600483015292935090918516906370a0823190602401602060405180830381865afa1580156103ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d1919061065c565b6000838152602081905260409020549091506103ee9084906106f3565b81101561044c5760405162461bcd60e51b815260206004820152602660248201527f455243323042616c616e6365477465456e666f726365723a62616c616e63652d6044820152651b9bdd0b59dd60d21b60648201526084016101dc565b505050505050505050505050565b604080516001600160a01b039485166020808301919091529390941684820152606080850192909252805180850390920182526080909301909252815191012090565b6000602082840312156104af57600080fd5b5035919050565b80356001600160a01b03811681146104cd57600080fd5b919050565b6000806000606084860312156104e757600080fd5b6104f0846104b6565b92506104fe602085016104b6565b9150604084013590509250925092565b60008083601f84011261052057600080fd5b50813567ffffffffffffffff81111561053857600080fd5b60208301915083602082850101111561055057600080fd5b9250929050565b60008060008060008060008060c0898b03121561057357600080fd5b883567ffffffffffffffff8082111561058b57600080fd5b6105978c838d0161050e565b909a50985060208b01359150808211156105b057600080fd5b6105bc8c838d0161050e565b909850965060408b01359150808211156105d557600080fd5b5089016060818c0312156105e857600080fd5b9350606089013592506105fd60808a016104b6565b915061060b60a08a016104b6565b90509295985092959890939650565b6000806020838503121561062d57600080fd5b823567ffffffffffffffff81111561064457600080fd5b6106508582860161050e565b90969095509350505050565b60006020828403121561066e57600080fd5b5051919050565b6000808585111561068557600080fd5b8386111561069257600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106cc5780818660140360031b1b83161692505b505092915050565b803560208310156106ed57600019602084900360031b1b165b92915050565b808201808211156106ed57634e487b7160e01b600052601160045260246000fdfea2646970667358221220706a4bd5217d105228b49e7ecb48d785e4c5a4cbd88c1e0018e40907dafc0c9d64736f6c63430008170033", + "nonce": "0x8", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x07ab4b9a75b4afe943696391e1aebb2219cb78198a13ef9db3dfe67ca792789d", + "transactionType": "CREATE2", + "contractName": "ERC20TransferAmountEnforcer", + "contractAddress": "0x92ac423b9c111962179a6242e1adb58d02c103be", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x990f4", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061073b806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80639751a83d146100515780639dd5d9ab14610066578063b99deb0e146100a1578063de723eeb146100d3575b600080fd5b61006461005f366004610480565b6100eb565b005b61008e610074366004610543565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b6100b46100af36600461056d565b610383565b604080516001600160a01b039093168352602083019190915201610098565b6100646100e1366004610480565b5050505050505050565b6100f860408501856105af565b90506044146101565760405162461bcd60e51b815260206004820152603160248201526000805160206106e68339815191526044820152700d8d2c85ac2c6e8d2dedc5ad8cadccee8d607b1b60648201526084015b60405180910390fd5b6000806101638a8a610383565b9092509050600061017760208801886105f6565b905063a9059cbb60e01b6001600160a01b03848116908316146101df5760405162461bcd60e51b815260206004820152602c60248201526000805160206106e683398151915260448201526b1b1a590b58dbdb9d1c9858dd60a21b606482015260840161014d565b60006101ee60408a018a6105af565b6101fd91600491600091610618565b61020691610642565b90506001600160e01b0319808216908316146102655760405162461bcd60e51b815260206004820152602a60248201526000805160206106e68339815191526044820152691b1a590b5b595d1a1bd960b21b606482015260840161014d565b600061027460408b018b6105af565b61028391604491602491610618565b61028c91610672565b336000908152602081815260408083208d845290915281208054929350909183919083906102bb908490610691565b92505081905590508581111561032a5760405162461bcd60e51b815260206004820152602e60248201527f45524332305472616e73666572416d6f756e74456e666f726365723a616c6c6f60448201526d1dd85b98d94b595e18d95959195960921b606482015260840161014d565b60408051878152602081018390528b916001600160a01b038b169133917fc026e493323d526061a052b5dd562495120e2f648797a48be61966d3a6beec8d910160405180910390a4505050505050505050505050505050565b600080603483146103dd5760405162461bcd60e51b815260206004820152603060248201526000805160206106e683398151915260448201526f0d8d2c85ae8cae4dae65ad8cadccee8d60831b606482015260840161014d565b6103eb601460008587610618565b6103f4916106b2565b60601c91506104068360148187610618565b61040f91610672565b60001c90509250929050565b60008083601f84011261042d57600080fd5b50813567ffffffffffffffff81111561044557600080fd5b60208301915083602082850101111561045d57600080fd5b9250929050565b80356001600160a01b038116811461047b57600080fd5b919050565b60008060008060008060008060c0898b03121561049c57600080fd5b883567ffffffffffffffff808211156104b457600080fd5b6104c08c838d0161041b565b909a50985060208b01359150808211156104d957600080fd5b6104e58c838d0161041b565b909850965060408b01359150808211156104fe57600080fd5b5089016060818c03121561051157600080fd5b93506060890135925061052660808a01610464565b915061053460a08a01610464565b90509295985092959890939650565b6000806040838503121561055657600080fd5b61055f83610464565b946020939093013593505050565b6000806020838503121561058057600080fd5b823567ffffffffffffffff81111561059757600080fd5b6105a38582860161041b565b90969095509350505050565b6000808335601e198436030181126105c657600080fd5b83018035915067ffffffffffffffff8211156105e157600080fd5b60200191503681900382131561045d57600080fd5b60006020828403121561060857600080fd5b61061182610464565b9392505050565b6000808585111561062857600080fd5b8386111561063557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561066a5780818660040360031b1b83161692505b505092915050565b8035602083101561068b57600019602084900360031b1b165b92915050565b8082018082111561068b57634e487b7160e01b600052601160045260246000fd5b6bffffffffffffffffffffffff19813581811691601485101561066a5760149490940360031b84901b169092169291505056fe45524332305472616e73666572416d6f756e74456e666f726365723a696e7661a2646970667358221220bbaa47e7ff7ca5d260ee2e4ae44f60d5ed447ee0a25335e020538968f33cc37d64736f6c63430008170033", + "nonce": "0x9", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x833f7c0bcea43bc2752e2afa5047b64bc31bc2190becab94cba87a5ec79eed98", + "transactionType": "CREATE2", + "contractName": "IdEnforcer", + "contractAddress": "0x34152d9f3f8f74338d50703e780389e829b4abac", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x667df", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610486806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063595dce48146100515780639751a83d14610079578063b99deb0e1461008e578063de723eeb146100af575b600080fd5b61006461005f3660046102a8565b6100c7565b60405190151581526020015b60405180910390f35b61008c61008736600461032d565b6100fe565b005b6100a161009c3660046103f0565b610204565b604051908152602001610070565b61008c6100bd36600461032d565b5050505050505050565b6001600160a01b0380841660009081526020818152604080832093861683529290529081206100f69083610267565b949350505050565b600061010a8989610204565b90506101173384836100c7565b156101695760405162461bcd60e51b815260206004820152601a60248201527f4964456e666f726365723a69642d616c72656164792d7573656400000000000060448201526064015b60405180910390fd5b336000908152602081815260408083206001600160a01b03871684528252808320600885901c845290915290208054600160ff84161b179055826001600160a01b0316826001600160a01b0316336001600160a01b03167f6286af1aaf28b34723a53056e5608eabb40c823d1ce093ff371cf08c502431d6846040516101f191815260200190565b60405180910390a4505050505050505050565b6000602082146102565760405162461bcd60e51b815260206004820152601f60248201527f4964456e666f726365723a696e76616c69642d7465726d732d6c656e677468006044820152606401610160565b6102608284610432565b9392505050565b600881901c600090815260208390526040902054600160ff83161b1615155b92915050565b80356001600160a01b03811681146102a357600080fd5b919050565b6000806000606084860312156102bd57600080fd5b6102c68461028c565b92506102d46020850161028c565b9150604084013590509250925092565b60008083601f8401126102f657600080fd5b50813567ffffffffffffffff81111561030e57600080fd5b60208301915083602082850101111561032657600080fd5b9250929050565b60008060008060008060008060c0898b03121561034957600080fd5b883567ffffffffffffffff8082111561036157600080fd5b61036d8c838d016102e4565b909a50985060208b013591508082111561038657600080fd5b6103928c838d016102e4565b909850965060408b01359150808211156103ab57600080fd5b5089016060818c0312156103be57600080fd5b9350606089013592506103d360808a0161028c565b91506103e160a08a0161028c565b90509295985092959890939650565b6000806020838503121561040357600080fd5b823567ffffffffffffffff81111561041a57600080fd5b610426858286016102e4565b90969095509350505050565b8035602083101561028657600019602084900360031b1b169291505056fea264697066735822122028074431512be4166d9bc04a0557354e43d233df6620f59dcf4e6fea83a3a51f64736f6c63430008170033", + "nonce": "0xa", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xfa8833091d05ab547a09ca7690a05a7324d6117841d3636f839a1483e63d29e3", + "transactionType": "CREATE2", + "contractName": "LimitedCallsEnforcer", + "contractAddress": "0x4b3adad4a328bee8ba17b86074d92fe7372180cd", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x61904", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610442806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806319054d89146100515780639751a83d1461008b578063b99deb0e146100a0578063de723eeb146100b3575b600080fd5b61007961005f36600461024e565b600060208181529281526040808220909352908152205481565b60405190815260200160405180910390f35b61009e6100993660046102c1565b6100cb565b005b6100796100ae366004610384565b6101bd565b61009e6100c13660046102c1565b5050505050505050565b60006100d789896101bd565b336000908152602081815260408083208884529091528120805492935090918290610101906103c6565b91829055509050818111156101695760405162461bcd60e51b815260206004820152602360248201527f4c696d6974656443616c6c73456e666f726365723a6c696d69742d657863656560448201526219195960ea1b60648201526084015b60405180910390fd5b604080518381526020810183905286916001600160a01b0386169133917f449da07f2c06c9d1a6b19d2454ffe749e8cf991d22f686e076a1a4844c5ff370910160405180910390a450505050505050505050565b6000602082146102215760405162461bcd60e51b815260206004820152602960248201527f4c696d6974656443616c6c73456e666f726365723a696e76616c69642d7465726044820152680dae65ad8cadccee8d60bb1b6064820152608401610160565b61022b82846103ed565b9392505050565b80356001600160a01b038116811461024957600080fd5b919050565b6000806040838503121561026157600080fd5b61026a83610232565b946020939093013593505050565b60008083601f84011261028a57600080fd5b50813567ffffffffffffffff8111156102a257600080fd5b6020830191508360208285010111156102ba57600080fd5b9250929050565b60008060008060008060008060c0898b0312156102dd57600080fd5b883567ffffffffffffffff808211156102f557600080fd5b6103018c838d01610278565b909a50985060208b013591508082111561031a57600080fd5b6103268c838d01610278565b909850965060408b013591508082111561033f57600080fd5b5089016060818c03121561035257600080fd5b93506060890135925061036760808a01610232565b915061037560a08a01610232565b90509295985092959890939650565b6000806020838503121561039757600080fd5b823567ffffffffffffffff8111156103ae57600080fd5b6103ba85828601610278565b90969095509350505050565b6000600182016103e657634e487b7160e01b600052601160045260246000fd5b5060010190565b8035602083101561040657600019602084900360031b1b165b9291505056fea2646970667358221220f78aa8066d472e78f2d898b70704f695cf682a9b2914539b1a5a83b1dd87e31064736f6c63430008170033", + "nonce": "0xb", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x29de9a429163e8c8a0a8c6cae9f50c61cb49ac1c593c5c96d0cbd9eeaa09c0f1", + "transactionType": "CREATE2", + "contractName": "NonceEnforcer", + "contractAddress": "0x2f32ff3fc3086d7f63f16fe8d0065390d460b40d", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x68e23", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610457806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80632bd4ed211461005c5780639751a83d14610096578063b99deb0e146100ab578063de723eeb146100be578063f5743c4c146100d6575b600080fd5b61008461006a366004610266565b600060208181529281526040808220909352908152205481565b60405190815260200160405180910390f35b6100a96100a43660046102e2565b6100e9565b005b6100846100b93660046103a5565b610178565b6100a96100cc3660046102e2565b5050505050505050565b6100a96100e43660046103e7565b6101e6565b60006100f58989610178565b336000908152602081815260408083206001600160a01b0388168452909152902054909150811461016d5760405162461bcd60e51b815260206004820152601b60248201527f4e6f6e6365456e666f726365723a696e76616c69642d6e6f6e6365000000000060448201526064015b60405180910390fd5b505050505050505050565b6000602082146101d55760405162461bcd60e51b815260206004820152602260248201527f4e6f6e6365456e666f726365723a696e76616c69642d7465726d732d6c656e676044820152610e8d60f31b6064820152608401610164565b6101df8284610402565b9392505050565b6001600160a01b038116600081815260208181526040808320338085529083529281902080546001810190915590518181529093917fe02d340254c92bc3ad96f0fceb790db939e11c669c1f4c8a549d248f17130b33910160405180910390a35050565b80356001600160a01b038116811461026157600080fd5b919050565b6000806040838503121561027957600080fd5b6102828361024a565b91506102906020840161024a565b90509250929050565b60008083601f8401126102ab57600080fd5b50813567ffffffffffffffff8111156102c357600080fd5b6020830191508360208285010111156102db57600080fd5b9250929050565b60008060008060008060008060c0898b0312156102fe57600080fd5b883567ffffffffffffffff8082111561031657600080fd5b6103228c838d01610299565b909a50985060208b013591508082111561033b57600080fd5b6103478c838d01610299565b909850965060408b013591508082111561036057600080fd5b5089016060818c03121561037357600080fd5b93506060890135925061038860808a0161024a565b915061039660a08a0161024a565b90509295985092959890939650565b600080602083850312156103b857600080fd5b823567ffffffffffffffff8111156103cf57600080fd5b6103db85828601610299565b90969095509350505050565b6000602082840312156103f957600080fd5b6101df8261024a565b8035602083101561041b57600019602084900360031b1b165b9291505056fea2646970667358221220b8ac9ab0759f02df69d888b08c000fa4dfa4048ad7f88931687eeff439dd484a64736f6c63430008170033", + "nonce": "0xc", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x90f82929b07026741ef6691b46cdbdcc94987df529a5a7d4fac6a7b42d5dbf04", + "transactionType": "CREATE2", + "contractName": "TimestampEnforcer", + "contractAddress": "0x78e05f779490c24bf3bfa135b4112e7003b321cd", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x68cc4", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610455806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610092575b600080fd5b6100596100543660046102b7565b6100aa565b005b61006e61006936600461037a565b6101b2565b604080516001600160801b0393841681529290911660208301520160405180910390f35b6100596100a03660046102b7565b5050505050505050565b6000806100b78a8a6101b2565b90925090506001600160801b0382161561013357816001600160801b031642116101335760405162461bcd60e51b815260206004820152602260248201527f54696d657374616d70456e666f726365723a6561726c792d64656c656761746960448201526137b760f11b60648201526084015b60405180910390fd5b6001600160801b038116156101a657806001600160801b031642106101a65760405162461bcd60e51b8152602060048201526024808201527f54696d657374616d70456e666f726365723a657870697265642d64656c6567616044820152633a34b7b760e11b606482015260840161012a565b50505050505050505050565b600080602083146102145760405162461bcd60e51b815260206004820152602660248201527f54696d657374616d70456e666f726365723a696e76616c69642d7465726d732d6044820152650d8cadccee8d60d31b606482015260840161012a565b61022183601081876103bc565b61022a916103e6565b60801c905061023d6010600085876103bc565b610246916103e6565b60801c91509250929050565b60008083601f84011261026457600080fd5b50813567ffffffffffffffff81111561027c57600080fd5b60208301915083602082850101111561029457600080fd5b9250929050565b80356001600160a01b03811681146102b257600080fd5b919050565b60008060008060008060008060c0898b0312156102d357600080fd5b883567ffffffffffffffff808211156102eb57600080fd5b6102f78c838d01610252565b909a50985060208b013591508082111561031057600080fd5b61031c8c838d01610252565b909850965060408b013591508082111561033557600080fd5b5089016060818c03121561034857600080fd5b93506060890135925061035d60808a0161029b565b915061036b60a08a0161029b565b90509295985092959890939650565b6000806020838503121561038d57600080fd5b823567ffffffffffffffff8111156103a457600080fd5b6103b085828601610252565b90969095509350505050565b600080858511156103cc57600080fd5b838611156103d957600080fd5b5050820193919092039150565b6fffffffffffffffffffffffffffffffff1981358181169160108510156104175780818660100360031b1b83161692505b50509291505056fea2646970667358221220032d822c6d896afe6d14f1080a0918e2996d1c61fe51449e6ecf5841d50e5ea464736f6c63430008170033", + "nonce": "0xd", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x98322939a0f3308f8a28788f9a2a24b724630f10d560dc13f3dbb6b6532e1d9f", + "transactionType": "CREATE2", + "contractName": "ValueLteEnforcer", + "contractAddress": "0xfc20ede0a1132e839fbda9d7ed3904ff3c89540f", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x4e4e9", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061033a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610080575b600080fd5b6100596100543660046101e0565b610098565b005b61006e6100693660046102a3565b61010a565b60405190815260200160405180910390f35b61005961008e3660046101e0565b5050505050505050565b60006100a4898961010a565b905080856020013511156100ff5760405162461bcd60e51b815260206004820152601f60248201527f56616c75654c7465456e666f726365723a76616c75652d746f6f2d686967680060448201526064015b60405180910390fd5b505050505050505050565b60006020821461016a5760405162461bcd60e51b815260206004820152602560248201527f56616c75654c7465456e666f726365723a696e76616c69642d7465726d732d6c6044820152640cadccee8d60db1b60648201526084016100f6565b61017482846102e5565b9392505050565b60008083601f84011261018d57600080fd5b50813567ffffffffffffffff8111156101a557600080fd5b6020830191508360208285010111156101bd57600080fd5b9250929050565b80356001600160a01b03811681146101db57600080fd5b919050565b60008060008060008060008060c0898b0312156101fc57600080fd5b883567ffffffffffffffff8082111561021457600080fd5b6102208c838d0161017b565b909a50985060208b013591508082111561023957600080fd5b6102458c838d0161017b565b909850965060408b013591508082111561025e57600080fd5b5089016060818c03121561027157600080fd5b93506060890135925061028660808a016101c4565b915061029460a08a016101c4565b90509295985092959890939650565b600080602083850312156102b657600080fd5b823567ffffffffffffffff8111156102cd57600080fd5b6102d98582860161017b565b90969095509350505050565b803560208310156102fe57600019602084900360031b1b165b9291505056fea2646970667358221220cd4bcb89c90c60ef26b293e82752e5ff08228ce4ed86119c5597e63559710ece64736f6c63430008170033", + "nonce": "0xe", + "chainId": "0xe708" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x28ded0", + "logs": [ + { + "address": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44" + ], + "data": "0x", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "transactionHash": "0xc401aa79e52a75ffe318ff1de2f04fc1cb5fa12fafbe141eed57f86463e8c668", + "transactionIndex": "0x4", + "logIndex": "0xb", + "removed": false + }, + { + "address": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "topics": [ + "0x04a46d9007577c7ff1e513b900545162ec25d25991ae3dc60cf26ec01a84806d", + "0x4f0aeb4a10068c847f74592d99da8ec1544209094c304a8c9d1773c2a425a343", + "0x000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d78" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000e708000000000000000000000000000000000000000000000000000000000000001144656c65676174696f6e4d616e6167657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013100000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "transactionHash": "0xc401aa79e52a75ffe318ff1de2f04fc1cb5fa12fafbe141eed57f86463e8c668", + "transactionIndex": "0x4", + "logIndex": "0xc", + "removed": false + } + ], + "logsBloom": "0x00040000000000000000000000000000000000000000000000800000004000000000000000000000000000000000000000000000000000000000041400020000000000000000000000040000000000000001000000001400000000000000000000000000020000000000000000000800000000000080000000000000000000480000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000008000000020000000000800000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xc401aa79e52a75ffe318ff1de2f04fc1cb5fa12fafbe141eed57f86463e8c668", + "transactionIndex": "0x4", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x1fac83", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x583548", + "logs": [ + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "transactionHash": "0xfd3fd79c2ab17cfeb1be4d2cfcb9ce9ee1fed331d029a564bc96192fbbdc2bda", + "transactionIndex": "0x5", + "logIndex": "0xd", + "removed": false + }, + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0xb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d", + "0x000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d78" + ], + "data": "0x", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "transactionHash": "0xfd3fd79c2ab17cfeb1be4d2cfcb9ce9ee1fed331d029a564bc96192fbbdc2bda", + "transactionIndex": "0x5", + "logIndex": "0xe", + "removed": false + }, + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0xee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a99", + "0x0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032" + ], + "data": "0x", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "transactionHash": "0xfd3fd79c2ab17cfeb1be4d2cfcb9ce9ee1fed331d029a564bc96192fbbdc2bda", + "transactionIndex": "0x5", + "logIndex": "0xf", + "removed": false + }, + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0x78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d03" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "transactionHash": "0xfd3fd79c2ab17cfeb1be4d2cfcb9ce9ee1fed331d029a564bc96192fbbdc2bda", + "transactionIndex": "0x5", + "logIndex": "0x10", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000002000010000000000000000000000200000000000000000000000000000000000000000000000000000000000020810000000020000010000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200080000000000000000000080000000000000000008800000000000000000000000080000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000001080000000000000000000004000000000000000000000000000000000000000000000000000000800000000000000100000000000000", + "type": "0x2", + "transactionHash": "0xfd3fd79c2ab17cfeb1be4d2cfcb9ce9ee1fed331d029a564bc96192fbbdc2bda", + "transactionIndex": "0x5", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x2f5678", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x9bc6ba", + "logs": [ + { + "address": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "transactionHash": "0xb193634c8a35853ca5a8dda2cd6f9c1ae1ab401f5022b6d7081fc672a26e6069", + "transactionIndex": "0x6", + "logIndex": "0x11", + "removed": false + }, + { + "address": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "topics": [ + "0xb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d", + "0x000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d78" + ], + "data": "0x", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "transactionHash": "0xb193634c8a35853ca5a8dda2cd6f9c1ae1ab401f5022b6d7081fc672a26e6069", + "transactionIndex": "0x6", + "logIndex": "0x12", + "removed": false + }, + { + "address": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "topics": [ + "0xee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a99", + "0x0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032" + ], + "data": "0x", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "transactionHash": "0xb193634c8a35853ca5a8dda2cd6f9c1ae1ab401f5022b6d7081fc672a26e6069", + "transactionIndex": "0x6", + "logIndex": "0x13", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000810000000020000010000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000080000000000000000000080000000000000000008800000000000000000000000080000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000100000000000000000000000000000000000200000000000000800000000000000100000000000000", + "type": "0x2", + "transactionHash": "0xb193634c8a35853ca5a8dda2cd6f9c1ae1ab401f5022b6d7081fc672a26e6069", + "transactionIndex": "0x6", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x439172", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xa1550f", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xe4c27ddf1a20409ed468c1926a70151442bab0d7bf1424b073c42cc13fd36e1e", + "transactionIndex": "0x7", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x58e55", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xa7a673", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x1fea0515a7b0fc7ef67d87dfbac1c5a5c8f89bccd62ede5eabddb784d3e43d4f", + "transactionIndex": "0x8", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x65164", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xad6829", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xd42e14c91f7e5a8226fb41942b6c789baff681a79f28ce7d183b3a3e1a616b9a", + "transactionIndex": "0x9", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x5c1b6", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xb1e7bb", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xece04f176117704c838ce67bb1c68576add1e18349aaa4753ba5967c9467bad9", + "transactionIndex": "0xa", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x47f92", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xb86361", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x14130fe294aaa9b80daec0fc91256312f186055e5c057f62a5fd532a103abf6c", + "transactionIndex": "0xb", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x67ba6", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xbf5cd4", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x3eb1b1d29d58ec8402fe3de7911c2e7a722e549fe5b26c411d2d75483e4824df", + "transactionIndex": "0xc", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x6f973", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc649d4", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x07ab4b9a75b4afe943696391e1aebb2219cb78198a13ef9db3dfe67ca792789d", + "transactionIndex": "0xd", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x6ed00", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xcaed12", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x833f7c0bcea43bc2752e2afa5047b64bc31bc2190becab94cba87a5ec79eed98", + "transactionIndex": "0xe", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x4a33e", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xcf5738", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xfa8833091d05ab547a09ca7690a05a7324d6117841d3636f839a1483e63d29e3", + "transactionIndex": "0xf", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x46a26", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xd3d2aa", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x29de9a429163e8c8a0a8c6cae9f50c61cb49ac1c593c5c96d0cbd9eeaa09c0f1", + "transactionIndex": "0x10", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x47b72", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xd84d2c", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x90f82929b07026741ef6691b46cdbdcc94987df529a5a7d4fac6a7b42d5dbf04", + "transactionIndex": "0x11", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x47a82", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xdbd842", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x98322939a0f3308f8a28788f9a2a24b724630f10d560dc13f3dbb6b6532e1d9f", + "transactionIndex": "0x12", + "blockHash": "0xf63079393498c1406e1e5141be922a5f3df956a79a032460dbba2cc5aee81485", + "blockNumber": "0x62d40b", + "gasUsed": "0x38b16", + "effectiveGasPrice": "0x3938707", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1720356824, + "chain": 59144, + "commit": null +} \ No newline at end of file diff --git a/broadcast/DeployEnvironmentSetUp.s.sol/8453/run-1720358475.json b/broadcast/DeployEnvironmentSetUp.s.sol/8453/run-1720358475.json new file mode 100644 index 0000000..c282e58 --- /dev/null +++ b/broadcast/DeployEnvironmentSetUp.s.sol/8453/run-1720358475.json @@ -0,0 +1,763 @@ +{ + "transactions": [ + { + "hash": "0x2152d94cce1bf52dc6dc9d5f9d2242d7d9e9afc0484cb684d09d7d56aaf3515e", + "transactionType": "CREATE2", + "contractName": "DelegationManager", + "contractAddress": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "function": null, + "arguments": [ + "0xB0403B32f54d0Bd752113f4009e8B534C6669f44" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x2e52b2", + "value": "0x0", + "input": "0x44656c654761746f7200000000000000000000000000000000000000000000006101606040523480156200001257600080fd5b50604051620029e7380380620029e7833981016040819052620000359162000384565b60408051808201825260118152702232b632b3b0ba34b7b726b0b730b3b2b960791b602080830191909152825180840190935260018352603160f81b9083015290826001600160a01b038116620000a757604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b620000b28162000204565b506001805460ff60a01b19169055620000cd82600262000222565b61012052620000de81600362000222565b61014052815160208084019190912060e052815190820120610100524660a0526200015b60e0516101005160408051600080516020620029c783398151915260208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526000620001706200025b565b9050306001600160a01b0316817f04a46d9007577c7ff1e513b900545162ec25d25991ae3dc60cf26ec01a84806d604051806040016040528060118152602001702232b632b3b0ba34b7b726b0b730b3b2b960791b815250604051806040016040528060018152602001603160f81b81525046604051620001f493929190620003fe565b60405180910390a35050620005e5565b600180546001600160a01b03191690556200021f81620002f1565b50565b600060208351101562000242576200023a8362000341565b905062000255565b816200024f8482620004df565b5060ff90505b92915050565b600060c0516001600160a01b0316306001600160a01b031614801562000282575060a05146145b156200028f575060805190565b620002ec60e0516101005160408051600080516020620029c783398151915260208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b905090565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080829050601f815111156200036f578260405163305a27a960e01b81526004016200009e9190620005ab565b80516200037c82620005c0565b179392505050565b6000602082840312156200039757600080fd5b81516001600160a01b0381168114620003af57600080fd5b9392505050565b6000815180845260005b81811015620003de57602081850181015186830182015201620003c0565b506000602082860101526020601f19601f83011685010191505092915050565b606081526000620004136060830186620003b6565b8281036020840152620004278186620003b6565b915050826040830152949350505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200046357607f821691505b6020821081036200048457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004da576000816000526020600020601f850160051c81016020861015620004b55750805b601f850160051c820191505b81811015620004d657828155600101620004c1565b5050505b505050565b81516001600160401b03811115620004fb57620004fb62000438565b62000513816200050c84546200044e565b846200048a565b602080601f8311600181146200054b5760008415620005325750858301515b600019600386901b1c1916600185901b178555620004d6565b600085815260208120601f198616915b828110156200057c578886015182559484019460019091019084016200055b565b50858210156200059b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602081526000620003af6020830184620003b6565b80516020808301519190811015620004845760001960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516123876200064060003960006113bb0152600061138e015260006112f3015260006112cb01526000611226015260006112500152600061127a01526123876000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80637fade287116100b8578063a3f4df7e1161007c578063a3f4df7e1461028e578063acb8cc49146102cb578063e1520f54146102eb578063e30c3978146102fe578063f2fde38b1461030f578063ffa1ad741461032257600080fd5b80637fade2871461023f57806383ebb771146102525780638456cb591461025a57806384b0196e146102625780638da5cb5b1461027d57600080fd5b806358909ebc1161010a57806358909ebc146101c65780635c975abb146101e75780635daa6539146101f9578063661346071461021c578063715018a61461022f57806379ba50971461023757600080fd5b80631b13cac2146101475780632d40d052146101635780633ed01015146101965780633f4ba83a146101ab57806349934047146101b3575b600080fd5b61015060001981565b6040519081526020015b60405180910390f35b6101866101713660046118c7565b60056020526000908152604090205460ff1681565b604051901515815260200161015a565b6101a96101a43660046118e0565b610346565b005b6101a9610440565b6101a96101c13660046118e0565b610452565b6101cf610a1181565b6040516001600160a01b03909116815260200161015a565b600154600160a01b900460ff16610186565b6101866102073660046118c7565b60046020526000908152604090205460ff1681565b61015061022a3660046118e0565b610542565b6101a961055b565b6101a961056d565b6101a961024d3660046118e0565b6105b6565b6101506106a7565b6101a96106b6565b61026a6106c6565b60405161015a9796959493929190611967565b6000546001600160a01b03166101cf565b6102be604051806040016040528060118152602001702232b632b3b0ba34b7b726b0b730b3b2b960791b81525081565b60405161015a9190611a00565b6102be604051806040016040528060018152602001603160f81b81525081565b6101a96102f9366004611a13565b61070c565b6001546001600160a01b03166101cf565b6101a961031d366004611ac9565b611072565b6102be604051806040016040528060058152602001640312e302e360dc1b81525081565b6103566040820160208301611ac9565b6001600160a01b038116331461037f5760405163b9f0f17160e01b815260040160405180910390fd5b600061038a83610542565b60008181526005602052604090205490915060ff166103bc57604051637952fbad60e11b815260040160405180910390fd5b6000818152600560209081526040909120805460ff191690556103e190840184611ac9565b6001600160a01b03166103fa6040850160208601611ac9565b6001600160a01b0316827f3feadce88fc1b49db633a56fd5307ed6ee18734df83bcc4011daa720c9cd95f1866040516104339190611c18565b60405180910390a4505050565b6104486110e3565b610450611110565b565b6104626040820160208301611ac9565b6001600160a01b038116331461048b5760405163b9f0f17160e01b815260040160405180910390fd5b600061049683610542565b60008181526005602052604090205490915060ff16156104c857604051625ecddb60e01b815260040160405180910390fd5b6000818152600560209081526040909120805460ff191660011790556104f090840184611ac9565b6001600160a01b03166105096040850160208601611ac9565b6001600160a01b0316827fea589ba9473ee1fe77d352c7ed919747715a5d22931b972de9b02a907c66d5dd866040516104339190611c18565b600061055561055083611fae565b611165565b92915050565b6105636110e3565b6104506000611200565b60015433906001600160a01b031681146105aa5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b6105b381611200565b50565b6105c66040820160208301611ac9565b6001600160a01b03811633146105ef5760405163b9f0f17160e01b815260040160405180910390fd5b60006105fa83610542565b60008181526004602052604090205490915060ff161561062d5760405163119b4fd360e11b815260040160405180910390fd5b6000818152600460209081526040909120805460ff1916600117905561065590840184611ac9565b6001600160a01b031661066e6040850160208601611ac9565b6001600160a01b0316827fb9b56ecd70a93a7fcb54a1072d6a9c7ff488f46d6c656bb0a0fa453924658704866040516104339190611c18565b60006106b1611219565b905090565b6106be6110e3565b610450611344565b6000606080600080600060606106da611387565b6106e26113b4565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6107146113e1565b600061072283850185611fba565b905080516000036107465760405163efe957cf60e01b815260040160405180910390fd5b600081516001600160401b0381111561076157610761611ce9565b60405190808252806020026020018201604052801561078a578160200160208202803683370190505b5090506107db6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600080191681526020016060815260200160008152602001606081525090565b336001600160a01b0316836000815181106107f8576107f861206a565b6020026020010151600001516001600160a01b03161415801561084d5750610a116001600160a01b0316836000815181106108355761083561206a565b6020026020010151600001516001600160a01b031614155b1561086b57604051632d618d8160e21b815260040160405180910390fd5b60005b8351811015610a98578381815181106108895761088961206a565b6020026020010151915061089c82611165565b8382815181106108ae576108ae61206a565b6020026020010181815250508160a001515160000361091d57600460008483815181106108dd576108dd61206a565b60209081029190910181015182528101919091526040016000205460ff166109185760405163a9e649e960e01b815260040160405180910390fd5b610a90565b60208201516001600160a01b0381163b6000036109c157600061098761097d6109446106a7565b8786815181106109565761095661206a565b602002602001015160405161190160f01b8152600281019290925260228201526042902090565b8560a0015161140c565b9050816001600160a01b0316816001600160a01b0316146109bb57604051638baa579f60e01b815260040160405180910390fd5b50610a8e565b60006109e06109ce6106a7565b8685815181106109565761095661206a565b60a0850151604051630b135d3f60e11b81529192506000916001600160a01b03851691631626ba7e91610a17918691600401612080565b602060405180830381865afa158015610a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5891906120a1565b6001600160e01b0319169050630b135d3f60e11b8114610a8b57604051638baa579f60e01b815260040160405180910390fd5b50505b505b60010161086e565b5060005b8351811015610c585760056000848381518110610abb57610abb61206a565b60209081029190910181015182528101919091526040016000205460ff1615610af7576040516302dd502960e11b815260040160405180910390fd5b60018451610b0591906120e1565b8114610c0e5782610b178260016120f4565b81518110610b2757610b2761206a565b6020026020010151848281518110610b4157610b4161206a565b60200260200101516040015114610b6b57604051636f6a1b8760e11b815260040160405180910390fd5b600084610b798360016120f4565b81518110610b8957610b8961206a565b6020026020010151600001519050610a116001600160a01b0316816001600160a01b031614158015610bea5750806001600160a01b0316858381518110610bd257610bd261206a565b6020026020010151602001516001600160a01b031614155b15610c0857604051632d618d8160e21b815260040160405180910390fd5b50610c50565b60001960001b848281518110610c2657610c2661206a565b60200260200101516040015114610c5057604051636f6a1b8760e11b815260040160405180910390fd5b600101610a9c565b5060005b8351811015610db8576000848281518110610c7957610c7961206a565b60200260200101516060015190506000848381518110610c9b57610c9b61206a565b602002602001015190506000868481518110610cb957610cb961206a565b602002602001015160200151905060008351905060005b81811015610da8576000858281518110610cec57610cec61206a565b6020026020010151600001519050806001600160a01b0316639751a83d878481518110610d1b57610d1b61206a565b602002602001015160200151888581518110610d3957610d3961206a565b6020026020010151604001518e8989336040518763ffffffff1660e01b8152600401610d6a96959493929190612152565b600060405180830381600087803b158015610d8457600080fd5b505af1158015610d98573d6000803e3d6000fd5b5050505050806001019050610cd0565b5050505050806001019050610c5c565b508260018451610dc891906120e1565b81518110610dd857610dd861206a565b6020026020010151602001516001600160a01b03166326f0aef7856040518263ffffffff1660e01b8152600401610e0f91906121b4565b600060405180830381600087803b158015610e2957600080fd5b505af1158015610e3d573d6000803e3d6000fd5b505084519150505b8015610fc657600084610e596001846120e1565b81518110610e6957610e6961206a565b6020026020010151606001519050600084600184610e8791906120e1565b81518110610e9757610e9761206a565b60200260200101519050600086600185610eb191906120e1565b81518110610ec157610ec161206a565b602002602001015160200151905060008351905060005b81811015610fb0576000858281518110610ef457610ef461206a565b6020026020010151600001519050806001600160a01b031663de723eeb878481518110610f2357610f2361206a565b602002602001015160200151888581518110610f4157610f4161206a565b6020026020010151604001518e8989336040518763ffffffff1660e01b8152600401610f7296959493929190612152565b600060405180830381600087803b158015610f8c57600080fd5b505af1158015610fa0573d6000803e3d6000fd5b5050505050806001019050610ed8565b505050505080610fbf906121c7565b9050610e45565b5060005b835181101561106957336001600160a01b03168460018651610fec91906120e1565b81518110610ffc57610ffc61206a565b6020026020010151602001516001600160a01b03167f40dadaa36c6c2e3d7317e24757451ffb2d603d875f0ad5e92c5dd156573b18738684815181106110445761104461206a565b602002602001015160405161105991906121de565b60405180910390a3600101610fca565b50505050505050565b61107a6110e3565b600180546001600160a01b0383166001600160a01b031990911681179091556110ab6000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000546001600160a01b031633146104505760405163118cdaa760e01b81523360048201526024016105a1565b611118611436565b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000807f88c1d2ecf185adf710588203a5f263f0ff61be0d33da39792cde19ba9aa4331e8360000151846020015185604001516111a58760600151611460565b6080808901516040805160208101989098526001600160a01b03968716908801529490931660608601529184015260a083015260c082015260e0015b60408051601f1981840301815291905280516020909101209392505050565b600180546001600160a01b03191690556105b38161152b565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561127257507f000000000000000000000000000000000000000000000000000000000000000046145b1561129c57507f000000000000000000000000000000000000000000000000000000000000000090565b6106b1604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b61134c6113e1565b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586111483390565b60606106b17f0000000000000000000000000000000000000000000000000000000000000000600261157b565b60606106b17f0000000000000000000000000000000000000000000000000000000000000000600361157b565b600154600160a01b900460ff16156104505760405163d93c066560e01b815260040160405180910390fd5b60008060008061141c8686611626565b92509250925061142c8282611673565b5090949350505050565b600154600160a01b900460ff1661045057604051638dfc202b60e01b815260040160405180910390fd5b60008082516001600160401b0381111561147c5761147c611ce9565b6040519080825280602002602001820160405280156114a5578160200160208202803683370190505b50905060005b83518110156114fb576114d68482815181106114c9576114c961206a565b6020026020010151611730565b8282815181106114e8576114e861206a565b60209081029190910101526001016114ab565b508060405160200161150d91906122cb565b60405160208183030381529060405280519060200120915050919050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606060ff83146115955761158e83611791565b9050610555565b8180546115a190612301565b80601f01602080910402602001604051908101604052809291908181526020018280546115cd90612301565b801561161a5780601f106115ef5761010080835404028352916020019161161a565b820191906000526020600020905b8154815290600101906020018083116115fd57829003601f168201915b50505050509050610555565b600080600083516041036116605760208401516040850151606086015160001a611652888285856117d0565b95509550955050505061166c565b50508151600091506002905b9250925092565b60008260038111156116875761168761233b565b03611690575050565b60018260038111156116a4576116a461233b565b036116c25760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156116d6576116d661233b565b036116f75760405163fce698f760e01b8152600481018290526024016105a1565b600382600381111561170b5761170b61233b565b0361172c576040516335e2f38360e21b8152600481018290526024016105a1565b5050565b6000807f80ad7e1b04ee6d994a125f4714ca0720908bd80ed16063ec8aee4b88e9253e2d83600001518460200151805190602001206040516020016111e1939291909283526001600160a01b03919091166020830152604082015260600190565b6060600061179e8361189f565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561180b5750600091506003905082611895565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561185f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661188b57506000925060019150829050611895565b9250600091508190505b9450945094915050565b600060ff8216601f81111561055557604051632cd44ac360e21b815260040160405180910390fd5b6000602082840312156118d957600080fd5b5035919050565b6000602082840312156118f257600080fd5b81356001600160401b0381111561190857600080fd5b820160c0818503121561191a57600080fd5b9392505050565b6000815180845260005b818110156119475760208185018101518683018201520161192b565b506000602082860101526020601f19601f83011685010191505092915050565b60ff60f81b881681526000602060e0602084015261198860e084018a611921565b838103604085015261199a818a611921565b606085018990526001600160a01b038816608086015260a0850187905284810360c08601528551808252602080880193509091019060005b818110156119ee578351835292840192918401916001016119d2565b50909c9b505050505050505050505050565b60208152600061191a6020830184611921565b600080600060408486031215611a2857600080fd5b83356001600160401b0380821115611a3f57600080fd5b818601915086601f830112611a5357600080fd5b813581811115611a6257600080fd5b876020828501011115611a7457600080fd5b602092830195509350908501359080821115611a8f57600080fd5b50840160608187031215611aa257600080fd5b809150509250925092565b80356001600160a01b0381168114611ac457600080fd5b919050565b600060208284031215611adb57600080fd5b61191a82611aad565b6000808335601e19843603018112611afb57600080fd5b83016020810192503590506001600160401b03811115611b1a57600080fd5b803603821315611b2957600080fd5b9250929050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b88811015611c0a57858403601f19018a52823536899003605e19018112611b98578283fd5b880160606001600160a01b03611bad83611aad565b168652611bbc87830183611ae4565b8289890152611bce8389018284611b30565b925050506040611be081840184611ae4565b935087830382890152611bf4838583611b30565b9d89019d97505050938601935050600101611b73565b509198975050505050505050565b6020815260006001600160a01b0380611c3085611aad565b16602084015280611c4360208601611aad565b16604084015250604083013560608301526060830135601e19843603018112611c6b57600080fd5b83016020810190356001600160401b03811115611c8757600080fd5b8060051b3603821315611c9957600080fd5b60c06080850152611cae60e085018284611b59565b915050608084013560a0840152611cc860a0850185611ae4565b848303601f190160c0860152611cdf838284611b30565b9695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715611d2157611d21611ce9565b60405290565b60405160c081016001600160401b0381118282101715611d2157611d21611ce9565b604051601f8201601f191681016001600160401b0381118282101715611d7157611d71611ce9565b604052919050565b60006001600160401b03821115611d9257611d92611ce9565b5060051b60200190565b600082601f830112611dad57600080fd5b81356001600160401b03811115611dc657611dc6611ce9565b611dd9601f8201601f1916602001611d49565b818152846020838601011115611dee57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f830112611e1c57600080fd5b81356020611e31611e2c83611d79565b611d49565b82815260059290921b84018101918181019086841115611e5057600080fd5b8286015b84811015611eff5780356001600160401b0380821115611e745760008081fd5b908801906060828b03601f1901811315611e8e5760008081fd5b611e96611cff565b611ea1888501611aad565b815260408085013584811115611eb75760008081fd5b611ec58e8b83890101611d9c565b838b015250918401359183831115611edd5760008081fd5b611eeb8d8a85880101611d9c565b908201528652505050918301918301611e54565b509695505050505050565b600060c08284031215611f1c57600080fd5b611f24611d27565b9050611f2f82611aad565b8152611f3d60208301611aad565b60208201526040820135604082015260608201356001600160401b0380821115611f6657600080fd5b611f7285838601611e0b565b60608401526080840135608084015260a0840135915080821115611f9557600080fd5b50611fa284828501611d9c565b60a08301525092915050565b60006105553683611f0a565b60006020808385031215611fcd57600080fd5b82356001600160401b0380821115611fe457600080fd5b818501915085601f830112611ff857600080fd5b8135612006611e2c82611d79565b81815260059190911b8301840190848101908883111561202557600080fd5b8585015b8381101561205d578035858111156120415760008081fd5b61204f8b89838a0101611f0a565b845250918601918601612029565b5098975050505050505050565b634e487b7160e01b600052603260045260246000fd5b8281526040602082015260006120996040830184611921565b949350505050565b6000602082840312156120b357600080fd5b81516001600160e01b03198116811461191a57600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610555576105556120cb565b80820180821115610555576105556120cb565b6001600160a01b0361211882611aad565b1682526020810135602083015260006121346040830183611ae4565b60606040860152612149606086018284611b30565b95945050505050565b60c08152600061216560c0830189611921565b82810360208401526121778189611921565b9050828103604084015261218b8188612107565b606084019690965250506001600160a01b039283166080820152911660a0909101529392505050565b60208152600061191a6020830184612107565b6000816121d6576121d66120cb565b506000190190565b602080825282516001600160a01b0390811683830152838201518116604080850191909152808501516060808601919091528086015160c06080870152805160e0870181905260009594610100600583901b8901810195919493870193919290890190885b8181101561229d5760ff198b8903018352855187815116895289810151858b8b0152612271868b0182611921565b918701518a83038b8901529190506122898183611921565b995050509488019491880191600101612243565b50505050505050608085015160a085015260a08501519150601f198482030160c08501526121498183611921565b815160009082906020808601845b838110156122f5578151855293820193908201906001016122d9565b50929695505050505050565b600181811c9082168061231557607f821691505b60208210810361233557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052602160045260246000fdfea26469706673582212206702181458ece90d9cf27649387478caa2ed36ffd86ba70b239c4be34106280764736f6c634300081700338b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "nonce": "0x0", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xfe0407c7d054dd0f49f569de3d7c1d69635f4c8d954bbddf528e9871c94ba3a5", + "transactionType": "CREATE2", + "contractName": "MultiSigDeleGator", + "contractAddress": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "function": null, + "arguments": [ + "0xbe4138886cB096bDC1B930F2f0ca7892AA234D78", + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x4162a1", + "value": "0x0", + "input": "0x44656c654761746f72000000000000000000000000000000000000000000000060e0604052306080523480156200001557600080fd5b506040516200396338038062003963833981016040819052620000389162000208565b8181620000446200013e565b6001600160a01b0380831660a081905290821660c0526040517fb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d90600090a26040516001600160a01b038216907fee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a9990600090a250506000197fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c0281905560408051918252517fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c00917f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d03919081900360200190a150505062000247565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156200018f5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001ef5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b0381168114620001ef57600080fd5b600080604083850312156200021c57600080fd5b82516200022981620001f2565b60208401519092506200023c81620001f2565b809150509250929050565b60805160a05160c0516136216200034260003960008181610633015281816108a001528181610b0001528181610bbb01528181610c3c01528181610cba01528181610e1f01528181610ed401528181610f5b015281816110b9015281816111f9015281816112ac0152818161131e0152818161138901528181611521015281816115b4015281816115f6015281816116ec015281816117ca015281816119e0015261240a01526000818161077201528181610b6601528181610d1d01528181610da001528181610e8201528181611130015281816113ec015261174f015260008181611b8201528181611bab015261211901526136216000f3fe60806040526004361061024a5760003560e01c80637df73e2711610139578063bc197c81116100b6578063e3d9109f1161007a578063e3d9109f1461070c578063e75235b81461072c578063ea4d3c9b14610760578063eb12d61e14610794578063f23a6e61146107b4578063ffa1ad74146107d457600080fd5b8063bc197c8114610682578063c399ec88146106a2578063d087d288146106b7578063d7d7442f146106cc578063e1520f54146106ec57600080fd5b8063a24c8f32116100fd578063a24c8f32146105a3578063aaf10f42146105b6578063ad3cb1cc146105e3578063b0d691fe14610621578063b3c650151461065557600080fd5b80637df73e27146104d95780637f07bfdc1461051f5780637fade2871461053f57806394cf795e1461055f578063a0c1deb41461058157600080fd5b80634891161f116101c75780635c1c6dcd1161018b5780635c1c6dcd1461043957806360b5bb3f1461045957806365ee81d8146104795780636af1f3991461049957806378979a80146104b957600080fd5b80634891161f146103d457806349934047146103e95780634a58db19146104095780634f1ef2861461041157806352d1902d1461042457600080fd5b806326f0aef71161020e57806326f0aef71461033457806334fcd5be146103545780633e1b0812146103745780633ed0101514610394578063445140b8146103b457600080fd5b806301ffc9a7146102565780630e316ab71461028b578063150b7a02146102ad5780631626ba7e146102e657806319822f7c1461030657600080fd5b3661025157005b600080fd5b34801561026257600080fd5b506102766102713660046128f4565b610805565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102ab6102a6366004612933565b610895565b005b3480156102b957600080fd5b506102cd6102c8366004612a05565b610ab9565b6040516001600160e01b03199091168152602001610282565b3480156102f257600080fd5b506102cd610301366004612ab8565b610ad4565b34801561031257600080fd5b50610326610321366004612b03565b610af3565b604051908152602001610282565b34801561034057600080fd5b506102ab61034f366004612b6e565b610b5b565b34801561036057600080fd5b506102ab61036f366004612bee565b610bb0565b34801561038057600080fd5b5061032661038f366004612c2f565b610c15565b3480156103a057600080fd5b506102ab6103af366004612c58565b610caf565b3480156103c057600080fd5b506102766103cf366004612c92565b610d87565b3480156103e057600080fd5b50610326601e81565b3480156103f557600080fd5b506102ab610404366004612c58565b610e14565b6102ab610eb7565b6102ab61041f366004612cab565b610f21565b34801561043057600080fd5b50610326610f33565b34801561044557600080fd5b506102ab610454366004612b6e565b610f50565b34801561046557600080fd5b506102ab610474366004612cfa565b610f99565b34801561048557600080fd5b506102ab610494366004612d53565b6110ae565b3480156104a557600080fd5b506102766104b4366004612c92565b611117565b3480156104c557600080fd5b506102ab6104d4366004612db1565b611167565b3480156104e557600080fd5b506102766104f4366004612933565b6001600160a01b031660009081526000805160206135ac833981519152602052604090205460ff1690565b34801561052b57600080fd5b506102ab61053a366004612e2d565b6112a1565b34801561054b57600080fd5b506102ab61055a366004612c58565b61137e565b34801561056b57600080fd5b50610574611421565b6040516102829190612e59565b34801561058d57600080fd5b5060008051602061358c83398151915254610326565b6102ab6105b1366004612cab565b610f29565b3480156105c257600080fd5b506105cb611494565b6040516001600160a01b039091168152602001610282565b3480156105ef57600080fd5b50610614604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102829190612ef6565b34801561062d57600080fd5b506105cb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561066157600080fd5b5061066a6114ba565b6040516001600160401b039091168152602001610282565b34801561068e57600080fd5b506102cd61069d366004612f88565b6114ed565b3480156106ae57600080fd5b50610326611509565b3480156106c357600080fd5b50610326611595565b3480156106d857600080fd5b506102ab6106e7366004612c92565b6115eb565b3480156106f857600080fd5b506102ab610707366004613035565b6116e1565b34801561071857600080fd5b506102ab61072736600461309d565b6117bf565b34801561073857600080fd5b507fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c0254610326565b34801561076c57600080fd5b506105cb7f000000000000000000000000000000000000000000000000000000000000000081565b3480156107a057600080fd5b506102ab6107af366004612933565b6119d5565b3480156107c057600080fd5b506102cd6107cf3660046130d6565b611b5b565b3480156107e057600080fd5b50610614604051806040016040528060058152602001640312e302e360dc1b81525081565b600061080f611b77565b6001600160e01b031982166326f0aef760e01b148061083e57506001600160e01b03198216630a85bd0160e11b145b8061085957506001600160e01b03198216630271189760e51b145b8061087457506001600160e01b031982166301ffc9a760e01b145b8061088f57506001600160e01b03198216630b135d3f60e11b145b92915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906108ce5750333014155b156108ec57604051630796d94560e01b815260040160405180910390fd5b6001600160a01b03811660009081526000805160206135ac833981519152602081905260409091205460ff166109355760405163da0357f760e01b815260040160405180910390fd5b60018101546002820154810361095e576040516361774dcf60e11b815260040160405180910390fd5b60005b61096c600183613154565b811015610a3657836001600160a01b031683600101828154811061099257610992613167565b6000918252602090912001546001600160a01b031603610a2e57826001016001836109bd9190613154565b815481106109cd576109cd613167565b6000918252602090912001546001840180546001600160a01b0390921691839081106109fb576109fb613167565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610a36565b600101610961565b5081600101805480610a4a57610a4a61317d565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038516808352908490526040808320805460ff191690555190917fb0073c14ccc2332b5b461c0d2fb94366f38d3954a82745e74827aa0811c9f98191a2505050565b6000610ac3611b77565b50630a85bd0160e11b949350505050565b6000610ade611b77565b610ae9848484611c1e565b90505b9392505050565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b3e57604051636b31ba1560e11b815260040160405180910390fd5b610b46611b77565b610b508484611dbd565b9050610aec82611e33565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ba457604051630692ce8160e21b815260040160405180910390fd5b610bad81611eca565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610be95750333014155b15610c0757604051630796d94560e01b815260040160405180910390fd5b610c118282611fd4565b5050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610c8b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088f9190613193565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610ce85750333014155b15610d0657604051630796d94560e01b815260040160405180910390fd5b604051633ed0101560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633ed0101590610d529084906004016132db565b600060405180830381600087803b158015610d6c57600080fd5b505af1158015610d80573d6000803e3d6000fd5b5050505050565b6040516316a0682960e11b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632d40d052906024015b602060405180830381865afa158015610df0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088f91906133b6565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610e4d5750333014155b15610e6b57604051630796d94560e01b815260040160405180910390fd5b604051634993404760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634993404790610d529084906004016132db565b610ebf611b77565b60405163b760faf960e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b158015610d6c57600080fd5b610f29612036565b610c1182826120f3565b6000610f3d61210e565b506000805160206135cc83398151915290565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ba457604051636b31ba1560e11b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610fde5750825b90506000826001600160401b03166001148015610ffa5750303b155b905081158015611008575080155b156110265760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561105057845460ff60401b1916600160401b1785555b61105d8888886000612157565b83156110a457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2906020015b60405180910390a15b5050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110e75750333014155b1561110557604051630796d94560e01b815260040160405180910390fd5b61111184848484612157565b50505050565b604051635daa653960e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635daa653990602401610dd3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054869190600160401b900460ff16806111af575080546001600160401b03808416911610155b156111cd5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906112275750333014155b1561124557604051630796d94560e01b815260040160405180910390fd5b61125186868686612157565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906112da5750333014155b156112f857604051630796d94560e01b815260040160405180910390fd5b60405163040b850f60e31b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561136257600080fd5b505af1158015611376573d6000803e3d6000fd5b505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906113b75750333014155b156113d557604051630796d94560e01b815260040160405180910390fd5b604051637fade28760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637fade28790610d529084906004016132db565b606060006000805160206135ac8339815191526001810180546040805160208084028201810190925282815293945083018282801561148957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161146b575b505050505091505090565b60006114b56000805160206135cc833981519152546001600160a01b031690565b905090565b60006114b57ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00546001600160401b031690565b60006114f7611b77565b5063bc197c8160e01b95945050505050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a08231906024015b602060405180830381865afa158015611571573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b59190613193565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401611554565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906116245750333014155b1561164257604051630796d94560e01b815260040160405180910390fd5b806000036116635760405163aabd5a0960e01b815260040160405180910390fd5b60008051602061358c833981519152546000805160206135ac833981519152908211156116a35760405163aabd5a0960e01b815260040160405180910390fd5b600281018290556040518281527f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d039060200160405180910390a15050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480159061171a5750333014155b1561173857604051630796d94560e01b815260040160405180910390fd5b60405163385483d560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e1520f5490611788908690869086906004016133d3565b600060405180830381600087803b1580156117a257600080fd5b505af11580156117b6573d6000803e3d6000fd5b50505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906117f85750333014155b1561181657604051630796d94560e01b815260040160405180910390fd5b6001600160a01b038116158061183557506001600160a01b0381163b15155b1561185357604051634501a91960e01b815260040160405180910390fd5b6001600160a01b03821660009081526000805160206135ac833981519152602081905260409091205460ff1661189c5760405163da0357f760e01b815260040160405180910390fd5b6001600160a01b03821660009081526020829052604090205460ff16156118d657604051631985f4ab60e31b815260040160405180910390fd5b600181015460005b8181101561197057846001600160a01b031683600101828154811061190557611905613167565b6000918252602090912001546001600160a01b031603611968578383600101828154811061193557611935613167565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550611970565b6001016118de565b506001600160a01b03808516600081815260208590526040808220805460ff199081169091559387168083528183208054909516600117909455517f53a7b6f060162826746b07f3ff5cc66b83afad3bc9a57c9f34d7802901c6e8299190a350505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590611a0e5750333014155b15611a2c57604051630796d94560e01b815260040160405180910390fd5b6001600160a01b0381161580611a4b57506001600160a01b0381163b15155b15611a6957604051634501a91960e01b815260040160405180910390fd5b60008051602061358c833981519152546000805160206135ac83398151915290601d1901611aaa57604051630dc92ed360e11b815260040160405180910390fd5b6001600160a01b03821660009081526020829052604090205460ff1615611ae457604051631985f4ab60e31b815260040160405180910390fd5b6001818101805480830182556000918252602080832090910180546001600160a01b0319166001600160a01b038716908117909155808352908490526040808320805460ff191690941790935591517f82b74755d483f0688b80354268454667c377a5684e64a4dbb6820fc11a6276d49190a25050565b6000611b65611b77565b5063f23a6e6160e01b95945050505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611bfe57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611bf26000805160206135cc833981519152546001600160a01b031690565b6001600160a01b031614155b15611c1c5760405163703e46dd60e11b815260040160405180910390fd5b565b7fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c02546000906000805160206135ac83398151915290611c5f9060419061343d565b8314611c7657506001600160e01b03199050610aec565b6000611c83604185613454565b600283015490915060008080805b85811015611da55760008a8a611ca860418561343d565b906041611cb6866001613476565b611cc0919061343d565b92611ccd93929190613489565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929350611d1192508e91508390506123d5565b9350846001600160a01b0316846001600160a01b0316111580611d4d57506001600160a01b03841660009081526020899052604090205460ff16155b15611d6b57506001600160e01b03199750610aec9650505050505050565b82611d75816134b3565b935050858310611d975750630b135d3f60e11b9750610aec9650505050505050565b509192508291600101611c91565b506001600160e01b03199a9950505050505050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c829052603c81208190611e0590611e006101008701876134cc565b611c1e565b90506374eca2c160e11b6001600160e01b0319821601611e2957600091505061088f565b5060019392505050565b8015610bad57604051600090339060001990849084818181858888f193505050503d8060008114611e80576040519150601f19603f3d011682016040523d82523d6000602084013e611e85565b606091505b505060408051848152821515602082015291925033917fa427c7d47f24d01b170779a7600b1d4c0d7cdbabaa0f19c4f0e6182053ffc931910160405180910390a25050565b600080611eda6020840184612933565b6001600160a01b03166020840135611ef560408601866134cc565b604051611f03929190613512565b60006040518083038185875af1925050503d8060008114611f40576040519150601f19603f3d011682016040523d82523d6000602084013e611f45565b606091505b509092509050611f586020840184612933565b6001600160a01b03167f74b56487625d598ffbf59a76c3b58fc1922f54afc86a075bad0c2a8aa05d2ad284602001358484604051611f9893929190613522565b60405180910390a281611fcf578051600003611fc75760405163764bbf1760e01b815260040160405180910390fd5b805181602001fd5b505050565b806000819003611ff757604051635fc74f2160e11b815260040160405180910390fd5b60005b818110156111115761202e84848381811061201757612017613167565b90506020028101906120299190613543565b611eca565b600101611ffa565b60008051602061358c833981519152546000805160206135ac8339815191529060005b818110156120b05782600001600084600101838154811061207c5761207c613167565b60009182526020808320909101546001600160a01b031683528201929092526040019020805460ff19169055600101612059565b506120bf6001830160006128c2565b6000600283018190556040517feb09d532980c3cc73dcad99b80e264204a667a54cbb7b63ec8d68dcb1c7096be9190a15050565b6120fb611b77565b612104826123ff565b610c118282612456565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c1c5760405163703e46dd60e11b815260040160405180910390fd5b60008051602061358c8339815191525483906000805160206135ac8339815191529060008461218f5761218a8285613476565b612191565b835b905085158061219f57508086115b156121bd5760405163aabd5a0960e01b815260040160405180910390fd5b601e8111156121df57604051630dc92ed360e11b815260040160405180910390fd5b84156122735760005b8281101561226457600084600101828154811061220757612207613167565b60009182526020808320909101546001600160a01b0316808352908790526040808320805460ff191690555190925082917fb0073c14ccc2332b5b461c0d2fb94366f38d3954a82745e74827aa0811c9f98191a2506001016121e8565b506122736001840160006128c2565b60005b8481101561239d57600089898381811061229257612292613167565b90506020020160208101906122a79190612933565b6001600160a01b03811660009081526020879052604090205490915060ff16156122e457604051631985f4ab60e31b815260040160405180910390fd5b6001600160a01b038116158061230357506001600160a01b0381163b15155b1561232157604051634501a91960e01b815260040160405180910390fd5b6001858101805480830182556000918252602080832090910180546001600160a01b0319166001600160a01b038616908117909155808352908890526040808320805460ff191690941790935591517f82b74755d483f0688b80354268454667c377a5684e64a4dbb6820fc11a6276d49190a250600101612276565b50600283018690556040518681527f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d039060200161109b565b6000806000806123e58686612518565b9250925092506123f58282612565565b5090949350505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906124385750333014155b15610bad57604051630796d94560e01b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156124b0575060408051601f3d908101601f191682019092526124ad91810190613193565b60015b6124dd57604051634c9c8ce360e01b81526001600160a01b03831660048201526024015b60405180910390fd5b6000805160206135cc833981519152811461250e57604051632a87526960e21b8152600481018290526024016124d4565b611fcf838361261e565b600080600083516041036125525760208401516040850151606086015160001a61254488828585612674565b95509550955050505061255e565b50508151600091506002905b9250925092565b600082600381111561257957612579613563565b03612582575050565b600182600381111561259657612596613563565b036125b45760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156125c8576125c8613563565b036125e95760405163fce698f760e01b8152600481018290526024016124d4565b60038260038111156125fd576125fd613563565b03610c11576040516335e2f38360e21b8152600481018290526024016124d4565b61262782612743565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561266c57611fcf82826127a8565b610c1161281e565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156126af5750600091506003905082612739565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612703573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661272f57506000925060019150829050612739565b9250600091508190505b9450945094915050565b806001600160a01b03163b60000361277957604051634c9c8ce360e01b81526001600160a01b03821660048201526024016124d4565b6000805160206135cc83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516127c59190613579565b600060405180830381855af49150503d8060008114612800576040519150601f19603f3d011682016040523d82523d6000602084013e612805565b606091505b509150915061281585838361283d565b95945050505050565b3415611c1c5760405163b398979f60e01b815260040160405180910390fd5b6060826128525761284d82612899565b610aec565b815115801561286957506001600160a01b0384163b155b1561289257604051639996b31560e01b81526001600160a01b03851660048201526024016124d4565b5080610aec565b8051156128a95780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825590600052602060002090810190610bad91905b808211156128f057600081556001016128dc565b5090565b60006020828403121561290657600080fd5b81356001600160e01b031981168114610aec57600080fd5b6001600160a01b0381168114610bad57600080fd5b60006020828403121561294557600080fd5b8135610aec8161291e565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561298e5761298e612950565b604052919050565b600082601f8301126129a757600080fd5b81356001600160401b038111156129c0576129c0612950565b6129d3601f8201601f1916602001612966565b8181528460208386010111156129e857600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215612a1b57600080fd5b8435612a268161291e565b93506020850135612a368161291e565b92506040850135915060608501356001600160401b03811115612a5857600080fd5b612a6487828801612996565b91505092959194509250565b60008083601f840112612a8257600080fd5b5081356001600160401b03811115612a9957600080fd5b602083019150836020828501011115612ab157600080fd5b9250929050565b600080600060408486031215612acd57600080fd5b8335925060208401356001600160401b03811115612aea57600080fd5b612af686828701612a70565b9497909650939450505050565b600080600060608486031215612b1857600080fd5b83356001600160401b03811115612b2e57600080fd5b84016101208187031215612b4157600080fd5b95602085013595506040909401359392505050565b600060608284031215612b6857600080fd5b50919050565b600060208284031215612b8057600080fd5b81356001600160401b03811115612b9657600080fd5b612ba284828501612b56565b949350505050565b60008083601f840112612bbc57600080fd5b5081356001600160401b03811115612bd357600080fd5b6020830191508360208260051b8501011115612ab157600080fd5b60008060208385031215612c0157600080fd5b82356001600160401b03811115612c1757600080fd5b612c2385828601612baa565b90969095509350505050565b600060208284031215612c4157600080fd5b81356001600160c01b0381168114610aec57600080fd5b600060208284031215612c6a57600080fd5b81356001600160401b03811115612c8057600080fd5b820160c08185031215610aec57600080fd5b600060208284031215612ca457600080fd5b5035919050565b60008060408385031215612cbe57600080fd5b8235612cc98161291e565b915060208301356001600160401b03811115612ce457600080fd5b612cf085828601612996565b9150509250929050565b600080600060408486031215612d0f57600080fd5b83356001600160401b03811115612d2557600080fd5b612d3186828701612baa565b909790965060209590950135949350505050565b8015158114610bad57600080fd5b60008060008060608587031215612d6957600080fd5b84356001600160401b03811115612d7f57600080fd5b612d8b87828801612baa565b909550935050602085013591506040850135612da681612d45565b939692955090935050565b600080600080600060808688031215612dc957600080fd5b85356001600160401b038082168214612de157600080fd5b90955060208701359080821115612df757600080fd5b50612e0488828901612baa565b909550935050604086013591506060860135612e1f81612d45565b809150509295509295909350565b60008060408385031215612e4057600080fd5b8235612e4b8161291e565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b81811015612e9a5783516001600160a01b031683529284019291840191600101612e75565b50909695505050505050565b60005b83811015612ec1578181015183820152602001612ea9565b50506000910152565b60008151808452612ee2816020860160208601612ea6565b601f01601f19169290920160200192915050565b602081526000610aec6020830184612eca565b600082601f830112612f1a57600080fd5b813560206001600160401b03821115612f3557612f35612950565b8160051b612f44828201612966565b9283528481018201928281019087851115612f5e57600080fd5b83870192505b84831015612f7d57823582529183019190830190612f64565b979650505050505050565b600080600080600060a08688031215612fa057600080fd5b8535612fab8161291e565b94506020860135612fbb8161291e565b935060408601356001600160401b0380821115612fd757600080fd5b612fe389838a01612f09565b94506060880135915080821115612ff957600080fd5b61300589838a01612f09565b9350608088013591508082111561301b57600080fd5b5061302888828901612996565b9150509295509295909350565b60008060006040848603121561304a57600080fd5b83356001600160401b038082111561306157600080fd5b61306d87838801612a70565b9095509350602086013591508082111561308657600080fd5b5061309386828701612b56565b9150509250925092565b600080604083850312156130b057600080fd5b82356130bb8161291e565b915060208301356130cb8161291e565b809150509250929050565b600080600080600060a086880312156130ee57600080fd5b85356130f98161291e565b945060208601356131098161291e565b9350604086013592506060860135915060808601356001600160401b0381111561313257600080fd5b61302888828901612996565b634e487b7160e01b600052601160045260246000fd5b8181038181111561088f5761088f61313e565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6000602082840312156131a557600080fd5b5051919050565b6000808335601e198436030181126131c357600080fd5b83016020810192503590506001600160401b038111156131e257600080fd5b803603821315612ab157600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b888110156132cd57858403601f19018a52823536899003605e19018112613259578283fd5b8801606081356132688161291e565b6001600160a01b0316865261327f828801836131ac565b828989015261329183890182846131f1565b9250505060406132a3818401846131ac565b9350878303828901526132b78385836131f1565b9d89019d97505050938601935050600101613234565b509198975050505050505050565b60208152600082356132ec8161291e565b6001600160a01b039081166020848101919091528401359061330d8261291e565b80821660408501525050604083013560608301526060830135601e1984360301811261333857600080fd5b83016020810190356001600160401b0381111561335457600080fd5b8060051b360382131561336657600080fd5b60c0608085015261337b60e08501828461321a565b915050608084013560a084015261339560a08501856131ac565b848303601f190160c08601526133ac8382846131f1565b9695505050505050565b6000602082840312156133c857600080fd5b8151610aec81612d45565b6040815260006133e76040830185876131f1565b828103602084015283356133fa8161291e565b6001600160a01b031681526020848101359082015261341c60408501856131ac565b606060408401526134316060840182846131f1565b98975050505050505050565b808202811582820484141761088f5761088f61313e565b60008261347157634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561088f5761088f61313e565b6000808585111561349957600080fd5b838611156134a657600080fd5b5050820193919092039150565b6000600182016134c5576134c561313e565b5060010190565b6000808335601e198436030181126134e357600080fd5b8301803591506001600160401b038211156134fd57600080fd5b602001915036819003821315612ab157600080fd5b8183823760009101908152919050565b83815282151560208201526060604082015260006128156060830184612eca565b60008235605e1983360301811261355957600080fd5b9190910192915050565b634e487b7160e01b600052602160045260246000fd5b60008251613559818460208701612ea656feb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c01b005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212207f3a1345dd207b3e6a7d8045651ded34698ad5d76b8ff402fdacf6337782f2f664736f6c63430008170033000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d780000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x1", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x52f172baddfaafd435471660a66251136db08eb325518538c60a8dcb5b86c7d0", + "transactionType": "CREATE2", + "contractName": "HybridDeleGator", + "contractAddress": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "function": null, + "arguments": [ + "0xbe4138886cB096bDC1B930F2f0ca7892AA234D78", + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x62d183", + "value": "0x0", + "input": "0x44656c654761746f72000000000000000000000000000000000000000000000060e0604052306080523480156200001557600080fd5b50604051620051483803806200514883398101604081905262000038916200018b565b818162000044620000c1565b6001600160a01b0380831660a081905290821660c0526040517fb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d90600090a26040516001600160a01b038216907fee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a9990600090a250505050620001ca565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620001125760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001725780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b03811681146200017257600080fd5b600080604083850312156200019f57600080fd5b8251620001ac8162000175565b6020840151909250620001bf8162000175565b809150509250929050565b60805160a05160c051614e83620002c5600039600081816105e9015281816107f3015281816108a1015281816109c501528181610a4601528181610ac401528181610c2901528181610cde01528181610d6501528181610dfe01528181610eea01528181610fa50152818161101701528181611082015281816112c401528181611343015281816113c00152818161147f015281816116c4015281816117b501526124480152600081816107290152818161090701528181610b2701528181610baa01528181610c8c01528181610dbc015281816110e50152611727015260008181611a9b01528181611ac401526120b50152614e836000f3fe60806040526004361061023f5760003560e01c80637f07bfdc1161012e578063c399ec88116100ab578063e1520f541161006f578063e1520f54146106f7578063ea4d3c9b14610717578063f23a6e611461074b578063f2fde38b1461076b578063ffa1ad741461078b57600080fd5b8063c399ec8814610658578063c8561e731461066d578063d087d2881461068d578063d37aec92146106a2578063d5d33b55146106d757600080fd5b8063aaf10f42116100f2578063aaf10f4214610584578063ad3cb1cc14610599578063b0d691fe146105d7578063b3c650151461060b578063bc197c811461063857600080fd5b80637f07bfdc146104d25780637fade287146104f25780638da5cb5b146105125780638ebf953314610551578063a24c8f321461057157600080fd5b80633ed01015116101bc57806352d1902d1161018057806352d1902d146104485780635c1c6dcd1461045d5780636af1f3991461047d578063715018a61461049d57806378a68ecf146104b257600080fd5b80633ed01015146103cd578063445140b8146103ed578063499340471461040d5780634a58db191461042d5780634f1ef2861461043557600080fd5b80631c03010a116102035780631c03010a1461032957806326f0aef71461034b5780632ffeaad61461036b57806334fcd5be1461038d5780633e1b0812146103ad57600080fd5b806301ffc9a71461024b578063074feff314610280578063150b7a02146102a25780631626ba7e146102db57806319822f7c146102fb57600080fd5b3661024657005b600080fd5b34801561025757600080fd5b5061026b610266366004613e92565b6107bc565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102a061029b366004613f27565b6107e8565b005b3480156102ae57600080fd5b506102c26102bd366004614096565b610859565b6040516001600160e01b03199091168152602001610277565b3480156102e757600080fd5b506102c26102f6366004614142565b610875565b34801561030757600080fd5b5061031b61031636600461418d565b610894565b604051908152602001610277565b34801561033557600080fd5b50600080516020614dae8339815191525461031b565b34801561035757600080fd5b506102a06103663660046141f8565b6108fc565b34801561037757600080fd5b50610380610951565b604051610277919061422c565b34801561039957600080fd5b506102a06103a8366004614264565b6109ba565b3480156103b957600080fd5b5061031b6103c83660046142a5565b610a1f565b3480156103d957600080fd5b506102a06103e83660046142ce565b610ab9565b3480156103f957600080fd5b5061026b610408366004614308565b610b91565b34801561041957600080fd5b506102a06104283660046142ce565b610c1e565b6102a0610cc1565b6102a0610443366004614321565b610d2b565b34801561045457600080fd5b5061031b610d3d565b34801561046957600080fd5b506102a06104783660046141f8565b610d5a565b34801561048957600080fd5b5061026b610498366004614308565b610da3565b3480156104a957600080fd5b506102a0610df3565b3480156104be57600080fd5b506102a06104cd366004614389565b610e56565b3480156104de57600080fd5b506102a06104ed36600461445b565b610f9a565b3480156104fe57600080fd5b506102a061050d3660046142ce565b611077565b34801561051e57600080fd5b50600080516020614d8e833981519152546001600160a01b03165b6040516001600160a01b039091168152602001610277565b34801561055d57600080fd5b506102a061056c366004613f27565b61111a565b6102a061057f366004614321565b610d33565b34801561059057600080fd5b50610539611236565b3480156105a557600080fd5b506105ca604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161027791906144d7565b3480156105e357600080fd5b506105397f000000000000000000000000000000000000000000000000000000000000000081565b34801561061757600080fd5b5061062061125c565b6040516001600160401b039091168152602001610277565b34801561064457600080fd5b506102c2610653366004614569565b61128f565b34801561066457600080fd5b5061031b6112ac565b34801561067957600080fd5b506102a0610688366004614616565b611338565b34801561069957600080fd5b5061031b6113a1565b3480156106ae57600080fd5b506106c26106bd366004614666565b6113f7565b60408051928352602083019190915201610277565b3480156106e357600080fd5b506102a06106f2366004614666565b611474565b34801561070357600080fd5b506102a061071236600461469b565b6116b9565b34801561072357600080fd5b506105397f000000000000000000000000000000000000000000000000000000000000000081565b34801561075757600080fd5b506102c2610766366004614703565b61178e565b34801561077757600080fd5b506102a061078636600461476b565b6117aa565b34801561079757600080fd5b506105ca604051806040016040528060058152602001640312e302e360dc1b81525081565b60006107c78261180a565b806107e257506001600160e01b031982166307f5828d60e41b145b92915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906108215750333014155b1561083f57604051630796d94560e01b815260040160405180910390fd5b61085087878787878787600161189a565b50505050505050565b6000610863611a90565b50630a85bd0160e11b5b949350505050565b600061087f611a90565b61088a848484611b35565b90505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108df57604051636b31ba1560e11b815260040160405180910390fd5b6108e7611a90565b6108f18484611d59565b905061088d82611dcf565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094557604051630692ce8160e21b815260040160405180910390fd5b61094e81611e66565b50565b60606000600080516020614d8e833981519152600281018054604080516020808402820181019092528281529394508301828280156109af57602002820191906000526020600020905b81548152602001906001019080831161099b575b505050505091505090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906109f35750333014155b15610a1157604051630796d94560e01b815260040160405180910390fd5b610a1b8282611f70565b5050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610a95573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e29190614788565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610af25750333014155b15610b1057604051630796d94560e01b815260040160405180910390fd5b604051633ed0101560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633ed0101590610b5c9084906004016148d0565b600060405180830381600087803b158015610b7657600080fd5b505af1158015610b8a573d6000803e3d6000fd5b5050505050565b6040516316a0682960e11b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632d40d052906024015b602060405180830381865afa158015610bfa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e291906149ac565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610c575750333014155b15610c7557604051630796d94560e01b815260040160405180910390fd5b604051634993404760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634993404790610b5c9084906004016148d0565b610cc9611a90565b60405163b760faf960e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b158015610b7657600080fd5b610d33611fd2565b610a1b828261208f565b6000610d476120aa565b50600080516020614dee83398151915290565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094557604051636b31ba1560e11b815260040160405180910390fd5b604051635daa653960e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635daa653990602401610bdd565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610e2c5750333014155b15610e4a57604051630796d94560e01b815260040160405180910390fd5b610e5460006120f3565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460ff8b81169291600160401b90041680610ea0575080546001600160401b03808416911610155b15610ebe5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610f185750333014155b15610f3657604051630796d94560e01b815260040160405180910390fd5b610f468a8a8a8a8a8a8a8a61189a565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15050505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610fd35750333014155b15610ff157604051630796d94560e01b815260040160405180910390fd5b60405163040b850f60e31b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561105b57600080fd5b505af115801561106f573d6000803e3d6000fd5b505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110b05750333014155b156110ce57604051630796d94560e01b815260040160405180910390fd5b604051637fade28760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637fade28790610b5c9084906004016148d0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b031660008115801561115f5750825b90506000826001600160401b0316600114801561117b5750303b155b905081158015611189575080155b156111a75760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156111d157845460ff60401b1916600160401b1785555b6111e28c8c8c8c8c8c8c600061189a565b831561122857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b6000611257600080516020614dee833981519152546001600160a01b031690565b905090565b60006112577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00546001600160401b031690565b6000611299611a90565b5063bc197c8160e01b5b95945050505050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a08231906024015b602060405180830381865afa158015611314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112579190614788565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906113715750333014155b1561138f57604051630796d94560e01b815260040160405180910390fd5b61139b84848484612195565b50505050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a906044016112f7565b60008080600080516020614d8e8339815191529050600081600101600087876040516020016114279291906149c9565b60408051601f198184030181529181528151602092830120835282820193909352908201600020825180840190935280548084526001909101549290910182905297909650945050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906114ad5750333014155b156114cb57604051630796d94560e01b815260040160405180910390fd5b604051600080516020614d8e833981519152906000906114f190859085906020016149c9565b60408051601f19818403018152828252805160209182012060008181526001808801845290849020858501909452835480865293015491840182905293508115801561153b575080155b1561156157604051631a36430d60e31b8152600481018590526024015b60405180910390fd5b600285015460018114801561157e575085546001600160a01b0316155b1561159c5760405163c4c8547360e01b815260040160405180910390fd5b60005b6115aa6001836149ef565b81101561162f57858760020182815481106115c7576115c7614a02565b90600052602060002001540361162757600287016115e66001846149ef565b815481106115f6576115f6614a02565b906000526020600020015487600201828154811061161657611616614a02565b60009182526020909120015561162f565b60010161159f565b508560020180548061164357611643614a18565b60008281526020808220830160001990810183905590920190925586825260018881018252604080842084815590910192909255815185815290810184905286917facf0e8088062f44f734bbcb5223794fd8bb6f6db1c199cb6a72df119d002a71b910160405180910390a25050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906116f25750333014155b1561171057604051630796d94560e01b815260040160405180910390fd5b60405163385483d560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e1520f549061176090869086908690600401614a2e565b600060405180830381600087803b15801561177a57600080fd5b505af1158015610850573d6000803e3d6000fd5b6000611798611a90565b5063f23a6e6160e01b95945050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906117e35750333014155b1561180157604051630796d94560e01b815260040160405180910390fd5b61094e816120f3565b6000611814611a90565b6001600160e01b031982166326f0aef760e01b148061184357506001600160e01b03198216630a85bd0160e11b145b8061185e57506001600160e01b03198216630271189760e51b145b8061187957506001600160e01b031982166301ffc9a760e01b145b806107e2575050630b135d3f60e11b6001600160e01b03198216145b919050565b856001600160a01b0389161580156118b0575080155b80156118b95750815b156118d7576040516312da594d60e11b815260040160405180910390fd5b80851415806118e65750808314155b156119155760405163a297991b60e01b8152600481018290526024810186905260448101849052606401611558565b8115611a0a57600080516020614dae83398151915254600080516020614d8e833981519152908015611a075760005b818110156119f857600083600201828154811061196357611963614a02565b6000918252602080832090910154808352600180880180845260408086208151808301835281548152938101805485880190815286895293909652869055949093558051925193519194509284927facf0e8088062f44f734bbcb5223794fd8bb6f6db1c199cb6a72df119d002a71b926119e69290918252602082015260400190565b60405180910390a25050600101611944565b50611a07600283016000613e60565b50505b60005b81811015611a7b57611a73898983818110611a2a57611a2a614a02565b9050602002810190611a3c9190614a8c565b898985818110611a4e57611a4e614a02565b90506020020135888886818110611a6757611a67614a02565b90506020020135612195565b600101611a0d565b50611a85896120f3565b505050505050505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611b1757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611b0b600080516020614dee833981519152546001600160a01b031690565b6001600160a01b031614155b15610e545760405163703e46dd60e11b815260040160405180910390fd5b6000816041819003611bd257600080516020614d8e833981519152546001600160a01b03166001600160a01b0316611ba38686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061231292505050565b6001600160a01b031603611bc15750630b135d3f60e11b905061088d565b506001600160e01b0319905061088d565b6060811015611bec57506001600160e01b0319905061088d565b600080516020614d8e8339815191526000611c0a6020828789614ad2565b611c1391614afc565b600081815260018085016020908152604092839020835180850190945280548085529201549083015291925090158015611c4f57506020810151155b15611c6957506001600160e01b0319935061088d92505050565b836060148015611cbd5750611cbd8888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505085516020870151909250905061233c565b15611cd65750630b135d3f60e11b935061088d92505050565b83606014158015611d2b5750611d2b8888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508551602087015190925090506123da565b15611d445750630b135d3f60e11b935061088d92505050565b506001600160e01b0319935061088d92505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c829052603c81208190611da190611d9c610100870187614a8c565b611b35565b90506374eca2c160e11b6001600160e01b0319821601611dc55760009150506107e2565b5060019392505050565b801561094e57604051600090339060001990849084818181858888f193505050503d8060008114611e1c576040519150601f19603f3d011682016040523d82523d6000602084013e611e21565b606091505b505060408051848152821515602082015291925033917fa427c7d47f24d01b170779a7600b1d4c0d7cdbabaa0f19c4f0e6182053ffc931910160405180910390a25050565b600080611e76602084018461476b565b6001600160a01b03166020840135611e916040860186614a8c565b604051611e9f9291906149c9565b60006040518083038185875af1925050503d8060008114611edc576040519150601f19603f3d011682016040523d82523d6000602084013e611ee1565b606091505b509092509050611ef4602084018461476b565b6001600160a01b03167f74b56487625d598ffbf59a76c3b58fc1922f54afc86a075bad0c2a8aa05d2ad284602001358484604051611f3493929190614b1a565b60405180910390a281611f6b578051600003611f635760405163764bbf1760e01b815260040160405180910390fd5b805181602001fd5b505050565b806000819003611f9357604051635fc74f2160e11b815260040160405180910390fd5b60005b8181101561139b57611fca848483818110611fb357611fb3614a02565b9050602002810190611fc59190614b3b565b611e66565b600101611f96565b600080516020614dae83398151915254600080516020614d8e8339815191529060005b818110156120455782600101600084600201838154811061201857612018614a02565b60009182526020808320909101548352820192909252604001812081815560019081019190915501611ff5565b50612054600283016000613e60565b81546001600160a01b03191682556040517feb09d532980c3cc73dcad99b80e264204a667a54cbb7b63ec8d68dcb1c7096be90600090a15050565b612097611a90565b6120a08261243d565b610a1b8282612494565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e545760405163703e46dd60e11b815260040160405180910390fd5b600080516020614dae83398151915254600080516020614d8e8339815191529015801561212757506001600160a01b038216155b156121455760405163c4c8547360e01b815260040160405180910390fd5b80546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b61219f8282612551565b6121c6576040516313c3d61f60e01b81526004810183905260248101829052604401611558565b600084846040516020016121db9291906149c9565b6040516020818303038152906040528051906020012090508484905060000361221757604051637e25658160e11b815260040160405180910390fd5b60008181527fa2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694901602052604090208054600080516020614d8e83398151915291901515806122675750600181015415155b15612288576040516361db108160e01b815260048101849052602401611558565b604080518082018252868152602080820187815260008781526001808801845285822094518555915193820193909355600286018054918201815583529120018490555183907fd00539cb08a7c24166308150d64d603150c01baf89d3d3e4c6063d6db7c6983d90612301908a908a908a908a90614b5b565b60405180910390a250505050505050565b600080600080612322868661255d565b92509250925061233282826125aa565b5090949350505050565b600080600061234a86612663565b91509150600060028860405160200161236591815260200190565b60408051601f198184030181529082905261237f91614b82565b602060405180830381855afa15801561239c573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906123bf9190614788565b90506123ce8184848989612685565b98975050505050505050565b6000806123e685612793565b9050612433866040516020016123fe91815260200190565b60408051601f198184030181529181528301516060840151608085015160a086015160c0870151875160208901518c8c612811565b9695505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906124765750333014155b1561094e57604051630796d94560e01b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156124ee575060408051601f3d908101601f191682019092526124eb91810190614788565b60015b61251657604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611558565b600080516020614dee833981519152811461254757604051632a87526960e21b815260048101829052602401611558565b611f6b83836129b1565b600061088d8383612a07565b600080600083516041036125975760208401516040850151606086015160001a61258988828585612b01565b9550955095505050506125a3565b50508151600091506002905b9250925092565b60008260038111156125be576125be614b94565b036125c7575050565b60018260038111156125db576125db614b94565b036125f95760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561260d5761260d614b94565b0361262e5760405163fce698f760e01b815260048101829052602401611558565b600382600381111561264257612642614b94565b03610a1b576040516335e2f38360e21b815260048101829052602401611558565b6000808280602001905181019061267a9190614baa565b909590945092505050565b60006126a06002600080516020614dce833981519152614bd8565b8411156126af575060006112a3565b6040805160208101889052908101869052606081018590526080810184905260a0810183905260009060c00160405160208183030381529060405290506000806101006001600160a01b0316836040516127099190614b82565b600060405180830381855afa9150503d8060008114612744576040519150601f19603f3d011682016040523d82523d6000602084013e612749565b606091505b50915091508115612779578080602001905181019061276891906149ac565b1515600115151493505050506112a3565b6127868989898989612bd0565b9998505050505050505050565b6127d56040518060e001604052806000815260200160008152602001606081526020016000151581526020016060815260200160608152602001600081525090565b818060200190518101906127e99190614c3f565b60c089015260a088015260808701521515606086015260408501526020840152825250919050565b600060258a51108061284b57506128498a60208151811061283457612834614a02565b01602001516001600160f81b0319168a612cb3565b155b15612858575060006129a3565b6000886128648d612d19565b8960405160200161287793929190614cfe565b60408051601f198184030181528282019091526015825274113a3cb832911d113bb2b130baba34371733b2ba1160591b602083015291506128b981838a612f26565b6128c8576000925050506129a3565b60006002836040516128da9190614b82565b602060405180830381855afa1580156128f7573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061291a9190614788565b9050600060028e83604051602001612933929190614d41565b60408051601f198184030181529082905261294d91614b82565b602060405180830381855afa15801561296a573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061298d9190614788565b905061299c818a8a8a8a612685565b9450505050505b9a9950505050505050505050565b6129ba82612fd5565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156129ff57611f6b828261303a565b610a1b6130a7565b600082158015612a15575081155b80612a2d5750600160601b63ffffffff60c01b031983145b80612a455750600160601b63ffffffff60c01b031982145b15612a52575060006107e2565b6000600160601b63ffffffff60c01b031983840990506000600160601b63ffffffff60c01b0319807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc8709600160601b63ffffffff60c01b031987600160601b63ffffffff60c01b0319898a0909089050600160601b63ffffffff60c01b03197f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b820891909114949350505050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612b3c5750600091506003905082612bc6565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612b90573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612bbc57506000925060019150829050612bc6565b9250600091508190505b9450945094915050565b6000841580612bed5750600080516020614dce8339815191528510155b80612bf6575083155b80612c0f5750600080516020614dce8339815191528410155b15612c1c575060006112a3565b612c268383612a07565b612c32575060006112a3565b6000612c3d856130c6565b90506000600080516020614dce83398151915282890990506000600080516020614dce83398151915283890990506000612c7987878585613138565b9050600080516020614dce833981519152612ca28a600080516020614dce8339815191526149ef565b8208159a9950505050505050505050565b6000600160f81b83811614612cca575060006107e2565b818015612cdd5750600160fa1b83811614155b15612cea575060006107e2565b600160fb1b83811614612d1057600f60fc1b600160fc1b841601612d10575060006107e2565b50600192915050565b60606000612d2683613800565b90506000819050600060028251118015612d7157508160028351612d4a91906149ef565b81518110612d5a57612d5a614a02565b6020910101516001600160f81b031916603d60f81b145b15612d7e57506002612dc9565b60018251118015612dc057508160018351612d9991906149ef565b81518110612da957612da9614a02565b6020910101516001600160f81b031916603d60f81b145b15612dc9575060015b6000818351612dd891906149ef565b90506000816001600160401b03811115612df457612df4613fd3565b6040519080825280601f01601f191660200182016040528015612e1e576020820181803683370190505b50905060005b82811015612f1b57848181518110612e3e57612e3e614a02565b01602001516001600160f81b031916602b60f81b03612e8a57602d60f81b828281518110612e6e57612e6e614a02565b60200101906001600160f81b031916908160001a905350612f13565b848181518110612e9c57612e9c614a02565b01602001516001600160f81b031916602f60f81b03612ecc57605f60f81b828281518110612e6e57612e6e614a02565b848181518110612ede57612ede614a02565b602001015160f81c60f81b828281518110612efb57612efb614a02565b60200101906001600160f81b031916908160001a9053505b600101612e24565b509695505050505050565b825182516000918591859190845b82811015612fc65781612f478289614d63565b10612f5a5760009550505050505061088d565b83612f658289614d63565b81518110612f7557612f75614a02565b602001015160f81c60f81b6001600160f81b031916858281518110612f9c57612f9c614a02565b01602001516001600160f81b03191614612fbe5760009550505050505061088d565b600101612f34565b50600198975050505050505050565b806001600160a01b03163b60000361300b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611558565b600080516020614dee83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516130579190614b82565b600060405180830381855af49150503d8060008114613092576040519150601f19603f3d011682016040523d82523d6000602084013e613097565b606091505b50915091506112a3858383613826565b3415610e545760405163b398979f60e01b815260040160405180910390fd5b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f6080820152600080516020614dce83398151915260a082015260208160c0836005600019fa61313157600080fd5b5192915050565b600080808060ff81808815801561314d575087155b15613161576000965050505050505061086d565b6131ad7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d613882565b9092509050811580156131be575080155b156131ec57600080516020614dce83398151915288600080516020614dce833981519152038a089850600097505b600189841c16600189851c1660011b015b8061321f5760018403935060018a851c1660018a861c1660011b0190506131fd565b50600189841c16600189851c1660011b01955060018603613281577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603613290578a96508993505b6003860361329f578196508093505b60018303925060019550600194505b82600019111561378357600160601b63ffffffff60c01b031984600209600160601b63ffffffff60c01b0319818209600160601b63ffffffff60c01b0319818a09600160601b63ffffffff60c01b03198284099250600160601b63ffffffff60c01b031980600160601b63ffffffff60c01b03198b8d08600160601b63ffffffff60c01b03198c600160601b63ffffffff60c01b0319038e0809600309600160601b63ffffffff60c01b03198985099850600160601b63ffffffff60c01b03198a84099950600160601b63ffffffff60c01b031980836002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319838409089a50600160601b63ffffffff60c01b03198083600160601b63ffffffff60c01b0319038d0882099250600160601b63ffffffff60c01b031983600160601b63ffffffff60c01b03198a870908975060018d881c1660018d891c1660011b0190508061342b5787600160601b63ffffffff60c01b031903975050505050613778565b6001810361347a577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103613489578e93508d92505b60038103613498578593508492505b896134b157509198506001975087965094506137789050565b600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b03198b860908600160601b63ffffffff60c01b03198c600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b03198d88090893508061366a578361366a57600160601b63ffffffff60c01b0319896002600160601b0363ffffffff60c01b0319099450600160601b63ffffffff60c01b03198586099350600160601b63ffffffff60c01b0319848d099250600160601b63ffffffff60c01b03198486099450600160601b63ffffffff60c01b0319808c600160601b63ffffffff60c01b0319038e08600160601b63ffffffff60c01b03198d8f08099050600160601b63ffffffff60c01b0319816003099150600160601b63ffffffff60c01b03198a86099950600160601b63ffffffff60c01b03198b85099a50600160601b63ffffffff60c01b031980846002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319848509089b50600160601b63ffffffff60c01b0319808d600160601b63ffffffff60c01b031903850883099350600160601b63ffffffff60c01b0319808a8709850898505050505050613778565b600160601b63ffffffff60c01b03198485099150600160601b63ffffffff60c01b0319848309600160601b63ffffffff60c01b0319838d099b50600160601b63ffffffff60c01b0319818c099a50600160601b63ffffffff60c01b0319838e09600160601b63ffffffff60c01b031980826002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b031984600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b031987880908089350600160601b63ffffffff60c01b031980838d09600160601b63ffffffff60c01b031985600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b031903860809089a50505050809a50505050505b6001830392506132ae565b60405186606082015260208152602080820152602060408201526002600160601b0363ffffffff60c01b03196080820152600160601b63ffffffff60c01b031960a082015260208160c0836005600019fa6137dd57600080fd5b600160601b63ffffffff60c01b0319815189099c9b505050505050505050505050565b60606107e282604051806060016040528060408152602001614e0e604091396001613910565b60608261383b5761383682613a8f565b61088d565b815115801561385257506001600160a01b0384163b155b1561387b57604051639996b31560e01b81526001600160a01b0385166004820152602401611558565b508061088d565b600080808086613899578585935093505050613907565b846138ab578787935093505050613907565b85881480156138b957508487145b156138da576138cb8888600180613ab8565b929a50909850925090506138f4565b6138e988886001808a8a613c13565b929a50909850925090505b61390088888484613d97565b9350935050505b94509492505050565b60608351600003613930575060408051602081019091526000815261088d565b600082613961576003855160046139479190614d76565b613952906002614d63565b61395c9190614bd8565b613986565b6003855160026139719190614d63565b61397b9190614bd8565b613986906004614d76565b90506000816001600160401b038111156139a2576139a2613fd3565b6040519080825280601f01601f1916602001820160405280156139cc576020820181803683370190505b50905060018501602082018788518901602081018051600082525b82841015613a42576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f81168701518653506001850194506139e7565b905250508515613a8357600388510660018114613a665760028114613a7957613a81565b603d6001830353603d6002830353613a81565b603d60018303535b505b50909695505050505050565b805115613a9f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080600080600160601b63ffffffff60c01b0319876002099350600160601b63ffffffff60c01b03198485099150600160601b63ffffffff60c01b03198289099050600160601b63ffffffff60c01b03198285099250600160601b63ffffffff60c01b03198683099150600160601b63ffffffff60c01b031980600160601b63ffffffff60c01b0319888b08600160601b63ffffffff60c01b031989600160601b63ffffffff60c01b0319038c08096003099550600160601b63ffffffff60c01b031980826002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319888909089350600160601b63ffffffff60c01b03198085600160601b63ffffffff60c01b031903830887099750600160601b63ffffffff60c01b03198584099050600160601b63ffffffff60c01b031980888509600160601b63ffffffff60c01b03190389089250945094509450949050565b60008060008088600003613c3257508492508391506001905080613d8a565b600160601b63ffffffff60c01b0319988903988981898809089450600160601b63ffffffff60c01b03198a600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b03198a8909089550600160601b63ffffffff60c01b03198687099350600160601b63ffffffff60c01b03198685099250600160601b63ffffffff60c01b03198489099150600160601b63ffffffff60c01b03198388099050600160601b63ffffffff60c01b0319848b099750600160601b63ffffffff60c01b031980896002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b031985600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b0319898a0908089350600160601b63ffffffff60c01b031980848b09600160601b63ffffffff60c01b031987600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b0319038d08090892505b9650965096509692505050565b6000806000613da584613e04565b9050600160601b63ffffffff60c01b031981870991506000600160601b63ffffffff60c01b03198287099050600160601b63ffffffff60c01b03198182099150600160601b63ffffffff60c01b03198289099350505094509492505050565b600060405160208152602080820152602060408201528260608201526002600160601b0363ffffffff60c01b03196080820152600160601b63ffffffff60c01b031960a082015260208160c0836005600019fa61313157600080fd5b508054600082559060005260206000209081019061094e91905b80821115613e8e5760008155600101613e7a565b5090565b600060208284031215613ea457600080fd5b81356001600160e01b03198116811461088d57600080fd5b6001600160a01b038116811461094e57600080fd5b803561189581613ebc565b60008083601f840112613eee57600080fd5b5081356001600160401b03811115613f0557600080fd5b6020830191508360208260051b8501011115613f2057600080fd5b9250929050565b60008060008060008060006080888a031215613f4257600080fd5b8735613f4d81613ebc565b965060208801356001600160401b0380821115613f6957600080fd5b613f758b838c01613edc565b909850965060408a0135915080821115613f8e57600080fd5b613f9a8b838c01613edc565b909650945060608a0135915080821115613fb357600080fd5b50613fc08a828b01613edc565b989b979a50959850939692959293505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561401157614011613fd3565b604052919050565b60006001600160401b0382111561403257614032613fd3565b50601f01601f191660200190565b600082601f83011261405157600080fd5b813561406461405f82614019565b613fe9565b81815284602083860101111561407957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156140ac57600080fd5b84356140b781613ebc565b935060208501356140c781613ebc565b92506040850135915060608501356001600160401b038111156140e957600080fd5b6140f587828801614040565b91505092959194509250565b60008083601f84011261411357600080fd5b5081356001600160401b0381111561412a57600080fd5b602083019150836020828501011115613f2057600080fd5b60008060006040848603121561415757600080fd5b8335925060208401356001600160401b0381111561417457600080fd5b61418086828701614101565b9497909650939450505050565b6000806000606084860312156141a257600080fd5b83356001600160401b038111156141b857600080fd5b840161012081870312156141cb57600080fd5b95602085013595506040909401359392505050565b6000606082840312156141f257600080fd5b50919050565b60006020828403121561420a57600080fd5b81356001600160401b0381111561422057600080fd5b61086d848285016141e0565b6020808252825182820181905260009190848201906040850190845b81811015613a8357835183529284019291840191600101614248565b6000806020838503121561427757600080fd5b82356001600160401b0381111561428d57600080fd5b61429985828601613edc565b90969095509350505050565b6000602082840312156142b757600080fd5b81356001600160c01b038116811461088d57600080fd5b6000602082840312156142e057600080fd5b81356001600160401b038111156142f657600080fd5b820160c0818503121561088d57600080fd5b60006020828403121561431a57600080fd5b5035919050565b6000806040838503121561433457600080fd5b823561433f81613ebc565b915060208301356001600160401b0381111561435a57600080fd5b61436685828601614040565b9150509250929050565b801515811461094e57600080fd5b803561189581614370565b600080600080600080600080600060c08a8c0312156143a757600080fd5b893560ff811681146143b857600080fd5b98506143c660208b01613ed1565b975060408a01356001600160401b03808211156143e257600080fd5b6143ee8d838e01613edc565b909950975060608c013591508082111561440757600080fd5b6144138d838e01613edc565b909750955060808c013591508082111561442c57600080fd5b506144398c828d01613edc565b909450925061444c905060a08b0161437e565b90509295985092959850929598565b6000806040838503121561446e57600080fd5b823561447981613ebc565b946020939093013593505050565b60005b838110156144a257818101518382015260200161448a565b50506000910152565b600081518084526144c3816020860160208601614487565b601f01601f19169290920160200192915050565b60208152600061088d60208301846144ab565b600082601f8301126144fb57600080fd5b813560206001600160401b0382111561451657614516613fd3565b8160051b614525828201613fe9565b928352848101820192828101908785111561453f57600080fd5b83870192505b8483101561455e57823582529183019190830190614545565b979650505050505050565b600080600080600060a0868803121561458157600080fd5b853561458c81613ebc565b9450602086013561459c81613ebc565b935060408601356001600160401b03808211156145b857600080fd5b6145c489838a016144ea565b945060608801359150808211156145da57600080fd5b6145e689838a016144ea565b935060808801359150808211156145fc57600080fd5b5061460988828901614040565b9150509295509295909350565b6000806000806060858703121561462c57600080fd5b84356001600160401b0381111561464257600080fd5b61464e87828801614101565b90989097506020870135966040013595509350505050565b6000806020838503121561467957600080fd5b82356001600160401b0381111561468f57600080fd5b61429985828601614101565b6000806000604084860312156146b057600080fd5b83356001600160401b03808211156146c757600080fd5b6146d387838801614101565b909550935060208601359150808211156146ec57600080fd5b506146f9868287016141e0565b9150509250925092565b600080600080600060a0868803121561471b57600080fd5b853561472681613ebc565b9450602086013561473681613ebc565b9350604086013592506060860135915060808601356001600160401b0381111561475f57600080fd5b61460988828901614040565b60006020828403121561477d57600080fd5b813561088d81613ebc565b60006020828403121561479a57600080fd5b5051919050565b6000808335601e198436030181126147b857600080fd5b83016020810192503590506001600160401b038111156147d757600080fd5b803603821315613f2057600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b888110156148c257858403601f19018a52823536899003605e1901811261484e578283fd5b88016060813561485d81613ebc565b6001600160a01b03168652614874828801836147a1565b828989015261488683890182846147e6565b925050506040614898818401846147a1565b9350878303828901526148ac8385836147e6565b9d89019d97505050938601935050600101614829565b509198975050505050505050565b60208152600082356148e181613ebc565b6001600160a01b039081166020848101919091528401359061490282613ebc565b80821660408501525050604083013560608301526060830135601e1984360301811261492d57600080fd5b83016020810190356001600160401b0381111561494957600080fd5b8060051b360382131561495b57600080fd5b60c0608085015261497060e08501828461480f565b915050608084013560a084015261498a60a08501856147a1565b848303601f190160c08601526124338382846147e6565b805161189581614370565b6000602082840312156149be57600080fd5b815161088d81614370565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156107e2576107e26149d9565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b604081526000614a426040830185876147e6565b82810360208401528335614a5581613ebc565b6001600160a01b0316815260208481013590820152614a7760408501856147a1565b606060408401526123ce6060840182846147e6565b6000808335601e19843603018112614aa357600080fd5b8301803591506001600160401b03821115614abd57600080fd5b602001915036819003821315613f2057600080fd5b60008085851115614ae257600080fd5b83861115614aef57600080fd5b5050820193919092039150565b803560208310156107e257600019602084900360031b1b1692915050565b83815282151560208201526060604082015260006112a360608301846144ab565b60008235605e19833603018112614b5157600080fd5b9190910192915050565b606081526000614b6f6060830186886147e6565b6020830194909452506040015292915050565b60008251614b51818460208701614487565b634e487b7160e01b600052602160045260246000fd5b600080600060608486031215614bbf57600080fd5b8351925060208401519150604084015190509250925092565b600082614bf557634e487b7160e01b600052601260045260246000fd5b500490565b600082601f830112614c0b57600080fd5b8151614c1961405f82614019565b818152846020838601011115614c2e57600080fd5b61086d826020830160208701614487565b600080600080600080600080610100898b031215614c5c57600080fd5b88519750602089015196506040890151955060608901516001600160401b0380821115614c8857600080fd5b614c948c838d01614bfa565b9650614ca260808c016149a1565b955060a08b0151915080821115614cb857600080fd5b614cc48c838d01614bfa565b945060c08b0151915080821115614cda57600080fd5b50614ce78b828c01614bfa565b92505060e089015190509295985092959890939650565b60008451614d10818460208901614487565b845190830190614d24818360208901614487565b8451910190614d37818360208801614487565b0195945050505050565b60008351614d53818460208801614487565b9190910191825250602001919050565b808201808211156107e2576107e26149d9565b80820281158282048414176107e2576107e26149d956fea2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694900a2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694902ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212208ea6494b631dfbdfca458a1c0a52311f1cf61e8c8eacea1ff8b3b6e773897baa64736f6c63430008170033000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d780000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x2", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x1373945eb263363a9cbb20f7bb22d0e1566e80d0f1efdf967dd1601fbf49d48a", + "transactionType": "CREATE2", + "contractName": "AllowedCalldataEnforcer", + "contractAddress": "0x48db3835a873d64a4af2c09f014052407c003bd7", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x7ac98", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061059c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610085575b600080fd5b61005961005436600461035a565b61009d565b005b61006e61006936600461041d565b61020c565b60405161007c92919061045f565b60405180910390f35b61005961009336600461035a565b5050505050505050565b60006060806100ac8b8b61020c565b805191945092506100c060408901896104b6565b90506100cc82866104fd565b11156101375760405162461bcd60e51b815260206004820152602f60248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d60448201526e0c6c2d8d8c8c2e8c25ad8cadccee8d608b1b60648201526084015b60405180910390fd5b61014460408901896104b6565b859061015084836104fd565b9261015d9392919061051e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509294506101a192508491508590506102d9565b6101fe5760405162461bcd60e51b815260206004820152602860248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d60448201526763616c6c6461746160c01b606482015260840161012e565b505050505050505050505050565b6000606060218310156102745760405162461bcd60e51b815260206004820152602a60248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d6044820152697465726d732d73697a6560b01b606482015260840161012e565b61028260206000858761051e565b61028b91610548565b915061029a836020818761051e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250949792965091945050505050565b6000818051906020012083805190602001201490505b92915050565b60008083601f84011261030757600080fd5b50813567ffffffffffffffff81111561031f57600080fd5b60208301915083602082850101111561033757600080fd5b9250929050565b80356001600160a01b038116811461035557600080fd5b919050565b60008060008060008060008060c0898b03121561037657600080fd5b883567ffffffffffffffff8082111561038e57600080fd5b61039a8c838d016102f5565b909a50985060208b01359150808211156103b357600080fd5b6103bf8c838d016102f5565b909850965060408b01359150808211156103d857600080fd5b5089016060818c0312156103eb57600080fd5b93506060890135925061040060808a0161033e565b915061040e60a08a0161033e565b90509295985092959890939650565b6000806020838503121561043057600080fd5b823567ffffffffffffffff81111561044757600080fd5b610453858286016102f5565b90969095509350505050565b8281526000602060406020840152835180604085015260005b8181101561049457858101830151858201606001528201610478565b506000606082860101526060601f19601f830116850101925050509392505050565b6000808335601e198436030181126104cd57600080fd5b83018035915067ffffffffffffffff8211156104e857600080fd5b60200191503681900382131561033757600080fd5b808201808211156102ef57634e487b7160e01b600052601160045260246000fd5b6000808585111561052e57600080fd5b8386111561053b57600080fd5b5050820193919092039150565b803560208310156102ef57600019602084900360031b1b169291505056fea264697066735822122094149f339193c37892b2442e24526e5fff221c6592b2b7cd87732677fcc1c9c464736f6c63430008170033", + "nonce": "0x3", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x0dbcb18025fd09adc34be67d1eabfd42ec287227bf67c192e5dbf8d45616aa70", + "transactionType": "CREATE2", + "contractName": "AllowedMethodsEnforcer", + "contractAddress": "0xfd731951bf1c52afccee3e6f14ab656475b76dd4", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x8ba05", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610683806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610084575b600080fd5b6100596100543660046103a7565b61009c565b005b61006e61006936600461046a565b6101ff565b60405161007b91906104ac565b60405180910390f35b6100596100923660046103a7565b5050505050505050565b60046100ab60408601866104fa565b9050101561011a5760405162461bcd60e51b815260206004820152603160248201527f416c6c6f7765644d6574686f6473456e666f726365723a696e76616c69642d616044820152700c6e8d2dedc5ac8c2e8c25ad8cadccee8d607b1b60648201526084015b60405180910390fd5b600061012960408601866104fa565b61013891600491600091610541565b6101419161056b565b9050600061014f8a8a6101ff565b805190915060005b818110156101a4578281815181106101715761017161059b565b60200260200101516001600160e01b031916846001600160e01b0319160361019c5750505050610092565b600101610157565b5060405162461bcd60e51b815260206004820152602960248201527f416c6c6f7765644d6574686f6473456e666f726365723a6d6574686f642d6e6f6044820152681d0b585b1b1bddd95960ba1b6064820152608401610111565b606060008261020f6004826105c7565b156102705760405162461bcd60e51b815260206004820152602b60248201527f416c6c6f7765644d6574686f6473456e666f726365723a696e76616c69642d7460448201526a0cae4dae65ad8cadccee8d60ab1b6064820152608401610111565b61027b6004826105f1565b67ffffffffffffffff81111561029357610293610605565b6040519080825280602002602001820160405280156102bc578160200160208202803683370190505b50925060005b81811015610339578581866102d882600461061b565b926102e593929190610541565b6102ee9161056b565b8484815181106103005761030061059b565b6001600160e01b0319909216602092830291909101909101528261032381610634565b9350610332905060048261061b565b90506102c2565b50505092915050565b60008083601f84011261035457600080fd5b50813567ffffffffffffffff81111561036c57600080fd5b60208301915083602082850101111561038457600080fd5b9250929050565b80356001600160a01b03811681146103a257600080fd5b919050565b60008060008060008060008060c0898b0312156103c357600080fd5b883567ffffffffffffffff808211156103db57600080fd5b6103e78c838d01610342565b909a50985060208b013591508082111561040057600080fd5b61040c8c838d01610342565b909850965060408b013591508082111561042557600080fd5b5089016060818c03121561043857600080fd5b93506060890135925061044d60808a0161038b565b915061045b60a08a0161038b565b90509295985092959890939650565b6000806020838503121561047d57600080fd5b823567ffffffffffffffff81111561049457600080fd5b6104a085828601610342565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156104ee5783516001600160e01b031916835292840192918401916001016104c8565b50909695505050505050565b6000808335601e1984360301811261051157600080fd5b83018035915067ffffffffffffffff82111561052c57600080fd5b60200191503681900382131561038457600080fd5b6000808585111561055157600080fd5b8386111561055e57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156105935780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826105d6576105d66105b1565b500690565b634e487b7160e01b600052601160045260246000fd5b600082610600576106006105b1565b500490565b634e487b7160e01b600052604160045260246000fd5b8082018082111561062e5761062e6105db565b92915050565b600060018201610646576106466105db565b506001019056fea26469706673582212204ec9b63db8ffcc611dbc205c0eb5d3daa906537fc4f6d216704a61e004393bed64736f6c63430008170033", + "nonce": "0x4", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x5a44ca63602f2b2edf118cf04d8380548d4998075bc4280d3c40d6ba4166f43b", + "transactionType": "CREATE2", + "contractName": "AllowedTargetsEnforcer", + "contractAddress": "0xbc8673c0afa52d86d991c06881e55b2966920564", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x7f38f", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b506105d9806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610084575b600080fd5b61005961005436600461031e565b61009c565b005b61006e6100693660046103e1565b610174565b60405161007b9190610423565b60405180910390f35b61005961009236600461031e565b5050505050505050565b60006100ab6020860186610470565b905060006100b98a8a610174565b805190915060005b8181101561010c578281815181106100db576100db610492565b60200260200101516001600160a01b0316846001600160a01b0316036101045750505050610092565b6001016100c1565b5060405162461bcd60e51b815260206004820152603160248201527f416c6c6f77656454617267657473456e666f726365723a7461726765742d6164604482015270191c995cdccb5b9bdd0b585b1b1bddd959607a1b60648201526084015b60405180910390fd5b60606000826101846014826104be565b156101e55760405162461bcd60e51b815260206004820152602b60248201527f416c6c6f77656454617267657473456e666f726365723a696e76616c69642d7460448201526a0cae4dae65ad8cadccee8d60ab1b606482015260840161016b565b6101f06014826104e8565b67ffffffffffffffff811115610208576102086104fc565b604051908082528060200260200182016040528015610231578160200160208202803683370190505b50925060005b818110156102b05785818661024d826014610512565b9261025a9392919061052b565b61026391610555565b60601c84848151811061027857610278610492565b6001600160a01b03909216602092830291909101909101528261029a8161058a565b93506102a99050601482610512565b9050610237565b50505092915050565b60008083601f8401126102cb57600080fd5b50813567ffffffffffffffff8111156102e357600080fd5b6020830191508360208285010111156102fb57600080fd5b9250929050565b80356001600160a01b038116811461031957600080fd5b919050565b60008060008060008060008060c0898b03121561033a57600080fd5b883567ffffffffffffffff8082111561035257600080fd5b61035e8c838d016102b9565b909a50985060208b013591508082111561037757600080fd5b6103838c838d016102b9565b909850965060408b013591508082111561039c57600080fd5b5089016060818c0312156103af57600080fd5b9350606089013592506103c460808a01610302565b91506103d260a08a01610302565b90509295985092959890939650565b600080602083850312156103f457600080fd5b823567ffffffffffffffff81111561040b57600080fd5b610417858286016102b9565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156104645783516001600160a01b03168352928401929184019160010161043f565b50909695505050505050565b60006020828403121561048257600080fd5b61048b82610302565b9392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826104cd576104cd6104a8565b500690565b634e487b7160e01b600052601160045260246000fd5b6000826104f7576104f76104a8565b500490565b634e487b7160e01b600052604160045260246000fd5b80820180821115610525576105256104d2565b92915050565b6000808585111561053b57600080fd5b8386111561054857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156105825780818660140360031b1b83161692505b505092915050565b60006001820161059c5761059c6104d2565b506001019056fea26469706673582212204a2e5d298e85989e2cc1b01eb90837481124fb817e6ba907174cafb6c568768564736f6c63430008170033", + "nonce": "0x5", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x3a7688d22b76d24e94341e062470e1935524783a2a8a981873c6f2e917e6dfe3", + "transactionType": "CREATE2", + "contractName": "BlockNumberEnforcer", + "contractAddress": "0xc15faffa0d879b9263c15a46ce31eacfa2e0e8ae", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6942b", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061045b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610092575b600080fd5b6100596100543660046102bd565b6100aa565b005b61006e610069366004610380565b6101b6565b604080516001600160801b0393841681529290911660208301520160405180910390f35b6100596100a03660046102bd565b5050505050505050565b6000806100b78a8a6101b6565b90925090506001600160801b0382161561013457816001600160801b031643116101345760405162461bcd60e51b8152602060048201526024808201527f426c6f636b4e756d626572456e666f726365723a6561726c792d64656c6567616044820152633a34b7b760e11b60648201526084015b60405180910390fd5b6001600160801b038116156101aa57806001600160801b031643106101aa5760405162461bcd60e51b815260206004820152602660248201527f426c6f636b4e756d626572456e666f726365723a657870697265642d64656c6560448201526533b0ba34b7b760d11b606482015260840161012b565b50505050505050505050565b6000806020831461021a5760405162461bcd60e51b815260206004820152602860248201527f426c6f636b4e756d626572456e666f726365723a696e76616c69642d7465726d6044820152670e65ad8cadccee8d60c31b606482015260840161012b565b6102286010600085876103c2565b610231916103ec565b60801c915061024383601081876103c2565b61024c916103ec565b60801c90509250929050565b60008083601f84011261026a57600080fd5b50813567ffffffffffffffff81111561028257600080fd5b60208301915083602082850101111561029a57600080fd5b9250929050565b80356001600160a01b03811681146102b857600080fd5b919050565b60008060008060008060008060c0898b0312156102d957600080fd5b883567ffffffffffffffff808211156102f157600080fd5b6102fd8c838d01610258565b909a50985060208b013591508082111561031657600080fd5b6103228c838d01610258565b909850965060408b013591508082111561033b57600080fd5b5089016060818c03121561034e57600080fd5b93506060890135925061036360808a016102a1565b915061037160a08a016102a1565b90509295985092959890939650565b6000806020838503121561039357600080fd5b823567ffffffffffffffff8111156103aa57600080fd5b6103b685828601610258565b90969095509350505050565b600080858511156103d257600080fd5b838611156103df57600080fd5b5050820193919092039150565b6fffffffffffffffffffffffffffffffff19813581811691601085101561041d5780818660100360031b1b83161692505b50509291505056fea26469706673582212202f1df071a3b936ee3ad015758f36f43130359bf66ac06d4703490535de194a3864736f6c63430008170033", + "nonce": "0x6", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x4f52f460bc046f17ff3cd3c787cb5d8d9727d896f8fed5e1d642619c5de8164d", + "transactionType": "CREATE2", + "contractName": "DeployedEnforcer", + "contractAddress": "0x5accb9559b56a6c1e3f90e342c85c42d93720d43", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x8f463", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b506106b5806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063481286e6146100515780639751a83d14610081578063b99deb0e14610096578063de723eeb146100b8575b600080fd5b61006461005f366004610410565b6100d0565b6040516001600160a01b0390911681526020015b60405180910390f35b61009461008f366004610497565b6100e5565b005b6100a96100a436600461055a565b6101e4565b6040516100789392919061059c565b6100946100c6366004610497565b5050505050505050565b60006100dc82846102ca565b90505b92915050565b60008060006100f48b8b6101e4565b919450925090506001600160a01b0383163b1561014f576040516001600160a01b03841681527f641dafeb23238fae3ef71c64fced975da90c34dede63890507f3dda6b1e0dfef9060200160405180910390a15050506100c6565b600061015b82846102d7565b9050836001600160a01b0316816001600160a01b0316146101d65760405162461bcd60e51b815260206004820152602a60248201527f4465706c6f796564456e666f726365723a6465706c6f7965642d6164647265736044820152690e65adad2e6dac2e8c6d60b31b60648201526084015b60405180910390fd5b505050505050505050505050565b6000806060603484116102475760405162461bcd60e51b815260206004820152602560248201527f4465706c6f796564456e666f726365723a696e76616c69642d7465726d732d6c6044820152640cadccee8d60db1b60648201526084016101cd565b610255601460008688610602565b61025e9161062c565b60601c9250610271603460148688610602565b61027a91610661565b91506102898460348188610602565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509598949750919550929350505050565b60006100dc83833061035f565b60006102e560008385610389565b9050806001600160a01b03163b60000361031d576040516352c7cd4960e11b81526001600160a01b03821660048201526024016101cd565b6040516001600160a01b03821681527faf3c4b03f515b5a38f3c238fdc24abf10854a2f27f2a85743a71de17e9bc7e7f9060200160405180910390a192915050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6000834710156103b55760405163392efb2b60e21b8152476004820152602481018590526044016101cd565b81516000036103d757604051631328927760e21b815260040160405180910390fd5b8282516020840186f590506001600160a01b03811661040957604051633a0ba96160e11b815260040160405180910390fd5b9392505050565b6000806040838503121561042357600080fd5b50508035926020909101359150565b60008083601f84011261044457600080fd5b50813567ffffffffffffffff81111561045c57600080fd5b60208301915083602082850101111561047457600080fd5b9250929050565b80356001600160a01b038116811461049257600080fd5b919050565b60008060008060008060008060c0898b0312156104b357600080fd5b883567ffffffffffffffff808211156104cb57600080fd5b6104d78c838d01610432565b909a50985060208b01359150808211156104f057600080fd5b6104fc8c838d01610432565b909850965060408b013591508082111561051557600080fd5b5089016060818c03121561052857600080fd5b93506060890135925061053d60808a0161047b565b915061054b60a08a0161047b565b90509295985092959890939650565b6000806020838503121561056d57600080fd5b823567ffffffffffffffff81111561058457600080fd5b61059085828601610432565b90969095509350505050565b60018060a01b03841681526000602084602084015260606040840152835180606085015260005b818110156105df578581018301518582016080015282016105c3565b506000608082860101526080601f19601f83011685010192505050949350505050565b6000808585111561061257600080fd5b8386111561061f57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106595780818660140360031b1b83161692505b505092915050565b803560208310156100df57600019602084900360031b1b169291505056fea2646970667358221220adae6ada7a0e210e98db78555afd35a3b834fe39e89d1ae92e20b35e9cc9358664736f6c63430008170033", + "nonce": "0x7", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xd23cfaec24a485724502e8fd5f9057dfeac3313c12efda15af4c2134d1d5f354", + "transactionType": "CREATE2", + "contractName": "ERC20BalanceGteEnforcer", + "contractAddress": "0xb5d6b1ec6d868a3bae5b7f48178eaa2686a7a087", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xa3337", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061074a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806332a16f4e146100675780638678d6ef1461009f5780639751a83d146100c0578063b5e54492146100d5578063b99deb0e146100f5578063de723eeb14610127575b600080fd5b61008a61007536600461049d565b60016020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100b26100ad3660046104d2565b61013a565b604051908152602001610096565b6100d36100ce366004610557565b61014f565b005b6100b26100e336600461049d565b60006020819052908152604090205481565b61010861010336600461061a565b610289565b604080516001600160a01b039093168352602083019190915201610096565b6100d3610135366004610557565b61032f565b600061014784848461045a565b949350505050565b600061015b8989610289565b509050600061016b33838761045a565b60008181526001602052604090205490915060ff16156101e55760405162461bcd60e51b815260206004820152602a60248201527f455243323042616c616e6365477465456e666f726365723a656e666f726365726044820152690b5a5ccb5b1bd8dad95960b21b60648201526084015b60405180910390fd5b6000818152600160208190526040808320805460ff1916909217909155516370a0823160e01b81526001600160a01b0386811660048301528416906370a0823190602401602060405180830381865afa158015610246573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026a919061065c565b6000928352602083905260409092209190915550505050505050505050565b600080603483146102f15760405162461bcd60e51b815260206004820152602c60248201527f455243323042616c616e6365477465456e666f726365723a696e76616c69642d60448201526b0e8cae4dae65ad8cadccee8d60a31b60648201526084016101dc565b6102ff601460008587610675565b6103089161069f565b60601c915061031a8360148187610675565b610323916106d4565b60001c90509250929050565b60008061033c8a8a610289565b91509150600061034d33848861045a565b600081815260016020526040808220805460ff19169055516370a0823160e01b81526001600160a01b03888116600483015292935090918516906370a0823190602401602060405180830381865afa1580156103ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d1919061065c565b6000838152602081905260409020549091506103ee9084906106f3565b81101561044c5760405162461bcd60e51b815260206004820152602660248201527f455243323042616c616e6365477465456e666f726365723a62616c616e63652d6044820152651b9bdd0b59dd60d21b60648201526084016101dc565b505050505050505050505050565b604080516001600160a01b039485166020808301919091529390941684820152606080850192909252805180850390920182526080909301909252815191012090565b6000602082840312156104af57600080fd5b5035919050565b80356001600160a01b03811681146104cd57600080fd5b919050565b6000806000606084860312156104e757600080fd5b6104f0846104b6565b92506104fe602085016104b6565b9150604084013590509250925092565b60008083601f84011261052057600080fd5b50813567ffffffffffffffff81111561053857600080fd5b60208301915083602082850101111561055057600080fd5b9250929050565b60008060008060008060008060c0898b03121561057357600080fd5b883567ffffffffffffffff8082111561058b57600080fd5b6105978c838d0161050e565b909a50985060208b01359150808211156105b057600080fd5b6105bc8c838d0161050e565b909850965060408b01359150808211156105d557600080fd5b5089016060818c0312156105e857600080fd5b9350606089013592506105fd60808a016104b6565b915061060b60a08a016104b6565b90509295985092959890939650565b6000806020838503121561062d57600080fd5b823567ffffffffffffffff81111561064457600080fd5b6106508582860161050e565b90969095509350505050565b60006020828403121561066e57600080fd5b5051919050565b6000808585111561068557600080fd5b8386111561069257600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106cc5780818660140360031b1b83161692505b505092915050565b803560208310156106ed57600019602084900360031b1b165b92915050565b808201808211156106ed57634e487b7160e01b600052601160045260246000fdfea2646970667358221220706a4bd5217d105228b49e7ecb48d785e4c5a4cbd88c1e0018e40907dafc0c9d64736f6c63430008170033", + "nonce": "0x8", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x696480ac1eeb4b1f007e06e6d32c9adc877ccf2dde7484faa5092de7eecb423a", + "transactionType": "CREATE2", + "contractName": "ERC20TransferAmountEnforcer", + "contractAddress": "0x92ac423b9c111962179a6242e1adb58d02c103be", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x990f4", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061073b806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80639751a83d146100515780639dd5d9ab14610066578063b99deb0e146100a1578063de723eeb146100d3575b600080fd5b61006461005f366004610480565b6100eb565b005b61008e610074366004610543565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b6100b46100af36600461056d565b610383565b604080516001600160a01b039093168352602083019190915201610098565b6100646100e1366004610480565b5050505050505050565b6100f860408501856105af565b90506044146101565760405162461bcd60e51b815260206004820152603160248201526000805160206106e68339815191526044820152700d8d2c85ac2c6e8d2dedc5ad8cadccee8d607b1b60648201526084015b60405180910390fd5b6000806101638a8a610383565b9092509050600061017760208801886105f6565b905063a9059cbb60e01b6001600160a01b03848116908316146101df5760405162461bcd60e51b815260206004820152602c60248201526000805160206106e683398151915260448201526b1b1a590b58dbdb9d1c9858dd60a21b606482015260840161014d565b60006101ee60408a018a6105af565b6101fd91600491600091610618565b61020691610642565b90506001600160e01b0319808216908316146102655760405162461bcd60e51b815260206004820152602a60248201526000805160206106e68339815191526044820152691b1a590b5b595d1a1bd960b21b606482015260840161014d565b600061027460408b018b6105af565b61028391604491602491610618565b61028c91610672565b336000908152602081815260408083208d845290915281208054929350909183919083906102bb908490610691565b92505081905590508581111561032a5760405162461bcd60e51b815260206004820152602e60248201527f45524332305472616e73666572416d6f756e74456e666f726365723a616c6c6f60448201526d1dd85b98d94b595e18d95959195960921b606482015260840161014d565b60408051878152602081018390528b916001600160a01b038b169133917fc026e493323d526061a052b5dd562495120e2f648797a48be61966d3a6beec8d910160405180910390a4505050505050505050505050505050565b600080603483146103dd5760405162461bcd60e51b815260206004820152603060248201526000805160206106e683398151915260448201526f0d8d2c85ae8cae4dae65ad8cadccee8d60831b606482015260840161014d565b6103eb601460008587610618565b6103f4916106b2565b60601c91506104068360148187610618565b61040f91610672565b60001c90509250929050565b60008083601f84011261042d57600080fd5b50813567ffffffffffffffff81111561044557600080fd5b60208301915083602082850101111561045d57600080fd5b9250929050565b80356001600160a01b038116811461047b57600080fd5b919050565b60008060008060008060008060c0898b03121561049c57600080fd5b883567ffffffffffffffff808211156104b457600080fd5b6104c08c838d0161041b565b909a50985060208b01359150808211156104d957600080fd5b6104e58c838d0161041b565b909850965060408b01359150808211156104fe57600080fd5b5089016060818c03121561051157600080fd5b93506060890135925061052660808a01610464565b915061053460a08a01610464565b90509295985092959890939650565b6000806040838503121561055657600080fd5b61055f83610464565b946020939093013593505050565b6000806020838503121561058057600080fd5b823567ffffffffffffffff81111561059757600080fd5b6105a38582860161041b565b90969095509350505050565b6000808335601e198436030181126105c657600080fd5b83018035915067ffffffffffffffff8211156105e157600080fd5b60200191503681900382131561045d57600080fd5b60006020828403121561060857600080fd5b61061182610464565b9392505050565b6000808585111561062857600080fd5b8386111561063557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561066a5780818660040360031b1b83161692505b505092915050565b8035602083101561068b57600019602084900360031b1b165b92915050565b8082018082111561068b57634e487b7160e01b600052601160045260246000fd5b6bffffffffffffffffffffffff19813581811691601485101561066a5760149490940360031b84901b169092169291505056fe45524332305472616e73666572416d6f756e74456e666f726365723a696e7661a2646970667358221220bbaa47e7ff7ca5d260ee2e4ae44f60d5ed447ee0a25335e020538968f33cc37d64736f6c63430008170033", + "nonce": "0x9", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x3082decdd837ae635d3bb5bff43ccbde8c615b8aadf520a32ea0cc842d86efe5", + "transactionType": "CREATE2", + "contractName": "IdEnforcer", + "contractAddress": "0x34152d9f3f8f74338d50703e780389e829b4abac", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x667df", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610486806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063595dce48146100515780639751a83d14610079578063b99deb0e1461008e578063de723eeb146100af575b600080fd5b61006461005f3660046102a8565b6100c7565b60405190151581526020015b60405180910390f35b61008c61008736600461032d565b6100fe565b005b6100a161009c3660046103f0565b610204565b604051908152602001610070565b61008c6100bd36600461032d565b5050505050505050565b6001600160a01b0380841660009081526020818152604080832093861683529290529081206100f69083610267565b949350505050565b600061010a8989610204565b90506101173384836100c7565b156101695760405162461bcd60e51b815260206004820152601a60248201527f4964456e666f726365723a69642d616c72656164792d7573656400000000000060448201526064015b60405180910390fd5b336000908152602081815260408083206001600160a01b03871684528252808320600885901c845290915290208054600160ff84161b179055826001600160a01b0316826001600160a01b0316336001600160a01b03167f6286af1aaf28b34723a53056e5608eabb40c823d1ce093ff371cf08c502431d6846040516101f191815260200190565b60405180910390a4505050505050505050565b6000602082146102565760405162461bcd60e51b815260206004820152601f60248201527f4964456e666f726365723a696e76616c69642d7465726d732d6c656e677468006044820152606401610160565b6102608284610432565b9392505050565b600881901c600090815260208390526040902054600160ff83161b1615155b92915050565b80356001600160a01b03811681146102a357600080fd5b919050565b6000806000606084860312156102bd57600080fd5b6102c68461028c565b92506102d46020850161028c565b9150604084013590509250925092565b60008083601f8401126102f657600080fd5b50813567ffffffffffffffff81111561030e57600080fd5b60208301915083602082850101111561032657600080fd5b9250929050565b60008060008060008060008060c0898b03121561034957600080fd5b883567ffffffffffffffff8082111561036157600080fd5b61036d8c838d016102e4565b909a50985060208b013591508082111561038657600080fd5b6103928c838d016102e4565b909850965060408b01359150808211156103ab57600080fd5b5089016060818c0312156103be57600080fd5b9350606089013592506103d360808a0161028c565b91506103e160a08a0161028c565b90509295985092959890939650565b6000806020838503121561040357600080fd5b823567ffffffffffffffff81111561041a57600080fd5b610426858286016102e4565b90969095509350505050565b8035602083101561028657600019602084900360031b1b169291505056fea264697066735822122028074431512be4166d9bc04a0557354e43d233df6620f59dcf4e6fea83a3a51f64736f6c63430008170033", + "nonce": "0xa", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8487177ce2c8e7bb767c2d3a90a8eae8cd90f38265c21b8904b78a43b2ad3ba1", + "transactionType": "CREATE2", + "contractName": "LimitedCallsEnforcer", + "contractAddress": "0x4b3adad4a328bee8ba17b86074d92fe7372180cd", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x61904", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610442806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806319054d89146100515780639751a83d1461008b578063b99deb0e146100a0578063de723eeb146100b3575b600080fd5b61007961005f36600461024e565b600060208181529281526040808220909352908152205481565b60405190815260200160405180910390f35b61009e6100993660046102c1565b6100cb565b005b6100796100ae366004610384565b6101bd565b61009e6100c13660046102c1565b5050505050505050565b60006100d789896101bd565b336000908152602081815260408083208884529091528120805492935090918290610101906103c6565b91829055509050818111156101695760405162461bcd60e51b815260206004820152602360248201527f4c696d6974656443616c6c73456e666f726365723a6c696d69742d657863656560448201526219195960ea1b60648201526084015b60405180910390fd5b604080518381526020810183905286916001600160a01b0386169133917f449da07f2c06c9d1a6b19d2454ffe749e8cf991d22f686e076a1a4844c5ff370910160405180910390a450505050505050505050565b6000602082146102215760405162461bcd60e51b815260206004820152602960248201527f4c696d6974656443616c6c73456e666f726365723a696e76616c69642d7465726044820152680dae65ad8cadccee8d60bb1b6064820152608401610160565b61022b82846103ed565b9392505050565b80356001600160a01b038116811461024957600080fd5b919050565b6000806040838503121561026157600080fd5b61026a83610232565b946020939093013593505050565b60008083601f84011261028a57600080fd5b50813567ffffffffffffffff8111156102a257600080fd5b6020830191508360208285010111156102ba57600080fd5b9250929050565b60008060008060008060008060c0898b0312156102dd57600080fd5b883567ffffffffffffffff808211156102f557600080fd5b6103018c838d01610278565b909a50985060208b013591508082111561031a57600080fd5b6103268c838d01610278565b909850965060408b013591508082111561033f57600080fd5b5089016060818c03121561035257600080fd5b93506060890135925061036760808a01610232565b915061037560a08a01610232565b90509295985092959890939650565b6000806020838503121561039757600080fd5b823567ffffffffffffffff8111156103ae57600080fd5b6103ba85828601610278565b90969095509350505050565b6000600182016103e657634e487b7160e01b600052601160045260246000fd5b5060010190565b8035602083101561040657600019602084900360031b1b165b9291505056fea2646970667358221220f78aa8066d472e78f2d898b70704f695cf682a9b2914539b1a5a83b1dd87e31064736f6c63430008170033", + "nonce": "0xb", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x81afc2a439d96d84d5d17b4d9bf05e538ff998f01f2bdf3887e649f9953f208a", + "transactionType": "CREATE2", + "contractName": "NonceEnforcer", + "contractAddress": "0x2f32ff3fc3086d7f63f16fe8d0065390d460b40d", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x68e23", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610457806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80632bd4ed211461005c5780639751a83d14610096578063b99deb0e146100ab578063de723eeb146100be578063f5743c4c146100d6575b600080fd5b61008461006a366004610266565b600060208181529281526040808220909352908152205481565b60405190815260200160405180910390f35b6100a96100a43660046102e2565b6100e9565b005b6100846100b93660046103a5565b610178565b6100a96100cc3660046102e2565b5050505050505050565b6100a96100e43660046103e7565b6101e6565b60006100f58989610178565b336000908152602081815260408083206001600160a01b0388168452909152902054909150811461016d5760405162461bcd60e51b815260206004820152601b60248201527f4e6f6e6365456e666f726365723a696e76616c69642d6e6f6e6365000000000060448201526064015b60405180910390fd5b505050505050505050565b6000602082146101d55760405162461bcd60e51b815260206004820152602260248201527f4e6f6e6365456e666f726365723a696e76616c69642d7465726d732d6c656e676044820152610e8d60f31b6064820152608401610164565b6101df8284610402565b9392505050565b6001600160a01b038116600081815260208181526040808320338085529083529281902080546001810190915590518181529093917fe02d340254c92bc3ad96f0fceb790db939e11c669c1f4c8a549d248f17130b33910160405180910390a35050565b80356001600160a01b038116811461026157600080fd5b919050565b6000806040838503121561027957600080fd5b6102828361024a565b91506102906020840161024a565b90509250929050565b60008083601f8401126102ab57600080fd5b50813567ffffffffffffffff8111156102c357600080fd5b6020830191508360208285010111156102db57600080fd5b9250929050565b60008060008060008060008060c0898b0312156102fe57600080fd5b883567ffffffffffffffff8082111561031657600080fd5b6103228c838d01610299565b909a50985060208b013591508082111561033b57600080fd5b6103478c838d01610299565b909850965060408b013591508082111561036057600080fd5b5089016060818c03121561037357600080fd5b93506060890135925061038860808a0161024a565b915061039660a08a0161024a565b90509295985092959890939650565b600080602083850312156103b857600080fd5b823567ffffffffffffffff8111156103cf57600080fd5b6103db85828601610299565b90969095509350505050565b6000602082840312156103f957600080fd5b6101df8261024a565b8035602083101561041b57600019602084900360031b1b165b9291505056fea2646970667358221220b8ac9ab0759f02df69d888b08c000fa4dfa4048ad7f88931687eeff439dd484a64736f6c63430008170033", + "nonce": "0xc", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x5f8cacbc283070064a7b680355ebc88173e18afde334539984c2c3809bde3528", + "transactionType": "CREATE2", + "contractName": "TimestampEnforcer", + "contractAddress": "0x78e05f779490c24bf3bfa135b4112e7003b321cd", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x68cc4", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610455806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610092575b600080fd5b6100596100543660046102b7565b6100aa565b005b61006e61006936600461037a565b6101b2565b604080516001600160801b0393841681529290911660208301520160405180910390f35b6100596100a03660046102b7565b5050505050505050565b6000806100b78a8a6101b2565b90925090506001600160801b0382161561013357816001600160801b031642116101335760405162461bcd60e51b815260206004820152602260248201527f54696d657374616d70456e666f726365723a6561726c792d64656c656761746960448201526137b760f11b60648201526084015b60405180910390fd5b6001600160801b038116156101a657806001600160801b031642106101a65760405162461bcd60e51b8152602060048201526024808201527f54696d657374616d70456e666f726365723a657870697265642d64656c6567616044820152633a34b7b760e11b606482015260840161012a565b50505050505050505050565b600080602083146102145760405162461bcd60e51b815260206004820152602660248201527f54696d657374616d70456e666f726365723a696e76616c69642d7465726d732d6044820152650d8cadccee8d60d31b606482015260840161012a565b61022183601081876103bc565b61022a916103e6565b60801c905061023d6010600085876103bc565b610246916103e6565b60801c91509250929050565b60008083601f84011261026457600080fd5b50813567ffffffffffffffff81111561027c57600080fd5b60208301915083602082850101111561029457600080fd5b9250929050565b80356001600160a01b03811681146102b257600080fd5b919050565b60008060008060008060008060c0898b0312156102d357600080fd5b883567ffffffffffffffff808211156102eb57600080fd5b6102f78c838d01610252565b909a50985060208b013591508082111561031057600080fd5b61031c8c838d01610252565b909850965060408b013591508082111561033557600080fd5b5089016060818c03121561034857600080fd5b93506060890135925061035d60808a0161029b565b915061036b60a08a0161029b565b90509295985092959890939650565b6000806020838503121561038d57600080fd5b823567ffffffffffffffff8111156103a457600080fd5b6103b085828601610252565b90969095509350505050565b600080858511156103cc57600080fd5b838611156103d957600080fd5b5050820193919092039150565b6fffffffffffffffffffffffffffffffff1981358181169160108510156104175780818660100360031b1b83161692505b50509291505056fea2646970667358221220032d822c6d896afe6d14f1080a0918e2996d1c61fe51449e6ecf5841d50e5ea464736f6c63430008170033", + "nonce": "0xd", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x70c7cf119adf2d351b517be31bf781fb8ae133ff03699b3c9cf925943a738cb7", + "transactionType": "CREATE2", + "contractName": "ValueLteEnforcer", + "contractAddress": "0xfc20ede0a1132e839fbda9d7ed3904ff3c89540f", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x4e4e9", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061033a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610080575b600080fd5b6100596100543660046101e0565b610098565b005b61006e6100693660046102a3565b61010a565b60405190815260200160405180910390f35b61005961008e3660046101e0565b5050505050505050565b60006100a4898961010a565b905080856020013511156100ff5760405162461bcd60e51b815260206004820152601f60248201527f56616c75654c7465456e666f726365723a76616c75652d746f6f2d686967680060448201526064015b60405180910390fd5b505050505050505050565b60006020821461016a5760405162461bcd60e51b815260206004820152602560248201527f56616c75654c7465456e666f726365723a696e76616c69642d7465726d732d6c6044820152640cadccee8d60db1b60648201526084016100f6565b61017482846102e5565b9392505050565b60008083601f84011261018d57600080fd5b50813567ffffffffffffffff8111156101a557600080fd5b6020830191508360208285010111156101bd57600080fd5b9250929050565b80356001600160a01b03811681146101db57600080fd5b919050565b60008060008060008060008060c0898b0312156101fc57600080fd5b883567ffffffffffffffff8082111561021457600080fd5b6102208c838d0161017b565b909a50985060208b013591508082111561023957600080fd5b6102458c838d0161017b565b909850965060408b013591508082111561025e57600080fd5b5089016060818c03121561027157600080fd5b93506060890135925061028660808a016101c4565b915061029460a08a016101c4565b90509295985092959890939650565b600080602083850312156102b657600080fd5b823567ffffffffffffffff8111156102cd57600080fd5b6102d98582860161017b565b90969095509350505050565b803560208310156102fe57600019602084900360031b1b165b9291505056fea2646970667358221220cd4bcb89c90c60ef26b293e82752e5ff08228ce4ed86119c5597e63559710ece64736f6c63430008170033", + "nonce": "0xe", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x1801787", + "logs": [ + { + "address": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44" + ], + "data": "0x", + "blockHash": "0xda988e696c32e55449475c6a8f45d39abfbd82afb549c28febe596b4e0abb21c", + "blockNumber": "0x1001cb1", + "transactionHash": "0x2152d94cce1bf52dc6dc9d5f9d2242d7d9e9afc0484cb684d09d7d56aaf3515e", + "transactionIndex": "0x34", + "logIndex": "0xd6", + "removed": false + }, + { + "address": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "topics": [ + "0x04a46d9007577c7ff1e513b900545162ec25d25991ae3dc60cf26ec01a84806d", + "0x9e80f1022bda8209d5c73fb6cc6ba1e71cd4e3ce413abc70118fca03461bd376", + "0x000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d78" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000002105000000000000000000000000000000000000000000000000000000000000001144656c65676174696f6e4d616e6167657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013100000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xda988e696c32e55449475c6a8f45d39abfbd82afb549c28febe596b4e0abb21c", + "blockNumber": "0x1001cb1", + "transactionHash": "0x2152d94cce1bf52dc6dc9d5f9d2242d7d9e9afc0484cb684d09d7d56aaf3515e", + "transactionIndex": "0x34", + "logIndex": "0xd7", + "removed": false + } + ], + "logsBloom": "0x00040000000000000040000000000000000000000000000000800000004000000000000000000000000000000000000000000000000000000000041000020000000000000000000000040000000000000001000000001000000000000000000000000000020000000000000000000800000080000080000000000000000000480000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000008000000020000000000800000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x2152d94cce1bf52dc6dc9d5f9d2242d7d9e9afc0484cb684d09d7d56aaf3515e", + "transactionIndex": "0x34", + "blockHash": "0xda988e696c32e55449475c6a8f45d39abfbd82afb549c28febe596b4e0abb21c", + "blockNumber": "0x1001cb1", + "gasUsed": "0x1faf25", + "effectiveGasPrice": "0x16aab3", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x8a812f4315", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x28e14" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1af719b", + "logs": [ + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0xda988e696c32e55449475c6a8f45d39abfbd82afb549c28febe596b4e0abb21c", + "blockNumber": "0x1001cb1", + "transactionHash": "0xfe0407c7d054dd0f49f569de3d7c1d69635f4c8d954bbddf528e9871c94ba3a5", + "transactionIndex": "0x35", + "logIndex": "0xd8", + "removed": false + }, + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0xb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d", + "0x000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d78" + ], + "data": "0x", + "blockHash": "0xda988e696c32e55449475c6a8f45d39abfbd82afb549c28febe596b4e0abb21c", + "blockNumber": "0x1001cb1", + "transactionHash": "0xfe0407c7d054dd0f49f569de3d7c1d69635f4c8d954bbddf528e9871c94ba3a5", + "transactionIndex": "0x35", + "logIndex": "0xd9", + "removed": false + }, + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0xee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a99", + "0x0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032" + ], + "data": "0x", + "blockHash": "0xda988e696c32e55449475c6a8f45d39abfbd82afb549c28febe596b4e0abb21c", + "blockNumber": "0x1001cb1", + "transactionHash": "0xfe0407c7d054dd0f49f569de3d7c1d69635f4c8d954bbddf528e9871c94ba3a5", + "transactionIndex": "0x35", + "logIndex": "0xda", + "removed": false + }, + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0x78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d03" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0xda988e696c32e55449475c6a8f45d39abfbd82afb549c28febe596b4e0abb21c", + "blockNumber": "0x1001cb1", + "transactionHash": "0xfe0407c7d054dd0f49f569de3d7c1d69635f4c8d954bbddf528e9871c94ba3a5", + "transactionIndex": "0x35", + "logIndex": "0xdb", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000002000010000000000000000000000200000000000000000000000000000000000000000000000000000000000020810000000020000010000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200080000000000000000000080000000000000000008800000000000000000000000080000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000001080000000000000000000004000000000000000000000000000000000000000000000000000000800000000000000100000000000000", + "type": "0x2", + "transactionHash": "0xfe0407c7d054dd0f49f569de3d7c1d69635f4c8d954bbddf528e9871c94ba3a5", + "transactionIndex": "0x35", + "blockHash": "0xda988e696c32e55449475c6a8f45d39abfbd82afb549c28febe596b4e0abb21c", + "blockNumber": "0x1001cb1", + "gasUsed": "0x2f5a14", + "effectiveGasPrice": "0x16aab3", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xb6a2c35393", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x35e7c" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x16a4734", + "logs": [ + { + "address": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "transactionHash": "0x52f172baddfaafd435471660a66251136db08eb325518538c60a8dcb5b86c7d0", + "transactionIndex": "0x5e", + "logIndex": "0x12b", + "removed": false + }, + { + "address": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "topics": [ + "0xb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d", + "0x000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d78" + ], + "data": "0x", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "transactionHash": "0x52f172baddfaafd435471660a66251136db08eb325518538c60a8dcb5b86c7d0", + "transactionIndex": "0x5e", + "logIndex": "0x12c", + "removed": false + }, + { + "address": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "topics": [ + "0xee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a99", + "0x0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032" + ], + "data": "0x", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "transactionHash": "0x52f172baddfaafd435471660a66251136db08eb325518538c60a8dcb5b86c7d0", + "transactionIndex": "0x5e", + "logIndex": "0x12d", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000810000000020000010000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000080000000000000000000080000000000000000008800000000000000000000000080000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000100000000000000000000000000000000000200000000000000800000000000000100000000000000", + "type": "0x2", + "transactionHash": "0x52f172baddfaafd435471660a66251136db08eb325518538c60a8dcb5b86c7d0", + "transactionIndex": "0x5e", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x43968c", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x1064d5b5718", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x4d6b4" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x16fd5e5", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x1373945eb263363a9cbb20f7bb22d0e1566e80d0f1efdf967dd1601fbf49d48a", + "transactionIndex": "0x5f", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x58eb1", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x14795f2418", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x60b0" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x17627b5", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x0dbcb18025fd09adc34be67d1eabfd42ec287227bf67c192e5dbf8d45616aa70", + "transactionIndex": "0x60", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x651d0", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x1773b0fdd3", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x6ec0" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x17be9cb", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x5a44ca63602f2b2edf118cf04d8380548d4998075bc4280d3c40d6ba4166f43b", + "transactionIndex": "0x61", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x5c216", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x153b56f43e", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x6444" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x18069a5", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x3a7688d22b76d24e94341e062470e1935524783a2a8a981873c6f2e917e6dfe3", + "transactionIndex": "0x62", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x47fda", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x106788e0ef", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x4d78" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x186e5b9", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x4f52f460bc046f17ff3cd3c787cb5d8d9727d896f8fed5e1d642619c5de8164d", + "transactionIndex": "0x63", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x67c14", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x181d18838a", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x71e0" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x18ddfa4", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xd23cfaec24a485724502e8fd5f9057dfeac3313c12efda15af4c2134d1d5f354", + "transactionIndex": "0x64", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x6f9eb", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x1a06aca744", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x7ae8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x194cd1a", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x696480ac1eeb4b1f007e06e6d32c9adc877ccf2dde7484faa5092de7eecb423a", + "transactionIndex": "0x65", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x6ed76", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x19e3197943", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x7a40" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x19970a4", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x3082decdd837ae635d3bb5bff43ccbde8c615b8aadf520a32ea0cc842d86efe5", + "transactionIndex": "0x66", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x4a38a", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x10d090be14", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x4f68" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x19ddb12", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x8487177ce2c8e7bb767c2d3a90a8eae8cd90f38265c21b8904b78a43b2ad3ba1", + "transactionIndex": "0x67", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x46a6e", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x10010b8713", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x4b94" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1a256cc", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x81afc2a439d96d84d5d17b4d9bf05e538ff998f01f2bdf3887e649f9953f208a", + "transactionIndex": "0x68", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x47bba", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x102ec8c238", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x4c6c" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1a6d196", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x5f8cacbc283070064a7b680355ebc88173e18afde334539984c2c3809bde3528", + "transactionIndex": "0x69", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x47aca", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x105334c6a6", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x4d18" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1aa5ce2", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x70c7cf119adf2d351b517be31bf781fb8ae133ff03699b3c9cf925943a738cb7", + "transactionIndex": "0x6a", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x38b4c", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xc9460997c", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x3b68" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1720358475, + "chain": 8453, + "commit": null +} \ No newline at end of file diff --git a/broadcast/DeployEnvironmentSetUp.s.sol/8453/run-latest.json b/broadcast/DeployEnvironmentSetUp.s.sol/8453/run-latest.json new file mode 100644 index 0000000..c282e58 --- /dev/null +++ b/broadcast/DeployEnvironmentSetUp.s.sol/8453/run-latest.json @@ -0,0 +1,763 @@ +{ + "transactions": [ + { + "hash": "0x2152d94cce1bf52dc6dc9d5f9d2242d7d9e9afc0484cb684d09d7d56aaf3515e", + "transactionType": "CREATE2", + "contractName": "DelegationManager", + "contractAddress": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "function": null, + "arguments": [ + "0xB0403B32f54d0Bd752113f4009e8B534C6669f44" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x2e52b2", + "value": "0x0", + "input": "0x44656c654761746f7200000000000000000000000000000000000000000000006101606040523480156200001257600080fd5b50604051620029e7380380620029e7833981016040819052620000359162000384565b60408051808201825260118152702232b632b3b0ba34b7b726b0b730b3b2b960791b602080830191909152825180840190935260018352603160f81b9083015290826001600160a01b038116620000a757604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b620000b28162000204565b506001805460ff60a01b19169055620000cd82600262000222565b61012052620000de81600362000222565b61014052815160208084019190912060e052815190820120610100524660a0526200015b60e0516101005160408051600080516020620029c783398151915260208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526000620001706200025b565b9050306001600160a01b0316817f04a46d9007577c7ff1e513b900545162ec25d25991ae3dc60cf26ec01a84806d604051806040016040528060118152602001702232b632b3b0ba34b7b726b0b730b3b2b960791b815250604051806040016040528060018152602001603160f81b81525046604051620001f493929190620003fe565b60405180910390a35050620005e5565b600180546001600160a01b03191690556200021f81620002f1565b50565b600060208351101562000242576200023a8362000341565b905062000255565b816200024f8482620004df565b5060ff90505b92915050565b600060c0516001600160a01b0316306001600160a01b031614801562000282575060a05146145b156200028f575060805190565b620002ec60e0516101005160408051600080516020620029c783398151915260208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b905090565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080829050601f815111156200036f578260405163305a27a960e01b81526004016200009e9190620005ab565b80516200037c82620005c0565b179392505050565b6000602082840312156200039757600080fd5b81516001600160a01b0381168114620003af57600080fd5b9392505050565b6000815180845260005b81811015620003de57602081850181015186830182015201620003c0565b506000602082860101526020601f19601f83011685010191505092915050565b606081526000620004136060830186620003b6565b8281036020840152620004278186620003b6565b915050826040830152949350505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200046357607f821691505b6020821081036200048457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004da576000816000526020600020601f850160051c81016020861015620004b55750805b601f850160051c820191505b81811015620004d657828155600101620004c1565b5050505b505050565b81516001600160401b03811115620004fb57620004fb62000438565b62000513816200050c84546200044e565b846200048a565b602080601f8311600181146200054b5760008415620005325750858301515b600019600386901b1c1916600185901b178555620004d6565b600085815260208120601f198616915b828110156200057c578886015182559484019460019091019084016200055b565b50858210156200059b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602081526000620003af6020830184620003b6565b80516020808301519190811015620004845760001960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516123876200064060003960006113bb0152600061138e015260006112f3015260006112cb01526000611226015260006112500152600061127a01526123876000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80637fade287116100b8578063a3f4df7e1161007c578063a3f4df7e1461028e578063acb8cc49146102cb578063e1520f54146102eb578063e30c3978146102fe578063f2fde38b1461030f578063ffa1ad741461032257600080fd5b80637fade2871461023f57806383ebb771146102525780638456cb591461025a57806384b0196e146102625780638da5cb5b1461027d57600080fd5b806358909ebc1161010a57806358909ebc146101c65780635c975abb146101e75780635daa6539146101f9578063661346071461021c578063715018a61461022f57806379ba50971461023757600080fd5b80631b13cac2146101475780632d40d052146101635780633ed01015146101965780633f4ba83a146101ab57806349934047146101b3575b600080fd5b61015060001981565b6040519081526020015b60405180910390f35b6101866101713660046118c7565b60056020526000908152604090205460ff1681565b604051901515815260200161015a565b6101a96101a43660046118e0565b610346565b005b6101a9610440565b6101a96101c13660046118e0565b610452565b6101cf610a1181565b6040516001600160a01b03909116815260200161015a565b600154600160a01b900460ff16610186565b6101866102073660046118c7565b60046020526000908152604090205460ff1681565b61015061022a3660046118e0565b610542565b6101a961055b565b6101a961056d565b6101a961024d3660046118e0565b6105b6565b6101506106a7565b6101a96106b6565b61026a6106c6565b60405161015a9796959493929190611967565b6000546001600160a01b03166101cf565b6102be604051806040016040528060118152602001702232b632b3b0ba34b7b726b0b730b3b2b960791b81525081565b60405161015a9190611a00565b6102be604051806040016040528060018152602001603160f81b81525081565b6101a96102f9366004611a13565b61070c565b6001546001600160a01b03166101cf565b6101a961031d366004611ac9565b611072565b6102be604051806040016040528060058152602001640312e302e360dc1b81525081565b6103566040820160208301611ac9565b6001600160a01b038116331461037f5760405163b9f0f17160e01b815260040160405180910390fd5b600061038a83610542565b60008181526005602052604090205490915060ff166103bc57604051637952fbad60e11b815260040160405180910390fd5b6000818152600560209081526040909120805460ff191690556103e190840184611ac9565b6001600160a01b03166103fa6040850160208601611ac9565b6001600160a01b0316827f3feadce88fc1b49db633a56fd5307ed6ee18734df83bcc4011daa720c9cd95f1866040516104339190611c18565b60405180910390a4505050565b6104486110e3565b610450611110565b565b6104626040820160208301611ac9565b6001600160a01b038116331461048b5760405163b9f0f17160e01b815260040160405180910390fd5b600061049683610542565b60008181526005602052604090205490915060ff16156104c857604051625ecddb60e01b815260040160405180910390fd5b6000818152600560209081526040909120805460ff191660011790556104f090840184611ac9565b6001600160a01b03166105096040850160208601611ac9565b6001600160a01b0316827fea589ba9473ee1fe77d352c7ed919747715a5d22931b972de9b02a907c66d5dd866040516104339190611c18565b600061055561055083611fae565b611165565b92915050565b6105636110e3565b6104506000611200565b60015433906001600160a01b031681146105aa5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b6105b381611200565b50565b6105c66040820160208301611ac9565b6001600160a01b03811633146105ef5760405163b9f0f17160e01b815260040160405180910390fd5b60006105fa83610542565b60008181526004602052604090205490915060ff161561062d5760405163119b4fd360e11b815260040160405180910390fd5b6000818152600460209081526040909120805460ff1916600117905561065590840184611ac9565b6001600160a01b031661066e6040850160208601611ac9565b6001600160a01b0316827fb9b56ecd70a93a7fcb54a1072d6a9c7ff488f46d6c656bb0a0fa453924658704866040516104339190611c18565b60006106b1611219565b905090565b6106be6110e3565b610450611344565b6000606080600080600060606106da611387565b6106e26113b4565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6107146113e1565b600061072283850185611fba565b905080516000036107465760405163efe957cf60e01b815260040160405180910390fd5b600081516001600160401b0381111561076157610761611ce9565b60405190808252806020026020018201604052801561078a578160200160208202803683370190505b5090506107db6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600080191681526020016060815260200160008152602001606081525090565b336001600160a01b0316836000815181106107f8576107f861206a565b6020026020010151600001516001600160a01b03161415801561084d5750610a116001600160a01b0316836000815181106108355761083561206a565b6020026020010151600001516001600160a01b031614155b1561086b57604051632d618d8160e21b815260040160405180910390fd5b60005b8351811015610a98578381815181106108895761088961206a565b6020026020010151915061089c82611165565b8382815181106108ae576108ae61206a565b6020026020010181815250508160a001515160000361091d57600460008483815181106108dd576108dd61206a565b60209081029190910181015182528101919091526040016000205460ff166109185760405163a9e649e960e01b815260040160405180910390fd5b610a90565b60208201516001600160a01b0381163b6000036109c157600061098761097d6109446106a7565b8786815181106109565761095661206a565b602002602001015160405161190160f01b8152600281019290925260228201526042902090565b8560a0015161140c565b9050816001600160a01b0316816001600160a01b0316146109bb57604051638baa579f60e01b815260040160405180910390fd5b50610a8e565b60006109e06109ce6106a7565b8685815181106109565761095661206a565b60a0850151604051630b135d3f60e11b81529192506000916001600160a01b03851691631626ba7e91610a17918691600401612080565b602060405180830381865afa158015610a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5891906120a1565b6001600160e01b0319169050630b135d3f60e11b8114610a8b57604051638baa579f60e01b815260040160405180910390fd5b50505b505b60010161086e565b5060005b8351811015610c585760056000848381518110610abb57610abb61206a565b60209081029190910181015182528101919091526040016000205460ff1615610af7576040516302dd502960e11b815260040160405180910390fd5b60018451610b0591906120e1565b8114610c0e5782610b178260016120f4565b81518110610b2757610b2761206a565b6020026020010151848281518110610b4157610b4161206a565b60200260200101516040015114610b6b57604051636f6a1b8760e11b815260040160405180910390fd5b600084610b798360016120f4565b81518110610b8957610b8961206a565b6020026020010151600001519050610a116001600160a01b0316816001600160a01b031614158015610bea5750806001600160a01b0316858381518110610bd257610bd261206a565b6020026020010151602001516001600160a01b031614155b15610c0857604051632d618d8160e21b815260040160405180910390fd5b50610c50565b60001960001b848281518110610c2657610c2661206a565b60200260200101516040015114610c5057604051636f6a1b8760e11b815260040160405180910390fd5b600101610a9c565b5060005b8351811015610db8576000848281518110610c7957610c7961206a565b60200260200101516060015190506000848381518110610c9b57610c9b61206a565b602002602001015190506000868481518110610cb957610cb961206a565b602002602001015160200151905060008351905060005b81811015610da8576000858281518110610cec57610cec61206a565b6020026020010151600001519050806001600160a01b0316639751a83d878481518110610d1b57610d1b61206a565b602002602001015160200151888581518110610d3957610d3961206a565b6020026020010151604001518e8989336040518763ffffffff1660e01b8152600401610d6a96959493929190612152565b600060405180830381600087803b158015610d8457600080fd5b505af1158015610d98573d6000803e3d6000fd5b5050505050806001019050610cd0565b5050505050806001019050610c5c565b508260018451610dc891906120e1565b81518110610dd857610dd861206a565b6020026020010151602001516001600160a01b03166326f0aef7856040518263ffffffff1660e01b8152600401610e0f91906121b4565b600060405180830381600087803b158015610e2957600080fd5b505af1158015610e3d573d6000803e3d6000fd5b505084519150505b8015610fc657600084610e596001846120e1565b81518110610e6957610e6961206a565b6020026020010151606001519050600084600184610e8791906120e1565b81518110610e9757610e9761206a565b60200260200101519050600086600185610eb191906120e1565b81518110610ec157610ec161206a565b602002602001015160200151905060008351905060005b81811015610fb0576000858281518110610ef457610ef461206a565b6020026020010151600001519050806001600160a01b031663de723eeb878481518110610f2357610f2361206a565b602002602001015160200151888581518110610f4157610f4161206a565b6020026020010151604001518e8989336040518763ffffffff1660e01b8152600401610f7296959493929190612152565b600060405180830381600087803b158015610f8c57600080fd5b505af1158015610fa0573d6000803e3d6000fd5b5050505050806001019050610ed8565b505050505080610fbf906121c7565b9050610e45565b5060005b835181101561106957336001600160a01b03168460018651610fec91906120e1565b81518110610ffc57610ffc61206a565b6020026020010151602001516001600160a01b03167f40dadaa36c6c2e3d7317e24757451ffb2d603d875f0ad5e92c5dd156573b18738684815181106110445761104461206a565b602002602001015160405161105991906121de565b60405180910390a3600101610fca565b50505050505050565b61107a6110e3565b600180546001600160a01b0383166001600160a01b031990911681179091556110ab6000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000546001600160a01b031633146104505760405163118cdaa760e01b81523360048201526024016105a1565b611118611436565b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000807f88c1d2ecf185adf710588203a5f263f0ff61be0d33da39792cde19ba9aa4331e8360000151846020015185604001516111a58760600151611460565b6080808901516040805160208101989098526001600160a01b03968716908801529490931660608601529184015260a083015260c082015260e0015b60408051601f1981840301815291905280516020909101209392505050565b600180546001600160a01b03191690556105b38161152b565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561127257507f000000000000000000000000000000000000000000000000000000000000000046145b1561129c57507f000000000000000000000000000000000000000000000000000000000000000090565b6106b1604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b61134c6113e1565b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586111483390565b60606106b17f0000000000000000000000000000000000000000000000000000000000000000600261157b565b60606106b17f0000000000000000000000000000000000000000000000000000000000000000600361157b565b600154600160a01b900460ff16156104505760405163d93c066560e01b815260040160405180910390fd5b60008060008061141c8686611626565b92509250925061142c8282611673565b5090949350505050565b600154600160a01b900460ff1661045057604051638dfc202b60e01b815260040160405180910390fd5b60008082516001600160401b0381111561147c5761147c611ce9565b6040519080825280602002602001820160405280156114a5578160200160208202803683370190505b50905060005b83518110156114fb576114d68482815181106114c9576114c961206a565b6020026020010151611730565b8282815181106114e8576114e861206a565b60209081029190910101526001016114ab565b508060405160200161150d91906122cb565b60405160208183030381529060405280519060200120915050919050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606060ff83146115955761158e83611791565b9050610555565b8180546115a190612301565b80601f01602080910402602001604051908101604052809291908181526020018280546115cd90612301565b801561161a5780601f106115ef5761010080835404028352916020019161161a565b820191906000526020600020905b8154815290600101906020018083116115fd57829003601f168201915b50505050509050610555565b600080600083516041036116605760208401516040850151606086015160001a611652888285856117d0565b95509550955050505061166c565b50508151600091506002905b9250925092565b60008260038111156116875761168761233b565b03611690575050565b60018260038111156116a4576116a461233b565b036116c25760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156116d6576116d661233b565b036116f75760405163fce698f760e01b8152600481018290526024016105a1565b600382600381111561170b5761170b61233b565b0361172c576040516335e2f38360e21b8152600481018290526024016105a1565b5050565b6000807f80ad7e1b04ee6d994a125f4714ca0720908bd80ed16063ec8aee4b88e9253e2d83600001518460200151805190602001206040516020016111e1939291909283526001600160a01b03919091166020830152604082015260600190565b6060600061179e8361189f565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561180b5750600091506003905082611895565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561185f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661188b57506000925060019150829050611895565b9250600091508190505b9450945094915050565b600060ff8216601f81111561055557604051632cd44ac360e21b815260040160405180910390fd5b6000602082840312156118d957600080fd5b5035919050565b6000602082840312156118f257600080fd5b81356001600160401b0381111561190857600080fd5b820160c0818503121561191a57600080fd5b9392505050565b6000815180845260005b818110156119475760208185018101518683018201520161192b565b506000602082860101526020601f19601f83011685010191505092915050565b60ff60f81b881681526000602060e0602084015261198860e084018a611921565b838103604085015261199a818a611921565b606085018990526001600160a01b038816608086015260a0850187905284810360c08601528551808252602080880193509091019060005b818110156119ee578351835292840192918401916001016119d2565b50909c9b505050505050505050505050565b60208152600061191a6020830184611921565b600080600060408486031215611a2857600080fd5b83356001600160401b0380821115611a3f57600080fd5b818601915086601f830112611a5357600080fd5b813581811115611a6257600080fd5b876020828501011115611a7457600080fd5b602092830195509350908501359080821115611a8f57600080fd5b50840160608187031215611aa257600080fd5b809150509250925092565b80356001600160a01b0381168114611ac457600080fd5b919050565b600060208284031215611adb57600080fd5b61191a82611aad565b6000808335601e19843603018112611afb57600080fd5b83016020810192503590506001600160401b03811115611b1a57600080fd5b803603821315611b2957600080fd5b9250929050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b88811015611c0a57858403601f19018a52823536899003605e19018112611b98578283fd5b880160606001600160a01b03611bad83611aad565b168652611bbc87830183611ae4565b8289890152611bce8389018284611b30565b925050506040611be081840184611ae4565b935087830382890152611bf4838583611b30565b9d89019d97505050938601935050600101611b73565b509198975050505050505050565b6020815260006001600160a01b0380611c3085611aad565b16602084015280611c4360208601611aad565b16604084015250604083013560608301526060830135601e19843603018112611c6b57600080fd5b83016020810190356001600160401b03811115611c8757600080fd5b8060051b3603821315611c9957600080fd5b60c06080850152611cae60e085018284611b59565b915050608084013560a0840152611cc860a0850185611ae4565b848303601f190160c0860152611cdf838284611b30565b9695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715611d2157611d21611ce9565b60405290565b60405160c081016001600160401b0381118282101715611d2157611d21611ce9565b604051601f8201601f191681016001600160401b0381118282101715611d7157611d71611ce9565b604052919050565b60006001600160401b03821115611d9257611d92611ce9565b5060051b60200190565b600082601f830112611dad57600080fd5b81356001600160401b03811115611dc657611dc6611ce9565b611dd9601f8201601f1916602001611d49565b818152846020838601011115611dee57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f830112611e1c57600080fd5b81356020611e31611e2c83611d79565b611d49565b82815260059290921b84018101918181019086841115611e5057600080fd5b8286015b84811015611eff5780356001600160401b0380821115611e745760008081fd5b908801906060828b03601f1901811315611e8e5760008081fd5b611e96611cff565b611ea1888501611aad565b815260408085013584811115611eb75760008081fd5b611ec58e8b83890101611d9c565b838b015250918401359183831115611edd5760008081fd5b611eeb8d8a85880101611d9c565b908201528652505050918301918301611e54565b509695505050505050565b600060c08284031215611f1c57600080fd5b611f24611d27565b9050611f2f82611aad565b8152611f3d60208301611aad565b60208201526040820135604082015260608201356001600160401b0380821115611f6657600080fd5b611f7285838601611e0b565b60608401526080840135608084015260a0840135915080821115611f9557600080fd5b50611fa284828501611d9c565b60a08301525092915050565b60006105553683611f0a565b60006020808385031215611fcd57600080fd5b82356001600160401b0380821115611fe457600080fd5b818501915085601f830112611ff857600080fd5b8135612006611e2c82611d79565b81815260059190911b8301840190848101908883111561202557600080fd5b8585015b8381101561205d578035858111156120415760008081fd5b61204f8b89838a0101611f0a565b845250918601918601612029565b5098975050505050505050565b634e487b7160e01b600052603260045260246000fd5b8281526040602082015260006120996040830184611921565b949350505050565b6000602082840312156120b357600080fd5b81516001600160e01b03198116811461191a57600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610555576105556120cb565b80820180821115610555576105556120cb565b6001600160a01b0361211882611aad565b1682526020810135602083015260006121346040830183611ae4565b60606040860152612149606086018284611b30565b95945050505050565b60c08152600061216560c0830189611921565b82810360208401526121778189611921565b9050828103604084015261218b8188612107565b606084019690965250506001600160a01b039283166080820152911660a0909101529392505050565b60208152600061191a6020830184612107565b6000816121d6576121d66120cb565b506000190190565b602080825282516001600160a01b0390811683830152838201518116604080850191909152808501516060808601919091528086015160c06080870152805160e0870181905260009594610100600583901b8901810195919493870193919290890190885b8181101561229d5760ff198b8903018352855187815116895289810151858b8b0152612271868b0182611921565b918701518a83038b8901529190506122898183611921565b995050509488019491880191600101612243565b50505050505050608085015160a085015260a08501519150601f198482030160c08501526121498183611921565b815160009082906020808601845b838110156122f5578151855293820193908201906001016122d9565b50929695505050505050565b600181811c9082168061231557607f821691505b60208210810361233557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052602160045260246000fdfea26469706673582212206702181458ece90d9cf27649387478caa2ed36ffd86ba70b239c4be34106280764736f6c634300081700338b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44", + "nonce": "0x0", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xfe0407c7d054dd0f49f569de3d7c1d69635f4c8d954bbddf528e9871c94ba3a5", + "transactionType": "CREATE2", + "contractName": "MultiSigDeleGator", + "contractAddress": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "function": null, + "arguments": [ + "0xbe4138886cB096bDC1B930F2f0ca7892AA234D78", + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x4162a1", + "value": "0x0", + "input": "0x44656c654761746f72000000000000000000000000000000000000000000000060e0604052306080523480156200001557600080fd5b506040516200396338038062003963833981016040819052620000389162000208565b8181620000446200013e565b6001600160a01b0380831660a081905290821660c0526040517fb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d90600090a26040516001600160a01b038216907fee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a9990600090a250506000197fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c0281905560408051918252517fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c00917f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d03919081900360200190a150505062000247565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156200018f5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001ef5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b0381168114620001ef57600080fd5b600080604083850312156200021c57600080fd5b82516200022981620001f2565b60208401519092506200023c81620001f2565b809150509250929050565b60805160a05160c0516136216200034260003960008181610633015281816108a001528181610b0001528181610bbb01528181610c3c01528181610cba01528181610e1f01528181610ed401528181610f5b015281816110b9015281816111f9015281816112ac0152818161131e0152818161138901528181611521015281816115b4015281816115f6015281816116ec015281816117ca015281816119e0015261240a01526000818161077201528181610b6601528181610d1d01528181610da001528181610e8201528181611130015281816113ec015261174f015260008181611b8201528181611bab015261211901526136216000f3fe60806040526004361061024a5760003560e01c80637df73e2711610139578063bc197c81116100b6578063e3d9109f1161007a578063e3d9109f1461070c578063e75235b81461072c578063ea4d3c9b14610760578063eb12d61e14610794578063f23a6e61146107b4578063ffa1ad74146107d457600080fd5b8063bc197c8114610682578063c399ec88146106a2578063d087d288146106b7578063d7d7442f146106cc578063e1520f54146106ec57600080fd5b8063a24c8f32116100fd578063a24c8f32146105a3578063aaf10f42146105b6578063ad3cb1cc146105e3578063b0d691fe14610621578063b3c650151461065557600080fd5b80637df73e27146104d95780637f07bfdc1461051f5780637fade2871461053f57806394cf795e1461055f578063a0c1deb41461058157600080fd5b80634891161f116101c75780635c1c6dcd1161018b5780635c1c6dcd1461043957806360b5bb3f1461045957806365ee81d8146104795780636af1f3991461049957806378979a80146104b957600080fd5b80634891161f146103d457806349934047146103e95780634a58db19146104095780634f1ef2861461041157806352d1902d1461042457600080fd5b806326f0aef71161020e57806326f0aef71461033457806334fcd5be146103545780633e1b0812146103745780633ed0101514610394578063445140b8146103b457600080fd5b806301ffc9a7146102565780630e316ab71461028b578063150b7a02146102ad5780631626ba7e146102e657806319822f7c1461030657600080fd5b3661025157005b600080fd5b34801561026257600080fd5b506102766102713660046128f4565b610805565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102ab6102a6366004612933565b610895565b005b3480156102b957600080fd5b506102cd6102c8366004612a05565b610ab9565b6040516001600160e01b03199091168152602001610282565b3480156102f257600080fd5b506102cd610301366004612ab8565b610ad4565b34801561031257600080fd5b50610326610321366004612b03565b610af3565b604051908152602001610282565b34801561034057600080fd5b506102ab61034f366004612b6e565b610b5b565b34801561036057600080fd5b506102ab61036f366004612bee565b610bb0565b34801561038057600080fd5b5061032661038f366004612c2f565b610c15565b3480156103a057600080fd5b506102ab6103af366004612c58565b610caf565b3480156103c057600080fd5b506102766103cf366004612c92565b610d87565b3480156103e057600080fd5b50610326601e81565b3480156103f557600080fd5b506102ab610404366004612c58565b610e14565b6102ab610eb7565b6102ab61041f366004612cab565b610f21565b34801561043057600080fd5b50610326610f33565b34801561044557600080fd5b506102ab610454366004612b6e565b610f50565b34801561046557600080fd5b506102ab610474366004612cfa565b610f99565b34801561048557600080fd5b506102ab610494366004612d53565b6110ae565b3480156104a557600080fd5b506102766104b4366004612c92565b611117565b3480156104c557600080fd5b506102ab6104d4366004612db1565b611167565b3480156104e557600080fd5b506102766104f4366004612933565b6001600160a01b031660009081526000805160206135ac833981519152602052604090205460ff1690565b34801561052b57600080fd5b506102ab61053a366004612e2d565b6112a1565b34801561054b57600080fd5b506102ab61055a366004612c58565b61137e565b34801561056b57600080fd5b50610574611421565b6040516102829190612e59565b34801561058d57600080fd5b5060008051602061358c83398151915254610326565b6102ab6105b1366004612cab565b610f29565b3480156105c257600080fd5b506105cb611494565b6040516001600160a01b039091168152602001610282565b3480156105ef57600080fd5b50610614604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102829190612ef6565b34801561062d57600080fd5b506105cb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561066157600080fd5b5061066a6114ba565b6040516001600160401b039091168152602001610282565b34801561068e57600080fd5b506102cd61069d366004612f88565b6114ed565b3480156106ae57600080fd5b50610326611509565b3480156106c357600080fd5b50610326611595565b3480156106d857600080fd5b506102ab6106e7366004612c92565b6115eb565b3480156106f857600080fd5b506102ab610707366004613035565b6116e1565b34801561071857600080fd5b506102ab61072736600461309d565b6117bf565b34801561073857600080fd5b507fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c0254610326565b34801561076c57600080fd5b506105cb7f000000000000000000000000000000000000000000000000000000000000000081565b3480156107a057600080fd5b506102ab6107af366004612933565b6119d5565b3480156107c057600080fd5b506102cd6107cf3660046130d6565b611b5b565b3480156107e057600080fd5b50610614604051806040016040528060058152602001640312e302e360dc1b81525081565b600061080f611b77565b6001600160e01b031982166326f0aef760e01b148061083e57506001600160e01b03198216630a85bd0160e11b145b8061085957506001600160e01b03198216630271189760e51b145b8061087457506001600160e01b031982166301ffc9a760e01b145b8061088f57506001600160e01b03198216630b135d3f60e11b145b92915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906108ce5750333014155b156108ec57604051630796d94560e01b815260040160405180910390fd5b6001600160a01b03811660009081526000805160206135ac833981519152602081905260409091205460ff166109355760405163da0357f760e01b815260040160405180910390fd5b60018101546002820154810361095e576040516361774dcf60e11b815260040160405180910390fd5b60005b61096c600183613154565b811015610a3657836001600160a01b031683600101828154811061099257610992613167565b6000918252602090912001546001600160a01b031603610a2e57826001016001836109bd9190613154565b815481106109cd576109cd613167565b6000918252602090912001546001840180546001600160a01b0390921691839081106109fb576109fb613167565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610a36565b600101610961565b5081600101805480610a4a57610a4a61317d565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038516808352908490526040808320805460ff191690555190917fb0073c14ccc2332b5b461c0d2fb94366f38d3954a82745e74827aa0811c9f98191a2505050565b6000610ac3611b77565b50630a85bd0160e11b949350505050565b6000610ade611b77565b610ae9848484611c1e565b90505b9392505050565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b3e57604051636b31ba1560e11b815260040160405180910390fd5b610b46611b77565b610b508484611dbd565b9050610aec82611e33565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ba457604051630692ce8160e21b815260040160405180910390fd5b610bad81611eca565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610be95750333014155b15610c0757604051630796d94560e01b815260040160405180910390fd5b610c118282611fd4565b5050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610c8b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088f9190613193565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610ce85750333014155b15610d0657604051630796d94560e01b815260040160405180910390fd5b604051633ed0101560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633ed0101590610d529084906004016132db565b600060405180830381600087803b158015610d6c57600080fd5b505af1158015610d80573d6000803e3d6000fd5b5050505050565b6040516316a0682960e11b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632d40d052906024015b602060405180830381865afa158015610df0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088f91906133b6565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610e4d5750333014155b15610e6b57604051630796d94560e01b815260040160405180910390fd5b604051634993404760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634993404790610d529084906004016132db565b610ebf611b77565b60405163b760faf960e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b158015610d6c57600080fd5b610f29612036565b610c1182826120f3565b6000610f3d61210e565b506000805160206135cc83398151915290565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ba457604051636b31ba1560e11b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610fde5750825b90506000826001600160401b03166001148015610ffa5750303b155b905081158015611008575080155b156110265760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561105057845460ff60401b1916600160401b1785555b61105d8888886000612157565b83156110a457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2906020015b60405180910390a15b5050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110e75750333014155b1561110557604051630796d94560e01b815260040160405180910390fd5b61111184848484612157565b50505050565b604051635daa653960e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635daa653990602401610dd3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054869190600160401b900460ff16806111af575080546001600160401b03808416911610155b156111cd5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906112275750333014155b1561124557604051630796d94560e01b815260040160405180910390fd5b61125186868686612157565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906112da5750333014155b156112f857604051630796d94560e01b815260040160405180910390fd5b60405163040b850f60e31b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561136257600080fd5b505af1158015611376573d6000803e3d6000fd5b505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906113b75750333014155b156113d557604051630796d94560e01b815260040160405180910390fd5b604051637fade28760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637fade28790610d529084906004016132db565b606060006000805160206135ac8339815191526001810180546040805160208084028201810190925282815293945083018282801561148957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161146b575b505050505091505090565b60006114b56000805160206135cc833981519152546001600160a01b031690565b905090565b60006114b57ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00546001600160401b031690565b60006114f7611b77565b5063bc197c8160e01b95945050505050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a08231906024015b602060405180830381865afa158015611571573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b59190613193565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401611554565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906116245750333014155b1561164257604051630796d94560e01b815260040160405180910390fd5b806000036116635760405163aabd5a0960e01b815260040160405180910390fd5b60008051602061358c833981519152546000805160206135ac833981519152908211156116a35760405163aabd5a0960e01b815260040160405180910390fd5b600281018290556040518281527f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d039060200160405180910390a15050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480159061171a5750333014155b1561173857604051630796d94560e01b815260040160405180910390fd5b60405163385483d560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e1520f5490611788908690869086906004016133d3565b600060405180830381600087803b1580156117a257600080fd5b505af11580156117b6573d6000803e3d6000fd5b50505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906117f85750333014155b1561181657604051630796d94560e01b815260040160405180910390fd5b6001600160a01b038116158061183557506001600160a01b0381163b15155b1561185357604051634501a91960e01b815260040160405180910390fd5b6001600160a01b03821660009081526000805160206135ac833981519152602081905260409091205460ff1661189c5760405163da0357f760e01b815260040160405180910390fd5b6001600160a01b03821660009081526020829052604090205460ff16156118d657604051631985f4ab60e31b815260040160405180910390fd5b600181015460005b8181101561197057846001600160a01b031683600101828154811061190557611905613167565b6000918252602090912001546001600160a01b031603611968578383600101828154811061193557611935613167565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550611970565b6001016118de565b506001600160a01b03808516600081815260208590526040808220805460ff199081169091559387168083528183208054909516600117909455517f53a7b6f060162826746b07f3ff5cc66b83afad3bc9a57c9f34d7802901c6e8299190a350505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590611a0e5750333014155b15611a2c57604051630796d94560e01b815260040160405180910390fd5b6001600160a01b0381161580611a4b57506001600160a01b0381163b15155b15611a6957604051634501a91960e01b815260040160405180910390fd5b60008051602061358c833981519152546000805160206135ac83398151915290601d1901611aaa57604051630dc92ed360e11b815260040160405180910390fd5b6001600160a01b03821660009081526020829052604090205460ff1615611ae457604051631985f4ab60e31b815260040160405180910390fd5b6001818101805480830182556000918252602080832090910180546001600160a01b0319166001600160a01b038716908117909155808352908490526040808320805460ff191690941790935591517f82b74755d483f0688b80354268454667c377a5684e64a4dbb6820fc11a6276d49190a25050565b6000611b65611b77565b5063f23a6e6160e01b95945050505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611bfe57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611bf26000805160206135cc833981519152546001600160a01b031690565b6001600160a01b031614155b15611c1c5760405163703e46dd60e11b815260040160405180910390fd5b565b7fb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c02546000906000805160206135ac83398151915290611c5f9060419061343d565b8314611c7657506001600160e01b03199050610aec565b6000611c83604185613454565b600283015490915060008080805b85811015611da55760008a8a611ca860418561343d565b906041611cb6866001613476565b611cc0919061343d565b92611ccd93929190613489565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929350611d1192508e91508390506123d5565b9350846001600160a01b0316846001600160a01b0316111580611d4d57506001600160a01b03841660009081526020899052604090205460ff16155b15611d6b57506001600160e01b03199750610aec9650505050505050565b82611d75816134b3565b935050858310611d975750630b135d3f60e11b9750610aec9650505050505050565b509192508291600101611c91565b506001600160e01b03199a9950505050505050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c829052603c81208190611e0590611e006101008701876134cc565b611c1e565b90506374eca2c160e11b6001600160e01b0319821601611e2957600091505061088f565b5060019392505050565b8015610bad57604051600090339060001990849084818181858888f193505050503d8060008114611e80576040519150601f19603f3d011682016040523d82523d6000602084013e611e85565b606091505b505060408051848152821515602082015291925033917fa427c7d47f24d01b170779a7600b1d4c0d7cdbabaa0f19c4f0e6182053ffc931910160405180910390a25050565b600080611eda6020840184612933565b6001600160a01b03166020840135611ef560408601866134cc565b604051611f03929190613512565b60006040518083038185875af1925050503d8060008114611f40576040519150601f19603f3d011682016040523d82523d6000602084013e611f45565b606091505b509092509050611f586020840184612933565b6001600160a01b03167f74b56487625d598ffbf59a76c3b58fc1922f54afc86a075bad0c2a8aa05d2ad284602001358484604051611f9893929190613522565b60405180910390a281611fcf578051600003611fc75760405163764bbf1760e01b815260040160405180910390fd5b805181602001fd5b505050565b806000819003611ff757604051635fc74f2160e11b815260040160405180910390fd5b60005b818110156111115761202e84848381811061201757612017613167565b90506020028101906120299190613543565b611eca565b600101611ffa565b60008051602061358c833981519152546000805160206135ac8339815191529060005b818110156120b05782600001600084600101838154811061207c5761207c613167565b60009182526020808320909101546001600160a01b031683528201929092526040019020805460ff19169055600101612059565b506120bf6001830160006128c2565b6000600283018190556040517feb09d532980c3cc73dcad99b80e264204a667a54cbb7b63ec8d68dcb1c7096be9190a15050565b6120fb611b77565b612104826123ff565b610c118282612456565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c1c5760405163703e46dd60e11b815260040160405180910390fd5b60008051602061358c8339815191525483906000805160206135ac8339815191529060008461218f5761218a8285613476565b612191565b835b905085158061219f57508086115b156121bd5760405163aabd5a0960e01b815260040160405180910390fd5b601e8111156121df57604051630dc92ed360e11b815260040160405180910390fd5b84156122735760005b8281101561226457600084600101828154811061220757612207613167565b60009182526020808320909101546001600160a01b0316808352908790526040808320805460ff191690555190925082917fb0073c14ccc2332b5b461c0d2fb94366f38d3954a82745e74827aa0811c9f98191a2506001016121e8565b506122736001840160006128c2565b60005b8481101561239d57600089898381811061229257612292613167565b90506020020160208101906122a79190612933565b6001600160a01b03811660009081526020879052604090205490915060ff16156122e457604051631985f4ab60e31b815260040160405180910390fd5b6001600160a01b038116158061230357506001600160a01b0381163b15155b1561232157604051634501a91960e01b815260040160405180910390fd5b6001858101805480830182556000918252602080832090910180546001600160a01b0319166001600160a01b038616908117909155808352908890526040808320805460ff191690941790935591517f82b74755d483f0688b80354268454667c377a5684e64a4dbb6820fc11a6276d49190a250600101612276565b50600283018690556040518681527f78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d039060200161109b565b6000806000806123e58686612518565b9250925092506123f58282612565565b5090949350505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906124385750333014155b15610bad57604051630796d94560e01b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156124b0575060408051601f3d908101601f191682019092526124ad91810190613193565b60015b6124dd57604051634c9c8ce360e01b81526001600160a01b03831660048201526024015b60405180910390fd5b6000805160206135cc833981519152811461250e57604051632a87526960e21b8152600481018290526024016124d4565b611fcf838361261e565b600080600083516041036125525760208401516040850151606086015160001a61254488828585612674565b95509550955050505061255e565b50508151600091506002905b9250925092565b600082600381111561257957612579613563565b03612582575050565b600182600381111561259657612596613563565b036125b45760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156125c8576125c8613563565b036125e95760405163fce698f760e01b8152600481018290526024016124d4565b60038260038111156125fd576125fd613563565b03610c11576040516335e2f38360e21b8152600481018290526024016124d4565b61262782612743565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561266c57611fcf82826127a8565b610c1161281e565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156126af5750600091506003905082612739565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612703573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661272f57506000925060019150829050612739565b9250600091508190505b9450945094915050565b806001600160a01b03163b60000361277957604051634c9c8ce360e01b81526001600160a01b03821660048201526024016124d4565b6000805160206135cc83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516127c59190613579565b600060405180830381855af49150503d8060008114612800576040519150601f19603f3d011682016040523d82523d6000602084013e612805565b606091505b509150915061281585838361283d565b95945050505050565b3415611c1c5760405163b398979f60e01b815260040160405180910390fd5b6060826128525761284d82612899565b610aec565b815115801561286957506001600160a01b0384163b155b1561289257604051639996b31560e01b81526001600160a01b03851660048201526024016124d4565b5080610aec565b8051156128a95780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825590600052602060002090810190610bad91905b808211156128f057600081556001016128dc565b5090565b60006020828403121561290657600080fd5b81356001600160e01b031981168114610aec57600080fd5b6001600160a01b0381168114610bad57600080fd5b60006020828403121561294557600080fd5b8135610aec8161291e565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561298e5761298e612950565b604052919050565b600082601f8301126129a757600080fd5b81356001600160401b038111156129c0576129c0612950565b6129d3601f8201601f1916602001612966565b8181528460208386010111156129e857600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215612a1b57600080fd5b8435612a268161291e565b93506020850135612a368161291e565b92506040850135915060608501356001600160401b03811115612a5857600080fd5b612a6487828801612996565b91505092959194509250565b60008083601f840112612a8257600080fd5b5081356001600160401b03811115612a9957600080fd5b602083019150836020828501011115612ab157600080fd5b9250929050565b600080600060408486031215612acd57600080fd5b8335925060208401356001600160401b03811115612aea57600080fd5b612af686828701612a70565b9497909650939450505050565b600080600060608486031215612b1857600080fd5b83356001600160401b03811115612b2e57600080fd5b84016101208187031215612b4157600080fd5b95602085013595506040909401359392505050565b600060608284031215612b6857600080fd5b50919050565b600060208284031215612b8057600080fd5b81356001600160401b03811115612b9657600080fd5b612ba284828501612b56565b949350505050565b60008083601f840112612bbc57600080fd5b5081356001600160401b03811115612bd357600080fd5b6020830191508360208260051b8501011115612ab157600080fd5b60008060208385031215612c0157600080fd5b82356001600160401b03811115612c1757600080fd5b612c2385828601612baa565b90969095509350505050565b600060208284031215612c4157600080fd5b81356001600160c01b0381168114610aec57600080fd5b600060208284031215612c6a57600080fd5b81356001600160401b03811115612c8057600080fd5b820160c08185031215610aec57600080fd5b600060208284031215612ca457600080fd5b5035919050565b60008060408385031215612cbe57600080fd5b8235612cc98161291e565b915060208301356001600160401b03811115612ce457600080fd5b612cf085828601612996565b9150509250929050565b600080600060408486031215612d0f57600080fd5b83356001600160401b03811115612d2557600080fd5b612d3186828701612baa565b909790965060209590950135949350505050565b8015158114610bad57600080fd5b60008060008060608587031215612d6957600080fd5b84356001600160401b03811115612d7f57600080fd5b612d8b87828801612baa565b909550935050602085013591506040850135612da681612d45565b939692955090935050565b600080600080600060808688031215612dc957600080fd5b85356001600160401b038082168214612de157600080fd5b90955060208701359080821115612df757600080fd5b50612e0488828901612baa565b909550935050604086013591506060860135612e1f81612d45565b809150509295509295909350565b60008060408385031215612e4057600080fd5b8235612e4b8161291e565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b81811015612e9a5783516001600160a01b031683529284019291840191600101612e75565b50909695505050505050565b60005b83811015612ec1578181015183820152602001612ea9565b50506000910152565b60008151808452612ee2816020860160208601612ea6565b601f01601f19169290920160200192915050565b602081526000610aec6020830184612eca565b600082601f830112612f1a57600080fd5b813560206001600160401b03821115612f3557612f35612950565b8160051b612f44828201612966565b9283528481018201928281019087851115612f5e57600080fd5b83870192505b84831015612f7d57823582529183019190830190612f64565b979650505050505050565b600080600080600060a08688031215612fa057600080fd5b8535612fab8161291e565b94506020860135612fbb8161291e565b935060408601356001600160401b0380821115612fd757600080fd5b612fe389838a01612f09565b94506060880135915080821115612ff957600080fd5b61300589838a01612f09565b9350608088013591508082111561301b57600080fd5b5061302888828901612996565b9150509295509295909350565b60008060006040848603121561304a57600080fd5b83356001600160401b038082111561306157600080fd5b61306d87838801612a70565b9095509350602086013591508082111561308657600080fd5b5061309386828701612b56565b9150509250925092565b600080604083850312156130b057600080fd5b82356130bb8161291e565b915060208301356130cb8161291e565b809150509250929050565b600080600080600060a086880312156130ee57600080fd5b85356130f98161291e565b945060208601356131098161291e565b9350604086013592506060860135915060808601356001600160401b0381111561313257600080fd5b61302888828901612996565b634e487b7160e01b600052601160045260246000fd5b8181038181111561088f5761088f61313e565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6000602082840312156131a557600080fd5b5051919050565b6000808335601e198436030181126131c357600080fd5b83016020810192503590506001600160401b038111156131e257600080fd5b803603821315612ab157600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b888110156132cd57858403601f19018a52823536899003605e19018112613259578283fd5b8801606081356132688161291e565b6001600160a01b0316865261327f828801836131ac565b828989015261329183890182846131f1565b9250505060406132a3818401846131ac565b9350878303828901526132b78385836131f1565b9d89019d97505050938601935050600101613234565b509198975050505050505050565b60208152600082356132ec8161291e565b6001600160a01b039081166020848101919091528401359061330d8261291e565b80821660408501525050604083013560608301526060830135601e1984360301811261333857600080fd5b83016020810190356001600160401b0381111561335457600080fd5b8060051b360382131561336657600080fd5b60c0608085015261337b60e08501828461321a565b915050608084013560a084015261339560a08501856131ac565b848303601f190160c08601526133ac8382846131f1565b9695505050505050565b6000602082840312156133c857600080fd5b8151610aec81612d45565b6040815260006133e76040830185876131f1565b828103602084015283356133fa8161291e565b6001600160a01b031681526020848101359082015261341c60408501856131ac565b606060408401526134316060840182846131f1565b98975050505050505050565b808202811582820484141761088f5761088f61313e565b60008261347157634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561088f5761088f61313e565b6000808585111561349957600080fd5b838611156134a657600080fd5b5050820193919092039150565b6000600182016134c5576134c561313e565b5060010190565b6000808335601e198436030181126134e357600080fd5b8301803591506001600160401b038211156134fd57600080fd5b602001915036819003821315612ab157600080fd5b8183823760009101908152919050565b83815282151560208201526060604082015260006128156060830184612eca565b60008235605e1983360301811261355957600080fd5b9190910192915050565b634e487b7160e01b600052602160045260246000fd5b60008251613559818460208701612ea656feb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c01b005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212207f3a1345dd207b3e6a7d8045651ded34698ad5d76b8ff402fdacf6337782f2f664736f6c63430008170033000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d780000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x1", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x52f172baddfaafd435471660a66251136db08eb325518538c60a8dcb5b86c7d0", + "transactionType": "CREATE2", + "contractName": "HybridDeleGator", + "contractAddress": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "function": null, + "arguments": [ + "0xbe4138886cB096bDC1B930F2f0ca7892AA234D78", + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x62d183", + "value": "0x0", + "input": "0x44656c654761746f72000000000000000000000000000000000000000000000060e0604052306080523480156200001557600080fd5b50604051620051483803806200514883398101604081905262000038916200018b565b818162000044620000c1565b6001600160a01b0380831660a081905290821660c0526040517fb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d90600090a26040516001600160a01b038216907fee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a9990600090a250505050620001ca565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620001125760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001725780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b03811681146200017257600080fd5b600080604083850312156200019f57600080fd5b8251620001ac8162000175565b6020840151909250620001bf8162000175565b809150509250929050565b60805160a05160c051614e83620002c5600039600081816105e9015281816107f3015281816108a1015281816109c501528181610a4601528181610ac401528181610c2901528181610cde01528181610d6501528181610dfe01528181610eea01528181610fa50152818161101701528181611082015281816112c401528181611343015281816113c00152818161147f015281816116c4015281816117b501526124480152600081816107290152818161090701528181610b2701528181610baa01528181610c8c01528181610dbc015281816110e50152611727015260008181611a9b01528181611ac401526120b50152614e836000f3fe60806040526004361061023f5760003560e01c80637f07bfdc1161012e578063c399ec88116100ab578063e1520f541161006f578063e1520f54146106f7578063ea4d3c9b14610717578063f23a6e611461074b578063f2fde38b1461076b578063ffa1ad741461078b57600080fd5b8063c399ec8814610658578063c8561e731461066d578063d087d2881461068d578063d37aec92146106a2578063d5d33b55146106d757600080fd5b8063aaf10f42116100f2578063aaf10f4214610584578063ad3cb1cc14610599578063b0d691fe146105d7578063b3c650151461060b578063bc197c811461063857600080fd5b80637f07bfdc146104d25780637fade287146104f25780638da5cb5b146105125780638ebf953314610551578063a24c8f321461057157600080fd5b80633ed01015116101bc57806352d1902d1161018057806352d1902d146104485780635c1c6dcd1461045d5780636af1f3991461047d578063715018a61461049d57806378a68ecf146104b257600080fd5b80633ed01015146103cd578063445140b8146103ed578063499340471461040d5780634a58db191461042d5780634f1ef2861461043557600080fd5b80631c03010a116102035780631c03010a1461032957806326f0aef71461034b5780632ffeaad61461036b57806334fcd5be1461038d5780633e1b0812146103ad57600080fd5b806301ffc9a71461024b578063074feff314610280578063150b7a02146102a25780631626ba7e146102db57806319822f7c146102fb57600080fd5b3661024657005b600080fd5b34801561025757600080fd5b5061026b610266366004613e92565b6107bc565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102a061029b366004613f27565b6107e8565b005b3480156102ae57600080fd5b506102c26102bd366004614096565b610859565b6040516001600160e01b03199091168152602001610277565b3480156102e757600080fd5b506102c26102f6366004614142565b610875565b34801561030757600080fd5b5061031b61031636600461418d565b610894565b604051908152602001610277565b34801561033557600080fd5b50600080516020614dae8339815191525461031b565b34801561035757600080fd5b506102a06103663660046141f8565b6108fc565b34801561037757600080fd5b50610380610951565b604051610277919061422c565b34801561039957600080fd5b506102a06103a8366004614264565b6109ba565b3480156103b957600080fd5b5061031b6103c83660046142a5565b610a1f565b3480156103d957600080fd5b506102a06103e83660046142ce565b610ab9565b3480156103f957600080fd5b5061026b610408366004614308565b610b91565b34801561041957600080fd5b506102a06104283660046142ce565b610c1e565b6102a0610cc1565b6102a0610443366004614321565b610d2b565b34801561045457600080fd5b5061031b610d3d565b34801561046957600080fd5b506102a06104783660046141f8565b610d5a565b34801561048957600080fd5b5061026b610498366004614308565b610da3565b3480156104a957600080fd5b506102a0610df3565b3480156104be57600080fd5b506102a06104cd366004614389565b610e56565b3480156104de57600080fd5b506102a06104ed36600461445b565b610f9a565b3480156104fe57600080fd5b506102a061050d3660046142ce565b611077565b34801561051e57600080fd5b50600080516020614d8e833981519152546001600160a01b03165b6040516001600160a01b039091168152602001610277565b34801561055d57600080fd5b506102a061056c366004613f27565b61111a565b6102a061057f366004614321565b610d33565b34801561059057600080fd5b50610539611236565b3480156105a557600080fd5b506105ca604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161027791906144d7565b3480156105e357600080fd5b506105397f000000000000000000000000000000000000000000000000000000000000000081565b34801561061757600080fd5b5061062061125c565b6040516001600160401b039091168152602001610277565b34801561064457600080fd5b506102c2610653366004614569565b61128f565b34801561066457600080fd5b5061031b6112ac565b34801561067957600080fd5b506102a0610688366004614616565b611338565b34801561069957600080fd5b5061031b6113a1565b3480156106ae57600080fd5b506106c26106bd366004614666565b6113f7565b60408051928352602083019190915201610277565b3480156106e357600080fd5b506102a06106f2366004614666565b611474565b34801561070357600080fd5b506102a061071236600461469b565b6116b9565b34801561072357600080fd5b506105397f000000000000000000000000000000000000000000000000000000000000000081565b34801561075757600080fd5b506102c2610766366004614703565b61178e565b34801561077757600080fd5b506102a061078636600461476b565b6117aa565b34801561079757600080fd5b506105ca604051806040016040528060058152602001640312e302e360dc1b81525081565b60006107c78261180a565b806107e257506001600160e01b031982166307f5828d60e41b145b92915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906108215750333014155b1561083f57604051630796d94560e01b815260040160405180910390fd5b61085087878787878787600161189a565b50505050505050565b6000610863611a90565b50630a85bd0160e11b5b949350505050565b600061087f611a90565b61088a848484611b35565b90505b9392505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108df57604051636b31ba1560e11b815260040160405180910390fd5b6108e7611a90565b6108f18484611d59565b905061088d82611dcf565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094557604051630692ce8160e21b815260040160405180910390fd5b61094e81611e66565b50565b60606000600080516020614d8e833981519152600281018054604080516020808402820181019092528281529394508301828280156109af57602002820191906000526020600020905b81548152602001906001019080831161099b575b505050505091505090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906109f35750333014155b15610a1157604051630796d94560e01b815260040160405180910390fd5b610a1b8282611f70565b5050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610a95573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e29190614788565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610af25750333014155b15610b1057604051630796d94560e01b815260040160405180910390fd5b604051633ed0101560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633ed0101590610b5c9084906004016148d0565b600060405180830381600087803b158015610b7657600080fd5b505af1158015610b8a573d6000803e3d6000fd5b5050505050565b6040516316a0682960e11b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632d40d052906024015b602060405180830381865afa158015610bfa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e291906149ac565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610c575750333014155b15610c7557604051630796d94560e01b815260040160405180910390fd5b604051634993404760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634993404790610b5c9084906004016148d0565b610cc9611a90565b60405163b760faf960e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b158015610b7657600080fd5b610d33611fd2565b610a1b828261208f565b6000610d476120aa565b50600080516020614dee83398151915290565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094557604051636b31ba1560e11b815260040160405180910390fd5b604051635daa653960e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635daa653990602401610bdd565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610e2c5750333014155b15610e4a57604051630796d94560e01b815260040160405180910390fd5b610e5460006120f3565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460ff8b81169291600160401b90041680610ea0575080546001600160401b03808416911610155b15610ebe5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610f185750333014155b15610f3657604051630796d94560e01b815260040160405180910390fd5b610f468a8a8a8a8a8a8a8a61189a565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15050505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610fd35750333014155b15610ff157604051630796d94560e01b815260040160405180910390fd5b60405163040b850f60e31b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561105b57600080fd5b505af115801561106f573d6000803e3d6000fd5b505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110b05750333014155b156110ce57604051630796d94560e01b815260040160405180910390fd5b604051637fade28760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637fade28790610b5c9084906004016148d0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b031660008115801561115f5750825b90506000826001600160401b0316600114801561117b5750303b155b905081158015611189575080155b156111a75760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156111d157845460ff60401b1916600160401b1785555b6111e28c8c8c8c8c8c8c600061189a565b831561122857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b6000611257600080516020614dee833981519152546001600160a01b031690565b905090565b60006112577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00546001600160401b031690565b6000611299611a90565b5063bc197c8160e01b5b95945050505050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a08231906024015b602060405180830381865afa158015611314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112579190614788565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906113715750333014155b1561138f57604051630796d94560e01b815260040160405180910390fd5b61139b84848484612195565b50505050565b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a906044016112f7565b60008080600080516020614d8e8339815191529050600081600101600087876040516020016114279291906149c9565b60408051601f198184030181529181528151602092830120835282820193909352908201600020825180840190935280548084526001909101549290910182905297909650945050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906114ad5750333014155b156114cb57604051630796d94560e01b815260040160405180910390fd5b604051600080516020614d8e833981519152906000906114f190859085906020016149c9565b60408051601f19818403018152828252805160209182012060008181526001808801845290849020858501909452835480865293015491840182905293508115801561153b575080155b1561156157604051631a36430d60e31b8152600481018590526024015b60405180910390fd5b600285015460018114801561157e575085546001600160a01b0316155b1561159c5760405163c4c8547360e01b815260040160405180910390fd5b60005b6115aa6001836149ef565b81101561162f57858760020182815481106115c7576115c7614a02565b90600052602060002001540361162757600287016115e66001846149ef565b815481106115f6576115f6614a02565b906000526020600020015487600201828154811061161657611616614a02565b60009182526020909120015561162f565b60010161159f565b508560020180548061164357611643614a18565b60008281526020808220830160001990810183905590920190925586825260018881018252604080842084815590910192909255815185815290810184905286917facf0e8088062f44f734bbcb5223794fd8bb6f6db1c199cb6a72df119d002a71b910160405180910390a25050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906116f25750333014155b1561171057604051630796d94560e01b815260040160405180910390fd5b60405163385483d560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e1520f549061176090869086908690600401614a2e565b600060405180830381600087803b15801561177a57600080fd5b505af1158015610850573d6000803e3d6000fd5b6000611798611a90565b5063f23a6e6160e01b95945050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906117e35750333014155b1561180157604051630796d94560e01b815260040160405180910390fd5b61094e816120f3565b6000611814611a90565b6001600160e01b031982166326f0aef760e01b148061184357506001600160e01b03198216630a85bd0160e11b145b8061185e57506001600160e01b03198216630271189760e51b145b8061187957506001600160e01b031982166301ffc9a760e01b145b806107e2575050630b135d3f60e11b6001600160e01b03198216145b919050565b856001600160a01b0389161580156118b0575080155b80156118b95750815b156118d7576040516312da594d60e11b815260040160405180910390fd5b80851415806118e65750808314155b156119155760405163a297991b60e01b8152600481018290526024810186905260448101849052606401611558565b8115611a0a57600080516020614dae83398151915254600080516020614d8e833981519152908015611a075760005b818110156119f857600083600201828154811061196357611963614a02565b6000918252602080832090910154808352600180880180845260408086208151808301835281548152938101805485880190815286895293909652869055949093558051925193519194509284927facf0e8088062f44f734bbcb5223794fd8bb6f6db1c199cb6a72df119d002a71b926119e69290918252602082015260400190565b60405180910390a25050600101611944565b50611a07600283016000613e60565b50505b60005b81811015611a7b57611a73898983818110611a2a57611a2a614a02565b9050602002810190611a3c9190614a8c565b898985818110611a4e57611a4e614a02565b90506020020135888886818110611a6757611a67614a02565b90506020020135612195565b600101611a0d565b50611a85896120f3565b505050505050505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611b1757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611b0b600080516020614dee833981519152546001600160a01b031690565b6001600160a01b031614155b15610e545760405163703e46dd60e11b815260040160405180910390fd5b6000816041819003611bd257600080516020614d8e833981519152546001600160a01b03166001600160a01b0316611ba38686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061231292505050565b6001600160a01b031603611bc15750630b135d3f60e11b905061088d565b506001600160e01b0319905061088d565b6060811015611bec57506001600160e01b0319905061088d565b600080516020614d8e8339815191526000611c0a6020828789614ad2565b611c1391614afc565b600081815260018085016020908152604092839020835180850190945280548085529201549083015291925090158015611c4f57506020810151155b15611c6957506001600160e01b0319935061088d92505050565b836060148015611cbd5750611cbd8888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505085516020870151909250905061233c565b15611cd65750630b135d3f60e11b935061088d92505050565b83606014158015611d2b5750611d2b8888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508551602087015190925090506123da565b15611d445750630b135d3f60e11b935061088d92505050565b506001600160e01b0319935061088d92505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c829052603c81208190611da190611d9c610100870187614a8c565b611b35565b90506374eca2c160e11b6001600160e01b0319821601611dc55760009150506107e2565b5060019392505050565b801561094e57604051600090339060001990849084818181858888f193505050503d8060008114611e1c576040519150601f19603f3d011682016040523d82523d6000602084013e611e21565b606091505b505060408051848152821515602082015291925033917fa427c7d47f24d01b170779a7600b1d4c0d7cdbabaa0f19c4f0e6182053ffc931910160405180910390a25050565b600080611e76602084018461476b565b6001600160a01b03166020840135611e916040860186614a8c565b604051611e9f9291906149c9565b60006040518083038185875af1925050503d8060008114611edc576040519150601f19603f3d011682016040523d82523d6000602084013e611ee1565b606091505b509092509050611ef4602084018461476b565b6001600160a01b03167f74b56487625d598ffbf59a76c3b58fc1922f54afc86a075bad0c2a8aa05d2ad284602001358484604051611f3493929190614b1a565b60405180910390a281611f6b578051600003611f635760405163764bbf1760e01b815260040160405180910390fd5b805181602001fd5b505050565b806000819003611f9357604051635fc74f2160e11b815260040160405180910390fd5b60005b8181101561139b57611fca848483818110611fb357611fb3614a02565b9050602002810190611fc59190614b3b565b611e66565b600101611f96565b600080516020614dae83398151915254600080516020614d8e8339815191529060005b818110156120455782600101600084600201838154811061201857612018614a02565b60009182526020808320909101548352820192909252604001812081815560019081019190915501611ff5565b50612054600283016000613e60565b81546001600160a01b03191682556040517feb09d532980c3cc73dcad99b80e264204a667a54cbb7b63ec8d68dcb1c7096be90600090a15050565b612097611a90565b6120a08261243d565b610a1b8282612494565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e545760405163703e46dd60e11b815260040160405180910390fd5b600080516020614dae83398151915254600080516020614d8e8339815191529015801561212757506001600160a01b038216155b156121455760405163c4c8547360e01b815260040160405180910390fd5b80546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b61219f8282612551565b6121c6576040516313c3d61f60e01b81526004810183905260248101829052604401611558565b600084846040516020016121db9291906149c9565b6040516020818303038152906040528051906020012090508484905060000361221757604051637e25658160e11b815260040160405180910390fd5b60008181527fa2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694901602052604090208054600080516020614d8e83398151915291901515806122675750600181015415155b15612288576040516361db108160e01b815260048101849052602401611558565b604080518082018252868152602080820187815260008781526001808801845285822094518555915193820193909355600286018054918201815583529120018490555183907fd00539cb08a7c24166308150d64d603150c01baf89d3d3e4c6063d6db7c6983d90612301908a908a908a908a90614b5b565b60405180910390a250505050505050565b600080600080612322868661255d565b92509250925061233282826125aa565b5090949350505050565b600080600061234a86612663565b91509150600060028860405160200161236591815260200190565b60408051601f198184030181529082905261237f91614b82565b602060405180830381855afa15801561239c573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906123bf9190614788565b90506123ce8184848989612685565b98975050505050505050565b6000806123e685612793565b9050612433866040516020016123fe91815260200190565b60408051601f198184030181529181528301516060840151608085015160a086015160c0870151875160208901518c8c612811565b9695505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906124765750333014155b1561094e57604051630796d94560e01b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156124ee575060408051601f3d908101601f191682019092526124eb91810190614788565b60015b61251657604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611558565b600080516020614dee833981519152811461254757604051632a87526960e21b815260048101829052602401611558565b611f6b83836129b1565b600061088d8383612a07565b600080600083516041036125975760208401516040850151606086015160001a61258988828585612b01565b9550955095505050506125a3565b50508151600091506002905b9250925092565b60008260038111156125be576125be614b94565b036125c7575050565b60018260038111156125db576125db614b94565b036125f95760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561260d5761260d614b94565b0361262e5760405163fce698f760e01b815260048101829052602401611558565b600382600381111561264257612642614b94565b03610a1b576040516335e2f38360e21b815260048101829052602401611558565b6000808280602001905181019061267a9190614baa565b909590945092505050565b60006126a06002600080516020614dce833981519152614bd8565b8411156126af575060006112a3565b6040805160208101889052908101869052606081018590526080810184905260a0810183905260009060c00160405160208183030381529060405290506000806101006001600160a01b0316836040516127099190614b82565b600060405180830381855afa9150503d8060008114612744576040519150601f19603f3d011682016040523d82523d6000602084013e612749565b606091505b50915091508115612779578080602001905181019061276891906149ac565b1515600115151493505050506112a3565b6127868989898989612bd0565b9998505050505050505050565b6127d56040518060e001604052806000815260200160008152602001606081526020016000151581526020016060815260200160608152602001600081525090565b818060200190518101906127e99190614c3f565b60c089015260a088015260808701521515606086015260408501526020840152825250919050565b600060258a51108061284b57506128498a60208151811061283457612834614a02565b01602001516001600160f81b0319168a612cb3565b155b15612858575060006129a3565b6000886128648d612d19565b8960405160200161287793929190614cfe565b60408051601f198184030181528282019091526015825274113a3cb832911d113bb2b130baba34371733b2ba1160591b602083015291506128b981838a612f26565b6128c8576000925050506129a3565b60006002836040516128da9190614b82565b602060405180830381855afa1580156128f7573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061291a9190614788565b9050600060028e83604051602001612933929190614d41565b60408051601f198184030181529082905261294d91614b82565b602060405180830381855afa15801561296a573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061298d9190614788565b905061299c818a8a8a8a612685565b9450505050505b9a9950505050505050505050565b6129ba82612fd5565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156129ff57611f6b828261303a565b610a1b6130a7565b600082158015612a15575081155b80612a2d5750600160601b63ffffffff60c01b031983145b80612a455750600160601b63ffffffff60c01b031982145b15612a52575060006107e2565b6000600160601b63ffffffff60c01b031983840990506000600160601b63ffffffff60c01b0319807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc8709600160601b63ffffffff60c01b031987600160601b63ffffffff60c01b0319898a0909089050600160601b63ffffffff60c01b03197f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b820891909114949350505050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612b3c5750600091506003905082612bc6565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612b90573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612bbc57506000925060019150829050612bc6565b9250600091508190505b9450945094915050565b6000841580612bed5750600080516020614dce8339815191528510155b80612bf6575083155b80612c0f5750600080516020614dce8339815191528410155b15612c1c575060006112a3565b612c268383612a07565b612c32575060006112a3565b6000612c3d856130c6565b90506000600080516020614dce83398151915282890990506000600080516020614dce83398151915283890990506000612c7987878585613138565b9050600080516020614dce833981519152612ca28a600080516020614dce8339815191526149ef565b8208159a9950505050505050505050565b6000600160f81b83811614612cca575060006107e2565b818015612cdd5750600160fa1b83811614155b15612cea575060006107e2565b600160fb1b83811614612d1057600f60fc1b600160fc1b841601612d10575060006107e2565b50600192915050565b60606000612d2683613800565b90506000819050600060028251118015612d7157508160028351612d4a91906149ef565b81518110612d5a57612d5a614a02565b6020910101516001600160f81b031916603d60f81b145b15612d7e57506002612dc9565b60018251118015612dc057508160018351612d9991906149ef565b81518110612da957612da9614a02565b6020910101516001600160f81b031916603d60f81b145b15612dc9575060015b6000818351612dd891906149ef565b90506000816001600160401b03811115612df457612df4613fd3565b6040519080825280601f01601f191660200182016040528015612e1e576020820181803683370190505b50905060005b82811015612f1b57848181518110612e3e57612e3e614a02565b01602001516001600160f81b031916602b60f81b03612e8a57602d60f81b828281518110612e6e57612e6e614a02565b60200101906001600160f81b031916908160001a905350612f13565b848181518110612e9c57612e9c614a02565b01602001516001600160f81b031916602f60f81b03612ecc57605f60f81b828281518110612e6e57612e6e614a02565b848181518110612ede57612ede614a02565b602001015160f81c60f81b828281518110612efb57612efb614a02565b60200101906001600160f81b031916908160001a9053505b600101612e24565b509695505050505050565b825182516000918591859190845b82811015612fc65781612f478289614d63565b10612f5a5760009550505050505061088d565b83612f658289614d63565b81518110612f7557612f75614a02565b602001015160f81c60f81b6001600160f81b031916858281518110612f9c57612f9c614a02565b01602001516001600160f81b03191614612fbe5760009550505050505061088d565b600101612f34565b50600198975050505050505050565b806001600160a01b03163b60000361300b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611558565b600080516020614dee83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516130579190614b82565b600060405180830381855af49150503d8060008114613092576040519150601f19603f3d011682016040523d82523d6000602084013e613097565b606091505b50915091506112a3858383613826565b3415610e545760405163b398979f60e01b815260040160405180910390fd5b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f6080820152600080516020614dce83398151915260a082015260208160c0836005600019fa61313157600080fd5b5192915050565b600080808060ff81808815801561314d575087155b15613161576000965050505050505061086d565b6131ad7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d613882565b9092509050811580156131be575080155b156131ec57600080516020614dce83398151915288600080516020614dce833981519152038a089850600097505b600189841c16600189851c1660011b015b8061321f5760018403935060018a851c1660018a861c1660011b0190506131fd565b50600189841c16600189851c1660011b01955060018603613281577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603613290578a96508993505b6003860361329f578196508093505b60018303925060019550600194505b82600019111561378357600160601b63ffffffff60c01b031984600209600160601b63ffffffff60c01b0319818209600160601b63ffffffff60c01b0319818a09600160601b63ffffffff60c01b03198284099250600160601b63ffffffff60c01b031980600160601b63ffffffff60c01b03198b8d08600160601b63ffffffff60c01b03198c600160601b63ffffffff60c01b0319038e0809600309600160601b63ffffffff60c01b03198985099850600160601b63ffffffff60c01b03198a84099950600160601b63ffffffff60c01b031980836002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319838409089a50600160601b63ffffffff60c01b03198083600160601b63ffffffff60c01b0319038d0882099250600160601b63ffffffff60c01b031983600160601b63ffffffff60c01b03198a870908975060018d881c1660018d891c1660011b0190508061342b5787600160601b63ffffffff60c01b031903975050505050613778565b6001810361347a577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103613489578e93508d92505b60038103613498578593508492505b896134b157509198506001975087965094506137789050565b600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b03198b860908600160601b63ffffffff60c01b03198c600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b03198d88090893508061366a578361366a57600160601b63ffffffff60c01b0319896002600160601b0363ffffffff60c01b0319099450600160601b63ffffffff60c01b03198586099350600160601b63ffffffff60c01b0319848d099250600160601b63ffffffff60c01b03198486099450600160601b63ffffffff60c01b0319808c600160601b63ffffffff60c01b0319038e08600160601b63ffffffff60c01b03198d8f08099050600160601b63ffffffff60c01b0319816003099150600160601b63ffffffff60c01b03198a86099950600160601b63ffffffff60c01b03198b85099a50600160601b63ffffffff60c01b031980846002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319848509089b50600160601b63ffffffff60c01b0319808d600160601b63ffffffff60c01b031903850883099350600160601b63ffffffff60c01b0319808a8709850898505050505050613778565b600160601b63ffffffff60c01b03198485099150600160601b63ffffffff60c01b0319848309600160601b63ffffffff60c01b0319838d099b50600160601b63ffffffff60c01b0319818c099a50600160601b63ffffffff60c01b0319838e09600160601b63ffffffff60c01b031980826002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b031984600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b031987880908089350600160601b63ffffffff60c01b031980838d09600160601b63ffffffff60c01b031985600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b031903860809089a50505050809a50505050505b6001830392506132ae565b60405186606082015260208152602080820152602060408201526002600160601b0363ffffffff60c01b03196080820152600160601b63ffffffff60c01b031960a082015260208160c0836005600019fa6137dd57600080fd5b600160601b63ffffffff60c01b0319815189099c9b505050505050505050505050565b60606107e282604051806060016040528060408152602001614e0e604091396001613910565b60608261383b5761383682613a8f565b61088d565b815115801561385257506001600160a01b0384163b155b1561387b57604051639996b31560e01b81526001600160a01b0385166004820152602401611558565b508061088d565b600080808086613899578585935093505050613907565b846138ab578787935093505050613907565b85881480156138b957508487145b156138da576138cb8888600180613ab8565b929a50909850925090506138f4565b6138e988886001808a8a613c13565b929a50909850925090505b61390088888484613d97565b9350935050505b94509492505050565b60608351600003613930575060408051602081019091526000815261088d565b600082613961576003855160046139479190614d76565b613952906002614d63565b61395c9190614bd8565b613986565b6003855160026139719190614d63565b61397b9190614bd8565b613986906004614d76565b90506000816001600160401b038111156139a2576139a2613fd3565b6040519080825280601f01601f1916602001820160405280156139cc576020820181803683370190505b50905060018501602082018788518901602081018051600082525b82841015613a42576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f81168701518653506001850194506139e7565b905250508515613a8357600388510660018114613a665760028114613a7957613a81565b603d6001830353603d6002830353613a81565b603d60018303535b505b50909695505050505050565b805115613a9f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080600080600160601b63ffffffff60c01b0319876002099350600160601b63ffffffff60c01b03198485099150600160601b63ffffffff60c01b03198289099050600160601b63ffffffff60c01b03198285099250600160601b63ffffffff60c01b03198683099150600160601b63ffffffff60c01b031980600160601b63ffffffff60c01b0319888b08600160601b63ffffffff60c01b031989600160601b63ffffffff60c01b0319038c08096003099550600160601b63ffffffff60c01b031980826002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b0319888909089350600160601b63ffffffff60c01b03198085600160601b63ffffffff60c01b031903830887099750600160601b63ffffffff60c01b03198584099050600160601b63ffffffff60c01b031980888509600160601b63ffffffff60c01b03190389089250945094509450949050565b60008060008088600003613c3257508492508391506001905080613d8a565b600160601b63ffffffff60c01b0319988903988981898809089450600160601b63ffffffff60c01b03198a600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b03198a8909089550600160601b63ffffffff60c01b03198687099350600160601b63ffffffff60c01b03198685099250600160601b63ffffffff60c01b03198489099150600160601b63ffffffff60c01b03198388099050600160601b63ffffffff60c01b0319848b099750600160601b63ffffffff60c01b031980896002600160601b0363ffffffff60c01b031909600160601b63ffffffff60c01b031985600160601b63ffffffff60c01b031903600160601b63ffffffff60c01b0319898a0908089350600160601b63ffffffff60c01b031980848b09600160601b63ffffffff60c01b031987600160601b63ffffffff60c01b031988600160601b63ffffffff60c01b0319038d08090892505b9650965096509692505050565b6000806000613da584613e04565b9050600160601b63ffffffff60c01b031981870991506000600160601b63ffffffff60c01b03198287099050600160601b63ffffffff60c01b03198182099150600160601b63ffffffff60c01b03198289099350505094509492505050565b600060405160208152602080820152602060408201528260608201526002600160601b0363ffffffff60c01b03196080820152600160601b63ffffffff60c01b031960a082015260208160c0836005600019fa61313157600080fd5b508054600082559060005260206000209081019061094e91905b80821115613e8e5760008155600101613e7a565b5090565b600060208284031215613ea457600080fd5b81356001600160e01b03198116811461088d57600080fd5b6001600160a01b038116811461094e57600080fd5b803561189581613ebc565b60008083601f840112613eee57600080fd5b5081356001600160401b03811115613f0557600080fd5b6020830191508360208260051b8501011115613f2057600080fd5b9250929050565b60008060008060008060006080888a031215613f4257600080fd5b8735613f4d81613ebc565b965060208801356001600160401b0380821115613f6957600080fd5b613f758b838c01613edc565b909850965060408a0135915080821115613f8e57600080fd5b613f9a8b838c01613edc565b909650945060608a0135915080821115613fb357600080fd5b50613fc08a828b01613edc565b989b979a50959850939692959293505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561401157614011613fd3565b604052919050565b60006001600160401b0382111561403257614032613fd3565b50601f01601f191660200190565b600082601f83011261405157600080fd5b813561406461405f82614019565b613fe9565b81815284602083860101111561407957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156140ac57600080fd5b84356140b781613ebc565b935060208501356140c781613ebc565b92506040850135915060608501356001600160401b038111156140e957600080fd5b6140f587828801614040565b91505092959194509250565b60008083601f84011261411357600080fd5b5081356001600160401b0381111561412a57600080fd5b602083019150836020828501011115613f2057600080fd5b60008060006040848603121561415757600080fd5b8335925060208401356001600160401b0381111561417457600080fd5b61418086828701614101565b9497909650939450505050565b6000806000606084860312156141a257600080fd5b83356001600160401b038111156141b857600080fd5b840161012081870312156141cb57600080fd5b95602085013595506040909401359392505050565b6000606082840312156141f257600080fd5b50919050565b60006020828403121561420a57600080fd5b81356001600160401b0381111561422057600080fd5b61086d848285016141e0565b6020808252825182820181905260009190848201906040850190845b81811015613a8357835183529284019291840191600101614248565b6000806020838503121561427757600080fd5b82356001600160401b0381111561428d57600080fd5b61429985828601613edc565b90969095509350505050565b6000602082840312156142b757600080fd5b81356001600160c01b038116811461088d57600080fd5b6000602082840312156142e057600080fd5b81356001600160401b038111156142f657600080fd5b820160c0818503121561088d57600080fd5b60006020828403121561431a57600080fd5b5035919050565b6000806040838503121561433457600080fd5b823561433f81613ebc565b915060208301356001600160401b0381111561435a57600080fd5b61436685828601614040565b9150509250929050565b801515811461094e57600080fd5b803561189581614370565b600080600080600080600080600060c08a8c0312156143a757600080fd5b893560ff811681146143b857600080fd5b98506143c660208b01613ed1565b975060408a01356001600160401b03808211156143e257600080fd5b6143ee8d838e01613edc565b909950975060608c013591508082111561440757600080fd5b6144138d838e01613edc565b909750955060808c013591508082111561442c57600080fd5b506144398c828d01613edc565b909450925061444c905060a08b0161437e565b90509295985092959850929598565b6000806040838503121561446e57600080fd5b823561447981613ebc565b946020939093013593505050565b60005b838110156144a257818101518382015260200161448a565b50506000910152565b600081518084526144c3816020860160208601614487565b601f01601f19169290920160200192915050565b60208152600061088d60208301846144ab565b600082601f8301126144fb57600080fd5b813560206001600160401b0382111561451657614516613fd3565b8160051b614525828201613fe9565b928352848101820192828101908785111561453f57600080fd5b83870192505b8483101561455e57823582529183019190830190614545565b979650505050505050565b600080600080600060a0868803121561458157600080fd5b853561458c81613ebc565b9450602086013561459c81613ebc565b935060408601356001600160401b03808211156145b857600080fd5b6145c489838a016144ea565b945060608801359150808211156145da57600080fd5b6145e689838a016144ea565b935060808801359150808211156145fc57600080fd5b5061460988828901614040565b9150509295509295909350565b6000806000806060858703121561462c57600080fd5b84356001600160401b0381111561464257600080fd5b61464e87828801614101565b90989097506020870135966040013595509350505050565b6000806020838503121561467957600080fd5b82356001600160401b0381111561468f57600080fd5b61429985828601614101565b6000806000604084860312156146b057600080fd5b83356001600160401b03808211156146c757600080fd5b6146d387838801614101565b909550935060208601359150808211156146ec57600080fd5b506146f9868287016141e0565b9150509250925092565b600080600080600060a0868803121561471b57600080fd5b853561472681613ebc565b9450602086013561473681613ebc565b9350604086013592506060860135915060808601356001600160401b0381111561475f57600080fd5b61460988828901614040565b60006020828403121561477d57600080fd5b813561088d81613ebc565b60006020828403121561479a57600080fd5b5051919050565b6000808335601e198436030181126147b857600080fd5b83016020810192503590506001600160401b038111156147d757600080fd5b803603821315613f2057600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008383855260208086019550808560051b830101846000805b888110156148c257858403601f19018a52823536899003605e1901811261484e578283fd5b88016060813561485d81613ebc565b6001600160a01b03168652614874828801836147a1565b828989015261488683890182846147e6565b925050506040614898818401846147a1565b9350878303828901526148ac8385836147e6565b9d89019d97505050938601935050600101614829565b509198975050505050505050565b60208152600082356148e181613ebc565b6001600160a01b039081166020848101919091528401359061490282613ebc565b80821660408501525050604083013560608301526060830135601e1984360301811261492d57600080fd5b83016020810190356001600160401b0381111561494957600080fd5b8060051b360382131561495b57600080fd5b60c0608085015261497060e08501828461480f565b915050608084013560a084015261498a60a08501856147a1565b848303601f190160c08601526124338382846147e6565b805161189581614370565b6000602082840312156149be57600080fd5b815161088d81614370565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156107e2576107e26149d9565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b604081526000614a426040830185876147e6565b82810360208401528335614a5581613ebc565b6001600160a01b0316815260208481013590820152614a7760408501856147a1565b606060408401526123ce6060840182846147e6565b6000808335601e19843603018112614aa357600080fd5b8301803591506001600160401b03821115614abd57600080fd5b602001915036819003821315613f2057600080fd5b60008085851115614ae257600080fd5b83861115614aef57600080fd5b5050820193919092039150565b803560208310156107e257600019602084900360031b1b1692915050565b83815282151560208201526060604082015260006112a360608301846144ab565b60008235605e19833603018112614b5157600080fd5b9190910192915050565b606081526000614b6f6060830186886147e6565b6020830194909452506040015292915050565b60008251614b51818460208701614487565b634e487b7160e01b600052602160045260246000fd5b600080600060608486031215614bbf57600080fd5b8351925060208401519150604084015190509250925092565b600082614bf557634e487b7160e01b600052601260045260246000fd5b500490565b600082601f830112614c0b57600080fd5b8151614c1961405f82614019565b818152846020838601011115614c2e57600080fd5b61086d826020830160208701614487565b600080600080600080600080610100898b031215614c5c57600080fd5b88519750602089015196506040890151955060608901516001600160401b0380821115614c8857600080fd5b614c948c838d01614bfa565b9650614ca260808c016149a1565b955060a08b0151915080821115614cb857600080fd5b614cc48c838d01614bfa565b945060c08b0151915080821115614cda57600080fd5b50614ce78b828c01614bfa565b92505060e089015190509295985092959890939650565b60008451614d10818460208901614487565b845190830190614d24818360208901614487565b8451910190614d37818360208801614487565b0195945050505050565b60008351614d53818460208801614487565b9190910191825250602001919050565b808201808211156107e2576107e26149d9565b80820281158282048414176107e2576107e26149d956fea2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694900a2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694902ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212208ea6494b631dfbdfca458a1c0a52311f1cf61e8c8eacea1ff8b3b6e773897baa64736f6c63430008170033000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d780000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x2", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x1373945eb263363a9cbb20f7bb22d0e1566e80d0f1efdf967dd1601fbf49d48a", + "transactionType": "CREATE2", + "contractName": "AllowedCalldataEnforcer", + "contractAddress": "0x48db3835a873d64a4af2c09f014052407c003bd7", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x7ac98", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061059c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610085575b600080fd5b61005961005436600461035a565b61009d565b005b61006e61006936600461041d565b61020c565b60405161007c92919061045f565b60405180910390f35b61005961009336600461035a565b5050505050505050565b60006060806100ac8b8b61020c565b805191945092506100c060408901896104b6565b90506100cc82866104fd565b11156101375760405162461bcd60e51b815260206004820152602f60248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d60448201526e0c6c2d8d8c8c2e8c25ad8cadccee8d608b1b60648201526084015b60405180910390fd5b61014460408901896104b6565b859061015084836104fd565b9261015d9392919061051e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509294506101a192508491508590506102d9565b6101fe5760405162461bcd60e51b815260206004820152602860248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d60448201526763616c6c6461746160c01b606482015260840161012e565b505050505050505050505050565b6000606060218310156102745760405162461bcd60e51b815260206004820152602a60248201527f416c6c6f77656443616c6c64617461456e666f726365723a696e76616c69642d6044820152697465726d732d73697a6560b01b606482015260840161012e565b61028260206000858761051e565b61028b91610548565b915061029a836020818761051e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250949792965091945050505050565b6000818051906020012083805190602001201490505b92915050565b60008083601f84011261030757600080fd5b50813567ffffffffffffffff81111561031f57600080fd5b60208301915083602082850101111561033757600080fd5b9250929050565b80356001600160a01b038116811461035557600080fd5b919050565b60008060008060008060008060c0898b03121561037657600080fd5b883567ffffffffffffffff8082111561038e57600080fd5b61039a8c838d016102f5565b909a50985060208b01359150808211156103b357600080fd5b6103bf8c838d016102f5565b909850965060408b01359150808211156103d857600080fd5b5089016060818c0312156103eb57600080fd5b93506060890135925061040060808a0161033e565b915061040e60a08a0161033e565b90509295985092959890939650565b6000806020838503121561043057600080fd5b823567ffffffffffffffff81111561044757600080fd5b610453858286016102f5565b90969095509350505050565b8281526000602060406020840152835180604085015260005b8181101561049457858101830151858201606001528201610478565b506000606082860101526060601f19601f830116850101925050509392505050565b6000808335601e198436030181126104cd57600080fd5b83018035915067ffffffffffffffff8211156104e857600080fd5b60200191503681900382131561033757600080fd5b808201808211156102ef57634e487b7160e01b600052601160045260246000fd5b6000808585111561052e57600080fd5b8386111561053b57600080fd5b5050820193919092039150565b803560208310156102ef57600019602084900360031b1b169291505056fea264697066735822122094149f339193c37892b2442e24526e5fff221c6592b2b7cd87732677fcc1c9c464736f6c63430008170033", + "nonce": "0x3", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x0dbcb18025fd09adc34be67d1eabfd42ec287227bf67c192e5dbf8d45616aa70", + "transactionType": "CREATE2", + "contractName": "AllowedMethodsEnforcer", + "contractAddress": "0xfd731951bf1c52afccee3e6f14ab656475b76dd4", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x8ba05", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610683806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610084575b600080fd5b6100596100543660046103a7565b61009c565b005b61006e61006936600461046a565b6101ff565b60405161007b91906104ac565b60405180910390f35b6100596100923660046103a7565b5050505050505050565b60046100ab60408601866104fa565b9050101561011a5760405162461bcd60e51b815260206004820152603160248201527f416c6c6f7765644d6574686f6473456e666f726365723a696e76616c69642d616044820152700c6e8d2dedc5ac8c2e8c25ad8cadccee8d607b1b60648201526084015b60405180910390fd5b600061012960408601866104fa565b61013891600491600091610541565b6101419161056b565b9050600061014f8a8a6101ff565b805190915060005b818110156101a4578281815181106101715761017161059b565b60200260200101516001600160e01b031916846001600160e01b0319160361019c5750505050610092565b600101610157565b5060405162461bcd60e51b815260206004820152602960248201527f416c6c6f7765644d6574686f6473456e666f726365723a6d6574686f642d6e6f6044820152681d0b585b1b1bddd95960ba1b6064820152608401610111565b606060008261020f6004826105c7565b156102705760405162461bcd60e51b815260206004820152602b60248201527f416c6c6f7765644d6574686f6473456e666f726365723a696e76616c69642d7460448201526a0cae4dae65ad8cadccee8d60ab1b6064820152608401610111565b61027b6004826105f1565b67ffffffffffffffff81111561029357610293610605565b6040519080825280602002602001820160405280156102bc578160200160208202803683370190505b50925060005b81811015610339578581866102d882600461061b565b926102e593929190610541565b6102ee9161056b565b8484815181106103005761030061059b565b6001600160e01b0319909216602092830291909101909101528261032381610634565b9350610332905060048261061b565b90506102c2565b50505092915050565b60008083601f84011261035457600080fd5b50813567ffffffffffffffff81111561036c57600080fd5b60208301915083602082850101111561038457600080fd5b9250929050565b80356001600160a01b03811681146103a257600080fd5b919050565b60008060008060008060008060c0898b0312156103c357600080fd5b883567ffffffffffffffff808211156103db57600080fd5b6103e78c838d01610342565b909a50985060208b013591508082111561040057600080fd5b61040c8c838d01610342565b909850965060408b013591508082111561042557600080fd5b5089016060818c03121561043857600080fd5b93506060890135925061044d60808a0161038b565b915061045b60a08a0161038b565b90509295985092959890939650565b6000806020838503121561047d57600080fd5b823567ffffffffffffffff81111561049457600080fd5b6104a085828601610342565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156104ee5783516001600160e01b031916835292840192918401916001016104c8565b50909695505050505050565b6000808335601e1984360301811261051157600080fd5b83018035915067ffffffffffffffff82111561052c57600080fd5b60200191503681900382131561038457600080fd5b6000808585111561055157600080fd5b8386111561055e57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156105935780818660040360031b1b83161692505b505092915050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826105d6576105d66105b1565b500690565b634e487b7160e01b600052601160045260246000fd5b600082610600576106006105b1565b500490565b634e487b7160e01b600052604160045260246000fd5b8082018082111561062e5761062e6105db565b92915050565b600060018201610646576106466105db565b506001019056fea26469706673582212204ec9b63db8ffcc611dbc205c0eb5d3daa906537fc4f6d216704a61e004393bed64736f6c63430008170033", + "nonce": "0x4", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x5a44ca63602f2b2edf118cf04d8380548d4998075bc4280d3c40d6ba4166f43b", + "transactionType": "CREATE2", + "contractName": "AllowedTargetsEnforcer", + "contractAddress": "0xbc8673c0afa52d86d991c06881e55b2966920564", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x7f38f", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b506105d9806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610084575b600080fd5b61005961005436600461031e565b61009c565b005b61006e6100693660046103e1565b610174565b60405161007b9190610423565b60405180910390f35b61005961009236600461031e565b5050505050505050565b60006100ab6020860186610470565b905060006100b98a8a610174565b805190915060005b8181101561010c578281815181106100db576100db610492565b60200260200101516001600160a01b0316846001600160a01b0316036101045750505050610092565b6001016100c1565b5060405162461bcd60e51b815260206004820152603160248201527f416c6c6f77656454617267657473456e666f726365723a7461726765742d6164604482015270191c995cdccb5b9bdd0b585b1b1bddd959607a1b60648201526084015b60405180910390fd5b60606000826101846014826104be565b156101e55760405162461bcd60e51b815260206004820152602b60248201527f416c6c6f77656454617267657473456e666f726365723a696e76616c69642d7460448201526a0cae4dae65ad8cadccee8d60ab1b606482015260840161016b565b6101f06014826104e8565b67ffffffffffffffff811115610208576102086104fc565b604051908082528060200260200182016040528015610231578160200160208202803683370190505b50925060005b818110156102b05785818661024d826014610512565b9261025a9392919061052b565b61026391610555565b60601c84848151811061027857610278610492565b6001600160a01b03909216602092830291909101909101528261029a8161058a565b93506102a99050601482610512565b9050610237565b50505092915050565b60008083601f8401126102cb57600080fd5b50813567ffffffffffffffff8111156102e357600080fd5b6020830191508360208285010111156102fb57600080fd5b9250929050565b80356001600160a01b038116811461031957600080fd5b919050565b60008060008060008060008060c0898b03121561033a57600080fd5b883567ffffffffffffffff8082111561035257600080fd5b61035e8c838d016102b9565b909a50985060208b013591508082111561037757600080fd5b6103838c838d016102b9565b909850965060408b013591508082111561039c57600080fd5b5089016060818c0312156103af57600080fd5b9350606089013592506103c460808a01610302565b91506103d260a08a01610302565b90509295985092959890939650565b600080602083850312156103f457600080fd5b823567ffffffffffffffff81111561040b57600080fd5b610417858286016102b9565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156104645783516001600160a01b03168352928401929184019160010161043f565b50909695505050505050565b60006020828403121561048257600080fd5b61048b82610302565b9392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826104cd576104cd6104a8565b500690565b634e487b7160e01b600052601160045260246000fd5b6000826104f7576104f76104a8565b500490565b634e487b7160e01b600052604160045260246000fd5b80820180821115610525576105256104d2565b92915050565b6000808585111561053b57600080fd5b8386111561054857600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156105825780818660140360031b1b83161692505b505092915050565b60006001820161059c5761059c6104d2565b506001019056fea26469706673582212204a2e5d298e85989e2cc1b01eb90837481124fb817e6ba907174cafb6c568768564736f6c63430008170033", + "nonce": "0x5", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x3a7688d22b76d24e94341e062470e1935524783a2a8a981873c6f2e917e6dfe3", + "transactionType": "CREATE2", + "contractName": "BlockNumberEnforcer", + "contractAddress": "0xc15faffa0d879b9263c15a46ce31eacfa2e0e8ae", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x6942b", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061045b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610092575b600080fd5b6100596100543660046102bd565b6100aa565b005b61006e610069366004610380565b6101b6565b604080516001600160801b0393841681529290911660208301520160405180910390f35b6100596100a03660046102bd565b5050505050505050565b6000806100b78a8a6101b6565b90925090506001600160801b0382161561013457816001600160801b031643116101345760405162461bcd60e51b8152602060048201526024808201527f426c6f636b4e756d626572456e666f726365723a6561726c792d64656c6567616044820152633a34b7b760e11b60648201526084015b60405180910390fd5b6001600160801b038116156101aa57806001600160801b031643106101aa5760405162461bcd60e51b815260206004820152602660248201527f426c6f636b4e756d626572456e666f726365723a657870697265642d64656c6560448201526533b0ba34b7b760d11b606482015260840161012b565b50505050505050505050565b6000806020831461021a5760405162461bcd60e51b815260206004820152602860248201527f426c6f636b4e756d626572456e666f726365723a696e76616c69642d7465726d6044820152670e65ad8cadccee8d60c31b606482015260840161012b565b6102286010600085876103c2565b610231916103ec565b60801c915061024383601081876103c2565b61024c916103ec565b60801c90509250929050565b60008083601f84011261026a57600080fd5b50813567ffffffffffffffff81111561028257600080fd5b60208301915083602082850101111561029a57600080fd5b9250929050565b80356001600160a01b03811681146102b857600080fd5b919050565b60008060008060008060008060c0898b0312156102d957600080fd5b883567ffffffffffffffff808211156102f157600080fd5b6102fd8c838d01610258565b909a50985060208b013591508082111561031657600080fd5b6103228c838d01610258565b909850965060408b013591508082111561033b57600080fd5b5089016060818c03121561034e57600080fd5b93506060890135925061036360808a016102a1565b915061037160a08a016102a1565b90509295985092959890939650565b6000806020838503121561039357600080fd5b823567ffffffffffffffff8111156103aa57600080fd5b6103b685828601610258565b90969095509350505050565b600080858511156103d257600080fd5b838611156103df57600080fd5b5050820193919092039150565b6fffffffffffffffffffffffffffffffff19813581811691601085101561041d5780818660100360031b1b83161692505b50509291505056fea26469706673582212202f1df071a3b936ee3ad015758f36f43130359bf66ac06d4703490535de194a3864736f6c63430008170033", + "nonce": "0x6", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x4f52f460bc046f17ff3cd3c787cb5d8d9727d896f8fed5e1d642619c5de8164d", + "transactionType": "CREATE2", + "contractName": "DeployedEnforcer", + "contractAddress": "0x5accb9559b56a6c1e3f90e342c85c42d93720d43", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x8f463", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b506106b5806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063481286e6146100515780639751a83d14610081578063b99deb0e14610096578063de723eeb146100b8575b600080fd5b61006461005f366004610410565b6100d0565b6040516001600160a01b0390911681526020015b60405180910390f35b61009461008f366004610497565b6100e5565b005b6100a96100a436600461055a565b6101e4565b6040516100789392919061059c565b6100946100c6366004610497565b5050505050505050565b60006100dc82846102ca565b90505b92915050565b60008060006100f48b8b6101e4565b919450925090506001600160a01b0383163b1561014f576040516001600160a01b03841681527f641dafeb23238fae3ef71c64fced975da90c34dede63890507f3dda6b1e0dfef9060200160405180910390a15050506100c6565b600061015b82846102d7565b9050836001600160a01b0316816001600160a01b0316146101d65760405162461bcd60e51b815260206004820152602a60248201527f4465706c6f796564456e666f726365723a6465706c6f7965642d6164647265736044820152690e65adad2e6dac2e8c6d60b31b60648201526084015b60405180910390fd5b505050505050505050505050565b6000806060603484116102475760405162461bcd60e51b815260206004820152602560248201527f4465706c6f796564456e666f726365723a696e76616c69642d7465726d732d6c6044820152640cadccee8d60db1b60648201526084016101cd565b610255601460008688610602565b61025e9161062c565b60601c9250610271603460148688610602565b61027a91610661565b91506102898460348188610602565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509598949750919550929350505050565b60006100dc83833061035f565b60006102e560008385610389565b9050806001600160a01b03163b60000361031d576040516352c7cd4960e11b81526001600160a01b03821660048201526024016101cd565b6040516001600160a01b03821681527faf3c4b03f515b5a38f3c238fdc24abf10854a2f27f2a85743a71de17e9bc7e7f9060200160405180910390a192915050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6000834710156103b55760405163392efb2b60e21b8152476004820152602481018590526044016101cd565b81516000036103d757604051631328927760e21b815260040160405180910390fd5b8282516020840186f590506001600160a01b03811661040957604051633a0ba96160e11b815260040160405180910390fd5b9392505050565b6000806040838503121561042357600080fd5b50508035926020909101359150565b60008083601f84011261044457600080fd5b50813567ffffffffffffffff81111561045c57600080fd5b60208301915083602082850101111561047457600080fd5b9250929050565b80356001600160a01b038116811461049257600080fd5b919050565b60008060008060008060008060c0898b0312156104b357600080fd5b883567ffffffffffffffff808211156104cb57600080fd5b6104d78c838d01610432565b909a50985060208b01359150808211156104f057600080fd5b6104fc8c838d01610432565b909850965060408b013591508082111561051557600080fd5b5089016060818c03121561052857600080fd5b93506060890135925061053d60808a0161047b565b915061054b60a08a0161047b565b90509295985092959890939650565b6000806020838503121561056d57600080fd5b823567ffffffffffffffff81111561058457600080fd5b61059085828601610432565b90969095509350505050565b60018060a01b03841681526000602084602084015260606040840152835180606085015260005b818110156105df578581018301518582016080015282016105c3565b506000608082860101526080601f19601f83011685010192505050949350505050565b6000808585111561061257600080fd5b8386111561061f57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106595780818660140360031b1b83161692505b505092915050565b803560208310156100df57600019602084900360031b1b169291505056fea2646970667358221220adae6ada7a0e210e98db78555afd35a3b834fe39e89d1ae92e20b35e9cc9358664736f6c63430008170033", + "nonce": "0x7", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xd23cfaec24a485724502e8fd5f9057dfeac3313c12efda15af4c2134d1d5f354", + "transactionType": "CREATE2", + "contractName": "ERC20BalanceGteEnforcer", + "contractAddress": "0xb5d6b1ec6d868a3bae5b7f48178eaa2686a7a087", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xa3337", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061074a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806332a16f4e146100675780638678d6ef1461009f5780639751a83d146100c0578063b5e54492146100d5578063b99deb0e146100f5578063de723eeb14610127575b600080fd5b61008a61007536600461049d565b60016020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100b26100ad3660046104d2565b61013a565b604051908152602001610096565b6100d36100ce366004610557565b61014f565b005b6100b26100e336600461049d565b60006020819052908152604090205481565b61010861010336600461061a565b610289565b604080516001600160a01b039093168352602083019190915201610096565b6100d3610135366004610557565b61032f565b600061014784848461045a565b949350505050565b600061015b8989610289565b509050600061016b33838761045a565b60008181526001602052604090205490915060ff16156101e55760405162461bcd60e51b815260206004820152602a60248201527f455243323042616c616e6365477465456e666f726365723a656e666f726365726044820152690b5a5ccb5b1bd8dad95960b21b60648201526084015b60405180910390fd5b6000818152600160208190526040808320805460ff1916909217909155516370a0823160e01b81526001600160a01b0386811660048301528416906370a0823190602401602060405180830381865afa158015610246573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026a919061065c565b6000928352602083905260409092209190915550505050505050505050565b600080603483146102f15760405162461bcd60e51b815260206004820152602c60248201527f455243323042616c616e6365477465456e666f726365723a696e76616c69642d60448201526b0e8cae4dae65ad8cadccee8d60a31b60648201526084016101dc565b6102ff601460008587610675565b6103089161069f565b60601c915061031a8360148187610675565b610323916106d4565b60001c90509250929050565b60008061033c8a8a610289565b91509150600061034d33848861045a565b600081815260016020526040808220805460ff19169055516370a0823160e01b81526001600160a01b03888116600483015292935090918516906370a0823190602401602060405180830381865afa1580156103ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d1919061065c565b6000838152602081905260409020549091506103ee9084906106f3565b81101561044c5760405162461bcd60e51b815260206004820152602660248201527f455243323042616c616e6365477465456e666f726365723a62616c616e63652d6044820152651b9bdd0b59dd60d21b60648201526084016101dc565b505050505050505050505050565b604080516001600160a01b039485166020808301919091529390941684820152606080850192909252805180850390920182526080909301909252815191012090565b6000602082840312156104af57600080fd5b5035919050565b80356001600160a01b03811681146104cd57600080fd5b919050565b6000806000606084860312156104e757600080fd5b6104f0846104b6565b92506104fe602085016104b6565b9150604084013590509250925092565b60008083601f84011261052057600080fd5b50813567ffffffffffffffff81111561053857600080fd5b60208301915083602082850101111561055057600080fd5b9250929050565b60008060008060008060008060c0898b03121561057357600080fd5b883567ffffffffffffffff8082111561058b57600080fd5b6105978c838d0161050e565b909a50985060208b01359150808211156105b057600080fd5b6105bc8c838d0161050e565b909850965060408b01359150808211156105d557600080fd5b5089016060818c0312156105e857600080fd5b9350606089013592506105fd60808a016104b6565b915061060b60a08a016104b6565b90509295985092959890939650565b6000806020838503121561062d57600080fd5b823567ffffffffffffffff81111561064457600080fd5b6106508582860161050e565b90969095509350505050565b60006020828403121561066e57600080fd5b5051919050565b6000808585111561068557600080fd5b8386111561069257600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106cc5780818660140360031b1b83161692505b505092915050565b803560208310156106ed57600019602084900360031b1b165b92915050565b808201808211156106ed57634e487b7160e01b600052601160045260246000fdfea2646970667358221220706a4bd5217d105228b49e7ecb48d785e4c5a4cbd88c1e0018e40907dafc0c9d64736f6c63430008170033", + "nonce": "0x8", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x696480ac1eeb4b1f007e06e6d32c9adc877ccf2dde7484faa5092de7eecb423a", + "transactionType": "CREATE2", + "contractName": "ERC20TransferAmountEnforcer", + "contractAddress": "0x92ac423b9c111962179a6242e1adb58d02c103be", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x990f4", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061073b806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80639751a83d146100515780639dd5d9ab14610066578063b99deb0e146100a1578063de723eeb146100d3575b600080fd5b61006461005f366004610480565b6100eb565b005b61008e610074366004610543565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b6100b46100af36600461056d565b610383565b604080516001600160a01b039093168352602083019190915201610098565b6100646100e1366004610480565b5050505050505050565b6100f860408501856105af565b90506044146101565760405162461bcd60e51b815260206004820152603160248201526000805160206106e68339815191526044820152700d8d2c85ac2c6e8d2dedc5ad8cadccee8d607b1b60648201526084015b60405180910390fd5b6000806101638a8a610383565b9092509050600061017760208801886105f6565b905063a9059cbb60e01b6001600160a01b03848116908316146101df5760405162461bcd60e51b815260206004820152602c60248201526000805160206106e683398151915260448201526b1b1a590b58dbdb9d1c9858dd60a21b606482015260840161014d565b60006101ee60408a018a6105af565b6101fd91600491600091610618565b61020691610642565b90506001600160e01b0319808216908316146102655760405162461bcd60e51b815260206004820152602a60248201526000805160206106e68339815191526044820152691b1a590b5b595d1a1bd960b21b606482015260840161014d565b600061027460408b018b6105af565b61028391604491602491610618565b61028c91610672565b336000908152602081815260408083208d845290915281208054929350909183919083906102bb908490610691565b92505081905590508581111561032a5760405162461bcd60e51b815260206004820152602e60248201527f45524332305472616e73666572416d6f756e74456e666f726365723a616c6c6f60448201526d1dd85b98d94b595e18d95959195960921b606482015260840161014d565b60408051878152602081018390528b916001600160a01b038b169133917fc026e493323d526061a052b5dd562495120e2f648797a48be61966d3a6beec8d910160405180910390a4505050505050505050505050505050565b600080603483146103dd5760405162461bcd60e51b815260206004820152603060248201526000805160206106e683398151915260448201526f0d8d2c85ae8cae4dae65ad8cadccee8d60831b606482015260840161014d565b6103eb601460008587610618565b6103f4916106b2565b60601c91506104068360148187610618565b61040f91610672565b60001c90509250929050565b60008083601f84011261042d57600080fd5b50813567ffffffffffffffff81111561044557600080fd5b60208301915083602082850101111561045d57600080fd5b9250929050565b80356001600160a01b038116811461047b57600080fd5b919050565b60008060008060008060008060c0898b03121561049c57600080fd5b883567ffffffffffffffff808211156104b457600080fd5b6104c08c838d0161041b565b909a50985060208b01359150808211156104d957600080fd5b6104e58c838d0161041b565b909850965060408b01359150808211156104fe57600080fd5b5089016060818c03121561051157600080fd5b93506060890135925061052660808a01610464565b915061053460a08a01610464565b90509295985092959890939650565b6000806040838503121561055657600080fd5b61055f83610464565b946020939093013593505050565b6000806020838503121561058057600080fd5b823567ffffffffffffffff81111561059757600080fd5b6105a38582860161041b565b90969095509350505050565b6000808335601e198436030181126105c657600080fd5b83018035915067ffffffffffffffff8211156105e157600080fd5b60200191503681900382131561045d57600080fd5b60006020828403121561060857600080fd5b61061182610464565b9392505050565b6000808585111561062857600080fd5b8386111561063557600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561066a5780818660040360031b1b83161692505b505092915050565b8035602083101561068b57600019602084900360031b1b165b92915050565b8082018082111561068b57634e487b7160e01b600052601160045260246000fd5b6bffffffffffffffffffffffff19813581811691601485101561066a5760149490940360031b84901b169092169291505056fe45524332305472616e73666572416d6f756e74456e666f726365723a696e7661a2646970667358221220bbaa47e7ff7ca5d260ee2e4ae44f60d5ed447ee0a25335e020538968f33cc37d64736f6c63430008170033", + "nonce": "0x9", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x3082decdd837ae635d3bb5bff43ccbde8c615b8aadf520a32ea0cc842d86efe5", + "transactionType": "CREATE2", + "contractName": "IdEnforcer", + "contractAddress": "0x34152d9f3f8f74338d50703e780389e829b4abac", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x667df", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610486806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063595dce48146100515780639751a83d14610079578063b99deb0e1461008e578063de723eeb146100af575b600080fd5b61006461005f3660046102a8565b6100c7565b60405190151581526020015b60405180910390f35b61008c61008736600461032d565b6100fe565b005b6100a161009c3660046103f0565b610204565b604051908152602001610070565b61008c6100bd36600461032d565b5050505050505050565b6001600160a01b0380841660009081526020818152604080832093861683529290529081206100f69083610267565b949350505050565b600061010a8989610204565b90506101173384836100c7565b156101695760405162461bcd60e51b815260206004820152601a60248201527f4964456e666f726365723a69642d616c72656164792d7573656400000000000060448201526064015b60405180910390fd5b336000908152602081815260408083206001600160a01b03871684528252808320600885901c845290915290208054600160ff84161b179055826001600160a01b0316826001600160a01b0316336001600160a01b03167f6286af1aaf28b34723a53056e5608eabb40c823d1ce093ff371cf08c502431d6846040516101f191815260200190565b60405180910390a4505050505050505050565b6000602082146102565760405162461bcd60e51b815260206004820152601f60248201527f4964456e666f726365723a696e76616c69642d7465726d732d6c656e677468006044820152606401610160565b6102608284610432565b9392505050565b600881901c600090815260208390526040902054600160ff83161b1615155b92915050565b80356001600160a01b03811681146102a357600080fd5b919050565b6000806000606084860312156102bd57600080fd5b6102c68461028c565b92506102d46020850161028c565b9150604084013590509250925092565b60008083601f8401126102f657600080fd5b50813567ffffffffffffffff81111561030e57600080fd5b60208301915083602082850101111561032657600080fd5b9250929050565b60008060008060008060008060c0898b03121561034957600080fd5b883567ffffffffffffffff8082111561036157600080fd5b61036d8c838d016102e4565b909a50985060208b013591508082111561038657600080fd5b6103928c838d016102e4565b909850965060408b01359150808211156103ab57600080fd5b5089016060818c0312156103be57600080fd5b9350606089013592506103d360808a0161028c565b91506103e160a08a0161028c565b90509295985092959890939650565b6000806020838503121561040357600080fd5b823567ffffffffffffffff81111561041a57600080fd5b610426858286016102e4565b90969095509350505050565b8035602083101561028657600019602084900360031b1b169291505056fea264697066735822122028074431512be4166d9bc04a0557354e43d233df6620f59dcf4e6fea83a3a51f64736f6c63430008170033", + "nonce": "0xa", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8487177ce2c8e7bb767c2d3a90a8eae8cd90f38265c21b8904b78a43b2ad3ba1", + "transactionType": "CREATE2", + "contractName": "LimitedCallsEnforcer", + "contractAddress": "0x4b3adad4a328bee8ba17b86074d92fe7372180cd", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x61904", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610442806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806319054d89146100515780639751a83d1461008b578063b99deb0e146100a0578063de723eeb146100b3575b600080fd5b61007961005f36600461024e565b600060208181529281526040808220909352908152205481565b60405190815260200160405180910390f35b61009e6100993660046102c1565b6100cb565b005b6100796100ae366004610384565b6101bd565b61009e6100c13660046102c1565b5050505050505050565b60006100d789896101bd565b336000908152602081815260408083208884529091528120805492935090918290610101906103c6565b91829055509050818111156101695760405162461bcd60e51b815260206004820152602360248201527f4c696d6974656443616c6c73456e666f726365723a6c696d69742d657863656560448201526219195960ea1b60648201526084015b60405180910390fd5b604080518381526020810183905286916001600160a01b0386169133917f449da07f2c06c9d1a6b19d2454ffe749e8cf991d22f686e076a1a4844c5ff370910160405180910390a450505050505050505050565b6000602082146102215760405162461bcd60e51b815260206004820152602960248201527f4c696d6974656443616c6c73456e666f726365723a696e76616c69642d7465726044820152680dae65ad8cadccee8d60bb1b6064820152608401610160565b61022b82846103ed565b9392505050565b80356001600160a01b038116811461024957600080fd5b919050565b6000806040838503121561026157600080fd5b61026a83610232565b946020939093013593505050565b60008083601f84011261028a57600080fd5b50813567ffffffffffffffff8111156102a257600080fd5b6020830191508360208285010111156102ba57600080fd5b9250929050565b60008060008060008060008060c0898b0312156102dd57600080fd5b883567ffffffffffffffff808211156102f557600080fd5b6103018c838d01610278565b909a50985060208b013591508082111561031a57600080fd5b6103268c838d01610278565b909850965060408b013591508082111561033f57600080fd5b5089016060818c03121561035257600080fd5b93506060890135925061036760808a01610232565b915061037560a08a01610232565b90509295985092959890939650565b6000806020838503121561039757600080fd5b823567ffffffffffffffff8111156103ae57600080fd5b6103ba85828601610278565b90969095509350505050565b6000600182016103e657634e487b7160e01b600052601160045260246000fd5b5060010190565b8035602083101561040657600019602084900360031b1b165b9291505056fea2646970667358221220f78aa8066d472e78f2d898b70704f695cf682a9b2914539b1a5a83b1dd87e31064736f6c63430008170033", + "nonce": "0xb", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x81afc2a439d96d84d5d17b4d9bf05e538ff998f01f2bdf3887e649f9953f208a", + "transactionType": "CREATE2", + "contractName": "NonceEnforcer", + "contractAddress": "0x2f32ff3fc3086d7f63f16fe8d0065390d460b40d", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x68e23", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610457806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80632bd4ed211461005c5780639751a83d14610096578063b99deb0e146100ab578063de723eeb146100be578063f5743c4c146100d6575b600080fd5b61008461006a366004610266565b600060208181529281526040808220909352908152205481565b60405190815260200160405180910390f35b6100a96100a43660046102e2565b6100e9565b005b6100846100b93660046103a5565b610178565b6100a96100cc3660046102e2565b5050505050505050565b6100a96100e43660046103e7565b6101e6565b60006100f58989610178565b336000908152602081815260408083206001600160a01b0388168452909152902054909150811461016d5760405162461bcd60e51b815260206004820152601b60248201527f4e6f6e6365456e666f726365723a696e76616c69642d6e6f6e6365000000000060448201526064015b60405180910390fd5b505050505050505050565b6000602082146101d55760405162461bcd60e51b815260206004820152602260248201527f4e6f6e6365456e666f726365723a696e76616c69642d7465726d732d6c656e676044820152610e8d60f31b6064820152608401610164565b6101df8284610402565b9392505050565b6001600160a01b038116600081815260208181526040808320338085529083529281902080546001810190915590518181529093917fe02d340254c92bc3ad96f0fceb790db939e11c669c1f4c8a549d248f17130b33910160405180910390a35050565b80356001600160a01b038116811461026157600080fd5b919050565b6000806040838503121561027957600080fd5b6102828361024a565b91506102906020840161024a565b90509250929050565b60008083601f8401126102ab57600080fd5b50813567ffffffffffffffff8111156102c357600080fd5b6020830191508360208285010111156102db57600080fd5b9250929050565b60008060008060008060008060c0898b0312156102fe57600080fd5b883567ffffffffffffffff8082111561031657600080fd5b6103228c838d01610299565b909a50985060208b013591508082111561033b57600080fd5b6103478c838d01610299565b909850965060408b013591508082111561036057600080fd5b5089016060818c03121561037357600080fd5b93506060890135925061038860808a0161024a565b915061039660a08a0161024a565b90509295985092959890939650565b600080602083850312156103b857600080fd5b823567ffffffffffffffff8111156103cf57600080fd5b6103db85828601610299565b90969095509350505050565b6000602082840312156103f957600080fd5b6101df8261024a565b8035602083101561041b57600019602084900360031b1b165b9291505056fea2646970667358221220b8ac9ab0759f02df69d888b08c000fa4dfa4048ad7f88931687eeff439dd484a64736f6c63430008170033", + "nonce": "0xc", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x5f8cacbc283070064a7b680355ebc88173e18afde334539984c2c3809bde3528", + "transactionType": "CREATE2", + "contractName": "TimestampEnforcer", + "contractAddress": "0x78e05f779490c24bf3bfa135b4112e7003b321cd", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x68cc4", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610455806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610092575b600080fd5b6100596100543660046102b7565b6100aa565b005b61006e61006936600461037a565b6101b2565b604080516001600160801b0393841681529290911660208301520160405180910390f35b6100596100a03660046102b7565b5050505050505050565b6000806100b78a8a6101b2565b90925090506001600160801b0382161561013357816001600160801b031642116101335760405162461bcd60e51b815260206004820152602260248201527f54696d657374616d70456e666f726365723a6561726c792d64656c656761746960448201526137b760f11b60648201526084015b60405180910390fd5b6001600160801b038116156101a657806001600160801b031642106101a65760405162461bcd60e51b8152602060048201526024808201527f54696d657374616d70456e666f726365723a657870697265642d64656c6567616044820152633a34b7b760e11b606482015260840161012a565b50505050505050505050565b600080602083146102145760405162461bcd60e51b815260206004820152602660248201527f54696d657374616d70456e666f726365723a696e76616c69642d7465726d732d6044820152650d8cadccee8d60d31b606482015260840161012a565b61022183601081876103bc565b61022a916103e6565b60801c905061023d6010600085876103bc565b610246916103e6565b60801c91509250929050565b60008083601f84011261026457600080fd5b50813567ffffffffffffffff81111561027c57600080fd5b60208301915083602082850101111561029457600080fd5b9250929050565b80356001600160a01b03811681146102b257600080fd5b919050565b60008060008060008060008060c0898b0312156102d357600080fd5b883567ffffffffffffffff808211156102eb57600080fd5b6102f78c838d01610252565b909a50985060208b013591508082111561031057600080fd5b61031c8c838d01610252565b909850965060408b013591508082111561033557600080fd5b5089016060818c03121561034857600080fd5b93506060890135925061035d60808a0161029b565b915061036b60a08a0161029b565b90509295985092959890939650565b6000806020838503121561038d57600080fd5b823567ffffffffffffffff8111156103a457600080fd5b6103b085828601610252565b90969095509350505050565b600080858511156103cc57600080fd5b838611156103d957600080fd5b5050820193919092039150565b6fffffffffffffffffffffffffffffffff1981358181169160108510156104175780818660100360031b1b83161692505b50509291505056fea2646970667358221220032d822c6d896afe6d14f1080a0918e2996d1c61fe51449e6ecf5841d50e5ea464736f6c63430008170033", + "nonce": "0xd", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x70c7cf119adf2d351b517be31bf781fb8ae133ff03699b3c9cf925943a738cb7", + "transactionType": "CREATE2", + "contractName": "ValueLteEnforcer", + "contractAddress": "0xfc20ede0a1132e839fbda9d7ed3904ff3c89540f", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x4e4e9", + "value": "0x0", + "input": "0x44656c654761746f720000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061033a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639751a83d14610046578063b99deb0e1461005b578063de723eeb14610080575b600080fd5b6100596100543660046101e0565b610098565b005b61006e6100693660046102a3565b61010a565b60405190815260200160405180910390f35b61005961008e3660046101e0565b5050505050505050565b60006100a4898961010a565b905080856020013511156100ff5760405162461bcd60e51b815260206004820152601f60248201527f56616c75654c7465456e666f726365723a76616c75652d746f6f2d686967680060448201526064015b60405180910390fd5b505050505050505050565b60006020821461016a5760405162461bcd60e51b815260206004820152602560248201527f56616c75654c7465456e666f726365723a696e76616c69642d7465726d732d6c6044820152640cadccee8d60db1b60648201526084016100f6565b61017482846102e5565b9392505050565b60008083601f84011261018d57600080fd5b50813567ffffffffffffffff8111156101a557600080fd5b6020830191508360208285010111156101bd57600080fd5b9250929050565b80356001600160a01b03811681146101db57600080fd5b919050565b60008060008060008060008060c0898b0312156101fc57600080fd5b883567ffffffffffffffff8082111561021457600080fd5b6102208c838d0161017b565b909a50985060208b013591508082111561023957600080fd5b6102458c838d0161017b565b909850965060408b013591508082111561025e57600080fd5b5089016060818c03121561027157600080fd5b93506060890135925061028660808a016101c4565b915061029460a08a016101c4565b90509295985092959890939650565b600080602083850312156102b657600080fd5b823567ffffffffffffffff8111156102cd57600080fd5b6102d98582860161017b565b90969095509350505050565b803560208310156102fe57600019602084900360031b1b165b9291505056fea2646970667358221220cd4bcb89c90c60ef26b293e82752e5ff08228ce4ed86119c5597e63559710ece64736f6c63430008170033", + "nonce": "0xe", + "chainId": "0x2105" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x1801787", + "logs": [ + { + "address": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000b0403b32f54d0bd752113f4009e8b534c6669f44" + ], + "data": "0x", + "blockHash": "0xda988e696c32e55449475c6a8f45d39abfbd82afb549c28febe596b4e0abb21c", + "blockNumber": "0x1001cb1", + "transactionHash": "0x2152d94cce1bf52dc6dc9d5f9d2242d7d9e9afc0484cb684d09d7d56aaf3515e", + "transactionIndex": "0x34", + "logIndex": "0xd6", + "removed": false + }, + { + "address": "0xbe4138886cb096bdc1b930f2f0ca7892aa234d78", + "topics": [ + "0x04a46d9007577c7ff1e513b900545162ec25d25991ae3dc60cf26ec01a84806d", + "0x9e80f1022bda8209d5c73fb6cc6ba1e71cd4e3ce413abc70118fca03461bd376", + "0x000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d78" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000002105000000000000000000000000000000000000000000000000000000000000001144656c65676174696f6e4d616e6167657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013100000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xda988e696c32e55449475c6a8f45d39abfbd82afb549c28febe596b4e0abb21c", + "blockNumber": "0x1001cb1", + "transactionHash": "0x2152d94cce1bf52dc6dc9d5f9d2242d7d9e9afc0484cb684d09d7d56aaf3515e", + "transactionIndex": "0x34", + "logIndex": "0xd7", + "removed": false + } + ], + "logsBloom": "0x00040000000000000040000000000000000000000000000000800000004000000000000000000000000000000000000000000000000000000000041000020000000000000000000000040000000000000001000000001000000000000000000000000000020000000000000000000800000080000080000000000000000000480000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000008000000020000000000800000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x2152d94cce1bf52dc6dc9d5f9d2242d7d9e9afc0484cb684d09d7d56aaf3515e", + "transactionIndex": "0x34", + "blockHash": "0xda988e696c32e55449475c6a8f45d39abfbd82afb549c28febe596b4e0abb21c", + "blockNumber": "0x1001cb1", + "gasUsed": "0x1faf25", + "effectiveGasPrice": "0x16aab3", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x8a812f4315", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x28e14" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1af719b", + "logs": [ + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0xda988e696c32e55449475c6a8f45d39abfbd82afb549c28febe596b4e0abb21c", + "blockNumber": "0x1001cb1", + "transactionHash": "0xfe0407c7d054dd0f49f569de3d7c1d69635f4c8d954bbddf528e9871c94ba3a5", + "transactionIndex": "0x35", + "logIndex": "0xd8", + "removed": false + }, + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0xb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d", + "0x000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d78" + ], + "data": "0x", + "blockHash": "0xda988e696c32e55449475c6a8f45d39abfbd82afb549c28febe596b4e0abb21c", + "blockNumber": "0x1001cb1", + "transactionHash": "0xfe0407c7d054dd0f49f569de3d7c1d69635f4c8d954bbddf528e9871c94ba3a5", + "transactionIndex": "0x35", + "logIndex": "0xd9", + "removed": false + }, + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0xee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a99", + "0x0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032" + ], + "data": "0x", + "blockHash": "0xda988e696c32e55449475c6a8f45d39abfbd82afb549c28febe596b4e0abb21c", + "blockNumber": "0x1001cb1", + "transactionHash": "0xfe0407c7d054dd0f49f569de3d7c1d69635f4c8d954bbddf528e9871c94ba3a5", + "transactionIndex": "0x35", + "logIndex": "0xda", + "removed": false + }, + { + "address": "0x11f555af5844d85bfcf5d61d2a22866527eb585a", + "topics": [ + "0x78c34957a47c9ef62a6f6f2f8720f71e2394a6438100e7e20d139c3cbe774d03" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0xda988e696c32e55449475c6a8f45d39abfbd82afb549c28febe596b4e0abb21c", + "blockNumber": "0x1001cb1", + "transactionHash": "0xfe0407c7d054dd0f49f569de3d7c1d69635f4c8d954bbddf528e9871c94ba3a5", + "transactionIndex": "0x35", + "logIndex": "0xdb", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000002000010000000000000000000000200000000000000000000000000000000000000000000000000000000000020810000000020000010000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200080000000000000000000080000000000000000008800000000000000000000000080000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000001080000000000000000000004000000000000000000000000000000000000000000000000000000800000000000000100000000000000", + "type": "0x2", + "transactionHash": "0xfe0407c7d054dd0f49f569de3d7c1d69635f4c8d954bbddf528e9871c94ba3a5", + "transactionIndex": "0x35", + "blockHash": "0xda988e696c32e55449475c6a8f45d39abfbd82afb549c28febe596b4e0abb21c", + "blockNumber": "0x1001cb1", + "gasUsed": "0x2f5a14", + "effectiveGasPrice": "0x16aab3", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xb6a2c35393", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x35e7c" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x16a4734", + "logs": [ + { + "address": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "transactionHash": "0x52f172baddfaafd435471660a66251136db08eb325518538c60a8dcb5b86c7d0", + "transactionIndex": "0x5e", + "logIndex": "0x12b", + "removed": false + }, + { + "address": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "topics": [ + "0xb2e8eb88b584ae71ef4e854c10847f4d39bd93e52599f147bfb4dcc8de52014d", + "0x000000000000000000000000be4138886cb096bdc1b930f2f0ca7892aa234d78" + ], + "data": "0x", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "transactionHash": "0x52f172baddfaafd435471660a66251136db08eb325518538c60a8dcb5b86c7d0", + "transactionIndex": "0x5e", + "logIndex": "0x12c", + "removed": false + }, + { + "address": "0xd6edd1256deccb2b06bdecef92dc16bcf26e531b", + "topics": [ + "0xee8699dc0e27105da2653bdba54be0edcaadc3e33890a3ad705517ffe9bf0a99", + "0x0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032" + ], + "data": "0x", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "transactionHash": "0x52f172baddfaafd435471660a66251136db08eb325518538c60a8dcb5b86c7d0", + "transactionIndex": "0x5e", + "logIndex": "0x12d", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000810000000020000010000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000080000000000000000000080000000000000000008800000000000000000000000080000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000100000000000000000000000000000000000200000000000000800000000000000100000000000000", + "type": "0x2", + "transactionHash": "0x52f172baddfaafd435471660a66251136db08eb325518538c60a8dcb5b86c7d0", + "transactionIndex": "0x5e", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x43968c", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x1064d5b5718", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x4d6b4" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x16fd5e5", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x1373945eb263363a9cbb20f7bb22d0e1566e80d0f1efdf967dd1601fbf49d48a", + "transactionIndex": "0x5f", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x58eb1", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x14795f2418", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x60b0" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x17627b5", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x0dbcb18025fd09adc34be67d1eabfd42ec287227bf67c192e5dbf8d45616aa70", + "transactionIndex": "0x60", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x651d0", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x1773b0fdd3", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x6ec0" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x17be9cb", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x5a44ca63602f2b2edf118cf04d8380548d4998075bc4280d3c40d6ba4166f43b", + "transactionIndex": "0x61", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x5c216", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x153b56f43e", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x6444" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x18069a5", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x3a7688d22b76d24e94341e062470e1935524783a2a8a981873c6f2e917e6dfe3", + "transactionIndex": "0x62", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x47fda", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x106788e0ef", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x4d78" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x186e5b9", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x4f52f460bc046f17ff3cd3c787cb5d8d9727d896f8fed5e1d642619c5de8164d", + "transactionIndex": "0x63", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x67c14", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x181d18838a", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x71e0" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x18ddfa4", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xd23cfaec24a485724502e8fd5f9057dfeac3313c12efda15af4c2134d1d5f354", + "transactionIndex": "0x64", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x6f9eb", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x1a06aca744", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x7ae8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x194cd1a", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x696480ac1eeb4b1f007e06e6d32c9adc877ccf2dde7484faa5092de7eecb423a", + "transactionIndex": "0x65", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x6ed76", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x19e3197943", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x7a40" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x19970a4", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x3082decdd837ae635d3bb5bff43ccbde8c615b8aadf520a32ea0cc842d86efe5", + "transactionIndex": "0x66", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x4a38a", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x10d090be14", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x4f68" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x19ddb12", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x8487177ce2c8e7bb767c2d3a90a8eae8cd90f38265c21b8904b78a43b2ad3ba1", + "transactionIndex": "0x67", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x46a6e", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x10010b8713", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x4b94" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1a256cc", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x81afc2a439d96d84d5d17b4d9bf05e538ff998f01f2bdf3887e649f9953f208a", + "transactionIndex": "0x68", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x47bba", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x102ec8c238", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x4c6c" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1a6d196", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x5f8cacbc283070064a7b680355ebc88173e18afde334539984c2c3809bde3528", + "transactionIndex": "0x69", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x47aca", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x105334c6a6", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x4d18" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1aa5ce2", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x70c7cf119adf2d351b517be31bf781fb8ae133ff03699b3c9cf925943a738cb7", + "transactionIndex": "0x6a", + "blockHash": "0xcd014fefcb374c2ad5934ddcdf78a099f8bf45da0e20ccb71d1cc0ac5bbbaf34", + "blockNumber": "0x1001cb3", + "gasUsed": "0x38b4c", + "effectiveGasPrice": "0x16c9fc", + "from": "0xb0403b32f54d0bd752113f4009e8b534c6669f44", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": null, + "l1BaseFeeScalar": "0x58a", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xc9460997c", + "l1GasPrice": "0x95557ad1", + "l1GasUsed": "0x3b68" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1720358475, + "chain": 8453, + "commit": null +} \ No newline at end of file diff --git a/documents/DeleGatorCore.md b/documents/DeleGatorCore.md new file mode 100644 index 0000000..713f473 --- /dev/null +++ b/documents/DeleGatorCore.md @@ -0,0 +1,23 @@ +# DeleGator Core + +Defines the interface needed for a `DelegationManager` to invoke an `Action` on behalf of the delegator. + +# MetaMask's DeleGatorCore + +Contains the logic needed for an ERC4337 SCA with delegation functionality. We provide two different "DeleGator implementations" for use: [MultiSigDeleGator](/documents/MultisigDeleGator.md) and [HybridDeleGator](/documents/HybridDeleGator.md). The distinction between the two is the signing mechanisms. + +There are two methods available to upgrade your account to a different implementation. + +- `upgradeToAndCall` - This method is exposed by the UUPSUpgradable contract and upgrades the account to a different implementation defaulting to clearing the storage associated to the account. +- `upgradeToAndCallAndRetainStorage` - This method upgrades the account to a different implementation and retains the storage associated to the account. + +## Rules + +- DeleGator Implementations MUST use namespaced storage. +- DeleGator Implementations MUST inherit from DeleGatorCore as the "most base-like" (furthest right, [more info](https://docs.soliditylang.org/en/v0.8.23/contracts.html#multiple-inheritance-and-linearization)) +- DeleGator Implementations MUST implement ERC-1271 Standard Signature Validation Method for Contracts +- DeleGator Implementations SHOULD return a non ERC-1271 magic value when encountering an invalid signature + +> NOTE: If a DeleGator Implementation implements `reinitialize` it SHOULD gate the method to `onlySelf` to ensure no one can unexpectedly take over the DeleGator. + +> NOTE: A DeleGator Implementation MUST use namespaced storage for ALL variables if it is extending MetaMask's DeleGatorCore. diff --git a/documents/DelegationManager.md b/documents/DelegationManager.md new file mode 100644 index 0000000..db05768 --- /dev/null +++ b/documents/DelegationManager.md @@ -0,0 +1,67 @@ +# Delegation Manager + +A Delegation Manager is responsible for validating delegations and triggering the action to be taken on behalf of the delegator. + +## Rules + +- A Delegation Manager MUST implement `redeemDelegation` interface as specified `function redeemDelegation(bytes calldata _data, Action calldata _action) external;`. + +## Delegations + +Users can allow other contracts or EOAs to invoke an Action directly from their DeleGator Smart Account through a Delegation. There are 2 flows for delegating: onchain and offchain. Both flows require creating a Delegation and sharing some additional data offchain to the delegate for them to be able to redeem the Delegation. + +> NOTE: onchain Delegations are validated at the time of creation, not at the time of execution. This means if anything regarding a DeleGator’s control scheme is changed, the onchain Delegation is not impacted. Contrast this with an offchain Delegation, which is validated at the time of execution. +> +> Example: Alice delegates to Bob the ability to spend her USDC with a 1 of 1 MultiSig DeleGator Account. She then updates her DeleGator Account to a 2 of 3 MultiSig. +> +> - If she delegated onchain, Bob is still able to spend her USDC. +> - If she delegated offchain, the signature will no longer be valid and Bob is not able to spend her USDC. + +# MetaMask's Delegation Manager + +## Creating a Delegation + +Users can create a `Delegation` and provide it to a delegate in the form of an onchain delegation or an offchain delegation. + +### Onchain Delegations + +Onchain Delegations are done through calling the `delegate` method on a DeleGator or DelegationManager. This validates the delegation at this time and the redeemer only needs the `Delegation` to redeem it (no signature needed). + +### Offchain Delegations + +Offchain Delegations are done through signing a `Delegation` and adding it to the `signature` field. Delegates can then redeem Delegations by providing this struct. To get this signature we use [EIP-712](https://eips.ethereum.org/EIPS/eip-712). + +### Open Delegations + +Open delegations are delegations that don't have a strict `delegate`. By setting the `delegate` to the special value `address(0xa11)` the enforcement of the `delegate` address is bypassed allowing users to create a single delegation that can be valid for a whole group of users rather than just one. Open delegations remove the restriction of needing to know the delegate's address at the time of delegation creation and rely entirely on Caveat Enforcers to restrict access to the delegation. + +## Redeeming a Delegation + +`redeemDelegation` method that can be used by delegation redeemers to execute some `Action` which will be verified by the `DelegationManager` before ultimately calling `executeAction` on the root delegator. + +Our `DelegationManager` implementation: + +1. `redeemDelegation` consumes a list of delegations (`Delegation[]`) and an `Action` to be executed + > NOTE: Delegations are ordered from leaf to root. The last delegation in the array must have the root authority. +2. Validates the `msg.sender` calling `redeemDelegation` is allowed to do so +3. Validates the signatures of offchain delegations and that onchain delegations have already been verified +4. Checks if any of the delegations being redeemed are disabled +5. Ensures each delegation has sufficient authority to execute, given by the previous delegation or by being a root delegation +6. Calls `beforeHook` for all delegations (from leaf to root delegation) +7. Executes the `Action` provided +8. Calls `afterHook` for all delegations (from root to leaf delegation) + +> NOTE: Ensure to double check that the delegation is valid before submitting a UserOp. A delegation can be revoked or a signature can be invalidated at any time. +> Validate a delegation redemption by either simulating the transaction or by reading the storage on our implementation `disabledDelegations(delegationHash)`. + +## Re-delegating + +Example: Alice delegates to Bob the ability to transfer USDC, giving Bob the ability to act on her behalf. Bob then "re-delegates" the ability to act on his behalf to Carol and includes the `authority`, a hash of the delegation, given to him from Alice. This enables Carol to act on behalf of Alice. + +## Caveats + +`CaveatEnforcer` contracts are used to place restrictions on Delegations. This allows dapps to craft very granular delegations that only allow actions to take place under specific circumstances. + +> NOTE: each `CaveatEnforcer` is called by the `DelegationManager` contract. This is important when storing data in the `CaveatEnforcer`, as `msg.sender` will always be the address of the `DelegationManager`. + +> NOTE: there is no guarantee that the action is executed. Keep this in mind when designing Caveat Enforcers. If you are relying on the action then be sure to use the `afterHook` method to validate any expected state updates. diff --git a/documents/HybridDeleGator.md b/documents/HybridDeleGator.md new file mode 100644 index 0000000..990a337 --- /dev/null +++ b/documents/HybridDeleGator.md @@ -0,0 +1,29 @@ +# Hybrid DeleGator Smart Contract + +### Overview + +The Hybrid DeleGator is a Solidity smart contract that extends the functionality of the DeleGatorCore contract. It facilitates externally owned account (EOA) signatures and NIST P256 elliptic curve signatures to manage access control for the DeleGator. + +### Considerations + +- Multiple signers can be added but only 1 signer is needed for a valid signature. +- There must always be at least one active signer either EOA or P256. +- There is a function to completely replace all the signers and more specific functions to add or remove signers. +- Contracts as the owner are valid for delegation signature validation but are not valid for UserOp validation. + +### Features + +EOA-Signature Support: Enables signers to use the EOAs signature generation. +P256-Signature Support: Enables signers to use the P256 curve for signature generation. + +Delegation: Allows for delegation of transaction execution to other accounts. + +### P256 Signature Verification + +Signature verification is handled through a slightly modified version of [Damio's P256 Verifier](https://github.com/daimo-eth/p256-verifier) contract. The `P256Verifier` contract is a "Progressive Precompile" contract which will forward verification calls to a precompiled version of the contract if [EIP7212](https://eips.ethereum.org/EIPS/eip-7212) is included on the chain, reducing signature verification gas costs from ~330k to ~3k. + +### P256 Signatures + +Signatures for the P256 DeleGator can be of two types: **Raw P256**, signatures generated using the NIST P256 elliptic curve and **WebAuthn P256**, a signature generated using the P-256 elliptic curve as part of the WebAuthn specification. + +Both signatures use the same elliptic curve but the data signed and how the keys are generated and managed differs. diff --git a/documents/MultisigDeleGator.md b/documents/MultisigDeleGator.md new file mode 100644 index 0000000..e8d1e47 --- /dev/null +++ b/documents/MultisigDeleGator.md @@ -0,0 +1,27 @@ +# MultiSig DeleGator Smart Contract + +### Overview + +The MultiSigDeleGator is a Solidity smart contract that extends the functionality of the DeleGatorCore contract. It facilitates multi-signature based access control and delegation. All signers are externally owned accounts (EOAs). + +### Features + +Multi-Signature Support: Enables multi-signature transactions with a flexible threshold. + +Delegation: Allows for delegation of transaction execution to other accounts. + +The minimum threshold of signatures must be obtained to execute a transaction. + +Signatures must be sorted in ascending order by the address of the signer. + +### Signer Management + +The contract provides functions to manage signers: + +- Replace Signer: Replace an existing signer with a new one. + +- Add Signer: Add a new signer to the contract. + +- Remove Signer: Remove a signer from the contract. + +- Update Threshold: Adjust the threshold for executing transactions. diff --git a/documents/StyleGuide.md b/documents/StyleGuide.md new file mode 100644 index 0000000..4b44cec --- /dev/null +++ b/documents/StyleGuide.md @@ -0,0 +1,163 @@ +# Solidity Contracts Style Guide + +Welcome to our Solidity Contracts Style Guide! 🚀 + +#### Consistency is Key + +Maintaining a consistent naming convention throughout the contract enhances readability and makes the codebase more approachable for collaborators. + +## Contract Layout + +- structs +- state variables (constants and immutable first) +- events +- custom errors +- modifiers +- constructor / initializers / reinitialize +- external +- external view +- external pure +- public +- public view +- public pure +- internal +- internal view +- internal pure +- private +- private view +- private pure + +## Imports + +The imports should be sorted by external dependencies an empty line and then local dependencies. + +```solidity +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.21; + +import { IEntryPoint } from "@account-abstraction/interfaces/IEntryPoint.sol"; +import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; + +import { IDeleGatorCore } from "./interfaces/IDeleGatorCore.sol"; +import { Action, SignedDelegation, Delegation } from "./utils/Types.sol"; +``` + +## Naming Conventions + +### Contracts and Interfaces + +The name of the file should match the name of the contract or interface. + +``` +src/DeleGatorCore.sol +abstract contract DeleGatorCore is IDeleGatorCore, ERC4337Core {} + +src/interfaces/ICaveatEnforcer.sol +interface ICaveatEnforcer {} +``` + +### Constant Variables + +Constants should be named with all capital letters with underscores separating words. +For constants that external sources may want access to, opt for `public` access modifier for consistent compiler generated getters. + +```solidity +uint256 public constant MAX_SUPPLY1 = 1000; +uint256 internal constant MAX_SUPPLY2 = 1000; +uint256 private constant MAX_SUPPLY3 = 1000; +``` + +### State Variables + +State variables should be named in mixedCase with no underscore. + +```solidity +bytes32 public domainHash; +DelegationManager internal delegationManager; +mapping(bytes32 delegationHash => Delegation delegation) delegations; +``` + +### Immutable Variables + +Immutable variables follow the same style as state variables. + +### Modifiers + +Modifiers should use mixedCase. + +```solidity +modifier onlyDelegationManager() {} +``` + +### Events + +Event names should use CapWords style. + +```solidity +event EnabledDelegation(bytes32 indexed delegationHash, address indexed delegator, address indexed delegate); + +``` + +### Custom Errors + +Custom error names should use CapWords style. + +```solidity +error InvalidSignature(); +``` + +### Event parameters + +Event parameters should be named in mixedCase with no underscore. + +```solidity +event EnabledDelegation(address indexed delegator, bytes32 indexed delegationHash); +``` + +### Enums + +Enums should use CapWords style. + +```solidity +enum Implementation { + Ownable, + MultiSig, + P256 +} +``` + +### Function Parameters + +Function parameters should use an underscore prefix to enhance clarity and distinguish them from other variables. For example: + +```solidity +function updateBalance(address _user, uint256 _amount) internal { + // function logic here +} +``` + +### Function Scope Variables + +Internal variables within functions should use an underscore suffix. For example: + +```solidity +function _calculateInterest(uint256 _principal, uint256 _rate) internal returns (uint256 interest_) { + // calculation logic here + uint256 magicNumber_ = 9999; + interest_ = _principal * magicNumber_ * _rate / 100; +} +``` + +### Internal and Private Functions + +Function names for internal and private functions should start with an underscore. + +```solidity +function externalFunction() external {} + +function publicFunction() public {} + +function _internalFunction() internal {} + +function _privateFunction() private {} +``` diff --git a/foundry.toml b/foundry.toml new file mode 100644 index 0000000..8ae4a4a --- /dev/null +++ b/foundry.toml @@ -0,0 +1,29 @@ +# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options + + +[profile.default] +auto_detect_solc = false +src = "src" +out = "out" +libs = ["lib"] +test = "test" +solc = "0.8.23" +fs_permissions = [{ access = "read", path = "./out"},{ access = "read", path = "./broadcast"}, { access = "read-write", path = "./deployments"}] +sparse_mode = true +evm_version = "london" + +[fmt] + bracket_spacing = true + int_types = "long" + line_length = 132 + multiline_func_header = "all" + number_underscore = "preserve" + quote_style = "double" + tab_width = 4 + wrap_comments = true + +[rpc_endpoints] + mainnet = "${MAINNET_RPC_URL}" + linea = "${LINEA_RPC_URL}" + sepolia = "${SEPOLIA_RPC_URL}" + aztec = "${AZTEC_RPC_URL}" \ No newline at end of file diff --git a/lib/FreshCryptoLib b/lib/FreshCryptoLib new file mode 160000 index 0000000..d9bb3b0 --- /dev/null +++ b/lib/FreshCryptoLib @@ -0,0 +1 @@ +Subproject commit d9bb3b0fc6b737af2c70dab246cabbc7d05afc3c diff --git a/lib/account-abstraction b/lib/account-abstraction new file mode 160000 index 0000000..7af70c8 --- /dev/null +++ b/lib/account-abstraction @@ -0,0 +1 @@ +Subproject commit 7af70c8993a6f42973f520ae0752386a5032abe7 diff --git a/lib/forge-std b/lib/forge-std new file mode 160000 index 0000000..ae570fe --- /dev/null +++ b/lib/forge-std @@ -0,0 +1 @@ +Subproject commit ae570fec082bfe1c1f45b0acca4a2b4f84d345ce diff --git a/lib/openzeppelin-contracts b/lib/openzeppelin-contracts new file mode 160000 index 0000000..105fa4e --- /dev/null +++ b/lib/openzeppelin-contracts @@ -0,0 +1 @@ +Subproject commit 105fa4e1b0832a6a40cb7ba6e545bb844f02a711 diff --git a/lib/solidity-bytes-utils b/lib/solidity-bytes-utils new file mode 160000 index 0000000..6458fb2 --- /dev/null +++ b/lib/solidity-bytes-utils @@ -0,0 +1 @@ +Subproject commit 6458fb2780a3092bc756e737f246be1de6d3d362 diff --git a/lib/solidity-stringutils b/lib/solidity-stringutils new file mode 160000 index 0000000..4b2fcc4 --- /dev/null +++ b/lib/solidity-stringutils @@ -0,0 +1 @@ +Subproject commit 4b2fcc43fa0426e19ce88b1f1ec16f5903a2e461 diff --git a/remappings.txt b/remappings.txt new file mode 100644 index 0000000..10bde85 --- /dev/null +++ b/remappings.txt @@ -0,0 +1,8 @@ +@account-abstraction/=lib/account-abstraction/contracts/ +@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/ +@openzeppelin/contracts-upgradeable/=lib/openzeppelin-upgradable-contracts/contracts/ +ds-test/=lib/forge-std/lib/ds-test/src/ +forge-std/=lib/forge-std/src/ +@solidity-stringutils/=lib/solidity-stringutils/src/ +@bytes-utils/=lib/solidity-bytes-utils/contracts/ +@freshCryptoLib/=lib/FreshCryptoLib/solidity/src \ No newline at end of file diff --git a/script/DeployEnvironmentSetUp.s.sol b/script/DeployEnvironmentSetUp.s.sol new file mode 100644 index 0000000..c5912e0 --- /dev/null +++ b/script/DeployEnvironmentSetUp.s.sol @@ -0,0 +1,106 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import "forge-std/Script.sol"; +import { console2 } from "forge-std/console2.sol"; +import { IEntryPoint } from "@account-abstraction/interfaces/IEntryPoint.sol"; + +import { DelegationManager } from "../src/DelegationManager.sol"; +import { MultiSigDeleGator } from "../src/MultiSigDeleGator.sol"; +import { HybridDeleGator } from "../src/HybridDeleGator.sol"; +import { IDelegationManager } from "../src/interfaces/IDelegationManager.sol"; + +import { AllowedCalldataEnforcer } from "../src/enforcers/AllowedCalldataEnforcer.sol"; +import { AllowedMethodsEnforcer } from "../src/enforcers/AllowedMethodsEnforcer.sol"; +import { AllowedTargetsEnforcer } from "../src/enforcers/AllowedTargetsEnforcer.sol"; +import { BlockNumberEnforcer } from "../src/enforcers/BlockNumberEnforcer.sol"; +import { DeployedEnforcer } from "../src/enforcers/DeployedEnforcer.sol"; +import { ERC20BalanceGteEnforcer } from "../src/enforcers/ERC20BalanceGteEnforcer.sol"; +import { ERC20TransferAmountEnforcer } from "../src/enforcers/ERC20TransferAmountEnforcer.sol"; +import { IdEnforcer } from "../src/enforcers/IdEnforcer.sol"; +import { LimitedCallsEnforcer } from "../src/enforcers/LimitedCallsEnforcer.sol"; +import { NonceEnforcer } from "../src/enforcers/NonceEnforcer.sol"; +import { TimestampEnforcer } from "../src/enforcers/TimestampEnforcer.sol"; +import { ValueLteEnforcer } from "../src/enforcers/ValueLteEnforcer.sol"; + +/** + * @title DeployEnvironmentSetUp + * @notice Deploys the required contracts for the delegation system to function. + * interacting with a chain where the required contracts have already been deployed. + * @dev These contracts are likely already deployed on a testnet or mainnet as many are singletons. + * @dev run the script with: + * forge script script/DeployEnvironmentSetUp.s.sol --rpc-url --private-key $PRIVATE_KEY --broadcast + */ +contract DeployEnvironmentSetUp is Script { + bytes32 salt; + IEntryPoint entryPoint; + address deployer; + + function setUp() public { + salt = bytes32(abi.encodePacked(vm.envString("SALT"))); + entryPoint = IEntryPoint(vm.envAddress("ENTRYPOINT_ADDRESS")); + deployer = msg.sender; + console2.log("~~~"); + console2.log("Deployer: %s", address(deployer)); + console2.log("Entry Point: %s", address(entryPoint)); + console2.log("Salt:"); + console2.logBytes32(salt); + } + + function run() public { + console2.log("~~~"); + vm.startBroadcast(); + + // Deploy Delegation Environment Contracts + address delegationManager = address(new DelegationManager{ salt: salt }(deployer)); + console2.log("DelegationManager: %s", address(delegationManager)); + + address multiSigDeleGatorImpl_ = + address(new MultiSigDeleGator{ salt: salt }(IDelegationManager(delegationManager), entryPoint)); + console2.log("MultiSigDeleGatorImpl: %s", address(multiSigDeleGatorImpl_)); + + address hybridDeleGatorImpl_ = address(new HybridDeleGator{ salt: salt }(IDelegationManager(delegationManager), entryPoint)); + console2.log("HybridDeleGatorImpl: %s", address(hybridDeleGatorImpl_)); + + console2.log("~~~"); + + // Caveat Enforcers + address allowedCalldataEnforcer = address(new AllowedCalldataEnforcer{ salt: salt }()); + console2.log("AllowedCalldataEnforcer: %s", address(allowedCalldataEnforcer)); + + address allowedMethodsEnforcer = address(new AllowedMethodsEnforcer{ salt: salt }()); + console2.log("AllowedMethodsEnforcer: %s", address(allowedMethodsEnforcer)); + + address allowedTargetsEnforcer = address(new AllowedTargetsEnforcer{ salt: salt }()); + console2.log("AllowedTargetsEnforcer: %s", address(allowedTargetsEnforcer)); + + address blockNumberEnforcer = address(new BlockNumberEnforcer{ salt: salt }()); + console2.log("BlockNumberEnforcer: %s", address(blockNumberEnforcer)); + + address deployedEnforcer = address(new DeployedEnforcer{ salt: salt }()); + console2.log("DeployedEnforcer: %s", address(deployedEnforcer)); + + address erc20BalanceGteEnforcer = address(new ERC20BalanceGteEnforcer{ salt: salt }()); + console2.log("ERC20BalanceGteEnforcer: %s", address(erc20BalanceGteEnforcer)); + + address erc20TransferAmountEnforcer = address(new ERC20TransferAmountEnforcer{ salt: salt }()); + console2.log("ERC20TransferAmountEnforcer: %s", address(erc20TransferAmountEnforcer)); + + address idEnforcer = address(new IdEnforcer{ salt: salt }()); + console2.log("IdEnforcer: %s", address(idEnforcer)); + + address limitedCallsEnforcer = address(new LimitedCallsEnforcer{ salt: salt }()); + console2.log("LimitedCallsEnforcer: %s", address(limitedCallsEnforcer)); + + address nonceEnforcer = address(new NonceEnforcer{ salt: salt }()); + console2.log("NonceEnforcer: %s", address(nonceEnforcer)); + + address timestampEnforcer = address(new TimestampEnforcer{ salt: salt }()); + console2.log("TimestampEnforcer: %s", address(timestampEnforcer)); + + address valueLteEnfocer = address(new ValueLteEnforcer{ salt: salt }()); + console2.log("ValueLteEnforcer: %s", address(valueLteEnfocer)); + + vm.stopBroadcast(); + } +} diff --git a/script/DeployMultiSigDeleGator.s.sol b/script/DeployMultiSigDeleGator.s.sol new file mode 100644 index 0000000..4f2cf74 --- /dev/null +++ b/script/DeployMultiSigDeleGator.s.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import "forge-std/Script.sol"; +import { console2 } from "forge-std/console2.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; + +import { MultiSigDeleGator } from "../src/MultiSigDeleGator.sol"; + +/** + * @title DeployMultiSigDeleGator + * @notice Deploying a DeleGator account requires the deployment of the set up contracts. Ensure you've run `DeploySetUp` or are + * interacting with a chain where the required contracts have already been deployed. + * @notice This script will deploy a MultiSigDeleGator with a threshold of 1 and the owner as the wallet from the PRIVATE_KEY + * environment variable. + * @dev run the script with `forge script script/DeployMultiSigDeleGator.s.sol --ffi --rpc-url ` + */ +contract DeployMultiSigDeleGator is Script { + bytes32 salt; + MultiSigDeleGator multiSigDeleGatorImplementation; + address deployer; + + function setUp() public { + salt = bytes32(abi.encodePacked(vm.envString("SALT"))); + multiSigDeleGatorImplementation = MultiSigDeleGator(payable(vm.envAddress("MULTISIG_DELEGATOR_IMPLEMENTATION_ADDRESS"))); + deployer = msg.sender; + console2.log("~~~"); + console2.log("Deployer: %s", address(deployer)); + console2.log("DeleGator Implementation: %s", address(multiSigDeleGatorImplementation)); + console2.log("Salt:"); + console2.logBytes32(salt); + } + + function run() public { + console2.log("~~~"); + vm.startBroadcast(); + + address[] memory signers_ = new address[](1); + signers_[0] = msg.sender; + uint256 threshold = 1; + + address multiSigDeleGator_ = address( + new ERC1967Proxy( + address(multiSigDeleGatorImplementation), + abi.encodeWithSelector(MultiSigDeleGator.initialize.selector, signers_, threshold) + ) + ); + console2.log("MultiSigDeleGator: %s", address(multiSigDeleGator_)); + + vm.stopBroadcast(); + } +} diff --git a/script/coverage.sh b/script/coverage.sh new file mode 100755 index 0000000..a98a53f --- /dev/null +++ b/script/coverage.sh @@ -0,0 +1,40 @@ +set -e # Exit on error + +cd .. + +folder_path="coverage" + +if [ ! -d "$folder_path" ]; then + # If not, create the folder + mkdir -p "$folder_path" + echo "Folder created at: $folder_path" +else + echo "Folder already exists at: $folder_path" +fi + + + +# # Generates lcov.info +forge coverage --ir-minimum --report lcov --report-file "$folder_path/lcov.info" + +# Filter out test, mock, and script files +lcov \ + --rc branch_coverage=1 \ + --remove "$folder_path/lcov.info" \ + --output-file "$folder_path/filtered-lcov.info" \ + "test/*.*" "script/*.*" + +# Generate summary +lcov \ + --rc branch_coverage=1 \ + --list "$folder_path/filtered-lcov.info" + +# Open more granular breakdown in browser +if [ "$CI" != "true" ] +then + genhtml \ + --rc branch_coverage=1 \ + --output-directory "$folder_path" \ + "$folder_path/filtered-lcov.info" + open "$folder_path/index.html" +fi diff --git a/src/DeleGatorCore.sol b/src/DeleGatorCore.sol new file mode 100644 index 0000000..5ab1b8b --- /dev/null +++ b/src/DeleGatorCore.sol @@ -0,0 +1,425 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { IEntryPoint } from "@account-abstraction/interfaces/IEntryPoint.sol"; +import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; +import { IERC1271 } from "@openzeppelin/contracts/interfaces/IERC1271.sol"; +import { MessageHashUtils } from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; +import { UUPSUpgradeable } from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; +import { IERC1155Receiver } from "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol"; +import { IERC721Receiver } from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; +import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol"; +import { ERC1967Utils } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol"; + +import { ERC1271Lib } from "./libraries/ERC1271Lib.sol"; +import { IDeleGatorCore } from "./interfaces/IDeleGatorCore.sol"; +import { IDelegationManager } from "./interfaces/IDelegationManager.sol"; +import { Action, Delegation, PackedUserOperation } from "./utils/Types.sol"; +import { ExecutionLib } from "./libraries/ExecutionLib.sol"; + +/** + * @title DeleGatorCore + * @notice This contract contains the shared logic for a DeleGator SCA implementation. + * @dev Implements the interface needed for a DelegationManager to interact with a DeleGator implementation. + * @dev DeleGator implementations can inherit this to enable Delegation, ERC4337 and UUPS. + * @dev DeleGator implementations MUST use Namespaced Storage to ensure subsequent UUPS implementation updates are safe. + */ +abstract contract DeleGatorCore is Initializable, UUPSUpgradeable, IERC165, IDeleGatorCore, IERC721Receiver, IERC1155Receiver { + using MessageHashUtils for bytes32; + + ////////////////////////////// State ////////////////////////////// + + /// @dev The DelegationManager contract that has root access to this contract + IDelegationManager public immutable delegationManager; + + /// @dev The EntryPoint contract that has root access to this contract + IEntryPoint public immutable entryPoint; + + ////////////////////////////// Events ////////////////////////////// + + /// @dev Emitted when the Delegation manager is set + event SetDelegationManager(IDelegationManager indexed newDelegationManager); + + /// @dev Emitted when the EntryPoint is set + event SetEntryPoint(IEntryPoint indexed entryPoint); + + /// @dev Emitted when the storage is cleared + event ClearedStorage(); + + ////////////////////////////// Errors ////////////////////////////// + + /// @dev Error thrown when the caller is not this contract. + error NotSelf(); + + /// @dev Error thrown when the caller is not the entry point. + error NotEntryPoint(); + + /// @dev Error thrown when the caller is not the EntryPoint or this contract. + error NotEntryPointOrSelf(); + + /// @dev Error thrown when the caller is not the delegation manager. + error NotDelegationManager(); + + ////////////////////////////// Modifiers ////////////////////////////// + + /** + * @notice Require the function call to come from the EntryPoint. + * @dev Check that the caller is the entry point + */ + modifier onlyEntryPoint() { + if (msg.sender != address(entryPoint)) revert NotEntryPoint(); + _; + } + + /** + * @notice Require the function call to come from the EntryPoint or this contract. + * @dev Check that the caller is either the delegator contract itself or the entry point + */ + modifier onlyEntryPointOrSelf() { + if (msg.sender != address(entryPoint) && msg.sender != address(this)) revert NotEntryPointOrSelf(); + _; + } + + /** + * @notice Require the function call to come from the DelegationManager. + * @dev Check that the caller is the stored delegation manager. + */ + modifier onlyDelegationManager() { + if (msg.sender != address(delegationManager)) revert NotDelegationManager(); + _; + } + + ////////////////////////////// Constructor ////////////////////////////// + + /** + * @notice Initializes the DeleGatorCore contract + * @custom:oz-upgrades-unsafe-allow constructor + * @param _delegationManager the address of the trusted DelegationManager contract that will have root access to this contract + */ + constructor(IDelegationManager _delegationManager, IEntryPoint _entryPoint) { + _disableInitializers(); + delegationManager = _delegationManager; + entryPoint = _entryPoint; + emit SetDelegationManager(_delegationManager); + emit SetEntryPoint(_entryPoint); + } + + ////////////////////////////// External Methods ////////////////////////////// + + /** + * @notice Allows this contract to receive the chains native token + */ + receive() external payable { } + + /** + * @notice Redeems a delegation on the DelegationManager and executes the action as the root delegator + * @dev `_data` is made up of an array of `Delegation` structs that are used to validate the authority given to execute the + * action + * on the root delegator ordered from leaf to root. + * @param _data the data used to validate the authority given to execute the action + * @param _action The action to be executed + */ + function redeemDelegation(bytes calldata _data, Action calldata _action) external onlyEntryPointOrSelf { + delegationManager.redeemDelegation(_data, _action); + } + + /// @inheritdoc IDeleGatorCore + function executeDelegatedAction(Action calldata _action) external onlyDelegationManager { + ExecutionLib._execute(_action); + } + + /** + * @notice Executes an Action from this contract + * @dev This method is intended to be called through a UserOp which ensures the invoker has sufficient permissions + * @dev This method reverts if the action fails. + * @param _action the action to execute + */ + function execute(Action calldata _action) external onlyEntryPoint { + ExecutionLib._execute(_action); + } + + /** + * @notice This method executes several Actions in order. + * @dev This method is intended to be called through a UserOp which ensures the invoker has sufficient permissions. + * @dev This method reverts if any of the actions fail. + * @param _actions the ordered actions to execute + */ + function executeBatch(Action[] calldata _actions) external onlyEntryPointOrSelf { + ExecutionLib._executeBatch(_actions); + } + + /** + * @notice Validates a UserOp signature and sends any necessary funds to the EntryPoint + * @dev Related: ERC4337 + * @param _userOp The UserOp struct to validate + * @param _userOpHash The hash of the UserOp struct + * @param _missingAccountFunds The missing funds from the account + * @return validationData_ The validation data + */ + function validateUserOp( + PackedUserOperation calldata _userOp, + bytes32 _userOpHash, + uint256 _missingAccountFunds + ) + external + onlyEntryPoint + onlyProxy + returns (uint256 validationData_) + { + validationData_ = _validateUserOpSignature(_userOp, _userOpHash); + ExecutionLib._payPrefund(_missingAccountFunds); + } + + /** + * @inheritdoc IERC1271 + * @notice Verifies the signatures of the signers. + * @dev Related: ERC4337, Delegation + * @param _hash The hash of the data signed. + * @param _signature The signatures of the signers. + * @return magicValue_ A bytes4 magic value which is EIP1271_MAGIC_VALUE(0x1626ba7e) if the signature is valid, returns + * SIG_VALIDATION_FAILED(0xffffffff) if there is a signature mismatch and reverts (for all other errors). + */ + function isValidSignature( + bytes32 _hash, + bytes calldata _signature + ) + external + view + override + onlyProxy + returns (bytes4 magicValue_) + { + return _isValidSignature(_hash, _signature); + } + + /// @inheritdoc IERC721Receiver + function onERC721Received(address, address, uint256, bytes memory) external view override onlyProxy returns (bytes4) { + return this.onERC721Received.selector; + } + + /// @inheritdoc IERC1155Receiver + function onERC1155Received( + address, + address, + uint256, + uint256, + bytes memory + ) + external + view + override + onlyProxy + returns (bytes4) + { + return this.onERC1155Received.selector; + } + + /// @inheritdoc IERC1155Receiver + function onERC1155BatchReceived( + address, + address, + uint256[] memory, + uint256[] memory, + bytes memory + ) + public + view + override + onlyProxy + returns (bytes4) + { + return this.onERC1155BatchReceived.selector; + } + + /** + * @notice Deposits more funds for this account in the entry point + * @dev Related: ERC4337 + */ + function addDeposit() external payable onlyProxy { + entryPoint.depositTo{ value: msg.value }(address(this)); + } + + /** + * @notice This method withdraws funds of this account from the entry point + * @dev Related: ERC4337 + * @param _withdrawAddress Address to withdraw the amount to + * @param _withdrawAmount Amount to be withdraw from the entry point + */ + function withdrawDeposit(address payable _withdrawAddress, uint256 _withdrawAmount) external onlyEntryPointOrSelf { + entryPoint.withdrawTo(_withdrawAddress, _withdrawAmount); + } + + /** + * @notice Delegates authority to an address and caches the delegation hash onchain + * @dev Forwards a call to the DelegationManager to delegate + * @param _delegation The delegation to be stored + */ + function delegate(Delegation calldata _delegation) external onlyEntryPointOrSelf { + delegationManager.delegate(_delegation); + } + + /** + * @notice Disables a delegation from being used + * @param _delegation The delegation to be disabled + */ + function disableDelegation(Delegation calldata _delegation) external onlyEntryPointOrSelf { + delegationManager.disableDelegation(_delegation); + } + + /** + * @notice Enables a delegation to be used + * @dev Delegations only need to be enabled if they have been disabled + * @param _delegation The delegation to be enabled + */ + function enableDelegation(Delegation calldata _delegation) external onlyEntryPointOrSelf { + delegationManager.enableDelegation(_delegation); + } + + /** + * @notice Retains storage and updates the logic contract in use. + * @dev Related: UUPS + * @param _newImplementation Address of the new logic contract to use. + * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. + */ + function upgradeToAndCallAndRetainStorage(address _newImplementation, bytes memory _data) external payable { + super.upgradeToAndCall(_newImplementation, _data); + } + + /** + * @notice Clears storage by default and updates the logic contract in use. + * @dev Related: UUPS + * @param _newImplementation Address of the new logic contract to use. + * @param _data Data to send as msg.data to the implementation to initialize the proxied contract. + */ + function upgradeToAndCall(address _newImplementation, bytes memory _data) public payable override { + _clearDeleGatorStorage(); + super.upgradeToAndCall(_newImplementation, _data); + } + + /** + * @notice Checks if the delegation is disabled + * @param _delegationHash the hash of the delegation to check for disabled status. + * @return bool is the delegation disabled + */ + function isDelegationDisabled(bytes32 _delegationHash) external view returns (bool) { + return delegationManager.disabledDelegations(_delegationHash); + } + + /** + * @notice Checks if the delegation hash has been cached onchain + * @param _delegationHash the hash of the delegation to check for + * @return bool is the delegation stored onchain + */ + function isDelegationOnchain(bytes32 _delegationHash) external view returns (bool) { + return delegationManager.onchainDelegations(_delegationHash); + } + + /** + * @notice Gets the current account's deposit in the entry point + * @dev Related: ERC4337 + * @return uint256 The current account's deposit in the entry point + */ + function getDeposit() external view returns (uint256) { + return entryPoint.balanceOf(address(this)); + } + + /** + * @notice Retrieves the address of the current UUPS Logic contract + * @dev Related: UUPS + * @return The address of the current UUPS Logic contract. + */ + function getImplementation() external view returns (address) { + return ERC1967Utils.getImplementation(); + } + + /** + * @notice Retrieves the version of the current UUPS Logic contract + * @dev This version number is moreso the count of initializations that have occurred for this proxy contract. + * @dev Related: UUPS + */ + function getInitializedVersion() external view returns (uint64) { + return _getInitializedVersion(); + } + + /** + * @notice Returns the next sequential nonce using a static key + * @dev Related: ERC4337 + * @return uint256 The next sequential nonce + */ + function getNonce() external view returns (uint256) { + return entryPoint.getNonce(address(this), 0); + } + + /** + * @notice Returns the next sequential nonce using a custom key + * @dev Related: ERC4337 + * @return uint256 The next sequential nonce for the key provided + * @param _key The key to use for the nonce + */ + function getNonce(uint192 _key) external view returns (uint256) { + return entryPoint.getNonce(address(this), _key); + } + + /** + * @inheritdoc IERC165 + * @dev Supports the following interfaces: IDeleGatorCore, IERC721Receiver, IERC1155Receiver, IERC165, IERC1271 + */ + function supportsInterface(bytes4 _interfaceId) public view virtual override(IERC165) onlyProxy returns (bool) { + return _interfaceId == type(IDeleGatorCore).interfaceId || _interfaceId == type(IERC721Receiver).interfaceId + || _interfaceId == type(IERC1155Receiver).interfaceId || _interfaceId == type(IERC165).interfaceId + || _interfaceId == type(IERC1271).interfaceId; + } + + ////////////////////////////// Internal Methods ////////////////////////////// + + /** + * @notice The logic to verify if the signature is valid for this contract + * @dev This is an internal function that should be overridden by the implementing contract based on the signature scheme used. + * @dev Related: ERC4337 + * @param _hash The hash of the data signed. + * @param _signature The signatures of the signers. + * @return A bytes4 magic value which is EIP1271_MAGIC_VALUE(0x1626ba7e) if the signature is valid, returns + * SIG_VALIDATION_FAILED(0xffffffff) if there is a signature mismatch and reverts (for all other errors). + */ + function _isValidSignature(bytes32 _hash, bytes calldata _signature) internal view virtual returns (bytes4); + + /** + * @notice Clears the storage being used by a DeleGator Implementation + * @dev Related: UUPS + */ + function _clearDeleGatorStorage() internal virtual; + + /** + * @notice Validates that the sender is allowed to upgrade the contract + * @dev Related: UUPS + * @dev This is needed for UUPS secure upgradeability + * @param _newImplementation The address of the new implementation. + */ + function _authorizeUpgrade(address _newImplementation) internal override onlyEntryPointOrSelf { } + + /** + * @notice Validates a UserOp signature and returns a code indicating if the signature is valid or not + * @dev This method calls the DeleGator implementations `_isValidSignature` to validate the signature according to the + * implementations auth scheme. + * @dev Returns 0 if the signature is valid, 1 if the signature is invalid. + * @dev Related: ERC4337 + * @param _userOp The UserOp + * @param _userOpHash The hash of the UserOp + * @return validationData_ A code indicating if the signature is valid or not + */ + function _validateUserOpSignature( + PackedUserOperation calldata _userOp, + bytes32 _userOpHash + ) + internal + view + returns (uint256 validationData_) + { + bytes4 result_ = _isValidSignature(_userOpHash.toEthSignedMessageHash(), _userOp.signature); + if (result_ == ERC1271Lib.EIP1271_MAGIC_VALUE) { + return 0; + } else { + return 1; + } + } +} diff --git a/src/DelegationManager.sol b/src/DelegationManager.sol new file mode 100644 index 0000000..f7b72b5 --- /dev/null +++ b/src/DelegationManager.sol @@ -0,0 +1,265 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { MessageHashUtils } from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; +import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import { Ownable2Step, Ownable } from "@openzeppelin/contracts/access/Ownable2Step.sol"; +import { IERC1271 } from "@openzeppelin/contracts/interfaces/IERC1271.sol"; +import { Pausable } from "@openzeppelin/contracts/utils/Pausable.sol"; +import { EIP712 } from "@openzeppelin/contracts/utils/cryptography/EIP712.sol"; + +import { ICaveatEnforcer } from "./interfaces/ICaveatEnforcer.sol"; +import { IDelegationManager } from "./interfaces/IDelegationManager.sol"; +import { IDeleGatorCore } from "./interfaces/IDeleGatorCore.sol"; +import { Action, Delegation, Caveat } from "./utils/Types.sol"; +import { EncoderLib } from "./libraries/EncoderLib.sol"; +import { ERC1271Lib } from "./libraries/ERC1271Lib.sol"; + +/** + * @title DelegationManager + * @notice This contract is used to manage delegations. Users can cache hashes of delegations onchain within this contract. + * Delegations + * can be validated and executed through this contract. + */ +contract DelegationManager is IDelegationManager, Ownable2Step, Pausable, EIP712 { + using MessageHashUtils for bytes32; + + ////////////////////////////// State ////////////////////////////// + + /// @dev The name of the contract + string public constant NAME = "DelegationManager"; + + /// @dev The full version of the contract + string public constant VERSION = "1.0.0"; + + /// @dev The version used in the domainSeparator for EIP712 + string public constant DOMAIN_VERSION = "1"; + + /// @dev Special authority value. Indicates that the delegator is the authority + bytes32 public constant ROOT_AUTHORITY = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; + + /// @dev Special delegate value. Allows any delegate to redeem the delegation + address public constant ANY_DELEGATE = address(0xa11); + + /// @dev A mapping of delegation hashes that have been cached onchain + mapping(bytes32 delegationHash => bool isOnchain) public onchainDelegations; + + /// @dev A mapping of delegation hashes that have been disabled by the delegator + mapping(bytes32 delegationHash => bool isDisabled) public disabledDelegations; + + ////////////////////////////// Modifier ////////////////////////////// + + /** + * @notice Require the caller to be the delegator + * This is to prevent others from accessing protected methods. + * @dev Check that the caller is delegator. + */ + modifier onlyDeleGator(address delegator) { + if (delegator != msg.sender) revert InvalidDelegator(); + _; + } + + ////////////////////////////// Constructor ////////////////////////////// + + /** + * @notice Initializes Ownable and the DelegationManager's state + * @param _owner The initial owner of the contract + */ + constructor(address _owner) Ownable(_owner) EIP712(NAME, DOMAIN_VERSION) { + bytes32 DOMAIN_HASH = _domainSeparatorV4(); + emit SetDomain(DOMAIN_HASH, NAME, DOMAIN_VERSION, block.chainid, address(this)); + } + + ////////////////////////////// External Methods ////////////////////////////// + + /** + * @notice Allows the owner of the DelegationManager to pause delegation redemption functionality + */ + function pause() external onlyOwner { + _pause(); + } + + /** + * @notice Allows the owner of the DelegationManager to unpause the delegation redemption functionality + */ + function unpause() external onlyOwner { + _unpause(); + } + + /** + * @notice This method is used to cache a delegation's hash onchain for future use + * @dev This method MUST be called by the delegator + * @dev Caching a delegation onchain allows the system to trust that the delegation was already authorized at the time of + * redemption + * @param _delegation The delegation to be stored + */ + function delegate(Delegation calldata _delegation) external onlyDeleGator(_delegation.delegator) { + bytes32 delegationHash_ = getDelegationHash(_delegation); + if (onchainDelegations[delegationHash_]) revert AlreadyExists(); + onchainDelegations[delegationHash_] = true; + emit Delegated(delegationHash_, _delegation.delegator, _delegation.delegate, _delegation); + } + + /** + * @notice This method is used to disable a delegation. Disabled delegations will fail upon redemption. + * @dev This method MUST be called by the delegator + * @dev This method supports disabling offchain and onchain delegations + * @param _delegation The delegation to be disabled + */ + function disableDelegation(Delegation calldata _delegation) external onlyDeleGator(_delegation.delegator) { + bytes32 delegationHash_ = getDelegationHash(_delegation); + if (disabledDelegations[delegationHash_]) revert AlreadyDisabled(); + disabledDelegations[delegationHash_] = true; + emit DisabledDelegation(delegationHash_, _delegation.delegator, _delegation.delegate, _delegation); + } + + /** + * @notice This method is used to enable a delegation + * @dev This method MUST be called by the delegator + * @dev This method supports enabling offchain and onchain delegations + * @dev This method is only needed when a delegation has previously been disabled + * @param _delegation The delegation to be disabled + */ + function enableDelegation(Delegation calldata _delegation) external onlyDeleGator(_delegation.delegator) { + bytes32 delegationHash_ = getDelegationHash(_delegation); + if (!disabledDelegations[delegationHash_]) revert AlreadyEnabled(); + disabledDelegations[delegationHash_] = false; + emit EnabledDelegation(delegationHash_, _delegation.delegator, _delegation.delegate, _delegation); + } + + /** + * @notice This method validates the provided data and executes the action if the caller has authority to do so. + * @dev _data is made up of an array of `Delegation` structs that are used to validate the authority given to execute the action + * on the root delegator ordered from leaf to root. + * @dev Delegations can be invalidated for a number of reasons at any moment including invalid signatures due to ownership + * changes, disabled delegations or arbitrary caveat + * restrictions. Be sure to validate offchain before submitting anything onchain. + * @dev Delegations are ordered from leaf to root. The last delegation in the array must have the root authority. + * @dev Delegations can come in the form of offchain or onchain delegations. Offchain delegations are signed by the delegator + * and are validated at the time of redemption. Onchain delegations are validated at the time of delegation and are trusted to + * be valid at the time of redemption. + * @dev Caveats are enforced with the order: `beforeHook` from leaf to root, execute action, `afterHook` from root to leaf + * @param _data the data used to validate the authority given to execute the action. + * @param _action the action to be executed + */ + function redeemDelegation(bytes calldata _data, Action calldata _action) external whenNotPaused { + Delegation[] memory delegations_ = abi.decode(_data, (Delegation[])); + + // Validate caller + if (delegations_.length == 0) { + revert NoDelegationsProvided(); + } + + // Load delegation hashes and validate signatures (leaf to root) + bytes32[] memory delegationHashes_ = new bytes32[](delegations_.length); + Delegation memory delegation_; + + // Validate caller + if (delegations_[0].delegate != msg.sender && delegations_[0].delegate != ANY_DELEGATE) { + revert InvalidDelegate(); + } + + for (uint256 i; i < delegations_.length; ++i) { + delegation_ = delegations_[i]; + delegationHashes_[i] = EncoderLib._getDelegationHash(delegation_); + + if (delegation_.signature.length == 0) { + // Ensure that delegations without signatures have already been validated onchain + if (!onchainDelegations[delegationHashes_[i]]) { + revert InvalidDelegation(); + } + } else { + // If the delegation is offchain + // Check if the delegator is an EOA or a contract + address delegator_ = delegation_.delegator; + + if (delegator_.code.length == 0) { + // Validate delegation if it's an EOA + address result_ = ECDSA.recover( + MessageHashUtils.toTypedDataHash(getDomainHash(), delegationHashes_[i]), delegation_.signature + ); + if (result_ != delegator_) revert InvalidSignature(); + } else { + // Validate delegation if it's a contract + bytes32 typedDataHash_ = MessageHashUtils.toTypedDataHash(getDomainHash(), delegationHashes_[i]); + + bytes32 result_ = IERC1271(delegator_).isValidSignature(typedDataHash_, delegation_.signature); + if (result_ != ERC1271Lib.EIP1271_MAGIC_VALUE) { + revert InvalidSignature(); + } + } + } + } + + // (leaf to root) + for (uint256 i; i < delegations_.length; ++i) { + // Validate if delegation is disabled + if (disabledDelegations[delegationHashes_[i]]) { + revert CannotUseADisabledDelegation(); + } + + // Validate authority + if (i != delegations_.length - 1) { + if (delegations_[i].authority != delegationHashes_[i + 1]) { + revert InvalidAuthority(); + } + // Validate delegate + address nextDelegate = delegations_[i + 1].delegate; + if (nextDelegate != ANY_DELEGATE && delegations_[i].delegator != nextDelegate) { + revert InvalidDelegate(); + } + } else if (delegations_[i].authority != ROOT_AUTHORITY) { + revert InvalidAuthority(); + } + } + + { + // beforeHook (leaf to root) + for (uint256 i; i < delegations_.length; ++i) { + Caveat[] memory caveats_ = delegations_[i].caveats; + bytes32 delegationHash_ = delegationHashes_[i]; + address delegator_ = delegations_[i].delegator; + uint256 caveatsLength_ = caveats_.length; + for (uint256 j; j < caveatsLength_; ++j) { + ICaveatEnforcer enforcer_ = ICaveatEnforcer(caveats_[j].enforcer); + enforcer_.beforeHook(caveats_[j].terms, caveats_[j].args, _action, delegationHash_, delegator_, msg.sender); + } + } + } + + // Execute action (root) + IDeleGatorCore(delegations_[delegations_.length - 1].delegator).executeDelegatedAction(_action); + + // afterHook (root to leaf) + for (uint256 i = delegations_.length; i > 0; --i) { + Caveat[] memory caveats_ = delegations_[i - 1].caveats; + bytes32 delegationHash_ = delegationHashes_[i - 1]; + address delegator_ = delegations_[i - 1].delegator; + uint256 caveatsLength_ = caveats_.length; + for (uint256 j; j < caveatsLength_; ++j) { + ICaveatEnforcer enforcer_ = ICaveatEnforcer(caveats_[j].enforcer); + enforcer_.afterHook(caveats_[j].terms, caveats_[j].args, _action, delegationHash_, delegator_, msg.sender); + } + } + for (uint256 i; i < delegations_.length; ++i) { + emit RedeemedDelegation(delegations_[delegations_.length - 1].delegator, msg.sender, delegations_[i]); + } + } + + /** + * @notice This method returns the domain hash used for signing typed data + * @return bytes32 The domain hash + */ + function getDomainHash() public view returns (bytes32) { + return _domainSeparatorV4(); + } + + /** + * @notice Creates a hash of a Delegation + * @dev Used in EIP712 signatures and as a key for storing delegations onchain + * @param _input A Delegation struct + */ + function getDelegationHash(Delegation calldata _input) public pure returns (bytes32) { + return EncoderLib._getDelegationHash(_input); + } +} diff --git a/src/HybridDeleGator.sol b/src/HybridDeleGator.sol new file mode 100644 index 0000000..b062c43 --- /dev/null +++ b/src/HybridDeleGator.sol @@ -0,0 +1,389 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import { IEntryPoint } from "@account-abstraction/interfaces/IEntryPoint.sol"; + +import { DeleGatorCore } from "./DeleGatorCore.sol"; +import { IDelegationManager } from "./interfaces/IDelegationManager.sol"; +import { ERC1271Lib } from "./libraries/ERC1271Lib.sol"; +import { P256VerifierLib } from "./libraries/P256VerifierLib.sol"; +import { P256FCLVerifierLib } from "./libraries/P256FCLVerifierLib.sol"; +import { P256PublicKey } from "./utils/Types.sol"; +import { IERC173 } from "./interfaces/IERC173.sol"; + +/// @custom:storage-location erc7201:DeleGator.HybridDeleGator +struct HybridDeleGatorStorage { + address owner; + mapping(bytes32 keyIdHash => P256PublicKey) authorizedKeys; + bytes32[] keyIdHashes; +} + +/** + * @title HybridDeleGator Contract + * @dev This contract extends the DelegatorCore contracts. It provides functionality to validate P256 and EOA signatures. + * @dev The signers that control the DeleGator are EOA, raw P256 keys or WebAuthn P256 public keys. + * @notice There can be multiple signers configured for the DeleGator but only one signature is needed for a valid signature. + * @notice There must be at least one active signer. + */ +contract HybridDeleGator is DeleGatorCore, IERC173 { + ////////////////////////////// State ////////////////////////////// + + /// @dev The version of the contract + string public constant VERSION = "1.0.0"; + + /// @dev The storage location used for state + /// @dev keccak256(abi.encode(uint256(keccak256("DeleGator.HybridDeleGator")) - 1)) & ~bytes32(uint256(0xff)) + bytes32 private constant DELEGATOR_STORAGE_LOCATION = 0xa2b1bcb5e16cee2a8898b49cb0c3605e70c16f429f6002ed8b1bc5612a694900; + + ////////////////////////////// Events ////////////////////////////// + + /// @dev Event emitted when a P256 key is added + event AddedP256Key(bytes32 indexed keyIdHash, string keyId, uint256 x, uint256 y); + + /// @dev Event emitted when a P256 key is removed + event RemovedP256Key(bytes32 indexed keyIdHash, uint256 x, uint256 y); + + ////////////////////////////// Errors ////////////////////////////// + + /// @dev Error emitted when a P256 key already exists + error KeyAlreadyExists(bytes32 keyIdHash); + + /// @dev Error emitted when a P256 key is not stored and attempted to be removed + error KeyDoesNotExist(bytes32 keyIdHash); + + /// @dev Error emitted when the last signer is attempted to be removed + error CannotRemoveLastSigner(); + + /// @dev Error emitted when the input lengths do not match + error InputLengthsMismatch(uint256 keyIdsLength, uint256 xValuesLength, uint256 yValuesLength); + + /// @dev Error emitted when attempting to update to a state with no signers + error SignersCannotBeEmpty(); + + /// @dev Error emitted when a P256 key is not on the curve + error KeyNotOnCurve(uint256 x, uint256 y); + + /// @dev Error emitted when an empty key is attempted to be added + error InvalidEmptyKey(); + + ////////////////////////////// Constructor ////////////////////////////// + + /** + * @notice Constructor for the HybridDeleGator + * @param _delegationManager the address of the trusted DelegationManager contract that will have root access to this contract + * @param _entryPoint The entry point contract address + */ + constructor(IDelegationManager _delegationManager, IEntryPoint _entryPoint) DeleGatorCore(_delegationManager, _entryPoint) { } + + /** + * @notice Initializes the HybridDeleGator state by setting the owners. + * @dev Used by UUPS proxies to initialize the contract state + * @dev Contract owners require staking in the EntryPoint to enable signature + * verification during UserOp validation. + * @dev The Key ID of a WebAuthn P256 should be used for data retention, otherwise a random string should be used + * @param _owner The address of the EOA owner to set + * @param _keyIds The list of key Ids to be added + * @param _xValues List of Public key's X coordinates + * @param _yValues List of Public key's Y coordinates + */ + function initialize( + address _owner, + string[] calldata _keyIds, + uint256[] calldata _xValues, + uint256[] calldata _yValues + ) + external + initializer + { + _updateSigners(_owner, _keyIds, _xValues, _yValues, false); + } + + /** + * @notice Reinitializes the HybridDeleGator state by setting the owners. + * @dev Call this method when updating logic contracts on the DeleGatorProxy + * @dev The owner SHOULD be an EOA. Contract owners require staking in the EntryPoint to enable signature + * verification during UserOp validation. + * @dev Used by UUPS proxies to initialize the contract state + * @param _version The initilized version number of the proxy using this logic contract + * @param _owner The address of the EOA owner to set + * @param _keyIds The list of key Ids to be added + * @param _xValues List of Public key's X coordinates + * @param _yValues List of Public key's Y coordinates + * @param _deleteP256Keys Boolean indicating whether to delete the P256 keys + */ + function reinitialize( + uint8 _version, + address _owner, + string[] calldata _keyIds, + uint256[] calldata _xValues, + uint256[] calldata _yValues, + bool _deleteP256Keys + ) + external + reinitializer(_version) + onlyEntryPointOrSelf + { + _updateSigners(_owner, _keyIds, _xValues, _yValues, _deleteP256Keys); + } + + ////////////////////////////// External Methods ////////////////////////////// + + /** + * @notice Adds a new key as a signer that can sign on behalf of the DeleGator + * @param _keyId The ID of the key to be added + * @param _x Public key's X coordinate + * @param _y Public key's Y coordinate + */ + function addKey(string calldata _keyId, uint256 _x, uint256 _y) external onlyEntryPointOrSelf { + _addKey(_keyId, _x, _y); + } + + /** + * @notice Removes an existing key from the list of signers + * @param _keyId The ID of the key to be removed + */ + function removeKey(string calldata _keyId) external onlyEntryPointOrSelf { + HybridDeleGatorStorage storage s_ = _getDeleGatorStorage(); + bytes32 keyIdHash_ = keccak256(abi.encodePacked(_keyId)); + P256PublicKey memory publicKey_ = s_.authorizedKeys[keyIdHash_]; + uint256 x_ = publicKey_.x; + uint256 y_ = publicKey_.y; + + if (x_ == 0 && y_ == 0) revert KeyDoesNotExist(keyIdHash_); + + uint256 keyIdHashesCount_ = s_.keyIdHashes.length; + + if (keyIdHashesCount_ == 1 && s_.owner == address(0)) revert CannotRemoveLastSigner(); + + for (uint256 i = 0; i < keyIdHashesCount_ - 1; ++i) { + if (s_.keyIdHashes[i] == keyIdHash_) { + s_.keyIdHashes[i] = s_.keyIdHashes[keyIdHashesCount_ - 1]; + break; + } + } + s_.keyIdHashes.pop(); + + delete s_.authorizedKeys[keyIdHash_]; + emit RemovedP256Key(keyIdHash_, x_, y_); + } + + /** + * @notice Returns the P256 public key coordinates of a given key ID if it is a signer + * @param _keyId The ID of the key to get + * @return x_ The X value of the public key + * @return y_ The Y value of the public key + */ + function getKey(string calldata _keyId) external view returns (uint256 x_, uint256 y_) { + HybridDeleGatorStorage storage s_ = _getDeleGatorStorage(); + P256PublicKey memory publicKey_ = s_.authorizedKeys[keccak256(abi.encodePacked(_keyId))]; + x_ = publicKey_.x; + y_ = publicKey_.y; + } + + /** + * @notice Returns all P256 key IDs that are signers for this contract + */ + function getKeyIdHashes() external view returns (bytes32[] memory) { + HybridDeleGatorStorage storage s_ = _getDeleGatorStorage(); + return s_.keyIdHashes; + } + + /** + * @notice Returns count of signer P256 keys + */ + function getKeyIdHashesCount() external view returns (uint256) { + HybridDeleGatorStorage storage s_ = _getDeleGatorStorage(); + return s_.keyIdHashes.length; + } + + /** + * @notice Updates all P256 signers and the owner of the contract + * @param _owner The address of the owner to set + * @param _keyIds The list of key Ids to be added + * @param _xValues List of Public key's X coordinates + * @param _yValues List of Public key's Y coordinates + */ + function updateSigners( + address _owner, + string[] calldata _keyIds, + uint256[] calldata _xValues, + uint256[] calldata _yValues + ) + external + onlyEntryPointOrSelf + { + _updateSigners(_owner, _keyIds, _xValues, _yValues, true); + } + + /** + * @dev Returns the address of the current owner. + */ + function owner() public view returns (address) { + HybridDeleGatorStorage storage s_ = _getDeleGatorStorage(); + return s_.owner; + } + + /** + * @notice Transfers ownership of the contract to a new account. + * @param _newOwner The address of the new owner + */ + function transferOwnership(address _newOwner) external virtual onlyEntryPointOrSelf { + _transferOwnership(_newOwner); + } + + /** + * @dev Removes the owner of the contract. + */ + function renounceOwnership() external virtual onlyEntryPointOrSelf { + _transferOwnership(address(0)); + } + + /** + * @inheritdoc DeleGatorCore + * @dev Supports the following interfaces: ERC173 + */ + function supportsInterface(bytes4 _interfaceId) public view virtual override returns (bool) { + return super.supportsInterface(_interfaceId) || _interfaceId == type(IERC173).interfaceId; + } + + ////////////////////////////// Internal Methods ////////////////////////////// + + /** + * @notice Adds a new P256 key as a signer that can sign on behalf of the DeleGator + * @param _keyId The ID of the key to be added + * @param _x Public key's X coordinate + * @param _y Public key's Y coordinate + */ + function _addKey(string calldata _keyId, uint256 _x, uint256 _y) internal { + if (!P256FCLVerifierLib.isValidPublicKey(_x, _y)) revert KeyNotOnCurve(_x, _y); + bytes32 keyIdHash_ = keccak256(abi.encodePacked(_keyId)); + + if (bytes(_keyId).length == 0) revert InvalidEmptyKey(); + HybridDeleGatorStorage storage s_ = _getDeleGatorStorage(); + + P256PublicKey storage publicKey_ = s_.authorizedKeys[keyIdHash_]; + if (publicKey_.x != 0 || publicKey_.y != 0) revert KeyAlreadyExists(keyIdHash_); + + s_.authorizedKeys[keyIdHash_] = P256PublicKey(_x, _y); + s_.keyIdHashes.push(keyIdHash_); + + emit AddedP256Key(keyIdHash_, _keyId, _x, _y); + } + + /** + * @dev Transfers the ownership of the contract to a new owner. + * @param _newOwner The new owner's address + */ + function _transferOwnership(address _newOwner) internal { + HybridDeleGatorStorage storage s_ = _getDeleGatorStorage(); + if (s_.keyIdHashes.length == 0 && _newOwner == address(0)) revert CannotRemoveLastSigner(); + + address oldOwner_ = s_.owner; + s_.owner = _newOwner; + emit IERC173.OwnershipTransferred(oldOwner_, _newOwner); + } + + /** + * @notice Updates all P256 signers and the owner of the contract + * @param _owner The address of the EOA owner to set + * @param _keyIds The list of key Ids to be added + * @param _xValues List of Public key's X coordinates + * @param _yValues List of Public key's Y coordinates + * @param _deleteP256Keys Boolean indicating whether to delete the P256 keys + */ + function _updateSigners( + address _owner, + string[] calldata _keyIds, + uint256[] calldata _xValues, + uint256[] calldata _yValues, + bool _deleteP256Keys + ) + internal + { + uint256 keysLength_ = _keyIds.length; + if (_owner == address(0) && keysLength_ == 0 && _deleteP256Keys) revert SignersCannotBeEmpty(); + if (keysLength_ != _xValues.length || keysLength_ != _yValues.length) { + revert InputLengthsMismatch(keysLength_, _xValues.length, _yValues.length); + } + + if (_deleteP256Keys) { + HybridDeleGatorStorage storage s_ = _getDeleGatorStorage(); + uint256 keyIdHashesCount_ = s_.keyIdHashes.length; + if (keyIdHashesCount_ != 0) { + for (uint256 i = 0; i < keyIdHashesCount_; ++i) { + bytes32 keyIdHash_ = s_.keyIdHashes[i]; + P256PublicKey memory pubKey_ = s_.authorizedKeys[keyIdHash_]; + delete s_.authorizedKeys[keyIdHash_]; + emit RemovedP256Key(keyIdHash_, pubKey_.x, pubKey_.y); + } + delete s_.keyIdHashes; + } + } + + for (uint256 i = 0; i < keysLength_; ++i) { + _addKey(_keyIds[i], _xValues[i], _yValues[i]); + } + + _transferOwnership(_owner); + } + + /** + * @notice Clears the Hybrid DeleGator storage struct + * @dev Prepares contract storage for a UUPS proxy to migrate to a new implementation + */ + function _clearDeleGatorStorage() internal override { + HybridDeleGatorStorage storage s_ = _getDeleGatorStorage(); + uint256 keyIdHashesCount_ = s_.keyIdHashes.length; + for (uint256 i = 0; i < keyIdHashesCount_; ++i) { + delete s_.authorizedKeys[s_.keyIdHashes[i]]; + } + delete s_.keyIdHashes; + delete s_.owner; + + emit ClearedStorage(); + } + + /** + * @notice Verifies if signatures are authorized. + * @dev This contract supports EOA, raw P256 and WebAuthn P256 signatures. + * @dev Raw P256 signature bytes: keyId hash, r, s + * @dev WebAuthn P256 signature bytes: keyId hash, r, s, challenge, authenticatorData, requireUserVerification, + * clientDataJSON, challengeLocation, responseTypeLocation + * @param _hash The hash of the data signed + * @param _signature Signature of the data signed. See above for the format of the signature. + * @return Returns ERC1271Lib.EIP1271_MAGIC_VALUE if the recovered address matches an authorized address, returns + * ERC1271Lib.SIG_VALIDATION_FAILED on a signature mismatch or reverts on an error + */ + function _isValidSignature(bytes32 _hash, bytes calldata _signature) internal view override returns (bytes4) { + uint256 sigLength_ = _signature.length; + if (sigLength_ == 65) { + if (ECDSA.recover(_hash, _signature) == owner()) return ERC1271Lib.EIP1271_MAGIC_VALUE; + return ERC1271Lib.SIG_VALIDATION_FAILED; + } else { + if (sigLength_ < 96) return ERC1271Lib.SIG_VALIDATION_FAILED; + + HybridDeleGatorStorage storage s_ = _getDeleGatorStorage(); + bytes32 keyIdHash_ = bytes32(_signature[:32]); + + P256PublicKey memory key_ = s_.authorizedKeys[keyIdHash_]; + if (key_.x == 0 && key_.y == 0) return ERC1271Lib.SIG_VALIDATION_FAILED; + + if (sigLength_ == 96 && P256VerifierLib._verifyRawP256Signature(_hash, _signature, key_.x, key_.y)) { + return ERC1271Lib.EIP1271_MAGIC_VALUE; + } else if (sigLength_ != 96 && P256VerifierLib._verifyWebAuthnP256Signature(_hash, _signature, key_.x, key_.y)) { + return ERC1271Lib.EIP1271_MAGIC_VALUE; + } + return ERC1271Lib.SIG_VALIDATION_FAILED; + } + } + + /** + * @notice This method loads the storage struct for the DeleGator implementation. + */ + function _getDeleGatorStorage() internal pure returns (HybridDeleGatorStorage storage s_) { + assembly { + s_.slot := DELEGATOR_STORAGE_LOCATION + } + } +} diff --git a/src/MultiSigDeleGator.sol b/src/MultiSigDeleGator.sol new file mode 100644 index 0000000..b7d8cac --- /dev/null +++ b/src/MultiSigDeleGator.sol @@ -0,0 +1,356 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import { IEntryPoint } from "@account-abstraction/interfaces/IEntryPoint.sol"; + +import { DeleGatorCore } from "./DeleGatorCore.sol"; +import { IDelegationManager } from "./interfaces/IDelegationManager.sol"; +import { ERC1271Lib } from "./libraries/ERC1271Lib.sol"; + +/// @custom:storage-location erc7201:DeleGator.MultiSigDeleGator +struct MultiSigDeleGatorStorage { + mapping(address => bool) isSigner; + address[] signers; + uint256 threshold; // 0 < threshold <= number of signers <= MAX_NUMBER_OF_SIGNERS +} + +/** + * @title MultiSig Delegator Contract + * @dev This contract extends the DeleGatorCore contract. It provides functionality for multi-signature based access control and + * delegation. + * @dev The signers that control the DeleGator MUST be EOAs + */ +contract MultiSigDeleGator is DeleGatorCore { + ////////////////////////////// State ////////////////////////////// + + /// @dev The version of the contract + string public constant VERSION = "1.0.0"; + + /// @dev The storage slot for the MultiSig DeleGator + /// @dev keccak256(abi.encode(uint256(keccak256("DeleGator.MultiSigDeleGator")) - 1)) & ~bytes32(uint256(0xff)) + bytes32 private constant DELEGATOR_STORAGE_LOCATION = 0xb005e320c74f68de39b3d9025549122b8b117c48474f537aac49c12147b61c00; + + /// @dev The maximum number of signers allowed + uint256 public constant MAX_NUMBER_OF_SIGNERS = 30; + + /// @dev The length of a signature + uint256 private constant SIGNATURE_LENGTH = 65; + + ////////////////////////////// Events ////////////////////////////// + + /// @dev Emitted when a signer is replaced by another + event ReplacedSigner(address indexed oldSigner, address indexed newSigner); + + /// @dev Emitted when a signer is added + event AddedSigner(address indexed signer); + + /// @dev Emitted when a signer is removed + event RemovedSigner(address indexed signer); + + /// @dev Emitted when the signature threshold is updated + event UpdatedThreshold(uint256 threshold); + + ////////////////////////////// Errors ////////////////////////////// + + /// @dev Error emitted when the threshold provided to be set is invalid + error InvalidThreshold(); + + /// @dev Error emitted when the address of a signer to be added is invalid + error InvalidSignerAddress(); + + /// @dev Error emitted when the address of a signer to be replaced is not a signer + error NotASigner(); + + /// @dev Error emitted when the address of a signer to be added is already a signer + error AlreadyASigner(); + + /// @dev Error emitted when there are too many signers attempted to be added + error TooManySigners(); + + /// @dev Error emitted when there are insufficient signers to remove a signer + error InsufficientSigners(); + + ////////////////////////////// Constructor ////////////////////////////// + + /** + * @notice Constructor for the MultiSigDelegator + * @param _delegationManager the address of the trusted DelegationManager contract that will have root access to this contract + * @param _entryPoint the address of the EntryPoint contract that will have root access to this contract + */ + constructor(IDelegationManager _delegationManager, IEntryPoint _entryPoint) DeleGatorCore(_delegationManager, _entryPoint) { + MultiSigDeleGatorStorage storage s_ = _getDeleGatorStorage(); + s_.threshold = type(uint256).max; + emit UpdatedThreshold(s_.threshold); + } + + /** + * @notice Initializes the MultiSigDeleGator signers, and threshold + * @dev Used by UUPS proxies to initialize the contract state + * @param _signers The signers of the contract + * @param _threshold The threshold of signatures required to execute a transaction + */ + function initialize(address[] calldata _signers, uint256 _threshold) external initializer { + _setSignersAndThreshold(_signers, _threshold, false); + } + + /** + * @notice Reinitializes the MultiSigDeleGator signers, and threshold + * @dev This method should only be called by upgradeToAndCall when migrating between DeleGator implementations + * @param _version The initilized version number of the proxy using this logic contract + * @param _signers The signers of the contract + * @param _threshold The threshold of signatures required to execute a transaction + * @param _clearSigners Boolean indicating whether to remove the current signerss + */ + function reinitialize( + uint64 _version, + address[] calldata _signers, + uint256 _threshold, + bool _clearSigners + ) + external + reinitializer(_version) + onlyEntryPointOrSelf + { + _setSignersAndThreshold(_signers, _threshold, _clearSigners); + } + + ////////////////////////////// External Methods ////////////////////////////// + + /** + * @notice Replaces a signer with another signer + * @param _oldSigner The old signer address to be replaced. + * @param _newSigner The new signer address to replace the old one. + */ + function replaceSigner(address _oldSigner, address _newSigner) external onlyEntryPointOrSelf { + if (_newSigner == address(0) || _newSigner.code.length != 0) revert InvalidSignerAddress(); + + MultiSigDeleGatorStorage storage s_ = _getDeleGatorStorage(); + + if (!s_.isSigner[_oldSigner]) revert NotASigner(); + if (s_.isSigner[_newSigner]) revert AlreadyASigner(); + + uint256 length_ = s_.signers.length; + for (uint256 i = 0; i < length_; ++i) { + if (s_.signers[i] == _oldSigner) { + s_.signers[i] = _newSigner; + break; + } + } + + delete s_.isSigner[_oldSigner]; + s_.isSigner[_newSigner] = true; + emit ReplacedSigner(_oldSigner, _newSigner); + } + + /** + * @notice Adds a new signer to the MultiSigDeleGator + * @param _newSigner the new signer to be added + */ + function addSigner(address _newSigner) external onlyEntryPointOrSelf { + if (_newSigner == address(0) || _newSigner.code.length != 0) revert InvalidSignerAddress(); + + MultiSigDeleGatorStorage storage s_ = _getDeleGatorStorage(); + + if (s_.signers.length == MAX_NUMBER_OF_SIGNERS) revert TooManySigners(); + if (s_.isSigner[_newSigner]) revert AlreadyASigner(); + + s_.signers.push(_newSigner); + s_.isSigner[_newSigner] = true; + + emit AddedSigner(_newSigner); + } + + /** + * @notice Removes a signer from the MultiSigDeleGator + * @param _oldSigner the signer to be removed + */ + function removeSigner(address _oldSigner) external onlyEntryPointOrSelf { + MultiSigDeleGatorStorage storage s_ = _getDeleGatorStorage(); + + if (!s_.isSigner[_oldSigner]) revert NotASigner(); + uint256 storedSignersLength_ = s_.signers.length; + if (storedSignersLength_ == s_.threshold) revert InsufficientSigners(); + + for (uint256 i = 0; i < storedSignersLength_ - 1; ++i) { + if (s_.signers[i] == _oldSigner) { + s_.signers[i] = s_.signers[storedSignersLength_ - 1]; + break; + } + } + s_.signers.pop(); + delete s_.isSigner[_oldSigner]; + + emit RemovedSigner(_oldSigner); + } + + /** + * @notice Updates the threshold of the MultiSigDeleGator + * @param _threshold The new threshold of signatures required to execute a transaction + */ + function updateThreshold(uint256 _threshold) external onlyEntryPointOrSelf { + if (_threshold == 0) revert InvalidThreshold(); + MultiSigDeleGatorStorage storage s_ = _getDeleGatorStorage(); + if (_threshold > s_.signers.length) revert InvalidThreshold(); + + s_.threshold = _threshold; + + emit UpdatedThreshold(_threshold); + } + + /** + * @notice Optionally overwrites the current signers and threshold of the MultiSigDeleGator + * @param _signers The new signers of the MultiSigDeleGator + * @param _threshold The new threshold of signatures required to execute a transaction + * @param _clearSigners Boolean indicating whether to remove the current signerss + */ + function updateMultiSigParameters( + address[] calldata _signers, + uint256 _threshold, + bool _clearSigners + ) + external + onlyEntryPointOrSelf + { + _setSignersAndThreshold(_signers, _threshold, _clearSigners); + } + + /** + * @notice Checks if an address is a signer of the MultiSigDeleGator + * @param _addr The address to be checked against the signers + * @return True if the address is one of the signers of the DeleGator + */ + function isSigner(address _addr) external view returns (bool) { + MultiSigDeleGatorStorage storage s_ = _getDeleGatorStorage(); + return s_.isSigner[_addr]; + } + + /** + * @notice Returns the signers of the MultiSigDeleGator + * @return The signers of the MultiSigDeleGator + */ + function getSigners() external view returns (address[] memory) { + MultiSigDeleGatorStorage storage s_ = _getDeleGatorStorage(); + return s_.signers; + } + + /** + * @notice Returns the threshold of the MultiSigDeleGator + * @return The threshold of the multiSig + */ + function getThreshold() external view returns (uint256) { + MultiSigDeleGatorStorage storage s_ = _getDeleGatorStorage(); + return s_.threshold; + } + + /** + * @notice Returns the count of the signers of the MultiSigDeleGator + */ + function getSignersCount() external view returns (uint256) { + MultiSigDeleGatorStorage storage s_ = _getDeleGatorStorage(); + return s_.signers.length; + } + ////////////////////////////// Internal Methods ////////////////////////////// + + /** + * @notice Adds the signers and threshold, optionally deletes the current signers + * @param _signers List of new signers of the MultiSig + * @param _threshold The new threshold of required signatures + * @param _clearSigners Boolean indicating whether to remove the current signerss + */ + function _setSignersAndThreshold(address[] calldata _signers, uint256 _threshold, bool _clearSigners) internal { + uint256 signersLength_ = _signers.length; + MultiSigDeleGatorStorage storage s_ = _getDeleGatorStorage(); + uint256 storedSignersLength_ = s_.signers.length; + + uint256 signersCount_ = _clearSigners ? signersLength_ : signersLength_ + storedSignersLength_; + if (_threshold == 0 || _threshold > signersCount_) revert InvalidThreshold(); + if (signersCount_ > MAX_NUMBER_OF_SIGNERS) revert TooManySigners(); + + if (_clearSigners) { + for (uint256 i = 0; i < storedSignersLength_; ++i) { + address signer_ = s_.signers[i]; + delete s_.isSigner[signer_]; + emit RemovedSigner(signer_); + } + delete s_.signers; + } + + for (uint256 i = 0; i < signersLength_; ++i) { + address newSigner_ = _signers[i]; + if (s_.isSigner[newSigner_]) revert AlreadyASigner(); + if (newSigner_ == address(0) || newSigner_.code.length != 0) revert InvalidSignerAddress(); + + s_.signers.push(newSigner_); + s_.isSigner[newSigner_] = true; + + emit AddedSigner(newSigner_); + } + s_.threshold = _threshold; + emit UpdatedThreshold(_threshold); + } + + /** + * @notice Clears the MultiSig DeleGator storage struct + * @dev Prepares contract storage for a UUPS proxy to migrate to a new implementation + */ + function _clearDeleGatorStorage() internal override { + MultiSigDeleGatorStorage storage s_ = _getDeleGatorStorage(); + uint256 signersLength_ = s_.signers.length; + for (uint256 i = 0; i < signersLength_; ++i) { + delete s_.isSigner[s_.signers[i]]; + } + delete s_.signers; + delete s_.threshold; + emit ClearedStorage(); + } + + /** + * @notice This method is used to verify the signatures of the signers + * @dev Signatures must be sorted in ascending order by the address of the signer. + * @param _hash The data signed + * @param _signatures A threshold amount of 65-byte signatures from the signers all sorted and concatenated + * @return The EIP1271 magic value if the signature is valid, otherwise it reverts + */ + function _isValidSignature(bytes32 _hash, bytes calldata _signatures) internal view override returns (bytes4) { + MultiSigDeleGatorStorage storage s_ = _getDeleGatorStorage(); + + // check if we have enough sigs by threshold + if (_signatures.length != s_.threshold * SIGNATURE_LENGTH) return ERC1271Lib.SIG_VALIDATION_FAILED; + + uint256 signatureCount_ = _signatures.length / SIGNATURE_LENGTH; + uint256 threshold_ = s_.threshold; + + // There cannot be an owner with address 0. + address lastOwner_ = address(0); + address currentOwner_; + uint256 validSignatureCount_ = 0; + + for (uint256 i = 0; i < signatureCount_; ++i) { + bytes memory signature_ = _signatures[i * SIGNATURE_LENGTH:(i + 1) * SIGNATURE_LENGTH]; + + currentOwner_ = ECDSA.recover(_hash, signature_); + + if (currentOwner_ <= lastOwner_ || !s_.isSigner[currentOwner_]) return ERC1271Lib.SIG_VALIDATION_FAILED; + + validSignatureCount_++; + + if (validSignatureCount_ >= threshold_) { + return ERC1271Lib.EIP1271_MAGIC_VALUE; + } + + lastOwner_ = currentOwner_; + } + + return ERC1271Lib.SIG_VALIDATION_FAILED; + } + + /** + * @notice This method loads the storage struct for the DeleGator implementation. + */ + function _getDeleGatorStorage() internal pure returns (MultiSigDeleGatorStorage storage s_) { + assembly { + s_.slot := DELEGATOR_STORAGE_LOCATION + } + } +} diff --git a/src/enforcers/AllowedCalldataEnforcer.sol b/src/enforcers/AllowedCalldataEnforcer.sol new file mode 100644 index 0000000..df3dafe --- /dev/null +++ b/src/enforcers/AllowedCalldataEnforcer.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { CaveatEnforcer } from "./CaveatEnforcer.sol"; +import { Action } from "../utils/Types.sol"; + +/** + * @title AllowedCalldataEnforcer + * @dev This contract enforces that some subset of the calldata to be executed matches the allowed subset of calldata. + * @dev A common use case for this enforcer is enforcing function parameters. It's strongly recommended to use this enforcer for + * validating static types and not dynamic types. Ensuring that dynamic types are correct can be done through a series of + * AllowedCalldataEnforcer terms but this is tedious and error-prone. + */ +contract AllowedCalldataEnforcer is CaveatEnforcer { + ////////////////////////////// Public Methods ////////////////////////////// + + /** + * @notice Allows the delegator to restrict the calldata that is executed + * @dev This function enforces that a subset of the calldata to be executed matches the allowed subset of calldata. + * @param _terms This is packed bytes where: + * - the first 32 bytes is the start of the subset of calldata bytes + * - the remainder of the bytes is the expected value + * @param _action The action the delegate is trying try to execute. + */ + function beforeHook( + bytes calldata _terms, + bytes calldata, + Action calldata _action, + bytes32, + address, + address + ) + public + pure + override + { + // Ensure that the first two term values are valid and at least 1 byte for value_ + uint256 dataStart_; + bytes memory value_; + bytes memory calldataValue_; + + (dataStart_, value_) = getTermsInfo(_terms); + uint256 valueLength_ = value_.length; + require(dataStart_ + valueLength_ <= _action.data.length, "AllowedCalldataEnforcer:invalid-calldata-length"); + + calldataValue_ = _action.data[dataStart_:dataStart_ + valueLength_]; + require(_compare(calldataValue_, value_), "AllowedCalldataEnforcer:invalid-calldata"); + } + + /** + * @notice Decodes the terms used in this CaveatEnforcer. + * @param _terms encoded data that is used during the execution hooks. + * @return dataStart_ The start of the subset of calldata bytes. + * @return value_ The expected value. + */ + function getTermsInfo(bytes calldata _terms) public pure returns (uint256 dataStart_, bytes memory value_) { + require(_terms.length >= 33, "AllowedCalldataEnforcer:invalid-terms-size"); + dataStart_ = uint256(bytes32(_terms[0:32])); + value_ = _terms[32:]; + } + + /** + * @dev Compares two byte arrays for equality. + * @param _a The first byte array. + * @param _b The second byte array. + * @return A boolean indicating whether the byte arrays are equal. + */ + function _compare(bytes memory _a, bytes memory _b) private pure returns (bool) { + return keccak256(_a) == keccak256(_b); + } +} diff --git a/src/enforcers/AllowedMethodsEnforcer.sol b/src/enforcers/AllowedMethodsEnforcer.sol new file mode 100644 index 0000000..8630f96 --- /dev/null +++ b/src/enforcers/AllowedMethodsEnforcer.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { CaveatEnforcer } from "./CaveatEnforcer.sol"; +import { Action } from "../utils/Types.sol"; + +/** + * @title AllowedMethodsEnforcer + * @dev This contract enforces the allowed methods a delegate may call. + */ +contract AllowedMethodsEnforcer is CaveatEnforcer { + ////////////////////////////// Public Methods ////////////////////////////// + + /** + * @notice Allows the delegator to limit what methods the delegate may call. + * @dev This function enforces the allowed methods before the transaction is performed. + * @param _terms A series of 4byte method identifiers, representing the methods that the delegate is allowed to call. + * @param _action The transaction the delegate might try to perform. + */ + function beforeHook( + bytes calldata _terms, + bytes calldata, + Action calldata _action, + bytes32, + address, + address + ) + public + pure + override + { + require(_action.data.length >= 4, "AllowedMethodsEnforcer:invalid-action-data-length"); + + bytes4 targetSig_ = bytes4(_action.data[0:4]); + bytes4[] memory allowedSignatures_ = getTermsInfo(_terms); + uint256 allowedSignaturesLength_ = allowedSignatures_.length; + + for (uint256 i = 0; i < allowedSignaturesLength_; ++i) { + if (targetSig_ == allowedSignatures_[i]) { + return; + } + } + revert("AllowedMethodsEnforcer:method-not-allowed"); + } + + /** + * @notice Decodes the terms used in this CaveatEnforcer. + * @param _terms encoded data that is used during the execution hooks. + * @return allowedMethods_ The 4 byte identifiers for the methods that the delegate is allowed to call. + */ + function getTermsInfo(bytes calldata _terms) public pure returns (bytes4[] memory allowedMethods_) { + uint256 j = 0; + uint256 termsLength_ = _terms.length; + require(termsLength_ % 4 == 0, "AllowedMethodsEnforcer:invalid-terms-length"); + allowedMethods_ = new bytes4[](termsLength_ / 4); + for (uint256 i = 0; i < termsLength_; i += 4) { + allowedMethods_[j] = bytes4(_terms[i:i + 4]); + j++; + } + } +} diff --git a/src/enforcers/AllowedTargetsEnforcer.sol b/src/enforcers/AllowedTargetsEnforcer.sol new file mode 100644 index 0000000..65fe04e --- /dev/null +++ b/src/enforcers/AllowedTargetsEnforcer.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { CaveatEnforcer } from "./CaveatEnforcer.sol"; +import { Action } from "../utils/Types.sol"; + +/** + * @title AllowedTargetsEnforcer + * @dev This contract enforces the allowed target addresses for a delegate. + */ +contract AllowedTargetsEnforcer is CaveatEnforcer { + ////////////////////////////// Public Methods ////////////////////////////// + + /** + * @notice Allows the delegator to limit what addresses the delegate may call. + * @dev This function enforces the allowed target addresses before the transaction is performed. + * @param _terms A series of 20byte addresses, representing the addresses that the delegate is allowed to call. + * @param _action The transaction the delegate might try to perform. + */ + function beforeHook( + bytes calldata _terms, + bytes calldata, + Action calldata _action, + bytes32, + address, + address + ) + public + pure + override + { + address targetAddress_ = _action.to; + address[] memory allowedTargets_ = getTermsInfo(_terms); + uint256 allowedTargetsLength_ = allowedTargets_.length; + for (uint256 i = 0; i < allowedTargetsLength_; ++i) { + if (targetAddress_ == allowedTargets_[i]) { + return; + } + } + revert("AllowedTargetsEnforcer:target-address-not-allowed"); + } + + /** + * @notice Decodes the terms used in this CaveatEnforcer. + * @param _terms encoded data that is used during the execution hooks. + * @return allowedTargets_ The allowed target addresses. + */ + function getTermsInfo(bytes calldata _terms) public pure returns (address[] memory allowedTargets_) { + uint256 j = 0; + uint256 termsLength_ = _terms.length; + require(termsLength_ % 20 == 0, "AllowedTargetsEnforcer:invalid-terms-length"); + allowedTargets_ = new address[](termsLength_ / 20); + for (uint256 i = 0; i < termsLength_; i += 20) { + allowedTargets_[j] = address(bytes20(_terms[i:i + 20])); + j++; + } + } +} diff --git a/src/enforcers/BlockNumberEnforcer.sol b/src/enforcers/BlockNumberEnforcer.sol new file mode 100644 index 0000000..3e3a58c --- /dev/null +++ b/src/enforcers/BlockNumberEnforcer.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { CaveatEnforcer } from "./CaveatEnforcer.sol"; +import { Action } from "../utils/Types.sol"; + +/** + * @title BlockNumberEnforcer + * @dev This contract enforces the block number range for a delegation. + */ +contract BlockNumberEnforcer is CaveatEnforcer { + ////////////////////////////// Public Methods ////////////////////////////// + + /** + * @notice Allows the delegator to specify the block number range within which the delegation will be valid. + * @dev This function enforces the block number range before the transaction is performed. + * @param _terms A bytes32 blocknumber range where the first half of the word is the earliest the delegation can be used and + * the last half of the word is the latest the delegation can be used. The block number ranges are not inclusive. + */ + function beforeHook(bytes calldata _terms, bytes calldata, Action calldata, bytes32, address, address) public view override { + (uint128 blockAfterThreshold_, uint128 blockBeforeThreshold_) = getTermsInfo(_terms); + + if (blockAfterThreshold_ > 0) { + // this means there has been a after blocknumber set for which the delegation must be used + require(block.number > blockAfterThreshold_, "BlockNumberEnforcer:early-delegation"); + } + + if (blockBeforeThreshold_ > 0) { + // this means there has been a before blocknumber set for which the delegation must be used + require(block.number < blockBeforeThreshold_, "BlockNumberEnforcer:expired-delegation"); + } + } + + /** + * @notice Decodes the terms used in this CaveatEnforcer. + * @param _terms encoded data that is used during the execution hooks. + * @return blockAfterThreshold_ The earliest block number before which the delegation can be used. + * @return blockBeforeThreshold_ The latest block number after which the delegation can be used. + */ + function getTermsInfo(bytes calldata _terms) + public + pure + returns (uint128 blockAfterThreshold_, uint128 blockBeforeThreshold_) + { + require(_terms.length == 32, "BlockNumberEnforcer:invalid-terms-length"); + blockAfterThreshold_ = uint128(bytes16(_terms[:16])); + blockBeforeThreshold_ = uint128(bytes16(_terms[16:])); + } +} diff --git a/src/enforcers/CaveatEnforcer.sol b/src/enforcers/CaveatEnforcer.sol new file mode 100644 index 0000000..4c816e9 --- /dev/null +++ b/src/enforcers/CaveatEnforcer.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { ICaveatEnforcer } from "../interfaces/ICaveatEnforcer.sol"; +import { Action } from "../utils/Types.sol"; + +/** + * @title CaveatEnforcer + * @dev This abstract contract enforces caveats before and after the execution of an action. + */ +abstract contract CaveatEnforcer is ICaveatEnforcer { + /// @inheritdoc ICaveatEnforcer + function beforeHook(bytes calldata, bytes calldata, Action calldata, bytes32, address, address) public virtual { } + + /// @inheritdoc ICaveatEnforcer + function afterHook(bytes calldata, bytes calldata, Action calldata, bytes32, address, address) public virtual { } +} diff --git a/src/enforcers/DeployedEnforcer.sol b/src/enforcers/DeployedEnforcer.sol new file mode 100644 index 0000000..7b8e4fa --- /dev/null +++ b/src/enforcers/DeployedEnforcer.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { Address } from "@openzeppelin/contracts/utils/Address.sol"; +import { Create2 } from "@openzeppelin/contracts/utils/Create2.sol"; + +import { CaveatEnforcer } from "./CaveatEnforcer.sol"; +import { Action } from "../utils/Types.sol"; + +/** + * @title DeployedEnforcer + * @dev This contract enforces the deployment of a contract if it hasn't been deployed yet. + */ +contract DeployedEnforcer is CaveatEnforcer { + ////////////////////////////// Errors ////////////////////////////// + /** + * @dev The contract deployed is empty + */ + error DeployedEmptyContract(address contractAddress); + + ////////////////////////////// Events ////////////////////////////// + + /// @dev Emitted when a contract is deployed + event DeployedContract(address contractAddress); + + /// @dev Emitted if the contract was already deployed + event SkippedDeployment(address contractAddress); + + ////////////////////////////// Internal Methods ////////////////////////////// + + /** + * @notice Deploys a contract using create2 + * @param _bytecode the bytecode of the contract to deploy + * @param _salt the salt to use for create2 + */ + function _deploy(bytes memory _bytecode, bytes32 _salt) internal returns (address addr_) { + addr_ = Create2.deploy(0, _salt, _bytecode); + if (addr_.code.length == 0) revert DeployedEmptyContract(addr_); + emit DeployedContract(addr_); + } + + ////////////////////////////// Public Methods ////////////////////////////// + + /** + * @notice Allows the delegator to make sure the contract is deployed, and if not then deploys the contract + * @dev This function enforces the deployment of a contract before the transaction is performed. + * @param _terms This is packed bytes where: + * the first 20 bytes are the expected address of the deployed contract + * the next 32 bytes are the salt to use for create2 + * the remaining bytes are the bytecode of the contract to deploy + */ + function beforeHook(bytes calldata _terms, bytes calldata, Action calldata, bytes32, address, address) public override { + (address expectedAddress_, bytes32 salt_, bytes memory bytecode_) = getTermsInfo(_terms); + + // check if this contract has been deployed yet + if (expectedAddress_.code.length > 0) { + // if it has been deployed, then we don't need to do anything + emit SkippedDeployment(expectedAddress_); + return; + } + + address deployedAddress_ = _deploy(bytecode_, salt_); + require(deployedAddress_ == expectedAddress_, "DeployedEnforcer:deployed-address-mismatch"); + } + + /** + * @notice Decodes the terms used in this CaveatEnforcer. + * @param _terms encoded data that is used during the execution hooks. + * @return expectedAddress_ The address of the contract to deploy. + * @return salt_ The salt to use for create2. + * @return bytecode_ The bytecode of the contract to deploy. + */ + function getTermsInfo(bytes calldata _terms) + public + pure + returns (address expectedAddress_, bytes32 salt_, bytes memory bytecode_) + { + require(_terms.length > 52, "DeployedEnforcer:invalid-terms-length"); + expectedAddress_ = address(bytes20(_terms[:20])); + salt_ = bytes32(_terms[20:52]); + bytecode_ = _terms[52:]; + } + + /** + * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the + * `bytecodeHash` or `salt` will result in a new destination address. + */ + function computeAddress(bytes32 _bytecodeHash, bytes32 _salt) external view returns (address addr_) { + return Create2.computeAddress(_salt, _bytecodeHash); + } +} diff --git a/src/enforcers/ERC20BalanceGteEnforcer.sol b/src/enforcers/ERC20BalanceGteEnforcer.sol new file mode 100644 index 0000000..bfe2269 --- /dev/null +++ b/src/enforcers/ERC20BalanceGteEnforcer.sol @@ -0,0 +1,104 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +import { CaveatEnforcer } from "./CaveatEnforcer.sol"; +import { Action } from "../utils/Types.sol"; + +/** + * @title ERC20BalanceGteEnforcer + * @dev This contract enforces that the delegator's ERC20 balance has increased by at least the specified amount + * after the action has been executed, measured between the `beforeHook` and `afterHook` calls, regardless of what the action is. + * @dev This contract has no enforcement of how the balance increases. It's meant to be used alongside additional enforcers to + * create granular permissions. + */ +contract ERC20BalanceGteEnforcer is CaveatEnforcer { + ////////////////////////////// State ////////////////////////////// + + mapping(bytes32 hashKey => uint256 balance) public balanceCache; + mapping(bytes32 hashKey => bool lock) public isLocked; + + ////////////////////////////// External Methods ////////////////////////////// + + /** + * @notice Generates the key that identifies the run. Produced by the hash of the values used. + * @param _caller Address of the sender calling the enforcer. + * @param _token Token being compared in the beforeHook and beforeHook. + * @param _delegationHash The hash of the delegation. + * @return The hash to be used as key of the mapping. + */ + function getHashKey(address _caller, address _token, bytes32 _delegationHash) external pure returns (bytes32) { + return _getHashKey(_caller, _token, _delegationHash); + } + + ////////////////////////////// Public Methods ////////////////////////////// + + /** + * @notice This function caches the delegators ERC20 balance before the delegation is executed. + * @param _terms 52 packed bytes where: the first 20 bytes are the address of the token, the next 32 bytes + * are the amount the balance should be greater than + */ + function beforeHook( + bytes calldata _terms, + bytes calldata, + Action calldata, + bytes32 _delegationHash, + address _delegator, + address + ) + public + override + { + (address token_,) = getTermsInfo(_terms); + bytes32 hashKey_ = _getHashKey(msg.sender, token_, _delegationHash); + require(!isLocked[hashKey_], "ERC20BalanceGteEnforcer:enforcer-is-locked"); + isLocked[hashKey_] = true; + uint256 balance_ = IERC20(token_).balanceOf(_delegator); + balanceCache[hashKey_] = balance_; + } + + /** + * @notice This function enforces that the delegators ERC20 balance has increased by at least the amount provided. + * @param _terms 52 packed bytes where: the first 20 bytes are the address of the token, the next 32 bytes + * are the amount the balance should be greater than + */ + function afterHook( + bytes calldata _terms, + bytes calldata, + Action calldata, + bytes32 _delegationHash, + address _delegator, + address + ) + public + override + { + (address token_, uint256 amount_) = getTermsInfo(_terms); + bytes32 hashKey_ = _getHashKey(msg.sender, token_, _delegationHash); + delete isLocked[hashKey_]; + uint256 balance_ = IERC20(token_).balanceOf(_delegator); + require(balance_ >= balanceCache[hashKey_] + amount_, "ERC20BalanceGteEnforcer:balance-not-gt"); + } + + /** + * @notice Decodes the terms used in this CaveatEnforcer. + * @param _terms encoded data that is used during the execution hooks. + * @return token_ The address of the token. + * @return amount_ The amount the balance should be greater than. + */ + function getTermsInfo(bytes calldata _terms) public pure returns (address token_, uint256 amount_) { + require(_terms.length == 52, "ERC20BalanceGteEnforcer:invalid-terms-length"); + token_ = address(bytes20(_terms[:20])); + amount_ = uint256(bytes32(_terms[20:])); + } + + ////////////////////////////// Internal Methods ////////////////////////////// + + /** + * @notice Generates the key that identifies the run. Produced by the hash of the values used. + */ + function _getHashKey(address _caller, address _token, bytes32 _delegationHash) private pure returns (bytes32) { + return keccak256(abi.encode(_caller, _token, _delegationHash)); + } +} diff --git a/src/enforcers/ERC20TransferAmountEnforcer.sol b/src/enforcers/ERC20TransferAmountEnforcer.sol new file mode 100644 index 0000000..580c9db --- /dev/null +++ b/src/enforcers/ERC20TransferAmountEnforcer.sol @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +import { CaveatEnforcer } from "./CaveatEnforcer.sol"; +import { Action } from "../utils/Types.sol"; + +/** + * @title ERC20TransferAmountEnforcer + * @dev This contract enforces the transfer limit for ERC20 tokens. + */ +contract ERC20TransferAmountEnforcer is CaveatEnforcer { + ////////////////////////////// State ////////////////////////////// + + mapping(address delegationManager => mapping(bytes32 delegationHash => uint256 amount)) public spentMap; + + ////////////////////////////// Events ////////////////////////////// + event IncreasedSpentMap( + address indexed sender, address indexed redeemer, bytes32 indexed delegationHash, uint256 limit, uint256 spent + ); + + ////////////////////////////// Public Methods ////////////////////////////// + + /** + * @notice Allows the delegator to specify a maximum sum of the contract token to transfer on their behalf. + * @dev This function enforces the transfer limit before the transaction is performed. + * @param _terms The ERC20 token address, and the numeric maximum amount that the recipient may transfer on the signer's + * behalf. + * @param _action The transaction the delegate might try to perform. + * @param _delegationHash The hash of the delegation being operated on. + */ + function beforeHook( + bytes calldata _terms, + bytes calldata, + Action calldata _action, + bytes32 _delegationHash, + address, + address _redeemer + ) + public + override + { + require(_action.data.length == 68, "ERC20TransferAmountEnforcer:invalid-action-length"); + + (address allowedContract_, uint256 limit_) = getTermsInfo(_terms); + address targetContract_ = _action.to; + bytes4 allowedMethod_ = IERC20.transfer.selector; + + require(allowedContract_ == targetContract_, "ERC20TransferAmountEnforcer:invalid-contract"); + + bytes4 targetSig_ = bytes4(_action.data[0:4]); + require(targetSig_ == allowedMethod_, "ERC20TransferAmountEnforcer:invalid-method"); + + uint256 sending_ = uint256(bytes32(_action.data[36:68])); + + uint256 spent_ = spentMap[msg.sender][_delegationHash] += sending_; + require(spent_ <= limit_, "ERC20TransferAmountEnforcer:allowance-exceeded"); + + emit IncreasedSpentMap(msg.sender, _redeemer, _delegationHash, limit_, spent_); + } + + /** + * @notice Decodes the terms used in this CaveatEnforcer. + * @param _terms encoded data that is used during the execution hooks. + * @return allowedContract_ The address of the ERC20 token contract. + * @return maxTokens_ The maximum number of tokens that the delegate is allowed to transfer. + */ + function getTermsInfo(bytes calldata _terms) public pure returns (address allowedContract_, uint256 maxTokens_) { + require(_terms.length == 52, "ERC20TransferAmountEnforcer:invalid-terms-length"); + + allowedContract_ = address((bytes20(_terms[:20]))); + maxTokens_ = uint256(bytes32(_terms[20:])); + } +} diff --git a/src/enforcers/IdEnforcer.sol b/src/enforcers/IdEnforcer.sol new file mode 100644 index 0000000..ba092be --- /dev/null +++ b/src/enforcers/IdEnforcer.sol @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { BitMaps } from "@openzeppelin/contracts/utils/structs/BitMaps.sol"; + +import { CaveatEnforcer } from "./CaveatEnforcer.sol"; +import { Action } from "../utils/Types.sol"; + +/** + * @title IdEnforcer Contract + * @dev This contract extends the CaveatEnforcer contract. It provides functionality to enforce id + * restrictions on delegations. A delegator can assign the same id to multiple delegations, once one of them + * is redeemed the other delegations with the same id will revert. + */ +contract IdEnforcer is CaveatEnforcer { + using BitMaps for BitMaps.BitMap; + ////////////////////// State ////////////////////// + + mapping(address delegationManager => mapping(address delegator => BitMaps.BitMap id)) private isUsedId; + + ////////////////////////////// Events ////////////////////////////// + + event UsedId(address indexed sender, address indexed delegator, address indexed redeemer, uint256 id); + + ////////////////////////////// Public Methods ////////////////////////////// + + /** + * @notice Allows the delegator to specify a id for the delegation, that id can be redeemed only once. + * @param _terms A uint256 representing the id used in the delegation. + */ + function beforeHook( + bytes calldata _terms, + bytes calldata, + Action calldata, + bytes32, + address _delegator, + address _redeemer + ) + public + override + { + uint256 id_ = getTermsInfo(_terms); + require(!getIsUsed(msg.sender, _delegator, id_), "IdEnforcer:id-already-used"); + isUsedId[msg.sender][_delegator].set(id_); + emit UsedId(msg.sender, _redeemer, _delegator, id_); + } + + /** + * @notice Decodes the terms used in this CaveatEnforcer. + * @param _terms encoded data that is used during the execution hooks. + * @return id_ The id used in the delegation. + */ + function getTermsInfo(bytes calldata _terms) public pure returns (uint256 id_) { + require(_terms.length == 32, "IdEnforcer:invalid-terms-length"); + id_ = uint256(bytes32(_terms)); + } + + /** + * @notice Returns if the id has already been used + * @param _delegationManager DelegationManager + * @param _delegator Delegator address + * @param _id id used in the delegation + * @return Is the id has already been used + */ + function getIsUsed(address _delegationManager, address _delegator, uint256 _id) public view returns (bool) { + return isUsedId[_delegationManager][_delegator].get(_id); + } +} diff --git a/src/enforcers/LimitedCallsEnforcer.sol b/src/enforcers/LimitedCallsEnforcer.sol new file mode 100644 index 0000000..fe53dfa --- /dev/null +++ b/src/enforcers/LimitedCallsEnforcer.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { CaveatEnforcer } from "./CaveatEnforcer.sol"; +import { Action } from "../utils/Types.sol"; + +/** + * @title Limited Calls Enforcer Contract + * @dev This contract extends the CaveatEnforcer contract. It provides functionality to enforce a limit on the number of times a + * delegate may perform transactions on behalf of the delegator. + */ +contract LimitedCallsEnforcer is CaveatEnforcer { + ////////////////////////////// State ////////////////////////////// + + mapping(address delegationManager => mapping(bytes32 delegationHash => uint256 count)) public callCounts; + + ////////////////////////////// Events ////////////////////////////// + + event IncreasedCount( + address indexed sender, address indexed redeemer, bytes32 indexed delegationHash, uint256 limit, uint256 callCount + ); + + ////////////////////////////// Public Methods ////////////////////////////// + + /** + * @notice Allows the delegator to specify a maximum number of times the recipient may perform transactions on their behalf. + * @param _terms - The maximum number of times the delegate may perform transactions on their behalf. + * @param _delegationHash - The hash of the delegation being operated on. + */ + function beforeHook( + bytes calldata _terms, + bytes calldata, + Action calldata, + bytes32 _delegationHash, + address, + address _redeemer + ) + public + override + { + uint256 limit_ = getTermsInfo(_terms); + uint256 callCounts_ = ++callCounts[msg.sender][_delegationHash]; + require(callCounts_ <= limit_, "LimitedCallsEnforcer:limit-exceeded"); + emit IncreasedCount(msg.sender, _redeemer, _delegationHash, limit_, callCounts_); + } + + /** + * @notice Decodes the terms used in this CaveatEnforcer. + * @param _terms encoded data that is used during the execution hooks. + * @return limit_ The maximum number of times the delegate may perform transactions on the delegator's behalf. + */ + function getTermsInfo(bytes calldata _terms) public pure returns (uint256 limit_) { + require(_terms.length == 32, "LimitedCallsEnforcer:invalid-terms-length"); + limit_ = uint256(bytes32(_terms)); + } +} diff --git a/src/enforcers/NonceEnforcer.sol b/src/enforcers/NonceEnforcer.sol new file mode 100644 index 0000000..5cfcbda --- /dev/null +++ b/src/enforcers/NonceEnforcer.sol @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { CaveatEnforcer } from "./CaveatEnforcer.sol"; +import { Action } from "../utils/Types.sol"; + +/** + * @title Nonce Enforcer Contract + * @dev This contract extends the CaveatEnforcer contract. It provides functionality to add an nonce to a delegation and enable + * multi delegation revocation based on that nonce by incrementing the current nonce. + */ +contract NonceEnforcer is CaveatEnforcer { + ////////////////////// State ////////////////////// + + mapping(address delegationManager => mapping(address delegator => uint256 nonce)) public currentNonce; + + ////////////////////////////// Events ////////////////////////////// + + event UsedNonce(address indexed delegationManager, address indexed delegator, uint256 nonce); + + ////////////////////////////// Public Methods ////////////////////////////// + + /** + * @notice + * @param _terms A uint256 representing the nonce used in the delegation. + */ + function beforeHook( + bytes calldata _terms, + bytes calldata, + Action calldata, + bytes32, + address _delegator, + address + ) + public + view + override + { + uint256 nonce_ = getTermsInfo(_terms); + require(currentNonce[msg.sender][_delegator] == nonce_, "NonceEnforcer:invalid-nonce"); + } + + /** + * @notice Decodes the terms used in this CaveatEnforcer. + * @param _terms encoded data that is used during the execution hooks. + * @return nonce_ The ID used in the delegation. + */ + function getTermsInfo(bytes calldata _terms) public pure returns (uint256 nonce_) { + require(_terms.length == 32, "NonceEnforcer:invalid-terms-length"); + nonce_ = uint256(bytes32(_terms)); + } + + /** + * @notice Increments the nonce of a delegator. This invalidates all previous delegations with the old nonce. + * @dev The message sender must be the delegator. + * @param _delegationManager the address of the delegation manager that the user is using. + */ + function incrementNonce(address _delegationManager) external { + uint256 oldNonce_; + unchecked { + oldNonce_ = currentNonce[_delegationManager][msg.sender]++; + } + emit UsedNonce(_delegationManager, msg.sender, oldNonce_); + } +} diff --git a/src/enforcers/TimestampEnforcer.sol b/src/enforcers/TimestampEnforcer.sol new file mode 100644 index 0000000..345efcd --- /dev/null +++ b/src/enforcers/TimestampEnforcer.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { CaveatEnforcer } from "./CaveatEnforcer.sol"; +import { Action } from "../utils/Types.sol"; + +/** + * @title Timestamp Enforcer Contract + * @dev This contract extends the CaveatEnforcer contract. It provides functionality to enforce timestamp restrictions on + * delegations. + */ +contract TimestampEnforcer is CaveatEnforcer { + ////////////////////////////// Public Methods ////////////////////////////// + + /** + * @notice Allows the delegator to specify the timestamp range within which the delegation will be valid. + * @param _terms - A bytes32 timestamp range where the first half of the word is the earliest the delegation can be used and the + * last half of the word is the latest the delegation can be used. The timestamp ranges are not inclusive. + */ + function beforeHook(bytes calldata _terms, bytes calldata, Action calldata, bytes32, address, address) public view override { + (uint128 timestampAfterThreshold_, uint128 timestampBeforeThreshold_) = getTermsInfo(_terms); + + if (timestampAfterThreshold_ > 0) { + // this means there has been a timestamp set for after which the delegation can be used + require(block.timestamp > timestampAfterThreshold_, "TimestampEnforcer:early-delegation"); + } + + if (timestampBeforeThreshold_ > 0) { + // this means there has been a timestamp set for before which the delegation can be used + require(block.timestamp < timestampBeforeThreshold_, "TimestampEnforcer:expired-delegation"); + } + } + + /** + * @notice Decodes the terms used in this CaveatEnforcer. + * @param _terms encoded data that is used during the execution hooks. + * @return timestampAfterThreshold_ The earliest timestamp before which the delegation can be used. + * @return timestampBeforeThreshold_ The latest timestamp after which the delegation can be used. + */ + function getTermsInfo(bytes calldata _terms) + public + pure + returns (uint128 timestampAfterThreshold_, uint128 timestampBeforeThreshold_) + { + require(_terms.length == 32, "TimestampEnforcer:invalid-terms-length"); + timestampBeforeThreshold_ = uint128(bytes16(_terms[16:])); + timestampAfterThreshold_ = uint128(bytes16(_terms[:16])); + } +} diff --git a/src/enforcers/ValueLteEnforcer.sol b/src/enforcers/ValueLteEnforcer.sol new file mode 100644 index 0000000..c2b0584 --- /dev/null +++ b/src/enforcers/ValueLteEnforcer.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { CaveatEnforcer } from "./CaveatEnforcer.sol"; +import { Action } from "../utils/Types.sol"; + +/** + * @title ValueLteEnforcer + * @dev This contract extends the CaveatEnforcer contract. It provides functionality to enforce a specific value for the Action + * being executed. + */ +contract ValueLteEnforcer is CaveatEnforcer { + ////////////////////////////// Public Methods ////////////////////////////// + + /** + * @notice Allows the delegator to specify a maximum value of native tokens that the delegate can spend. + * @param _terms - A uint256 value that the Action's value must be less than or equal to. + */ + function beforeHook( + bytes calldata _terms, + bytes calldata, + Action calldata _action, + bytes32, + address, + address + ) + public + pure + override + { + uint256 value_ = getTermsInfo(_terms); + require(_action.value <= value_, "ValueLteEnforcer:value-too-high"); + } + + /** + * @notice Decodes the terms used in this CaveatEnforcer. + * @param _terms encoded data that is used during the execution hooks. + * @return value_ The value that the Action's value must be less than or equal to. + */ + function getTermsInfo(bytes calldata _terms) public pure returns (uint256 value_) { + require(_terms.length == 32, "ValueLteEnforcer:invalid-terms-length"); + value_ = uint256(bytes32(_terms)); + } +} diff --git a/src/interfaces/ICaveatEnforcer.sol b/src/interfaces/ICaveatEnforcer.sol new file mode 100644 index 0000000..83c4e69 --- /dev/null +++ b/src/interfaces/ICaveatEnforcer.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { Action } from "../utils/Types.sol"; + +/** + * @title CaveatEnforcer + * @notice This is an abstract contract that exposes pre and post Action hooks during delegation redemption. + * @dev Hooks can be used to enforce conditions before and after an Action is performed. + * @dev Reverting during the hooks will revert the entire delegation redemption. + * @dev Child contracts can implement the beforeHook method and/or afterHook method. + * @dev NOTE: There is no guarantee that the action is executed. If you are relying on the action then be sure to use the + * `afterHook` method. + */ +interface ICaveatEnforcer { + /** + * @notice Enforces the conditions that should hold before a transaction is performed. + * @dev This function MUST revert if the conditions are not met. + * @param _terms The terms to enforce set by the delegator. + * @param _args An optional input parameter set by the redeemer at time of invocation. + * @param _action The action of the transaction. + * @param _delegationHash The hash of the delegation. + * @param _delegator The address of the delegator. + * @param _redeemer The address that is redeeming the delegation. + */ + function beforeHook( + bytes calldata _terms, + bytes calldata _args, + Action calldata _action, + bytes32 _delegationHash, + address _delegator, + address _redeemer + ) + external; + + /** + * @notice Enforces the conditions that should hold after a transaction is performed. + * @dev This function MUST revert if the conditions are not met. + * @param _terms The terms to enforce set by the delegator. + * @param _args An optional input parameter set by the redeemer at time of invocation. + * @param _action The action of the transaction. + * @param _delegationHash The hash of the delegation. + * @param _delegator The address of the delegator. + * @param _redeemer The address that is redeeming the delegation. + */ + function afterHook( + bytes calldata _terms, + bytes calldata _args, + Action calldata _action, + bytes32 _delegationHash, + address _delegator, + address _redeemer + ) + external; +} diff --git a/src/interfaces/IDeleGatorCore.sol b/src/interfaces/IDeleGatorCore.sol new file mode 100644 index 0000000..3696058 --- /dev/null +++ b/src/interfaces/IDeleGatorCore.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { IERC1271 } from "@openzeppelin/contracts/interfaces/IERC1271.sol"; + +import { Action } from "../utils/Types.sol"; + +/** + * @title IDeleGatorCore + * @notice Interface for a DeleGator that exposes the minimal functionality required. + */ +interface IDeleGatorCore is IERC1271 { + /** + * @notice executes a CALL using the data provided in the action + * @dev MUST enforce calls come from an approved DelegationManager address + * @param _action the onchain action to perform + */ + function executeDelegatedAction(Action calldata _action) external; +} diff --git a/src/interfaces/IDeleGatorCoreFull.sol b/src/interfaces/IDeleGatorCoreFull.sol new file mode 100644 index 0000000..f8a4b30 --- /dev/null +++ b/src/interfaces/IDeleGatorCoreFull.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { IEntryPoint } from "@account-abstraction/interfaces/IEntryPoint.sol"; +import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; + +import { IDeleGatorCore } from "./IDeleGatorCore.sol"; +import { IDelegationManager } from "./IDelegationManager.sol"; +import { Action, Delegation, PackedUserOperation } from "../utils/Types.sol"; + +/** + * @title IDeleGatorCoreFull + * @notice Interface for a DeleGator that exposes the minimal functionality required. + */ +interface IDeleGatorCoreFull is IDeleGatorCore, IERC165 { + ////////////////////////////// Events ////////////////////////////// + event SetDelegationManager(IDelegationManager indexed newDelegationManager); + + event SetEntryPoint(IEntryPoint indexed entryPoint); + + event ClearedStorage(); + + ////////////////////////////// Errors ////////////////////////////// + + error NotSelf(); + error NotEntryPoint(); + error NotEntryPointOrSelf(); + error NotDelegationManager(); + + ////////////////////////////// MM Implementation Methods ////////////////////////////// + + function redeemDelegation(bytes calldata _data, Action calldata _action) external; + + function execute(Action calldata _action) external; + + function executeBatch(Action[] calldata _actions) external; + + function validateUserOp( + PackedUserOperation calldata _userOp, + bytes32 _userOpHash, + uint256 _missingAccountFunds + ) + external + returns (uint256 validationData_); + + function isValidSignature(bytes32 _hash, bytes memory _signature) external view returns (bytes4 magicValue_); + + function addDeposit() external payable; + + function withdrawDeposit(address payable _withdrawAddress, uint256 _withdrawAmount) external; + + function delegate(Delegation calldata _delegation) external; + + function disableDelegation(Delegation calldata _delegation) external; + + function enableDelegation(Delegation calldata _delegation) external; + + function upgradeToAndCall(address _newImplementation, bytes memory _data) external payable; + + function upgradeToAndCallAndRetainStorage(address _newImplementation, bytes memory _data) external payable; + + function isDelegationOnchain(bytes32 _delegationHash) external view returns (bool); + + function isDelegationDisabled(bytes32 _delegationHash) external view returns (bool); + + function entryPoint() external view returns (IEntryPoint); + + function delegationManager() external view returns (IDelegationManager); + + function getNonce() external view returns (uint256); + + function getNonce(uint192 _key) external view returns (uint256); + + function getDeposit() external view returns (uint256); + + function getImplementation() external view returns (address); + + function getInitializedVersion() external view returns (uint64); + + ////////////////////////////// TokenCallbackHandler Methods ////////////////////////////// + + function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4); + + function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4); + + function onERC1155BatchReceived( + address, + address, + uint256[] calldata, + uint256[] calldata, + bytes calldata + ) + external + pure + returns (bytes4); + + ////////////////////////////// UUPSUpgradeable Methods ////////////////////////////// + + function proxiableUUID() external view returns (bytes32); +} diff --git a/src/interfaces/IDelegationManager.sol b/src/interfaces/IDelegationManager.sol new file mode 100644 index 0000000..7880d38 --- /dev/null +++ b/src/interfaces/IDelegationManager.sol @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { Action, Delegation } from "../utils/Types.sol"; + +/** + * @title IDelegationManager + * @notice Interface that exposes methods of a custom DelegationManager implementation. + */ +interface IDelegationManager { + ////////////////////////////// Events ////////////////////////////// + + /// @dev Emitted when a delegation's hash is cached onchain + event Delegated(bytes32 indexed delegationHash, address indexed delegator, address indexed delegate, Delegation delegation); + + /// @dev Emitted when a delegation is redeemed + event RedeemedDelegation(address indexed rootDelegator, address indexed redeemer, Delegation delegation); + + /// @dev Emitted when a delegation is enabled after being disabled + event EnabledDelegation( + bytes32 indexed delegationHash, address indexed delegator, address indexed delegate, Delegation delegation + ); + + /// @dev Emitted when a delegation is disabled + event DisabledDelegation( + bytes32 indexed delegationHash, address indexed delegator, address indexed delegate, Delegation delegation + ); + + /// @dev Emitted when the domain hash is set + event SetDomain( + bytes32 indexed domainHash, string name, string domainVersion, uint256 chainId, address indexed contractAddress + ); + + ////////////////////////////// Errors ////////////////////////////// + + /// @dev Error thrown when a user attempts to use a disabled delegation + error CannotUseADisabledDelegation(); + + /// @dev Error thrown when there are no delegations provided + error NoDelegationsProvided(); + + /// @dev Error thrown when the authority in a chain of delegations doesn't match the expected authority + error InvalidAuthority(); + + /// @dev Error thrown when the redeemer doesn't match the approved delegate + error InvalidDelegate(); + + /// @dev Error thrown when the delegator of a delegation doesn't match the caller + error InvalidDelegator(); + + /// @dev Error thrown when the signature provided is invalid + error InvalidSignature(); + + /// @dev Error thrown when the delegation provided hasn't been approved + error InvalidDelegation(); + + /// @dev Error thrown when the delegation provided is already disabled + error AlreadyDisabled(); + + /// @dev Error thrown when the delegation provided is already cached + error AlreadyExists(); + + /// @dev Error thrown when the delegation provided is already enabled + error AlreadyEnabled(); + + ////////////////////////////// MM Implementation Methods ////////////////////////////// + + function pause() external; + + function unpause() external; + + function delegate(Delegation calldata _delegation) external; + + function enableDelegation(Delegation calldata _delegation) external; + + function disableDelegation(Delegation calldata _delegation) external; + + function disabledDelegations(bytes32 _delegationHash) external view returns (bool); + + function onchainDelegations(bytes32 _delegationHash) external view returns (bool); + + function getDelegationHash(Delegation calldata _delegation) external pure returns (bytes32); + + function redeemDelegation(bytes calldata _data, Action calldata _action) external; + + function getDomainHash() external view returns (bytes32); +} diff --git a/src/interfaces/IERC173.sol b/src/interfaces/IERC173.sol new file mode 100644 index 0000000..57d8e3d --- /dev/null +++ b/src/interfaces/IERC173.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +/// @title ERC-173 Contract Ownership Standard +/// NOTE: the ERC-165 identifier for this interface is 0x7f5828d0 +interface IERC173 { + /// @dev This emits when ownership of a contract changes. + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /// @notice Get the address of the owner + /// @return The address of the owner. + function owner() external view returns (address); + + /// @notice Set the address of the new owner of the contract + /// @dev Set _newOwner to address(0) to renounce any ownership. + /// @param _newOwner The address of the new owner of the contract + function transferOwnership(address _newOwner) external; +} diff --git a/src/libraries/ERC1271Lib.sol b/src/libraries/ERC1271Lib.sol new file mode 100644 index 0000000..382d9cc --- /dev/null +++ b/src/libraries/ERC1271Lib.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +/** + * @title ERC1271 Library + */ +library ERC1271Lib { + /// @dev Magic value to be returned upon successful validation. + bytes4 internal constant EIP1271_MAGIC_VALUE = 0x1626ba7e; + + /// @dev Magic value to be returned upon failed validation. + bytes4 internal constant SIG_VALIDATION_FAILED = 0xffffffff; +} diff --git a/src/libraries/EncoderLib.sol b/src/libraries/EncoderLib.sol new file mode 100644 index 0000000..0477515 --- /dev/null +++ b/src/libraries/EncoderLib.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { Delegation, Caveat } from "../utils/Types.sol"; +import { DELEGATION_TYPEHASH, CAVEAT_TYPEHASH } from "../utils/Typehashes.sol"; + +/** + * @dev Provides implementations for common utility methods for Delegation. + * @title Delegation Utility Library + */ +library EncoderLib { + /** + * @notice Encodes and hashes a Delegation struct. + * @dev The hash is used to verify the integrity of the Delegation. + * @param _input The Delegation parameters to be hashed. + * @return The keccak256 hash of the encoded Delegation packet. + */ + function _getDelegationHash(Delegation memory _input) internal pure returns (bytes32) { + bytes memory encoded_ = abi.encode( + DELEGATION_TYPEHASH, + _input.delegate, + _input.delegator, + _input.authority, + _getCaveatArrayPacketHash(_input.caveats), + _input.salt + ); + return keccak256(encoded_); + } + + /** + * @notice Calculates the hash of an array of Caveats. + * @dev The hash is used to verify the integrity of the Caveats. + * @param _input The array of Caveats. + * @return The keccak256 hash of the encoded Caveat array packet. + */ + function _getCaveatArrayPacketHash(Caveat[] memory _input) internal pure returns (bytes32) { + bytes32[] memory caveatPacketHashes_ = new bytes32[](_input.length); + for (uint256 i = 0; i < _input.length; ++i) { + caveatPacketHashes_[i] = _getCaveatPacketHash(_input[i]); + } + return keccak256(abi.encodePacked(caveatPacketHashes_)); + } + + /** + * @notice Calculates the hash of a single Caveat. + * @dev The hash is used to verify the integrity of the Caveat. + * @param _input The Caveat data. + * @return The keccak256 hash of the encoded Caveat packet. + */ + function _getCaveatPacketHash(Caveat memory _input) internal pure returns (bytes32) { + bytes memory encoded_ = abi.encode(CAVEAT_TYPEHASH, _input.enforcer, keccak256(_input.terms)); + return keccak256(encoded_); + } +} diff --git a/src/libraries/ExecutionLib.sol b/src/libraries/ExecutionLib.sol new file mode 100644 index 0000000..e5c1a3a --- /dev/null +++ b/src/libraries/ExecutionLib.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { Action } from "../utils/Types.sol"; + +/** + * @title Execution Library + * Provides a common implementation for executing actions. + */ +library ExecutionLib { + ////////////////////////////// Errors ////////////////////////////// + + /// @dev Error thrown when execution fails without providing a reason + error FailedExecutionWithoutReason(); + + /// @dev Error thrown when executing empty Actions array + error InvalidActionsLength(); + + ////////////////////////////// Events ////////////////////////////// + + /// @dev Event emitted when an action is executed. + event ExecutedAction(address indexed to, uint256 value, bool success, bytes errorMessage); + + /// @dev Event emitted when prefunding is sent. + event SentPrefund(address indexed sender, uint256 amount, bool success); + + ////////////////////////////// Internal Functions ////////////////////////////// + + /** + * @notice Executes the provided Action and reverts if the execution fails. + * @dev Ensure caller permissions are checked before calling this method + * @param _action the Action to execute + */ + function _execute(Action calldata _action) internal { + (bool success_, bytes memory errorMessage_) = _action.to.call{ value: _action.value }(_action.data); + + emit ExecutedAction(_action.to, _action.value, success_, errorMessage_); + + if (!success_) { + if (errorMessage_.length == 0) revert FailedExecutionWithoutReason(); + + assembly { + revert(add(32, errorMessage_), mload(errorMessage_)) + } + } + } + + /** + * @notice Executes several Actions in order and reverts if any of the executions fail. + * @param _actions the ordered actions to execute + */ + function _executeBatch(Action[] calldata _actions) internal { + uint256 actionLength = _actions.length; + if (actionLength == 0) revert InvalidActionsLength(); + for (uint256 i = 0; i < actionLength; ++i) { + _execute(_actions[i]); + } + } + + /** + * @notice Sends the entrypoint (msg.sender) any needed funds for the transaction. + * @param _missingAccountFunds the minimum value this method should send the entrypoint. + * this value MAY be zero, in case there is enough deposit, or the userOp has a paymaster. + */ + function _payPrefund(uint256 _missingAccountFunds) internal { + if (_missingAccountFunds != 0) { + (bool success_,) = payable(msg.sender).call{ value: _missingAccountFunds, gas: type(uint256).max }(""); + (success_); + //ignore failure (its EntryPoint's job to verify, not account.) + emit SentPrefund(msg.sender, _missingAccountFunds, success_); + } + } +} diff --git a/src/libraries/P256FCLVerifierLib.sol b/src/libraries/P256FCLVerifierLib.sol new file mode 100644 index 0000000..9ffb892 --- /dev/null +++ b/src/libraries/P256FCLVerifierLib.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { FCL_Elliptic_ZZ } from "@freshCryptoLib/FCL_elliptic.sol"; +import { FCL_ecdsa } from "@freshCryptoLib/FCL_ecdsa.sol"; + +import { WebAuthn } from "./WebAuthn.sol"; + +/** + * @title P256FCLVerifierLib + * @notice Provides functionality to verify the P256 signature utilizing the Fresh Crypto library + * (https://github.com/rdubois-crypto/FreshCryptoLib) + */ +library P256FCLVerifierLib { + uint256 constant P256_N_DIV_2 = FCL_Elliptic_ZZ.n / 2; + + // As mentioned in the 7212 RIP Spec, the P256Verify Precompile address is 0x100 + // https://github.com/ethereum/RIPs/blob/master/RIPS/rip-7212.md + address constant VERIFIER = address(0x100); + + /** + * + * @param _x The X coordinate of the public key that signed the message + * @param _y The Y coordinate of the public key that signed the message + */ + function isValidPublicKey(uint256 _x, uint256 _y) internal pure returns (bool) { + return FCL_Elliptic_ZZ.ecAff_isOnCurve(_x, _y); + } + + /** + * + * @param message_hash The hash to be verified + * @param r The r component of the signature + * @param s The s component of the signature + * @param x The X coordinate of the public key that signed the message + * @param y The Y coordinate of the public key that signed the message + */ + function verifySignature(bytes32 message_hash, uint256 r, uint256 s, uint256 x, uint256 y) internal view returns (bool) { + // check for signature malleability + if (s > P256_N_DIV_2) { + return false; + } + + bytes memory args = abi.encode(message_hash, r, s, x, y); + (bool success, bytes memory ret) = VERIFIER.staticcall(args); + + if (success) return abi.decode(ret, (bool)) == true; + + return FCL_ecdsa.ecdsa_verify(message_hash, r, s, x, y); + } +} diff --git a/src/libraries/P256VerifierLib.sol b/src/libraries/P256VerifierLib.sol new file mode 100644 index 0000000..496fcd3 --- /dev/null +++ b/src/libraries/P256VerifierLib.sol @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { WebAuthn } from "./WebAuthn.sol"; +import { P256FCLVerifierLib } from "./P256FCLVerifierLib.sol"; +import { DecodedWebAuthnSignature } from "../utils/Types.sol"; + +/** + * @title P256VerifierLib + * @notice Provides functionality to decode P256 signatures into their components + * @dev This library wraps Daimo's Progressive Precompile P256 Verifier + */ +library P256VerifierLib { + /** + * @notice Decodes a raw P256 signature and verifies it against the provided hash using a progressive precompile P256 verifier + * @dev Raw P256 signatures encode: keyId hash, r, s + * @param _hash The hash to be verified + * @param _signature The signature to be verified + * @param _x The X coordinate of the public key that signed the message + * @param _y The Y coordinate of the public key that signed the message + */ + function _verifyRawP256Signature(bytes32 _hash, bytes memory _signature, uint256 _x, uint256 _y) internal view returns (bool) { + (uint256 r_, uint256 s_) = _decodeRawP256Signature(_signature); + bytes32 messageHash_ = sha256(abi.encodePacked(_hash)); + return P256FCLVerifierLib.verifySignature(messageHash_, r_, s_, _x, _y); + } + + /** + * @notice Decodes a WebAuthn P256 signature and verifies it against the provided hash using a progressive precompile P256 + * verifier + * @dev WebAuthn P256 signatures encode: keyId hash, r, s, challenge, authenticatorData, requireUserVerification, + * clientDataJSON, + * challengeLocation, responseTypeLocation + * @param _hash The hash to be verified + * @param _signature The signature to be verified + * @param _x The X coordinate of the public key that signed the message + * @param _y The Y coordinate of the public key that signed the message + */ + function _verifyWebAuthnP256Signature( + bytes32 _hash, + bytes memory _signature, + uint256 _x, + uint256 _y + ) + internal + view + returns (bool) + { + DecodedWebAuthnSignature memory decodedSignature = _decodeWebAuthnP256Signature(_signature); + + return WebAuthn.verifySignature({ + challenge: abi.encodePacked(_hash), + authenticatorData: decodedSignature.authenticatorData, + requireUserVerification: decodedSignature.requireUserVerification, + clientDataJSONPrefix: decodedSignature.clientDataJSONPrefix, + clientDataJSONSuffix: decodedSignature.clientDataJSONSuffix, + responseTypeLocation: decodedSignature.responseTypeLocation, + r: decodedSignature.r, + s: decodedSignature.s, + x: _x, + y: _y + }); + } + + /** + * @notice This function decodes a raw P256 signature + * @dev The signature consists of: bytes32, uint256, uint256 + * @param _signature The signature to be decoded + * @return r_ The r component of the signature + * @return s_ The s component of the signature + */ + function _decodeRawP256Signature(bytes memory _signature) internal pure returns (uint256 r_, uint256 s_) { + (, r_, s_) = abi.decode(_signature, (bytes32, uint256, uint256)); + } + + /** + * @notice This function decodes the signature for WebAuthn P256 signature + * @dev The signature consists of: bytes32, uint256, uint256, bytes, bytes, bool, string, uint256, uint256 + * @param _signature The signature to be decoded + * @return decodedSig the decoded signature + */ + function _decodeWebAuthnP256Signature(bytes memory _signature) + internal + pure + returns (DecodedWebAuthnSignature memory decodedSig) + { + ( + , + decodedSig.r, + decodedSig.s, + decodedSig.authenticatorData, + decodedSig.requireUserVerification, + decodedSig.clientDataJSONPrefix, + decodedSig.clientDataJSONSuffix, + decodedSig.responseTypeLocation + ) = abi.decode(_signature, (bytes32, uint256, uint256, bytes, bool, string, string, uint256)); + } +} diff --git a/src/libraries/WebAuthn.sol b/src/libraries/WebAuthn.sol new file mode 100644 index 0000000..68b7259 --- /dev/null +++ b/src/libraries/WebAuthn.sol @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { Base64URL } from "./utils/Base64URL.sol"; +import { P256FCLVerifierLib } from "./P256FCLVerifierLib.sol"; + +/** + * Helper library for external contracts to verify WebAuthn signatures. + * NOTE: This library is slightly modified from the original to remove the duplication of the challenge data. + */ +library WebAuthn { + /// Checks whether substr occurs in str starting at a given byte offset. + function contains(string memory substr, string memory str, uint256 location) internal pure returns (bool) { + bytes memory substrBytes = bytes(substr); + bytes memory strBytes = bytes(str); + + uint256 substrLen = substrBytes.length; + uint256 strLen = strBytes.length; + + for (uint256 i = 0; i < substrLen; i++) { + if (location + i >= strLen) { + return false; + } + + if (substrBytes[i] != strBytes[location + i]) { + return false; + } + } + + return true; + } + + bytes1 constant AUTH_DATA_FLAGS_UP = 0x01; // Bit 0 + bytes1 constant AUTH_DATA_FLAGS_UV = 0x04; // Bit 2 + bytes1 constant AUTH_DATA_FLAGS_BE = 0x08; // Bit 3 + bytes1 constant AUTH_DATA_FLAGS_BS = 0x10; // Bit 4 + + /// Verifies the authFlags in authenticatorData. Numbers in inline comment + /// correspond to the same numbered bullets in + /// https://www.w3.org/TR/webauthn-2/#sctn-verifying-assertion. + function checkAuthFlags(bytes1 flags, bool requireUserVerification) internal pure returns (bool) { + // 17. Verify that the UP bit of the flags in authData is set. + if (flags & AUTH_DATA_FLAGS_UP != AUTH_DATA_FLAGS_UP) { + return false; + } + + // 18. If user verification was determined to be required, verify that + // the UV bit of the flags in authData is set. Otherwise, ignore the + // value of the UV flag. + if (requireUserVerification && (flags & AUTH_DATA_FLAGS_UV) != AUTH_DATA_FLAGS_UV) { + return false; + } + + // 19. If the BE bit of the flags in authData is not set, verify that + // the BS bit is not set. + if (flags & AUTH_DATA_FLAGS_BE != AUTH_DATA_FLAGS_BE) { + if (flags & AUTH_DATA_FLAGS_BS == AUTH_DATA_FLAGS_BS) { + return false; + } + } + + return true; + } + + /** + * Verifies a Webauthn P256 signature (Authentication Assertion) as described + * in https://www.w3.org/TR/webauthn-2/#sctn-verifying-assertion. We do not + * verify all the steps as described in the specification, only ones relevant + * to our context. Please carefully read through this list before usage. + * Specifically, we do verify the following: + * - Verify that authenticatorData (which comes from the authenticator, + * such as iCloud Keychain) indicates a well-formed assertion. If + * requireUserVerification is set, checks that the authenticator enforced + * user verification. User verification should be required if, + * and only if, options.userVerification is set to required in the request + * - Verifies that the client JSON is of type "webauthn.get", i.e. the client + * was responding to a request to assert authentication. + * - Verifies that the client JSON contains the requested challenge. + * - Finally, verifies that (r, s) constitute a valid signature over both + * the authenicatorData and client JSON, for public key (x, y). + * + * We make some assumptions about the particular use case of this verifier, + * so we do NOT verify the following: + * - Does NOT verify that the origin in the clientDataJSON matches the + * Relying Party's origin: It is considered the authenticator's + * responsibility to ensure that the user is interacting with the correct + * RP. This is enforced by most high quality authenticators properly, + * particularly the iCloud Keychain and Google Password Manager were + * tested. + * - Does NOT verify That c.topOrigin is well-formed: We assume c.topOrigin + * would never be present, i.e. the credentials are never used in a + * cross-origin/iframe context. The website/app set up should disallow + * cross-origin usage of the credentials. This is the default behaviour for + * created credentials in common settings. + * - Does NOT verify that the rpIdHash in authData is the SHA-256 hash of an + * RP ID expected by the Relying Party: This means that we rely on the + * authenticator to properly enforce credentials to be used only by the + * correct RP. This is generally enforced with features like Apple App Site + * Association and Google Asset Links. To protect from edge cases in which + * a previously-linked RP ID is removed from the authorised RP IDs, + * we recommend that messages signed by the authenticator include some + * expiry mechanism. + * - Does NOT verify the credential backup state: This assumes the credential + * backup state is NOT used as part of Relying Party business logic or + * policy. + * - Does NOT verify the values of the client extension outputs: This assumes + * that the Relying Party does not use client extension outputs. + * - Does NOT verify the signature counter: Signature counters are intended + * to enable risk scoring for the Relying Party. This assumes risk scoring + * is not used as part of Relying Party business logic or policy. + * - Does NOT verify the attestation object: This assumes that + * response.attestationObject is NOT present in the response, i.e. the + * RP does not intend to verify an attestation. + */ + function verifySignature( + bytes memory challenge, + bytes memory authenticatorData, + bool requireUserVerification, + string memory clientDataJSONPrefix, + string memory clientDataJSONSuffix, + uint256 responseTypeLocation, + uint256 r, + uint256 s, + uint256 x, + uint256 y + ) + internal + view + returns (bool) + { + // Check that authenticatorData has good flags + if (authenticatorData.length < 37 || !checkAuthFlags(authenticatorData[32], requireUserVerification)) { + return false; + } + + bytes memory clientDataJSON = abi.encodePacked(clientDataJSONPrefix, Base64URL.encode(challenge), clientDataJSONSuffix); + + // Check that response is for an authentication assertion + string memory responseType = '"type":"webauthn.get"'; + if (!contains(responseType, string(clientDataJSON), responseTypeLocation)) { + return false; + } + + // Check that the public key signed sha256(authenticatorData || sha256(clientDataJSON)) + bytes32 clientDataJSONHash = sha256(bytes(clientDataJSON)); + bytes32 messageHash = sha256(abi.encodePacked(authenticatorData, clientDataJSONHash)); + + return P256FCLVerifierLib.verifySignature(messageHash, r, s, x, y); + } +} diff --git a/src/libraries/utils/Base64URL.sol b/src/libraries/utils/Base64URL.sol new file mode 100644 index 0000000..4b83a10 --- /dev/null +++ b/src/libraries/utils/Base64URL.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import "openzeppelin-contracts/contracts/utils/Base64.sol"; + +library Base64URL { + function encode(bytes memory data) internal pure returns (string memory) { + string memory strb64 = Base64.encode(data); + bytes memory b64 = bytes(strb64); + + // Base64 can end with "=" or "=="; Base64URL has no padding. + uint256 equalsCount = 0; + if (b64.length > 2 && b64[b64.length - 2] == "=") equalsCount = 2; + else if (b64.length > 1 && b64[b64.length - 1] == "=") equalsCount = 1; + + uint256 len = b64.length - equalsCount; + bytes memory result = new bytes(len); + + for (uint256 i = 0; i < len; i++) { + if (b64[i] == "+") { + result[i] = "-"; + } else if (b64[i] == "/") { + result[i] = "_"; + } else { + result[i] = b64[i]; + } + } + + return string(result); + } +} diff --git a/src/utils/Typehashes.sol b/src/utils/Typehashes.sol new file mode 100644 index 0000000..019d50f --- /dev/null +++ b/src/utils/Typehashes.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +bytes32 constant EIP712_DOMAIN_TYPEHASH = + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); + +// NOTE: signature is omitted from the Delegation typehash +bytes32 constant DELEGATION_TYPEHASH = keccak256( + "Delegation(address delegate,address delegator,bytes32 authority,Caveat[] caveats,uint256 salt)Caveat(address enforcer,bytes terms)" +); + +bytes32 constant CAVEAT_TYPEHASH = keccak256("Caveat(address enforcer,bytes terms)"); diff --git a/src/utils/Types.sol b/src/utils/Types.sol new file mode 100644 index 0000000..c75f000 --- /dev/null +++ b/src/utils/Types.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { PackedUserOperation } from "@account-abstraction/interfaces/PackedUserOperation.sol"; + +/** + * @title EIP712Domain + * @notice Struct representing the EIP712 domain for signature validation. + */ +struct EIP712Domain { + string name; + string version; + uint256 chainId; + address verifyingContract; +} + +/** + * @title Delegation + * @notice Struct representing a delegation to give a delegate authority to act on behalf of a delegator. + * @dev `signature` is ignored during delegation hashing so it can be manipulated post signing. + */ +struct Delegation { + address delegate; + address delegator; + bytes32 authority; + Caveat[] caveats; + uint256 salt; + bytes signature; +} + +/** + * @title Caveat + * @notice Struct representing a caveat to enforce on a delegation. + * @dev `args` is ignored during caveat hashing so it can be manipulated post signing. + */ +struct Caveat { + address enforcer; + bytes terms; + bytes args; +} + +/** + * @title Action + * @notice This struct represents an action to be taken. + * @dev It is used to pass the action of a transaction to a CaveatEnforcer. + * It only includes the functional part of a transaction, allowing it to be + * agnostic whether this was sent from a protocol-level tx or UserOperation. + */ +struct Action { + address to; + uint256 value; + bytes data; +} + +/** + * @title P256 Public Key + * @notice Struct containing the X and Y coordinates of a P256 public key. + */ +struct P256PublicKey { + uint256 x; + uint256 y; +} + +struct DecodedWebAuthnSignature { + uint256 r; + uint256 s; + bytes authenticatorData; + bool requireUserVerification; + string clientDataJSONPrefix; + string clientDataJSONSuffix; + uint256 responseTypeLocation; +} diff --git a/test/CounterfactualAssetsTest.t.sol b/test/CounterfactualAssetsTest.t.sol new file mode 100644 index 0000000..0611c0c --- /dev/null +++ b/test/CounterfactualAssetsTest.t.sol @@ -0,0 +1,261 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { BaseTest } from "./utils/BaseTest.t.sol"; +import { Delegation, Delegation, Caveat, Action } from "../src/utils/Types.sol"; +import { Implementation, SignatureType } from "./utils/Types.t.sol"; +import { BasicCF721 } from "./utils/BasicCF721.t.sol"; +import { EncoderLib } from "../src/libraries/EncoderLib.sol"; +import { DeployedEnforcer } from "../src/enforcers/DeployedEnforcer.sol"; +import { AllowedTargetsEnforcer } from "../src/enforcers/AllowedTargetsEnforcer.sol"; +import { AllowedMethodsEnforcer } from "../src/enforcers/AllowedMethodsEnforcer.sol"; + +contract CounterfactualAssetsTest is BaseTest { + constructor() { + IMPLEMENTATION = Implementation.MultiSig; + SIGNATURE_TYPE = SignatureType.MultiSig; + } + + ////////////////////////////// State /////////////////////////////// + DeployedEnforcer public deployedEnforcer; + AllowedTargetsEnforcer public allowedTargetsEnforcer; + AllowedMethodsEnforcer public allowedMethodsEnforcer; + address public basicCf721; + bytes public basicCf721Args; + bytes public basicCf721Bytecode; + bytes32 public basicCf721BytecodeHash; + bytes32 public basicCf721Salt; + + ////////////////////// Set up ////////////////////// + + function setUp() public override { + super.setUp(); + basicCf721Args = abi.encode(address(users.alice.deleGator), "MyCF721", "CF721", "ipfs://"); + basicCf721Salt = keccak256(abi.encode("salt")); + deployedEnforcer = new DeployedEnforcer(); + vm.label(address(deployedEnforcer), "Deployed Enforcer"); + allowedTargetsEnforcer = new AllowedTargetsEnforcer(); + vm.label(address(allowedTargetsEnforcer), "Allowed Targets Enforcer"); + allowedMethodsEnforcer = new AllowedMethodsEnforcer(); + vm.label(address(allowedMethodsEnforcer), "Allowed Methods Enforcer"); + } + + // should allow Alice to create NFT specifics and give delegations + function test_allow_createNftAndDelegate_offchain() public { + // Alice creates the NFT details, Name, Symbol, BaseURI and gets the deterministic address + // The Alice then uses the deterministic address of her CF721 NFT contract to create delegations to mint + // The delegation will have the DeployedEnforcer caveat to make sure the CF721 contract is deployed + + // Calculate data needed for deploy Caveat terms + bytes32 bytecodeHash_ = hashInitCode(type(BasicCF721).creationCode, basicCf721Args); + address predictedAddr_ = vm.computeCreate2Address(basicCf721Salt, bytecodeHash_, address(deployedEnforcer)); + address factoryPredictedAddr_ = deployedEnforcer.computeAddress(bytecodeHash_, basicCf721Salt); + assertEq(factoryPredictedAddr_, predictedAddr_); + + // Get initial state + bytes memory initialCode_ = predictedAddr_.code; + assertEq(initialCode_, bytes("")); + + // Create deploy terms and Caveat for deploying BasicCF721 + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = Caveat({ + args: hex"", + enforcer: address(deployedEnforcer), + terms: abi.encodePacked( + predictedAddr_, + basicCf721Salt, + abi.encodePacked( + type(BasicCF721).creationCode, abi.encode(address(users.alice.deleGator), "MyCF721", "CF721", "ipfs://") + ) + ) + }); + + // Create Delegation to deploy BasicCF721 + Delegation memory delegation_ = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + + // Alice signs Delegation to deploy BasicCF721 + delegation_ = signDelegation(users.alice, delegation_); + + // Create Bob's action_ to mint an NFT + Action memory action_ = Action({ + to: predictedAddr_, + value: 0, + data: abi.encodeWithSelector(BasicCF721.mint.selector, [address(users.bob.deleGator)]) + }); + + // Execute Bob's UserOp + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation_; + invokeDelegation_UserOp(users.bob, delegations_, action_); + + // Get final state + bytes memory finalCode_ = predictedAddr_.code; + // Assert that the CF721 contract is deployed correctly + assertEq(finalCode_, type(BasicCF721).runtimeCode); + // Assert that an NFT was minted + assertEq(BasicCF721(predictedAddr_).balanceOf(address(users.bob.deleGator)), 1); + assertEq(BasicCF721(predictedAddr_).ownerOf(0), address(users.bob.deleGator)); + } + + // should allow Alice to create NFT specifics and give delegations with strict caveats + // NOTE: This is really just testing Caveats + function test_allow_createNftAndDelegateWithCaveats_offchain() public { + // Alice creates the NFT details, Name, Symbol, BaseURI and gets the deterministic address + // Alice then uses the deterministic address of her CF721 NFT contract to create delegations to mint + // The first delegation will have the DeployedEnforcer caveat to make sure the CF721 contract is deployed + // It will also have a AllowedTargetEnforcer and AllowedMethodsEnforcer to make sure the mint function is called + + // Calculate data needed for deploy Caveat terms + bytes32 bytecodeHash_ = hashInitCode(type(BasicCF721).creationCode, basicCf721Args); + address predictedAddr_ = vm.computeCreate2Address(basicCf721Salt, bytecodeHash_, address(deployedEnforcer)); + + // Get initial state + bytes memory initialCode_ = predictedAddr_.code; + assertEq(initialCode_, bytes("")); + + // Create deploy terms and Caveat for deploying BasicCF721 + Caveat[] memory caveats_ = new Caveat[](3); + // DeployedEnforcer + caveats_[0] = Caveat({ + args: hex"", + enforcer: address(deployedEnforcer), + terms: abi.encodePacked( + predictedAddr_, + basicCf721Salt, + abi.encodePacked( + type(BasicCF721).creationCode, abi.encode(address(users.alice.deleGator), "MyCF721", "CF721", "ipfs://") + ) + ) + }); + // AllowedTargetEnforcer + caveats_[1] = Caveat({ args: hex"", enforcer: address(allowedTargetsEnforcer), terms: abi.encodePacked(predictedAddr_) }); + // AllowedMethodsEnforcer + caveats_[2] = + Caveat({ args: hex"", enforcer: address(allowedMethodsEnforcer), terms: abi.encodePacked(BasicCF721.mint.selector) }); + + // Create Delegation to deploy BasicCF721 + Delegation memory delegation_ = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + + // Alice signs Delegation to deploy BasicCF721 + delegation_ = signDelegation(users.alice, delegation_); + + // Create Bob's action_ to mint an NFT + Action memory action_ = Action({ + to: predictedAddr_, + value: 0, + data: abi.encodeWithSelector(BasicCF721.mint.selector, [address(users.bob.deleGator)]) + }); + + // Execute Bob's UserOp + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation_; + invokeDelegation_UserOp(users.bob, delegations_, action_); + + // Get final state + bytes memory finalCode_ = predictedAddr_.code; + // Assert that the CF721 contract is deployed correctly + assertEq(finalCode_, type(BasicCF721).runtimeCode); + // Assert that an NFT was minted + assertEq(BasicCF721(predictedAddr_).balanceOf(address(users.bob.deleGator)), 1); + assertEq(BasicCF721(predictedAddr_).ownerOf(0), address(users.bob.deleGator)); + } + + // should allow Alice to create NFT specifics and give delegations with strict caveats and allow user to redelegate + // NOTE: This is really just testing Caveats and redelegation + function test_allow_createNftAndDelegateWithCaveatsAndRedelegate_offchain() public { + // Alice creates the NFT details, Name, Symbol, BaseURI and gets the deterministic address + // Alice then uses the deterministic address of her CF721 NFT contract to create delegations to mint + // The first delegation will have the DeployedEnforcer caveat to make sure the CF721 contract is deployed + // It will also have a AllowedTargetEnforcer and AllowedMethodsEnforcer to make sure the mint function is called + // Bob then redelegates all of the permissions to Carol + + // Calculate data needed for deploy Caveat terms + bytes32 bytecodeHash_ = hashInitCode(type(BasicCF721).creationCode, basicCf721Args); + address predictedAddr_ = vm.computeCreate2Address(basicCf721Salt, bytecodeHash_, address(deployedEnforcer)); + + // Get initial state + bytes memory initialCode_ = predictedAddr_.code; + assertEq(initialCode_, bytes("")); + + // Create deploy terms and Caveat for deploying BasicCF721 + Caveat[] memory caveats_ = new Caveat[](3); + // DeployedEnforcer + caveats_[0] = Caveat({ + args: hex"", + enforcer: address(deployedEnforcer), + terms: abi.encodePacked( + predictedAddr_, + basicCf721Salt, + abi.encodePacked( + type(BasicCF721).creationCode, abi.encode(address(users.alice.deleGator), "MyCF721", "CF721", "ipfs://") + ) + ) + }); + // AllowedTargetEnforcer + caveats_[1] = Caveat({ args: hex"", enforcer: address(allowedTargetsEnforcer), terms: abi.encodePacked(predictedAddr_) }); + // AllowedMethodsEnforcer + caveats_[2] = + Caveat({ args: hex"", enforcer: address(allowedMethodsEnforcer), terms: abi.encodePacked(BasicCF721.mint.selector) }); + + // Create Alice's Delegation to Bob to deploy BasicCF721 and mint + Delegation memory aliceDelegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + + // Alice signs Delegation to Bob + Delegation memory aliceDelegation_ = signDelegation(users.alice, aliceDelegation); + + // Create Bob's Delegation to Carol + Delegation memory bobDelegation_ = Delegation({ + delegate: address(users.carol.deleGator), + delegator: address(users.bob.deleGator), + authority: EncoderLib._getDelegationHash(aliceDelegation), + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Bob signs Delegation to Carol + bobDelegation_ = signDelegation(users.bob, bobDelegation_); + + // Create Carols's action_ to mint an NFT + Action memory action_ = Action({ + to: predictedAddr_, + value: 0, + data: abi.encodeWithSelector(BasicCF721.mint.selector, [address(users.carol.deleGator)]) + }); + + // Execute Carol's UserOp + Delegation[] memory delegations_ = new Delegation[](2); + delegations_[0] = bobDelegation_; + delegations_[1] = aliceDelegation_; + invokeDelegation_UserOp(users.carol, delegations_, action_); + + // Get final state + bytes memory finalCode_ = predictedAddr_.code; + // Assert that the CF721 contract is deployed correctly + assertEq(finalCode_, type(BasicCF721).runtimeCode); + // Assert that an NFT was minted + assertEq(BasicCF721(predictedAddr_).balanceOf(address(users.carol.deleGator)), 1); + assertEq(BasicCF721(predictedAddr_).ownerOf(0), address(users.carol.deleGator)); + } +} diff --git a/test/DeleGatorTestSuite.t.sol b/test/DeleGatorTestSuite.t.sol new file mode 100644 index 0000000..ee2e0ca --- /dev/null +++ b/test/DeleGatorTestSuite.t.sol @@ -0,0 +1,2378 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { IEntryPoint, EntryPoint } from "@account-abstraction/core/EntryPoint.sol"; +import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; +import { IERC721Receiver } from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; +import { IERC1155Receiver } from "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol"; +import { IERC1271 } from "@openzeppelin/contracts/interfaces/IERC1271.sol"; +import { MessageHashUtils } from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; +import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import { UUPSUpgradeable } from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; + +import { BaseTest } from "./utils/BaseTest.t.sol"; +import { Delegation, Caveat, PackedUserOperation, Delegation, Action } from "../src/utils/Types.sol"; +import { Implementation, SignatureType } from "./utils/Types.t.sol"; +import { Counter } from "./utils/Counter.t.sol"; +import { StorageUtilsLib } from "./utils/StorageUtilsLib.t.sol"; +import { SigningUtilsLib } from "./utils/SigningUtilsLib.t.sol"; +import { ExecutionLib } from "../src/libraries/ExecutionLib.sol"; + +import { IDelegationManager } from "../src/interfaces/IDelegationManager.sol"; +import { IDeleGatorCore } from "../src/interfaces/IDeleGatorCore.sol"; +import { IDeleGatorCoreFull } from "../src/interfaces/IDeleGatorCoreFull.sol"; +import { EncoderLib } from "../src/libraries/EncoderLib.sol"; +import { AllowedMethodsEnforcer } from "../src/enforcers/AllowedMethodsEnforcer.sol"; +import { AllowedTargetsEnforcer } from "../src/enforcers/AllowedTargetsEnforcer.sol"; + +abstract contract DeleGatorTestSuite is BaseTest { + using MessageHashUtils for bytes32; + + ////////////////////////////// Setup ////////////////////// + + Counter aliceDeleGatorCounter; + Counter bobDeleGatorCounter; + + function setUp() public virtual override { + super.setUp(); + + allowedMethodsEnforcer = new AllowedMethodsEnforcer(); + vm.label(address(allowedMethodsEnforcer), "Allowed Methods Enforcer"); + allowedTargetsEnforcer = new AllowedTargetsEnforcer(); + vm.label(address(allowedTargetsEnforcer), "Allowed Targets Enforcer"); + + aliceDeleGatorCounter = new Counter(address(users.alice.deleGator)); + bobDeleGatorCounter = new Counter(address(users.bob.deleGator)); + } + + ////////////////////////////// State ////////////////////////////// + + AllowedMethodsEnforcer public allowedMethodsEnforcer; + AllowedTargetsEnforcer public allowedTargetsEnforcer; + bytes32 private DELEGATIONS_STORAGE_LOCATION = StorageUtilsLib.getStorageLocation("DeleGator.Delegations"); + bytes32 private DELEGATOR_CORE_STORAGE_LOCATION = StorageUtilsLib.getStorageLocation("DeleGator.Core"); + bytes32 private INITIALIZABLE_STORAGE_LOCATION = StorageUtilsLib.getStorageLocation("openzeppelin.storage.Initializable"); + + ////////////////////////////// Events ////////////////////////////// + + event Deposited(address indexed account, uint256 totalDeposit); + event Delegated(bytes32 indexed delegationHash, address indexed delegator, address indexed delegate, Delegation delegation); + event EnabledDelegation( + bytes32 indexed delegationHash, address indexed delegator, address indexed delegate, Delegation delegation + ); + event DisabledDelegation( + bytes32 indexed delegationHash, address indexed delegator, address indexed delegate, Delegation delegation + ); + event Upgraded(address indexed implementation); + event SetEntryPoint(IEntryPoint indexed entryPoint); + event Initialized(uint64 version); + event BeforeExecution(); + + event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason); + event UserOperationEvent( + bytes32 indexed userOpHash, + address indexed sender, + address indexed paymaster, + uint256 nonce, + bool success, + uint256 actualGasCost, + uint256 actualGasUsed + ); + event Withdrawn(address indexed account, address withdrawAddress, uint256 amount); + event ExecutedAction(address indexed to, uint256 value, bool success, bytes errorMessage); + event SentPrefund(address indexed sender, uint256 amount, bool success); + event RedeemedDelegation(address indexed rootDelegator, address indexed redeemer, Delegation delegation); + + ////////////////////////////// Core Functionality ////////////////////////////// + + function test_erc165_supportsInterface() public { + // should support the following interfaces + assertTrue(users.alice.deleGator.supportsInterface(type(IERC165).interfaceId)); + assertTrue(users.alice.deleGator.supportsInterface(type(IERC1271).interfaceId)); + assertTrue(users.alice.deleGator.supportsInterface(type(IERC1155Receiver).interfaceId)); + assertTrue(users.alice.deleGator.supportsInterface(type(IERC721Receiver).interfaceId)); + assertTrue(users.alice.deleGator.supportsInterface(type(IDeleGatorCore).interfaceId)); + } + + // should allow the delegator account to receive native tokens + function test_allow_receiveNativeToken() public { + uint256 balanceBefore = address(users.alice.deleGator).balance; + (bool success,) = address(users.alice.deleGator).call{ value: 1 ether }(""); + assertTrue(success); + assertEq(address(users.alice.deleGator).balance, balanceBefore + 1 ether); + } + + // should allow retrieval of the nonce + function test_allow_getNonce() public { + // Get Alice's nonce + uint256 nonce = users.alice.deleGator.getNonce(); + assertEq(nonce, 0); + } + + // should allow retrieval of the nonce + function test_allow_getNonceWithKey() public { + // Get Alice's nonce + uint256 nonce = users.alice.deleGator.getNonce(uint192(100)); + assertEq(nonce, 1844674407370955161600); + } + + // should allow retrieval of the deposit in the entry point + function test_allow_getDeposit() public { + // Get Alice's deposit + uint256 deposit = users.alice.deleGator.getDeposit(); + assertEq(deposit, 0); + } + + // should allow retrieval of the entry point + function test_allow_getEntryPoint() public { + // Get entry point address + address entryPoint_ = address(users.alice.deleGator.entryPoint()); + assertEq(entryPoint_, address(entryPoint)); + } + + // should allow Alice to store a Delegation onchain through a UserOp + function test_allow_storeOnchainDelegation() public { + // Create delegation + Delegation memory delegation = Delegation({ + delegate: address(users.bob.addr), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Submit Alice's UserOp + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation)); + + // Get delegation hash + bytes32 delegationHash = EncoderLib._getDelegationHash(delegation); + + // Get stored delegation + bool isOnchain = users.alice.deleGator.isDelegationOnchain(delegationHash); + + // Validate that the delegation is correct + assertTrue(isOnchain); + } + + // should allow Alice to enable/disable an offchain Delegation with a Delegation struct + function test_allow_updatingOffchainDelegationDisabledStateWithStruct() public { + // Create delegation + Delegation memory delegation = Delegation({ + delegate: address(users.bob.addr), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Get delegation hash + bytes32 delegationHash = EncoderLib._getDelegationHash(delegation); + + PackedUserOperation memory disableUserOp = createAndSignUserOp( + users.alice, + address(users.alice.deleGator), + abi.encodeWithSignature( + "disableDelegation((address,address,bytes32,(address,bytes,bytes)[],uint256,bytes))", delegation + ) + ); + PackedUserOperation memory enableUserOp = createAndSignUserOp( + users.alice, + address(users.alice.deleGator), + abi.encodeWithSignature("enableDelegation((address,address,bytes32,(address,bytes,bytes)[],uint256,bytes))", delegation) + ); + + // check before revoking + bool isDisabled = users.alice.deleGator.isDelegationDisabled(delegationHash); + assertEq(isDisabled, false); + + // Disable delegation + vm.expectEmit(true, true, true, true); + emit DisabledDelegation(delegationHash, address(users.alice.deleGator), users.bob.addr, delegation); + submitUserOp_Bundler(disableUserOp); + isDisabled = users.alice.deleGator.isDelegationDisabled(delegationHash); + assertEq(isDisabled, true); + + // Enable delegation + vm.expectEmit(true, true, true, true); + emit EnabledDelegation(delegationHash, address(users.alice.deleGator), users.bob.addr, delegation); + submitUserOp_Bundler(enableUserOp); + isDisabled = users.alice.deleGator.isDelegationDisabled(delegationHash); + assertEq(isDisabled, false); + } + + // should allow Alice to enable/disable an onchain Delegation with a Delegation struct + function test_allow_updatingOnchainDelegationDisabledStateWithStruct() public { + // Create delegation + Delegation memory delegation = Delegation({ + delegate: address(users.bob.addr), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Submit Alice's UserOp + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation)); + + // Get delegation hash + bytes32 delegationHash = EncoderLib._getDelegationHash(delegation); + + PackedUserOperation memory disableUserOp = createAndSignUserOp( + users.alice, + address(users.alice.deleGator), + abi.encodeWithSignature( + "disableDelegation((address,address,bytes32,(address,bytes,bytes)[],uint256,bytes))", delegation + ) + ); + PackedUserOperation memory enableUserOp = createAndSignUserOp( + users.alice, + address(users.alice.deleGator), + abi.encodeWithSignature("enableDelegation((address,address,bytes32,(address,bytes,bytes)[],uint256,bytes))", delegation) + ); + + // check before revoking + bool isDisabled = users.alice.deleGator.isDelegationDisabled(delegationHash); + assertEq(isDisabled, false); + + // Disable delegation + vm.expectEmit(true, true, true, true); + emit DisabledDelegation(delegationHash, address(users.alice.deleGator), users.bob.addr, delegation); + submitUserOp_Bundler(disableUserOp); + isDisabled = users.alice.deleGator.isDelegationDisabled(delegationHash); + assertEq(isDisabled, true); + + // Enable delegation + vm.expectEmit(true, true, true, true); + emit EnabledDelegation(delegationHash, address(users.alice.deleGator), users.bob.addr, delegation); + submitUserOp_Bundler(enableUserOp); + isDisabled = users.alice.deleGator.isDelegationDisabled(delegationHash); + assertEq(isDisabled, false); + } + + // should not allow Alice to delegate if she is not the delegator + function test_notAllow_delegatingForAnotherDelegator() public { + // Creating an invalid delegation where Alice is not the delegator. + Delegation memory delegation = Delegation({ + delegate: address(users.carol.deleGator), + delegator: address(users.bob.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + // Create UserOp + bytes memory userOpCallData = + abi.encodeWithSignature("enableDelegation((address,address,bytes32,(address,bytes,bytes)[],uint256,bytes))", delegation); + + PackedUserOperation memory userOp = createAndSignUserOp(users.alice, address(users.alice.deleGator), userOpCallData); + bytes32 userOpHash = entryPoint.getUserOpHash(userOp); + + // Expect a revert event + vm.expectEmit(true, true, false, true, address(entryPoint)); + emit UserOperationRevertReason( + userOpHash, address(users.alice.deleGator), 0, abi.encodeWithSelector(IDelegationManager.InvalidDelegator.selector) + ); + + // Submit the UserOp + submitUserOp_Bundler(userOp); + } + + // should not allow Alice to disable an invalid delegation + function test_notAllow_disablingInvalidDelegation() public { + Delegation memory delegation = Delegation({ + delegate: address(users.carol.deleGator), + delegator: address(users.bob.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + // Create UserOp + bytes memory userOpCallData = abi.encodeWithSignature( + "disableDelegation((address,address,bytes32,(address,bytes,bytes)[],uint256,bytes))", delegation + ); + + PackedUserOperation memory userOp = createAndSignUserOp(users.alice, address(users.alice.deleGator), userOpCallData); + bytes32 userOpHash = entryPoint.getUserOpHash(userOp); + + // Expect a revert event + vm.expectEmit(true, true, false, true, address(entryPoint)); + emit UserOperationRevertReason( + userOpHash, address(users.alice.deleGator), 0, abi.encodeWithSelector(IDelegationManager.InvalidDelegator.selector) + ); + + // Submit the UserOp + submitUserOp_Bundler(userOp); + } + + // should not allow using a delegation without a signature + function test_notAllow_delegationWithoutSignature() public { + Delegation memory delegation_ = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation_; + + vm.expectRevert(abi.encodeWithSelector(IDelegationManager.InvalidDelegation.selector)); + + vm.prank(address(users.bob.deleGator)); + users.bob.deleGator.redeemDelegation(abi.encode(delegations_), action_); + } + + // should not allow to delegate already existing delegation + function test_notAllow_alreadyExistingDelegation() public { + // Create delegation + Delegation memory delegation = Delegation({ + delegate: address(users.bob.addr), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Submit Alice's UserOp to delegate + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation)); + + // Create Alice's UserOp (with valid EntryPoint) + bytes memory userOpCallData = abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation); + PackedUserOperation memory userOp = createAndSignUserOp(users.alice, address(users.alice.deleGator), userOpCallData); + bytes32 userOpHash = entryPoint.getUserOpHash(userOp); + + // Expect a revert event + vm.expectEmit(true, true, false, true, address(entryPoint)); + emit UserOperationRevertReason( + userOpHash, address(users.alice.deleGator), 1, abi.encodeWithSelector(IDelegationManager.AlreadyExists.selector) + ); + + // Submit the UserOp + submitUserOp_Bundler(userOp); + } + + // should not allow to enable already enabled delegation + function test_notAllow_enableAlreadyEnabledDelegation() public { + // Create delegation + Delegation memory delegation = Delegation({ + delegate: address(users.bob.addr), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Submit Alice's UserOp to delegate + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation)); + + // Create UserOp + bytes memory userOpCallData = + abi.encodeWithSignature("enableDelegation((address,address,bytes32,(address,bytes,bytes)[],uint256,bytes))", delegation); + + PackedUserOperation memory userOp = createAndSignUserOp(users.alice, address(users.alice.deleGator), userOpCallData); + bytes32 userOpHash = entryPoint.getUserOpHash(userOp); + + // Expect a revert event + vm.expectEmit(true, true, false, true, address(entryPoint)); + emit UserOperationRevertReason( + userOpHash, address(users.alice.deleGator), 1, abi.encodeWithSelector(IDelegationManager.AlreadyEnabled.selector) + ); + + // Submit the UserOp + submitUserOp_Bundler(userOp); + } + + function test_notAllow_disableAlreadyDisabledDelegation() public { + // Create delegation + Delegation memory delegation = Delegation({ + delegate: address(users.bob.addr), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Submit Alice's UserOp to delegate + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation)); + + // Get delegation hash + bytes32 delegationHash = EncoderLib._getDelegationHash(delegation); + + // Get stored delegation disabled state + bool isDisabled = users.alice.deleGator.isDelegationDisabled(delegationHash); + assertFalse(isDisabled); + + // Disable delegation + execute_UserOp( + users.alice, + abi.encodeWithSignature( + "disableDelegation((address,address,bytes32,(address,bytes,bytes)[],uint256,bytes))", delegation + ) + ); + isDisabled = users.alice.deleGator.isDelegationDisabled(delegationHash); + assertTrue(isDisabled); + + // Create UserOp + PackedUserOperation memory disableUserOp = createAndSignUserOp( + users.alice, + address(users.alice.deleGator), + abi.encodeWithSignature( + "disableDelegation((address,address,bytes32,(address,bytes,bytes)[],uint256,bytes))", delegation + ) + ); + bytes32 userOpHash = entryPoint.getUserOpHash(disableUserOp); + + // Expect a revert event + vm.expectEmit(true, true, false, true, address(entryPoint)); + emit UserOperationRevertReason( + userOpHash, address(users.alice.deleGator), 2, abi.encodeWithSelector(IDelegationManager.AlreadyDisabled.selector) + ); + + // Submit the UserOp + submitUserOp_Bundler(disableUserOp); + } + + // should allow Alice to disable an offchain Delegation + function test_allow_disableOffchainDelegation() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + + // Create delegation + Delegation memory delegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Alice signs delegation + delegation = signDelegation(users.alice, delegation); + + // Create Bob's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Execute Bob's UserOp + Delegation[] memory delegations = new Delegation[](1); + delegations[0] = delegation; + + invokeDelegation_UserOp(users.bob, delegations, action); + + // Get intermediate count + uint256 intermediateValue = aliceDeleGatorCounter.count(); + + // Validate that the count has increased by 1 + assertEq(intermediateValue, initialValue + 1); + + execute_UserOp( + users.alice, + abi.encodeWithSignature( + "disableDelegation((address,address,bytes32,(address,bytes,bytes)[],uint256,bytes))", delegation + ) + ); + + bytes memory userOpCallData = + abi.encodeWithSelector(IDeleGatorCoreFull.redeemDelegation.selector, abi.encode(delegations), action); + + uint256[] memory signers_ = new uint256[](1); + signers_[0] = users.bob.privateKey; + + PackedUserOperation memory userOp = createAndSignUserOp(users.bob, address(users.bob.deleGator), userOpCallData); + + PackedUserOperation[] memory userOps = new PackedUserOperation[](1); + userOps[0] = userOp; + vm.prank(bundler); + + bytes32 userOpHash = entryPoint.getUserOpHash(userOp); + + vm.expectEmit(true, true, false, true, address(entryPoint)); + emit UserOperationRevertReason( + userOpHash, + address(users.bob.deleGator), + 1, + abi.encodeWithSelector(IDelegationManager.CannotUseADisabledDelegation.selector) + ); + + entryPoint.handleOps(userOps, bundler); + + uint256 finalValue = aliceDeleGatorCounter.count(); + + // Validate that the count has not increased + assertEq(finalValue, intermediateValue); + } + + // should allow Alice to reset a disabled onchain delegation + function test_allow_resetDisabledDelegation() public { + // Create delegation + Delegation memory delegation = Delegation({ + delegate: address(users.bob.addr), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Submit Alice's UserOp to delegate + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation)); + + // Get delegation hash + bytes32 delegationHash = EncoderLib._getDelegationHash(delegation); + + // Get stored delegation disabled state + bool isDisabled = users.alice.deleGator.isDelegationDisabled(delegationHash); + assertFalse(isDisabled); + + // Disable delegation + execute_UserOp( + users.alice, + abi.encodeWithSignature( + "disableDelegation((address,address,bytes32,(address,bytes,bytes)[],uint256,bytes))", delegation + ) + ); + isDisabled = users.alice.deleGator.isDelegationDisabled(delegationHash); + assertTrue(isDisabled); + + // Enable delegation + execute_UserOp( + users.alice, + abi.encodeWithSignature("enableDelegation((address,address,bytes32,(address,bytes,bytes)[],uint256,bytes))", delegation) + ); + isDisabled = users.alice.deleGator.isDelegationDisabled(delegationHash); + assertFalse(isDisabled); + } + + // should allow anyone to redeem an open Delegation (onchain) + function test_allow_onchainOpenDelegation() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + uint256 updatedValue; + + // Create delegation + Caveat[] memory caveats = new Caveat[](1); + caveats[0] = Caveat({ + args: hex"", + enforcer: address(allowedTargetsEnforcer), + terms: abi.encodePacked(address(aliceDeleGatorCounter)) + }); + Delegation memory delegation = Delegation({ + delegate: ANY_DELEGATE, + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats, + salt: 0, + signature: hex"" + }); + + // Store delegation + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation)); + + // Bob's Delegator redeems the delegation + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + Delegation[] memory delegations = new Delegation[](1); + delegations[0] = delegation; + invokeDelegation_UserOp(users.bob, delegations, action); + + // Validate that the count has increased by 1 + updatedValue = aliceDeleGatorCounter.count(); + assertEq(updatedValue, initialValue + 1); + initialValue = updatedValue; + + bytes32[] memory delegationHashes = new bytes32[](1); + delegationHashes[0] = EncoderLib._getDelegationHash(delegation); + // Bob redeems the delegation + vm.prank(users.bob.addr); + vm.expectEmit(true, true, true, true, address(delegationManager)); + emit RedeemedDelegation(delegation.delegator, users.bob.addr, delegation); + delegationManager.redeemDelegation(abi.encode(delegations), action); + + // Validate that the count has increased by 1 + updatedValue = aliceDeleGatorCounter.count(); + assertEq(updatedValue, initialValue + 1); + } + + // should emit an event when the action is executed + function test_emit_executedActionEvent() public { + uint256 initialValue = aliceDeleGatorCounter.count(); + + // Bob's Delegator redeems the delegation + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Creating a valid action + vm.prank(address(entryPoint)); + vm.expectEmit(true, true, true, true, address(users.alice.deleGator)); + emit ExecutedAction(action.to, action.value, true, hex""); + users.alice.deleGator.execute(action); + + // Validate that the count has increased by 1 + uint256 updatedValue = aliceDeleGatorCounter.count(); + assertEq(updatedValue, initialValue + 1); + + // Creating a invalid action + action.value = 1; + vm.prank(address(entryPoint)); + // Expect it to emit a reverted event + vm.expectEmit(true, true, true, true, address(users.alice.deleGator)); + vm.expectRevert(abi.encodeWithSelector(ExecutionLib.FailedExecutionWithoutReason.selector)); + emit ExecutedAction(action.to, action.value, false, hex""); + users.alice.deleGator.execute(action); + } + + // should emit an event when paying the prefund + function test_emit_sentPrefund() public { + PackedUserOperation memory packedUserOperation_; + vm.startPrank(address(entryPoint)); + + vm.expectEmit(true, true, true, true, address(users.alice.deleGator)); + emit SentPrefund(address(entryPoint), 1, true); + users.alice.deleGator.validateUserOp(packedUserOperation_, bytes32(0), 1); + + vm.expectEmit(true, true, true, true, address(users.alice.deleGator)); + emit SentPrefund(address(entryPoint), type(uint256).max, false); + users.alice.deleGator.validateUserOp(packedUserOperation_, bytes32(0), type(uint256).max); + } + + // should allow anyone to redeem an open Delegation (offchain) + function test_allow_offchainOpenDelegation() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + uint256 updatedValue; + + // Create delegation + Caveat[] memory caveats = new Caveat[](1); + caveats[0] = Caveat({ + args: hex"", + enforcer: address(allowedTargetsEnforcer), + terms: abi.encodePacked(address(aliceDeleGatorCounter)) + }); + Delegation memory delegation = Delegation({ + delegate: ANY_DELEGATE, + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats, + salt: 0, + signature: hex"" + }); + + // Alice signs delegation + delegation = signDelegation(users.alice, delegation); + + // Bob's Delegator redeems the delegation + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + Delegation[] memory delegations = new Delegation[](1); + delegations[0] = delegation; + + invokeDelegation_UserOp(users.bob, delegations, action); + + // Validate that the count has increased by 1 + updatedValue = aliceDeleGatorCounter.count(); + assertEq(updatedValue, initialValue + 1); + initialValue = updatedValue; + + // Bob redeems the delegation + vm.prank(users.bob.addr); + delegationManager.redeemDelegation(abi.encode(delegations), action); + + // Validate that the count has increased by 1 + updatedValue = aliceDeleGatorCounter.count(); + assertEq(updatedValue, initialValue + 1); + } + + // should allow anyone to redelegate an open Delegation (onchain) + function test_allow_onchainOpenDelegationRedelegation() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + uint256 updatedValue; + + // Create & store Alice's delegation + Caveat[] memory caveats = new Caveat[](1); + caveats[0] = Caveat({ + args: hex"", + enforcer: address(allowedTargetsEnforcer), + terms: abi.encodePacked(address(aliceDeleGatorCounter)) + }); + Delegation memory aliceDelegation = Delegation({ + delegate: ANY_DELEGATE, + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats, + salt: 0, + signature: hex"" + }); + bytes32 aliceDelegationHash = EncoderLib._getDelegationHash(aliceDelegation); + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, aliceDelegation)); + + // Create & store Bob's delegation + Delegation memory bobDelegation = Delegation({ + delegate: users.carol.addr, + delegator: address(users.bob.deleGator), + authority: aliceDelegationHash, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + execute_UserOp(users.bob, abi.encodeWithSelector(IDelegationManager.delegate.selector, bobDelegation)); + + // Carol redeems the delegation + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + Delegation[] memory delegations = new Delegation[](2); + delegations[0] = bobDelegation; + delegations[1] = aliceDelegation; + + vm.prank(users.carol.addr); + vm.expectEmit(true, true, true, true, address(delegationManager)); + emit RedeemedDelegation(aliceDelegation.delegator, users.carol.addr, bobDelegation); + vm.expectEmit(true, true, true, true, address(delegationManager)); + emit RedeemedDelegation(aliceDelegation.delegator, users.carol.addr, aliceDelegation); + delegationManager.redeemDelegation(abi.encode(delegations), action); + + // Validate that the count has increased by 1 + updatedValue = aliceDeleGatorCounter.count(); + assertEq(updatedValue, initialValue + 1); + } + + // should allow anyone to redelegate an open Delegation (offchain) + function test_allow_offchainOpenDelegationRedelegation() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + uint256 updatedValue; + + // Create Alice's open delegation + Caveat[] memory caveats = new Caveat[](1); + caveats[0] = Caveat({ + args: hex"", + enforcer: address(allowedTargetsEnforcer), + terms: abi.encodePacked(address(aliceDeleGatorCounter)) + }); + Delegation memory aliceDelegation = Delegation({ + delegate: ANY_DELEGATE, + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats, + salt: 0, + signature: hex"" + }); + bytes32 aliceDelegationHash = EncoderLib._getDelegationHash(aliceDelegation); + aliceDelegation = signDelegation(users.alice, aliceDelegation); + + // Bob's DeleGator redelegates the open delegation + Delegation memory bobDelegation = Delegation({ + delegate: users.carol.addr, + delegator: address(users.bob.deleGator), + authority: aliceDelegationHash, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + bobDelegation = signDelegation(users.bob, bobDelegation); + + // Carol redeems the delegation + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + Delegation[] memory delegations = new Delegation[](2); + delegations[0] = bobDelegation; + delegations[1] = aliceDelegation; + + // Carol redeems the delegation + vm.prank(users.carol.addr); + delegationManager.redeemDelegation(abi.encode(delegations), action); + + // Validate that the count has increased by 1 + updatedValue = aliceDeleGatorCounter.count(); + assertEq(updatedValue, initialValue + 1); + } + + // should allow Bob's DeleGator to redeem a Delegation through a UserOp (onchain) + function test_allow_deleGatorInvokeOnchainDelegation() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + + // Create delegation + Delegation memory delegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Store delegation + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation)); + + // Create Bob's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Execute Bob's UserOp + Delegation[] memory delegations = new Delegation[](1); + delegations[0] = delegation; + + invokeDelegation_UserOp(users.bob, delegations, action); + + // Get final count + uint256 finalValue = aliceDeleGatorCounter.count(); + + // Validate that the count has increased by 1 + assertEq(finalValue, initialValue + 1); + } + + // should allow Bob to redeem a Delegation with Caveats through a UserOp (onchain) + function test_allow_invokeOnchainDelegationWithCaveats() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + + // Create Caveats + Caveat[] memory caveats = new Caveat[](2); + caveats[0] = Caveat({ + args: hex"", + enforcer: address(allowedTargetsEnforcer), + terms: abi.encodePacked(address(aliceDeleGatorCounter)) + }); + caveats[1] = + Caveat({ args: hex"", enforcer: address(allowedMethodsEnforcer), terms: abi.encodePacked(Counter.increment.selector) }); + + // Create delegation + Delegation memory delegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats, + salt: 0, + signature: hex"" + }); + + // Store delegation + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation)); + + // Create Bob's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Execute Bob's UserOp + Delegation[] memory delegations = new Delegation[](1); + delegations[0] = delegation; + + invokeDelegation_UserOp(users.bob, delegations, action); + + // Get final count + uint256 finalValue = aliceDeleGatorCounter.count(); + + // Validate that the count has increased by 1 + assertEq(finalValue, initialValue + 1); + } + + // should NOT allow Bob to redeem a delegation with poorly formed data + function test_notAllow_invalidRedeemDelegationData() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + + // Create delegation + Delegation memory delegation = Delegation({ + delegate: users.bob.addr, + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Store delegation + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation)); + + // Create Bob's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + vm.prank(users.bob.addr); + vm.expectRevert(); + delegationManager.redeemDelegation(abi.encode("quack"), action); + + // Get final count + uint256 finalValue = aliceDeleGatorCounter.count(); + + // Validate that the count has not increased + assertEq(finalValue, initialValue); + } + + // should not allow call to Implementation's validateUserOp + function test_notAllow_callFromNonProxyAddress_ValidateUserOp() public { + // Create delegation + Delegation memory delegation = Delegation({ + delegate: address(users.bob.addr), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Create Alice's UserOp + bytes memory userOpCallData = abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation); + PackedUserOperation memory userOp = createAndSignUserOp(users.alice, address(users.alice.deleGator), userOpCallData); + bytes32 userOpHash = entryPoint.getUserOpHash(userOp); + + vm.expectRevert(UUPSUpgradeable.UUPSUnauthorizedCallContext.selector); + vm.prank(address(entryPoint)); + hybridDeleGatorImpl.validateUserOp(userOp, userOpHash, 0); + } + + // should not allow call to Implementation's IsValidSignature + function test_notAllow_callFromNonProxyAddress_IsValidSignature() public { + // Create delegation + Delegation memory delegation = Delegation({ + delegate: address(users.bob.addr), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Create Alice's UserOp + bytes memory userOpCallData = abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation); + PackedUserOperation memory userOp = createAndSignUserOp(users.alice, address(users.alice.deleGator), userOpCallData); + bytes32 userOpHash = entryPoint.getUserOpHash(userOp); + + vm.expectRevert(UUPSUpgradeable.UUPSUnauthorizedCallContext.selector); + vm.prank(address(entryPoint)); + hybridDeleGatorImpl.isValidSignature(userOpHash, userOp.signature); + } + + // should allow Bob to redeem a Delegation through a UserOp (onchain) + function test_allow_eoaInvokeOnchainDelegation() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + + // Create delegation + Delegation memory delegation = Delegation({ + delegate: users.bob.addr, + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Store delegation + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation)); + + // Create Bob's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Redeem Bob's delegation + Delegation[] memory delegations = new Delegation[](1); + delegations[0] = delegation; + + vm.prank(users.bob.addr); + delegationManager.redeemDelegation(abi.encode(delegations), action); + + // Get final count + uint256 finalValue = aliceDeleGatorCounter.count(); + + // Validate that the count has increased by 1 + assertEq(finalValue, initialValue + 1); + } + + // should allow Bob's DeleGator to redeem a Delegation through a UserOp (offchain) + function test_allow_deleGatorInvokeOffchainDelegation() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + + // Create delegation + Delegation memory delegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Alice signs delegation + delegation = signDelegation(users.alice, delegation); + + // Create Bob's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Execute Bob's UserOp + Delegation[] memory delegations = new Delegation[](1); + delegations[0] = delegation; + + invokeDelegation_UserOp(users.bob, delegations, action); + + // Get final count + uint256 finalValue = aliceDeleGatorCounter.count(); + + // Validate that the count has increased by 1 + assertEq(finalValue, initialValue + 1); + } + + // should allow Bob to redeem a Delegation through a UserOp (offchain) + function test_allow_eoaInvokeOffchainDelegation() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + + // Create delegation + Delegation memory delegation = Delegation({ + delegate: users.bob.addr, + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Alice signs delegation + delegation = signDelegation(users.alice, delegation); + + // Create Bob's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Redeem Bob's delegation + Delegation[] memory delegations = new Delegation[](1); + delegations[0] = delegation; + + vm.prank(users.bob.addr); + delegationManager.redeemDelegation(abi.encode(delegations), action); + + // Get final count + uint256 finalValue = aliceDeleGatorCounter.count(); + + // Validate that the count has increased by 1 + assertEq(finalValue, initialValue + 1); + } + + // should allow Bob (EOA) to redelegate a Delegation (offchain) + function test_allow_eoaRedelegateOffchainDelegation() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + + // Create Alice's delegation to Bob + Delegation memory delegation1 = Delegation({ + delegate: users.bob.addr, + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + delegation1 = signDelegation(users.alice, delegation1); + bytes32 delegationHash1 = EncoderLib._getDelegationHash(delegation1); + + // Create Bob's Delegation to Carol + Delegation memory delegation2 = Delegation({ + delegate: users.carol.addr, + delegator: users.bob.addr, + authority: delegationHash1, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + bytes32 delegationHash2 = EncoderLib._getDelegationHash(delegation2); + bytes32 domainHash = delegationManager.getDomainHash(); + bytes32 typedDataHash = MessageHashUtils.toTypedDataHash(domainHash, delegationHash2); + delegation2.signature = SigningUtilsLib.signHash_EOA(users.bob.privateKey, typedDataHash); + + // Create Carol's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Redeem Carol's delegation + Delegation[] memory delegations = new Delegation[](2); + delegations[0] = delegation2; + delegations[1] = delegation1; + + vm.prank(users.carol.addr); + delegationManager.redeemDelegation(abi.encode(delegations), action); + + // Get final count + uint256 finalValue = aliceDeleGatorCounter.count(); + + // Validate that the count has increased by 1 + assertEq(finalValue, initialValue + 1); + } + + // should not allow Carol to claim a delegation when EOA signature doesn't match the delegator + function test_notAllow_eoaRedelegateOffchainDelegation() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + + // Create Alice's delegation to Bob + Delegation memory delegation1 = Delegation({ + delegate: users.bob.addr, + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + delegation1 = signDelegation(users.alice, delegation1); + bytes32 delegationHash1 = EncoderLib._getDelegationHash(delegation1); + + // Create Bob's Delegation to Carol (signed by Dave) + Delegation memory delegation2 = Delegation({ + delegate: users.carol.addr, + delegator: users.bob.addr, + authority: delegationHash1, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + bytes32 delegationHash2 = EncoderLib._getDelegationHash(delegation2); + bytes32 domainHash = delegationManager.getDomainHash(); + bytes32 typedDataHash = MessageHashUtils.toTypedDataHash(domainHash, delegationHash2); + delegation2.signature = SigningUtilsLib.signHash_EOA(users.dave.privateKey, typedDataHash); + + // Create Carol's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Redeem Carol's delegation + Delegation[] memory delegations = new Delegation[](2); + delegations[0] = delegation2; + delegations[1] = delegation1; + + vm.prank(users.carol.addr); + vm.expectRevert(abi.encodeWithSelector(IDelegationManager.InvalidSignature.selector)); + delegationManager.redeemDelegation(abi.encode(delegations), action); + + // Get final count + // Validate that the count has increased by 1 + uint256 finalValue = aliceDeleGatorCounter.count(); + assertEq(finalValue, initialValue); + } + + // should allow Bob to redeem a Delegation with Caveats through a UserOp (offchain) + function test_allow_invokeOffchainDelegationWithCaveats() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + + // Create Caveats + Caveat[] memory caveats = new Caveat[](2); + caveats[0] = Caveat({ + args: hex"", + enforcer: address(allowedTargetsEnforcer), + terms: abi.encodePacked(address(aliceDeleGatorCounter)) + }); + caveats[1] = + Caveat({ args: hex"", enforcer: address(allowedMethodsEnforcer), terms: abi.encodePacked(Counter.increment.selector) }); + + // Create delegation + Delegation memory delegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats, + salt: 0, + signature: hex"" + }); + + // Alice signs delegation + delegation = signDelegation(users.alice, delegation); + + // Create Bob's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Execute Bob's UserOp + Delegation[] memory delegations = new Delegation[](1); + delegations[0] = delegation; + + invokeDelegation_UserOp(users.bob, delegations, action); + + // Get final count + uint256 finalValue = aliceDeleGatorCounter.count(); + + // Validate that the count has increased by 1 + assertEq(finalValue, initialValue + 1); + } + + // should allow Carol to redeem a Delegation through a UserOp (onchain & offchain) + function test_allow_invokeCombinedDelegationChain() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + + // Create Alice's delegation to Bob + Delegation memory aliceDelegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Store delegation onchain + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, aliceDelegation)); + + // Create Bob's delegation to Carol + Delegation memory bobDelegation = Delegation({ + delegate: address(users.carol.deleGator), + delegator: address(users.bob.deleGator), + authority: EncoderLib._getDelegationHash(aliceDelegation), + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Sign Bob's delegation + Delegation memory signedBobDelegation = signDelegation(users.bob, bobDelegation); + + // Create Carol's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Execute Carol's UserOp + Delegation[] memory delegations = new Delegation[](2); + delegations[0] = signedBobDelegation; + delegations[1] = aliceDelegation; + + invokeDelegation_UserOp(users.carol, delegations, action); + + // Get final count + uint256 finalValue = aliceDeleGatorCounter.count(); + + // Validate that the count has increased by 1 + assertEq(finalValue, initialValue + 1); + } + + // should allow Carol's DeleGator to claim an onchain redelegation from Bob + function test_allow_chainOfOnchainDelegationToDeleGators() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + + // Create Alice's delegation to Bob + Delegation memory aliceDelegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Store delegation onchain + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, aliceDelegation)); + + // Create Bob's delegation to Carol + Delegation memory bobDelegation = Delegation({ + delegate: address(users.carol.deleGator), + delegator: address(users.bob.deleGator), + authority: EncoderLib._getDelegationHash(aliceDelegation), + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Store delegation onchain + execute_UserOp(users.bob, abi.encodeWithSelector(IDelegationManager.delegate.selector, bobDelegation)); + + // Create Carol's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + Delegation[] memory delegations = new Delegation[](2); + delegations[0] = bobDelegation; + delegations[1] = aliceDelegation; + + invokeDelegation_UserOp(users.carol, delegations, action); + + // Get final count + uint256 finalValue = aliceDeleGatorCounter.count(); + + // Validate that the count has increased by 1 + assertEq(finalValue, initialValue + 1); + } + + // should allow Carol's DeleGator to claim an offchain redelegation from Bob + function test_allow_chainOfOffchainDelegationToDeleGators() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + + // Create delegation + Delegation memory aliceDelegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Alice signs delegation + aliceDelegation = signDelegation(users.alice, aliceDelegation); + + // Create Bob's delegation to Carol + Delegation memory bobDelegation = Delegation({ + delegate: address(users.carol.deleGator), + delegator: address(users.bob.deleGator), + authority: EncoderLib._getDelegationHash(aliceDelegation), + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Sign Bob's delegation + bobDelegation = signDelegation(users.bob, bobDelegation); + + // Create Carol's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Execute Carol's UserOp + Delegation[] memory delegations = new Delegation[](2); + delegations[0] = bobDelegation; + delegations[1] = aliceDelegation; + + invokeDelegation_UserOp(users.carol, delegations, action); + + // Get final count + uint256 finalValue = aliceDeleGatorCounter.count(); + + // Validate that the count has increased by 1 + assertEq(finalValue, initialValue + 1); + } + + // should not allow Carol to redelegate a delegation to Bob + function test_notAllow_chainOfOffchainDelegationToDeleGators() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + + // Create delegation from Alice to Bob + Delegation memory aliceDelegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Alice signs delegation + aliceDelegation = signDelegation(users.alice, aliceDelegation); + + // Create Carol's delegation to Dave + Delegation memory carolDelegation = Delegation({ + delegate: address(users.dave.deleGator), + delegator: address(users.carol.deleGator), + authority: EncoderLib._getDelegationHash(aliceDelegation), + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Sign Carol's delegation + carolDelegation = signDelegation(users.carol, carolDelegation); + + // Create Dave's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Execute Dave's UserOp + Delegation[] memory delegations = new Delegation[](2); + delegations[0] = carolDelegation; + delegations[1] = aliceDelegation; + + PackedUserOperation memory userOp = createAndSignUserOp( + users.dave, + address(users.dave.deleGator), + abi.encodeWithSelector(IDeleGatorCoreFull.redeemDelegation.selector, abi.encode(delegations), action) + ); + + PackedUserOperation[] memory userOps = new PackedUserOperation[](1); + userOps[0] = userOp; + vm.prank(bundler); + + bytes32 userOpHash = entryPoint.getUserOpHash(userOp); + + // Expect it to emit a reverted event + vm.expectEmit(true, true, false, true, address(entryPoint)); + emit UserOperationRevertReason( + userOpHash, address(users.dave.deleGator), 0, abi.encodeWithSelector(IDelegationManager.InvalidDelegate.selector) + ); + + entryPoint.handleOps(userOps, bundler); + + // Get final count + uint256 finalValue = aliceDeleGatorCounter.count(); + + // Validate that the count has not increased + assertEq(finalValue, initialValue); + } + + // should shortcircuit Carol's DeleGator's delegation redemption to increase Alice's DeleGator's Counter + function test_executesFirstRootAuthorityFound() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + + // Create delegation + Delegation memory aliceDelegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Alice signs delegation + aliceDelegation = signDelegation(users.alice, aliceDelegation); + + // Create Bob's delegation to Carol + Delegation memory bobDelegation = Delegation({ + delegate: address(users.carol.deleGator), + delegator: address(users.bob.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Sign Bob's delegation + bobDelegation = signDelegation(users.bob, bobDelegation); + + // Create Carol's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Execute Carol's UserOp + Delegation[] memory delegations = new Delegation[](2); + delegations[0] = bobDelegation; + delegations[1] = aliceDelegation; + + invokeDelegation_UserOp(users.carol, delegations, action); + + // Get final count + uint256 finalValue = aliceDeleGatorCounter.count(); + + // Validate that the count has not increased by 1 + assertEq(finalValue, initialValue); + } + + // should allow Carol to claim an onchain redelegation from Bob + function test_allow_chainOfOnchainDelegationToEoa() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + + // Create Alice's delegation to Bob + Delegation memory aliceDelegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Store delegation onchain + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, aliceDelegation)); + + // Create Bob's delegation to Carol + Delegation memory bobDelegation = Delegation({ + delegate: users.carol.addr, + delegator: address(users.bob.deleGator), + authority: EncoderLib._getDelegationHash(aliceDelegation), + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Store delegation onchain + execute_UserOp(users.bob, abi.encodeWithSelector(IDelegationManager.delegate.selector, bobDelegation)); + + // Create Carol's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + Delegation[] memory delegations = new Delegation[](2); + delegations[0] = bobDelegation; + delegations[1] = aliceDelegation; + + vm.prank(users.carol.addr); + delegationManager.redeemDelegation(abi.encode(delegations), action); + + // Get final count + uint256 finalValue = aliceDeleGatorCounter.count(); + + // Validate that the count has increased by 1 + assertEq(finalValue, initialValue + 1); + } + + // should allow Carol to claim an offchain redelegation from Bob + function test_allow_chainOfOffchainDelegationToEoa() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + + // Create delegation + Delegation memory aliceDelegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Alice signs delegation + aliceDelegation = signDelegation(users.alice, aliceDelegation); + + // Create Bob's delegation to Carol + Delegation memory bobDelegation = Delegation({ + delegate: users.carol.addr, + delegator: address(users.bob.deleGator), + authority: EncoderLib._getDelegationHash(aliceDelegation), + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Sign Bob's delegation + bobDelegation = signDelegation(users.bob, bobDelegation); + + // Create Carol's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Execute Carol's UserOp + Delegation[] memory delegations = new Delegation[](2); + delegations[0] = bobDelegation; + delegations[1] = aliceDelegation; + + vm.prank(users.carol.addr); + delegationManager.redeemDelegation(abi.encode(delegations), action); + + // Get final count + uint256 finalValue = aliceDeleGatorCounter.count(); + + // Validate that the count has increased by 1 + assertEq(finalValue, initialValue + 1); + } + + // should allow Alice to execute multiple actions in a single UserOp + function test_allow_multiAction_UserOp() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + + // Create actions + Action[] memory actions = new Action[](2); + actions[0] = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + actions[1] = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Execute Actions + executeBatch_UserOp(users.alice, actions); + + // Get final count + uint256 finalValue = aliceDeleGatorCounter.count(); + + // Validate that the delegations were stored + assertEq(finalValue, initialValue + 2); + } + + // should not allow to execute empty Actions + function test_notAllow_emptyAction_UserOp() public { + //Create Actions + Action[] memory actions = new Action[](0); + + bytes memory userOpCallData_ = abi.encodeWithSelector(IDeleGatorCoreFull.executeBatch.selector, actions); + PackedUserOperation memory userOp_ = createUserOp(address(users.alice.deleGator), userOpCallData_); + bytes32 userOpHash_ = entryPoint.getUserOpHash(userOp_); + userOp_.signature = signHash(users.alice, userOpHash_.toEthSignedMessageHash()); + + PackedUserOperation[] memory userOps_ = new PackedUserOperation[](1); + userOps_[0] = userOp_; + vm.prank(bundler); + + vm.expectEmit(true, true, false, true, address(entryPoint)); + emit UserOperationRevertReason( + userOpHash_, address(users.alice.deleGator), 0, abi.encodeWithSelector(ExecutionLib.InvalidActionsLength.selector) + ); + entryPoint.handleOps(userOps_, payable(bundler)); + } + + // should allow Bob to execute multiple actions that redeem delegations in a single UserOp + function test_allow_multiActionDelegationClaim_Onchain_UserOp() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + + // Create Alice's delegation to Bob + Delegation memory delegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Store delegation onchain + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation)); + + // Create onchain action Action + Action memory incrementAction = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Invoke delegation calldata + Delegation[] memory delegations = new Delegation[](1); + delegations[0] = delegation; + + bytes memory invokeDelegationCalldata = + abi.encodeWithSelector(IDeleGatorCoreFull.redeemDelegation.selector, abi.encode(delegations), incrementAction); + + // Create invoke delegation Actions + Action[] memory redemptionActions = new Action[](2); + redemptionActions[0] = Action({ to: address(users.bob.deleGator), value: 0, data: invokeDelegationCalldata }); + redemptionActions[1] = Action({ to: address(users.bob.deleGator), value: 0, data: invokeDelegationCalldata }); + + // Execute delegations + executeBatch_UserOp(users.bob, redemptionActions); + + // Get final count + uint256 finalValue = aliceDeleGatorCounter.count(); + + // Validate that the counts were increased + assertEq(finalValue, initialValue + 2); + } + + // should allow Bob to execute multiple actions that redeem delegations in a single UserOp + function test_allow_multiActionDelegationClaim_Offchain_UserOp() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + + // Create Alice's delegation to Bob + Delegation memory delegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Sign delegation + delegation = signDelegation(users.alice, delegation); + + // Create onchain action Action + Action memory incrementAction = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Invoke delegation calldata + Delegation[] memory delegations = new Delegation[](1); + delegations[0] = delegation; + + bytes memory invokeDelegationCalldata = + abi.encodeWithSelector(IDeleGatorCoreFull.redeemDelegation.selector, abi.encode(delegations), incrementAction); + + // Create invoke delegation Actions + Action[] memory redemptionActions = new Action[](2); + redemptionActions[0] = Action({ to: address(users.bob.deleGator), value: 0, data: invokeDelegationCalldata }); + redemptionActions[1] = Action({ to: address(users.bob.deleGator), value: 0, data: invokeDelegationCalldata }); + + // Execute delegations + executeBatch_UserOp(users.bob, redemptionActions); + + // Get final count + uint256 finalValue = aliceDeleGatorCounter.count(); + + // Validate that the counts were increased + assertEq(finalValue, initialValue + 2); + } + + // should allow Alice to execute a combination of actions through a single UserOp + function test_allow_multiActionCombination_UserOp() public { + // Get DeleGator's Counter's initial count + uint256 initialValueAlice = aliceDeleGatorCounter.count(); + uint256 initialValueBob = bobDeleGatorCounter.count(); + + // Create Alice's delegation to Bob + Delegation memory delegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Sign delegation + delegation = signDelegation(users.alice, delegation); + + // Invoke delegation calldata + Delegation[] memory delegations = new Delegation[](1); + delegations[0] = delegation; + + bytes memory invokeDelegationCalldata = abi.encodeWithSelector( + IDeleGatorCoreFull.redeemDelegation.selector, + abi.encode(delegations), + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }) + ); + + // Create invoke delegation Actions + Action[] memory redemptionActions = new Action[](2); + redemptionActions[0] = Action({ to: address(users.bob.deleGator), value: 0, data: invokeDelegationCalldata }); + redemptionActions[1] = + Action({ to: address(bobDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Execute delegations + executeBatch_UserOp(users.bob, redemptionActions); + + // Get final count + uint256 finalValueAlice = aliceDeleGatorCounter.count(); + uint256 finalValueBob = bobDeleGatorCounter.count(); + + // Validate that the counts were increased + assertEq(finalValueAlice, initialValueAlice + 1); + assertEq(finalValueBob, initialValueBob + 1); + } + + ////////////////////////////// Invalid cases ////////////////////////////// + + // should not allow a second Action to execute if the first Action fails + function test_notAllow_multiActionUserOp() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValueAlice = aliceDeleGatorCounter.count(); + uint256 initialValueBob = bobDeleGatorCounter.count(); + + // Create actions, incorrectly incrementing Bob's Counter first + Action[] memory actions = new Action[](2); + actions[0] = + Action({ to: address(bobDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + actions[1] = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Execute actions + executeBatch_UserOp(users.alice, actions); + + // Get final count + uint256 finalValueAlice = aliceDeleGatorCounter.count(); + uint256 finalValueBob = bobDeleGatorCounter.count(); + + // Validate that the counts were not increased + assertEq(finalValueAlice, initialValueAlice); + assertEq(finalValueBob, initialValueBob); + } + + // should revert without reason and catch it + function test_executionRevertsWithoutReason() public { + // Invalid action, sending ETH to a contract that can't receive it. + Action memory action_ = Action({ to: address(aliceDeleGatorCounter), value: 1, data: hex"" }); + + vm.prank(address(delegationManager)); + + vm.expectRevert(abi.encodeWithSelector(ExecutionLib.FailedExecutionWithoutReason.selector)); + + users.alice.deleGator.executeDelegatedAction(action_); + } + + // should NOT allow Carol to redeem a delegation to Bob through a UserOp (onchain) + function test_notAllow_invokeOnchainDelegationToAnotherUser() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + + // Create Alice's delegation to Bob + Delegation memory delegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Store delegation onchain + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation)); + + // Create Carol's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Execute Carol's UserOp + Delegation[] memory delegations = new Delegation[](1); + delegations[0] = delegation; + + invokeDelegation_UserOp(users.carol, delegations, action); + + // Get final count + uint256 finalValue = aliceDeleGatorCounter.count(); + + // Validate that the count has NOT increased by 1 + assertEq(finalValue, initialValue); + } + + // should NOT allow Carol to redeem a delegation to Bob through a UserOp (offchain) + function test_notAllow_invokeOffchainDelegationToAnotherUser() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + + // Create Alice's delegation to Bob + Delegation memory delegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Sign Alice's delegation to Bob + delegation = signDelegation(users.alice, delegation); + + // Create Carol's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Execute Carol's UserOp + Delegation[] memory delegations = new Delegation[](1); + delegations[0] = delegation; + + invokeDelegation_UserOp(users.carol, delegations, action); + + // Get final count + uint256 finalValue = aliceDeleGatorCounter.count(); + + // Validate that the count has NOT increased by 1 + assertEq(finalValue, initialValue); + } + + // should NOT allow a UserOp to be submitted to an invalid EntryPoint + function test_notAllow_invalidEntryPoint() public { + // Create delegation + Delegation memory delegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Create a new EntryPoint + EntryPoint newEntryPoint = new EntryPoint(); + + // Create Alice's UserOp (with valid EntryPoint) + bytes memory userOpCallData = abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation); + PackedUserOperation memory userOp = createAndSignUserOp(users.alice, address(users.alice.deleGator), userOpCallData); + + PackedUserOperation[] memory userOps = new PackedUserOperation[](1); + userOps[0] = userOp; + + // Submit the UserOp through the Bundler + vm.prank(bundler); + + vm.expectRevert( + abi.encodeWithSelector( + IEntryPoint.FailedOpWithRevert.selector, + 0, + "AA23 reverted", + abi.encodeWithSelector(IDeleGatorCoreFull.NotEntryPoint.selector) + ) + ); + newEntryPoint.handleOps(userOps, bundler); + + // Create Alice's UserOp (with invalid EntryPoint) + userOp = createUserOp(address(users.alice.deleGator), userOpCallData); + userOp = signUserOp(users.alice, userOp, newEntryPoint); + + // Submit the UserOp through the Bundler + vm.prank(bundler); + + vm.expectRevert( + abi.encodeWithSelector( + IEntryPoint.FailedOpWithRevert.selector, + 0, + "AA23 reverted", + abi.encodeWithSelector(IDeleGatorCoreFull.NotEntryPoint.selector) + ) + ); + newEntryPoint.handleOps(userOps, bundler); + } + + // should NOT allow a UserOp with an invalid signature + function test_notAllow_invalidUserOpSignature() public { + // Create action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Create Alice's UserOp + bytes memory userOpCallData = abi.encodeWithSelector(IDeleGatorCoreFull.execute.selector, action); + PackedUserOperation memory userOp = createUserOp(address(users.alice.deleGator), userOpCallData, hex""); + + // Bob signs UserOp + userOp = signUserOp(users.bob, userOp); + + // Submit the UserOp through the Bundler + // the signature of the user operation.) + // (AA24 signature error = The validateUserOp function of the smart account rejected + vm.expectRevert(abi.encodeWithSelector(IEntryPoint.FailedOp.selector, 0, "AA24 signature error")); + submitUserOp_Bundler(userOp); + } + + // should NOT allow a UserOp with a reused nonce + function test_notAllow_nonceReuse() public { + // Create action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Create and Sign Alice's UserOp + PackedUserOperation memory userOp = createAndSignUserOp( + users.alice, address(users.alice.deleGator), abi.encodeWithSelector(IDeleGatorCoreFull.execute.selector, action) + ); + + // Submit the UserOp through the Bundler + submitUserOp_Bundler(userOp); + + // Submit the UserOp through the Bundler again + vm.expectRevert(abi.encodeWithSelector(IEntryPoint.FailedOp.selector, 0, "AA25 invalid account nonce")); + submitUserOp_Bundler(userOp); + } + + ////////////////////////////// EVENTS Emission ////////////////////////////// + + // should not allow an invalid delegator to delegate + function test_event_storeDelegation() public { + Delegation memory delegation = Delegation({ + delegate: address(users.bob.addr), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + bytes32 delegationHash = EncoderLib._getDelegationHash(delegation); + + PackedUserOperation memory userOp = createAndSignUserOp( + users.alice, address(users.alice.deleGator), abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation) + ); + + vm.expectEmit(true, false, false, true); + emit Delegated(delegationHash, address(users.alice.deleGator), address(users.bob.addr), delegation); + + submitUserOp_Bundler(userOp); + } + + function test_event_Deposited() public { + Action memory action = Action({ + to: address(users.alice.deleGator), + value: 1 ether, + data: abi.encodeWithSelector(IDeleGatorCoreFull.addDeposit.selector) + }); + + PackedUserOperation memory userOp = createAndSignUserOp( + users.alice, address(users.alice.deleGator), abi.encodeWithSelector(IDeleGatorCoreFull.execute.selector, action) + ); + + vm.expectEmit(true, false, false, true); + emit Deposited(address(users.alice.deleGator), 1 ether); + + submitUserOp_Bundler(userOp); + } + + function test_allow_withdrawDeposit() public { + Action memory action = Action({ + to: address(users.alice.deleGator), + value: 1 ether, + data: abi.encodeWithSelector(IDeleGatorCoreFull.addDeposit.selector) + }); + + PackedUserOperation memory userOp = createAndSignUserOp( + users.alice, address(users.alice.deleGator), abi.encodeWithSelector(IDeleGatorCoreFull.execute.selector, action) + ); + + submitUserOp_Bundler(userOp); + + action = Action({ + to: address(users.alice.deleGator), + value: 0 ether, + data: abi.encodeWithSelector(IDeleGatorCoreFull.withdrawDeposit.selector, address(users.alice.addr), 0.5 ether) + }); + + userOp = createAndSignUserOp( + users.alice, address(users.alice.deleGator), abi.encodeWithSelector(IDeleGatorCoreFull.execute.selector, action) + ); + + vm.expectEmit(true, false, false, true); + emit Withdrawn(address(users.alice.deleGator), address(users.alice.addr), 0.5 ether); + + submitUserOp_Bundler(userOp); + } + + // test Error + + // Should revert if Alice tries to delegate carol's delegation + function test_error_InvalidDelegator() public { + // carol create delegation for bob + Delegation memory delegation = Delegation({ + delegate: address(users.bob.addr), + delegator: address(users.carol.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // bob's action + PackedUserOperation memory userOp = createAndSignUserOp( + users.alice, address(users.alice.deleGator), abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation) + ); + + PackedUserOperation[] memory userOps = new PackedUserOperation[](1); + userOps[0] = userOp; + vm.prank(bundler); + + bytes32 userOpHash = entryPoint.getUserOpHash(userOp); + vm.expectEmit(true, true, false, true, address(entryPoint)); + emit UserOperationRevertReason( + userOpHash, address(users.alice.deleGator), 0, abi.encodeWithSelector(IDelegationManager.InvalidDelegator.selector) + ); + + entryPoint.handleOps(userOps, bundler); + } + + // Should revert if there is no valid root authority + function test_error_InvalidRootAuthority() public { + // Get Alice's DeleGator's Counter's initial count + uint256 initialValue = aliceDeleGatorCounter.count(); + + // Create delegation + Delegation memory delegation = Delegation({ + delegate: users.bob.addr, + delegator: address(users.alice.deleGator), + authority: 0x0, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Store delegation + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation)); + + // Create Bob's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Redeem Bob's delegation + Delegation[] memory delegations = new Delegation[](1); + delegations[0] = delegation; + + vm.prank(users.bob.addr); + vm.expectRevert(); + delegationManager.redeemDelegation(abi.encode(delegations), action); + + // Get final count + uint256 finalValue = aliceDeleGatorCounter.count(); + + // Validate that the count has not increased by 1 + assertEq(finalValue, initialValue); + } + + // Should revert if user tries to redeem a delegation without providing delegations + function test_error_NoDelegationsProvided() public { + // Create delegation + Delegation memory delegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Store delegation + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation)); + + // Create Bob's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + Delegation[] memory delegations = new Delegation[](0); + + // creating UserOpCallData + bytes memory userOpCallData = + abi.encodeWithSelector(IDeleGatorCoreFull.redeemDelegation.selector, abi.encode(delegations), action); + + PackedUserOperation memory userOp = createAndSignUserOp(users.bob, address(users.bob.deleGator), userOpCallData); + + PackedUserOperation[] memory userOps = new PackedUserOperation[](1); + userOps[0] = userOp; + + // prank from bundler + vm.prank(bundler); + + // get User Operation hash + bytes32 userOpHash = entryPoint.getUserOpHash(userOp); + + vm.expectEmit(true, true, false, true, address(entryPoint)); + // expected error + emit UserOperationRevertReason( + userOpHash, address(users.bob.deleGator), 0, abi.encodeWithSelector(IDelegationManager.NoDelegationsProvided.selector) + ); + entryPoint.handleOps(userOps, bundler); + } + + // Should revert if the caller is not the delegate + function test_error_InvalidDelegate() public { + // Create delegation + Delegation memory delegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Store delegation + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation)); + + // Create Bob's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + Delegation[] memory delegations = new Delegation[](1); + delegations[0] = delegation; + + // create user operation calldata for invokeDelegation + bytes memory userOpCallData = + abi.encodeWithSelector(IDeleGatorCoreFull.redeemDelegation.selector, abi.encode(delegations), action); + + PackedUserOperation memory userOp = createAndSignUserOp(users.carol, address(users.carol.deleGator), userOpCallData); + + PackedUserOperation[] memory userOps = new PackedUserOperation[](1); + userOps[0] = userOp; + + // prank from bundler + vm.prank(bundler); + + // get UserOperation hash + bytes32 userOpHash = entryPoint.getUserOpHash(userOp); + + vm.expectEmit(true, true, false, true, address(entryPoint)); + // expect an event containing InvalidDelegation error + emit UserOperationRevertReason( + userOpHash, address(users.carol.deleGator), 0, abi.encodeWithSelector(IDelegationManager.InvalidDelegate.selector) + ); + + entryPoint.handleOps(userOps, bundler); + } + + // Should revert if a UserOp signature is invalid + function test_error_InvalidSignature() public { + // Create delegation + Delegation memory delegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Sign Alice's delegation with Carol's private key + delegation = signDelegation(users.carol, delegation); + + // Create Bob's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // signing the userOp from bob + uint256[] memory signers_ = new uint256[](1); + signers_[0] = users.bob.privateKey; + + Delegation[] memory delegations = new Delegation[](1); + delegations[0] = delegation; + + bytes memory userOpCallData = + abi.encodeWithSelector(IDeleGatorCoreFull.redeemDelegation.selector, abi.encode(delegations), action); + + PackedUserOperation memory userOp = createAndSignUserOp(users.bob, address(users.bob.deleGator), userOpCallData); + + PackedUserOperation[] memory userOps = new PackedUserOperation[](1); + userOps[0] = userOp; + + // prank from bundler + vm.prank(bundler); + + // get User Operation hash + bytes32 userOpHash = entryPoint.getUserOpHash(userOp); + + vm.expectEmit(true, true, false, true, address(entryPoint)); + // expect an event containing InvalidSignature error + emit UserOperationRevertReason( + userOpHash, address(users.bob.deleGator), 0, abi.encodeWithSelector(IDelegationManager.InvalidSignature.selector) + ); + + entryPoint.handleOps(userOps, bundler); + } + + // Should revert if the delegation signature is from an invalid signer + function test_error_InvalidSigner() public { + // Create delegation + Delegation memory delegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Carol signs the delegation using Alice's domain hash + delegation = signDelegation(users.carol, delegation); + + // Create Bob's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + Delegation[] memory delegations = new Delegation[](1); + delegations[0] = delegation; + + // create user operation calldata for invokeDelegation + bytes memory userOpCallData = + abi.encodeWithSelector(IDeleGatorCoreFull.redeemDelegation.selector, abi.encode(delegations), action); + + // create and sign user operation with Bob + PackedUserOperation memory userOp = createAndSignUserOp(users.bob, address(users.bob.deleGator), userOpCallData); + + PackedUserOperation[] memory userOps = new PackedUserOperation[](1); + userOps[0] = userOp; + vm.prank(bundler); + + // get User Operation hash + bytes32 userOpHash = entryPoint.getUserOpHash(userOp); + + vm.expectEmit(true, true, false, true, address(entryPoint)); + // expect an event containing InvalidDelegationSignature error + emit UserOperationRevertReason( + userOpHash, address(users.bob.deleGator), 0, abi.encodeWithSelector(IDelegationManager.InvalidSignature.selector) + ); + + entryPoint.handleOps(userOps, bundler); + } + + // Should revert if executeDelegatedAction is called from an address other than the DelegationManager + function test_notAllow_notDelegationManager() public { + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + vm.expectRevert(abi.encodeWithSelector(IDeleGatorCoreFull.NotDelegationManager.selector)); + users.alice.deleGator.executeDelegatedAction(action); + } + + // Should revert if execute is called from an address other than the EntryPoint + function test_notAllow_notEntryPoint() public { + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + vm.expectRevert(abi.encodeWithSelector(IDeleGatorCoreFull.NotEntryPoint.selector)); + users.alice.deleGator.execute(action); + } + + // Should revert if the delegation chain contains invalid authority + function test_error_InvalidAuthority() public { + // Create Alice's delegation to Bob + Delegation memory aliceDelegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Store delegation onchain + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, aliceDelegation)); + + //create invalid delegation + Delegation memory invalidDelegation = Delegation({ + delegate: address(users.carol.addr), + delegator: address(users.bob.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Create Bob's delegation to Carol + Delegation memory bobDelegation = Delegation({ + delegate: address(users.carol.deleGator), + delegator: address(users.bob.deleGator), + authority: EncoderLib._getDelegationHash(invalidDelegation), + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Store delegation onchain + execute_UserOp(users.bob, abi.encodeWithSelector(IDelegationManager.delegate.selector, bobDelegation)); + + // Create Carol's action + Action memory action = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + Delegation[] memory delegations = new Delegation[](2); + delegations[0] = bobDelegation; + delegations[1] = aliceDelegation; + + // create user operation calldata for invokeDelegation + bytes memory userOpCallData = + abi.encodeWithSelector(IDeleGatorCoreFull.redeemDelegation.selector, abi.encode(delegations), action); + + PackedUserOperation memory userOp = createAndSignUserOp(users.carol, address(users.carol.deleGator), userOpCallData); + + PackedUserOperation[] memory userOps = new PackedUserOperation[](1); + userOps[0] = userOp; + vm.prank(bundler); + + bytes32 userOpHash = entryPoint.getUserOpHash(userOp); + + vm.expectEmit(address(entryPoint)); + // expect an event containing InvalidAuthority error + emit UserOperationRevertReason( + userOpHash, address(users.carol.deleGator), 0, abi.encodeWithSelector(IDelegationManager.InvalidAuthority.selector) + ); + entryPoint.handleOps(userOps, bundler); + } +} + +contract HybridDeleGator_TestSuite_P256_Test is DeleGatorTestSuite { + constructor() { + IMPLEMENTATION = Implementation.Hybrid; + SIGNATURE_TYPE = SignatureType.RawP256; + } +} + +contract HybridDeleGator_TestSuite_EOA_Test is DeleGatorTestSuite { + constructor() { + IMPLEMENTATION = Implementation.Hybrid; + SIGNATURE_TYPE = SignatureType.EOA; + } +} + +contract MultiSig_TestSuite_Test is DeleGatorTestSuite { + constructor() { + IMPLEMENTATION = Implementation.MultiSig; + SIGNATURE_TYPE = SignatureType.MultiSig; + } +} diff --git a/test/DelegationManagerTest.t.sol b/test/DelegationManagerTest.t.sol new file mode 100644 index 0000000..ed7776c --- /dev/null +++ b/test/DelegationManagerTest.t.sol @@ -0,0 +1,303 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { MessageHashUtils } from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; +import { Pausable } from "@openzeppelin/contracts/utils/Pausable.sol"; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { Ownable2Step } from "@openzeppelin/contracts/access/Ownable2Step.sol"; +import { ShortStrings, ShortString } from "@openzeppelin/contracts/utils/ShortStrings.sol"; + +import { BaseTest } from "./utils/BaseTest.t.sol"; +import { Delegation, Delegation, Caveat, Action } from "../src/utils/Types.sol"; +import { Implementation, SignatureType } from "./utils/Types.t.sol"; +import { EncoderLib } from "../src/libraries/EncoderLib.sol"; +import { DelegationManager } from "../src/DelegationManager.sol"; +import { Invalid1271Returns, Invalid1271Reverts } from "./utils/Invalid1271.t.sol"; +import { IDelegationManager } from "../src/interfaces/IDelegationManager.sol"; +import { EIP712_DOMAIN_TYPEHASH } from "../src/utils/Typehashes.sol"; + +contract DelegationManagerTest is BaseTest { + using ShortStrings for *; + + string private _nameFallback; + string private _versionFallback; + + constructor() { + IMPLEMENTATION = Implementation.Hybrid; + SIGNATURE_TYPE = SignatureType.RawP256; + } + + ////////////////////////////// Events ////////////////////////////// + + event SetDomain( + bytes32 indexed domainHash, string contractName, string domainVersion, uint256 chainId, address indexed contractAddress + ); + event Paused(address account); + event Unpaused(address account); + event TransferredOwnership(); + + ////////////////////////////// External Methods ////////////////////////////// + + // Should allow reading contract name + function test_allow_contractNameReads() public { + string memory contractName_ = delegationManager.NAME(); + assertEq("DelegationManager", contractName_); + } + + // Should allow reading contract version + function test_allow_contractVersionReads() public { + string memory contractVersion_ = delegationManager.VERSION(); + assertEq("1.0.0", contractVersion_); + } + + // Should allow reading contract version + function test_allow_domainVersionReads() public { + string memory domainVersion_ = delegationManager.DOMAIN_VERSION(); + assertEq("1", domainVersion_); + } + + function test_allow_rootAuthorityReads() public { + bytes32 rootAuthority = delegationManager.ROOT_AUTHORITY(); + bytes32 expectedRootAuthority = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; + assertEq(expectedRootAuthority, rootAuthority); + } + + function test_allow_anyDelegateReads() public { + address anyDelegateAddress = delegationManager.ANY_DELEGATE(); + assertEq(address(0xa11), anyDelegateAddress); + } + + // Should allow reading domain hash + function test_allow_domainHashReads() public { + bytes32 domainHash_ = delegationManager.getDomainHash(); + bytes32 expectedDomainHash_ = keccak256( + abi.encode( + EIP712_DOMAIN_TYPEHASH, + keccak256(bytes(delegationManager.NAME())), + keccak256(bytes(delegationManager.DOMAIN_VERSION())), + block.chainid, + address(delegationManager) + ) + ); + assertEq(expectedDomainHash_, domainHash_); + } + + // Should allow reading domain hash when chain id changes + function test_allow_domainHashReadsWhenChainIdChanges() public { + uint256 newChainId_ = 123456789; + // Update the chainId + vm.chainId(newChainId_); + + bytes32 domainHash_ = delegationManager.getDomainHash(); + bytes32 expectedDomainHash_ = keccak256( + abi.encode( + EIP712_DOMAIN_TYPEHASH, + keccak256(bytes(delegationManager.NAME())), + keccak256(bytes(delegationManager.DOMAIN_VERSION())), + newChainId_, + address(delegationManager) + ) + ); + assertEq(expectedDomainHash_, domainHash_); + } + + // Should not allow signatures for one DelegationManager to work on another DelegationManager + function test_notAllow_crossDelegationManagerReplays() public { + // Create a new delegation manager to test against + DelegationManager delegationManager2_ = new DelegationManager(bundler); + + Delegation memory delegation_ = Delegation({ + delegate: address(users.bob.addr), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Get EIP712 signature of a Delegation using the domain separator of the original DelegationManager + bytes32 delegationHash_ = delegationManager.getDelegationHash(delegation_); + delegation_ = signDelegation(users.alice, delegation_); + + // Get the typed data hash from the new delegation manager + // The DelegationManager will build this typed data hash when checking signature validity + bytes32 typedDataHash_ = MessageHashUtils.toTypedDataHash(delegationManager2_.getDomainHash(), delegationHash_); + + // Validate the signature (SIG_VALIDATION_FAILED = 0xffffffff) + bytes4 validationData_ = users.alice.deleGator.isValidSignature(typedDataHash_, delegation_.signature); + assertEq(validationData_, bytes4(0xffffffff)); + } + + // should expose a method for retrieval of a delegations hash + function test_allow_getDelegationHash() public { + Delegation memory delegation_ = Delegation({ + delegate: address(users.bob.addr), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + bytes32 hash_ = delegationManager.getDelegationHash(delegation_); + assertEq(hash_, EncoderLib._getDelegationHash(delegation_)); + } + + function test_notAllow_invalidSignatureReverts() public { + Invalid1271Reverts invalidAccount_ = new Invalid1271Reverts(); + + Delegation memory delegation_ = Delegation({ + delegate: address(users.bob.addr), + delegator: address(invalidAccount_), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: new bytes(10) + }); + + // Validate the signature + vm.expectRevert(bytes("Error")); + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation_; + + vm.prank(address(users.bob.addr)); + delegationManager.redeemDelegation(abi.encode(delegations_), Action({ to: address(0), data: new bytes(0), value: 0 })); + } + + function test_notAllow_invalidSignatureReturns() public { + Invalid1271Returns invalidAccount_ = new Invalid1271Returns(); + + Delegation memory delegation_ = Delegation({ + delegate: address(users.bob.addr), + delegator: address(invalidAccount_), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: new bytes(10) + }); + + // Validate the signature + vm.expectRevert(abi.encodeWithSelector(IDelegationManager.InvalidSignature.selector)); + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation_; + + vm.prank(address(users.bob.addr)); + delegationManager.redeemDelegation(abi.encode(delegations_), Action({ to: address(0), data: new bytes(0), value: 0 })); + } + + /////////////////////////////// Ownership ////////////////////////////// + + // Should allow to transfer and accept the ownership + function test_ownership_transferAndAcceptOwnership() public { + address currentOwner_ = delegationManager.owner(); + address newOwner_ = users.alice.addr; + vm.prank(currentOwner_); + + vm.expectEmit(true, true, true, true, address(delegationManager)); + emit Ownable2Step.OwnershipTransferStarted(currentOwner_, newOwner_); + delegationManager.transferOwnership(newOwner_); + + assertEq(delegationManager.pendingOwner(), newOwner_); + + vm.prank(newOwner_); + vm.expectEmit(true, true, true, true, address(delegationManager)); + emit Ownable.OwnershipTransferred(currentOwner_, newOwner_); + delegationManager.acceptOwnership(); + + assertEq(delegationManager.owner(), newOwner_); + } + + /////////////////////////////// Pausability ////////////////////////////// + + // Should allow reading initial pause state + function test_pausability_validateInitialPauseState() public { + DelegationManager delegationManager_ = new DelegationManager(bundler); + assertFalse(delegationManager_.paused()); + } + + // Should allow owner to pause + function test_pausability_allowsOwnerToPause() public { + assertFalse(delegationManager.paused()); + + vm.startPrank(delegationManager.owner()); + vm.expectEmit(true, true, true, true, address(delegationManager)); + emit Paused(delegationManager.owner()); + delegationManager.pause(); + + assertTrue(delegationManager.paused()); + } + + // Should allow owner to unpause + function test_pausability_allowsOwnerToUnpause() public { + // Pausing + vm.startPrank(delegationManager.owner()); + delegationManager.pause(); + assertTrue(delegationManager.paused()); + + // Unpausing + vm.expectEmit(true, true, true, true, address(delegationManager)); + emit Unpaused(delegationManager.owner()); + delegationManager.unpause(); + assertFalse(delegationManager.paused()); + } + + // Should not allow not owner to unpause + function test_pausability_failsToPauseIfNotOwner() public { + assertFalse(delegationManager.paused()); + + vm.prank(users.bob.addr); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, users.bob.addr)); + delegationManager.pause(); + + assertFalse(delegationManager.paused()); + } + + // Should not allow not owner to unpause + function test_pausability_failsToUnpauseIfNotOwner() public { + // Pausing + vm.prank(delegationManager.owner()); + delegationManager.pause(); + assertTrue(delegationManager.paused()); + + // Unpausing + vm.prank(users.bob.addr); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, users.bob.addr)); + delegationManager.pause(); + assertTrue(delegationManager.paused()); + } + + // Should allow owner to pause redemptions + function test_pausability_allowsOwnerToPauseRedemptions() public { + assertFalse(delegationManager.paused()); + + vm.startPrank(delegationManager.owner()); + delegationManager.pause(); + + Action memory action_; + + vm.expectRevert(Pausable.EnforcedPause.selector); + delegationManager.redeemDelegation(hex"", action_); + } + + // Should fail to pause when the pause is active + function test_pausability_failsToPauseWhenActivePause() public { + // First pause + vm.startPrank(delegationManager.owner()); + delegationManager.pause(); + assertTrue(delegationManager.paused()); + + // Second pause + vm.expectRevert(Pausable.EnforcedPause.selector); + delegationManager.pause(); + } + + // Should fail to unpause when the pause is active + function test_pausability_failsToPauseWhenActiveUnpause() public { + // It is unpaused + assertFalse(delegationManager.paused()); + + // Trying to unpause again + vm.startPrank(delegationManager.owner()); + vm.expectRevert(Pausable.ExpectedPause.selector); + delegationManager.unpause(); + } +} diff --git a/test/HybridDeleGatorTest.t.sol b/test/HybridDeleGatorTest.t.sol new file mode 100644 index 0000000..8d767a5 --- /dev/null +++ b/test/HybridDeleGatorTest.t.sol @@ -0,0 +1,975 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { FCL_ecdsa_utils } from "@freshCryptoLib/FCL_ecdsa_utils.sol"; +import { MessageHashUtils } from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; +import { BytesLib } from "@bytes-utils/BytesLib.sol"; + +import { SigningUtilsLib } from "./utils/SigningUtilsLib.t.sol"; +import { StorageUtilsLib } from "./utils/StorageUtilsLib.t.sol"; +import { Implementation, SignatureType } from "./utils/Types.t.sol"; +import { Action, PackedUserOperation, Caveat, Delegation, Delegation } from "../src/utils/Types.sol"; +import { BaseTest } from "./utils/BaseTest.t.sol"; +import { HybridDeleGator } from "../src/HybridDeleGator.sol"; +import { IDeleGatorCoreFull } from "../src/interfaces/IDeleGatorCoreFull.sol"; +import { IDeleGatorCore } from "../src/interfaces/IDeleGatorCore.sol"; +import { IERC173 } from "../src/interfaces/IERC173.sol"; +import { IDelegationManager } from "../src/interfaces/IDelegationManager.sol"; +import { EncoderLib } from "../src/libraries/EncoderLib.sol"; + +contract HybridDeleGator_Test is BaseTest { + using MessageHashUtils for bytes32; + + ////////////////////// Configure BaseTest ////////////////////// + + constructor() { + IMPLEMENTATION = Implementation.Hybrid; + SIGNATURE_TYPE = SignatureType.RawP256; + } + + ////////////////////////////// State ////////////////////////////// + + // Default test user + string keyId = "test"; + bytes32 keyIdHash = keccak256(abi.encodePacked(keyId)); + HybridDeleGator public aliceDeleGator; + HybridDeleGator public bobDeleGator; + HybridDeleGator public onlyEoaHybridDeleGator; + + bytes32 private DELEGATOR_CORE_STORAGE_LOCATION = StorageUtilsLib.getStorageLocation("DeleGator.Core"); + bytes32 private INITIALIZABLE_STORAGE_LOCATION = StorageUtilsLib.getStorageLocation("openzeppelin.storage.Initializable"); + + ////////////////////////////// Events ////////////////////////////// + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + event AddedP256Key(bytes32 indexed keyIdHash, string keyId, uint256 x, uint256 y); + event RemovedP256Key(bytes32 indexed keyIdHash, uint256 x, uint256 y); + + ////////////////////////////// Errors ////////////////////////////// + + error AlreadyExists(bytes32 keyIdHash, string keyId); + error InvalidKey(); + error KeyDoesNotExist(bytes32 keyIdHash); + error CannotRemoveLastKey(); + error InvalidEmptyKey(); + + ////////////////////// Set up ////////////////////// + + function setUp() public override { + super.setUp(); + + // Create a hybrid owned by an EOA only + onlyEoaHybridDeleGator = + HybridDeleGator(payable(deployDeleGator_Hybrid(users.alice.addr, new string[](0), new uint256[](0), new uint256[](0)))); + vm.deal(address(onlyEoaHybridDeleGator), 100 ether); + + // Set up typed DeleGators + aliceDeleGator = HybridDeleGator(payable(address(users.alice.deleGator))); + bobDeleGator = HybridDeleGator(payable(address(users.bob.deleGator))); + } + + ////////////////////// Hybrid DeleGator Specific Tests ////////////////////// + + ////////////////////// Events ////////////////////// + + // Should emit AddedP256Key in initialize + function test_keyAdded_initialize() public { + string[] memory keyIds_ = new string[](1); + uint256[] memory xValues_ = new uint256[](1); + uint256[] memory yValues_ = new uint256[](1); + keyIds_[0] = keyId; + xValues_[0] = users.alice.x; + yValues_[0] = users.alice.y; + + vm.expectEmit(true, true, true, true); + emit AddedP256Key(keyIdHash, keyId, users.alice.x, users.alice.y); + + new ERC1967Proxy( + address(hybridDeleGatorImpl), + abi.encodeWithSignature( + "initialize(address,string[],uint256[],uint256[])", users.alice.addr, keyIds_, xValues_, yValues_ + ) + ); + } + + // Should emit AddedP256Key in addKey + function test_keyAdded_addKey() public { + // Create and Sign UserOp + bytes memory userOpCallData_ = abi.encodeWithSelector( + IDeleGatorCoreFull.execute.selector, + Action({ + to: address(aliceDeleGator), + value: 0, + data: abi.encodeWithSelector(HybridDeleGator.addKey.selector, keyId, users.alice.x, users.alice.y) + }) + ); + PackedUserOperation memory userOp_ = createAndSignUserOp(users.alice, address(aliceDeleGator), userOpCallData_); + + vm.expectEmit(true, true, true, true); + emit AddedP256Key(keyIdHash, keyId, users.alice.x, users.alice.y); + + // Submit UserOp through Bundler + submitUserOp_Bundler(userOp_); + } + + // Should emit RemovedP256Key in removeKey + function test_keyRemoved_removeKey() public { + execute_UserOp(users.alice, abi.encodeWithSelector(HybridDeleGator.addKey.selector, keyId, users.alice.x, users.alice.y)); + + // Create and Sign UserOp + bytes memory userOpCallData_ = abi.encodeWithSelector( + IDeleGatorCoreFull.execute.selector, + Action({ to: address(aliceDeleGator), value: 0, data: abi.encodeWithSelector(HybridDeleGator.removeKey.selector, keyId) }) + ); + PackedUserOperation memory userOp_ = createAndSignUserOp(users.alice, address(aliceDeleGator), userOpCallData_); + + vm.expectEmit(true, true, true, true); + emit RemovedP256Key(keyIdHash, users.alice.x, users.alice.y); + + // Submit UserOp through Bundler + submitUserOp_Bundler(userOp_); + } + + // Should emit RemovedP256Key, AddedP256Key, TransferredOwnership in replace signers + function test_events_replacedSigners() public { + vm.startPrank(address(aliceDeleGator)); + + // Compute Bob's P256 keys + string[] memory keyIds_ = new string[](1); + uint256[] memory xValues_ = new uint256[](1); + uint256[] memory yValues_ = new uint256[](1); + keyIds_[0] = users.bob.name; + xValues_[0] = users.bob.x; + yValues_[0] = users.bob.y; + + (uint256 obtainedX_, uint256 obtainedY_) = HybridDeleGator(aliceDeleGator).getKey(users.alice.name); + + bytes32 aliceKeyIdHash_ = keccak256(abi.encodePacked(users.alice.name)); + bytes32 bobKeyIdHash_ = keccak256(abi.encodePacked(users.bob.name)); + + vm.expectEmit(true, true, true, true); + emit RemovedP256Key(aliceKeyIdHash_, obtainedX_, obtainedY_); + + vm.expectEmit(true, true, true, true); + emit AddedP256Key(bobKeyIdHash_, users.bob.name, xValues_[0], yValues_[0]); + + vm.expectEmit(true, true, true, true); + emit OwnershipTransferred(users.alice.addr, users.bob.addr); + aliceDeleGator.updateSigners(users.bob.addr, keyIds_, xValues_, yValues_); + + // Bob is the EOA owner now + (uint256 x__, uint256 y__) = aliceDeleGator.getKey(users.bob.name); + assertEq(users.bob.x, x__); + assertEq(users.bob.y, y__); + } + + // Should move the stored key ID hash from the last index to the removed index + function test_removeP256KeyAndRearrangeStoredKeyIdHashes() public { + vm.startPrank(address(aliceDeleGator)); + + // Add 2 more keys + aliceDeleGator.addKey(users.bob.name, users.bob.x, users.bob.y); + aliceDeleGator.addKey(users.carol.name, users.carol.x, users.carol.y); + bytes32[] memory initialKeyIdHashes_ = aliceDeleGator.getKeyIdHashes(); + + // Update signers to only Bob + // Compute Bob's P256 keys + aliceDeleGator.removeKey(users.alice.name); + + bytes32[] memory finalKeyIdHashes_ = aliceDeleGator.getKeyIdHashes(); + assertEq(finalKeyIdHashes_[0], initialKeyIdHashes_[2]); + } + + // Should fail when the inputs length are different in updateSigners + function test_error_replacedSignersInputsMismatch() public { + vm.startPrank(address(aliceDeleGator)); + + string[] memory keyIds_ = new string[](2); + uint256[] memory xValues_ = new uint256[](1); + uint256[] memory yValues_ = new uint256[](1); + + vm.expectRevert( + abi.encodeWithSelector(HybridDeleGator.InputLengthsMismatch.selector, keyIds_.length, xValues_.length, yValues_.length) + ); + aliceDeleGator.updateSigners(users.bob.addr, keyIds_, xValues_, yValues_); + + keyIds_ = new string[](1); + xValues_ = new uint256[](2); + yValues_ = new uint256[](1); + + vm.expectRevert( + abi.encodeWithSelector(HybridDeleGator.InputLengthsMismatch.selector, keyIds_.length, xValues_.length, yValues_.length) + ); + aliceDeleGator.updateSigners(users.bob.addr, keyIds_, xValues_, yValues_); + + keyIds_ = new string[](1); + xValues_ = new uint256[](1); + yValues_ = new uint256[](2); + vm.expectRevert( + abi.encodeWithSelector(HybridDeleGator.InputLengthsMismatch.selector, keyIds_.length, xValues_.length, yValues_.length) + ); + aliceDeleGator.updateSigners(users.bob.addr, keyIds_, xValues_, yValues_); + } + + // Should fail when the new signers are empty + function test_error_replacedSignersToEmpty() public { + vm.startPrank(address(aliceDeleGator)); + + string[] memory keyIds_ = new string[](0); + uint256[] memory xValues_ = new uint256[](0); + uint256[] memory yValues_ = new uint256[](0); + + vm.expectRevert(abi.encodeWithSelector(HybridDeleGator.SignersCannotBeEmpty.selector)); + aliceDeleGator.updateSigners(address(0), keyIds_, xValues_, yValues_); + } + + ////////////////////// Initialization ////////////////////// + + // Should allow to initialize with 0 p256 owners, 1 EOA owner + function test_initialize_zeroP256OneEOA() public { + HybridDeleGator hybridDeleGator_ = HybridDeleGator( + payable( + address( + new ERC1967Proxy( + address(hybridDeleGatorImpl), + abi.encodeWithSignature( + "initialize(address,string[],uint256[],uint256[])", + users.alice.addr, + new string[](0), + new uint256[](0), + new uint256[](0) + ) + ) + ) + ) + ); + + assertEq(users.alice.addr, hybridDeleGator_.owner()); + } + + // Should allow to initialize with 1+ p256 owners, 0 EOA owners + function test_initialize_multipleP256ZeroEOA() public { + (uint256 x_, uint256 y_) = FCL_ecdsa_utils.ecdsa_derivKpub(users.carol.privateKey); + + string[] memory keyIds_ = new string[](2); + uint256[] memory xValues_ = new uint256[](2); + uint256[] memory yValues_ = new uint256[](2); + keyIds_[0] = keyId; + xValues_[0] = users.alice.x; + yValues_[0] = users.alice.y; + keyIds_[1] = users.carol.name; + xValues_[1] = x_; + yValues_[1] = y_; + + HybridDeleGator hybridDeleGator_ = HybridDeleGator( + payable( + address( + new ERC1967Proxy( + address(hybridDeleGatorImpl), + abi.encodeWithSignature( + "initialize(address,string[],uint256[],uint256[])", address(0), keyIds_, xValues_, yValues_ + ) + ) + ) + ) + ); + assertEq(hybridDeleGator_.owner(), address(0)); + assertEq(hybridDeleGator_.getKeyIdHashesCount(), 2); + } + + // Should allow to initialize with 1+ p256 owners, 1 EOA owners + function test_initialize_multipleP256OneEOA() public { + // Set up a default key + (uint256 x_, uint256 y_) = FCL_ecdsa_utils.ecdsa_derivKpub(users.carol.privateKey); + + string[] memory keyIds_ = new string[](2); + uint256[] memory xValues_ = new uint256[](2); + uint256[] memory yValues_ = new uint256[](2); + keyIds_[0] = keyId; + xValues_[0] = users.alice.x; + yValues_[0] = users.alice.y; + keyIds_[1] = users.carol.name; + xValues_[1] = x_; + yValues_[1] = y_; + + HybridDeleGator hybridDeleGator_ = HybridDeleGator( + payable( + address( + new ERC1967Proxy( + address(hybridDeleGatorImpl), + abi.encodeWithSignature( + "initialize(address,string[],uint256[],uint256[])", users.alice.addr, keyIds_, xValues_, yValues_ + ) + ) + ) + ) + ); + assertEq(hybridDeleGator_.owner(), users.alice.addr); + assertEq(hybridDeleGator_.getKeyIdHashesCount(), 2); + } + + // should allow Alice to clear and add new signers + function test_reinitialize_clearsAndSetSigners() public { + uint256 oldSignersCount_ = aliceDeleGator.getKeyIdHashesCount(); + assertEq(oldSignersCount_, 1); + + string[] memory keyIds_ = new string[](2); + uint256[] memory xValues_ = new uint256[](2); + uint256[] memory yValues_ = new uint256[](2); + keyIds_[0] = users.carol.name; + xValues_[0] = users.carol.x; + yValues_[0] = users.carol.y; + keyIds_[1] = users.dave.name; + xValues_[1] = users.dave.x; + yValues_[1] = users.dave.y; + bytes32 keyHashCarol_ = keccak256(abi.encodePacked(keyIds_[0])); + bytes32 keyHashDave_ = keccak256(abi.encodePacked(keyIds_[1])); + + // Replace the signers + vm.startPrank(address(aliceDeleGator)); + aliceDeleGator.reinitialize( + uint8(IDeleGatorCoreFull(address(aliceDeleGator)).getInitializedVersion() + 1), + users.bob.addr, + keyIds_, + xValues_, + yValues_, + true + ); + + bytes32[] memory keyIdHashes_ = aliceDeleGator.getKeyIdHashes(); + assertEq(keyIdHashes_[0], keyHashCarol_); + assertEq(keyIdHashes_[1], keyHashDave_); + assertEq(keyIdHashes_.length, 2); + } + + // should allow Alice to clear and add new signers + function test_reinitialize_keepAndSetSigners() public { + uint256 oldSignersCount_ = aliceDeleGator.getKeyIdHashesCount(); + assertEq(oldSignersCount_, 1); + + string[] memory keyIds_ = new string[](2); + uint256[] memory xValues_ = new uint256[](2); + uint256[] memory yValues_ = new uint256[](2); + keyIds_[0] = users.carol.name; + xValues_[0] = users.carol.x; + yValues_[0] = users.carol.y; + keyIds_[1] = users.dave.name; + xValues_[1] = users.dave.x; + yValues_[1] = users.dave.y; + bytes32 keyHashAlice_ = keccak256(abi.encodePacked(users.alice.name)); + bytes32 keyHashCarol_ = keccak256(abi.encodePacked(keyIds_[0])); + bytes32 keyHashDave_ = keccak256(abi.encodePacked(keyIds_[1])); + + // Replace the signers + vm.startPrank(address(aliceDeleGator)); + aliceDeleGator.reinitialize( + uint8(IDeleGatorCoreFull(address(aliceDeleGator)).getInitializedVersion() + 1), + users.bob.addr, + keyIds_, + xValues_, + yValues_, + false + ); + + bytes32[] memory keyIdHashes_ = aliceDeleGator.getKeyIdHashes(); + assertEq(keyIdHashes_[0], keyHashAlice_); + assertEq(keyIdHashes_[1], keyHashCarol_); + assertEq(keyIdHashes_[2], keyHashDave_); + assertEq(keyIdHashes_.length, 3); + } + + ////////////////////// UUPS ////////////////////// + + // Should allow upgrading to a HybridDeleGator + function test_allow_upgradingHybridDeleGator() public { + // Load DeleGator to manipulate + address payable deleGator_ = payable(address(aliceDeleGator)); + + // Load initial storage values + bytes32 delegatorCoreStoragePre_ = vm.load(deleGator_, DELEGATOR_CORE_STORAGE_LOCATION); + + // Compute Bob's P256 keys + string[] memory keyIds_ = new string[](1); + uint256[] memory xValues_ = new uint256[](1); + uint256[] memory yValues_ = new uint256[](1); + keyIds_[0] = users.bob.name; + xValues_[0] = users.bob.x; + yValues_[0] = users.bob.y; + + // Update DeleGator to Hybrid owned by Bob + address[] memory signers_ = new address[](1); + signers_[0] = users.alice.addr; + execute_UserOp( + users.alice, + abi.encodeWithSelector( + IDeleGatorCoreFull.upgradeToAndCall.selector, + address(hybridDeleGatorImpl), + abi.encodeWithSelector( + HybridDeleGator.reinitialize.selector, + IDeleGatorCoreFull(deleGator_).getInitializedVersion() + 1, + users.bob.addr, + keyIds_, + xValues_, + yValues_, + false + ), + false + ) + ); + + // Assert DeleGator is Hybrid + assertEq(address(IDeleGatorCoreFull(deleGator_).getImplementation()), address(hybridDeleGatorImpl)); + + // ERC4337 should be the same + assertEq(delegatorCoreStoragePre_, vm.load(deleGator_, DELEGATOR_CORE_STORAGE_LOCATION)); + + // Initializable version should have increased by 1 + bytes memory initializableStorage_ = abi.encode(vm.load(deleGator_, INITIALIZABLE_STORAGE_LOCATION)); + assertEq(2, BytesLib.toUint64(initializableStorage_, 24)); + assertEq(false, StorageUtilsLib.toBool(initializableStorage_, 23)); + + // Assert Hybrid storage was configured properly + (uint256 x__, uint256 y__) = HybridDeleGator(deleGator_).getKey(users.bob.name); + assertEq(users.bob.x, x__); + assertEq(users.bob.y, y__); + + address hybridOwner_ = HybridDeleGator(deleGator_).owner(); + assertEq(users.bob.addr, hybridOwner_); + } + + ////////////////////// Key Management ////////////////////// + + // Should allow adding a new key + function test_allow_addKey() public { + uint256 count_ = aliceDeleGator.getKeyIdHashesCount(); + assertEq(count_, 1); + + execute_UserOp(users.alice, abi.encodeWithSelector(HybridDeleGator.addKey.selector, keyId, users.alice.x, users.alice.y)); + + (uint256 x_, uint256 y_) = aliceDeleGator.getKey(keyId); + assertEq(x_, users.alice.x); + assertEq(y_, users.alice.y); + + count_ = aliceDeleGator.getKeyIdHashesCount(); + assertEq(count_, 2); + } + + // Should allow removing a key + function test_allow_removeKey() public { + execute_UserOp(users.alice, abi.encodeWithSelector(HybridDeleGator.addKey.selector, keyId, users.alice.x, users.alice.y)); + + uint256 count_ = aliceDeleGator.getKeyIdHashesCount(); + assertEq(count_, 2); + + execute_UserOp(users.alice, abi.encodeWithSelector(HybridDeleGator.removeKey.selector, keyId)); + + (uint256 x_, uint256 y_) = aliceDeleGator.getKey(keyId); + assertEq(x_, 0); + assertEq(y_, 0); + + count_ = aliceDeleGator.getKeyIdHashesCount(); + assertEq(count_, 1); + } + + // Should return the stored key id hashes + function test_return_KeyIdHashes() public { + execute_UserOp(users.alice, abi.encodeWithSelector(HybridDeleGator.addKey.selector, keyId, users.alice.x, users.alice.y)); + + bytes32[] memory keyIdHashes_ = aliceDeleGator.getKeyIdHashes(); + uint256 count_ = aliceDeleGator.getKeyIdHashesCount(); + + assertEq(keyIdHashes_.length, count_); + assertEq(keyIdHashes_.length, 2); + bytes32 keyIdHash0_ = keccak256(abi.encodePacked("Alice")); + bytes32 keyIdHash1_ = keccak256(abi.encodePacked(keyId)); + + assertEq(keyIdHashes_[0], keyIdHash0_); + assertEq(keyIdHashes_[1], keyIdHash1_); + } + + // should NOT allow Alice to transfer ownership directly + function test_notAllow_transferOwnership_directOwner() public { + // Submit Alice's tx + vm.prank(users.alice.addr); + vm.expectRevert(abi.encodeWithSelector(IDeleGatorCoreFull.NotEntryPointOrSelf.selector)); + aliceDeleGator.transferOwnership(users.bob.addr); + } + + // should NOT allow Bob to transfer Alice's ownership directly + function test_notAllow_transferOwnership_directNonOwner() public { + // Submit Bob's tx + vm.prank(users.bob.addr); + vm.expectRevert(abi.encodeWithSelector(IDeleGatorCoreFull.NotEntryPointOrSelf.selector)); + aliceDeleGator.transferOwnership(users.bob.addr); + } + + // should NOT allow Alice to renounce ownership directly like OZ Ownable + function test_notAllow_renounceOwnership_Direct() public { + assertEq(aliceDeleGator.owner(), users.alice.addr); + + // Submit Alice's tx + vm.prank(users.alice.addr); + vm.expectRevert(); + aliceDeleGator.renounceOwnership(); + } + + // should support IERC173 and parent interfaces for ERC165 + function test_allow_erc173InterfaceId() public { + assertTrue(aliceDeleGator.supportsInterface(type(IERC173).interfaceId)); + assertTrue(aliceDeleGator.supportsInterface(type(IDeleGatorCore).interfaceId)); + } + + // Should allow a single secure EOA to replace an insecure EOA + function test_allow_replaceEOAWithEOA() public { + // Alice is the EOA owner + assertEq(users.alice.addr, onlyEoaHybridDeleGator.owner()); + + // Create and Sign UserOp + bytes memory userOpCallData_ = abi.encodeWithSelector( + IDeleGatorCoreFull.execute.selector, + Action({ + to: address(onlyEoaHybridDeleGator), + value: 0, + data: abi.encodeWithSelector( + HybridDeleGator.updateSigners.selector, users.bob.addr, new string[](0), new uint256[](0), new uint256[](0) + ) + }) + ); + PackedUserOperation memory userOp_ = createUserOp(address(onlyEoaHybridDeleGator), userOpCallData_); + bytes32 userOpHash_ = entryPoint.getUserOpHash(userOp_); + userOp_.signature = SigningUtilsLib.signHash_EOA(users.alice.privateKey, userOpHash_.toEthSignedMessageHash()); + + // Submit UserOp through Bundler + submitUserOp_Bundler(userOp_); + + // Bob is the EOA owner now + assertEq(users.bob.addr, onlyEoaHybridDeleGator.owner()); + } + + // Should allow a single secure P256 key to replace an insecure EOA + function test_allow_replaceEOAWithP256() public { + // Alice is the EOA owner + assertEq(users.alice.addr, onlyEoaHybridDeleGator.owner()); + + // Compute Bob's P256 keys + string[] memory keyIds_ = new string[](1); + uint256[] memory xValues_ = new uint256[](1); + uint256[] memory yValues_ = new uint256[](1); + keyIds_[0] = users.bob.name; + xValues_[0] = users.bob.x; + yValues_[0] = users.bob.y; + + // Create and Sign UserOp + bytes memory userOpCallData_ = abi.encodeWithSelector( + IDeleGatorCoreFull.execute.selector, + Action({ + to: address(onlyEoaHybridDeleGator), + value: 0, + data: abi.encodeWithSelector(HybridDeleGator.updateSigners.selector, address(0), keyIds_, xValues_, yValues_) + }) + ); + PackedUserOperation memory userOp_ = createUserOp(address(onlyEoaHybridDeleGator), userOpCallData_); + bytes32 userOpHash_ = entryPoint.getUserOpHash(userOp_); + userOp_.signature = SigningUtilsLib.signHash_EOA(users.alice.privateKey, userOpHash_.toEthSignedMessageHash()); + + // Submit UserOp through Bundler + submitUserOp_Bundler(userOp_); + + // Bob is the EOA owner now + (uint256 x__, uint256 y__) = onlyEoaHybridDeleGator.getKey(users.bob.name); + assertEq(users.bob.x, x__); + assertEq(users.bob.y, y__); + } + + // Should allow a secure EOA and P256 keys to replace an insecure EOA + function test_allow_replaceEOAWithEOAAndP256() public { + // Alice is the EOA owner + assertEq(users.alice.addr, onlyEoaHybridDeleGator.owner()); + + // Compute Bob's P256 keys + string[] memory keyIds_ = new string[](1); + uint256[] memory xValues_ = new uint256[](1); + uint256[] memory yValues_ = new uint256[](1); + keyIds_[0] = users.bob.name; + xValues_[0] = users.bob.x; + yValues_[0] = users.bob.y; + + // Create and Sign UserOp + bytes memory userOpCallData_ = abi.encodeWithSelector( + IDeleGatorCoreFull.execute.selector, + Action({ + to: address(onlyEoaHybridDeleGator), + value: 0, + data: abi.encodeWithSelector(HybridDeleGator.updateSigners.selector, users.bob.addr, keyIds_, xValues_, yValues_) + }) + ); + PackedUserOperation memory userOp_ = createUserOp(address(onlyEoaHybridDeleGator), userOpCallData_); + bytes32 userOpHash_ = entryPoint.getUserOpHash(userOp_); + userOp_.signature = SigningUtilsLib.signHash_EOA(users.alice.privateKey, userOpHash_.toEthSignedMessageHash()); + + // Submit UserOp through Bundler + submitUserOp_Bundler(userOp_); + + // Bob is the EOA owner now + (uint256 x__, uint256 y__) = onlyEoaHybridDeleGator.getKey(users.bob.name); + assertEq(users.bob.x, x__); + assertEq(users.bob.y, y__); + + // Bob is the EOA owner + assertEq(users.bob.addr, onlyEoaHybridDeleGator.owner()); + } + + // A delegate replacing ALL of the existing keys (passkeys and EOA) in a single transaction onchain + function test_allow_replaceEOAWithEOAAndP256WithOnchainDelegation() public { + // Alice is the EOA owner + assertEq(users.alice.addr, aliceDeleGator.owner()); + + // Compute Bob's P256 keys + string[] memory keyIds_ = new string[](1); + uint256[] memory xValues_ = new uint256[](1); + uint256[] memory yValues_ = new uint256[](1); + keyIds_[0] = users.bob.name; + xValues_[0] = users.bob.x; + yValues_[0] = users.bob.y; + + // Create the action that would be executed + Action memory action_ = Action({ + to: address(aliceDeleGator), + value: 0, + data: abi.encodeWithSelector(HybridDeleGator.updateSigners.selector, users.bob.addr, keyIds_, xValues_, yValues_) + }); + + Caveat[] memory caveats_ = new Caveat[](0); + Delegation memory delegation_ = Delegation({ + delegate: address(bobDeleGator), + delegator: address(aliceDeleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + + // Store delegation + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation_)); + + // Execute Bob's UserOp + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation_; + + invokeDelegation_UserOp(users.bob, delegations_, action_); + + // Bob is the EOA owner now + (uint256 x__, uint256 y__) = aliceDeleGator.getKey(users.bob.name); + assertEq(users.bob.x, x__); + assertEq(users.bob.y, y__); + + // Bob is the EOA owner + assertEq(users.bob.addr, aliceDeleGator.owner()); + } + + // A delegate replacing ALL of the existing keys (passkeys and EOA) in a single transaction offchain + function test_allow_replaceEOAWithEOAAndP256WithOffchainDelegation() public { + // Alice is the EOA owner + assertEq(users.alice.addr, aliceDeleGator.owner()); + + // Compute Bob's P256 keys + string[] memory keyIds_ = new string[](1); + uint256[] memory xValues_ = new uint256[](1); + uint256[] memory yValues_ = new uint256[](1); + keyIds_[0] = users.bob.name; + xValues_[0] = users.bob.x; + yValues_[0] = users.bob.y; + + // Create the action that would be executed + Action memory action_ = Action({ + to: address(aliceDeleGator), + value: 0, + data: abi.encodeWithSelector(HybridDeleGator.updateSigners.selector, users.bob.addr, keyIds_, xValues_, yValues_) + }); + + Caveat[] memory caveats_ = new Caveat[](0); + Delegation memory delegation_ = Delegation({ + delegate: address(bobDeleGator), + delegator: address(aliceDeleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + + // Signing the delegation + delegation_ = signDelegation(users.alice, delegation_); + + // Execute Bob's UserOp + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation_; + + invokeDelegation_UserOp(users.bob, delegations_, action_); + + // Bob is the EOA owner now + (uint256 x__, uint256 y__) = aliceDeleGator.getKey(users.bob.name); + assertEq(users.bob.x, x__); + assertEq(users.bob.y, y__); + + // Bob is the EOA owner + assertEq(users.bob.addr, aliceDeleGator.owner()); + } + + ////////////////////// Signature Validation ////////////////////// + + // Tests the flow using a signature created with WebAuthn + function test_allow_signingWithWebAuthn() public { + // Alice is the EOA owner + assertEq(users.alice.addr, aliceDeleGator.owner()); + + // Hardcoded values in these tests were generated with WebAuthn + // https://github.com/MetaMask/Passkeys-Demo-App + string memory webAuthnKeyId_ = "WebAuthnUser"; + uint256 xWebAuthn_ = 0x5ab7b640f322014c397264bb85cbf404500feb04833ae699f41978495b655163; + uint256 yWebAuthn_ = 0x1ee739189ede53846bd7d38bfae016919bf7d88f7ccd60aad8277af4793d1fd7; + bytes32 keyIdHash_ = keccak256(abi.encodePacked(webAuthnKeyId_)); + + // Adding the key as signer + vm.prank(address(entryPoint)); + aliceDeleGator.addKey(webAuthnKeyId_, xWebAuthn_, yWebAuthn_); + + // Create the action that would be executed + bytes memory userOpCallData_ = abi.encodeWithSelector( + IDeleGatorCoreFull.execute.selector, + Action({ + to: address(aliceDeleGator), + value: 0, + data: abi.encodeWithSelector(Ownable.transferOwnership.selector, address(1)) + }) + ); + PackedUserOperation memory userOp_ = createUserOp(address(aliceDeleGator), userOpCallData_); + bytes32 userOpHash_ = entryPoint.getUserOpHash(userOp_); + bytes32 ethSignedMessageHash_ = userOpHash_.toEthSignedMessageHash(); + (ethSignedMessageHash_); // This is what is signed with webAuthn + + // WebAuthn Signature values + uint256 r_ = 0x83e76b9afa53953f7971d4cdc8e2859f8786ba70423de061d0e15367d41b44fa; + uint256 s_ = 0x7c25bacc7ef162d395533639cc164b02592585d0ab382efe3790393a07ee7f56; + + bytes memory authenticatorData_ = hex"49960de5880e8c687434170f6476605b8fe4aeb9a28632c7995cf3ba831d97630500000000"; + bool requireUserVerification_ = true; + string memory clientDataJSONPrefix_ = '{"type":"webauthn.get","challenge":"'; + string memory clientDataJSONSuffix_ = '","origin":"http://localhost:3000","crossOrigin":false}'; + + // Index of the type in clientDataJSON string + uint256 responseTypeLocation_ = 1; + + userOp_.signature = abi.encode( + keyIdHash_, + r_, + s_, + authenticatorData_, + requireUserVerification_, + clientDataJSONPrefix_, + clientDataJSONSuffix_, + responseTypeLocation_ + ); + + // Submit UserOp through Bundler + submitUserOp_Bundler(userOp_); + + // The owner was transferred + assertEq(aliceDeleGator.owner(), address(1)); + } + + // Tests the flow using a signature created with WebAuthn and an invalid type + function test_fails_signingWithWebAuthnWithInvalidType() public { + // Alice is the EOA owner + assertEq(users.alice.addr, aliceDeleGator.owner()); + + // Hardcoded values in these tests were generated with WebAuthn + // https://github.com/MetaMask/Passkeys-Demo-App + string memory webAuthnKeyId_ = "WebAuthnUser"; + uint256 xWebAuthn_ = 0x5ab7b640f322014c397264bb85cbf404500feb04833ae699f41978495b655163; + uint256 yWebAuthn_ = 0x1ee739189ede53846bd7d38bfae016919bf7d88f7ccd60aad8277af4793d1fd7; + bytes32 keyIdHash_ = keccak256(abi.encodePacked(webAuthnKeyId_)); + + // Adding the key as signer + vm.prank(address(entryPoint)); + aliceDeleGator.addKey(webAuthnKeyId_, xWebAuthn_, yWebAuthn_); + + // Create the action that would be executed + bytes memory userOpCallData_ = abi.encodeWithSelector( + IDeleGatorCoreFull.execute.selector, + Action({ + to: address(aliceDeleGator), + value: 0, + data: abi.encodeWithSelector(Ownable.transferOwnership.selector, address(1)) + }) + ); + PackedUserOperation memory userOp_ = createUserOp(address(aliceDeleGator), userOpCallData_); + bytes32 userOpHash_ = entryPoint.getUserOpHash(userOp_); + bytes32 ethSignedMessageHash_ = userOpHash_.toEthSignedMessageHash(); + (ethSignedMessageHash_); // This is what is signed with webAuthn + + // WebAuthn Signature values + uint256 r_ = 0x83e76b9afa53953f7971d4cdc8e2859f8786ba70423de061d0e15367d41b44fa; + uint256 s_ = 0x7c25bacc7ef162d395533639cc164b02592585d0ab382efe3790393a07ee7f56; + + bytes memory authenticatorData_ = hex"49960de5880e8c687434170f6476605b8fe4aeb9a28632c7995cf3ba831d97630500000000"; + bool requireUserVerification_ = true; + + // Using an invalid type here it should be '{"type":"webauthn.get","challenge":"'; + string memory clientDataJSONPrefix_ = '{"type":"web.get","challenge":"'; + string memory clientDataJSONSuffix_ = '","origin":"http://localhost:3000","crossOrigin":false}'; + + // Index of the type in clientDataJSON string + uint256 responseTypeLocation_ = 1; + + userOp_.signature = abi.encode( + keyIdHash_, + r_, + s_, + authenticatorData_, + requireUserVerification_, + clientDataJSONPrefix_, + clientDataJSONSuffix_, + responseTypeLocation_ + ); + + // Submit UserOp through Bundler, it will fail + submitUserOp_Bundler(userOp_, true); + + // The owner was not transferred + assertEq(aliceDeleGator.owner(), users.alice.addr); + } + + // A signature should be valid if generated with EOA + function test_allow_signatureWithEOA() public { + Delegation memory delegation_ = Delegation({ + delegate: users.bob.addr, + delegator: address(aliceDeleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + bytes32 delegationHash_ = EncoderLib._getDelegationHash(delegation_); + bytes32 typedDataHash_ = MessageHashUtils.toTypedDataHash(delegationManager.getDomainHash(), delegationHash_); + delegation_.signature = SigningUtilsLib.signHash_EOA(users.alice.privateKey, typedDataHash_); + + // Show that signature is valid + bytes4 resultEOA_ = aliceDeleGator.isValidSignature(typedDataHash_, delegation_.signature); + assertEq(resultEOA_, bytes4(0x1626ba7e)); + } + + // A signature should be valid if generated with a raw P256 + function test_allow_signatureWithP256() public { + Delegation memory delegation_ = Delegation({ + delegate: users.bob.addr, + delegator: address(aliceDeleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + bytes32 delegationHash_ = EncoderLib._getDelegationHash(delegation_); + bytes32 typedDataHash_ = MessageHashUtils.toTypedDataHash(delegationManager.getDomainHash(), delegationHash_); + bytes memory signature_ = SigningUtilsLib.signHash_P256(users.alice.name, users.alice.privateKey, typedDataHash_); + delegation_.signature = signature_; + + // Show that signature is valid + bytes4 resultP256_ = aliceDeleGator.isValidSignature(typedDataHash_, delegation_.signature); + assertEq(resultP256_, bytes4(0x1626ba7e)); + } + + ////////////////////// Errors ////////////////////// + + // Should NOT allow adding an existing key. Emits AlreadyExists in addKey + function test_notAllow_addingExistingKey() public { + vm.startPrank(address(aliceDeleGator)); + + // Don't allow overwriting an existing key + vm.expectRevert( + abi.encodeWithSelector(HybridDeleGator.KeyAlreadyExists.selector, keccak256(abi.encodePacked(users.alice.name))) + ); + aliceDeleGator.addKey(users.alice.name, users.alice.x, users.alice.y); + } + + // Should NOT allow adding a key that is not on the curve. + function test_notAllow_addKeyNotOnCurve() public { + vm.prank(address(aliceDeleGator)); + vm.expectRevert(abi.encodeWithSelector(HybridDeleGator.KeyNotOnCurve.selector, 0, 0)); + aliceDeleGator.addKey(keyId, 0, 0); + } + + // Should NOT allow adding an invalid key. Emits InvalidKey on deploy + function test_notAllow_invalidKeyOnDeploy() public { + string[] memory keyIds_ = new string[](1); + keyIds_[0] = keyId; + + uint256[] memory xValues_ = new uint256[](1); + uint256[] memory yValues_ = new uint256[](1); + vm.expectRevert(abi.encodeWithSelector(HybridDeleGator.KeyNotOnCurve.selector, 0, 0)); + new ERC1967Proxy( + address(hybridDeleGatorImpl), + abi.encodeWithSignature( + "initialize(address,string[],uint256[],uint256[])", users.alice.addr, keyIds_, xValues_, yValues_ + ) + ); + } + + // Should NOT allow removing a non-existant key. Emits KeyDoesNotExist in removeKey + function test_notAllow_removingNonExistantKey() public { + vm.expectRevert(abi.encodeWithSelector(HybridDeleGator.KeyDoesNotExist.selector, keccak256(abi.encodePacked(keyId)))); + vm.prank(address(aliceDeleGator)); + aliceDeleGator.removeKey(keyId); + } + + // Should NOT allow to add an empty key + function test_notAllow_addingAnEmptyKey() public { + uint256 xWebAuthn_ = 0xfe238ff5854d1d5cf1c7fc8576f82220c0f1dd9e5805f177ca1f5ef2359f5d64; + uint256 yWebAuthn_ = 0x82184d10af7245c2ae25b72983269f073ddbf8de32bb94a5798ca635555ebcfc; + vm.expectRevert(abi.encodeWithSelector(HybridDeleGator.InvalidEmptyKey.selector)); + vm.prank(address(aliceDeleGator)); + aliceDeleGator.addKey("", xWebAuthn_, yWebAuthn_); + } + + // Should NOT allow removing the last key via P256. Emits CannotRemoveLastSigner in removeKey + function test_notAllow_removingLastKeyViaP256() public { + // Delete the EOA leaving only P256 key + vm.startPrank(address(aliceDeleGator)); + aliceDeleGator.renounceOwnership(); + + vm.expectRevert(abi.encodeWithSelector(HybridDeleGator.CannotRemoveLastSigner.selector)); + aliceDeleGator.removeKey(users.alice.name); + } + + // Should NOT allow removing the last key via EOA. Emits CannotRemoveLastSigner in removeKey + function test_notAllow_removingLastKeyViaEOA() public { + // Delete the P256 key leaving only EOA + vm.startPrank(address(aliceDeleGator)); + aliceDeleGator.removeKey(users.alice.name); + + vm.expectRevert(abi.encodeWithSelector(HybridDeleGator.CannotRemoveLastSigner.selector)); + aliceDeleGator.renounceOwnership(); + } + + // A signature should be valid if generated with a raw P256 + function test_notAllow_invalidSignatureLength() public { + Delegation memory delegation_ = Delegation({ + delegate: users.bob.addr, + delegator: address(aliceDeleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + bytes32 delegationHash_ = EncoderLib._getDelegationHash(delegation_); + bytes32 typedDataHash_ = MessageHashUtils.toTypedDataHash(delegationManager.getDomainHash(), delegationHash_); + delegation_.signature = hex"ffffffffffffffffffff"; + + // Show that signature is valid + bytes4 resultP256_ = aliceDeleGator.isValidSignature(typedDataHash_, delegation_.signature); + assertEq(resultP256_, bytes4(0xffffffff)); + } +} diff --git a/test/InviteTest.t.sol b/test/InviteTest.t.sol new file mode 100644 index 0000000..5f5dfc2 --- /dev/null +++ b/test/InviteTest.t.sol @@ -0,0 +1,192 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { MessageHashUtils } from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; + +import { BaseTest } from "./utils/BaseTest.t.sol"; +import { Delegation, Action, PackedUserOperation, Caveat } from "../src/utils/Types.sol"; +import { Implementation, SignatureType } from "./utils/Types.t.sol"; +import { Counter } from "./utils/Counter.t.sol"; +import { MultiSigDeleGator } from "../src/MultiSigDeleGator.sol"; +import { IDeleGatorCoreFull } from "../src/interfaces/IDeleGatorCoreFull.sol"; +import { SimpleFactory } from "./utils/SimpleFactory.sol"; +import { AllowedTargetsEnforcer } from "../src/enforcers/AllowedTargetsEnforcer.sol"; +import { AllowedMethodsEnforcer } from "../src/enforcers/AllowedMethodsEnforcer.sol"; + +contract InviteTest is BaseTest { + using MessageHashUtils for bytes32; + + constructor() { + IMPLEMENTATION = Implementation.Hybrid; + SIGNATURE_TYPE = SignatureType.EOA; + } + + ////////////////////////////// State /////////////////////////////// + + bytes32 public salt; + AllowedTargetsEnforcer public allowedTargetsEnforcer; + AllowedMethodsEnforcer public allowedMethodsEnforcer; + Counter public aliceDeleGatorCounter; + + ////////////////////// Set up ////////////////////// + + function setUp() public override { + super.setUp(); + salt = keccak256(abi.encode("salt")); + allowedTargetsEnforcer = new AllowedTargetsEnforcer(); + vm.label(address(allowedTargetsEnforcer), "Allowed Targets Enforcer"); + allowedMethodsEnforcer = new AllowedMethodsEnforcer(); + vm.label(address(allowedMethodsEnforcer), "Allowed Methods Enforcer"); + aliceDeleGatorCounter = new Counter(address(users.alice.deleGator)); + } + + ////////////////////////////// External Methods ////////////////////////////// + + // should allow Bob to create a new MultiSigDeleGator and prepare a transaction prior to contract deployment + function test_createADeleGatorForBobAndSend() public { + // Get predicted address and bytecode for a new MultiSigDeleGator + address[] memory signers_ = new address[](1); + signers_[0] = users.bob.addr; + + bytes memory args_ = + abi.encode(address(multiSigDeleGatorImpl), abi.encodeWithSignature("initialize(address[],uint256)", signers_, 1)); + bytes32 bytecodeHash_ = hashInitCode(type(ERC1967Proxy).creationCode, args_); + address predictedAddr_ = vm.computeCreate2Address(salt, bytecodeHash_, address(simpleFactory)); + vm.label(predictedAddr_, "Expected Address"); + address factoryPredictedAddr_ = simpleFactory.computeAddress(bytecodeHash_, salt); + assertEq(factoryPredictedAddr_, predictedAddr_); + + // Get initcode for a new MultiSigDeleGator + bytes memory initcode_ = abi.encodePacked( + address(simpleFactory), + abi.encodeWithSelector(SimpleFactory.deploy.selector, abi.encodePacked(type(ERC1967Proxy).creationCode, args_), salt) + ); + + // Create action to send ETH to Bob + Action memory action_ = Action({ to: address(users.bob.addr), value: 1, data: hex"" }); + + // Give the new MultiSigDeleGator some funds to pay for the action + vm.deal(predictedAddr_, 100); + + // Preload the EntryPoint with funds for the new MultiSigDeleGator + vm.prank(users.alice.addr); + entryPoint.depositTo{ value: 5 ether }(predictedAddr_); + + // Fetch balance before action executes + uint256 balanceBefore_ = users.bob.addr.balance; + + // Create and Sign UserOp with Bob's key + PackedUserOperation memory userOp_ = createAndSignUserOp( + users.bob, predictedAddr_, abi.encodeWithSelector(IDeleGatorCoreFull.execute.selector, action_), initcode_ + ); + + // Validate the contract hasn't been deployed yet + assertEq(predictedAddr_.code, hex""); + + // Submit the UserOp through the Bundler + submitUserOp_Bundler(userOp_); + + // Fetch balance after action executes + uint256 balanceAfter_ = users.bob.addr.balance; + assertEq(balanceAfter_, balanceBefore_ + 1); + + // Check that the contract has been deployed properly + // NOTE: "runtimeCode" is not available for contracts containing immutable variables. + // Need to generate that code. OR cheat and see if it matches Bob's existing MultiSigDeleGator. + // assertEq(predictedAddr_.code, address(users.users.bob.deleGator).code); + } + + // should allow Bob to create a new MultiSigDeleGator and prepare a transaction that executes a delegation from Alice prior to + // contract deployment + function test_createADeleGatorForBobAndDelegate() public { + // Get predicted address and bytecode for a new MultiSigDeleGator + address[] memory signers_ = new address[](1); + signers_[0] = users.bob.addr; + bytes memory args_ = + abi.encode(address(multiSigDeleGatorImpl), abi.encodeWithSignature("initialize(address[],uint256)", signers_, 1)); + bytes32 bytecodeHash_ = hashInitCode(type(ERC1967Proxy).creationCode, args_); + address predictedAddr_ = vm.computeCreate2Address(salt, bytecodeHash_, address(simpleFactory)); + vm.label(predictedAddr_, "Expected Address"); + + // Create initcode_ + bytes memory initcode_ = abi.encodePacked( + address(simpleFactory), + abi.encodeWithSelector(SimpleFactory.deploy.selector, abi.encodePacked(type(ERC1967Proxy).creationCode, args_), salt) + ); + + vm.label(predictedAddr_, "Expected Address"); + + // Validate the contract hasn't been deployed yet + assertEq(predictedAddr_.code, hex""); + + Delegation memory delegation_; + { + // Create Caveats for only calling increment + Caveat[] memory caveats_ = new Caveat[](2); + caveats_[0] = Caveat({ + args: hex"", + enforcer: address(allowedTargetsEnforcer), + terms: abi.encodePacked(address(aliceDeleGatorCounter)) + }); + caveats_[1] = Caveat({ + args: hex"", + enforcer: address(allowedMethodsEnforcer), + terms: abi.encodePacked(Counter.increment.selector) + }); + + // Create Alice's delegation to Bob + delegation_ = Delegation({ + delegate: predictedAddr_, + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + + // Sign delegation + delegation_ = signDelegation(users.alice, delegation_); + } + + // Give the new MultiSigDeleGator some funds to pay for the action + vm.deal(predictedAddr_, 100); + + // Preload the EntryPoint with funds for the new MultiSigDeleGator + vm.prank(users.alice.addr); + entryPoint.depositTo{ value: 5 ether }(predictedAddr_); + + // Fetch initial count + uint256[] memory counts_ = new uint256[](2); + counts_[0] = aliceDeleGatorCounter.count(); + + // Create action to deploy a new MultiSigDeleGator and execute Bob's UserOp + Action memory action_; + { + action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + } + + // Execute Bob's UserOp + { + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation_; + + bytes memory userOpCallData_ = + abi.encodeWithSelector(IDeleGatorCoreFull.redeemDelegation.selector, abi.encode(delegations_), action_); + PackedUserOperation memory userOp_ = createUserOp(predictedAddr_, userOpCallData_, initcode_); + bytes32 userOpHash_ = entryPoint.getUserOpHash(userOp_); + userOp_.signature = signHash(users.bob, userOpHash_.toEthSignedMessageHash()); + submitUserOp_Bundler(userOp_); + } + + // Fetch final count + counts_[1] = aliceDeleGatorCounter.count(); + assertEq(counts_[1], counts_[0] + 1); + + // Check that the contract has been deployed properly + // NOTE: "runtimeCode" is not available for contracts containing immutable variables. + // Need to generate that code. OR cheat and see if it matches Bob's existing MultiSigDeleGator. + // assertEq(predictedAddr_.code, address(users.users.bob.deleGator).code); + } +} diff --git a/test/MultiSigDeleGatorTest.t.sol b/test/MultiSigDeleGatorTest.t.sol new file mode 100644 index 0000000..162b5ad --- /dev/null +++ b/test/MultiSigDeleGatorTest.t.sol @@ -0,0 +1,919 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { IEntryPoint, EntryPoint } from "@account-abstraction/core/EntryPoint.sol"; +import { BytesLib } from "@bytes-utils/BytesLib.sol"; +import { EntryPoint } from "@account-abstraction/core/EntryPoint.sol"; +import { MessageHashUtils } from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; +import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; +import { ERC1967Proxy as DeleGatorProxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; + +import { SigningUtilsLib } from "./utils/SigningUtilsLib.t.sol"; +import { Implementation, SignatureType } from "./utils/Types.t.sol"; +import { Action, PackedUserOperation, Caveat, Delegation, Delegation } from "../src/utils/Types.sol"; +import { BaseTest } from "./utils/BaseTest.t.sol"; +import { AccountSorterLib } from "./utils/AccountSorterLib.t.sol"; +import { MultiSigDeleGator } from "../src/MultiSigDeleGator.sol"; +import { IDelegationManager } from "../src/interfaces/IDelegationManager.sol"; +import { IDeleGatorCoreFull } from "../src/interfaces/IDeleGatorCoreFull.sol"; +import { EncoderLib } from "../src/libraries/EncoderLib.sol"; +import { Counter } from "./utils/Counter.t.sol"; +import { SimpleFactory } from "./utils/SimpleFactory.sol"; +import "forge-std/Test.sol"; + +/** + * @title Multi Signature DeleGator Implementation Test + * @dev These tests are for the MultiSig functionality of the MultiSigDeleGator contract. + * @dev DeleGator functionality is tested inside GenericDeleGatorUserOpTest. + * @dev NOTE: All Smart Account interactions flow through ERC4337 UserOps. + */ +contract MultiSigDeleGatorTest is BaseTest { + using MessageHashUtils for bytes32; + + ////////////////////// Configure BaseTest ////////////////////// + + constructor() { + IMPLEMENTATION = Implementation.MultiSig; + SIGNATURE_TYPE = SignatureType.MultiSig; + } + + ////////////////////////////// State ////////////////////////////// + + uint256 public constant MAX_NUMBER_OF_SIGNERS = 30; + MultiSigDeleGator public aliceDeleGator; + MultiSigDeleGator public bobDeleGator; + MultiSigDeleGator public sharedDeleGator; + Counter sharedDeleGatorCounter; + uint256[] public sharedDeleGatorPrivateKeys; + address[] public sharedDeleGatorSigners; + + ////////////////////// Events ////////////////////// + + event SetDelegationManager(IDelegationManager indexed newDelegationManager); + event ReplacedSigner(address indexed oldSigner, address indexed newSigner); + event AddedSigner(address indexed signer); + event RemovedSigner(address indexed signer); + event UpdatedThreshold(uint256 threshold); + event Initialized(uint64 version); + + ////////////////////// Set up ////////////////////// + + function setUp() public override { + super.setUp(); + + // Set up typed DeleGators + aliceDeleGator = MultiSigDeleGator(payable(address(users.alice.deleGator))); + bobDeleGator = MultiSigDeleGator(payable(address(users.bob.deleGator))); + + // Set up multiple signer DeleGator + // NOTE: signers are sorted + sharedDeleGatorSigners = new address[](3); + sharedDeleGatorSigners[0] = users.bob.addr; + sharedDeleGatorSigners[1] = users.alice.addr; + sharedDeleGatorSigners[2] = users.carol.addr; + sharedDeleGatorPrivateKeys = new uint256[](3); + sharedDeleGatorPrivateKeys[0] = users.bob.privateKey; + sharedDeleGatorPrivateKeys[1] = users.alice.privateKey; + sharedDeleGatorPrivateKeys[2] = users.carol.privateKey; + sharedDeleGator = MultiSigDeleGator(payable(deployDeleGator_MultiSig(sharedDeleGatorSigners, 3))); + vm.deal(address(sharedDeleGator), 100 ether); + vm.label(address(sharedDeleGator), "DeleGator with 3 signers"); + + // Create a Counter owned by the MultiSig + sharedDeleGatorCounter = new Counter(address(sharedDeleGator)); + } + + ////////////////////// Basic Functionality ////////////////////// + + // should allow retrieval of the maximum threshold + function test_allow_getMaxSigners() public { + uint256 threshold_ = aliceDeleGator.MAX_NUMBER_OF_SIGNERS(); + assertEq(threshold_, MAX_NUMBER_OF_SIGNERS); + } + + // should return if an address is a valid signer + function test_return_ifAnAddressIsAValidSigner() public { + assertTrue(MultiSigDeleGator(payable(address(users.alice.deleGator))).isSigner(users.alice.addr)); + assertFalse(MultiSigDeleGator(payable(address(users.alice.deleGator))).isSigner(users.bob.addr)); + } + + // The implementation starts with the max threshold + function test_ImplementationUsesMaxThreshold() public { + assertEq(multiSigDeleGatorImpl.getThreshold(), type(uint256).max); + } + + // should return the count of signers + function test_allow_getSignersCount() public { + assertEq(MultiSigDeleGator(payable(address(users.alice.deleGator))).getSignersCount(), 1); + } + + // should allow a no-op for deploying SCA through initcode + function test_allow_deploySCAWithInitCode() public { + // Get predicted address and bytecode for a new MultiSigDeleGator + address[] memory signers_ = new address[](1); + signers_[0] = users.bob.addr; + + bytes32 salt = keccak256(abi.encode("salt")); + + bytes memory args_ = + abi.encode(address(multiSigDeleGatorImpl), abi.encodeWithSignature("initialize(address[],uint256)", signers_, 1)); + + bytes32 bytecodeHash_ = hashInitCode(type(DeleGatorProxy).creationCode, args_); + address predictedAddr_ = vm.computeCreate2Address(salt, bytecodeHash_, address(simpleFactory)); + + // Get initcode for a new MultiSigDeleGator + bytes memory initcode_ = abi.encodePacked( + address(simpleFactory), + abi.encodeWithSelector(SimpleFactory.deploy.selector, abi.encodePacked(type(DeleGatorProxy).creationCode, args_), salt) + ); + + // Give the new MultiSigDeleGator some funds to pay for the action + vm.deal(predictedAddr_, 100); + + // Preload the EntryPoint with funds for the new MultiSigDeleGator + vm.prank(users.alice.addr); + entryPoint.depositTo{ value: 5 ether }(predictedAddr_); + + // Create and Sign UserOp with Bob's key + PackedUserOperation memory userOp_ = createAndSignUserOp(users.bob, predictedAddr_, hex"", initcode_); + + // Validate the contract hasn't been deployed yet + assertEq(predictedAddr_.code, hex""); + + // Submit the UserOp through the Bundler + submitUserOp_Bundler(userOp_); + } + + ////////////////////// Redeeming delegations ////////////////////// + + // should allow Dave to redeem a Delegation through a UserOp when there's multiple signers (onchain) + function test_allow_invokeOnchainDelegationWithMultipleSigners() public { + // Get sharedDeleGator's Counter's initial count + uint256 initialValue_ = sharedDeleGatorCounter.count(); + + // Create delegation + Delegation memory delegation_ = Delegation({ + delegate: address(users.dave.deleGator), + delegator: address(sharedDeleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Store delegation + PackedUserOperation memory userOp_ = + createUserOp(address(sharedDeleGator), abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation_)); + bytes32 userOpHash_ = entryPoint.getUserOpHash(userOp_); + userOp_.signature = SigningUtilsLib.signHash_MultiSig(sharedDeleGatorPrivateKeys, userOpHash_.toEthSignedMessageHash()); + submitUserOp_Bundler(userOp_); + + // Create Dave's action + Action memory action_ = + Action({ to: address(sharedDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Execute Dave's UserOp + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation_; + + invokeDelegation_UserOp(users.dave, delegations_, action_); + + // Get final count + uint256 finalValue_ = sharedDeleGatorCounter.count(); + + // Validate that the count has increased by 1 + assertEq(finalValue_, initialValue_ + 1); + } + + // should allow Dave to redeem a Delegation through a UserOp when there are multiple signers (offchain) + function test_allow_invokeOffchainDelegationWithMultipleSigners() public { + // Get sharedDeleGator's Counter's initial count + uint256 initialValue_ = sharedDeleGatorCounter.count(); + + // Create delegation + Delegation memory delegation_ = Delegation({ + delegate: address(users.dave.deleGator), + delegator: address(sharedDeleGator), + authority: ROOT_AUTHORITY, + caveats: new Caveat[](0), + salt: 0, + signature: hex"" + }); + + // Sign delegation + bytes32 delegationHash_ = EncoderLib._getDelegationHash(delegation_); + bytes32 domainHash_ = delegationManager.getDomainHash(); + bytes32 typedDataHash_ = MessageHashUtils.toTypedDataHash(domainHash_, delegationHash_); + bytes memory signature_ = SigningUtilsLib.signHash_MultiSig(sharedDeleGatorPrivateKeys, typedDataHash_); + delegation_.signature = signature_; + + // Create Dave's action + Action memory action_ = + Action({ to: address(sharedDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Execute Dave's UserOp + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation_; + + invokeDelegation_UserOp(users.dave, delegations_, action_); + + // Get final count + uint256 finalValue_ = sharedDeleGatorCounter.count(); + + // Validate that the count has increased by 1 + assertEq(finalValue_, initialValue_ + 1); + } + + ////////////////////// Signing data ////////////////////// + + // should not allow a signature that is not a valid length + function test_notAllow_invalidSignatureLength() public { + // Configure signers + vm.prank(address(aliceDeleGator)); + aliceDeleGator.updateMultiSigParameters(sharedDeleGatorSigners, 2, true); + + // Get signature + bytes32 hash_ = keccak256("hello world"); + + // Show that a short signature is invalid (SIG_VALIDATION_FAILED = 0xffffffff) + bytes memory signature_ = SigningUtilsLib.signHash_EOA(users.alice.privateKey, hash_); + bytes4 validationData_ = aliceDeleGator.isValidSignature(hash_, signature_); + assertEq(validationData_, bytes4(0xffffffff)); + + // Show that a long signature is invalid (SIG_VALIDATION_FAILED = 0xffffffff) + signature_ = SigningUtilsLib.signHash_EOA(users.alice.privateKey, hash_); + validationData_ = + aliceDeleGator.isValidSignature(hash_, BytesLib.concat(signature_, BytesLib.concat(signature_, signature_))); + assertEq(validationData_, bytes4(0xffffffff)); + } + + // Should revert when passing an empty array of signers to update + function test_error_updateSigParametersInvalidThreshold() public { + // Zero signers + address[] memory signers_ = new address[](0); + + vm.prank(address(aliceDeleGator)); + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.InvalidThreshold.selector)); + aliceDeleGator.updateMultiSigParameters(signers_, 2, false); + } + + // Should revert if same addressess passed in signer + function test_error_updateSigParamatersAlreadyASigner() public { + (address addr_) = makeAddr("newUser"); + + address[] memory signers_ = new address[](2); + signers_[0] = addr_; + signers_[1] = addr_; + + vm.prank(address(aliceDeleGator)); + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.AlreadyASigner.selector)); + aliceDeleGator.updateMultiSigParameters(signers_, 2, false); + } + + // Should revert if new signer is zero + function test_error_updateSigParamatersZeroNewSigner() public { + address[] memory signers_ = new address[](1); + signers_[0] = address(0); + + vm.prank(address(aliceDeleGator)); + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.InvalidSignerAddress.selector)); + aliceDeleGator.updateMultiSigParameters(signers_, 1, false); + } + + // Should revert if new signer is a contract + function test_error_updateSigParamatersContractNewSigner() public { + address[] memory signers_ = new address[](1); + signers_[0] = address(users.dave.deleGator); + + vm.prank(address(aliceDeleGator)); + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.InvalidSignerAddress.selector)); + aliceDeleGator.updateMultiSigParameters(signers_, 1, false); + } + // should not allow a signature that reuses signers + + function test_notAllow_signerReuse() public { + // Configure signers + vm.prank(address(aliceDeleGator)); + aliceDeleGator.updateMultiSigParameters(sharedDeleGatorSigners, 2, true); + + // Get signature + bytes32 hash_ = keccak256("hello world"); + bytes memory signature_ = SigningUtilsLib.signHash_EOA(users.alice.privateKey, hash_); + + // Show that signature is invalid (SIG_VALIDATION_FAILED = 0xffffffff) + bytes4 validationData_ = aliceDeleGator.isValidSignature(hash_, BytesLib.concat(signature_, signature_)); + assertEq(validationData_, bytes4(0xffffffff)); + } + + // should not allow a signature uses completely invalid signers + function test_notAllow_invalidSigners() public { + // Configure signers Alice and Bob + vm.prank(address(aliceDeleGator)); + aliceDeleGator.updateMultiSigParameters(sharedDeleGatorSigners, 2, true); + + // Get signature from Carol + bytes32 hash_ = keccak256("hello world"); + bytes memory carolSignature_ = SigningUtilsLib.signHash_EOA(users.carol.privateKey, hash_); + bytes memory daveSignature_ = SigningUtilsLib.signHash_EOA(users.dave.privateKey, hash_); + + // Show that signature is invalid (SIG_VALIDATION_FAILED = 0xffffffff) + bytes4 validationData_ = aliceDeleGator.isValidSignature(hash_, carolSignature_); + assertEq(validationData_, bytes4(0xffffffff)); + + // Update to a higher threshold + vm.prank(address(aliceDeleGator)); + aliceDeleGator.updateThreshold(2); + + // Show that signature is still invalid (SIG_VALIDATION_FAILED = 0xffffffff) + validationData_ = aliceDeleGator.isValidSignature(hash_, BytesLib.concat(carolSignature_, daveSignature_)); + assertEq(validationData_, bytes4(0xffffffff)); + } + + ////////////////////// Events ////////////////////// + + function test_DelegationManagerSetEvent() public { + vm.expectEmit(true, true, true, true); + emit SetDelegationManager(delegationManager); + new MultiSigDeleGator(delegationManager, entryPoint); + } + + function test_InitializedSignersEvents() public { + emit AddedSigner(sharedDeleGatorSigners[0]); + vm.expectEmit(true, true, true, true); + emit AddedSigner(sharedDeleGatorSigners[1]); + vm.expectEmit(true, true, true, true); + emit AddedSigner(sharedDeleGatorSigners[2]); + emit UpdatedThreshold(1); + vm.expectEmit(true, true, true, true); + emit Initialized(1); + new DeleGatorProxy( + address(multiSigDeleGatorImpl), abi.encodeWithSignature("initialize(address[],uint256)", sharedDeleGatorSigners, 1) + ); + } + + function test_InitializedImplementationEvent() public { + vm.expectEmit(true, true, true, true); + emit UpdatedThreshold(type(uint256).max); + new MultiSigDeleGator(delegationManager, entryPoint); + } + + function test_ReinitializedSignersEvents() public { + address[] memory owners_ = new address[](2); + owners_[0] = users.carol.addr; + owners_[1] = users.dave.addr; + + // Replace the signers + vm.startPrank(address(aliceDeleGator)); + emit AddedSigner(owners_[0]); + vm.expectEmit(true, true, true, true); + emit AddedSigner(owners_[1]); + vm.expectEmit(true, true, true, true); + emit UpdatedThreshold(2); + vm.expectEmit(true, true, true, true); + emit Initialized(2); + aliceDeleGator.reinitialize(2, owners_, 2, false); + } + + ////////////////////// Errors ////////////////////// + + // should not allow a threshold greater than the number of signers + function test_error_Init_thresholdGreaterThanSigners() public { + // Configure delegator + address[] memory signers_ = new address[](10); + (signers_,) = _createMultipleSigners(10, false); + uint256 threshold_ = signers_.length + 1; + + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.InvalidThreshold.selector)); + new DeleGatorProxy( + address(multiSigDeleGatorImpl), abi.encodeWithSignature("initialize(address[],uint256)", signers_, threshold_) + ); + } + + function test_error_Init_InvalidSignersLength() public { + // Zero signers + address[] memory signers_ = new address[](0); + + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.InvalidThreshold.selector)); + new DeleGatorProxy(address(multiSigDeleGatorImpl), abi.encodeWithSignature("initialize(address[],uint256)", signers_, 0)); + + // More than max signers + signers_ = new address[](MAX_NUMBER_OF_SIGNERS + 1); + (signers_,) = _createMultipleSigners(MAX_NUMBER_OF_SIGNERS + 1, false); + + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.TooManySigners.selector)); + new DeleGatorProxy( + address(multiSigDeleGatorImpl), + abi.encodeWithSignature("initialize(address[],uint256)", signers_, MAX_NUMBER_OF_SIGNERS + 1) + ); + } + + function test_error_Init_InvalidThreshold() public { + // Creating 1 of 1 MultiSigDeleGator + (address addr_) = makeAddr("newUser"); + address[] memory signers_ = new address[](1); + signers_[0] = addr_; + + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.InvalidThreshold.selector)); + + // should throw when Threshold is 0 + DeleGatorProxy proxy = new DeleGatorProxy( + address(multiSigDeleGatorImpl), abi.encodeWithSignature("initialize(address[],uint256)", signers_, 0) + ); + + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.InvalidThreshold.selector)); + // should throw when Threshold greater than no. of signers + proxy = new DeleGatorProxy( + address(multiSigDeleGatorImpl), abi.encodeWithSignature("initialize(address[],uint256)", signers_, 2) + ); + } + + // Should revert if Signer address is Zero Address + function test_error_Init_InvalidSignerAddress() public { + // 1 of 1 MultiSigDeleGator + + address[] memory signers_ = new address[](1); + signers_[0] = address(0); + + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.InvalidSignerAddress.selector)); + + // should throw when Threshold is 0 + new DeleGatorProxy(address(multiSigDeleGatorImpl), abi.encodeWithSignature("initialize(address[],uint256)", signers_, 1)); + } + + // Should revert if same addressess passed in signer + function test_error_Init_AlreadyASigner() public { + // 1 of 1 MultiSigDeleGator + + (address addr_) = makeAddr("newUser"); + + address[] memory signers_ = new address[](2); + signers_[0] = addr_; + signers_[1] = addr_; + + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.AlreadyASigner.selector)); + + // should throw when Threshold is 0 + new DeleGatorProxy(address(multiSigDeleGatorImpl), abi.encodeWithSignature("initialize(address[],uint256)", signers_, 1)); + } + + ////////////////////// Updating MultiSig Parameters ////////////////////// + + // should allow Alice to clear and add new signers + function test_reinitialize_clearsAndSetSigners() public { + address[] memory oldSigners_ = aliceDeleGator.getSigners(); + assertEq(oldSigners_[0], users.alice.addr); + assertEq(oldSigners_.length, 1); + + address[] memory owners_ = new address[](2); + owners_[0] = users.carol.addr; + owners_[1] = users.dave.addr; + + // Replace the signers + vm.startPrank(address(aliceDeleGator)); + aliceDeleGator.reinitialize(2, owners_, 2, true); + + address[] memory newSigners_ = aliceDeleGator.getSigners(); + assertEq(newSigners_[0], users.carol.addr); + assertEq(newSigners_[1], users.dave.addr); + assertEq(newSigners_.length, 2); + } + + // should allow Alice to keep and add new signers + function test_reinitialize_keepAndSetSigners() public { + address[] memory oldSigners_ = aliceDeleGator.getSigners(); + assertEq(oldSigners_[0], users.alice.addr); + assertEq(oldSigners_.length, 1); + + address[] memory owners_ = new address[](2); + owners_[0] = users.carol.addr; + owners_[1] = users.dave.addr; + + // Adds the new signers + vm.startPrank(address(aliceDeleGator)); + aliceDeleGator.reinitialize(2, owners_, 2, false); + + address[] memory newSigners_ = aliceDeleGator.getSigners(); + assertEq(newSigners_[0], users.alice.addr); + assertEq(newSigners_[1], users.carol.addr); + assertEq(newSigners_[2], users.dave.addr); + assertEq(newSigners_.length, 3); + } + + // should allow Alice to replace a signer + function test_allow_replaceSigner() public { + address[] memory preSigners_ = aliceDeleGator.getSigners(); + + assertEq(preSigners_[0], users.alice.addr); + + vm.startPrank(address(aliceDeleGator)); + + // Replace the only signer + vm.expectEmit(true, true, true, true, address(aliceDeleGator)); + emit ReplacedSigner(users.alice.addr, users.bob.addr); + aliceDeleGator.replaceSigner(users.alice.addr, users.bob.addr); + address[] memory postSigners_ = aliceDeleGator.getSigners(); + assertEq(postSigners_[0], users.bob.addr); + assertFalse(preSigners_[0] == postSigners_[0]); + + // Add a few signers so we can test more cases + aliceDeleGator.addSigner(users.alice.addr); + aliceDeleGator.addSigner(users.carol.addr); + + // Replace first signer + vm.expectEmit(true, true, true, true, address(aliceDeleGator)); + emit ReplacedSigner(users.bob.addr, users.dave.addr); + aliceDeleGator.replaceSigner(users.bob.addr, users.dave.addr); + postSigners_ = aliceDeleGator.getSigners(); + assertEq(postSigners_[0], users.dave.addr); + assertEq(postSigners_[1], users.alice.addr); + assertEq(postSigners_[2], users.carol.addr); + assertEq(postSigners_.length, 3); + + // Replace middle signer + vm.expectEmit(true, true, true, true, address(aliceDeleGator)); + emit ReplacedSigner(users.alice.addr, users.eve.addr); + aliceDeleGator.replaceSigner(users.alice.addr, users.eve.addr); + postSigners_ = aliceDeleGator.getSigners(); + assertEq(postSigners_[0], users.dave.addr); + assertEq(postSigners_[1], users.eve.addr); + assertEq(postSigners_[2], users.carol.addr); + assertEq(postSigners_.length, 3); + + // Replace last signer + vm.expectEmit(true, true, true, true, address(aliceDeleGator)); + emit ReplacedSigner(users.carol.addr, users.frank.addr); + aliceDeleGator.replaceSigner(users.carol.addr, users.frank.addr); + postSigners_ = aliceDeleGator.getSigners(); + assertEq(postSigners_[0], users.dave.addr); + assertEq(postSigners_[1], users.eve.addr); + assertEq(postSigners_[2], users.frank.addr); + assertEq(postSigners_.length, 3); + } + + function test_notAllow_replaceSigner() public { + address[] memory preSigners_ = aliceDeleGator.getSigners(); + + assertEq(preSigners_[0], users.alice.addr); + + // Don't allow someone else to replace Alice's MultiSigDeleGator's signers + // replaceSigner call must come from the MultiSigDeleGator itself + vm.prank(address(users.alice.addr)); + vm.expectRevert(abi.encodeWithSelector(IDeleGatorCoreFull.NotEntryPointOrSelf.selector)); + aliceDeleGator.replaceSigner(users.alice.addr, users.bob.addr); + + // Mock calls from the MultiSigDeleGator itself + vm.startPrank(address(aliceDeleGator)); + + // Don't allow replacing a non-signer + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.NotASigner.selector)); + aliceDeleGator.replaceSigner(users.bob.addr, users.bob.addr); + + // Don't allow replacing with an existing signer + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.AlreadyASigner.selector)); + aliceDeleGator.replaceSigner(users.alice.addr, users.alice.addr); + + // Don't allow replacing with the zero address + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.InvalidSignerAddress.selector)); + aliceDeleGator.replaceSigner(users.alice.addr, address(0)); + + // Don't allow replacing with a contract signer + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.InvalidSignerAddress.selector)); + aliceDeleGator.replaceSigner(users.alice.addr, address(users.dave.deleGator)); + + // Don't allow replacing with the address of the DeleGator + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.InvalidSignerAddress.selector)); + aliceDeleGator.replaceSigner(users.alice.addr, address(aliceDeleGator)); + } + + // should allow Alice to add a signer + function test_allow_addSigner() public { + address[] memory preSigners_ = aliceDeleGator.getSigners(); + + assertEq(preSigners_[0], users.alice.addr); + assertEq(preSigners_.length, 1); + + vm.prank(address(aliceDeleGator)); + vm.expectEmit(true, true, true, true, address(aliceDeleGator)); + emit AddedSigner(users.bob.addr); + aliceDeleGator.addSigner(users.bob.addr); + + address[] memory postSigners_ = aliceDeleGator.getSigners(); + + assertEq(postSigners_[0], users.alice.addr); + assertEq(postSigners_[1], users.bob.addr); + assertEq(postSigners_.length, 2); + } + + function test_notAllow_addSigner() public { + address[] memory preSigners_ = aliceDeleGator.getSigners(); + + assertEq(preSigners_[0], users.alice.addr); + + // Don't allow someone else to remove signers. + // Call must come from the MultiSigDeleGator itself. + vm.prank(address(users.alice.addr)); + vm.expectRevert(abi.encodeWithSelector(IDeleGatorCoreFull.NotEntryPointOrSelf.selector)); + aliceDeleGator.addSigner(users.bob.addr); + + // Mock calls from the MultiSigDeleGator itself + vm.startPrank(address(aliceDeleGator)); + + // Don't allow adding with the zero address + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.InvalidSignerAddress.selector)); + aliceDeleGator.addSigner(address(0)); + + // Don't allow adding a contract signer + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.InvalidSignerAddress.selector)); + aliceDeleGator.addSigner(address(users.dave.deleGator)); + + // Don't allow adding with the address of the DeleGator + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.InvalidSignerAddress.selector)); + aliceDeleGator.addSigner(address(aliceDeleGator)); + + // Don't allow adding an existing signer + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.AlreadyASigner.selector)); + aliceDeleGator.addSigner(users.alice.addr); + + // Don't allow adding too many signers + for (uint256 i = 0; i < MAX_NUMBER_OF_SIGNERS; ++i) { + if (i == MAX_NUMBER_OF_SIGNERS - 1) { + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.TooManySigners.selector)); + } + aliceDeleGator.addSigner(makeAddr(Strings.toString(i))); + } + } + + // should allow Alice to remove a signer + function test_allow_removeSigner() public { + vm.startPrank(address(aliceDeleGator)); + + // Adding signers so there's some to remove. + aliceDeleGator.addSigner(users.bob.addr); + aliceDeleGator.addSigner(users.carol.addr); + aliceDeleGator.addSigner(users.dave.addr); + aliceDeleGator.addSigner(users.eve.addr); + + address[] memory preSigners_ = aliceDeleGator.getSigners(); + assertEq(preSigners_[0], users.alice.addr); + assertEq(preSigners_[1], users.bob.addr); + assertEq(preSigners_[2], users.carol.addr); + assertEq(preSigners_[3], users.dave.addr); + assertEq(preSigners_[4], users.eve.addr); + assertEq(preSigners_.length, 5); + + // Remove the first signer in storage + vm.expectEmit(true, true, true, true, address(aliceDeleGator)); + emit RemovedSigner(users.alice.addr); + aliceDeleGator.removeSigner(users.alice.addr); + address[] memory postSigners_ = aliceDeleGator.getSigners(); + assertEq(postSigners_[0], users.eve.addr); + assertEq(postSigners_[1], users.bob.addr); + assertEq(postSigners_[2], users.carol.addr); + assertEq(postSigners_[3], users.dave.addr); + assertEq(postSigners_.length, 4); + + // Remove the last signer in storage + vm.expectEmit(true, true, true, true, address(aliceDeleGator)); + emit RemovedSigner(users.dave.addr); + aliceDeleGator.removeSigner(users.dave.addr); + postSigners_ = aliceDeleGator.getSigners(); + assertEq(postSigners_[0], users.eve.addr); + assertEq(postSigners_[1], users.bob.addr); + assertEq(postSigners_[2], users.carol.addr); + assertEq(postSigners_.length, 3); + + // Remove a middle signer + vm.expectEmit(true, true, true, true, address(aliceDeleGator)); + emit RemovedSigner(users.bob.addr); + aliceDeleGator.removeSigner(users.bob.addr); + postSigners_ = aliceDeleGator.getSigners(); + assertEq(postSigners_[0], users.eve.addr); + assertEq(postSigners_[1], users.carol.addr); + assertEq(postSigners_.length, 2); + } + + function test_notAllow_removeSigner() public { + // Don't allow someone else to remove signers. + // Call must come from the MultiSigDeleGator itself. + vm.prank(address(users.alice.addr)); + vm.expectRevert(abi.encodeWithSelector(IDeleGatorCoreFull.NotEntryPointOrSelf.selector)); + aliceDeleGator.removeSigner(users.alice.addr); + + // Mock calls from the MultiSigDeleGator itself + vm.startPrank(address(aliceDeleGator)); + + // Don't allow removing the last signer + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.InsufficientSigners.selector)); + aliceDeleGator.removeSigner(users.alice.addr); + + // Don't allow removing non signers + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.NotASigner.selector)); + aliceDeleGator.removeSigner(users.bob.addr); + + // Don't allow less signers than the threshold + aliceDeleGator.addSigner(users.bob.addr); + aliceDeleGator.updateThreshold(2); + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.InsufficientSigners.selector)); + aliceDeleGator.removeSigner(users.bob.addr); + } + + function test_allow_updatingThreshold() public { + uint256 preThreshold_ = aliceDeleGator.getThreshold(); + assertEq(preThreshold_, 1); + + // Mock calls from the MultiSigDeleGator itself + vm.startPrank(address(aliceDeleGator)); + + // Add a signer so we can increase the threshold + aliceDeleGator.addSigner(users.bob.addr); + + // Increase the threshold + vm.expectEmit(true, true, true, true, address(aliceDeleGator)); + emit UpdatedThreshold(2); + aliceDeleGator.updateThreshold(2); + + uint256 postThreshold_ = aliceDeleGator.getThreshold(); + assertEq(postThreshold_, 2); + } + + function test_notAllow_updatingThreshold() public { + // Don't allow someone else to remove signers. + // Call must come from the MultiSigDeleGator itself. + vm.prank(address(users.alice.addr)); + vm.expectRevert(abi.encodeWithSelector(IDeleGatorCoreFull.NotEntryPointOrSelf.selector)); + aliceDeleGator.updateThreshold(1); + + uint256 preThreshold_ = aliceDeleGator.getThreshold(); + assertEq(preThreshold_, 1); + + // Mock calls from the MultiSigDeleGator itself + vm.startPrank(address(aliceDeleGator)); + + // Add a signer so we can increase the threshold + aliceDeleGator.addSigner(users.bob.addr); + + // Don't allow a threshold of 0 + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.InvalidThreshold.selector)); + aliceDeleGator.updateThreshold(0); + + // Don't allow a threshold greater than number of signers + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.InvalidThreshold.selector)); + aliceDeleGator.updateThreshold(3); + } + + // should only allow Alice's MultiSigDeleGator to call updateMultiSigParameters + function test_notAllow_updateMultiSigParameters_access() public { + address[] memory signers_ = new address[](2); + signers_[0] = users.alice.addr; + signers_[1] = users.bob.addr; + + // Don't allow Alice to update Alice's MultiSigDeleGator's signers + vm.prank(address(users.alice.addr)); + vm.expectRevert(abi.encodeWithSelector(IDeleGatorCoreFull.NotEntryPointOrSelf.selector)); + aliceDeleGator.updateMultiSigParameters(signers_, 1, false); + + // Don't allow Bob to update Alice's MultiSigDeleGator's signers + vm.prank(address(users.bob.addr)); + vm.expectRevert(abi.encodeWithSelector(IDeleGatorCoreFull.NotEntryPointOrSelf.selector)); + aliceDeleGator.updateMultiSigParameters(signers_, 1, false); + + // Don't allow Bob's MultiSigDeleGator to update Alice's MultiSigDeleGator's signers + vm.prank(address(bobDeleGator)); + vm.expectRevert(abi.encodeWithSelector(IDeleGatorCoreFull.NotEntryPointOrSelf.selector)); + aliceDeleGator.updateMultiSigParameters(signers_, 1, false); + } + + // should not allow Alice's MultiSigDeleGator to update with an invalid threshold + function test_notAllow_updateMultiSigParameters_threshold() public { + address[] memory signers_ = new address[](2); + signers_[0] = users.alice.addr; + signers_[1] = users.bob.addr; + + // Don't allow a threshold of 0 + vm.prank(address(aliceDeleGator)); + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.InvalidThreshold.selector)); + aliceDeleGator.updateMultiSigParameters(signers_, 0, true); + + // Don't allow a threshold greater than the number of existing signers + new signers + vm.prank(address(aliceDeleGator)); + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.InvalidThreshold.selector)); + aliceDeleGator.updateMultiSigParameters(signers_, signers_.length + 1, true); + } + + // should not allow Alice's MultiSigDeleGator to update with an invalid threshold while keeping the signers + function test_notAllow_updateMultiSigParameters_thresholdKeepingSigners() public { + address[] memory signers_ = new address[](2); + signers_[0] = users.alice.addr; + signers_[1] = users.bob.addr; + + uint256 amountOfSigners_ = aliceDeleGator.getSigners().length; + // Don't allow a threshold greater than the number of signers + vm.prank(address(aliceDeleGator)); + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.InvalidThreshold.selector)); + aliceDeleGator.updateMultiSigParameters(signers_, amountOfSigners_ + signers_.length + 1, false); + } + + // should not allow Alice's MultiSigDeleGator to update with a max number of signers + function test_notAllow_updateMultiSigParameters_maxNumberOfSigners() public { + uint256 maxNumberOfSigners_ = aliceDeleGator.MAX_NUMBER_OF_SIGNERS(); + address[] memory signers_ = new address[](maxNumberOfSigners_); + + // Don't allow more signers than the max number of signers, keeping the signers + vm.prank(address(aliceDeleGator)); + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.TooManySigners.selector)); + aliceDeleGator.updateMultiSigParameters(signers_, 1, false); + + // Don't allow more signers than the max number of signers, deleting the signers + signers_ = new address[](maxNumberOfSigners_ + 1); + vm.prank(address(aliceDeleGator)); + vm.expectRevert(abi.encodeWithSelector(MultiSigDeleGator.TooManySigners.selector)); + aliceDeleGator.updateMultiSigParameters(signers_, 1, true); + } + + // should allow the creation of a MultiSig with 3 signers and updating the signers & threshold + function test_allow_updateMultiSigParameters_base() public { + // create a multiSig with 3 signers and threshold of 2 + MultiSigDeleGator deleGator_ = MultiSigDeleGator(payable(deployDeleGator_MultiSig(sharedDeleGatorSigners, 2))); + vm.deal(address(deleGator_), 100 ether); + + address[] memory obtainedSigners_ = deleGator_.getSigners(); + + assertEq(sharedDeleGatorSigners[0], obtainedSigners_[0]); + assertEq(sharedDeleGatorSigners[1], obtainedSigners_[1]); + assertEq(sharedDeleGatorSigners[2], obtainedSigners_[2]); + + // updating carol's address to Dave's address + sharedDeleGatorSigners[2] = users.dave.addr; + + // Update Signers and threshold + bytes memory userOpCallData_ = + abi.encodeWithSelector(MultiSigDeleGator.updateMultiSigParameters.selector, sharedDeleGatorSigners, 3, true); + PackedUserOperation memory userOp_ = createUserOp(address(deleGator_), userOpCallData_); + bytes32 userOpHash_ = entryPoint.getUserOpHash(userOp_); + + // Create a subset of private keys to ensure signature length is accurate + uint256[] memory privateKeysSubset_ = new uint256[](2); + privateKeysSubset_[0] = sharedDeleGatorPrivateKeys[0]; + privateKeysSubset_[1] = sharedDeleGatorPrivateKeys[1]; + userOp_.signature = SigningUtilsLib.signHash_MultiSig(privateKeysSubset_, userOpHash_.toEthSignedMessageHash()); + + PackedUserOperation[] memory userOps_ = new PackedUserOperation[](1); + userOps_[0] = userOp_; + vm.prank(bundler); + + vm.expectEmit(false, false, false, true, address(deleGator_)); + emit RemovedSigner(sharedDeleGatorSigners[0]); + vm.expectEmit(false, false, false, true, address(deleGator_)); + emit RemovedSigner(sharedDeleGatorSigners[1]); + vm.expectEmit(false, false, false, true, address(deleGator_)); + emit RemovedSigner(sharedDeleGatorSigners[2]); + vm.expectEmit(false, false, false, true, address(deleGator_)); + emit AddedSigner(sharedDeleGatorSigners[0]); + vm.expectEmit(false, false, false, true, address(deleGator_)); + emit AddedSigner(sharedDeleGatorSigners[1]); + vm.expectEmit(false, false, false, true, address(deleGator_)); + emit AddedSigner(sharedDeleGatorSigners[2]); + + entryPoint.handleOps(userOps_, bundler); + + obtainedSigners_ = deleGator_.getSigners(); + + assertEq(sharedDeleGatorSigners[0], obtainedSigners_[0]); + assertEq(sharedDeleGatorSigners[1], obtainedSigners_[1]); + assertEq(sharedDeleGatorSigners[2], obtainedSigners_[2]); + + uint256 threshold_ = deleGator_.getThreshold(); + assertEq(threshold_, 3); + } + + // should NOT be able to reinitialize someone elses MultiSigDeleGator + function test_unauthorizedReinitializeCall() public { + // Load DeleGator to manipulate + address payable delegator_ = payable(address(aliceDeleGator)); + + uint64 version_ = IDeleGatorCoreFull(delegator_).getInitializedVersion() + 1; + address[] memory newSigners_ = new address[](1); + newSigners_[0] = users.bob.addr; + + vm.prank(users.bob.addr); + vm.expectRevert(abi.encodeWithSelector(IDeleGatorCoreFull.NotEntryPointOrSelf.selector)); + MultiSigDeleGator(delegator_).reinitialize(version_, newSigners_, 1, false); + } + + ////////////////////// Helpers ////////////////////// + + function _createMultipleSigners(uint256 _numOfSigners, bool _sort) internal returns (address[] memory, uint256[] memory) { + address[] memory signers_ = new address[](_numOfSigners); + uint256[] memory privateKeys_ = new uint256[](_numOfSigners); + + for (uint256 i = 0; i < _numOfSigners; ++i) { + (address addr_, uint256 privateKey_) = makeAddrAndKey(Strings.toString(i)); + signers_[i] = addr_; + privateKeys_[i] = privateKey_; + } + if (!_sort) return (signers_, privateKeys_); + + (signers_, privateKeys_) = AccountSorterLib.sortAddressesWithPrivateKeys(signers_, privateKeys_); + return (signers_, privateKeys_); + } +} diff --git a/test/ProxyMigrationTest.t.sol b/test/ProxyMigrationTest.t.sol new file mode 100644 index 0000000..e081816 --- /dev/null +++ b/test/ProxyMigrationTest.t.sol @@ -0,0 +1,192 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { FCL_ecdsa_utils } from "@freshCryptoLib/FCL_ecdsa_utils.sol"; +import { MessageHashUtils } from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; +import { BytesLib } from "@bytes-utils/BytesLib.sol"; +import { MessageHashUtils } from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; + +import { SigningUtilsLib } from "./utils/SigningUtilsLib.t.sol"; +import { StorageUtilsLib } from "./utils/StorageUtilsLib.t.sol"; +import { Implementation, SignatureType } from "./utils/Types.t.sol"; +import { Action, PackedUserOperation, Caveat, Delegation, Delegation } from "../src/utils/Types.sol"; +import { BaseTest } from "./utils/BaseTest.t.sol"; +import { HybridDeleGator } from "../src/HybridDeleGator.sol"; +import { MultiSigDeleGator } from "../src/MultiSigDeleGator.sol"; +import { IDeleGatorCoreFull } from "../src/interfaces/IDeleGatorCoreFull.sol"; +import { IDelegationManager } from "../src/interfaces/IDelegationManager.sol"; +import { EncoderLib } from "../src/libraries/EncoderLib.sol"; + +contract HybridDeleGator_Test is BaseTest { + using MessageHashUtils for bytes32; + + event ClearedStorage(); + + ////////////////////// Configure BaseTest ////////////////////// + + constructor() { + IMPLEMENTATION = Implementation.Hybrid; + SIGNATURE_TYPE = SignatureType.RawP256; + } + + ////////////////////////////// Tests ////////////////////////////// + + // should accurately switch between implementations several times + function test_upgradeMultipleTimes() public { + // Load storage locations + bytes32 INITIALIZABLE_STORAGE_LOCATION = StorageUtilsLib.getStorageLocation("openzeppelin.storage.Initializable"); + + // Create a MultiSigDeleGator to manipulate + address payable deleGator_ = payable(address(deployDeleGator_MultiSig(users.alice))); + vm.label(deleGator_, "DeleGator"); + vm.deal(deleGator_, 100 ether); + + // Assert DeleGator is MultiSig + assertEq(address(IDeleGatorCoreFull(deleGator_).getImplementation()), address(multiSigDeleGatorImpl)); + + // Upgrade to Hybrid + Action memory action_ = Action({ + to: address(deleGator_), + value: 0, + data: abi.encodeWithSelector( + IDeleGatorCoreFull.upgradeToAndCall.selector, + address(hybridDeleGatorImpl), + abi.encodeWithSelector( + HybridDeleGator.reinitialize.selector, + IDeleGatorCoreFull(deleGator_).getInitializedVersion() + 1, + users.alice.addr, + new string[](0), + new uint256[](0), + new uint256[](0), + false + ) + ) + }); + bytes memory userOpCallData_ = abi.encodeWithSelector(IDeleGatorCoreFull.execute.selector, action_); + PackedUserOperation memory userOp_ = createUserOp(address(deleGator_), userOpCallData_); + bytes32 userOpHash_ = entryPoint.getUserOpHash(userOp_); + userOp_.signature = signHash(SignatureType.MultiSig, users.alice, userOpHash_.toEthSignedMessageHash()); + + vm.expectEmit(); + emit ClearedStorage(); + + submitUserOp_Bundler(userOp_); + + // Assert DeleGator is Hybrid + assertEq(address(IDeleGatorCoreFull(deleGator_).getImplementation()), address(hybridDeleGatorImpl)); + + // Assert MultiSig storage was cleared + bytes32 DEFAULT_MULTISIG_DELEGATOR_STORAGE_LOCATION = StorageUtilsLib.getStorageLocation("DeleGator.MultiSigDeleGator"); + address[] memory owners_ = + StorageUtilsLib.loadFullArray(deleGator_, uint256(DEFAULT_MULTISIG_DELEGATOR_STORAGE_LOCATION) + 1); + assertEq(owners_.length, 0); + assertEq(vm.load(deleGator_, bytes32(uint256(DEFAULT_MULTISIG_DELEGATOR_STORAGE_LOCATION) + 1)), 0); + + // Initializable version should have increased by 1 + bytes memory initializableStorage_ = abi.encode(vm.load(deleGator_, INITIALIZABLE_STORAGE_LOCATION)); + assertEq(2, BytesLib.toUint64(initializableStorage_, 24)); + assertEq(false, StorageUtilsLib.toBool(initializableStorage_, 23)); + + // Assert Hybrid storage was configured properly + address hybridOwner_ = HybridDeleGator(deleGator_).owner(); + assertEq(users.alice.addr, hybridOwner_); + + // Upgrade to MultiSig + owners_ = new address[](1); + owners_[0] = users.alice.addr; + action_ = Action({ + to: address(deleGator_), + value: 0, + data: abi.encodeWithSelector( + IDeleGatorCoreFull.upgradeToAndCall.selector, + address(multiSigDeleGatorImpl), + abi.encodeWithSelector( + MultiSigDeleGator.reinitialize.selector, + IDeleGatorCoreFull(deleGator_).getInitializedVersion() + 1, + owners_, + 1, + false + ) + ) + }); + userOpCallData_ = abi.encodeWithSelector(IDeleGatorCoreFull.execute.selector, action_); + userOp_ = createUserOp(address(deleGator_), userOpCallData_); + userOpHash_ = entryPoint.getUserOpHash(userOp_); + userOp_.signature = signHash(SignatureType.EOA, users.alice, userOpHash_.toEthSignedMessageHash()); + + vm.expectEmit(); + emit ClearedStorage(); + + submitUserOp_Bundler(userOp_); + + // Assert DeleGator is MultiSig + assertEq(address(IDeleGatorCoreFull(deleGator_).getImplementation()), address(multiSigDeleGatorImpl)); + + // Assert Hybrid storage was cleared + bytes32 DEFAULT_HYBRID_DELEGATOR_STORAGE_LOCATION = StorageUtilsLib.getStorageLocation("DeleGator.HybridDeleGator"); + bytes32 hybridMemoryAfter_ = vm.load(deleGator_, DEFAULT_HYBRID_DELEGATOR_STORAGE_LOCATION); + assertEq(0, hybridMemoryAfter_); + + // Initializable version should have increased by 1 + initializableStorage_ = abi.encode(vm.load(deleGator_, INITIALIZABLE_STORAGE_LOCATION)); + assertEq(3, BytesLib.toUint64(initializableStorage_, 24)); + assertEq(false, StorageUtilsLib.toBool(initializableStorage_, 23)); + + // Assert MultiSig storage was configured properly + assertEq(users.alice.addr, MultiSigDeleGator(deleGator_).getSigners()[0]); + assertEq(1, MultiSigDeleGator(deleGator_).getThreshold()); + } + + function test_upgradeWithoutStorageCleanup() public { + // Load storage locations + bytes32 INITIALIZABLE_STORAGE_LOCATION = StorageUtilsLib.getStorageLocation("openzeppelin.storage.Initializable"); + + // Create a MultiSigDeleGator to manipulate + address payable deleGator_ = payable(address(deployDeleGator_MultiSig(users.alice))); + vm.label(deleGator_, "DeleGator"); + vm.deal(deleGator_, 100 ether); + + // Assert DeleGator is MultiSig + assertEq(address(IDeleGatorCoreFull(deleGator_).getImplementation()), address(multiSigDeleGatorImpl)); + + // Upgrade to Hybrid + Action memory action_ = Action({ + to: address(deleGator_), + value: 0, + data: abi.encodeWithSelector( + IDeleGatorCoreFull.upgradeToAndCallAndRetainStorage.selector, + address(hybridDeleGatorImpl), + abi.encodeWithSelector( + HybridDeleGator.reinitialize.selector, + IDeleGatorCoreFull(deleGator_).getInitializedVersion() + 1, + users.alice.addr, + new string[](0), + new uint256[](0), + new uint256[](0), + false + ) + ) + }); + bytes memory userOpCallData_ = abi.encodeWithSelector(IDeleGatorCoreFull.execute.selector, action_); + PackedUserOperation memory userOp_ = createUserOp(address(deleGator_), userOpCallData_); + bytes32 userOpHash_ = entryPoint.getUserOpHash(userOp_); + userOp_.signature = signHash(SignatureType.MultiSig, users.alice, userOpHash_.toEthSignedMessageHash()); + + submitUserOp_Bundler(userOp_); + + // Assert DeleGator is Hybrid + assertEq(address(IDeleGatorCoreFull(deleGator_).getImplementation()), address(hybridDeleGatorImpl)); + + // Assert MultiSig storage was not cleared + bytes32 DEFAULT_MULTISIG_DELEGATOR_STORAGE_LOCATION = StorageUtilsLib.getStorageLocation("DeleGator.MultiSigDeleGator"); + address[] memory owners_ = + StorageUtilsLib.loadFullArray(deleGator_, uint256(DEFAULT_MULTISIG_DELEGATOR_STORAGE_LOCATION) + 1); + assertEq(owners_.length, 1); + + // Initializable version should have increased by 1 + bytes memory initializableStorage_ = abi.encode(vm.load(deleGator_, INITIALIZABLE_STORAGE_LOCATION)); + assertEq(2, BytesLib.toUint64(initializableStorage_, 24)); + assertEq(false, StorageUtilsLib.toBool(initializableStorage_, 23)); + } +} diff --git a/test/enforcers/AllowedCalldataEnforcer.t.sol b/test/enforcers/AllowedCalldataEnforcer.t.sol new file mode 100644 index 0000000..1b5f32d --- /dev/null +++ b/test/enforcers/AllowedCalldataEnforcer.t.sol @@ -0,0 +1,273 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import "forge-std/Test.sol"; +import "forge-std/console2.sol"; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { BytesLib } from "@bytes-utils/BytesLib.sol"; + +import { Counter } from "../utils/Counter.t.sol"; +import { Action, Caveat, Delegation, Delegation } from "../../src/utils/Types.sol"; +import { CaveatEnforcerBaseTest } from "./CaveatEnforcerBaseTest.t.sol"; +import { AllowedCalldataEnforcer } from "../../src/enforcers/AllowedCalldataEnforcer.sol"; +import { IDelegationManager } from "../../src/interfaces/IDelegationManager.sol"; +import { EncoderLib } from "../../src/libraries/EncoderLib.sol"; +import { BasicERC20, IERC20 } from "../utils/BasicERC20.t.sol"; +import { BasicCF721 } from "../utils/BasicCF721.t.sol"; +import { ICaveatEnforcer } from "../../src/interfaces/ICaveatEnforcer.sol"; + +contract DummyContract { + function stringFn(uint256[] calldata _str) public { } + function arrayFn(string calldata _str) public { } +} + +contract AllowedCalldataEnforcerTest is CaveatEnforcerBaseTest { + ////////////////////////////// State ////////////////////////////// + AllowedCalldataEnforcer public allowedCalldataEnforcer; + BasicERC20 public basicCF20; + BasicCF721 public basicCF721; + + ////////////////////// Set up ////////////////////// + + function setUp() public override { + super.setUp(); + allowedCalldataEnforcer = new AllowedCalldataEnforcer(); + vm.label(address(allowedCalldataEnforcer), "Equal Parameters Enforcer"); + basicCF20 = new BasicERC20(address(users.alice.deleGator), "TestToken1", "TestToken1", 100 ether); + basicCF721 = new BasicCF721(address(users.alice.deleGator), "TestNFT", "TestNFT", ""); + } + + ////////////////////// Valid cases ////////////////////// + + // should allow a single method to be called when a single function parameter is equal + function test_singleMethodCanBeCalledWithEqualParam() public { + // Create the action that would be executed + Action memory action_ = Action({ + to: address(basicCF20), + value: 0, + data: abi.encodeWithSelector(BasicERC20.mint.selector, address(users.alice.deleGator), uint256(100)) + }); + + // beforeHook, mimicking the behavior of Alice's DeleGator + uint256 paramStart_ = abi.encodeWithSelector(BasicERC20.mint.selector, address(0)).length; + uint256 paramValue_ = 100; + bytes memory inputTerms_ = abi.encodePacked(paramStart_, paramValue_); + + vm.prank(address(delegationManager)); + allowedCalldataEnforcer.beforeHook(inputTerms_, hex"", action_, keccak256(""), address(0), address(0)); + } + + // should allow a method to be called when a single function parameter that is a dynamic array + function test_singleMethodCanBeCalledWithEqualDynamicArrayParam() public { + uint256[] memory param = new uint256[](2); + param[0] = 1; + param[1] = 2; + + // Create the action that would be executed + Action memory action_ = + Action({ to: address(0), value: 0, data: abi.encodeWithSelector(DummyContract.arrayFn.selector, param) }); + + // The subset of the calldata that includes the index of the calldata where the dynamic array starts + bytes memory offsetTerms_ = abi.encodePacked(uint256(4), uint256(32)); + // The subset of the calldata that includes the number of elements in the array + bytes memory lengthTerms_ = abi.encodePacked(uint256(36), uint256(2)); + // The subset of the calldata that includes data in the array + bytes memory parameterTerms_ = abi.encodePacked(uint256(68), BytesLib.slice(action_.data, uint256(68), uint256(64))); + + vm.prank(address(delegationManager)); + allowedCalldataEnforcer.beforeHook(offsetTerms_, hex"", action_, keccak256(""), address(0), address(0)); + allowedCalldataEnforcer.beforeHook(lengthTerms_, hex"", action_, keccak256(""), address(0), address(0)); + allowedCalldataEnforcer.beforeHook(parameterTerms_, hex"", action_, keccak256(""), address(0), address(0)); + } + + // should allow a single method to be called when a single function parameter that is dynamic is equal + function test_singleMethodCanBeCalledWithEqualDynamicStringParam() public { + string memory param = "Test string"; + + // Create the action that would be executed + Action memory action_ = + Action({ to: address(0), value: 0, data: abi.encodeWithSelector(DummyContract.arrayFn.selector, param) }); + + // The offset of the string in the calldata + bytes memory offsetTerms_ = abi.encodePacked(uint256(4), uint256(32)); + // The length of the string + bytes memory lengthTerms_ = abi.encodePacked(uint256(36), uint256(11)); + // The string itself + bytes memory parameterTerms_ = abi.encodePacked(uint256(68), BytesLib.slice(action_.data, uint256(68), uint256(32))); + + vm.prank(address(delegationManager)); + allowedCalldataEnforcer.beforeHook(offsetTerms_, hex"", action_, keccak256(""), address(0), address(0)); + allowedCalldataEnforcer.beforeHook(lengthTerms_, hex"", action_, keccak256(""), address(0), address(0)); + allowedCalldataEnforcer.beforeHook(parameterTerms_, hex"", action_, keccak256(""), address(0), address(0)); + } + + // should allow Artist to create NFT specific delegations with metadata caveat + function test_methodCanBeCalledWithSpecificMetadata() public { + string memory metadataUrl_ = "ipfs://bafybeigxsy55qgbdqw44y5yrs2jhhk2kdn7vbt6y4myvhcwdjak6cwj464/3762"; + + // The Action with the mint calldata that would be executed + bytes memory encodedData_ = + abi.encodeWithSelector(BasicCF721.mintWithMetadata.selector, address(users.bob.deleGator), metadataUrl_); + Action memory action_ = Action({ to: address(basicCF721), value: 0, data: encodedData_ }); + + // Calculate the start and length of the metadata bytes within the calldata + bytes memory encodedMetadataString_ = abi.encode(metadataUrl_); + bytes32 start_ = bytes32(abi.encodeWithSelector(BasicCF721.mintWithMetadata.selector, address(users.bob.deleGator)).length); + bytes32 length_ = bytes32(encodedMetadataString_.length); + + vm.prank(address(delegationManager)); + // NOTE: Using encodedData_ not encodedMetadataString_ to ensure the value for the offset is correct + bytes memory allowedCalldata_ = abi.encodePacked(start_, BytesLib.slice(encodedData_, uint256(start_), uint256(length_))); + allowedCalldataEnforcer.beforeHook(allowedCalldata_, hex"", action_, keccak256(""), address(0), address(0)); + } + + ////////////////////// Invalid cases ////////////////////// + + // should NOT allow a method to be called when a single function parameter is not equal + function test_singleMethodCanNotCalledWithNonEqualParam() public { + // Create the action that would be executed + Action memory action_ = Action({ + to: address(basicCF20), + value: 0, + data: abi.encodeWithSelector(BasicERC20.mint.selector, address(users.alice.deleGator), uint256(200)) + }); + + // beforeHook, mimicking the behavior of Alice's DeleGator + uint256 paramStart_ = abi.encodeWithSelector(BasicERC20.mint.selector, address(0)).length; + uint256 paramValue_ = 100; + bytes memory inputTerms_ = abi.encodePacked(paramStart_, paramValue_); + + vm.prank(address(delegationManager)); + vm.expectRevert("AllowedCalldataEnforcer:invalid-calldata"); + allowedCalldataEnforcer.beforeHook(inputTerms_, hex"", action_, keccak256(""), address(0), address(0)); + } + + // should NOT allow to pass an invalid calldata length (invalid terms) + function test_failsWithInvalidTermsLength() public { + // Create the action that would be executed + Action memory action_ = Action({ + to: address(basicCF20), + value: 0, + data: abi.encodeWithSelector(BasicERC20.mint.selector, address(users.alice.deleGator), uint256(200)) + }); + + // beforeHook, mimicking the behavior of Alice's DeleGator + uint256 paramStart_ = abi.encodeWithSelector(BasicERC20.mint.selector, address(0)).length; + uint256[3] memory paramValue_ = [uint256(100), 100, 100]; + bytes memory inputTerms_ = abi.encodePacked(paramStart_, paramValue_); + + vm.prank(address(delegationManager)); + vm.expectRevert("AllowedCalldataEnforcer:invalid-calldata-length"); + allowedCalldataEnforcer.beforeHook(inputTerms_, hex"", action_, keccak256(""), address(0), address(0)); + } + + // should NOT allow a method to be called when a terms size is invalid + function test_singleMethodCanNotCalledWithInvalidTermsSize() public { + // Create the action that would be executed + Action memory action_ = Action({ + to: address(basicCF20), + value: 0, + data: abi.encodeWithSelector(BasicERC20.mint.selector, address(users.alice.deleGator), uint256(200)) + }); + + // beforeHook, mimicking the behavior of Alice's DeleGator + uint256 paramStart_ = abi.encodeWithSelector(BasicERC20.mint.selector, address(0)).length; + bytes memory inputTerms_ = abi.encodePacked(paramStart_); + + vm.prank(address(delegationManager)); + vm.expectRevert("AllowedCalldataEnforcer:invalid-terms-size"); + allowedCalldataEnforcer.beforeHook(inputTerms_, hex"", action_, keccak256(""), address(0), address(0)); + } + + ////////////////////// Integration ////////////////////// + + // should allow a single method to be called when a single function parameter is equal Integration + function test_singleMethodCanBeCalledWithEqualParamIntegration() public { + assertEq(basicCF20.balanceOf(address(users.bob.deleGator)), 0); + + // Create the action that would be executed on Alice for transferring a ft tokens + Action memory action1_ = Action({ + to: address(basicCF20), + value: 0, + data: abi.encodeWithSelector(IERC20.transfer.selector, address(users.bob.deleGator), uint256(1)) + }); + + // create terms for the enforcer + uint256 paramStart_ = abi.encodeWithSelector(IERC20.transfer.selector, address(0)).length; + uint256 paramValue_ = 1; + bytes memory inputTerms_ = abi.encodePacked(paramStart_, paramValue_); + + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = Caveat({ args: hex"", enforcer: address(allowedCalldataEnforcer), terms: inputTerms_ }); + Delegation memory delegation_ = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + // Store delegation + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation_)); + + // Execute Bob's UserOp + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation_; + + // Enforcer allows the delegation + invokeDelegation_UserOp(users.bob, delegations_, action1_); + + // Validate that the balance have increased + assertEq(basicCF20.balanceOf(address(users.bob.deleGator)), uint256(1)); + + // Enforcer allows to reuse the delegation + invokeDelegation_UserOp(users.bob, delegations_, action1_); + + // Validate that the balance has increased again + assertEq(basicCF20.balanceOf(address(users.bob.deleGator)), uint256(2)); + } + + // should NOT allow a single method to be called when a single function parameter is not equal Integration + function test_singleMethodCanNotBeCalledWithNonEqualParamIntegration() public { + assertEq(basicCF20.balanceOf(address(users.bob.deleGator)), 0); + + // Create the action that would be executed on Alice for transferring a ft tokens + Action memory action1_ = Action({ + to: address(basicCF20), + value: 0, + data: abi.encodeWithSelector(IERC20.transfer.selector, address(users.bob.deleGator), uint256(2)) + }); + + // create terms for the enforcer + uint256 paramStart_ = abi.encodeWithSelector(IERC20.transfer.selector, address(0)).length; + uint256 paramValue_ = 1; + bytes memory inputTerms_ = abi.encodePacked(paramStart_, paramValue_); + + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = Caveat({ args: hex"", enforcer: address(allowedCalldataEnforcer), terms: inputTerms_ }); + Delegation memory delegation_ = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + // Store delegation + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation_)); + + // Execute Bob's UserOp + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation_; + + // Enforcer allows the delegation + invokeDelegation_UserOp(users.bob, delegations_, action1_); + + // Validate that the balance have not increased + assertEq(basicCF20.balanceOf(address(users.bob.deleGator)), uint256(0)); + } + + function _getEnforcer() internal view override returns (ICaveatEnforcer) { + return ICaveatEnforcer(address(allowedCalldataEnforcer)); + } +} diff --git a/test/enforcers/AllowedMethodsEnforcer.t.sol b/test/enforcers/AllowedMethodsEnforcer.t.sol new file mode 100644 index 0000000..ecbab60 --- /dev/null +++ b/test/enforcers/AllowedMethodsEnforcer.t.sol @@ -0,0 +1,189 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import "forge-std/Test.sol"; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; + +import { Action, Caveat, Delegation, Delegation } from "../../src/utils/Types.sol"; +import { Counter } from "../utils/Counter.t.sol"; +import { CaveatEnforcerBaseTest } from "./CaveatEnforcerBaseTest.t.sol"; +import { AllowedMethodsEnforcer } from "../../src/enforcers/AllowedMethodsEnforcer.sol"; +import { IDelegationManager } from "../../src/interfaces/IDelegationManager.sol"; +import { EncoderLib } from "../../src/libraries/EncoderLib.sol"; +import { ICaveatEnforcer } from "../../src/interfaces/ICaveatEnforcer.sol"; + +contract AllowedMethodsEnforcerTest is CaveatEnforcerBaseTest { + ////////////////////// State ////////////////////// + + AllowedMethodsEnforcer public allowedMethodsEnforcer; + + ////////////////////// Set up ////////////////////// + + function setUp() public override { + super.setUp(); + allowedMethodsEnforcer = new AllowedMethodsEnforcer(); + vm.label(address(allowedMethodsEnforcer), "Allowed Methods Enforcer"); + } + + ////////////////////// Valid cases ////////////////////// + + // should allow a method to be called when a single method is allowed + function test_singleMethodCanBeCalled() public { + // Create the action that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // beforeHook, mimicking the behavior of Alice's DeleGator + vm.prank(address(delegationManager)); + allowedMethodsEnforcer.beforeHook( + abi.encodePacked(Counter.increment.selector), hex"", action_, keccak256(""), address(0), address(0) + ); + } + + // should allow a method to be called when a multiple methods are allowed + function test_multiMethodCanBeCalled() public { + // Create the action that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // beforeHook, mimicking the behavior of Alice's DeleGator + vm.prank(address(delegationManager)); + allowedMethodsEnforcer.beforeHook( + abi.encodePacked(Counter.setCount.selector, Ownable.renounceOwnership.selector, Counter.increment.selector), + hex"", + action_, + keccak256(""), + address(0), + address(0) + ); + } + + ////////////////////// Invalid cases ////////////////////// + + // should FAIL to get terms info when passing an invalid terms length + function test_getTermsInfoFailsForInvalidLength() public { + vm.expectRevert("AllowedMethodsEnforcer:invalid-terms-length"); + allowedMethodsEnforcer.getTermsInfo(bytes("1")); + } + + // should FAIL if action.data length < 4 + function test_notAllow_invalidActionLength() public { + // Create the action that would be executed + Action memory action_ = Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodePacked(true) }); + + // beforeHook, mimicking the behavior of Alice's DeleGator + vm.prank(address(delegationManager)); + vm.expectRevert("AllowedMethodsEnforcer:invalid-action-data-length"); + allowedMethodsEnforcer.beforeHook( + abi.encodePacked(Counter.setCount.selector, Ownable.renounceOwnership.selector, Ownable.owner.selector), + hex"", + action_, + keccak256(""), + address(0), + address(0) + ); + } + + // should NOT allow a method to be called when the method is not allowed + function test_onlyApprovedMethodsCanBeCalled() public { + // Create the action that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // beforeHook, mimicking the behavior of Alice's DeleGator + vm.prank(address(delegationManager)); + vm.expectRevert("AllowedMethodsEnforcer:method-not-allowed"); + allowedMethodsEnforcer.beforeHook( + abi.encodePacked(Counter.setCount.selector, Ownable.renounceOwnership.selector, Ownable.owner.selector), + hex"", + action_, + keccak256(""), + address(0), + address(0) + ); + } + + ////////////////////// Integration ////////////////////// + + // should allow a method to be called when a single method is allowed Integration + function test_methodCanBeSingleMethodIntegration() public { + uint256 initialValue_ = aliceDeleGatorCounter.count(); + + // Create the action that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = + Caveat({ args: hex"", enforcer: address(allowedMethodsEnforcer), terms: abi.encodePacked(Counter.increment.selector) }); + Delegation memory delegation_ = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + // Store delegation + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation_)); + + // Execute Bob's UserOp + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation_; + + // Enforcer allows the delegation + invokeDelegation_UserOp(users.bob, delegations_, action_); + // Get count + uint256 valueAfter_ = aliceDeleGatorCounter.count(); + // Validate that the count has increased by 1 + assertEq(valueAfter_, initialValue_ + 1); + + // Enforcer allows to reuse the delegation + invokeDelegation_UserOp(users.bob, delegations_, action_); + // Get final count + uint256 finalValue_ = aliceDeleGatorCounter.count(); + // Validate that the count has increased again + assertEq(finalValue_, initialValue_ + 2); + } + + // should NOT allow a method to be called when the method is not allowed Integration + function test_onlyApprovedMethodsCanBeCalledIntegration() public { + uint256 initialValue_ = aliceDeleGatorCounter.count(); + + // Create the action that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = Caveat({ + args: hex"", + enforcer: address(allowedMethodsEnforcer), + terms: abi.encodePacked(Counter.setCount.selector, Ownable.renounceOwnership.selector, Ownable.owner.selector) + }); + Delegation memory delegation_ = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + // Store delegation + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation_)); + + // Execute Bob's UserOp + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation_; + + // Enforcer allows the delegation + invokeDelegation_UserOp(users.bob, delegations_, action_); + // Get final count + uint256 valueAfter_ = aliceDeleGatorCounter.count(); + // Validate that the count has not changed + assertEq(valueAfter_, initialValue_); + } + + function _getEnforcer() internal view override returns (ICaveatEnforcer) { + return ICaveatEnforcer(address(allowedMethodsEnforcer)); + } +} diff --git a/test/enforcers/AllowedTargetsEnforcer.t.sol b/test/enforcers/AllowedTargetsEnforcer.t.sol new file mode 100644 index 0000000..04281b6 --- /dev/null +++ b/test/enforcers/AllowedTargetsEnforcer.t.sol @@ -0,0 +1,189 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import "forge-std/Test.sol"; + +import { Action, Caveat, Delegation, Delegation } from "../../src/utils/Types.sol"; +import { Counter } from "../utils/Counter.t.sol"; +import { CaveatEnforcerBaseTest } from "./CaveatEnforcerBaseTest.t.sol"; +import { AllowedTargetsEnforcer } from "../../src/enforcers/AllowedTargetsEnforcer.sol"; +import { IDelegationManager } from "../../src/interfaces/IDelegationManager.sol"; +import { EncoderLib } from "../../src/libraries/EncoderLib.sol"; +import { ICaveatEnforcer } from "../../src/interfaces/ICaveatEnforcer.sol"; +import { BasicERC20, IERC20 } from "../utils/BasicERC20.t.sol"; + +contract AllowedTargetsEnforcerTest is CaveatEnforcerBaseTest { + ////////////////////////////// State ////////////////////////////// + AllowedTargetsEnforcer public allowedTargetsEnforcer; + BasicERC20 public testFToken1; + BasicERC20 public testFToken2; + + ////////////////////// Set up ////////////////////// + + function setUp() public override { + super.setUp(); + testFToken1 = new BasicERC20(address(users.alice.deleGator), "TestToken1", "TestToken1", 100 ether); + testFToken2 = new BasicERC20(address(users.alice.deleGator), "TestToken2", "TestToken2", 100 ether); + allowedTargetsEnforcer = new AllowedTargetsEnforcer(); + vm.label(address(allowedTargetsEnforcer), "Allowed Targets Enforcer"); + } + + ////////////////////// Valid cases ////////////////////// + + // should allow a method to be called when a single target is allowed + function test_singleTargetCanBeCalled() public { + // Create the action that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // beforeHook, mimicking the behavior of Alice's DeleGator + vm.prank(address(delegationManager)); + allowedTargetsEnforcer.beforeHook( + abi.encodePacked(address(aliceDeleGatorCounter)), hex"", action_, keccak256(""), address(0), address(0) + ); + } + + // should allow a method to be called when a multiple targets are allowed + function test_multiTargetCanBeCalled() public { + // Create the action that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // beforeHook, mimicking the behavior of Alice's DeleGator + vm.prank(address(delegationManager)); + allowedTargetsEnforcer.beforeHook( + abi.encodePacked(address(bobDeleGatorCounter), address(carolDeleGatorCounter), address(aliceDeleGatorCounter)), + hex"", + action_, + keccak256(""), + address(0), + address(0) + ); + } + + ////////////////////// Invalid cases ////////////////////// + + // should FAIL to get terms info when passing an invalid terms length + function test_getTermsInfoFailsForInvalidLength() public { + vm.expectRevert("AllowedTargetsEnforcer:invalid-terms-length"); + allowedTargetsEnforcer.getTermsInfo(bytes("1")); + } + + // should NOT allow a method to be called when the target is not allowed + function test_onlyApprovedTargetsCanBeCalled() public { + // Create the action that would be executed + Action memory action_ = + Action({ to: address(daveDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // beforeHook, mimicking the behavior of Dave's DeleGator + vm.prank(address(delegationManager)); + vm.expectRevert("AllowedTargetsEnforcer:target-address-not-allowed"); + allowedTargetsEnforcer.beforeHook( + abi.encodePacked(address(bobDeleGatorCounter), address(carolDeleGatorCounter), address(aliceDeleGatorCounter)), + hex"", + action_, + keccak256(""), + address(0), + address(0) + ); + } + + ////////////////////// Integration ////////////////////// + + // should allow a method to be called when a multiple targets are allowed Integration + function test_multiTargetCanBeCalledIntegration() public { + assertEq(aliceDeleGatorCounter.count(), 0); + assertEq(testFToken1.balanceOf(address(users.bob.deleGator)), 0); + + // Create the action that would be executed on Alice for incrementing the count + Action memory action1_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Create the action that would be executed on Alice for transferring a ft tokens + Action memory action2_ = Action({ + to: address(testFToken1), + value: 0, + data: abi.encodeWithSelector(IERC20.transfer.selector, address(users.bob.deleGator), 1 ether) + }); + + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = Caveat({ + args: hex"", + enforcer: address(allowedTargetsEnforcer), + terms: abi.encodePacked(address(aliceDeleGatorCounter), address(testFToken1)) + }); + Delegation memory delegation_ = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + // Store delegation + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation_)); + + // Execute Bob's UserOp + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation_; + + // Enforcer allows the delegation + invokeDelegation_UserOp(users.bob, delegations_, action1_); + invokeDelegation_UserOp(users.bob, delegations_, action2_); + + // Validate that the count and balance have increased + assertEq(aliceDeleGatorCounter.count(), 1); + assertEq(testFToken1.balanceOf(address(users.bob.deleGator)), 1 ether); + + // Enforcer allows to reuse the delegation + invokeDelegation_UserOp(users.bob, delegations_, action1_); + invokeDelegation_UserOp(users.bob, delegations_, action2_); + + // Validate that the count and balance has increased again + assertEq(aliceDeleGatorCounter.count(), 2); + assertEq(testFToken1.balanceOf(address(users.bob.deleGator)), 2 ether); + } + + // should NOT allow a method to be called when the method is not allowed Integration + function test_onlyApprovedMethodsCanBeCalledIntegration() public { + assertEq(testFToken1.balanceOf(address(users.bob.deleGator)), 0); + assertEq(testFToken2.balanceOf(address(users.bob.deleGator)), 0); + + // Create the action that would be executed on Alice for transferring FToken2 + Action memory action_ = Action({ + to: address(testFToken2), + value: 0, + data: abi.encodeWithSelector(IERC20.transfer.selector, address(users.bob.deleGator), 1 ether) + }); + + // Approving the user to use the FToken1 + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = + Caveat({ args: hex"", enforcer: address(allowedTargetsEnforcer), terms: abi.encodePacked(address(testFToken1)) }); + Delegation memory delegation_ = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + // Store delegation + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation_)); + + // Execute Bob's UserOp + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation_; + + // Enforcer allows the delegation + invokeDelegation_UserOp(users.bob, delegations_, action_); + + // Validate that the balances on both FTokens has not increased + assertEq(testFToken1.balanceOf(address(users.bob.deleGator)), 0); + assertEq(testFToken2.balanceOf(address(users.bob.deleGator)), 0); + } + + function _getEnforcer() internal view override returns (ICaveatEnforcer) { + return ICaveatEnforcer(address(allowedTargetsEnforcer)); + } +} diff --git a/test/enforcers/BlockNumberEnforcer.t.sol b/test/enforcers/BlockNumberEnforcer.t.sol new file mode 100644 index 0000000..5416f07 --- /dev/null +++ b/test/enforcers/BlockNumberEnforcer.t.sol @@ -0,0 +1,184 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import "forge-std/Test.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +import { Action, Caveat, Delegation, Delegation } from "../../src/utils/Types.sol"; +import { Counter } from "../utils/Counter.t.sol"; +import { CaveatEnforcerBaseTest } from "./CaveatEnforcerBaseTest.t.sol"; +import { BlockNumberEnforcer } from "../../src/enforcers/BlockNumberEnforcer.sol"; +import { EncoderLib } from "../../src/libraries/EncoderLib.sol"; +import { IDelegationManager } from "../../src/interfaces/IDelegationManager.sol"; +import { ICaveatEnforcer } from "../../src/interfaces/ICaveatEnforcer.sol"; + +contract BlockNumberEnforcerTest is CaveatEnforcerBaseTest { + ////////////////////// State ////////////////////// + + BlockNumberEnforcer public blockNumberEnforcer; + + ////////////////////// Set up ////////////////////// + + function setUp() public override { + super.setUp(); + blockNumberEnforcer = new BlockNumberEnforcer(); + vm.label(address(blockNumberEnforcer), "Block Number Enforcer"); + } + + ////////////////////// Valid cases ////////////////////// + + // should SUCCEED to INVOKE method AFTER blockNumber reached + function test_methodCanBeCalledAfterBlockNumber() public { + // Create the action_ that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + vm.roll(10000); + uint128 blockAfterThreshold_ = 1; + uint128 blockBeforeThreshold_ = 0; // Not using before threshold + bytes memory inputTerms_ = abi.encodePacked(blockAfterThreshold_, blockBeforeThreshold_); + vm.prank(address(delegationManager)); + blockNumberEnforcer.beforeHook(inputTerms_, hex"", action_, keccak256(""), address(0), address(0)); + } + + //should SUCCEED to INVOKE method BEFORE blockNumber reached + function test_methodCanBeCalledBeforeBlockNumber() public { + // Create the action_ that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + uint128 blockAfterThreshold_ = 0; // Not using after threshold + uint128 blockBeforeThreshold_ = uint128(block.number + 10000); + bytes memory inputTerms_ = abi.encodePacked(blockAfterThreshold_, blockBeforeThreshold_); + vm.prank(address(delegationManager)); + blockNumberEnforcer.beforeHook(inputTerms_, hex"", action_, keccak256(""), address(0), address(0)); + } + + // should SUCCEED to INVOKE method inside blockNumber RANGE + function test_methodCanBeCalledInsideBlockNumberRange() public { + // Create the action that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + uint128 blockAfterThreshold_ = 1; + uint128 blockBeforeThreshold_ = uint128(block.number + 10000); + vm.roll(1000); // making block number between 1 and 10001 + bytes memory inputTerms_ = abi.encodePacked(blockAfterThreshold_, blockBeforeThreshold_); + vm.prank(address(delegationManager)); + blockNumberEnforcer.beforeHook(inputTerms_, hex"", action_, keccak256(""), address(0), address(0)); + } + + ////////////////////// Invalid cases ////////////////////// + + // should FAIL to get terms info when passing an invalid terms length + function test_getTermsInfoFailsForInvalidLength() public { + vm.expectRevert("BlockNumberEnforcer:invalid-terms-length"); + blockNumberEnforcer.getTermsInfo(hex""); + } + + // should FAIL to INVOKE method BEFORE blockNumber reached + function test_methodFailsIfCalledBeforeBlockNumber() public { + // Create the action_ that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + uint128 blockAfterThreshold_ = uint128(block.number + 10000); + uint128 blockBeforeThreshold_ = 0; // Not using before threshold + bytes memory inputTerms_ = abi.encodePacked(blockAfterThreshold_, blockBeforeThreshold_); + vm.prank(address(delegationManager)); + vm.expectRevert("BlockNumberEnforcer:early-delegation"); + + blockNumberEnforcer.beforeHook(inputTerms_, hex"", action_, keccak256(""), address(0), address(0)); + } + + // should FAIL to INVOKE method AFTER blockNumber reached + function test_methodFailsIfCalledAfterBlockNumber() public { + // Create the action_ that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + uint128 blockAfterThreshold_ = 0; // Not using after threshold + uint128 blockBeforeThreshold_ = uint128(block.number); + vm.roll(10000); + bytes memory inputTerms_ = abi.encodePacked(blockAfterThreshold_, blockBeforeThreshold_); + vm.prank(address(delegationManager)); + vm.expectRevert("BlockNumberEnforcer:expired-delegation"); + + blockNumberEnforcer.beforeHook(inputTerms_, hex"", action_, keccak256(""), address(0), address(0)); + } + + // should FAIL to INVOKE method BEFORE blocknumber RANGE + function test_methodFailsIfCalledBeforeBlockNumberRange() public { + // Create the action_ that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + uint128 blockAfterThreshold_ = uint128(block.number + 10000); + uint128 blockBeforeThreshold_ = uint128(block.number + 20000); + bytes memory inputTerms_ = abi.encodePacked(blockAfterThreshold_, blockBeforeThreshold_); + vm.prank(address(delegationManager)); + vm.expectRevert("BlockNumberEnforcer:early-delegation"); + + blockNumberEnforcer.beforeHook(inputTerms_, hex"", action_, keccak256(""), address(0), address(0)); + } + + // should FAIL to INVOKE method AFTER blocknumber RANGE" + function test_methodFailsIfCalledAfterBlockNumberRange() public { + // Create the action_ that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + uint128 blockAfterThreshold_ = uint128(block.number + 10000); + uint128 blockBeforeThreshold_ = uint128(block.number + 20000); + vm.roll(30000); + bytes memory inputTerms_ = abi.encodePacked(blockAfterThreshold_, blockBeforeThreshold_); + vm.prank(address(delegationManager)); + vm.expectRevert("BlockNumberEnforcer:expired-delegation"); + + blockNumberEnforcer.beforeHook(inputTerms_, hex"", action_, keccak256(""), address(0), address(0)); + } + + ////////////////////// Integration ////////////////////// + + // should SUCCEED to INVOKE until reaching blockNumber + function test_methodCanBeCalledAfterBlockNumberIntegration() public { + uint256 initialValue_ = aliceDeleGatorCounter.count(); + // Create the action_ that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + vm.roll(10); + // Not using before threshold (blockAfterThreshold_ = 1, blockBeforeThreshold_ = 100) + bytes memory inputTerms_ = abi.encodePacked(uint128(1), uint128(100)); + + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = Caveat({ args: hex"", enforcer: address(blockNumberEnforcer), terms: inputTerms_ }); + Delegation memory delegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + + // Store delegation + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation)); + + // Execute Bob's UserOp + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation; + + // Enforcer allows the delegation + invokeDelegation_UserOp(users.bob, delegations_, action_); + // Get final count + uint256 valueAfter_ = aliceDeleGatorCounter.count(); + // Validate that the count has increased by 1 + assertEq(valueAfter_, initialValue_ + 1); + + // Enforcer blocks the delegation + vm.roll(100); + invokeDelegation_UserOp(users.bob, delegations_, action_); + // Get final count + uint256 finalValue_ = aliceDeleGatorCounter.count(); + // Validate that the count has not increased by 1 + assertEq(finalValue_, initialValue_ + 1); + } + + function _getEnforcer() internal view override returns (ICaveatEnforcer) { + return ICaveatEnforcer(address(blockNumberEnforcer)); + } +} diff --git a/test/enforcers/CaveatEnforcerBaseTest.t.sol b/test/enforcers/CaveatEnforcerBaseTest.t.sol new file mode 100644 index 0000000..8e28a94 --- /dev/null +++ b/test/enforcers/CaveatEnforcerBaseTest.t.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { BaseTest } from "../utils/BaseTest.t.sol"; +import { Implementation, SignatureType } from "../utils/Types.t.sol"; +import { Counter } from "../utils/Counter.t.sol"; +import { ICaveatEnforcer } from "../../src/interfaces/ICaveatEnforcer.sol"; + +abstract contract CaveatEnforcerBaseTest is BaseTest { + constructor() { + IMPLEMENTATION = Implementation.MultiSig; + SIGNATURE_TYPE = SignatureType.MultiSig; + } + + ////////////////////////////// State ////////////////////////////// + Counter public aliceDeleGatorCounter; + Counter public bobDeleGatorCounter; + Counter public carolDeleGatorCounter; + Counter public daveDeleGatorCounter; + + ////////////////////////////// Set up ////////////////////////////// + + function setUp() public virtual override { + super.setUp(); + aliceDeleGatorCounter = new Counter(address(users.alice.deleGator)); + bobDeleGatorCounter = new Counter(address(users.bob.deleGator)); + carolDeleGatorCounter = new Counter(address(users.carol.deleGator)); + daveDeleGatorCounter = new Counter(address(users.dave.deleGator)); + } + + ////////////////////////////// Internal Methods ////////////////////////////// + + function _getEnforcer() internal virtual returns (ICaveatEnforcer); +} diff --git a/test/enforcers/DeployedEnforcer.t.sol b/test/enforcers/DeployedEnforcer.t.sol new file mode 100644 index 0000000..d22e0da --- /dev/null +++ b/test/enforcers/DeployedEnforcer.t.sol @@ -0,0 +1,259 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { Address } from "@openzeppelin/contracts/utils/Address.sol"; + +import { Action, Caveat, Delegation } from "../../src/utils/Types.sol"; +import { CaveatEnforcerBaseTest } from "./CaveatEnforcerBaseTest.t.sol"; +import { DeployedEnforcer } from "../../src/enforcers/DeployedEnforcer.sol"; +import { IDelegationManager } from "../../src/interfaces/IDelegationManager.sol"; +import { EncoderLib } from "../../src/libraries/EncoderLib.sol"; +import { ICaveatEnforcer } from "../../src/interfaces/ICaveatEnforcer.sol"; + +contract DeployedEnforcerTest is CaveatEnforcerBaseTest { + ////////////////////////////// State ////////////////////////////// + + DeployedEnforcer public deployedEnforcer; + bytes32 public salt; + + ////////////////////////////// Events ////////////////////////////// + + event DeployedContract(address contractAddress); + event Deployed(address indexed addr); + + ////////////////////// Set up ////////////////////// + + function setUp() public override { + super.setUp(); + deployedEnforcer = new DeployedEnforcer(); + vm.label(address(deployedEnforcer), "Deployed Enforcer"); + salt = keccak256(abi.encode("salt")); + } + + ////////////////////// Valid cases ////////////////////// + + // should accurately compute the predicted create2 address + function test_computesAPredictedAddress() public { + bytes32 bytecodeHash_ = hashInitCode(type(Counter).creationCode); + address predictedAddr_ = vm.computeCreate2Address(salt, bytecodeHash_, address(deployedEnforcer)); + address factoryPredictedAddr_ = deployedEnforcer.computeAddress(bytecodeHash_, salt); + assertEq(factoryPredictedAddr_, predictedAddr_); + } + + // should deploy if the contract hasn't been deployed yet and terms are properly formatted + function test_deploysIfNonExistent() public { + // Compute predicted address + bytes32 bytecodeHash_ = hashInitCode(type(Counter).creationCode); + address predictedAddr_ = vm.computeCreate2Address(salt, bytecodeHash_, address(deployedEnforcer)); + + // NOTE: Action isn't very relevant for this test. + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Check that the contract hasn't been deployed yet + bytes memory initialCode_ = predictedAddr_.code; + assertEq(initialCode_, bytes("")); + + // beforeHook, mimicking the behavior of Alice's DeleGator + vm.prank(address(delegationManager)); + + // should emit an event when contract is deployed in the factory + vm.expectEmit(true, true, true, true, address(deployedEnforcer)); + emit DeployedContract(predictedAddr_); + deployedEnforcer.beforeHook( + abi.encodePacked(predictedAddr_, salt, abi.encodePacked(type(Counter).creationCode)), + hex"", + action_, + keccak256(""), + address(0), + address(0) + ); + + // Check that the contract has been deployed properly + bytes memory finalCode_ = predictedAddr_.code; + assertEq(finalCode_, type(Counter).runtimeCode); + } + + // should NOT deploy if the contract already has been deployed + function test_doesNotDeployIfExistent() public { + // Compute predicted address + bytes memory bytecode_ = type(Counter).creationCode; + bytes32 bytecodeHash_ = hashInitCode(bytecode_); + address predictedAddr_ = vm.computeCreate2Address(salt, bytecodeHash_, address(deployedEnforcer)); + + // NOTE: Action isn't very relevant for this test. + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Deploy the contract + vm.prank(address(delegationManager)); + deployedEnforcer.beforeHook( + abi.encodePacked(predictedAddr_, salt, bytecode_), hex"", action_, keccak256(""), address(0), address(0) + ); + + // beforeHook, mimicking the behavior of Alice's DeleGator + vm.prank(address(delegationManager)); + vm.expectEmit(true, true, true, true, address(deployedEnforcer)); + emit DeployedEnforcer.SkippedDeployment(predictedAddr_); + + // Use enforcer when contract is already deployed + deployedEnforcer.beforeHook( + abi.encodePacked(predictedAddr_, salt, bytecode_), hex"", action_, keccak256(""), address(0), address(0) + ); + } + + ////////////////////// Invalid cases ////////////////////// + + // should revert if the predicted address doesn't match the deployed address + function test_revertIfPredictedAddressDoesNotMatch() public { + // NOTE: Action isn't very relevant for this test. + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // beforeHook, mimicking the behavior of Alice's DeleGator + vm.prank(address(delegationManager)); + vm.expectRevert("DeployedEnforcer:deployed-address-mismatch"); + deployedEnforcer.beforeHook( + abi.encodePacked(users.alice.addr, salt, abi.encodePacked(type(Counter).creationCode)), + hex"", + action_, + keccak256(""), + address(0), + address(0) + ); + } + + // should revert if the length of the terms is not sufficient + function test_revertIfTermsLengthIsInvalid() public { + // NOTE: Action isn't very relevant for this test. + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + vm.startPrank(address(delegationManager)); + + // 0 bytes + vm.expectRevert("DeployedEnforcer:invalid-terms-length"); + deployedEnforcer.beforeHook(hex"", hex"", action_, keccak256(""), address(0), address(0)); + + // 20 bytes + vm.expectRevert("DeployedEnforcer:invalid-terms-length"); + deployedEnforcer.beforeHook(abi.encodePacked(users.alice.addr), hex"", action_, keccak256(""), address(0), address(0)); + + // 52 bytes + vm.expectRevert("DeployedEnforcer:invalid-terms-length"); + deployedEnforcer.beforeHook( + abi.encodePacked(users.alice.addr, bytes32(hex"")), hex"", action_, keccak256(""), address(0), address(0) + ); + } + + // should revert if deployed contract is empty + function test_revertIfContractIsEmpty() public { + // This is the bytecode for an empty contract + bytes memory bytecode_ = hex"60006000"; + + bytes32 bytecodeHash_ = hashInitCode(bytecode_); + address predictedAddr_ = vm.computeCreate2Address(salt, bytecodeHash_, address(deployedEnforcer)); + + // // NOTE: Action isn't very relevant for this test. + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // beforeHook, mimicking the behavior of Alice's DeleGator + vm.prank(address(delegationManager)); + vm.expectRevert(abi.encodeWithSelector(DeployedEnforcer.DeployedEmptyContract.selector, predictedAddr_)); + deployedEnforcer.beforeHook( + abi.encodePacked(predictedAddr_, salt, bytecode_), hex"", action_, keccak256(""), address(0), address(0) + ); + } + + // should fail if there is no contract deployed + function test_revertsIfBytecodeDoesntExist() public { + // NOTE: deployedEnforcer ensures that a contract gets deployed + + // Compute predicted address + bytes32 bytecodeHash_ = hashInitCode(hex""); + address predictedAddr_ = vm.computeCreate2Address(salt, bytecodeHash_, address(deployedEnforcer)); + + // NOTE: Action isn't very relevant for this test. + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + // Check that the contract hasn't been deployed yet + bytes memory initialCode_ = predictedAddr_.code; + assertEq(initialCode_, bytes("")); + + // beforeHook, mimicking the behavior of Alice's DeleGator + vm.prank(address(delegationManager)); + vm.expectRevert(); + deployedEnforcer.beforeHook( + abi.encodePacked(predictedAddr_, salt, abi.encodePacked(type(Counter).creationCode)), + hex"", + action_, + keccak256(""), + address(0), + address(0) + ); + } + + ////////////////////// Integration ////////////////////// + + // should deploy if the contract hasn't been deployed yet and terms are properly formatted, and allows to use it + function test_deploysIfNonExistentAndAllowsToUseItIntegration() public { + // Compute predicted address + bytes32 bytecodeHash_ = hashInitCode(type(Counter).creationCode); + address predictedAddr_ = vm.computeCreate2Address(salt, bytecodeHash_, address(deployedEnforcer)); + + // NOTE: Action isn't very relevant for this test. + Action memory action_ = Action({ to: predictedAddr_, value: 0, data: abi.encodeWithSelector(Counter.setCount.selector, 1) }); + + // Check that the contract hasn't been deployed yet + bytes memory initialCode_ = predictedAddr_.code; + assertEq(initialCode_, bytes("")); + + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = Caveat({ + args: hex"", + enforcer: address(deployedEnforcer), + terms: abi.encodePacked(predictedAddr_, salt, abi.encodePacked(type(Counter).creationCode)) + }); + Delegation memory delegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + // Store delegation + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation)); + + // Execute Bob's UserOp + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation; + + // Enforcer allows the delegation + invokeDelegation_UserOp(users.bob, delegations_, action_); + + // Check that the contract has been deployed properly + bytes memory finalCode_ = predictedAddr_.code; + assertEq(finalCode_, type(Counter).runtimeCode); + + assertEq(Counter(predictedAddr_).count(), 1); + } + + function _getEnforcer() internal view override returns (ICaveatEnforcer) { + return ICaveatEnforcer(address(deployedEnforcer)); + } +} + +contract Counter { + uint256 public count = 0; + + function setCount(uint256 _newCount) public { + count = _newCount; + } + + function increment() public { + count++; + } +} diff --git a/test/enforcers/ERC20BalanceGteEnforcer.t.sol b/test/enforcers/ERC20BalanceGteEnforcer.t.sol new file mode 100644 index 0000000..39a0d97 --- /dev/null +++ b/test/enforcers/ERC20BalanceGteEnforcer.t.sol @@ -0,0 +1,157 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import "forge-std/Test.sol"; +import { BasicERC20 } from "../utils/BasicERC20.t.sol"; + +import "../../src/utils/Types.sol"; +import { Action } from "../../src/utils/Types.sol"; +import { CaveatEnforcerBaseTest } from "./CaveatEnforcerBaseTest.t.sol"; +import { ERC20BalanceGteEnforcer } from "../../src/enforcers/ERC20BalanceGteEnforcer.sol"; +import { ICaveatEnforcer } from "../../src/interfaces/ICaveatEnforcer.sol"; + +contract ERC20BalanceGteEnforcerTest is CaveatEnforcerBaseTest { + ////////////////////////////// State ////////////////////////////// + ERC20BalanceGteEnforcer public enforcer; + BasicERC20 public token; + address delegator; + address delegate; + address dm; + Action noAction; + Action mintAction; + + ////////////////////// Set up ////////////////////// + + function setUp() public override { + super.setUp(); + delegator = address(users.alice.deleGator); + delegate = address(users.bob.deleGator); + dm = address(delegationManager); + enforcer = new ERC20BalanceGteEnforcer(); + vm.label(address(enforcer), "Incremental ID Enforcer"); + token = new BasicERC20(delegator, "TEST", "TEST", 0); + vm.label(address(token), "ERC20 Test Token"); + mintAction = Action({ to: address(token), value: 0, data: abi.encodeWithSelector(token.mint.selector, delegator, 100) }); + noAction = Action(address(0), 0, hex""); + } + + ////////////////////// Basic Functionality ////////////////////// + + // Validates the terms get decoded correctly + function test_decodedTheTerms() public { + bytes memory terms_ = abi.encodePacked(address(token), uint256(100)); + uint256 amount_; + address token_; + (token_, amount_) = enforcer.getTermsInfo(terms_); + assertEq(amount_, 100); + assertEq(token_, address(token)); + } + + // Validates that a balance has increased at least the expected amount + function test_allow_ifBalanceIncreases() public { + // Expect it to increase by at least 100 + bytes memory terms_ = abi.encodePacked(address(token), uint256(100)); + + // Increase by 100 + vm.prank(dm); + enforcer.beforeHook(terms_, hex"", mintAction, bytes32(0), delegator, delegate); + vm.prank(delegator); + token.mint(delegator, 100); + vm.prank(dm); + enforcer.afterHook(terms_, hex"", mintAction, bytes32(0), delegator, delegate); + + // Increase by 1000 + vm.prank(dm); + enforcer.beforeHook(terms_, hex"", mintAction, bytes32(0), delegator, delegate); + vm.prank(delegator); + token.mint(delegator, 1000); + vm.prank(dm); + enforcer.afterHook(terms_, hex"", mintAction, bytes32(0), delegator, delegate); + } + + // ////////////////////// Errors ////////////////////// + + // Reverts if a balance hasn't increased by the set amount + function test_notAllow_insufficientIncrease() public { + // Expect it to increase by at least 100 + bytes memory terms_ = abi.encodePacked(address(token), uint256(100)); + + // Increase by 10, expect revert + vm.prank(dm); + enforcer.beforeHook(terms_, hex"", mintAction, bytes32(0), delegator, delegate); + vm.prank(delegator); + token.mint(delegator, 10); + vm.prank(dm); + vm.expectRevert(bytes("ERC20BalanceGteEnforcer:balance-not-gt")); + enforcer.afterHook(terms_, hex"", mintAction, bytes32(0), delegator, delegate); + } + + // Reverts if a enforcer is locked + function test_notAllow_reenterALockedEnforcer() public { + // Expect it to increase by at least 100 + bytes memory terms_ = abi.encodePacked(address(token), uint256(100)); + bytes32 delegationHash_ = bytes32(uint256(99999999)); + + // Increase by 100 + vm.startPrank(dm); + // Locks the enforcer + enforcer.beforeHook(terms_, hex"", mintAction, delegationHash_, delegator, delegate); + bytes32 hashKey_ = enforcer.getHashKey(address(delegationManager), address(token), delegationHash_); + assertTrue(enforcer.isLocked(hashKey_)); + vm.expectRevert(bytes("ERC20BalanceGteEnforcer:enforcer-is-locked")); + enforcer.beforeHook(terms_, hex"", mintAction, delegationHash_, delegator, delegate); + vm.startPrank(delegator); + token.mint(delegator, 1000); + vm.startPrank(dm); + + // Unlocks the enforcer + enforcer.afterHook(terms_, hex"", mintAction, delegationHash_, delegator, delegate); + assertFalse(enforcer.isLocked(hashKey_)); + // Can be used again, and locks it again + enforcer.beforeHook(terms_, hex"", mintAction, delegationHash_, delegator, delegate); + assertTrue(enforcer.isLocked(hashKey_)); + } + + // Validates the terms are well formed + function test_invalid_decodedTheTerms() public { + bytes memory terms_; + + // Too small + terms_ = abi.encodePacked(address(token), uint8(100)); + vm.expectRevert(bytes("ERC20BalanceGteEnforcer:invalid-terms-length")); + enforcer.getTermsInfo(terms_); + + // Too large + terms_ = abi.encodePacked(uint256(100), uint256(100)); + vm.expectRevert(bytes("ERC20BalanceGteEnforcer:invalid-terms-length")); + enforcer.getTermsInfo(terms_); + } + + // Validates the token address is a token + function test_invalid_tokenAddress() public { + bytes memory terms_; + + // Invalid token + terms_ = abi.encodePacked(address(0), uint256(100)); + vm.expectRevert(); + enforcer.beforeHook(terms_, hex"", mintAction, bytes32(0), delegator, delegate); + } + + // Validates that an invalid ID reverts + function test_notAllow_expectingOverflow() public { + // Expect balance to increase so much that the balance overflows + bytes memory terms_ = abi.encodePacked(address(token), type(uint256).max); + + // Increase + vm.prank(dm); + enforcer.beforeHook(terms_, hex"", mintAction, bytes32(0), delegator, delegate); + vm.expectRevert(); + enforcer.afterHook(terms_, hex"", mintAction, bytes32(0), delegator, delegate); + } + + ////////////////////// Integration ////////////////////// + + function _getEnforcer() internal view override returns (ICaveatEnforcer) { + return ICaveatEnforcer(address(enforcer)); + } +} diff --git a/test/enforcers/ERC20TransferAmountEnforcer.t.sol b/test/enforcers/ERC20TransferAmountEnforcer.t.sol new file mode 100644 index 0000000..2481624 --- /dev/null +++ b/test/enforcers/ERC20TransferAmountEnforcer.t.sol @@ -0,0 +1,300 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import "forge-std/Test.sol"; + +import { Action, Caveat, Delegation, Delegation } from "../../src/utils/Types.sol"; +import { Counter } from "../utils/Counter.t.sol"; +import { CaveatEnforcerBaseTest } from "./CaveatEnforcerBaseTest.t.sol"; +import { ERC20TransferAmountEnforcer } from "../../src/enforcers/ERC20TransferAmountEnforcer.sol"; +import { BasicERC20, IERC20 } from "../utils/BasicERC20.t.sol"; +import { EncoderLib } from "../../src/libraries/EncoderLib.sol"; +import { IDelegationManager } from "../../src/interfaces/IDelegationManager.sol"; +import { ICaveatEnforcer } from "../../src/interfaces/ICaveatEnforcer.sol"; + +contract ERC20TransferAmountEnforcerTest is CaveatEnforcerBaseTest { + ////////////////////////////// State ////////////////////////////// + ERC20TransferAmountEnforcer public erc20TransferAmountEnforcer; + BasicERC20 public basicERC20; + BasicERC20 public invalidERC20; + + ////////////////////////////// Events ////////////////////////////// + event IncreasedSpentMap( + address indexed sender, address indexed redeemer, bytes32 indexed delegationHash, uint256 limit, uint256 spent + ); + ////////////////////// Set up ////////////////////// + + function setUp() public override { + super.setUp(); + erc20TransferAmountEnforcer = new ERC20TransferAmountEnforcer(); + vm.label(address(erc20TransferAmountEnforcer), "ERC20 Transfer Amount Enforcer"); + basicERC20 = new BasicERC20(address(users.alice.deleGator), "TestToken", "TestToken", 100 ether); + invalidERC20 = new BasicERC20(address(users.alice.addr), "InvalidToken", "IT", 100 ether); + } + + //////////////////// Valid cases ////////////////////// + + // should SUCCEED to INVOKE transfer BELOW enforcer allowance + function test_transferSucceedsIfCalledBelowAllowance() public { + uint256 spendingLimit_ = 1 ether; + + // Create the action that would be executed + Action memory action_ = Action({ + to: address(basicERC20), + value: 0, + data: abi.encodeWithSelector(IERC20.transfer.selector, address(users.bob.deleGator), spendingLimit_) + }); + bytes memory inputTerms_ = abi.encodePacked(address(basicERC20), spendingLimit_); + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = Caveat({ args: hex"", enforcer: address(erc20TransferAmountEnforcer), terms: inputTerms_ }); + Delegation memory delegation_ = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + // Get delegation hash + bytes32 delegationHash_ = EncoderLib._getDelegationHash(delegation_); + assertEq(erc20TransferAmountEnforcer.spentMap(address(delegationManager), delegationHash_), 0); + vm.prank(address(delegationManager)); + vm.expectEmit(true, true, true, true, address(erc20TransferAmountEnforcer)); + emit IncreasedSpentMap(address(delegationManager), address(0), delegationHash_, spendingLimit_, 1 ether); + erc20TransferAmountEnforcer.beforeHook(inputTerms_, hex"", action_, delegationHash_, address(0), address(0)); + + assertEq(erc20TransferAmountEnforcer.spentMap(address(delegationManager), delegationHash_), spendingLimit_); + } + + ////////////////////// Invalid cases ////////////////////// + + // should FAIL to INVOKE transfer ABOVE enforcer allowance + function test_transferFailsIfCalledAboveAllowance() public { + uint256 spendingLimit_ = 1 ether; + + // Create the action that would be executed + Action memory action_ = Action({ + to: address(basicERC20), + value: 0, + data: abi.encodeWithSelector(IERC20.transfer.selector, address(users.bob.deleGator), uint256(spendingLimit_ + 1)) + }); + bytes memory inputTerms_ = abi.encodePacked(address(basicERC20), spendingLimit_); + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = Caveat({ args: hex"", enforcer: address(erc20TransferAmountEnforcer), terms: inputTerms_ }); + Delegation memory delegation_ = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + // Get delegation hash + bytes32 delegationHash_ = EncoderLib._getDelegationHash(delegation_); + assertEq(erc20TransferAmountEnforcer.spentMap(address(delegationManager), delegationHash_), 0); + vm.prank(address(delegationManager)); + vm.expectRevert("ERC20TransferAmountEnforcer:allowance-exceeded"); + + erc20TransferAmountEnforcer.beforeHook(inputTerms_, hex"", action_, delegationHash_, address(0), address(0)); + + assertEq(erc20TransferAmountEnforcer.spentMap(address(delegationManager), delegationHash_), 0); + } + + ////////////////////// Integration ////////////////////// + + // should FAIL to INVOKE invalid ERC20-contract + function test_methodFailsIfInvokesInvalidContract() public { + uint256 spendingLimit_ = 1 ether; + + // Create the action_ that would be executed + Action memory action_ = Action({ + to: address(basicERC20), + value: 0, + data: abi.encodeWithSelector(IERC20.transfer.selector, address(users.bob.deleGator), spendingLimit_) + }); + bytes memory inputTerms_ = abi.encodePacked(address(invalidERC20), spendingLimit_); + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = Caveat({ args: hex"", enforcer: address(erc20TransferAmountEnforcer), terms: inputTerms_ }); + + Delegation memory delegation_ = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + // Get delegation hash + bytes32 delegationHash_ = EncoderLib._getDelegationHash(delegation_); + assertEq(erc20TransferAmountEnforcer.spentMap(address(delegationManager), delegationHash_), 0); + vm.prank(address(delegationManager)); + vm.expectRevert("ERC20TransferAmountEnforcer:invalid-contract"); + erc20TransferAmountEnforcer.beforeHook(inputTerms_, hex"", action_, delegationHash_, address(0), address(0)); + + assertEq(erc20TransferAmountEnforcer.spentMap(address(delegationManager), delegationHash_), 0); + } + + // should FAIL to INVOKE invalid action data length + function test_notAllow_invalidActionLength() public { + uint256 spendingLimit_ = 1 ether; + + // Create the action_ that would be executed + Action memory action_ = Action({ + to: address(basicERC20), + value: 0, + data: abi.encodeWithSelector( + IERC20.transferFrom.selector, address(users.alice.deleGator), address(users.bob.deleGator), spendingLimit_ + ) + }); + bytes memory inputTerms_ = abi.encodePacked(address(basicERC20), spendingLimit_); + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = Caveat({ args: hex"", enforcer: address(erc20TransferAmountEnforcer), terms: inputTerms_ }); + + Delegation memory delegation_ = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + // Get delegation hash + bytes32 delegationHash_ = EncoderLib._getDelegationHash(delegation_); + assertEq(erc20TransferAmountEnforcer.spentMap(address(delegationManager), delegationHash_), 0); + vm.prank(address(delegationManager)); + vm.expectRevert("ERC20TransferAmountEnforcer:invalid-action-length"); + erc20TransferAmountEnforcer.beforeHook(inputTerms_, hex"", action_, delegationHash_, address(0), address(0)); + + assertEq(erc20TransferAmountEnforcer.spentMap(address(delegationManager), delegationHash_), 0); + } + + // should FAIL to INVOKE invalid method + function test_methodFailsIfInvokesInvalidMethod() public { + uint256 spendingLimit_ = 1 ether; + + // Create the action_ that would be executed + Action memory action_ = Action({ + to: address(basicERC20), + value: 0, + data: abi.encodeWithSelector(IERC20.transferFrom.selector, address(users.bob.deleGator), spendingLimit_) + }); + bytes memory inputTerms_ = abi.encodePacked(address(basicERC20), spendingLimit_); + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = Caveat({ args: hex"", enforcer: address(erc20TransferAmountEnforcer), terms: inputTerms_ }); + Delegation memory delegation_ = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + // Get delegation hash + bytes32 delegationHash_ = EncoderLib._getDelegationHash(delegation_); + assertEq(erc20TransferAmountEnforcer.spentMap(address(delegationManager), delegationHash_), 0); + vm.prank(address(delegationManager)); + vm.expectRevert("ERC20TransferAmountEnforcer:invalid-method"); + + erc20TransferAmountEnforcer.beforeHook(inputTerms_, hex"", action_, delegationHash_, address(0), address(0)); + + assertEq(erc20TransferAmountEnforcer.spentMap(address(delegationManager), delegationHash_), 0); + } + + // should FAIL to INVOKE invalid terms length + function test_methodFailsIfInvokesInvalidTermsLength() public { + uint256 spendingLimit_ = 1 ether; + + // Create the action_ that would be executed + Action memory action_ = Action({ + to: address(basicERC20), + value: 0, + data: abi.encodeWithSelector(IERC20.transfer.selector, address(users.bob.deleGator), uint256(spendingLimit_)) + }); + bytes memory inputTerms_ = abi.encodePacked(address(basicERC20)); + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = Caveat({ args: hex"", enforcer: address(erc20TransferAmountEnforcer), terms: inputTerms_ }); + Delegation memory delegation_ = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + // Get delegation hash + bytes32 delegationHash_ = EncoderLib._getDelegationHash(delegation_); + assertEq(erc20TransferAmountEnforcer.spentMap(address(delegationManager), delegationHash_), 0); + vm.prank(address(delegationManager)); + vm.expectRevert("ERC20TransferAmountEnforcer:invalid-terms-length"); + + erc20TransferAmountEnforcer.beforeHook(inputTerms_, hex"", action_, delegationHash_, address(0), address(0)); + + assertEq(erc20TransferAmountEnforcer.spentMap(address(delegationManager), delegationHash_), 0); + } + + // should NOT transfer when max allowance is reached + function test_transferFailsAboveAllowance() public { + uint256 spendingLimit_ = 2 ether; + assertEq(basicERC20.balanceOf(address(users.alice.deleGator)), 100 ether); + assertEq(basicERC20.balanceOf(address(users.bob.deleGator)), 0); + + // Create the action_ that would be executed + Action memory action_ = Action({ + to: address(basicERC20), + value: 0, + data: abi.encodeWithSelector(IERC20.transfer.selector, address(users.bob.deleGator), 1 ether) + }); + bytes memory inputTerms_ = abi.encodePacked(address(basicERC20), spendingLimit_); + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = Caveat({ args: hex"", enforcer: address(erc20TransferAmountEnforcer), terms: inputTerms_ }); + Delegation memory delegation_ = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + // Store delegation + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation_)); + + // Get delegation hash + bytes32 delegationHash_ = EncoderLib._getDelegationHash(delegation_); + assertEq(erc20TransferAmountEnforcer.spentMap(address(delegationManager), delegationHash_), 0); + + // Execute Bob's UserOp + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation_; + + invokeDelegation_UserOp(users.bob, delegations_, action_); + + // Validate Alice balance 99 ether + assertEq(_getFtBalanceOf(address(users.alice.deleGator)), 99 ether); + // Validate Bob balance 1 ether + assertEq(_getFtBalanceOf(address(users.bob.deleGator)), 1 ether); + assertEq(erc20TransferAmountEnforcer.spentMap(address(delegationManager), delegationHash_), 1 ether); + + // The delegation can be reused while the allowance is enough + invokeDelegation_UserOp(users.bob, delegations_, action_); + // Validate Alice balance 98 ether + assertEq(_getFtBalanceOf(address(users.alice.deleGator)), 98 ether); + // Validate Bob balance 1 ether + assertEq(_getFtBalanceOf(address(users.bob.deleGator)), 2 ether); + assertEq(erc20TransferAmountEnforcer.spentMap(address(delegationManager), delegationHash_), spendingLimit_); + + // If allowance is not enough the transfer should not work + invokeDelegation_UserOp(users.bob, delegations_, action_); + // Validate Balances did not change when transfer are above the allowance + assertEq(_getFtBalanceOf(address(users.alice.deleGator)), 98 ether); + assertEq(_getFtBalanceOf(address(users.bob.deleGator)), 2 ether); + assertEq(erc20TransferAmountEnforcer.spentMap(address(delegationManager), delegationHash_), spendingLimit_); + } + + function _getFtBalanceOf(address _user) internal view returns (uint256) { + return basicERC20.balanceOf(_user); + } + + function _getEnforcer() internal view override returns (ICaveatEnforcer) { + return ICaveatEnforcer(address(erc20TransferAmountEnforcer)); + } +} diff --git a/test/enforcers/IdEnforcer.t.sol b/test/enforcers/IdEnforcer.t.sol new file mode 100644 index 0000000..319c45a --- /dev/null +++ b/test/enforcers/IdEnforcer.t.sol @@ -0,0 +1,121 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import "forge-std/Test.sol"; + +import "../../src/utils/Types.sol"; +import { Action } from "../../src/utils/Types.sol"; +import { Counter } from "../utils/Counter.t.sol"; +import { CaveatEnforcerBaseTest } from "./CaveatEnforcerBaseTest.t.sol"; +import { IdEnforcer } from "../../src/enforcers/IdEnforcer.sol"; +import { EncoderLib } from "../../src/libraries/EncoderLib.sol"; +import { IDelegationManager } from "../../src/interfaces/IDelegationManager.sol"; +import { ICaveatEnforcer } from "../../src/interfaces/ICaveatEnforcer.sol"; +import { BasicERC20, IERC20 } from "../utils/BasicERC20.t.sol"; + +contract IdEnforcerEnforcerTest is CaveatEnforcerBaseTest { + ////////////////////////////// State ////////////////////////////// + IdEnforcer public idEnforcer; + BasicERC20 public testFToken1; + + ////////////////////////////// Events ////////////////////////////// + + event UsedId(address indexed sender, address indexed delegator, address indexed redeemer, uint256 id); + + ////////////////////// Set up ////////////////////// + + function setUp() public override { + super.setUp(); + idEnforcer = new IdEnforcer(); + vm.label(address(idEnforcer), "Id Enforcer"); + testFToken1 = new BasicERC20(address(users.alice.deleGator), "TestToken1", "TestToken1", 100 ether); + } + + // Validates the terms get decoded correctly + function test_decodedTheTerms() public { + uint256 id_ = type(uint256).max; + bytes memory terms_ = abi.encode(id_); + assertEq(idEnforcer.getTermsInfo(terms_), id_); + } + + // Validates that the enforcer reverts and returns false once reusing the nonce + function test_blocksDelegationWithRepeatedNonce() public { + Action memory action_; + uint256 id_ = uint256(123456789); + bytes memory terms_ = abi.encode(id_); + address delegator_ = address(users.alice.deleGator); + + vm.startPrank(address(delegationManager)); + + // Before the first usage the enforcer the nonce is not used. + assertFalse(idEnforcer.getIsUsed(address(delegationManager), delegator_, id_)); + + // First usage works well + vm.expectEmit(true, true, true, true, address(idEnforcer)); + emit UsedId(address(delegationManager), address(0), delegator_, id_); + idEnforcer.beforeHook(terms_, hex"", action_, bytes32(0), delegator_, address(0)); + + // After the first usage the enforcer marks the nonce as used. + assertTrue(idEnforcer.getIsUsed(address(delegationManager), delegator_, id_)); + + // Second usage reverts, and returns false. + vm.expectRevert("IdEnforcer:id-already-used"); + + idEnforcer.beforeHook(terms_, hex"", action_, bytes32(0), delegator_, address(0)); + } + + // should FAIL to INVOKE with invalid input terms + function test_methodFailsIfCalledWithInvalidInputTerms() public { + Action memory action_; + bytes memory terms_ = abi.encodePacked(uint32(1)); + vm.expectRevert("IdEnforcer:invalid-terms-length"); + idEnforcer.beforeHook(terms_, hex"", action_, bytes32(0), address(0), address(0)); + + terms_ = abi.encodePacked(uint256(1), uint256(1)); + vm.expectRevert("IdEnforcer:invalid-terms-length"); + idEnforcer.beforeHook(terms_, hex"", action_, bytes32(0), address(0), address(0)); + } + + ////////////////////// Integration ////////////////////// + + // Should revert to use a delegation which nonce has already been used + function test_methodFailsIfNonceAlreadyUsed() public { + uint256 initialValue_ = aliceDeleGatorCounter.count(); + // Create the action that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + bytes memory inputTerms_ = abi.encode(uint256(12345)); + + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = Caveat({ args: hex"", enforcer: address(idEnforcer), terms: inputTerms_ }); + Delegation memory delegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + // Store delegation + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation)); + + // Execute Bob's UserOp + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation; + + // Enforcer allows the delegation + invokeDelegation_UserOp(users.bob, delegations_, action_); + // Validate that the count has increased by 1 + assertEq(aliceDeleGatorCounter.count(), initialValue_ + 1); + + // Enforcer blocks the delegation + invokeDelegation_UserOp(users.bob, delegations_, action_); + // Validate that the count has not increased by 1 + assertEq(aliceDeleGatorCounter.count(), initialValue_ + 1); + } + + function _getEnforcer() internal view override returns (ICaveatEnforcer) { + return ICaveatEnforcer(address(idEnforcer)); + } +} diff --git a/test/enforcers/LimitedCallsEnforcer.t.sol b/test/enforcers/LimitedCallsEnforcer.t.sol new file mode 100644 index 0000000..aedae1a --- /dev/null +++ b/test/enforcers/LimitedCallsEnforcer.t.sol @@ -0,0 +1,152 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import "forge-std/Test.sol"; + +import "../../src/utils/Types.sol"; +import { Action } from "../../src/utils/Types.sol"; +import { Counter } from "../utils/Counter.t.sol"; +import { CaveatEnforcerBaseTest } from "./CaveatEnforcerBaseTest.t.sol"; +import { LimitedCallsEnforcer } from "../../src/enforcers/LimitedCallsEnforcer.sol"; +import { EncoderLib } from "../../src/libraries/EncoderLib.sol"; +import { IDelegationManager } from "../../src/interfaces/IDelegationManager.sol"; +import { ICaveatEnforcer } from "../../src/interfaces/ICaveatEnforcer.sol"; + +contract LimitedCallsEnforcerTest is CaveatEnforcerBaseTest { + ////////////////////////////// Events ////////////////////////////// + event IncreasedCount( + address indexed sender, address indexed redeemer, bytes32 indexed delegationHash, uint256 limit, uint256 callCount + ); + + ////////////////////// State ////////////////////// + + LimitedCallsEnforcer public limitedCallsEnforcer; + + ////////////////////// Set up ////////////////////// + + function setUp() public override { + super.setUp(); + limitedCallsEnforcer = new LimitedCallsEnforcer(); + vm.label(address(limitedCallsEnforcer), "Limited Calls Enforcer"); + } + + ////////////////////// Valid cases ////////////////////// + + // should SUCCEED to INVOKE method BELOW limit number + function test_methodCanBeCalledBelowLimitNumber() public { + // Create the action that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + uint256 transactionsLimit_ = 1; + bytes memory inputTerms_ = abi.encodePacked(transactionsLimit_); + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = Caveat({ args: hex"", enforcer: address(limitedCallsEnforcer), terms: inputTerms_ }); + Delegation memory delegation_ = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + // Get delegation hash + bytes32 delegationHash_ = EncoderLib._getDelegationHash(delegation_); + assertEq(limitedCallsEnforcer.callCounts(address(delegationManager), delegationHash_), 0); + vm.prank(address(delegationManager)); + vm.expectEmit(true, true, true, true, address(limitedCallsEnforcer)); + emit IncreasedCount(address(delegationManager), address(0), delegationHash_, 1, 1); + limitedCallsEnforcer.beforeHook(inputTerms_, hex"", action_, delegationHash_, address(0), address(0)); + + assertEq(limitedCallsEnforcer.callCounts(address(delegationManager), delegationHash_), transactionsLimit_); + } + + ////////////////////// Invalid cases ////////////////////// + + // should FAIL to INVOKE method ABOVE limit number + function test_methodFailsIfCalledAboveLimitNumber() public { + // Create the action that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + uint256 transactionsLimit_ = 1; + bytes memory inputTerms_ = abi.encodePacked(transactionsLimit_); + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = Caveat({ args: hex"", enforcer: address(limitedCallsEnforcer), terms: inputTerms_ }); + Delegation memory delegation_ = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + // Get delegation hash + bytes32 delegationHash_ = EncoderLib._getDelegationHash(delegation_); + assertEq(limitedCallsEnforcer.callCounts(address(delegationManager), delegationHash_), 0); + vm.startPrank(address(delegationManager)); + limitedCallsEnforcer.beforeHook(inputTerms_, hex"", action_, delegationHash_, address(0), address(0)); + vm.expectRevert("LimitedCallsEnforcer:limit-exceeded"); + limitedCallsEnforcer.beforeHook(inputTerms_, hex"", action_, delegationHash_, address(0), address(0)); + assertEq(limitedCallsEnforcer.callCounts(address(delegationManager), delegationHash_), transactionsLimit_); + } + + // should FAIL to INVOKE with invalid input terms + function test_methodFailsIfCalledWithInvalidInputTerms() public { + Action memory action_; + bytes memory terms_ = abi.encodePacked(uint32(1)); + vm.expectRevert("LimitedCallsEnforcer:invalid-terms-length"); + limitedCallsEnforcer.beforeHook(terms_, hex"", action_, bytes32(0), address(0), address(0)); + + terms_ = abi.encodePacked(uint256(1), uint256(1)); + vm.expectRevert("LimitedCallsEnforcer:invalid-terms-length"); + limitedCallsEnforcer.beforeHook(terms_, hex"", action_, bytes32(0), address(0), address(0)); + } + + ////////////////////// Integration ////////////////////// + + // should FAIL to increment counter ABOVE limit number Integration + function test_methodFailsAboveLimitIntegration() public { + uint256 initialValue_ = aliceDeleGatorCounter.count(); + + // Create the action that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + bytes memory inputTerms_ = abi.encodePacked(uint256(1)); + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = Caveat({ args: hex"", enforcer: address(limitedCallsEnforcer), terms: inputTerms_ }); + Delegation memory delegation_ = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + + // Store delegation + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation_)); + + // Get delegation hash + bytes32 delegationHash_ = EncoderLib._getDelegationHash(delegation_); + assertEq(limitedCallsEnforcer.callCounts(address(delegationManager), delegationHash_), 0); + + // Execute Bob's UserOp + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation_; + + invokeDelegation_UserOp(users.bob, delegations_, action_); + + // Validate that the count has increased by 1 + uint256 valueAfter_ = aliceDeleGatorCounter.count(); + assertEq(valueAfter_, initialValue_ + 1); + + invokeDelegation_UserOp(users.bob, delegations_, action_); + + // Validate that the count has not increased + assertEq(aliceDeleGatorCounter.count(), valueAfter_); + assertEq(limitedCallsEnforcer.callCounts(address(delegationManager), delegationHash_), 1); + } + + function _getEnforcer() internal view override returns (ICaveatEnforcer) { + return ICaveatEnforcer(address(limitedCallsEnforcer)); + } +} diff --git a/test/enforcers/NonceEnforcer.t.sol b/test/enforcers/NonceEnforcer.t.sol new file mode 100644 index 0000000..2658db2 --- /dev/null +++ b/test/enforcers/NonceEnforcer.t.sol @@ -0,0 +1,116 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import "forge-std/Test.sol"; + +import "../../src/utils/Types.sol"; +import { Action } from "../../src/utils/Types.sol"; +import { CaveatEnforcerBaseTest } from "./CaveatEnforcerBaseTest.t.sol"; +import { NonceEnforcer } from "../../src/enforcers/NonceEnforcer.sol"; +import { ICaveatEnforcer } from "../../src/interfaces/ICaveatEnforcer.sol"; + +contract NonceEnforcerTest is CaveatEnforcerBaseTest { + ////////////////////////////// State ////////////////////////////// + NonceEnforcer public enforcer; + Action action = Action({ to: address(0), value: 0, data: hex"" }); + address delegator = address(users.alice.deleGator); + address dm = address(delegationManager); + + ////////////////////////////// Events ////////////////////////////// + + event UsedNonce(address indexed delegationManager, address indexed delegator, uint256 nonce); + + ////////////////////// Set up ////////////////////// + + function setUp() public override { + super.setUp(); + enforcer = new NonceEnforcer(); + vm.label(address(enforcer), "Nonce Enforcer"); + } + + ////////////////////// Basic Functionality ////////////////////// + + // Validates the terms get decoded correctly + function test_decodedTheTerms() public { + // 0 + uint256 nonce_; + bytes memory terms_ = abi.encode(nonce_); + assertEq(enforcer.getTermsInfo(terms_), nonce_); + + // boring integer + nonce_ = 100; + terms_ = abi.encode(nonce_); + assertEq(enforcer.getTermsInfo(terms_), nonce_); + + // uint256 max + nonce_ = type(uint256).max; + terms_ = abi.encode(nonce_); + assertEq(enforcer.getTermsInfo(terms_), nonce_); + } + + // Validates that the delegator can increment the ID + function test_allow_incrementingId() public { + assertEq(enforcer.currentNonce(dm, delegator), 0); + vm.prank(delegator); + vm.expectEmit(true, true, true, true); + emit UsedNonce(dm, delegator, 0); + enforcer.incrementNonce(dm); + assertEq(enforcer.currentNonce(dm, delegator), 1); + } + + // Validates that a valid ID doesn't revert + function test_allow_validId() public { + uint256 nonce_ = enforcer.currentNonce(dm, delegator); + bytes memory terms_ = abi.encode(nonce_); + + vm.startPrank(dm); + + // Should not revert + enforcer.beforeHook(terms_, hex"", action, bytes32(0), delegator, address(0)); + } + + ////////////////////// Errors ////////////////////// + + // Validates the terms are enforced + function test_invalid_decodedTheTerms() public { + uint256 nonce_; + bytes memory terms_ = hex""; + + // Too small + vm.expectRevert(bytes("NonceEnforcer:invalid-terms-length")); + enforcer.getTermsInfo(terms_); + + // Too large + nonce_ = 100; + terms_ = abi.encode(nonce_, nonce_); + vm.expectRevert(bytes("NonceEnforcer:invalid-terms-length")); + enforcer.getTermsInfo(terms_); + } + + // Validates that an invalid ID reverts + function test_notAllow_invalidId() public { + // Higher ID should revert + uint256 nonce_ = enforcer.currentNonce(dm, delegator); + bytes memory terms_ = abi.encode(nonce_ + 1); + vm.startPrank(dm); + vm.expectRevert(bytes("NonceEnforcer:invalid-nonce")); + enforcer.beforeHook(terms_, hex"", action, bytes32(0), delegator, address(0)); + + // Increment ID so the current ID is high enough to check a lower ID + vm.startPrank(dm); + enforcer.incrementNonce(dm); + nonce_ = enforcer.currentNonce(dm, delegator); + + // Lower ID should also revert + terms_ = abi.encode(nonce_ - 1); + vm.startPrank(dm); + vm.expectRevert(bytes("NonceEnforcer:invalid-nonce")); + enforcer.beforeHook(terms_, hex"", action, bytes32(0), delegator, address(0)); + } + + ////////////////////// Integration ////////////////////// + + function _getEnforcer() internal view override returns (ICaveatEnforcer) { + return ICaveatEnforcer(address(enforcer)); + } +} diff --git a/test/enforcers/PasswordEnforcer.t.sol b/test/enforcers/PasswordEnforcer.t.sol new file mode 100644 index 0000000..4beb68c --- /dev/null +++ b/test/enforcers/PasswordEnforcer.t.sol @@ -0,0 +1,205 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import "forge-std/Test.sol"; + +import "../../src/utils/Types.sol"; +import { Action } from "../../src/utils/Types.sol"; +import { Counter } from "../utils/Counter.t.sol"; +import { PasswordEnforcer } from "../utils/PasswordCaveatEnforcer.t.sol"; +import { CaveatEnforcerBaseTest } from "./CaveatEnforcerBaseTest.t.sol"; +import { EncoderLib } from "../../src/libraries/EncoderLib.sol"; +import { IDelegationManager } from "../../src/interfaces/IDelegationManager.sol"; +import { ICaveatEnforcer } from "../../src/interfaces/ICaveatEnforcer.sol"; +import { MessageHashUtils } from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; +import { SigningUtilsLib } from "../utils/SigningUtilsLib.t.sol"; + +contract PasswordEnforcerTest is CaveatEnforcerBaseTest { + ////////////////////////////// State ////////////////////////////// + PasswordEnforcer public passwordEnforcer; + + ////////////////////// Set up ////////////////////// + + function setUp() public override { + super.setUp(); + passwordEnforcer = new PasswordEnforcer(); + vm.label(address(passwordEnforcer), "Password Enforcer"); + } + + function test_userInputCorrectArgsWorks() public { + Action memory action_; + uint256 password_ = uint256(123456789); + bytes memory terms_ = abi.encode(password_); + address delegator_ = address(users.alice.deleGator); + + vm.startPrank(address(delegationManager)); + + // First usage works well + passwordEnforcer.beforeHook(terms_, abi.encode(password_), action_, bytes32(0), delegator_, address(0)); + } + + function test_userInputIncorrectArgs() public { + Action memory action_; + uint256 password_ = uint256(123456789); + uint256 incorrectPassword_ = uint256(5154848789); + bytes memory terms_ = abi.encode(password_); + address delegator_ = address(users.alice.deleGator); + + vm.startPrank(address(delegationManager)); + + vm.expectRevert("PasswordEnforcerError"); + + passwordEnforcer.beforeHook(terms_, abi.encode(incorrectPassword_), action_, bytes32(0), delegator_, address(0)); + } + + ////////////////////// Integration ////////////////////// + + function test_userInputCorrectArgsWorksWithOnchainDelegation() public { + uint256 initialValue_ = aliceDeleGatorCounter.count(); + // Create the action that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + bytes memory inputTerms_ = abi.encode(uint256(12345)); + bytes memory password_ = abi.encode(uint256(12345)); + + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = Caveat({ args: password_, enforcer: address(passwordEnforcer), terms: inputTerms_ }); + Delegation memory delegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + // Store delegation + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation)); + + // Execute Bob's UserOp + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation; + + // Enforcer allows the delegation + invokeDelegation_UserOp(users.bob, delegations_, action_); + // Validate that the count has increased by 1 + assertEq(aliceDeleGatorCounter.count(), initialValue_ + 1); + } + + function test_userInputIncorrectArgsWithOnchainDelegation() public { + uint256 initialValue_ = aliceDeleGatorCounter.count(); + // Create the action that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + bytes memory inputTerms_ = abi.encode(uint256(12345)); + bytes memory incorrectPassword_ = abi.encode(uint256(123154245)); + + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = Caveat({ args: incorrectPassword_, enforcer: address(passwordEnforcer), terms: inputTerms_ }); + Delegation memory delegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + // Store delegation + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation)); + + // Execute Bob's UserOp + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation; + + // Enforcer allows the delegation + invokeDelegation_UserOp(users.bob, delegations_, action_); + // Validate that the count has not increased + assertEq(aliceDeleGatorCounter.count(), initialValue_); + } + + // offchain delegation + + function test_userInputCorrectArgsWorksWithOffchainDelegation() public { + uint256 initialValue_ = aliceDeleGatorCounter.count(); + // Create the action that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + bytes memory inputTerms_ = abi.encode(uint256(12345)); + bytes memory password_ = abi.encode(uint256(12345)); + + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = Caveat({ args: password_, enforcer: address(passwordEnforcer), terms: inputTerms_ }); + Delegation memory delegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + + // Sign delegation + bytes32 delegationHash_ = EncoderLib._getDelegationHash(delegation); + bytes32 domainHash_ = delegationManager.getDomainHash(); + bytes32 typedDataHash_ = MessageHashUtils.toTypedDataHash(domainHash_, delegationHash_); + uint256[] memory pks = new uint256[](1); + pks[0] = users.alice.privateKey; + bytes memory signature_ = SigningUtilsLib.signHash_MultiSig(pks, typedDataHash_); + delegation.signature = signature_; + + // Execute Bob's UserOp + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation; + + // Enforcer allows the delegation + invokeDelegation_UserOp(users.bob, delegations_, action_); + // Validate that the count has increased by 1 + assertEq(aliceDeleGatorCounter.count(), initialValue_ + 1); + } + + function test_userInputIncorrectArgsWorksWithOffchainDelegation() public { + uint256 initialValue_ = aliceDeleGatorCounter.count(); + // Create the action that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + bytes memory inputTerms_ = abi.encode(uint256(12345)); + + bytes memory incorrectPassword_ = abi.encode(uint256(123154245)); + + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = Caveat({ args: incorrectPassword_, enforcer: address(passwordEnforcer), terms: inputTerms_ }); + Delegation memory delegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + + // Sign delegation + bytes32 delegationHash_ = EncoderLib._getDelegationHash(delegation); + bytes32 domainHash_ = delegationManager.getDomainHash(); + bytes32 typedDataHash_ = MessageHashUtils.toTypedDataHash(domainHash_, delegationHash_); + uint256[] memory pks = new uint256[](1); + pks[0] = users.alice.privateKey; + bytes memory signature_ = SigningUtilsLib.signHash_MultiSig(pks, typedDataHash_); + delegation.signature = signature_; + + // Execute Bob's UserOp + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation; + + // Enforcer allows the delegation + invokeDelegation_UserOp(users.bob, delegations_, action_); + // Validate that the count has NOT increased + assertEq(aliceDeleGatorCounter.count(), initialValue_); + } + + function _getEnforcer() internal view override returns (ICaveatEnforcer) { + return ICaveatEnforcer(address(passwordEnforcer)); + } +} diff --git a/test/enforcers/TimestampEnforcer.t.sol b/test/enforcers/TimestampEnforcer.t.sol new file mode 100644 index 0000000..af79b3c --- /dev/null +++ b/test/enforcers/TimestampEnforcer.t.sol @@ -0,0 +1,187 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import "forge-std/Test.sol"; + +import { Action, Caveat, Delegation, Delegation } from "../../src/utils/Types.sol"; +import { Counter } from "../utils/Counter.t.sol"; +import { CaveatEnforcerBaseTest } from "./CaveatEnforcerBaseTest.t.sol"; +import { TimestampEnforcer } from "../../src/enforcers/TimestampEnforcer.sol"; +import { IDelegationManager } from "../../src/interfaces/IDelegationManager.sol"; +import { DelegationManager } from "../../src/DelegationManager.sol"; +import { EncoderLib } from "../../src/libraries/EncoderLib.sol"; +import { ICaveatEnforcer } from "../../src/interfaces/ICaveatEnforcer.sol"; + +contract TimestampEnforcerTest is CaveatEnforcerBaseTest { + ////////////////////// State ////////////////////// + + TimestampEnforcer public timestampEnforcer; + + ////////////////////// Set up ////////////////////// + + function setUp() public override { + super.setUp(); + timestampEnforcer = new TimestampEnforcer(); + vm.label(address(timestampEnforcer), "Timestamp Enforcer"); + } + + ////////////////////// Valid cases ////////////////////// + + // should SUCCEED to INVOKE method AFTER timestamp reached + function test_methodCanBeCalledAfterTimestamp() public { + // Create the action that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + skip(1 hours); // Increase time 1 hour + uint128 timestampAfterThreshold_ = 1; // Minimum timestamp + uint128 timestampBeforeThreshold_ = 0; // Not using before threshold + bytes memory inputTerms_ = abi.encodePacked(timestampAfterThreshold_, timestampBeforeThreshold_); + vm.prank(address(delegationManager)); + timestampEnforcer.beforeHook(inputTerms_, hex"", action_, keccak256(""), address(0), address(0)); + } + + // should SUCCEED to INVOKE method BEFORE timestamp reached + function test_methodCanBeCalledBeforeTimestamp() public { + // Create the action that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + uint128 timestampAfterThreshold_ = 0; // Not using after threshold + uint128 timestampBeforeThreshold_ = uint128(block.timestamp + 1 hours); + bytes memory inputTerms_ = abi.encodePacked(timestampAfterThreshold_, timestampBeforeThreshold_); + vm.prank(address(delegationManager)); + timestampEnforcer.beforeHook(inputTerms_, hex"", action_, keccak256(""), address(0), address(0)); + } + + // should SUCCEED to INVOKE method inside of timestamp RANGE + function test_methodCanBeCalledInsideTimestampRange() public { + // Create the action that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + uint128 timestampAfterThreshold_ = 1; // Minimum timestamp + uint128 timestampBeforeThreshold_ = uint128(block.timestamp + 1 hours); + skip(1 minutes); // Increase time 1 minute + bytes memory inputTerms_ = abi.encodePacked(timestampAfterThreshold_, timestampBeforeThreshold_); + vm.prank(address(delegationManager)); + timestampEnforcer.beforeHook(inputTerms_, hex"", action_, keccak256(""), address(0), address(0)); + } + + ////////////////////// Invalid cases ////////////////////// + + // should FAIL to INVOKE method BEFORE timestamp reached + function test_methodFailsIfCalledTimestamp() public { + // Create the action that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + + uint128 timestampAfterThreshold_ = uint128(block.timestamp + 1 hours); + uint128 timestampBeforeThreshold_ = 0; // Not using before threshold + bytes memory inputTerms_ = abi.encodePacked(timestampAfterThreshold_, timestampBeforeThreshold_); + vm.prank(address(delegationManager)); + vm.expectRevert("TimestampEnforcer:early-delegation"); + + timestampEnforcer.beforeHook(inputTerms_, hex"", action_, keccak256(""), address(0), address(0)); + } + + // should FAIL to INVOKE method AFTER timestamp reached + function test_methodFailsIfCalledAfterTimestamp() public { + // Create the action that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + uint128 timestampAfterThreshold_ = 0; // Not using after threshold + uint128 timestampBeforeThreshold_ = uint128(block.timestamp); + skip(1 hours); // Increase time 1 hour + bytes memory inputTerms_ = abi.encodePacked(timestampAfterThreshold_, timestampBeforeThreshold_); + vm.prank(address(delegationManager)); + vm.expectRevert("TimestampEnforcer:expired-delegation"); + timestampEnforcer.beforeHook(inputTerms_, hex"", action_, keccak256(""), address(0), address(0)); + } + + // should FAIL to INVOKE method BEFORE timestamp RANGE + function test_methodFailsIfCalledBeforeTimestampRange() public { + // Create the action that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + uint128 timestampAfterThreshold_ = uint128(block.timestamp + 1 hours); + uint128 timestampBeforeThreshold_ = uint128(block.timestamp + 2 hours); + bytes memory inputTerms_ = abi.encodePacked(timestampAfterThreshold_, timestampBeforeThreshold_); + vm.prank(address(delegationManager)); + vm.expectRevert("TimestampEnforcer:early-delegation"); + timestampEnforcer.beforeHook(inputTerms_, hex"", action_, keccak256(""), address(0), address(0)); + } + + // should FAIL to INVOKE method AFTER timestamp RANGE + function test_methodFailsIfCalledAfterTimestampRange() public { + // Create the action that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + uint128 timestampAfterThreshold_ = uint128(block.timestamp + 1 hours); + uint128 timestampBeforeThreshold_ = uint128(block.timestamp + 2 hours); + skip(3 hours); // Increase time 3 hours + bytes memory inputTerms_ = abi.encodePacked(timestampAfterThreshold_, timestampBeforeThreshold_); + vm.prank(address(delegationManager)); + vm.expectRevert("TimestampEnforcer:expired-delegation"); + timestampEnforcer.beforeHook(inputTerms_, hex"", action_, keccak256(""), address(0), address(0)); + } + + // should FAIL to INVOKE with invalid input terms + function test_methodFailsIfCalledWithInvalidInputTerms() public { + Action memory action_; + bytes memory terms_ = abi.encodePacked(uint32(1)); + vm.expectRevert("TimestampEnforcer:invalid-terms-length"); + timestampEnforcer.beforeHook(terms_, hex"", action_, bytes32(0), address(0), address(0)); + + terms_ = abi.encodePacked(uint256(1), uint256(1)); + vm.expectRevert("TimestampEnforcer:invalid-terms-length"); + timestampEnforcer.beforeHook(terms_, hex"", action_, bytes32(0), address(0), address(0)); + } + ////////////////////// Integration ////////////////////// + + // should SUCCEED to INVOKE until reaching timestamp Integration + function test_methodCanBeCalledAfterTimestampIntegration() public { + uint256 initialValue_ = aliceDeleGatorCounter.count(); + // Create the action that would be executed + Action memory action_ = + Action({ to: address(aliceDeleGatorCounter), value: 0, data: abi.encodeWithSelector(Counter.increment.selector) }); + skip(10); // Increase time 10 seconds + // Not using before threshold (timestampAfterThreshold_ = 1, timestampBeforeThreshold_ = 100) + bytes memory inputTerms_ = abi.encodePacked(uint128(1), uint128(100)); + + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = Caveat({ args: hex"", enforcer: address(timestampEnforcer), terms: inputTerms_ }); + Delegation memory delegation = Delegation({ + delegate: address(users.bob.deleGator), + delegator: address(users.alice.deleGator), + authority: ROOT_AUTHORITY, + caveats: caveats_, + salt: 0, + signature: hex"" + }); + // Store delegation + execute_UserOp(users.alice, abi.encodeWithSelector(IDelegationManager.delegate.selector, delegation)); + + // Execute Bob's UserOp + Delegation[] memory delegations_ = new Delegation[](1); + delegations_[0] = delegation; + + // Enforcer allows the delegation + invokeDelegation_UserOp(users.bob, delegations_, action_); + + // Get final count + uint256 valueAfter_ = aliceDeleGatorCounter.count(); + + // Validate that the count has increased by 1 + assertEq(valueAfter_, initialValue_ + 1); + + // Enforcer blocks the delegation + skip(100); // Increase time 100 seconds + invokeDelegation_UserOp(users.bob, delegations_, action_); + // Get final count + uint256 finalValue_ = aliceDeleGatorCounter.count(); + // Validate that the count has not increased by 1 + assertEq(finalValue_, initialValue_ + 1); + } + + function _getEnforcer() internal view override returns (ICaveatEnforcer) { + return ICaveatEnforcer(address(timestampEnforcer)); + } +} diff --git a/test/enforcers/ValueLteEnforcer.t.sol b/test/enforcers/ValueLteEnforcer.t.sol new file mode 100644 index 0000000..1e3bc5e --- /dev/null +++ b/test/enforcers/ValueLteEnforcer.t.sol @@ -0,0 +1,114 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import "forge-std/Test.sol"; +import { BasicERC20 } from "../utils/BasicERC20.t.sol"; + +import "../../src/utils/Types.sol"; +import { Action } from "../../src/utils/Types.sol"; +import { CaveatEnforcerBaseTest } from "./CaveatEnforcerBaseTest.t.sol"; +import { ValueLteEnforcer } from "../../src/enforcers/ValueLteEnforcer.sol"; +import { ICaveatEnforcer } from "../../src/interfaces/ICaveatEnforcer.sol"; + +contract ValueLteEnforcerTest is CaveatEnforcerBaseTest { + ////////////////////////////// State ////////////////////////////// + ValueLteEnforcer public enforcer; + BasicERC20 public token; + address delegator; + + ////////////////////////////// Events ////////////////////////////// + + ////////////////////// Set up ////////////////////// + + function setUp() public override { + super.setUp(); + delegator = address(users.alice.deleGator); + enforcer = new ValueLteEnforcer(); + vm.label(address(enforcer), "Value LTE Enforcer"); + } + + ////////////////////// Basic Functionality ////////////////////// + + // Validates the terms get decoded correctly + function test_allow_decodeTerms() public { + bytes memory terms_; + uint256 amount_; + + // 0 + terms_ = abi.encodePacked(uint256(0)); + amount_ = enforcer.getTermsInfo(terms_); + assertEq(amount_, 0); + + // 1 ether + terms_ = abi.encodePacked(uint256(1 ether)); + amount_ = enforcer.getTermsInfo(terms_); + assertEq(amount_, uint256(1 ether)); + + // Max + terms_ = abi.encodePacked(type(uint256).max); + amount_ = enforcer.getTermsInfo(terms_); + assertEq(amount_, type(uint256).max); + } + + // Validates that valid values don't revert + function test_allow_valueLte() public { + // Equal + bytes memory terms_ = abi.encodePacked(uint256(1 ether)); + Action memory action_ = Action({ + to: address(users.alice.deleGator), + value: 1 ether, + data: abi.encodeWithSignature("test_valueLteIsAllowed()") + }); + + // Should not revert + enforcer.beforeHook(terms_, "", action_, bytes32(0), address(0), address(0)); + + // Less than + action_ = Action({ + to: address(users.alice.deleGator), + value: 0.1 ether, + data: abi.encodeWithSignature("test_valueLteIsAllowed()") + }); + + // Should not revert + enforcer.beforeHook(terms_, "", action_, bytes32(0), address(0), address(0)); + } + + //////////////////////// Errors //////////////////////// + + // Validates that invalid values revert + function test_notAllow_valueGt() public { + // Gt + bytes memory terms_ = abi.encodePacked(uint256(1 ether)); + Action memory action_ = Action({ + to: address(users.alice.deleGator), + value: 2 ether, + data: abi.encodeWithSignature("test_valueLteIsAllowed()") + }); + + // Should not revert + vm.expectRevert(bytes("ValueLteEnforcer:value-too-high")); + enforcer.beforeHook(terms_, "", action_, bytes32(0), address(0), address(0)); + } + + // Validates the terms are well formed + function test_notAllow_decodeTerms() public { + bytes memory terms_; + + // Too small + terms_ = abi.encodePacked(uint8(100), address(token)); + vm.expectRevert(bytes("ValueLteEnforcer:invalid-terms-length")); + enforcer.getTermsInfo(terms_); + + // Too large + terms_ = abi.encodePacked(uint256(100), uint256(100)); + vm.expectRevert(bytes("ValueLteEnforcer:invalid-terms-length")); + enforcer.getTermsInfo(terms_); + } + + ////////////////////// Integration ////////////////////// + + function _getEnforcer() internal view override returns (ICaveatEnforcer) { + return ICaveatEnforcer(address(enforcer)); + } +} diff --git a/test/metaTests/EncoderLibTest.t.sol b/test/metaTests/EncoderLibTest.t.sol new file mode 100644 index 0000000..e188e95 --- /dev/null +++ b/test/metaTests/EncoderLibTest.t.sol @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { Test } from "forge-std/Test.sol"; + +import { Caveat, Delegation } from "../../src/utils/Types.sol"; +import { DELEGATION_TYPEHASH, CAVEAT_TYPEHASH } from "../../src/utils/Typehashes.sol"; +import { EncoderLib } from "../../src/libraries/EncoderLib.sol"; + +contract EncoderLibTest is Test { + ////////////////////////////// State ////////////////////////////// + + // Hardcoding to avoid issues with changes in the addresses + address public aliceMultisigDelegatorAddr = 0x5E0B4Bfa0B55932A3587E648c3552a6515bA56b1; + address public bobMultisigDelegatorAddr = 0x88e3925A1E07598a499dC669515881D061857cdb; + address public blockNumberEnforcerAddr = 0x76025d09bf6aC34F5c9F859912baC5F65BB97001; + address public timestampEnforcerAddr = 0x6F29F39ba24d0dAF942680248c5f00730f9f52Ef; + address public allowTargetsEnforcerAddr = 0x7e713BC29EbAfcbE64d1682cD7289714998a90f1; + + ////////////////////// Tests ////////////////////// + + function test_shouldEncodeOneDelegation() public { + Caveat[] memory caveats_ = new Caveat[](1); + caveats_[0] = Caveat({ args: hex"", enforcer: blockNumberEnforcerAddr, terms: abi.encodePacked(uint128(1), uint128(100)) }); + Delegation memory delegation_ = Delegation({ + delegate: bobMultisigDelegatorAddr, + delegator: aliceMultisigDelegatorAddr, + authority: keccak256("ROOT_AUTHORITY"), + caveats: caveats_, + salt: 0, + signature: hex"" + }); + bytes32 obtained_ = EncoderLib._getDelegationHash(delegation_); + + bytes32 hardcoded_ = bytes32(0x17b386a868324fe36266f1d32ef4a68e5f89e53aa8023de79567843ab9e8fb54); + assertEq(obtained_, hardcoded_); + } + + function test_ShouldEncodeOneCaveat() public { + Caveat memory caveat = + Caveat({ args: hex"", enforcer: allowTargetsEnforcerAddr, terms: abi.encodePacked(aliceMultisigDelegatorAddr) }); + bytes32 obtained = EncoderLib._getCaveatPacketHash(caveat); + bytes32 expected = getCaveatPacketHash(caveat); + assertEq(obtained, expected); + bytes32 hardcoded = bytes32(0x973aad287fdc46b4b022335f1282984f5da8deee226ab84e594e3b7c3071a379); + assertEq(obtained, hardcoded); + } + + function test_ShouldEncodeAnArrayOfCaveats() public { + Caveat[] memory caveats = new Caveat[](2); + caveats[0] = + Caveat({ args: hex"", enforcer: allowTargetsEnforcerAddr, terms: abi.encodePacked(aliceMultisigDelegatorAddr) }); + caveats[1] = Caveat({ args: hex"", enforcer: blockNumberEnforcerAddr, terms: abi.encodePacked(uint128(1), uint128(100)) }); + + bytes32 obtained = EncoderLib._getCaveatArrayPacketHash(caveats); + bytes32 expected = getCaveatArrayPacketHash(caveats); + assertEq(obtained, expected); + bytes32 hardcoded = bytes32(0x6c132d7477be706e424d1309fe04c4580c7a01680f5e94521b288d4aa185389f); + assertEq(obtained, hardcoded); + } + + ////////////////////// Utils ////////////////////// + + /** + * Gas intensive function to get the hash of a Caveat. + */ + function getCaveatPacketHash(Caveat memory _input) public pure returns (bytes32) { + bytes memory encoded = abi.encode(CAVEAT_TYPEHASH, _input.enforcer, keccak256(_input.terms)); + return keccak256(encoded); + } + + /** + * Gas intensive function to get the hash of a Caveat array. + */ + function getCaveatArrayPacketHash(Caveat[] memory _input) public pure returns (bytes32) { + bytes memory encoded; + for (uint256 i = 0; i < _input.length; ++i) { + encoded = abi.encodePacked(encoded, getCaveatPacketHash(_input[i])); + } + return keccak256(encoded); + } +} diff --git a/test/metaTests/StorageUtilsLibTest.t.sol b/test/metaTests/StorageUtilsLibTest.t.sol new file mode 100644 index 0000000..a184067 --- /dev/null +++ b/test/metaTests/StorageUtilsLibTest.t.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import "forge-std/Test.sol"; + +import { StorageUtilsLib } from "../utils/StorageUtilsLib.t.sol"; + +contract StorageUtilsLibTest is Test { + function testToBool() public { + uint8 one_ = 1; + uint8 zero_ = 0; + + bytes memory t_ = abi.encode(one_); + bytes memory f_ = abi.encode(zero_); + + assertTrue(StorageUtilsLib.toBool(t_, 31)); + assertFalse(StorageUtilsLib.toBool(f_, 31)); + + t_ = abi.encodePacked(one_); + f_ = abi.encodePacked(zero_); + + assertTrue(StorageUtilsLib.toBool(t_, 0)); + assertFalse(StorageUtilsLib.toBool(f_, 0)); + } +} diff --git a/test/metaTests/TypehashTest.t.sol b/test/metaTests/TypehashTest.t.sol new file mode 100644 index 0000000..8d8d066 --- /dev/null +++ b/test/metaTests/TypehashTest.t.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import "forge-std/Test.sol"; + +import { EIP712_DOMAIN_TYPEHASH, DELEGATION_TYPEHASH, CAVEAT_TYPEHASH } from "../../src/utils/Typehashes.sol"; + +contract TypehashTest is Test { + ////////////////////////////// State ////////////////////////////// + + string public caveat = "Caveat(address enforcer,bytes terms)"; + string public delegation = "Delegation(address delegate,address delegator,bytes32 authority,Caveat[] caveats,uint256 salt)"; + string public eip712Domain = "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"; + + function test_CaveatTypehash() public { + assertEq(CAVEAT_TYPEHASH, _hashPacked(caveat)); + } + + function test_DelegationTypehash() public { + string[] memory types_ = new string[](2); + types_[0] = delegation; + types_[1] = caveat; + string memory complete_ = _append(types_); + assertEq(DELEGATION_TYPEHASH, _hashPacked(complete_)); + } + + function test_EIP712DomainTypehash() public { + assertEq(EIP712_DOMAIN_TYPEHASH, _hashPacked(eip712Domain)); + } + + ////////////////////// Utils ////////////////////// + + function _hashPacked(string memory _message) internal pure returns (bytes32) { + return keccak256(abi.encodePacked(_message)); + } + + function _append(string[] memory _message) internal pure returns (string memory main_) { + main_ = _message[0]; + for (uint256 i = 1; i < _message.length; i++) { + main_ = string(abi.encodePacked(main_, _message[i])); + } + } +} diff --git a/test/utils/AccountSorterLib.t.sol b/test/utils/AccountSorterLib.t.sol new file mode 100644 index 0000000..12f851a --- /dev/null +++ b/test/utils/AccountSorterLib.t.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +library AccountSorterLib { + ////////////////////////////// External Methods ////////////////////////////// + + function sortAddressesWithPrivateKeys( + address[] memory addresses, + uint256[] memory privateKeys + ) + external + pure + returns (address[] memory, uint256[] memory) + { + require(addresses.length == privateKeys.length, "AccountSorterLib:lengths-mismatch"); + _quickSort(addresses, privateKeys, int256(0), int256(addresses.length - 1)); + return (addresses, privateKeys); + } + + ////////////////////////////// Internal Methods ////////////////////////////// + + function _quickSort(address[] memory arr, uint256[] memory privateKeys, int256 left, int256 right) internal pure { + if (left < right) { + int256 pivotIndex = _partition(arr, privateKeys, left, right); + _quickSort(arr, privateKeys, left, pivotIndex - 1); + _quickSort(arr, privateKeys, pivotIndex + 1, right); + } + } + + function _partition( + address[] memory arr, + uint256[] memory privateKeys, + int256 left, + int256 right + ) + internal + pure + returns (int256) + { + address pivot = arr[uint256(right)]; + int256 i = left - 1; + + for (int256 j = left; j < right; j++) { + if (arr[uint256(j)] <= pivot) { + i++; + (arr[uint256(i)], arr[uint256(j)]) = (arr[uint256(j)], arr[uint256(i)]); + (privateKeys[uint256(i)], privateKeys[uint256(j)]) = (privateKeys[uint256(j)], privateKeys[uint256(i)]); + } + } + + (arr[uint256(i + 1)], arr[uint256(right)]) = (arr[uint256(right)], arr[uint256(i + 1)]); + (privateKeys[uint256(i + 1)], privateKeys[uint256(right)]) = (privateKeys[uint256(right)], privateKeys[uint256(i + 1)]); + + return i + 1; + } +} diff --git a/test/utils/BaseTest.t.sol b/test/utils/BaseTest.t.sol new file mode 100644 index 0000000..2de7ab1 --- /dev/null +++ b/test/utils/BaseTest.t.sol @@ -0,0 +1,425 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { Test } from "forge-std/Test.sol"; +import { Vm } from "forge-std/Vm.sol"; +import { StdCheatsSafe } from "forge-std/StdCheats.sol"; +import { EntryPoint } from "@account-abstraction/core/EntryPoint.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { FCL_ecdsa_utils } from "@freshCryptoLib/FCL_ecdsa_utils.sol"; +import { MessageHashUtils } from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; +import { IEntryPoint } from "@account-abstraction/core/EntryPoint.sol"; + +// import { P256 } from "../../src/external/Daimo/P256.sol"; +import { P256FCLVerifierLib } from "../../src/libraries/P256FCLVerifierLib.sol"; +import { FCL_all_wrapper } from "./FCLWrapperLib.sol"; + +import { EncoderLib } from "../../src/libraries/EncoderLib.sol"; +import { TestUser, TestUsers, Implementation, SignatureType } from "./Types.t.sol"; +import { SigningUtilsLib } from "./SigningUtilsLib.t.sol"; +import { StorageUtilsLib } from "./StorageUtilsLib.t.sol"; +import { Action, PackedUserOperation, Delegation } from "../../src/utils/Types.sol"; +import { SimpleFactory } from "./SimpleFactory.sol"; +import { DelegationManager } from "../../src/DelegationManager.sol"; +import { IDeleGatorCoreFull } from "../../src/interfaces/IDeleGatorCoreFull.sol"; +import { HybridDeleGator } from "../../src/HybridDeleGator.sol"; +import { MultiSigDeleGator } from "../../src/MultiSigDeleGator.sol"; + +abstract contract BaseTest is Test { + using MessageHashUtils for bytes32; + + SignatureType public SIGNATURE_TYPE; + Implementation public IMPLEMENTATION; + + ////////////////////////////// State ////////////////////////////// + + // Constants + bytes32 public ROOT_AUTHORITY; + address public ANY_DELEGATE; + + // ERC4337 + EntryPoint public entryPoint; + + // Simple Factory + SimpleFactory public simpleFactory; + + // Delegation Manager + DelegationManager public delegationManager; + + // DeleGator Implementations + HybridDeleGator public hybridDeleGatorImpl; + MultiSigDeleGator public multiSigDeleGatorImpl; + + // Users + TestUsers internal users; + address payable bundler; + + // Tracks the user's nonce + mapping(address user => uint256 nonce) public senderNonce; + + ////////////////////////////// Set Up ////////////////////////////// + + function setUp() public virtual { + // Create 4337 EntryPoint + entryPoint = new EntryPoint(); + vm.label(address(entryPoint), "EntryPoint"); + + // Create Simple Factory + simpleFactory = new SimpleFactory(); + vm.label(address(simpleFactory), "Simple Factory"); + + // DelegationManager + delegationManager = new DelegationManager(makeAddr("DelegationManager Owner")); + vm.label(address(delegationManager), "Delegation Manager"); + + // Set constant values for easy access + ROOT_AUTHORITY = delegationManager.ROOT_AUTHORITY(); + ANY_DELEGATE = delegationManager.ANY_DELEGATE(); + + // Create P256 Verifier Contract + vm.etch(P256FCLVerifierLib.VERIFIER, type(FCL_all_wrapper).runtimeCode); + vm.label(P256FCLVerifierLib.VERIFIER, "P256 Verifier"); + + // Deploy the implementations + hybridDeleGatorImpl = new HybridDeleGator(delegationManager, entryPoint); + vm.label(address(hybridDeleGatorImpl), "Hybrid DeleGator"); + + multiSigDeleGatorImpl = new MultiSigDeleGator(delegationManager, entryPoint); + vm.label(address(multiSigDeleGatorImpl), "MultiSig DeleGator"); + + // Create users + users = _createUsers(); + + // Create the bundler + bundler = payable(makeAddr("Bundler")); + vm.deal(bundler, 100 ether); + } + + ////////////////////////////// Public ////////////////////////////// + + function signHash(TestUser memory _user, bytes32 _hash) public view returns (bytes memory) { + return signHash(SIGNATURE_TYPE, _user, _hash); + } + + function signHash(SignatureType _signatureType, TestUser memory _user, bytes32 _hash) public pure returns (bytes memory) { + if (_signatureType == SignatureType.EOA) { + return SigningUtilsLib.signHash_EOA(_user.privateKey, _hash); + } else if (_signatureType == SignatureType.MultiSig) { + uint256[] memory privateKeys_ = new uint256[](1); + privateKeys_[0] = _user.privateKey; + return SigningUtilsLib.signHash_MultiSig(privateKeys_, _hash); + } else if (_signatureType == SignatureType.RawP256) { + return SigningUtilsLib.signHash_P256(_user.name, _user.privateKey, _hash); + } else { + revert("Invalid Signature Type"); + } + } + + /// @notice Uses the private key to sign a delegation. + /// @dev NOTE: Assumes MultiSigDeleGator has a single signer with a threshold of 1. + function signDelegation( + TestUser memory _user, + Delegation memory _delegation + ) + public + view + returns (Delegation memory delegation_) + { + bytes32 delegationHash_ = EncoderLib._getDelegationHash(_delegation); + bytes32 domainHash_ = delegationManager.getDomainHash(); + bytes32 typedDataHash_ = MessageHashUtils.toTypedDataHash(domainHash_, delegationHash_); + delegation_ = Delegation({ + delegate: _delegation.delegate, + delegator: _delegation.delegator, + authority: _delegation.authority, + caveats: _delegation.caveats, + salt: _delegation.salt, + signature: signHash(_user, typedDataHash_) + }); + } + + /// @notice Creates an unsigned UserOperation with the nonce prefilled. + function createUserOp( + address _sender, + bytes memory _callData, + bytes memory _initCode, + bytes32 _accountGasLimits, + uint256 _preVerificationGas, + bytes32 _gasFees, + bytes memory _paymasterAndData, + bytes memory _signature + ) + public + returns (PackedUserOperation memory userOperation_) + { + vm.txGasPrice(2); + + userOperation_ = PackedUserOperation({ + sender: _sender, + nonce: senderNonce[_sender]++, + initCode: _initCode, + callData: _callData, + accountGasLimits: _accountGasLimits, + preVerificationGas: _preVerificationGas, + gasFees: _gasFees, + paymasterAndData: _paymasterAndData, + signature: _signature + }); + } + + /// @notice Creates an unsigned UserOperation with paymaster with default values. + function createUserOp( + address _sender, + bytes memory _callData + ) + public + returns (PackedUserOperation memory PackedUserOperation_) + { + return createUserOp(_sender, _callData, hex"", hex""); + } + + /// @notice Creates an unsigned UserOperation with paymaster with default values. + function createUserOp( + address _sender, + bytes memory _callData, + bytes memory _initCode + ) + public + returns (PackedUserOperation memory userOperation_) + { + return createUserOp(_sender, _callData, _initCode, hex""); + } + + /// @notice Creates an unsigned UserOperation with paymaster with default values. + function createUserOp( + address _sender, + bytes memory _callData, + bytes memory _initCode, + bytes memory _paymasterAndData + ) + public + returns (PackedUserOperation memory userOperation_) + { + uint128 verificationGasLimit_ = 30000000; + uint128 callGasLimit_ = 30000000; + uint128 maxPriorityFeePerGas = 1; + uint128 maxFeePerGas_ = 1; + bytes32 accountGasLimits_ = bytes32(abi.encodePacked(verificationGasLimit_, callGasLimit_)); + bytes32 gasFees_ = bytes32(abi.encodePacked(maxPriorityFeePerGas, maxFeePerGas_)); + + return createUserOp(_sender, _callData, _initCode, accountGasLimits_, 30000000, gasFees_, _paymasterAndData, hex""); + } + + function signUserOp( + TestUser memory _user, + PackedUserOperation memory _userOp + ) + public + view + returns (PackedUserOperation memory) + { + return signUserOp(_user, _userOp, entryPoint); + } + + function signUserOp( + TestUser memory _user, + PackedUserOperation memory _userOp, + IEntryPoint _entryPoint + ) + public + view + returns (PackedUserOperation memory) + { + bytes32 userOpHash_ = _entryPoint.getUserOpHash(_userOp); + _userOp.signature = signHash(_user, userOpHash_.toEthSignedMessageHash()); + return _userOp; + } + + function createAndSignUserOp( + TestUser memory _user, + address _sender, + bytes memory _callData, + bytes memory _initCode + ) + public + returns (PackedUserOperation memory userOperation_) + { + userOperation_ = createUserOp(_sender, _callData, _initCode); + userOperation_ = signUserOp(_user, userOperation_); + } + + function createAndSignUserOp( + TestUser memory _user, + address _sender, + bytes memory _callData, + bytes memory _initCode, + bytes memory _paymasterAndData + ) + public + returns (PackedUserOperation memory userOperation_) + { + userOperation_ = createUserOp(_sender, _callData, _initCode, _paymasterAndData); + userOperation_ = signUserOp(_user, userOperation_); + } + + function createAndSignUserOp( + TestUser memory _user, + address _sender, + bytes memory _callData + ) + public + returns (PackedUserOperation memory userOperation_) + { + userOperation_ = createAndSignUserOp(_user, _sender, _callData, hex""); + } + + function execute_UserOp(TestUser memory _user, Action memory _action) public { + execute_UserOp(_user, _action, false); + } + + function execute_UserOp(TestUser memory _user, Action memory _action, bool _shouldFail) public { + execute_UserOp(_user, _action, hex"", _shouldFail); + } + + function execute_UserOp( + TestUser memory _user, + Action memory _action, + bytes memory _paymasterAndData, + bool _shouldFail + ) + public + { + bytes memory userOpCallData_ = abi.encodeWithSelector(IDeleGatorCoreFull.execute.selector, _action); + PackedUserOperation memory userOp_ = createUserOp(address(_user.deleGator), userOpCallData_, hex"", _paymasterAndData); + bytes32 userOpHash_ = entryPoint.getUserOpHash(userOp_); + userOp_.signature = signHash(_user, userOpHash_.toEthSignedMessageHash()); + submitUserOp_Bundler(userOp_, _shouldFail); + } + + function execute_UserOp(TestUser memory _user, bytes memory _callData) public { + Action memory action_ = Action({ to: address(_user.deleGator), value: 0, data: _callData }); + execute_UserOp(_user, action_); + } + + function executeBatch_UserOp(TestUser memory _user, Action[] memory _actions) public { + bytes memory userOpCallData_ = abi.encodeWithSelector(IDeleGatorCoreFull.executeBatch.selector, _actions); + PackedUserOperation memory userOp_ = createUserOp(address(_user.deleGator), userOpCallData_); + bytes32 userOpHash_ = entryPoint.getUserOpHash(userOp_); + userOp_.signature = signHash(_user, userOpHash_.toEthSignedMessageHash()); + submitUserOp_Bundler(userOp_, false); + } + + function invokeDelegation_UserOp(TestUser memory _user, Delegation[] memory _delegations, Action memory _action) public { + return invokeDelegation_UserOp(_user, _delegations, _action, hex""); + } + + function invokeDelegation_UserOp( + TestUser memory _user, + Delegation[] memory _delegations, + Action memory _action, + bytes memory _initCode + ) + public + { + bytes memory userOpCallData_ = + abi.encodeWithSelector(IDeleGatorCoreFull.redeemDelegation.selector, abi.encode(_delegations), _action); + PackedUserOperation memory userOp_ = createUserOp(address(_user.deleGator), userOpCallData_, _initCode); + bytes32 userOpHash_ = entryPoint.getUserOpHash(userOp_); + userOp_.signature = signHash(_user, userOpHash_.toEthSignedMessageHash()); + submitUserOp_Bundler(userOp_, false); + } + + function submitUserOp_Bundler(PackedUserOperation memory _userOp) public { + submitUserOp_Bundler(_userOp, false); + } + + function submitUserOp_Bundler(PackedUserOperation memory _userOp, bool _shouldFail) public { + PackedUserOperation[] memory userOps_ = new PackedUserOperation[](1); + userOps_[0] = _userOp; + vm.prank(bundler); + if (_shouldFail) vm.expectRevert(); + entryPoint.handleOps(userOps_, payable(bundler)); + } + + function deployDeleGator(TestUser memory _user) public returns (address) { + return deployDeleGator(IMPLEMENTATION, _user); + } + + function deployDeleGator(Implementation _implementation, TestUser memory _user) public returns (address) { + if (_implementation == Implementation.Hybrid) { + return deployDeleGator_Hybrid(_user); + } else if (_implementation == Implementation.MultiSig) { + return deployDeleGator_MultiSig(_user); + } else { + revert("Invalid Implementation"); + } + } + + function deployDeleGator_MultiSig(TestUser memory _user) public returns (address) { + address[] memory owners_ = new address[](1); + owners_[0] = _user.addr; + return deployDeleGator_MultiSig(owners_, 1); + } + + function deployDeleGator_MultiSig(address[] memory _owners, uint256 _threshold) public returns (address) { + return address( + new ERC1967Proxy( + address(multiSigDeleGatorImpl), abi.encodeWithSignature("initialize(address[],uint256)", _owners, _threshold) + ) + ); + } + + function deployDeleGator_Hybrid(TestUser memory _user) public returns (address) { + string[] memory keyIds_ = new string[](1); + uint256[] memory xValues_ = new uint256[](1); + uint256[] memory yValues_ = new uint256[](1); + keyIds_[0] = _user.name; + xValues_[0] = _user.x; + yValues_[0] = _user.y; + return deployDeleGator_Hybrid(_user.addr, keyIds_, xValues_, yValues_); + } + + function deployDeleGator_Hybrid( + address _owner, + string[] memory _keyIds, + uint256[] memory _xValues, + uint256[] memory _yValues + ) + public + returns (address) + { + return address( + new ERC1967Proxy( + address(hybridDeleGatorImpl), + abi.encodeWithSignature("initialize(address,string[],uint256[],uint256[])", _owner, _keyIds, _xValues, _yValues) + ) + ); + } + + // Name is the seed used to generate the address, private key, and DeleGator. + function createUser(string memory _name) public returns (TestUser memory user_) { + (address addr_, uint256 privateKey_) = makeAddrAndKey(_name); + vm.deal(addr_, 100 ether); + vm.label(addr_, _name); + + user_.name = _name; + user_.addr = payable(addr_); + user_.privateKey = privateKey_; + (user_.x, user_.y) = FCL_ecdsa_utils.ecdsa_derivKpub(user_.privateKey); + user_.deleGator = IDeleGatorCoreFull(deployDeleGator(user_)); + + vm.deal(address(user_.deleGator), 100 ether); + vm.label(address(user_.deleGator), string.concat(_name, " DeleGator")); + } + + ////////////////////////////// Private ////////////////////////////// + + function _createUsers() private returns (TestUsers memory users_) { + users_.alice = createUser("Alice"); + users_.bob = createUser("Bob"); + users_.carol = createUser("Carol"); + users_.dave = createUser("Dave"); + users_.eve = createUser("Eve"); + users_.frank = createUser("Frank"); + } +} diff --git a/test/utils/BasicCF721.t.sol b/test/utils/BasicCF721.t.sol new file mode 100644 index 0000000..ce716fb --- /dev/null +++ b/test/utils/BasicCF721.t.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 + +pragma solidity 0.8.23; + +import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol"; +import { Ownable2Step, Ownable } from "@openzeppelin/contracts/access/Ownable2Step.sol"; + +contract BasicCF721 is ERC721, Ownable2Step { + ////////////////////////////// State ////////////////////////////// + + uint256 public tokenId; + mapping(uint256 => string) public tokenURIs; + string public baseURI; + + ////////////////////////////// Constructor ////////////////////////////// + + constructor( + address _owner, + string memory _name, + string memory _symbol, + string memory _baseUri + ) + ERC721(_name, _symbol) + Ownable(_owner) + { + baseURI = _baseUri; + } + + ////////////////////////////// External Methods ////////////////////////////// + + function setBaseURI(string memory _baseUri) external onlyOwner { + baseURI = _baseUri; + } + + function mint(address _to) public onlyOwner { + _mint(_to, tokenId); + tokenId++; + } + + function selfMint() public onlyOwner { + mint(msg.sender); + } + + function mintWithMetadata(address _to, string memory _metadataUri) public onlyOwner { + tokenURIs[tokenId] = _metadataUri; + mint(_to); + } + + function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { + return tokenURIs[_tokenId]; + } + + ////////////////////////////// Internal Methods ////////////////////////////// + + function _baseURI() internal view virtual override returns (string memory) { + return baseURI; + } +} diff --git a/test/utils/BasicERC20.t.sol b/test/utils/BasicERC20.t.sol new file mode 100644 index 0000000..2f989d2 --- /dev/null +++ b/test/utils/BasicERC20.t.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 + +pragma solidity 0.8.23; + +import { ERC20, IERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import { Ownable2Step, Ownable } from "@openzeppelin/contracts/access/Ownable2Step.sol"; + +contract BasicERC20 is ERC20, Ownable { + ////////////////////////////// Constructor ////////////////////////////// + + /// @dev Initializes the BasicERC20 contract. + /// @param _owner The owner of the ERC20 token. Also addres that received the initial amount of tokens. + /// @param _name The name of the ERC20 token. + /// @param _symbol The symbol of the ERC20 token. + /// @param _initialAmount The initial supply of the ERC20 token. + constructor( + address _owner, + string memory _name, + string memory _symbol, + uint256 _initialAmount + ) + Ownable(_owner) + ERC20(_name, _symbol) + { + if (_initialAmount > 0) _mint(_owner, _initialAmount); + } + + ////////////////////////////// External Methods ////////////////////////////// + + /// @dev Allows the onwner to burn tokens from the specified user. + /// @param _user The address of the user from whom the tokens will be burned. + /// @param _amount The amount of tokens to burn. + function burn(address _user, uint256 _amount) external onlyOwner { + _burn(_user, _amount); + } + + /// @dev Allows the owner to mint new tokens and assigns them to the specified user. + /// @param _user The address of the user to whom the tokens will be minted. + /// @param _amount The amount of tokens to mint. + function mint(address _user, uint256 _amount) external onlyOwner { + _mint(_user, _amount); + } +} diff --git a/test/utils/Counter.t.sol b/test/utils/Counter.t.sol new file mode 100644 index 0000000..736f15e --- /dev/null +++ b/test/utils/Counter.t.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { Ownable2Step, Ownable } from "@openzeppelin/contracts/access/Ownable2Step.sol"; + +contract Counter is Ownable { + ////////////////////////////// State ////////////////////////////// + + uint256 public count = 0; + + ////////////////////////////// Constructor ////////////////////////////// + + constructor(address _initialOwner) Ownable(_initialOwner) { } + + ////////////////////////////// External Methods ////////////////////////////// + + function setCount(uint256 _newCount) public { + count = _newCount; + } + + function increment() public onlyOwner { + count++; + } +} diff --git a/test/utils/FCLWrapperLib.sol b/test/utils/FCLWrapperLib.sol new file mode 100644 index 0000000..3609e19 --- /dev/null +++ b/test/utils/FCLWrapperLib.sol @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { FCL_ecdsa } from "@freshCryptoLib/FCL_ecdsa.sol"; +import { FCL_ecdsa_utils } from "@freshCryptoLib/FCL_ecdsa_utils.sol"; +import { FCL_Elliptic_ZZ } from "@freshCryptoLib/FCL_elliptic.sol"; + +// NOTE - This Library has been taken from +// https://github.com/rdubois-crypto/FreshCryptoLib/blob/ec7122f20900f9486a7c018d635f69738b14dfc3/solidity/tests/WebAuthn_forge/script/DeployElliptic.s.sol#L18 +// and modified for test usage. The original returns abi.encodePacked(bool), it has been modified to use abi.encode(bool). +contract FCL_all_wrapper { + /* default is EIP7212 precompile as described in https://eips.ethereum.org/EIPS/eip-7212*/ + fallback(bytes calldata input) external returns (bytes memory) { + if ((input.length != 160) && (input.length != 180)) { + return abi.encode(0); + } + + bytes32 message = bytes32(input[0:32]); + uint256 r = uint256(bytes32(input[32:64])); + uint256 s = uint256(bytes32(input[64:96])); + uint256 Qx = uint256(bytes32(input[96:128])); + uint256 Qy = uint256(bytes32(input[128:160])); + /* no precomputations */ + if (input.length == 160) { + return abi.encode(FCL_ecdsa.ecdsa_verify(message, r, s, Qx, Qy)); + } + + /* with precomputations written at address prec (previously generated using ecdsa_precalc_8dim*/ + if (input.length == 180) { + //untested:TODO + address prec = address(uint160(uint256(bytes32(input[160:180])))); + return abi.encode(FCL_ecdsa.ecdsa_precomputed_verify(message, r, s, prec)); + } + } + + /* ecdsa functions */ + function ecdsa_verify(bytes32 message, uint256 r, uint256 s, uint256 Qx, uint256 Qy) external view returns (bool) { + return FCL_ecdsa.ecdsa_verify(message, r, s, Qx, Qy); + } + + function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) external view returns (bool) { + return FCL_ecdsa_utils.ecdsa_verify(message, rs, Q); + } + + function ecdsa_precomputed_verify(bytes32 message, uint256 r, uint256 s, address prec) external view returns (bool) { + return FCL_ecdsa.ecdsa_precomputed_verify(message, r, s, prec); + } + + function ecdsa_sign(bytes32 message, uint256 k, uint256 kpriv) external view returns (uint256 r, uint256 s) { + return FCL_ecdsa_utils.ecdsa_sign(message, k, kpriv); + } + + function ecdsa_DerivKpub(uint256 kpriv) external view returns (uint256 x, uint256 y) { + return FCL_ecdsa_utils.ecdsa_derivKpub(kpriv); + } + + function ecdsa_GenKeyPair() external view returns (uint256 kpriv, uint256 x, uint256 y) { + kpriv = block.prevrandao ^ 0xcacacacacaca; //avoid null key for chain not implementing prevrandao + (x, y) = FCL_ecdsa_utils.ecdsa_derivKpub(kpriv); + } + + function ecdsa_precalc_8dim(uint256 Qx, uint256 Qy) external view returns (uint256[2][256] memory Prec) { + return FCL_ecdsa_utils.Precalc_8dim(Qx, Qy); + } +} diff --git a/test/utils/Invalid1271.t.sol b/test/utils/Invalid1271.t.sol new file mode 100644 index 0000000..4b63232 --- /dev/null +++ b/test/utils/Invalid1271.t.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { IERC1271 } from "@openzeppelin/contracts/interfaces/IERC1271.sol"; + +contract Invalid1271Returns is IERC1271 { + /** + * @inheritdoc IERC1271 + * @dev This contract always returns false. + */ + function isValidSignature(bytes32, bytes memory) external pure returns (bytes4) { + return 0x00000000; + } +} + +contract Invalid1271Reverts is IERC1271 { + /** + * @inheritdoc IERC1271 + * @dev This contract always reverts + */ + function isValidSignature(bytes32, bytes memory) external pure returns (bytes4) { + revert("Error"); + } +} diff --git a/test/utils/PasswordCaveatEnforcer.t.sol b/test/utils/PasswordCaveatEnforcer.t.sol new file mode 100644 index 0000000..636c629 --- /dev/null +++ b/test/utils/PasswordCaveatEnforcer.t.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { CaveatEnforcer } from "../../src/enforcers/CaveatEnforcer.sol"; +import { Action } from "../../src/utils/Types.sol"; + +/** + * @title Password Enforcer + * @dev This contract is used only to test the caveat args that are passed in by the redeemer. + */ +contract PasswordEnforcer is CaveatEnforcer { + ////////////////////////////// Public Methods ////////////////////////////// + + /** + * @notice Testing user inputed args. + * @param _terms A bytes32 that will be hashed. + */ + function beforeHook( + bytes calldata _terms, + bytes calldata _args, + Action calldata, + bytes32, + address, + address + ) + public + pure + override + { + bytes32 hash_ = keccak256(_args); + if (hash_ != keccak256(_terms)) revert("PasswordEnforcerError"); + } +} diff --git a/test/utils/SigningUtilsLib.t.sol b/test/utils/SigningUtilsLib.t.sol new file mode 100644 index 0000000..a38e761 --- /dev/null +++ b/test/utils/SigningUtilsLib.t.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { Vm } from "forge-std/Vm.sol"; +import { BytesLib } from "@bytes-utils/BytesLib.sol"; + +import { P256FCLVerifierLib } from "../../src/libraries/P256FCLVerifierLib.sol"; + +import { TestUser, SignatureType } from "./Types.t.sol"; +import { IDelegationManager } from "../../src/interfaces/IDelegationManager.sol"; +import { EncoderLib } from "../../src/libraries/EncoderLib.sol"; + +// NOTE: These signature schemes are tightly coupled to our DeleGator. We should eventually move things closer +// together. + +// Default Signature Schemes +// Ownable - Owned by the TestUser +// MultiSigDeleGator - 1/1 owned by the TestUser +// HybridDeleGator - 1 Raw P256 Key using the TestUser's PK for the key generation and their name as Key ID OR 1 EOA. +library SigningUtilsLib { + ////////////////////////////// State ////////////////////////////// + + Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + uint256 internal constant P256_N = 115792089210356248762697446949407573529996955224135760342422259061068512044369; + + ////////////////////// Public Helpers ////////////////////// + + /// @notice Uses the private key to sign a hash. + function signHash_EOA(uint256 _privateKey, bytes32 _hash) public pure returns (bytes memory signature_) { + (uint8 v_, bytes32 r_, bytes32 s_) = vm.sign(_privateKey, _hash); + signature_ = abi.encodePacked(r_, s_, v_); + } + + /// @notice Generates the private keys from seeds and uses them to sign a hash and combine the signatures. + function signHash_MultiSig(uint256[] memory _privateKeys, bytes32 _hash) public pure returns (bytes memory signature_) { + for (uint256 i = 0; i < _privateKeys.length; ++i) { + uint256 privateKey_ = _privateKeys[i]; + bytes memory usersSignature_ = signHash_EOA(privateKey_, _hash); + signature_ = BytesLib.concat(signature_, usersSignature_); + } + } + + /// @notice Generates the private keys from seeds and uses them to sign a hash and combine the signatures. + function signHash_P256( + string memory _keyId, + uint256 _privateKey, + bytes32 _hash + ) + public + pure + returns (bytes memory signature_) + { + (bytes32 r_, bytes32 s_) = vm.signP256(_privateKey, sha256(abi.encodePacked(_hash))); + + if (uint256(s_) > P256FCLVerifierLib.P256_N_DIV_2) { + s_ = bytes32(P256_N - uint256(s_)); + } + + signature_ = abi.encodePacked(keccak256(abi.encodePacked(_keyId)), r_, s_); + } +} diff --git a/test/utils/SimpleFactory.sol b/test/utils/SimpleFactory.sol new file mode 100644 index 0000000..87b6aa3 --- /dev/null +++ b/test/utils/SimpleFactory.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { Create2 } from "@openzeppelin/contracts/utils/Create2.sol"; + +contract SimpleFactory { + ////////////////////////////// Events ////////////////////////////// + + event Deployed(address indexed addr); + + ////////////////////////////// Custom Errors ////////////////////////////// + + /** + * @dev The contract deployed is empty + */ + error SimpleFactoryEmptyContract(address deployed); + + ////////////////////////////// External Methods ////////////////////////////// + + /** + * @notice Deploys a contract using create2 + * @param _bytecode the bytecode of the contract to deploy + * @param _salt the salt to use for create2 + */ + function deploy(bytes memory _bytecode, bytes32 _salt) external returns (address addr_) { + addr_ = Create2.deploy(0, _salt, _bytecode); + if (addr_.code.length == 0) revert SimpleFactoryEmptyContract(addr_); + emit Deployed(addr_); + } + + /** + * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the + * `bytecodeHash` or `salt` will result in a new destination address. + */ + function computeAddress(bytes32 _bytecodeHash, bytes32 _salt) external view returns (address addr_) { + return Create2.computeAddress(_salt, _bytecodeHash); + } +} diff --git a/test/utils/StorageUtilsLib.t.sol b/test/utils/StorageUtilsLib.t.sol new file mode 100644 index 0000000..2c18a8d --- /dev/null +++ b/test/utils/StorageUtilsLib.t.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { Vm } from "forge-std/Vm.sol"; +import { BytesLib } from "@bytes-utils/BytesLib.sol"; + +/** + * @title Storage Utils Library + * @notice Basic utility functions for testing storage. + */ +library StorageUtilsLib { + address private constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code")))); + Vm internal constant vm = Vm(VM_ADDRESS); + + /** + * @notice Converts a chunk of bytes to a boolean + * @param _bytes the bytes to convert + * @param _start the starting position in the bytes + */ + function toBool(bytes memory _bytes, uint256 _start) public pure returns (bool) { + bytes memory data_ = BytesLib.slice(_bytes, _start, 1); + + require(data_.length == 1, "Invalid data length"); + + bool result_; + assembly { + result_ := mload(add(data_, 32)) + } + + return result_; + } + + /** + * @notice Computes the storage location of a contract's namespaced storage slot. + * @dev https://eips.ethereum.org/EIPS/eip-7201 + * @dev https://ethereum-magicians.org/t/eip-7201-namespaced-storage-layout + * @dev NOTE: Sept 27 2023; There's a discussion going on to whether or not the additional hash manipulation is necessary. + * Keeping it for now to be in line with the EIP. + * @param _key The key to compute the deterministic storage location for + */ + function getStorageLocation(string memory _key) public pure returns (bytes32) { + return keccak256(abi.encode(uint256(keccak256(bytes(_key))) - 1)) & ~bytes32(uint256(0xff)); + } + + /** + * @notice Converts a bytes32 value to an address + * @param _value The value to convert to an address + */ + function toAddress(bytes32 _value) public pure returns (address) { + return address(uint160(uint256(_value))); + } + + /** + * @notice This method loads an address array from a contract's storage. + * @param _addr The contract to read an array from + * @param _location The location that the array is stored in memory + * @dev The storage of the array != the storage of the elements + */ + function loadFullArray(address _addr, uint256 _location) public view returns (address[] memory) { + // Load the start slot from storage + bytes32 slotVal_ = vm.load(_addr, bytes32(_location)); + // The first slot contains the size of the array + uint256 arrayLength_ = uint256(slotVal_); + + // Initialize an array in memory to hold the values we retrieve from storage + address[] memory fullArr_ = new address[](arrayLength_); + // Calculate the start of the contiguous section in storage containing the array contents + bytes32 startSlot_ = keccak256(abi.encodePacked(_location)); + // Iterate through the slots containing the array contents and store them in memory; + for (uint256 i = 0; i < arrayLength_; i++) { + slotVal_ = vm.load(_addr, bytes32(uint256(startSlot_) + i)); + fullArr_[i] = address(uint160(uint256(slotVal_))); + } + return fullArr_; + } +} diff --git a/test/utils/Types.t.sol b/test/utils/Types.t.sol new file mode 100644 index 0000000..299bd13 --- /dev/null +++ b/test/utils/Types.t.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT AND Apache-2.0 +pragma solidity 0.8.23; + +import { IDeleGatorCoreFull } from "../../src/interfaces/IDeleGatorCoreFull.sol"; + +struct TestUser { + string name; + address payable addr; + uint256 privateKey; + IDeleGatorCoreFull deleGator; + uint256 x; + uint256 y; +} + +struct TestUsers { + TestUser bundler; + TestUser alice; + TestUser bob; + TestUser carol; + TestUser dave; + TestUser eve; + TestUser frank; +} + +/** + * @title Implementation Enum + * @dev This enum represents the different types of Delegator implementations. + */ +enum Implementation { + MultiSig, // MultiSigDeleGator is a DeleGator that is owned by a set of EOA addresses. + Hybrid // HybridDeleGator is a DeleGator that is owned by a set of P256 Keys and EOA + +} + +/** + * @title Signature Type + * @dev This enum represents the different types of Signatures. + */ +enum SignatureType { + MultiSig, + EOA, + RawP256 +}