UNPKG

@ensuro/account-abstraction

Version:

ERC-4337 related contracts by the Ensuro Team

565 lines (564 loc) 33.7 kB
{ "_format": "hh-sol-artifact-1", "contractName": "ERC2771ForwarderAccount", "sourceName": "contracts/ERC2771ForwarderAccount.sol", "abi": [ { "inputs": [ { "internalType": "contract IEntryPoint", "name": "anEntryPoint", "type": "address" }, { "internalType": "address", "name": "admin", "type": "address" }, { "internalType": "address[]", "name": "executors", "type": "address[]" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "AccessControlBadConfirmation", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "bytes32", "name": "neededRole", "type": "bytes32" } ], "name": "AccessControlUnauthorizedAccount", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "target", "type": "address" } ], "name": "AddressEmptyCode", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "target", "type": "address" } ], "name": "CanCallOnlyIfTrustedForwarder", "type": "error" }, { "inputs": [], "name": "ECDSAInvalidSignature", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "length", "type": "uint256" } ], "name": "ECDSAInvalidSignatureLength", "type": "error" }, { "inputs": [ { "internalType": "bytes32", "name": "s", "type": "bytes32" } ], "name": "ECDSAInvalidSignatureS", "type": "error" }, { "inputs": [], "name": "FailedCall", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "balance", "type": "uint256" }, { "internalType": "uint256", "name": "needed", "type": "uint256" } ], "name": "InsufficientBalance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" } ], "name": "RequiredEntryPointOrExecutor", "type": "error" }, { "inputs": [], "name": "UserOpSignerNotSet", "type": "error" }, { "inputs": [], "name": "WrongArrayLength", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "indexed": true, "internalType": "bytes32", "name": "previousAdminRole", "type": "bytes32" }, { "indexed": true, "internalType": "bytes32", "name": "newAdminRole", "type": "bytes32" } ], "name": "RoleAdminChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } ], "name": "RoleGranted", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } ], "name": "RoleRevoked", "type": "event" }, { "inputs": [], "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "EXECUTOR_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "WITHDRAW_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "addDeposit", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [], "name": "entryPoint", "outputs": [ { "internalType": "contract IEntryPoint", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "dest", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "func", "type": "bytes" } ], "name": "execute", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "dest", "type": "address[]" }, { "internalType": "uint256[]", "name": "value", "type": "uint256[]" }, { "internalType": "bytes[]", "name": "func", "type": "bytes[]" } ], "name": "executeBatch", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "getDeposit", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getNonce", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" } ], "name": "getRoleAdmin", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "grantRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "hasRole", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "callerConfirmation", "type": "address" } ], "name": "renounceRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "revokeRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "internalType": "bytes", "name": "initCode", "type": "bytes" }, { "internalType": "bytes", "name": "callData", "type": "bytes" }, { "internalType": "bytes32", "name": "accountGasLimits", "type": "bytes32" }, { "internalType": "uint256", "name": "preVerificationGas", "type": "uint256" }, { "internalType": "bytes32", "name": "gasFees", "type": "bytes32" }, { "internalType": "bytes", "name": "paymasterAndData", "type": "bytes" }, { "internalType": "bytes", "name": "signature", "type": "bytes" } ], "internalType": "struct PackedUserOperation", "name": "userOp", "type": "tuple" }, { "internalType": "bytes32", "name": "userOpHash", "type": "bytes32" }, { "internalType": "uint256", "name": "missingAccountFunds", "type": "uint256" } ], "name": "validateUserOp", "outputs": [ { "internalType": "uint256", "name": "validationData", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address payable", "name": "withdrawAddress", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "withdrawDepositTo", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "stateMutability": "payable", "type": "receive" } ], "bytecode": "0x60a060405234801561000f575f5ffd5b506040516116a13803806116a183398101604081905261002e91610190565b6001600160a01b0383166080526100455f836100ac565b505f5b81518110156100a35761009a7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6383838151811061008757610087610282565b60200260200101516100ac60201b60201c565b50600101610048565b50505050610296565b5f828152602081815260408083206001600160a01b038516845290915281205460ff1661014c575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556101043390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161014f565b505f5b92915050565b6001600160a01b0381168114610169575f5ffd5b50565b805161017781610155565b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f606084860312156101a2575f5ffd5b83516101ad81610155565b60208501519093506101be81610155565b60408501519092506001600160401b038111156101d9575f5ffd5b8401601f810186136101e9575f5ffd5b80516001600160401b038111156102025761020261017c565b604051600582901b90603f8201601f191681016001600160401b03811182821017156102305761023061017c565b60405291825260208184018101929081018984111561024d575f5ffd5b6020850194505b83851015610273576102658561016c565b815260209485019401610254565b50809450505050509250925092565b634e487b7160e01b5f52603260045260245ffd5b6080516113c96102d85f395f818161029b0152818161062e015281816106d401528181610814015281816108a9015281816109070152610ba201526113c95ff3fe6080604052600436106100fd575f3560e01c80634d44560d11610092578063b61d27f611610062578063b61d27f6146102c5578063c399ec88146102e4578063d087d288146102f8578063d547741f1461030c578063e02023a11461032b575f5ffd5b80634d44560d1461023157806391d1485414610250578063a217fddf1461026f578063b0d691fe14610282575f5ffd5b80632f2ff15d116100cd5780632f2ff15d146101ca57806336568abe146101eb57806347e1da2a1461020a5780634a58db1914610229575f5ffd5b806301ffc9a71461010857806307bd02651461013c57806319822f7c1461017d578063248a9ca31461019c575f5ffd5b3661010457005b5f5ffd5b348015610113575f5ffd5b50610127610122366004611036565b61035e565b60405190151581526020015b60405180910390f35b348015610147575f5ffd5b5061016f7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610133565b348015610188575f5ffd5b5061016f61019736600461105d565b610394565b3480156101a7575f5ffd5b5061016f6101b63660046110ac565b5f9081526020819052604090206001015490565b3480156101d5575f5ffd5b506101e96101e43660046110d7565b6103b9565b005b3480156101f6575f5ffd5b506101e96102053660046110d7565b6103e3565b348015610215575f5ffd5b506101e961022436600461114d565b61041b565b6101e961062c565b34801561023c575f5ffd5b506101e961024b3660046111ec565b6106a8565b34801561025b575f5ffd5b5061012761026a3660046110d7565b610757565b34801561027a575f5ffd5b5061016f5f81565b34801561028d575f5ffd5b506040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152602001610133565b3480156102d0575f5ffd5b506101e96102df366004611216565b61077f565b3480156102ef575f5ffd5b5061016f6107f5565b348015610303575f5ffd5b5061016f610883565b348015610317575f5ffd5b506101e96103263660046110d7565b6108d8565b348015610336575f5ffd5b5061016f7f5d8e12c39142ff96d79d04d15d1ba1269e4fe57bb9d26f43523628b34ba108ec81565b5f6001600160e01b03198216637965db0b60e01b148061038e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f61039d6108fc565b6103a78484610976565b90506103b282610a54565b9392505050565b5f828152602081905260409020600101546103d381610a9d565b6103dd8383610aa7565b50505050565b6001600160a01b038116331461040c5760405163334bd91960e11b815260040160405180910390fd5b6104168282610b36565b505050565b5f610424610b9f565b9050858214158061043f5750831580159061043f5750838214155b1561045d5760405163150072e360e11b815260040160405180910390fd5b5f5b868110156106225780156105125787878281811061047f5761047f61129b565b905060200201602081019061049491906112af565b6001600160a01b031688886104aa6001856112ca565b8181106104b9576104b961129b565b90506020020160208101906104ce91906112af565b6001600160a01b0316148061050d575061050d8888838181106104f3576104f361129b565b905060200201602081019061050891906112af565b610c74565b610527565b61052788885f8181106104f3576104f361129b565b8888838181106105395761053961129b565b905060200201602081019061054e91906112af565b9061057d57604051636d4e141560e01b81526001600160a01b0390911660048201526024015b60405180910390fd5b506106198888838181106105935761059361129b565b90506020020160208101906105a891906112af565b8585848181106105ba576105ba61129b565b90506020028101906105cc91906112e9565b856040516020016105df9392919061132c565b60408051601f198184030181529190528715610613578888858181106106075761060761129b565b90506020020135610ced565b5f610ced565b5060010161045f565b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000060405163b760faf960e01b81523060048201526001600160a01b03919091169063b760faf99034906024015f604051808303818588803b15801561068f575f5ffd5b505af11580156106a1573d5f5f3e3d5ffd5b5050505050565b7f5d8e12c39142ff96d79d04d15d1ba1269e4fe57bb9d26f43523628b34ba108ec6106d281610a9d565b7f000000000000000000000000000000000000000000000000000000000000000060405163040b850f60e31b81526001600160a01b03858116600483015260248201859052919091169063205c2878906044015f604051808303815f87803b15801561073c575f5ffd5b505af115801561074e573d5f5f3e3d5ffd5b50505050505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b5f610788610b9f565b905061079385610c74565b85906107be57604051636d4e141560e01b81526001600160a01b039091166004820152602401610574565b506107ed858484846040516020016107d89392919061132c565b60405160208183030381529060405286610ced565b505050505050565b6040516370a0823160e01b81523060048201525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa15801561085a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061087e9190611352565b905090565b604051631aab3f0d60e11b81523060048201525f60248201819052906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906335567e1a9060440161083f565b5f828152602081905260409020600101546108f281610a9d565b6103dd8383610b36565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109745760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152606401610574565b565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c829052603c81205f6109f0826109b76101008801886112e9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610d8392505050565b9050610a1c7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6382610757565b610a2b5760019250505061038e565b805f805c6001600160a01b0319166001600160a01b03831617905d505f95945050505050565b50565b8015610a51576040515f9033905f1990849084818181858888f193505050503d805f81146106a1576040519150601f19603f3d011682016040523d82523d5f602084013e6106a1565b610a518133610dab565b5f610ab28383610757565b610b2f575f838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610ae73390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161038e565b505f61038e565b5f610b418383610757565b15610b2f575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161038e565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610c18575f5c6001600160a01b0316610bf857604051636ca7ff7d60e01b815260040160405180910390fd5b506001600160a01b035f805c918216916001600160a01b031916815d5090565b610c427fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6333610757565b3390610c6d57604051633c687f6b60e21b81526001600160a01b039091166004820152602401610574565b5033905090565b6040513060248201525f90819060440160408051601f19818403018152919052602080820180516001600160e01b031663572b6c0560e01b17815282519293505f928392839290918391895afa92503d91505f519050828015610cd8575060208210155b8015610ce357505f81115b9695505050505050565b606081471015610d195760405163cf47918160e01b815247600482015260248101839052604401610574565b5f5f856001600160a01b03168486604051610d349190611369565b5f6040518083038185875af1925050503d805f8114610d6e576040519150601f19603f3d011682016040523d82523d5f602084013e610d73565b606091505b5091509150610ce3868383610de8565b5f5f5f5f610d918686610e44565b925092509250610da18282610e8d565b5090949350505050565b610db58282610757565b610de45760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610574565b5050565b606082610dfd57610df882610f45565b6103b2565b8151158015610e1457506001600160a01b0384163b155b15610e3d57604051639996b31560e01b81526001600160a01b0385166004820152602401610574565b50806103b2565b5f5f5f8351604103610e7b576020840151604085015160608601515f1a610e6d88828585610f6e565b955095509550505050610e86565b505081515f91506002905b9250925092565b5f826003811115610ea057610ea061137f565b03610ea9575050565b6001826003811115610ebd57610ebd61137f565b03610edb5760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610eef57610eef61137f565b03610f105760405163fce698f760e01b815260048101829052602401610574565b6003826003811115610f2457610f2461137f565b03610de4576040516335e2f38360e21b815260048101829052602401610574565b805115610f555780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610fa757505f9150600390508261102c565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610ff8573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661102357505f92506001915082905061102c565b92505f91508190505b9450945094915050565b5f60208284031215611046575f5ffd5b81356001600160e01b0319811681146103b2575f5ffd5b5f5f5f6060848603121561106f575f5ffd5b833567ffffffffffffffff811115611085575f5ffd5b84016101208187031215611097575f5ffd5b95602085013595506040909401359392505050565b5f602082840312156110bc575f5ffd5b5035919050565b6001600160a01b0381168114610a51575f5ffd5b5f5f604083850312156110e8575f5ffd5b8235915060208301356110fa816110c3565b809150509250929050565b5f5f83601f840112611115575f5ffd5b50813567ffffffffffffffff81111561112c575f5ffd5b6020830191508360208260051b8501011115611146575f5ffd5b9250929050565b5f5f5f5f5f5f60608789031215611162575f5ffd5b863567ffffffffffffffff811115611178575f5ffd5b61118489828a01611105565b909750955050602087013567ffffffffffffffff8111156111a3575f5ffd5b6111af89828a01611105565b909550935050604087013567ffffffffffffffff8111156111ce575f5ffd5b6111da89828a01611105565b979a9699509497509295939492505050565b5f5f604083850312156111fd575f5ffd5b8235611208816110c3565b946020939093013593505050565b5f5f5f5f60608587031215611229575f5ffd5b8435611234816110c3565b935060208501359250604085013567ffffffffffffffff811115611256575f5ffd5b8501601f81018713611266575f5ffd5b803567ffffffffffffffff81111561127c575f5ffd5b87602082840101111561128d575f5ffd5b949793965060200194505050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156112bf575f5ffd5b81356103b2816110c3565b8181038181111561038e57634e487b7160e01b5f52601160045260245ffd5b5f5f8335601e198436030181126112fe575f5ffd5b83018035915067ffffffffffffffff821115611318575f5ffd5b602001915036819003821315611146575f5ffd5b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b5f60208284031215611362575f5ffd5b5051919050565b5f82518060208501845e5f920191825250919050565b634e487b7160e01b5f52602160045260245ffdfea2646970667358221220cf6d6774046d911eedd4b122e3b68e3c2d17e5cb16737010985b91448ef8ab5e64736f6c634300081c0033", "deployedBytecode": "0x6080604052600436106100fd575f3560e01c80634d44560d11610092578063b61d27f611610062578063b61d27f6146102c5578063c399ec88146102e4578063d087d288146102f8578063d547741f1461030c578063e02023a11461032b575f5ffd5b80634d44560d1461023157806391d1485414610250578063a217fddf1461026f578063b0d691fe14610282575f5ffd5b80632f2ff15d116100cd5780632f2ff15d146101ca57806336568abe146101eb57806347e1da2a1461020a5780634a58db1914610229575f5ffd5b806301ffc9a71461010857806307bd02651461013c57806319822f7c1461017d578063248a9ca31461019c575f5ffd5b3661010457005b5f5ffd5b348015610113575f5ffd5b50610127610122366004611036565b61035e565b60405190151581526020015b60405180910390f35b348015610147575f5ffd5b5061016f7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610133565b348015610188575f5ffd5b5061016f61019736600461105d565b610394565b3480156101a7575f5ffd5b5061016f6101b63660046110ac565b5f9081526020819052604090206001015490565b3480156101d5575f5ffd5b506101e96101e43660046110d7565b6103b9565b005b3480156101f6575f5ffd5b506101e96102053660046110d7565b6103e3565b348015610215575f5ffd5b506101e961022436600461114d565b61041b565b6101e961062c565b34801561023c575f5ffd5b506101e961024b3660046111ec565b6106a8565b34801561025b575f5ffd5b5061012761026a3660046110d7565b610757565b34801561027a575f5ffd5b5061016f5f81565b34801561028d575f5ffd5b506040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152602001610133565b3480156102d0575f5ffd5b506101e96102df366004611216565b61077f565b3480156102ef575f5ffd5b5061016f6107f5565b348015610303575f5ffd5b5061016f610883565b348015610317575f5ffd5b506101e96103263660046110d7565b6108d8565b348015610336575f5ffd5b5061016f7f5d8e12c39142ff96d79d04d15d1ba1269e4fe57bb9d26f43523628b34ba108ec81565b5f6001600160e01b03198216637965db0b60e01b148061038e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f61039d6108fc565b6103a78484610976565b90506103b282610a54565b9392505050565b5f828152602081905260409020600101546103d381610a9d565b6103dd8383610aa7565b50505050565b6001600160a01b038116331461040c5760405163334bd91960e11b815260040160405180910390fd5b6104168282610b36565b505050565b5f610424610b9f565b9050858214158061043f5750831580159061043f5750838214155b1561045d5760405163150072e360e11b815260040160405180910390fd5b5f5b868110156106225780156105125787878281811061047f5761047f61129b565b905060200201602081019061049491906112af565b6001600160a01b031688886104aa6001856112ca565b8181106104b9576104b961129b565b90506020020160208101906104ce91906112af565b6001600160a01b0316148061050d575061050d8888838181106104f3576104f361129b565b905060200201602081019061050891906112af565b610c74565b610527565b61052788885f8181106104f3576104f361129b565b8888838181106105395761053961129b565b905060200201602081019061054e91906112af565b9061057d57604051636d4e141560e01b81526001600160a01b0390911660048201526024015b60405180910390fd5b506106198888838181106105935761059361129b565b90506020020160208101906105a891906112af565b8585848181106105ba576105ba61129b565b90506020028101906105cc91906112e9565b856040516020016105df9392919061132c565b60408051601f198184030181529190528715610613578888858181106106075761060761129b565b90506020020135610ced565b5f610ced565b5060010161045f565b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000060405163b760faf960e01b81523060048201526001600160a01b03919091169063b760faf99034906024015f604051808303818588803b15801561068f575f5ffd5b505af11580156106a1573d5f5f3e3d5ffd5b5050505050565b7f5d8e12c39142ff96d79d04d15d1ba1269e4fe57bb9d26f43523628b34ba108ec6106d281610a9d565b7f000000000000000000000000000000000000000000000000000000000000000060405163040b850f60e31b81526001600160a01b03858116600483015260248201859052919091169063205c2878906044015f604051808303815f87803b15801561073c575f5ffd5b505af115801561074e573d5f5f3e3d5ffd5b50505050505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b5f610788610b9f565b905061079385610c74565b85906107be57604051636d4e141560e01b81526001600160a01b039091166004820152602401610574565b506107ed858484846040516020016107d89392919061132c565b60405160208183030381529060405286610ced565b505050505050565b6040516370a0823160e01b81523060048201525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa15801561085a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061087e9190611352565b905090565b604051631aab3f0d60e11b81523060048201525f60248201819052906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906335567e1a9060440161083f565b5f828152602081905260409020600101546108f281610a9d565b6103dd8383610b36565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109745760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152606401610574565b565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c829052603c81205f6109f0826109b76101008801886112e9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610d8392505050565b9050610a1c7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6382610757565b610a2b5760019250505061038e565b805f805c6001600160a01b0319166001600160a01b03831617905d505f95945050505050565b50565b8015610a51576040515f9033905f1990849084818181858888f193505050503d805f81146106a1576040519150601f19603f3d011682016040523d82523d5f602084013e6106a1565b610a518133610dab565b5f610ab28383610757565b610b2f575f838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610ae73390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161038e565b505f61038e565b5f610b418383610757565b15610b2f575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161038e565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610c18575f5c6001600160a01b0316610bf857604051636ca7ff7d60e01b815260040160405180910390fd5b506001600160a01b035f805c918216916001600160a01b031916815d5090565b610c427fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6333610757565b3390610c6d57604051633c687f6b60e21b81526001600160a01b039091166004820152602401610574565b5033905090565b6040513060248201525f90819060440160408051601f19818403018152919052602080820180516001600160e01b031663572b6c0560e01b17815282519293505f928392839290918391895afa92503d91505f519050828015610cd8575060208210155b8015610ce357505f81115b9695505050505050565b606081471015610d195760405163cf47918160e01b815247600482015260248101839052604401610574565b5f5f856001600160a01b03168486604051610d349190611369565b5f6040518083038185875af1925050503d805f8114610d6e576040519150601f19603f3d011682016040523d82523d5f602084013e610d73565b606091505b5091509150610ce3868383610de8565b5f5f5f5f610d918686610e44565b925092509250610da18282610e8d565b5090949350505050565b610db58282610757565b610de45760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610574565b5050565b606082610dfd57610df882610f45565b6103b2565b8151158015610e1457506001600160a01b0384163b155b15610e3d57604051639996b31560e01b81526001600160a01b0385166004820152602401610574565b50806103b2565b5f5f5f8351604103610e7b576020840151604085015160608601515f1a610e6d88828585610f6e565b955095509550505050610e86565b505081515f91506002905b9250925092565b5f826003811115610ea057610ea061137f565b03610ea9575050565b6001826003811115610ebd57610ebd61137f565b03610edb5760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610eef57610eef61137f565b03610f105760405163fce698f760e01b815260048101829052602401610574565b6003826003811115610f2457610f2461137f565b03610de4576040516335e2f38360e21b815260048101829052602401610574565b805115610f555780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610fa757505f9150600390508261102c565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610ff8573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661102357505f92506001915082905061102c565b92505f91508190505b9450945094915050565b5f60208284031215611046575f5ffd5b81356001600160e01b0319811681146103b2575f5ffd5b5f5f5f6060848603121561106f575f5ffd5b833567ffffffffffffffff811115611085575f5ffd5b84016101208187031215611097575f5ffd5b95602085013595506040909401359392505050565b5f602082840312156110bc575f5ffd5b5035919050565b6001600160a01b0381168114610a51575f5ffd5b5f5f604083850312156110e8575f5ffd5b8235915060208301356110fa816110c3565b809150509250929050565b5f5f83601f840112611115575f5ffd5b50813567ffffffffffffffff81111561112c575f5ffd5b6020830191508360208260051b8501011115611146575f5ffd5b9250929050565b5f5f5f5f5f5f60608789031215611162575f5ffd5b863567ffffffffffffffff811115611178575f5ffd5b61118489828a01611105565b909750955050602087013567ffffffffffffffff8111156111a3575f5ffd5b6111af89828a01611105565b909550935050604087013567ffffffffffffffff8111156111ce575f5ffd5b6111da89828a01611105565b979a9699509497509295939492505050565b5f5f604083850312156111fd575f5ffd5b8235611208816110c3565b946020939093013593505050565b5f5f5f5f60608587031215611229575f5ffd5b8435611234816110c3565b935060208501359250604085013567ffffffffffffffff811115611256575f5ffd5b8501601f81018713611266575f5ffd5b803567ffffffffffffffff81111561127c575f5ffd5b87602082840101111561128d575f5ffd5b949793965060200194505050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156112bf575f5ffd5b81356103b2816110c3565b8181038181111561038e57634e487b7160e01b5f52601160045260245ffd5b5f5f8335601e198436030181126112fe575f5ffd5b83018035915067ffffffffffffffff821115611318575f5ffd5b602001915036819003821315611146575f5ffd5b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b5f60208284031215611362575f5ffd5b5051919050565b5f82518060208501845e5f920191825250919050565b634e487b7160e01b5f52602160045260245ffdfea2646970667358221220cf6d6774046d911eedd4b122e3b68e3c2d17e5cb16737010985b91448ef8ab5e64736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} }