diff --git a/sdks/smart-wallet-sdk/.eslintrc.js b/sdks/smart-wallet-sdk/.eslintrc.js new file mode 100644 index 00000000..fc1cfaed --- /dev/null +++ b/sdks/smart-wallet-sdk/.eslintrc.js @@ -0,0 +1,20 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 2020, + sourceType: 'module', + }, + extends: [ + 'plugin:@typescript-eslint/recommended', + 'plugin:eslint-comments/recommended', + 'plugin:import/typescript', + 'prettier', + ], + plugins: ['@typescript-eslint', 'import'], + rules: { + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }], + 'import/order': ['error', { 'newlines-between': 'always', alphabetize: { order: 'asc' } }], + }, +} \ No newline at end of file diff --git a/sdks/smart-wallet-sdk/.gitignore b/sdks/smart-wallet-sdk/.gitignore new file mode 100644 index 00000000..3bc3aa63 --- /dev/null +++ b/sdks/smart-wallet-sdk/.gitignore @@ -0,0 +1,29 @@ +# Dependencies +node_modules/ + +# Build output +dist/ +build/ + +# Generated files +src/contracts/ + +# Coverage +coverage/ + +# Cache +.cache/ +.turbo/ + +# IDE +.idea/ +.vscode/ + +# Logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# OS +.DS_Store \ No newline at end of file diff --git a/sdks/smart-wallet-sdk/LICENSE b/sdks/smart-wallet-sdk/LICENSE new file mode 100644 index 00000000..99435fcb --- /dev/null +++ b/sdks/smart-wallet-sdk/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Uniswap Labs + +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. \ No newline at end of file diff --git a/sdks/smart-wallet-sdk/README.md b/sdks/smart-wallet-sdk/README.md new file mode 100644 index 00000000..a89aa878 --- /dev/null +++ b/sdks/smart-wallet-sdk/README.md @@ -0,0 +1,25 @@ +# Smart Wallet SDK + +⚒️ An SDK for building applications with smart wallets on Uniswap + +This SDK provides utilities for interacting with Uniswap protocols using smart wallets. + +## Installation + +```bash +npm install @uniswap/smart-wallet-sdk +``` + +or + +```bash +yarn add @uniswap/smart-wallet-sdk +``` + +## Documentation + +Coming soon... + +## License + +MIT \ No newline at end of file diff --git a/sdks/smart-wallet-sdk/abis/MinimalDelegation.json b/sdks/smart-wallet-sdk/abis/MinimalDelegation.json new file mode 100644 index 00000000..ac466dcb --- /dev/null +++ b/sdks/smart-wallet-sdk/abis/MinimalDelegation.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"authorize","inputs":[{"name":"key","type":"tuple","internalType":"struct Key","components":[{"name":"expiry","type":"uint40","internalType":"uint40"},{"name":"keyType","type":"uint8","internalType":"enum KeyType"},{"name":"isSuperAdmin","type":"bool","internalType":"bool"},{"name":"publicKey","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"keyHash","type":"bytes32","internalType":"bytes32"}],"stateMutability":"nonpayable"},{"type":"function","name":"domainSeparator","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"eip712Domain","inputs":[],"outputs":[{"name":"fields","type":"bytes1","internalType":"bytes1"},{"name":"name","type":"string","internalType":"string"},{"name":"version","type":"string","internalType":"string"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"verifyingContract","type":"address","internalType":"address"},{"name":"salt","type":"bytes32","internalType":"bytes32"},{"name":"extensions","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"execute","inputs":[{"name":"mode","type":"bytes32","internalType":"bytes32"},{"name":"executionData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"getKey","inputs":[{"name":"keyHash","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"tuple","internalType":"struct Key","components":[{"name":"expiry","type":"uint40","internalType":"uint40"},{"name":"keyType","type":"uint8","internalType":"enum KeyType"},{"name":"isSuperAdmin","type":"bool","internalType":"bool"},{"name":"publicKey","type":"bytes","internalType":"bytes"}]}],"stateMutability":"view"},{"type":"function","name":"hashTypedData","inputs":[{"name":"hash","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"isValidSignature","inputs":[{"name":"hash","type":"bytes32","internalType":"bytes32"},{"name":"signature","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"result","type":"bytes4","internalType":"bytes4"}],"stateMutability":"view"},{"type":"function","name":"keyAt","inputs":[{"name":"i","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct Key","components":[{"name":"expiry","type":"uint40","internalType":"uint40"},{"name":"keyType","type":"uint8","internalType":"enum KeyType"},{"name":"isSuperAdmin","type":"bool","internalType":"bool"},{"name":"publicKey","type":"bytes","internalType":"bytes"}]}],"stateMutability":"view"},{"type":"function","name":"keyCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"revoke","inputs":[{"name":"keyHash","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsExecutionMode","inputs":[{"name":"mode","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"result","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"type":"event","name":"Authorized","inputs":[{"name":"keyHash","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"key","type":"tuple","indexed":false,"internalType":"struct Key","components":[{"name":"expiry","type":"uint40","internalType":"uint40"},{"name":"keyType","type":"uint8","internalType":"enum KeyType"},{"name":"isSuperAdmin","type":"bool","internalType":"bool"},{"name":"publicKey","type":"bytes","internalType":"bytes"}]}],"anonymous":false},{"type":"event","name":"EIP712DomainChanged","inputs":[],"anonymous":false},{"type":"event","name":"Revoked","inputs":[{"name":"keyHash","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"error","name":"CallFailed","inputs":[{"name":"reason","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"IndexOutOfBounds","inputs":[]},{"type":"error","name":"KeyDoesNotExist","inputs":[]},{"type":"error","name":"Unauthorized","inputs":[]},{"type":"error","name":"UnsupportedExecutionMode","inputs":[]}],"bytecode":{"object":"0x60c060405234801561000f575f80fd5b5060608061002161004e60201b60201c565b8092508193505050818051906020012060808181525050808051906020012060a0818152505050506100c5565b6060806040518060400160405280601a81526020017f556e6973776170204d696e696d616c2044656c65676174696f6e0000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250915091509091565b60805160a0516122b56100e65f395f61054f01525f61052e01526122b55ff3fe60806040526004361061009b575f3560e01c8063b75c7dc611610063578063b75c7dc6146101bf578063cebfe336146101e7578063d03c791414610223578063e9ae5c531461025f578063f698da251461027b578063fac750e0146102a55761009b565b806312aaac701461009f5780631626ba7e146100db5780634223b5c2146101175780636575f6aa1461015357806384b0196e1461018f575b5f80fd5b3480156100aa575f80fd5b506100c560048036038101906100c0919061111c565b6102cf565b6040516100d291906112c3565b60405180910390f35b3480156100e6575f80fd5b5061010160048036038101906100fc9190611344565b6102e7565b60405161010e91906113db565b60405180910390f35b348015610122575f80fd5b5061013d60048036038101906101389190611427565b610321565b60405161014a91906112c3565b60405180910390f35b34801561015e575f80fd5b506101796004803603810190610174919061111c565b610354565b6040516101869190611461565b60405180910390f35b34801561019a575f80fd5b506101a3610365565b6040516101b6979695949392919061160b565b60405180910390f35b3480156101ca575f80fd5b506101e560048036038101906101e0919061111c565b6103b0565b005b3480156101f2575f80fd5b5061020d600480360381019061020891906118c5565b6103f1565b60405161021a9190611461565b60405180910390f35b34801561022e575f80fd5b506102496004803603810190610244919061111c565b610442565b604051610256919061191b565b60405180910390f35b61027960048036038101906102749190611344565b610463565b005b348015610286575f80fd5b5061028f610508565b60405161029c9190611461565b60405180910390f35b3480156102b0575f80fd5b506102b961059f565b6040516102c69190611934565b60405180910390f35b6102d7611040565b6102e0826105b7565b9050919050565b5f6102fb6102f4856106b9565b8484610739565b1561030f57631626ba7e60e01b905061031a565b63ffffffff60e01b90505b9392505050565b610329611040565b61034d61034883610338610754565b5f0161077b90919063ffffffff16565b6105b7565b9050919050565b5f61035e826106b9565b9050919050565b5f6060805f805f60607f0f0000000000000000000000000000000000000000000000000000000000000096506103996107e5565b809650819750505046935030925090919293949596565b6103b861085c565b6103c1816108c3565b807fe5af7daed5ab2a2dc5f98d53619f05089c0c14d11a6621f6b906a2366c9a7ab360405160405180910390a250565b5f6103fa61085c565b6104038261093b565b9050807f3d3a48be5a98628ecf98a6201185102da78bbab8f63a4b2d6b9eef354f5131f58360405161043591906112c3565b60405180910390a2919050565b5f61044c826109ae565b8061045c575061045b82610a07565b5b9050919050565b61046c836109ae565b1561049b575f82828101906104819190611ad2565b905061048b61085c565b6104958482610a60565b50610503565b6104a483610a07565b156104d0575f8083838101906104ba9190611b19565b915091506104c9858383610b02565b5050610502565b6040517f7f18127500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f1b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000004630604051602001610584959493929190611b8f565b60405160208183030381529060405280519060200120905090565b5f6105b26105ab610754565b5f01610b3d565b905090565b6105bf611040565b5f6105c8610754565b6001015f8481526020019081526020015f2080546105e590611c0d565b80601f016020809104026020016040519081016040528092919081815260200182805461061190611c0d565b801561065c5780601f106106335761010080835404028352916020019161065c565b820191905f5260205f20905b81548152906001019060200180831161063f57829003601f168201915b505050505090505f81510361069d576040517fe57b630400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808060200190518101906106b19190611d78565b915050919050565b5f6106c2610508565b7f82850db280a2a2d24384284a8455f1e4b4e73ab353b2a7a121eee673a754af0c836040516020016106f5929190611dbf565b6040516020818303038152906040528051906020012060405160200161071c929190611e5a565b604051602081830303815290604052805190602001209050919050565b5f80610746858585610b8a565b509050809150509392505050565b5f7f21f3d48e9724698d61a2dadd352c365013ee5d0f841f7fc54fb8a78301ee0c00905090565b5f61078583610c31565b905081810154905068fbb67fda52d4bfb8bf811415810290506107a783610b3d565b82106107df576040517f4e23d03500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b92915050565b6060806040518060400160405280601a81526020017f556e6973776170204d696e696d616c2044656c65676174696f6e0000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250915091509091565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108c1576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f6108cc610754565b9050806001015f8381526020019081526020015f205f6108ec9190611080565b61090182825f01610c4890919063ffffffff16565b610937576040517fe57b630400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b5f61094582610d58565b90505f610950610754565b90508260405160200161096391906112c3565b604051602081830303815290604052816001015f8481526020019081526020015f209081610991919061202d565b506109a782825f01610d9890919063ffffffff16565b5050919050565b5f7f01000000000000000000000000000000000000000000000000000000000000005f1b821480610a0057507f01010000000000000000000000000000000000000000000000000000000000005f1b82145b9050919050565b5f7f01000000000078210001000000000000000000000000000000000000000000005f1b821480610a5957507f01010000000078210001000000000000000000000000000000000000000000005f1b82145b9050919050565b5f610a6a83610ec1565b90505f5b8251811015610afc575f80610a9c858481518110610a8f57610a8e6120fc565b5b6020026020010151610ef1565b9150915081158015610aab5750835b15610aed57806040517fa5fa8d2b000000000000000000000000000000000000000000000000000000008152600401610ae49190612171565b60405180910390fd5b50508080600101915050610a6e565b50505050565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b34906121db565b60405180910390fd5b5f80610b4883610c31565b90508019548060011c925080610b83575f92508282015415610b8357600192508282015415610b8357600292508282015415610b8357600392505b5050919050565b5f806040848490501480610ba15750604184849050145b15610bee573073ffffffffffffffffffffffffffffffffffffffff16610bc8868686610fb4565b73ffffffffffffffffffffffffffffffffffffffff16145f805f1b905091509150610c29565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c20906121db565b60405180910390fd5b935093915050565b5f6318fb5864600452815f5260245f209050919050565b5f80610c5384610c31565b905068fbb67fda52d4bfb8bf8303610c725763f5a267f15f526004601cfd5b82610c845768fbb67fda52d4bfb8bf92505b801954600115610d505780610cf9576001925083825403610cbb5760018201548255600282015460018301555f6002830155610d50565b83600183015403610cdb57600282015460018301555f6002830155610d50565b83600283015403610cf1575f6002830155610d50565b5f9250610d50565b81602052835f5260405f20805480610d12575050610d50565b60018360011c039250826001820314610d3c57828401548060018303860155805f528160405f2055505b60018360011b178419555f82556001945050505b505092915050565b5f8160200151826060015180519060200120604051602001610d7b929190612208565b604051602081830303815290604052805190602001209050919050565b5f80610da384610c31565b905068fbb67fda52d4bfb8bf8303610dc25763f5a267f15f526004601cfd5b82610dd45768fbb67fda52d4bfb8bf92505b801954600115610eb9578160205280610e8257815480610dfb578483556001935050610eb9565b848103610e085750610eb9565b600183015480610e2357856001850155600194505050610eb9565b858103610e31575050610eb9565b600284015480610e4d5786600286015560019550505050610eb9565b868103610e5c57505050610eb9565b825f52600160405f2055815f52600260405f2055805f52600360405f2055600793505050505b835f5260405f208054610eb7578160011c915084828401558160010181558160010160011b6001178319556001935050610eb9565b505b505092915050565b5f805f1b7eff0000000000000000000000000000000000000000000000000000000000005f1b8316149050919050565b5f60605f8073ffffffffffffffffffffffffffffffffffffffff16845f015173ffffffffffffffffffffffffffffffffffffffff1614610f3457835f0151610f36565b305b90508073ffffffffffffffffffffffffffffffffffffffff1684602001518560400151604051610f669190612269565b5f6040518083038185875af1925050503d805f8114610fa0576040519150601f19603f3d011682016040523d82523d5f602084013e610fa5565b606091505b50809350819450505050915091565b5f604051600115611038578260408114610fd65760418114610ffa575061102b565b6020850135601b8160ff1c0160205285356040528060011b60011c6060525061100b565b60408501355f1a6020526040856040375b50845f526020600160805f60015afa5191505f606052806040523d611038575b638baa579f5f526004601cfd5b509392505050565b60405180608001604052805f64ffffffffff1681526020015f600281111561106b5761106a611166565b5b81526020015f15158152602001606081525090565b50805461108c90611c0d565b5f825580601f1061109d57506110ba565b601f0160209004905f5260205f20908101906110b991906110bd565b5b50565b5b808211156110d4575f815f9055506001016110be565b5090565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b6110fb816110e9565b8114611105575f80fd5b50565b5f81359050611116816110f2565b92915050565b5f60208284031215611131576111306110e1565b5b5f61113e84828501611108565b91505092915050565b5f64ffffffffff82169050919050565b61116081611147565b82525050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600381106111a4576111a3611166565b5b50565b5f8190506111b482611193565b919050565b5f6111c3826111a7565b9050919050565b6111d3816111b9565b82525050565b5f8115159050919050565b6111ed816111d9565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611235826111f3565b61123f81856111fd565b935061124f81856020860161120d565b6112588161121b565b840191505092915050565b5f608083015f8301516112785f860182611157565b50602083015161128b60208601826111ca565b50604083015161129e60408601826111e4565b50606083015184820360608601526112b6828261122b565b9150508091505092915050565b5f6020820190508181035f8301526112db8184611263565b905092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112611304576113036112e3565b5b8235905067ffffffffffffffff811115611321576113206112e7565b5b60208301915083600182028301111561133d5761133c6112eb565b5b9250929050565b5f805f6040848603121561135b5761135a6110e1565b5b5f61136886828701611108565b935050602084013567ffffffffffffffff811115611389576113886110e5565b5b611395868287016112ef565b92509250509250925092565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6113d5816113a1565b82525050565b5f6020820190506113ee5f8301846113cc565b92915050565b5f819050919050565b611406816113f4565b8114611410575f80fd5b50565b5f81359050611421816113fd565b92915050565b5f6020828403121561143c5761143b6110e1565b5b5f61144984828501611413565b91505092915050565b61145b816110e9565b82525050565b5f6020820190506114745f830184611452565b92915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6114ae8161147a565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f6114d8826114b4565b6114e281856114be565b93506114f281856020860161120d565b6114fb8161121b565b840191505092915050565b61150f816113f4565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61153e82611515565b9050919050565b61154e81611534565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611586816113f4565b82525050565b5f611597838361157d565b60208301905092915050565b5f602082019050919050565b5f6115b982611554565b6115c3818561155e565b93506115ce8361156e565b805f5b838110156115fe5781516115e5888261158c565b97506115f0836115a3565b9250506001810190506115d1565b5085935050505092915050565b5f60e08201905061161e5f83018a6114a5565b818103602083015261163081896114ce565b9050818103604083015261164481886114ce565b90506116536060830187611506565b6116606080830186611545565b61166d60a0830185611452565b81810360c083015261167f81846115af565b905098975050505050505050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6116c78261121b565b810181811067ffffffffffffffff821117156116e6576116e5611691565b5b80604052505050565b5f6116f86110d8565b905061170482826116be565b919050565b5f80fd5b61171681611147565b8114611720575f80fd5b50565b5f813590506117318161170d565b92915050565b60038110611743575f80fd5b50565b5f8135905061175481611737565b92915050565b611763816111d9565b811461176d575f80fd5b50565b5f8135905061177e8161175a565b92915050565b5f80fd5b5f67ffffffffffffffff8211156117a2576117a1611691565b5b6117ab8261121b565b9050602081019050919050565b828183375f83830152505050565b5f6117d86117d384611788565b6116ef565b9050828152602081018484840111156117f4576117f3611784565b5b6117ff8482856117b8565b509392505050565b5f82601f83011261181b5761181a6112e3565b5b813561182b8482602086016117c6565b91505092915050565b5f608082840312156118495761184861168d565b5b61185360806116ef565b90505f61186284828501611723565b5f83015250602061187584828501611746565b602083015250604061188984828501611770565b604083015250606082013567ffffffffffffffff8111156118ad576118ac611709565b5b6118b984828501611807565b60608301525092915050565b5f602082840312156118da576118d96110e1565b5b5f82013567ffffffffffffffff8111156118f7576118f66110e5565b5b61190384828501611834565b91505092915050565b611915816111d9565b82525050565b5f60208201905061192e5f83018461190c565b92915050565b5f6020820190506119475f830184611506565b92915050565b5f67ffffffffffffffff82111561196757611966611691565b5b602082029050602081019050919050565b61198181611534565b811461198b575f80fd5b50565b5f8135905061199c81611978565b92915050565b5f606082840312156119b7576119b661168d565b5b6119c160606116ef565b90505f6119d08482850161198e565b5f8301525060206119e384828501611413565b602083015250604082013567ffffffffffffffff811115611a0757611a06611709565b5b611a1384828501611807565b60408301525092915050565b5f611a31611a2c8461194d565b6116ef565b90508083825260208201905060208402830185811115611a5457611a536112eb565b5b835b81811015611a9b57803567ffffffffffffffff811115611a7957611a786112e3565b5b808601611a8689826119a2565b85526020850194505050602081019050611a56565b5050509392505050565b5f82601f830112611ab957611ab86112e3565b5b8135611ac9848260208601611a1f565b91505092915050565b5f60208284031215611ae757611ae66110e1565b5b5f82013567ffffffffffffffff811115611b0457611b036110e5565b5b611b1084828501611aa5565b91505092915050565b5f8060408385031215611b2f57611b2e6110e1565b5b5f83013567ffffffffffffffff811115611b4c57611b4b6110e5565b5b611b5885828601611aa5565b925050602083013567ffffffffffffffff811115611b7957611b786110e5565b5b611b8585828601611807565b9150509250929050565b5f60a082019050611ba25f830188611452565b611baf6020830187611452565b611bbc6040830186611452565b611bc96060830185611506565b611bd66080830184611545565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611c2457607f821691505b602082108103611c3757611c36611be0565b5b50919050565b5f81519050611c4b8161170d565b92915050565b5f81519050611c5f81611737565b92915050565b5f81519050611c738161175a565b92915050565b5f611c8b611c8684611788565b6116ef565b905082815260208101848484011115611ca757611ca6611784565b5b611cb284828561120d565b509392505050565b5f82601f830112611cce57611ccd6112e3565b5b8151611cde848260208601611c79565b91505092915050565b5f60808284031215611cfc57611cfb61168d565b5b611d0660806116ef565b90505f611d1584828501611c3d565b5f830152506020611d2884828501611c51565b6020830152506040611d3c84828501611c65565b604083015250606082015167ffffffffffffffff811115611d6057611d5f611709565b5b611d6c84828501611cba565b60608301525092915050565b5f60208284031215611d8d57611d8c6110e1565b5b5f82015167ffffffffffffffff811115611daa57611da96110e5565b5b611db684828501611ce7565b91505092915050565b5f604082019050611dd25f830185611452565b611ddf6020830184611452565b9392505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f611e24600283611de6565b9150611e2f82611df0565b600282019050919050565b5f819050919050565b611e54611e4f826110e9565b611e3a565b82525050565b5f611e6482611e18565b9150611e708285611e43565b602082019150611e808284611e43565b6020820191508190509392505050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302611eec7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611eb1565b611ef68683611eb1565b95508019841693508086168417925050509392505050565b5f819050919050565b5f611f31611f2c611f27846113f4565b611f0e565b6113f4565b9050919050565b5f819050919050565b611f4a83611f17565b611f5e611f5682611f38565b848454611ebd565b825550505050565b5f90565b611f72611f66565b611f7d818484611f41565b505050565b5b81811015611fa057611f955f82611f6a565b600181019050611f83565b5050565b601f821115611fe557611fb681611e90565b611fbf84611ea2565b81016020851015611fce578190505b611fe2611fda85611ea2565b830182611f82565b50505b505050565b5f82821c905092915050565b5f6120055f1984600802611fea565b1980831691505092915050565b5f61201d8383611ff6565b9150826002028217905092915050565b612036826111f3565b67ffffffffffffffff81111561204f5761204e611691565b5b6120598254611c0d565b612064828285611fa4565b5f60209050601f831160018114612095575f8415612083578287015190505b61208d8582612012565b8655506120f4565b601f1984166120a386611e90565b5f5b828110156120ca578489015182556001820191506020850194506020810190506120a5565b868310156120e757848901516120e3601f891682611ff6565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82825260208201905092915050565b5f612143826111f3565b61214d8185612129565b935061215d81856020860161120d565b6121668161121b565b840191505092915050565b5f6020820190508181035f8301526121898184612139565b905092915050565b7f4e6f7420696d706c656d656e74656400000000000000000000000000000000005f82015250565b5f6121c5600f836114be565b91506121d082612191565b602082019050919050565b5f6020820190508181035f8301526121f2816121b9565b9050919050565b612202816111b9565b82525050565b5f60408201905061221b5f8301856121f9565b6122286020830184611452565b9392505050565b5f81905092915050565b5f612243826111f3565b61224d818561222f565b935061225d81856020860161120d565b80840191505092915050565b5f6122748284612239565b91508190509291505056fea2646970667358221220c433f289bb2a8e01a2b942931e4016077a2fb8c30e9e67fb2aeb0a528d8ac09964736f6c634300081a0033","sourceMap":"672:5527:32:-:0;;;;;;;;;;;;;1242:18:30;1270:21;1319:23;:21;;;:23;;:::i;:::-;1301:41;;;;;;;;1386:4;1370:22;;;;;;1352:40;;;;;;1439:7;1423:25;;;;;;1402:46;;;;;;1232:223;;672:5527:32;;4018:158:30;4074:18;4094:21;4127:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4018:158;;:::o;672:5527:32:-;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361061009b575f3560e01c8063b75c7dc611610063578063b75c7dc6146101bf578063cebfe336146101e7578063d03c791414610223578063e9ae5c531461025f578063f698da251461027b578063fac750e0146102a55761009b565b806312aaac701461009f5780631626ba7e146100db5780634223b5c2146101175780636575f6aa1461015357806384b0196e1461018f575b5f80fd5b3480156100aa575f80fd5b506100c560048036038101906100c0919061111c565b6102cf565b6040516100d291906112c3565b60405180910390f35b3480156100e6575f80fd5b5061010160048036038101906100fc9190611344565b6102e7565b60405161010e91906113db565b60405180910390f35b348015610122575f80fd5b5061013d60048036038101906101389190611427565b610321565b60405161014a91906112c3565b60405180910390f35b34801561015e575f80fd5b506101796004803603810190610174919061111c565b610354565b6040516101869190611461565b60405180910390f35b34801561019a575f80fd5b506101a3610365565b6040516101b6979695949392919061160b565b60405180910390f35b3480156101ca575f80fd5b506101e560048036038101906101e0919061111c565b6103b0565b005b3480156101f2575f80fd5b5061020d600480360381019061020891906118c5565b6103f1565b60405161021a9190611461565b60405180910390f35b34801561022e575f80fd5b506102496004803603810190610244919061111c565b610442565b604051610256919061191b565b60405180910390f35b61027960048036038101906102749190611344565b610463565b005b348015610286575f80fd5b5061028f610508565b60405161029c9190611461565b60405180910390f35b3480156102b0575f80fd5b506102b961059f565b6040516102c69190611934565b60405180910390f35b6102d7611040565b6102e0826105b7565b9050919050565b5f6102fb6102f4856106b9565b8484610739565b1561030f57631626ba7e60e01b905061031a565b63ffffffff60e01b90505b9392505050565b610329611040565b61034d61034883610338610754565b5f0161077b90919063ffffffff16565b6105b7565b9050919050565b5f61035e826106b9565b9050919050565b5f6060805f805f60607f0f0000000000000000000000000000000000000000000000000000000000000096506103996107e5565b809650819750505046935030925090919293949596565b6103b861085c565b6103c1816108c3565b807fe5af7daed5ab2a2dc5f98d53619f05089c0c14d11a6621f6b906a2366c9a7ab360405160405180910390a250565b5f6103fa61085c565b6104038261093b565b9050807f3d3a48be5a98628ecf98a6201185102da78bbab8f63a4b2d6b9eef354f5131f58360405161043591906112c3565b60405180910390a2919050565b5f61044c826109ae565b8061045c575061045b82610a07565b5b9050919050565b61046c836109ae565b1561049b575f82828101906104819190611ad2565b905061048b61085c565b6104958482610a60565b50610503565b6104a483610a07565b156104d0575f8083838101906104ba9190611b19565b915091506104c9858383610b02565b5050610502565b6040517f7f18127500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f1b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000004630604051602001610584959493929190611b8f565b60405160208183030381529060405280519060200120905090565b5f6105b26105ab610754565b5f01610b3d565b905090565b6105bf611040565b5f6105c8610754565b6001015f8481526020019081526020015f2080546105e590611c0d565b80601f016020809104026020016040519081016040528092919081815260200182805461061190611c0d565b801561065c5780601f106106335761010080835404028352916020019161065c565b820191905f5260205f20905b81548152906001019060200180831161063f57829003601f168201915b505050505090505f81510361069d576040517fe57b630400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808060200190518101906106b19190611d78565b915050919050565b5f6106c2610508565b7f82850db280a2a2d24384284a8455f1e4b4e73ab353b2a7a121eee673a754af0c836040516020016106f5929190611dbf565b6040516020818303038152906040528051906020012060405160200161071c929190611e5a565b604051602081830303815290604052805190602001209050919050565b5f80610746858585610b8a565b509050809150509392505050565b5f7f21f3d48e9724698d61a2dadd352c365013ee5d0f841f7fc54fb8a78301ee0c00905090565b5f61078583610c31565b905081810154905068fbb67fda52d4bfb8bf811415810290506107a783610b3d565b82106107df576040517f4e23d03500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b92915050565b6060806040518060400160405280601a81526020017f556e6973776170204d696e696d616c2044656c65676174696f6e0000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250915091509091565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108c1576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f6108cc610754565b9050806001015f8381526020019081526020015f205f6108ec9190611080565b61090182825f01610c4890919063ffffffff16565b610937576040517fe57b630400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b5f61094582610d58565b90505f610950610754565b90508260405160200161096391906112c3565b604051602081830303815290604052816001015f8481526020019081526020015f209081610991919061202d565b506109a782825f01610d9890919063ffffffff16565b5050919050565b5f7f01000000000000000000000000000000000000000000000000000000000000005f1b821480610a0057507f01010000000000000000000000000000000000000000000000000000000000005f1b82145b9050919050565b5f7f01000000000078210001000000000000000000000000000000000000000000005f1b821480610a5957507f01010000000078210001000000000000000000000000000000000000000000005f1b82145b9050919050565b5f610a6a83610ec1565b90505f5b8251811015610afc575f80610a9c858481518110610a8f57610a8e6120fc565b5b6020026020010151610ef1565b9150915081158015610aab5750835b15610aed57806040517fa5fa8d2b000000000000000000000000000000000000000000000000000000008152600401610ae49190612171565b60405180910390fd5b50508080600101915050610a6e565b50505050565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b34906121db565b60405180910390fd5b5f80610b4883610c31565b90508019548060011c925080610b83575f92508282015415610b8357600192508282015415610b8357600292508282015415610b8357600392505b5050919050565b5f806040848490501480610ba15750604184849050145b15610bee573073ffffffffffffffffffffffffffffffffffffffff16610bc8868686610fb4565b73ffffffffffffffffffffffffffffffffffffffff16145f805f1b905091509150610c29565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c20906121db565b60405180910390fd5b935093915050565b5f6318fb5864600452815f5260245f209050919050565b5f80610c5384610c31565b905068fbb67fda52d4bfb8bf8303610c725763f5a267f15f526004601cfd5b82610c845768fbb67fda52d4bfb8bf92505b801954600115610d505780610cf9576001925083825403610cbb5760018201548255600282015460018301555f6002830155610d50565b83600183015403610cdb57600282015460018301555f6002830155610d50565b83600283015403610cf1575f6002830155610d50565b5f9250610d50565b81602052835f5260405f20805480610d12575050610d50565b60018360011c039250826001820314610d3c57828401548060018303860155805f528160405f2055505b60018360011b178419555f82556001945050505b505092915050565b5f8160200151826060015180519060200120604051602001610d7b929190612208565b604051602081830303815290604052805190602001209050919050565b5f80610da384610c31565b905068fbb67fda52d4bfb8bf8303610dc25763f5a267f15f526004601cfd5b82610dd45768fbb67fda52d4bfb8bf92505b801954600115610eb9578160205280610e8257815480610dfb578483556001935050610eb9565b848103610e085750610eb9565b600183015480610e2357856001850155600194505050610eb9565b858103610e31575050610eb9565b600284015480610e4d5786600286015560019550505050610eb9565b868103610e5c57505050610eb9565b825f52600160405f2055815f52600260405f2055805f52600360405f2055600793505050505b835f5260405f208054610eb7578160011c915084828401558160010181558160010160011b6001178319556001935050610eb9565b505b505092915050565b5f805f1b7eff0000000000000000000000000000000000000000000000000000000000005f1b8316149050919050565b5f60605f8073ffffffffffffffffffffffffffffffffffffffff16845f015173ffffffffffffffffffffffffffffffffffffffff1614610f3457835f0151610f36565b305b90508073ffffffffffffffffffffffffffffffffffffffff1684602001518560400151604051610f669190612269565b5f6040518083038185875af1925050503d805f8114610fa0576040519150601f19603f3d011682016040523d82523d5f602084013e610fa5565b606091505b50809350819450505050915091565b5f604051600115611038578260408114610fd65760418114610ffa575061102b565b6020850135601b8160ff1c0160205285356040528060011b60011c6060525061100b565b60408501355f1a6020526040856040375b50845f526020600160805f60015afa5191505f606052806040523d611038575b638baa579f5f526004601cfd5b509392505050565b60405180608001604052805f64ffffffffff1681526020015f600281111561106b5761106a611166565b5b81526020015f15158152602001606081525090565b50805461108c90611c0d565b5f825580601f1061109d57506110ba565b601f0160209004905f5260205f20908101906110b991906110bd565b5b50565b5b808211156110d4575f815f9055506001016110be565b5090565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b6110fb816110e9565b8114611105575f80fd5b50565b5f81359050611116816110f2565b92915050565b5f60208284031215611131576111306110e1565b5b5f61113e84828501611108565b91505092915050565b5f64ffffffffff82169050919050565b61116081611147565b82525050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600381106111a4576111a3611166565b5b50565b5f8190506111b482611193565b919050565b5f6111c3826111a7565b9050919050565b6111d3816111b9565b82525050565b5f8115159050919050565b6111ed816111d9565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611235826111f3565b61123f81856111fd565b935061124f81856020860161120d565b6112588161121b565b840191505092915050565b5f608083015f8301516112785f860182611157565b50602083015161128b60208601826111ca565b50604083015161129e60408601826111e4565b50606083015184820360608601526112b6828261122b565b9150508091505092915050565b5f6020820190508181035f8301526112db8184611263565b905092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112611304576113036112e3565b5b8235905067ffffffffffffffff811115611321576113206112e7565b5b60208301915083600182028301111561133d5761133c6112eb565b5b9250929050565b5f805f6040848603121561135b5761135a6110e1565b5b5f61136886828701611108565b935050602084013567ffffffffffffffff811115611389576113886110e5565b5b611395868287016112ef565b92509250509250925092565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6113d5816113a1565b82525050565b5f6020820190506113ee5f8301846113cc565b92915050565b5f819050919050565b611406816113f4565b8114611410575f80fd5b50565b5f81359050611421816113fd565b92915050565b5f6020828403121561143c5761143b6110e1565b5b5f61144984828501611413565b91505092915050565b61145b816110e9565b82525050565b5f6020820190506114745f830184611452565b92915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6114ae8161147a565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f6114d8826114b4565b6114e281856114be565b93506114f281856020860161120d565b6114fb8161121b565b840191505092915050565b61150f816113f4565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61153e82611515565b9050919050565b61154e81611534565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611586816113f4565b82525050565b5f611597838361157d565b60208301905092915050565b5f602082019050919050565b5f6115b982611554565b6115c3818561155e565b93506115ce8361156e565b805f5b838110156115fe5781516115e5888261158c565b97506115f0836115a3565b9250506001810190506115d1565b5085935050505092915050565b5f60e08201905061161e5f83018a6114a5565b818103602083015261163081896114ce565b9050818103604083015261164481886114ce565b90506116536060830187611506565b6116606080830186611545565b61166d60a0830185611452565b81810360c083015261167f81846115af565b905098975050505050505050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6116c78261121b565b810181811067ffffffffffffffff821117156116e6576116e5611691565b5b80604052505050565b5f6116f86110d8565b905061170482826116be565b919050565b5f80fd5b61171681611147565b8114611720575f80fd5b50565b5f813590506117318161170d565b92915050565b60038110611743575f80fd5b50565b5f8135905061175481611737565b92915050565b611763816111d9565b811461176d575f80fd5b50565b5f8135905061177e8161175a565b92915050565b5f80fd5b5f67ffffffffffffffff8211156117a2576117a1611691565b5b6117ab8261121b565b9050602081019050919050565b828183375f83830152505050565b5f6117d86117d384611788565b6116ef565b9050828152602081018484840111156117f4576117f3611784565b5b6117ff8482856117b8565b509392505050565b5f82601f83011261181b5761181a6112e3565b5b813561182b8482602086016117c6565b91505092915050565b5f608082840312156118495761184861168d565b5b61185360806116ef565b90505f61186284828501611723565b5f83015250602061187584828501611746565b602083015250604061188984828501611770565b604083015250606082013567ffffffffffffffff8111156118ad576118ac611709565b5b6118b984828501611807565b60608301525092915050565b5f602082840312156118da576118d96110e1565b5b5f82013567ffffffffffffffff8111156118f7576118f66110e5565b5b61190384828501611834565b91505092915050565b611915816111d9565b82525050565b5f60208201905061192e5f83018461190c565b92915050565b5f6020820190506119475f830184611506565b92915050565b5f67ffffffffffffffff82111561196757611966611691565b5b602082029050602081019050919050565b61198181611534565b811461198b575f80fd5b50565b5f8135905061199c81611978565b92915050565b5f606082840312156119b7576119b661168d565b5b6119c160606116ef565b90505f6119d08482850161198e565b5f8301525060206119e384828501611413565b602083015250604082013567ffffffffffffffff811115611a0757611a06611709565b5b611a1384828501611807565b60408301525092915050565b5f611a31611a2c8461194d565b6116ef565b90508083825260208201905060208402830185811115611a5457611a536112eb565b5b835b81811015611a9b57803567ffffffffffffffff811115611a7957611a786112e3565b5b808601611a8689826119a2565b85526020850194505050602081019050611a56565b5050509392505050565b5f82601f830112611ab957611ab86112e3565b5b8135611ac9848260208601611a1f565b91505092915050565b5f60208284031215611ae757611ae66110e1565b5b5f82013567ffffffffffffffff811115611b0457611b036110e5565b5b611b1084828501611aa5565b91505092915050565b5f8060408385031215611b2f57611b2e6110e1565b5b5f83013567ffffffffffffffff811115611b4c57611b4b6110e5565b5b611b5885828601611aa5565b925050602083013567ffffffffffffffff811115611b7957611b786110e5565b5b611b8585828601611807565b9150509250929050565b5f60a082019050611ba25f830188611452565b611baf6020830187611452565b611bbc6040830186611452565b611bc96060830185611506565b611bd66080830184611545565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611c2457607f821691505b602082108103611c3757611c36611be0565b5b50919050565b5f81519050611c4b8161170d565b92915050565b5f81519050611c5f81611737565b92915050565b5f81519050611c738161175a565b92915050565b5f611c8b611c8684611788565b6116ef565b905082815260208101848484011115611ca757611ca6611784565b5b611cb284828561120d565b509392505050565b5f82601f830112611cce57611ccd6112e3565b5b8151611cde848260208601611c79565b91505092915050565b5f60808284031215611cfc57611cfb61168d565b5b611d0660806116ef565b90505f611d1584828501611c3d565b5f830152506020611d2884828501611c51565b6020830152506040611d3c84828501611c65565b604083015250606082015167ffffffffffffffff811115611d6057611d5f611709565b5b611d6c84828501611cba565b60608301525092915050565b5f60208284031215611d8d57611d8c6110e1565b5b5f82015167ffffffffffffffff811115611daa57611da96110e5565b5b611db684828501611ce7565b91505092915050565b5f604082019050611dd25f830185611452565b611ddf6020830184611452565b9392505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f611e24600283611de6565b9150611e2f82611df0565b600282019050919050565b5f819050919050565b611e54611e4f826110e9565b611e3a565b82525050565b5f611e6482611e18565b9150611e708285611e43565b602082019150611e808284611e43565b6020820191508190509392505050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302611eec7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611eb1565b611ef68683611eb1565b95508019841693508086168417925050509392505050565b5f819050919050565b5f611f31611f2c611f27846113f4565b611f0e565b6113f4565b9050919050565b5f819050919050565b611f4a83611f17565b611f5e611f5682611f38565b848454611ebd565b825550505050565b5f90565b611f72611f66565b611f7d818484611f41565b505050565b5b81811015611fa057611f955f82611f6a565b600181019050611f83565b5050565b601f821115611fe557611fb681611e90565b611fbf84611ea2565b81016020851015611fce578190505b611fe2611fda85611ea2565b830182611f82565b50505b505050565b5f82821c905092915050565b5f6120055f1984600802611fea565b1980831691505092915050565b5f61201d8383611ff6565b9150826002028217905092915050565b612036826111f3565b67ffffffffffffffff81111561204f5761204e611691565b5b6120598254611c0d565b612064828285611fa4565b5f60209050601f831160018114612095575f8415612083578287015190505b61208d8582612012565b8655506120f4565b601f1984166120a386611e90565b5f5b828110156120ca578489015182556001820191506020850194506020810190506120a5565b868310156120e757848901516120e3601f891682611ff6565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82825260208201905092915050565b5f612143826111f3565b61214d8185612129565b935061215d81856020860161120d565b6121668161121b565b840191505092915050565b5f6020820190508181035f8301526121898184612139565b905092915050565b7f4e6f7420696d706c656d656e74656400000000000000000000000000000000005f82015250565b5f6121c5600f836114be565b91506121d082612191565b602082019050919050565b5f6020820190508181035f8301526121f2816121b9565b9050919050565b612202816111b9565b82525050565b5f60408201905061221b5f8301856121f9565b6122286020830184611452565b9392505050565b5f81905092915050565b5f612243826111f3565b61224d818561222f565b935061225d81856020860161120d565b80840191505092915050565b5f6122748284612239565b91508190509291505056fea2646970667358221220c433f289bb2a8e01a2b942931e4016077a2fb8c30e9e67fb2aeb0a528d8ac09964736f6c634300081a0033","sourceMap":"672:5527:32:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2498:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;872:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2314:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3273:119:30;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2166:597;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;1970:134:32;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1750:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2612:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1166:543;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2910:199:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2145:128:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2498:108;2554:10;;:::i;:::-;2583:16;2591:7;2583;:16::i;:::-;2576:23;;2498:108;;;:::o;872:288::-;968:13;997:69;1022:20;1037:4;1022:14;:20::i;:::-;1055:9;;997:17;:69::i;:::-;993:124;;;615:10:31;1089:17:32;;1082:24;;;;993:124;769:10:31;1134:19:32;;1127:26;;872:288;;;;;;:::o;2314:143::-;2363:10;;:::i;:::-;2392:58;2400:49;2447:1;2400:33;:31;:33::i;:::-;:43;;:46;;:49;;;;:::i;:::-;2392:7;:58::i;:::-;2385:65;;2314:143;;;:::o;3273:119:30:-;3339:7;3365:20;3380:4;3365:14;:20::i;:::-;3358:27;;3273:119;;;:::o;2166:597::-;2266:13;2293:18;2325:21;2360:15;2389:25;2428:12;2454:27;2506:16;;;2563:23;:21;:23::i;:::-;2545:41;;;;;;;;2606:13;2596:23;;2657:4;2629:33;;2166:597;;;;;;;:::o;1970:134:32:-;2022:18;:16;:18::i;:::-;2050:16;2058:7;2050;:16::i;:::-;2089:7;2081:16;;;;;;;;;;1970:134;:::o;1750:179::-;1803:15;1830:18;:16;:18::i;:::-;1868:15;1879:3;1868:10;:15::i;:::-;1858:25;;1909:7;1898:24;1918:3;1898:24;;;;;;:::i;:::-;;;;;;;;1750:179;;;:::o;2612:159::-;2689:11;2719:20;:4;:18;:20::i;:::-;:45;;;;2743:21;:4;:19;:21::i;:::-;2719:45;2712:52;;2612:159;;;:::o;1166:543::-;1267:20;:4;:18;:20::i;:::-;1263:440;;;1303:20;1337:13;;1326:36;;;;;;;:::i;:::-;1303:59;;1376:18;:16;:18::i;:::-;1408:21;1417:4;1423:5;1408:8;:21::i;:::-;1289:151;1263:440;;;1450:21;:4;:19;:21::i;:::-;1446:257;;;1488:20;1510:19;1544:13;;1533:43;;;;;;;:::i;:::-;1487:89;;;;1590:29;1599:4;1605:5;1612:6;1590:8;:29::i;:::-;1473:157;;1446:257;;;1657:35;;;;;;;;;;;;;;1446:257;1263:440;1166:543;;;:::o;2910:199:30:-;2958:7;765:66;3017:16;;3035:15;3052:18;3072:13;3095:4;3006:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2996:106;;;;;;2977:125;;2910:199;:::o;2145:128:32:-;2188:7;2214:52;:33;:31;:33::i;:::-;:43;;:50;:52::i;:::-;2207:59;;2145:128;:::o;3727:254::-;3783:10;;:::i;:::-;3805:17;3825:33;:31;:33::i;:::-;:44;;:53;3870:7;3825:53;;;;;;;;;;;3805:73;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3907:1;3892:4;:11;:16;3888:46;;3917:17;;;;;;;;;;;;;;3888:46;3962:4;3951:23;;;;;;;;;;;;:::i;:::-;3944:30;;;3727:254;;;:::o;3560:212:30:-;3621:7;3698:17;:15;:17::i;:::-;980:58;3757:4;3727:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3717:46;;;;;;3669:95;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3659:106;;;;;;3640:125;;3560:212;;;:::o;5367:208:32:-;5466:4;5483:12;5500:44;5528:4;5534:9;;5500:27;:44::i;:::-;5482:62;;;5561:7;5554:14;;;5367:208;;;;;:::o;575:168:39:-;613:34;692:35;682:45;;575:168;:::o;28924:369:29:-;28994:14;29029;29039:3;29029:9;:14::i;:::-;29020:23;;29147:1;29139:6;29135:14;29129:21;29119:31;;29203:14;29195:6;29192:26;29185:34;29177:6;29173:47;29163:57;;29248:11;29255:3;29248:6;:11::i;:::-;29243:1;:16;29239:47;;29268:18;;;;;;;;;;;;;;29239:47;28924:369;;;;:::o;4018:158:30:-;4074:18;4094:21;4127:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4018:158;;:::o;2777:121:32:-;2854:4;2832:27;;:10;:27;;;2828:63;;2868:23;;;;;;;;;;;;;;2828:63;2777:121::o;3393:328::-;3445:57;3505:33;:31;:33::i;:::-;3445:93;;3555:24;:35;;:44;3591:7;3555:44;;;;;;;;;;;;3548:51;;;;:::i;:::-;3614:50;3656:7;3614:24;:34;;:41;;:50;;;;:::i;:::-;3609:106;;3687:17;;;;;;;;;;;;;;3609:106;3435:286;3393:328;:::o;2958:429::-;3011:15;3048:10;:3;:8;:10::i;:::-;3038:20;;3068:57;3128:33;:31;:33::i;:::-;3068:93;;3319:3;3308:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;3261:24;:35;;:44;3297:7;3261:44;;;;;;;;;;;:62;;;;;;:::i;:::-;;3333:47;3372:7;3333:24;:34;;:38;;:47;;;;:::i;:::-;;3028:359;2958:429;;;:::o;1348:145:40:-;1408:4;357:66;1439:12;;1431:4;:20;:55;;;;472:66;1463:23;;1455:4;:31;1431:55;1424:62;;1348:145;;;:::o;1793:182::-;1854:4;592:66;1885:28;;1877:4;:36;:91;;;;735:66;1925:43;;1917:4;:51;1877:91;1870:98;;1793:182;;;:::o;4605:436:32:-;4677:17;4697:19;:4;:17;:19::i;:::-;4677:39;;4731:9;4726:309;4750:5;:12;4746:1;:16;4726:309;;;4784:12;4798:19;4821:18;4830:5;4836:1;4830:8;;;;;;;;:::i;:::-;;;;;;;;4821;:18::i;:::-;4783:56;;;;4965:7;4964:8;:24;;;;;4976:12;4964:24;4960:64;;;5017:6;4997:27;;;;;;;;;;;:::i;:::-;;;;;;;;4960:64;4769:266;;4764:3;;;;;;;4726:309;;;;4667:374;4605:436;;:::o;4076:265::-;4309:25;;;;;;;;;;:::i;:::-;;;;;;;;5002:655:29;5065:14;5091:16;5110:14;5120:3;5110:9;:14::i;:::-;5091:33;;5219:8;5215:13;5209:20;5259:1;5256;5252:9;5242:19;;5288:1;5274:367;;5322:1;5312:11;;5370:6;5360:8;5356:21;5350:28;5340:49;5382:5;5340:49;5416:1;5406:11;;5464:6;5454:8;5450:21;5444:28;5434:49;5476:5;5434:49;5510:1;5500:11;;5558:6;5548:8;5544:21;5538:28;5528:49;5570:5;5528:49;5604:1;5594:11;;5274:367;5186:465;;5002:655;;;:::o;5722:475:32:-;5848:12;5862:15;6005:2;5985:9;;:16;;:22;:48;;;;6031:2;6011:9;;:16;;:22;5985:48;5981:148;;;6109:4;6057:57;;:40;6079:6;6087:9;;6057:21;:40::i;:::-;:57;;;6116:1;6049:69;;;;;;;;;;;5981:148;6165:25;;;;;;;;;;:::i;:::-;;;;;;;;5722:475;;;;;;;:::o;31787:282:29:-;31850:9;31950:30;31944:4;31937:44;32007:6;32001:4;31994:20;32048:4;32042;32032:21;32027:26;;31787:282;;;:::o;19319:2024::-;19392:11;19415:16;19434:14;19444:3;19434:9;:14::i;:::-;19415:33;;19537:14;19530:5;19527:25;19524:148;;19584:10;19578:4;19571:24;19653:4;19647;19640:18;19524:148;19695:5;19685:44;;19713:14;19704:23;;19685:44;19767:8;19763:13;19757:20;19780:1;19742:1585;;;19813:1;19803:820;;19848:1;19838:11;;19893:5;19882:8;19876:15;19873:26;19870:275;;19963:1;19953:8;19949:16;19943:23;19933:8;19926:41;20037:1;20027:8;20023:16;20017:23;20013:1;20003:8;19999:16;19992:49;20091:1;20087;20077:8;20073:16;20066:27;20118:5;;19870:275;20197:5;20192:1;20182:8;20178:16;20172:23;20169:34;20166:217;;20275:1;20265:8;20261:16;20255:23;20251:1;20241:8;20237:16;20230:49;20329:1;20325;20315:8;20311:16;20304:27;20356:5;;20166:217;20435:5;20430:1;20420:8;20416:16;20410:23;20407:34;20404:143;;20493:1;20489;20479:8;20475:16;20468:27;20520:5;;20404:143;20578:1;20568:11;;20600:5;;19803:820;20653:8;20647:4;20640:22;20692:5;20686:4;20679:19;20740:4;20734;20724:21;20784:1;20778:8;20813;20803:29;;20825:5;;;;20803:29;20869:1;20865;20862;20858:9;20854:17;20849:22;;20919:1;20915;20905:8;20901:16;20898:23;20888:290;;20982:1;20972:8;20968:16;20962:23;21046:9;21041:1;21031:8;21027:16;21017:8;21013:31;21006:50;21090:9;21084:4;21077:23;21151:8;21144:4;21138;21128:21;21121:39;20923:255;20888:290;21231:1;21227;21224;21220:9;21217:16;21206:8;21202:13;21195:39;21261:1;21258;21251:12;21290:1;21280:11;;21308:5;;19742:1585;19746:33;19510:1827;19319:2024;;;;:::o;546:146:38:-;599:7;646:3;:11;;;669:3;:13;;;659:24;;;;;;635:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;625:60;;;;;;618:67;;546:146;;;:::o;12055:2121:29:-;12125:11;12148:16;12167:14;12177:3;12167:9;:14::i;:::-;12148:33;;12270:14;12263:5;12260:25;12257:148;;12317:10;12311:4;12304:24;12386:4;12380;12373:18;12257:148;12428:5;12418:44;;12446:14;12437:23;;12418:44;12500:8;12496:13;12490:20;12513:1;12475:1685;;;12549:8;12543:4;12536:22;12585:1;12575:1156;;12626:8;12620:15;12666:2;12656:151;;12713:5;12703:8;12696:23;12754:1;12744:11;;12780:5;;;12656:151;12838:5;12834:2;12831:13;12828:26;;12847:5;;;12828:26;12905:1;12895:8;12891:16;12885:23;12939:2;12929:159;;12994:5;12990:1;12980:8;12976:16;12969:31;13035:1;13025:11;;13061:5;;;;12929:159;13119:5;13115:2;13112:13;13109:26;;13128:5;;;;13109:26;13186:1;13176:8;13172:16;13166:23;13220:2;13210:159;;13275:5;13271:1;13261:8;13257:16;13250:31;13316:1;13306:11;;13342:5;;;;;13210:159;13400:5;13396:2;13393:13;13390:26;;13409:5;;;;;13390:26;13450:2;13444:4;13437:16;13504:1;13497:4;13491;13481:21;13474:32;13540:2;13534:4;13527:16;13594:1;13587:4;13581;13571:21;13564:32;13630:2;13624:4;13617:16;13684:1;13677:4;13671;13661:21;13654:32;13712:1;13707:6;;12588:1143;;;12575:1156;13761:5;13755:4;13748:19;13809:4;13803;13793:21;13847:1;13841:8;13831:293;;13885:1;13882;13878:9;13873:14;;13933:5;13929:1;13919:8;13915:16;13908:31;13977:1;13974;13970:9;13967:1;13960:20;14043:1;14040;14036:9;14033:1;14029:17;14026:1;14023:24;14012:8;14008:13;14001:47;14079:1;14069:11;;14101:5;;;13831:293;14141:5;12475:1685;12479:33;12243:1927;12055:2121;;;;:::o;2138:118:40:-;2197:4;2248:1;2220:29;;863:66;2227:17;;2220:4;:24;:29;2213:36;;2138:118;;;:::o;5076:238:32:-;5131:12;5145:19;5176:10;5209:1;5189:22;;:5;:8;;;:22;;;:49;;5230:5;:8;;;5189:49;;;5222:4;5189:49;5176:62;;5268:2;:7;;5283:5;:11;;;5296:5;:10;;;5268:39;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5248:59;;;;;;;;5166:148;5076:238;;;:::o;4336:1373:28:-;4448:14;4565:4;4559:11;4573:1;4544:1149;;;4717:16;4755:2;4750:297;;;;5069:2;5064:204;;;;5295:8;;;4750:297;4825:4;4807:16;4803:27;4790:41;4883:2;4878;4873:3;4869:12;4865:21;4859:4;4852:35;4942:16;4929:30;4923:4;4916:44;5016:2;5013:1;5009:10;5006:1;5002:18;4996:4;4989:32;4758:289;4750:297;;5064:204;5150:4;5132:16;5128:27;5115:41;5112:1;5107:50;5101:4;5094:64;5224:4;5206:16;5200:4;5187:42;4710:595;;5335:4;5329;5322:18;5412:4;5406;5400;5394;5391:1;5384:5;5373:44;5367:51;5357:61;;5448:1;5442:4;5435:15;5506:1;5500:4;5493:15;5653:16;5672:5;5650:29;4544:1149;4606:10;4600:4;4593:24;4672:4;4666;4659:18;4544:1149;4548:24;4336:1373;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:47:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:95::-;1061:7;1101:12;1094:5;1090:24;1079:35;;1025:95;;;:::o;1126:105::-;1201:23;1218:5;1201:23;:::i;:::-;1196:3;1189:36;1126:105;;:::o;1237:180::-;1285:77;1282:1;1275:88;1382:4;1379:1;1372:15;1406:4;1403:1;1396:15;1423:118;1509:1;1502:5;1499:12;1489:46;;1515:18;;:::i;:::-;1489:46;1423:118;:::o;1547:137::-;1597:7;1626:5;1615:16;;1632:46;1672:5;1632:46;:::i;:::-;1547:137;;;:::o;1690:::-;1751:9;1784:37;1815:5;1784:37;:::i;:::-;1771:50;;1690:137;;;:::o;1833:143::-;1921:48;1963:5;1921:48;:::i;:::-;1916:3;1909:61;1833:143;;:::o;1982:90::-;2016:7;2059:5;2052:13;2045:21;2034:32;;1982:90;;;:::o;2078:99::-;2149:21;2164:5;2149:21;:::i;:::-;2144:3;2137:34;2078:99;;:::o;2183:98::-;2234:6;2268:5;2262:12;2252:22;;2183:98;;;:::o;2287:158::-;2360:11;2394:6;2389:3;2382:19;2434:4;2429:3;2425:14;2410:29;;2287:158;;;;:::o;2451:139::-;2540:6;2535:3;2530;2524:23;2581:1;2572:6;2567:3;2563:16;2556:27;2451:139;;;:::o;2596:102::-;2637:6;2688:2;2684:7;2679:2;2672:5;2668:14;2664:28;2654:38;;2596:102;;;:::o;2704:353::-;2780:3;2808:38;2840:5;2808:38;:::i;:::-;2862:60;2915:6;2910:3;2862:60;:::i;:::-;2855:67;;2931:65;2989:6;2984:3;2977:4;2970:5;2966:16;2931:65;:::i;:::-;3021:29;3043:6;3021:29;:::i;:::-;3016:3;3012:39;3005:46;;2784:273;2704:353;;;;:::o;3095:967::-;3208:3;3244:4;3239:3;3235:14;3333:4;3326:5;3322:16;3316:23;3352:61;3407:4;3402:3;3398:14;3384:12;3352:61;:::i;:::-;3259:164;3508:4;3501:5;3497:16;3491:23;3527:74;3595:4;3590:3;3586:14;3572:12;3527:74;:::i;:::-;3433:178;3701:4;3694:5;3690:16;3684:23;3720:57;3771:4;3766:3;3762:14;3748:12;3720:57;:::i;:::-;3621:166;3874:4;3867:5;3863:16;3857:23;3927:3;3921:4;3917:14;3910:4;3905:3;3901:14;3894:38;3953:71;4019:4;4005:12;3953:71;:::i;:::-;3945:79;;3797:238;4052:4;4045:11;;3213:849;3095:967;;;;:::o;4068:361::-;4205:4;4243:2;4232:9;4228:18;4220:26;;4292:9;4286:4;4282:20;4278:1;4267:9;4263:17;4256:47;4320:102;4417:4;4408:6;4320:102;:::i;:::-;4312:110;;4068:361;;;;:::o;4435:117::-;4544:1;4541;4534:12;4558:117;4667:1;4664;4657:12;4681:117;4790:1;4787;4780:12;4817:552;4874:8;4884:6;4934:3;4927:4;4919:6;4915:17;4911:27;4901:122;;4942:79;;:::i;:::-;4901:122;5055:6;5042:20;5032:30;;5085:18;5077:6;5074:30;5071:117;;;5107:79;;:::i;:::-;5071:117;5221:4;5213:6;5209:17;5197:29;;5275:3;5267:4;5259:6;5255:17;5245:8;5241:32;5238:41;5235:128;;;5282:79;;:::i;:::-;5235:128;4817:552;;;;;:::o;5375:672::-;5454:6;5462;5470;5519:2;5507:9;5498:7;5494:23;5490:32;5487:119;;;5525:79;;:::i;:::-;5487:119;5645:1;5670:53;5715:7;5706:6;5695:9;5691:22;5670:53;:::i;:::-;5660:63;;5616:117;5800:2;5789:9;5785:18;5772:32;5831:18;5823:6;5820:30;5817:117;;;5853:79;;:::i;:::-;5817:117;5966:64;6022:7;6013:6;6002:9;5998:22;5966:64;:::i;:::-;5948:82;;;;5743:297;5375:672;;;;;:::o;6053:149::-;6089:7;6129:66;6122:5;6118:78;6107:89;;6053:149;;;:::o;6208:115::-;6293:23;6310:5;6293:23;:::i;:::-;6288:3;6281:36;6208:115;;:::o;6329:218::-;6420:4;6458:2;6447:9;6443:18;6435:26;;6471:69;6537:1;6526:9;6522:17;6513:6;6471:69;:::i;:::-;6329:218;;;;:::o;6553:77::-;6590:7;6619:5;6608:16;;6553:77;;;:::o;6636:122::-;6709:24;6727:5;6709:24;:::i;:::-;6702:5;6699:35;6689:63;;6748:1;6745;6738:12;6689:63;6636:122;:::o;6764:139::-;6810:5;6848:6;6835:20;6826:29;;6864:33;6891:5;6864:33;:::i;:::-;6764:139;;;;:::o;6909:329::-;6968:6;7017:2;7005:9;6996:7;6992:23;6988:32;6985:119;;;7023:79;;:::i;:::-;6985:119;7143:1;7168:53;7213:7;7204:6;7193:9;7189:22;7168:53;:::i;:::-;7158:63;;7114:117;6909:329;;;;:::o;7244:118::-;7331:24;7349:5;7331:24;:::i;:::-;7326:3;7319:37;7244:118;;:::o;7368:222::-;7461:4;7499:2;7488:9;7484:18;7476:26;;7512:71;7580:1;7569:9;7565:17;7556:6;7512:71;:::i;:::-;7368:222;;;;:::o;7596:149::-;7632:7;7672:66;7665:5;7661:78;7650:89;;7596:149;;;:::o;7751:115::-;7836:23;7853:5;7836:23;:::i;:::-;7831:3;7824:36;7751:115;;:::o;7872:99::-;7924:6;7958:5;7952:12;7942:22;;7872:99;;;:::o;7977:169::-;8061:11;8095:6;8090:3;8083:19;8135:4;8130:3;8126:14;8111:29;;7977:169;;;;:::o;8152:377::-;8240:3;8268:39;8301:5;8268:39;:::i;:::-;8323:71;8387:6;8382:3;8323:71;:::i;:::-;8316:78;;8403:65;8461:6;8456:3;8449:4;8442:5;8438:16;8403:65;:::i;:::-;8493:29;8515:6;8493:29;:::i;:::-;8488:3;8484:39;8477:46;;8244:285;8152:377;;;;:::o;8535:118::-;8622:24;8640:5;8622:24;:::i;:::-;8617:3;8610:37;8535:118;;:::o;8659:126::-;8696:7;8736:42;8729:5;8725:54;8714:65;;8659:126;;;:::o;8791:96::-;8828:7;8857:24;8875:5;8857:24;:::i;:::-;8846:35;;8791:96;;;:::o;8893:118::-;8980:24;8998:5;8980:24;:::i;:::-;8975:3;8968:37;8893:118;;:::o;9017:114::-;9084:6;9118:5;9112:12;9102:22;;9017:114;;;:::o;9137:184::-;9236:11;9270:6;9265:3;9258:19;9310:4;9305:3;9301:14;9286:29;;9137:184;;;;:::o;9327:132::-;9394:4;9417:3;9409:11;;9447:4;9442:3;9438:14;9430:22;;9327:132;;;:::o;9465:108::-;9542:24;9560:5;9542:24;:::i;:::-;9537:3;9530:37;9465:108;;:::o;9579:179::-;9648:10;9669:46;9711:3;9703:6;9669:46;:::i;:::-;9747:4;9742:3;9738:14;9724:28;;9579:179;;;;:::o;9764:113::-;9834:4;9866;9861:3;9857:14;9849:22;;9764:113;;;:::o;9913:732::-;10032:3;10061:54;10109:5;10061:54;:::i;:::-;10131:86;10210:6;10205:3;10131:86;:::i;:::-;10124:93;;10241:56;10291:5;10241:56;:::i;:::-;10320:7;10351:1;10336:284;10361:6;10358:1;10355:13;10336:284;;;10437:6;10431:13;10464:63;10523:3;10508:13;10464:63;:::i;:::-;10457:70;;10550:60;10603:6;10550:60;:::i;:::-;10540:70;;10396:224;10383:1;10380;10376:9;10371:14;;10336:284;;;10340:14;10636:3;10629:10;;10037:608;;;9913:732;;;;:::o;10651:1215::-;11000:4;11038:3;11027:9;11023:19;11015:27;;11052:69;11118:1;11107:9;11103:17;11094:6;11052:69;:::i;:::-;11168:9;11162:4;11158:20;11153:2;11142:9;11138:18;11131:48;11196:78;11269:4;11260:6;11196:78;:::i;:::-;11188:86;;11321:9;11315:4;11311:20;11306:2;11295:9;11291:18;11284:48;11349:78;11422:4;11413:6;11349:78;:::i;:::-;11341:86;;11437:72;11505:2;11494:9;11490:18;11481:6;11437:72;:::i;:::-;11519:73;11587:3;11576:9;11572:19;11563:6;11519:73;:::i;:::-;11602;11670:3;11659:9;11655:19;11646:6;11602:73;:::i;:::-;11723:9;11717:4;11713:20;11707:3;11696:9;11692:19;11685:49;11751:108;11854:4;11845:6;11751:108;:::i;:::-;11743:116;;10651:1215;;;;;;;;;;:::o;11872:117::-;11981:1;11978;11971:12;11995:180;12043:77;12040:1;12033:88;12140:4;12137:1;12130:15;12164:4;12161:1;12154:15;12181:281;12264:27;12286:4;12264:27;:::i;:::-;12256:6;12252:40;12394:6;12382:10;12379:22;12358:18;12346:10;12343:34;12340:62;12337:88;;;12405:18;;:::i;:::-;12337:88;12445:10;12441:2;12434:22;12224:238;12181:281;;:::o;12468:129::-;12502:6;12529:20;;:::i;:::-;12519:30;;12558:33;12586:4;12578:6;12558:33;:::i;:::-;12468:129;;;:::o;12603:117::-;12712:1;12709;12702:12;12726:120;12798:23;12815:5;12798:23;:::i;:::-;12791:5;12788:34;12778:62;;12836:1;12833;12826:12;12778:62;12726:120;:::o;12852:137::-;12897:5;12935:6;12922:20;12913:29;;12951:32;12977:5;12951:32;:::i;:::-;12852:137;;;;:::o;12995:112::-;13081:1;13074:5;13071:12;13061:40;;13097:1;13094;13087:12;13061:40;12995:112;:::o;13113:165::-;13172:5;13210:6;13197:20;13188:29;;13226:46;13266:5;13226:46;:::i;:::-;13113:165;;;;:::o;13284:116::-;13354:21;13369:5;13354:21;:::i;:::-;13347:5;13344:32;13334:60;;13390:1;13387;13380:12;13334:60;13284:116;:::o;13406:133::-;13449:5;13487:6;13474:20;13465:29;;13503:30;13527:5;13503:30;:::i;:::-;13406:133;;;;:::o;13545:117::-;13654:1;13651;13644:12;13668:307;13729:4;13819:18;13811:6;13808:30;13805:56;;;13841:18;;:::i;:::-;13805:56;13879:29;13901:6;13879:29;:::i;:::-;13871:37;;13963:4;13957;13953:15;13945:23;;13668:307;;;:::o;13981:148::-;14079:6;14074:3;14069;14056:30;14120:1;14111:6;14106:3;14102:16;14095:27;13981:148;;;:::o;14135:423::-;14212:5;14237:65;14253:48;14294:6;14253:48;:::i;:::-;14237:65;:::i;:::-;14228:74;;14325:6;14318:5;14311:21;14363:4;14356:5;14352:16;14401:3;14392:6;14387:3;14383:16;14380:25;14377:112;;;14408:79;;:::i;:::-;14377:112;14498:54;14545:6;14540:3;14535;14498:54;:::i;:::-;14218:340;14135:423;;;;;:::o;14577:338::-;14632:5;14681:3;14674:4;14666:6;14662:17;14658:27;14648:122;;14689:79;;:::i;:::-;14648:122;14806:6;14793:20;14831:78;14905:3;14897:6;14890:4;14882:6;14878:17;14831:78;:::i;:::-;14822:87;;14638:277;14577:338;;;;:::o;14939:1089::-;15010:5;15054:4;15042:9;15037:3;15033:19;15029:30;15026:117;;;15062:79;;:::i;:::-;15026:117;15161:21;15177:4;15161:21;:::i;:::-;15152:30;;15243:1;15283:48;15327:3;15318:6;15307:9;15303:22;15283:48;:::i;:::-;15276:4;15269:5;15265:16;15258:74;15192:151;15405:2;15446:62;15504:3;15495:6;15484:9;15480:22;15446:62;:::i;:::-;15439:4;15432:5;15428:16;15421:88;15353:167;15587:2;15628:46;15670:3;15661:6;15650:9;15646:22;15628:46;:::i;:::-;15621:4;15614:5;15610:16;15603:72;15530:156;15778:2;15767:9;15763:18;15750:32;15809:18;15801:6;15798:30;15795:117;;;15831:79;;:::i;:::-;15795:117;15951:58;16005:3;15996:6;15985:9;15981:22;15951:58;:::i;:::-;15944:4;15937:5;15933:16;15926:84;15696:325;14939:1089;;;;:::o;16034:533::-;16115:6;16164:2;16152:9;16143:7;16139:23;16135:32;16132:119;;;16170:79;;:::i;:::-;16132:119;16318:1;16307:9;16303:17;16290:31;16348:18;16340:6;16337:30;16334:117;;;16370:79;;:::i;:::-;16334:117;16475:75;16542:7;16533:6;16522:9;16518:22;16475:75;:::i;:::-;16465:85;;16261:299;16034:533;;;;:::o;16573:109::-;16654:21;16669:5;16654:21;:::i;:::-;16649:3;16642:34;16573:109;;:::o;16688:210::-;16775:4;16813:2;16802:9;16798:18;16790:26;;16826:65;16888:1;16877:9;16873:17;16864:6;16826:65;:::i;:::-;16688:210;;;;:::o;16904:222::-;16997:4;17035:2;17024:9;17020:18;17012:26;;17048:71;17116:1;17105:9;17101:17;17092:6;17048:71;:::i;:::-;16904:222;;;;:::o;17132:335::-;17233:4;17323:18;17315:6;17312:30;17309:56;;;17345:18;;:::i;:::-;17309:56;17395:4;17387:6;17383:17;17375:25;;17455:4;17449;17445:15;17437:23;;17132:335;;;:::o;17473:122::-;17546:24;17564:5;17546:24;:::i;:::-;17539:5;17536:35;17526:63;;17585:1;17582;17575:12;17526:63;17473:122;:::o;17601:139::-;17647:5;17685:6;17672:20;17663:29;;17701:33;17728:5;17701:33;:::i;:::-;17601:139;;;;:::o;17766:902::-;17839:5;17883:4;17871:9;17866:3;17862:19;17858:30;17855:117;;;17891:79;;:::i;:::-;17855:117;17990:21;18006:4;17990:21;:::i;:::-;17981:30;;18068:1;18108:49;18153:3;18144:6;18133:9;18129:22;18108:49;:::i;:::-;18101:4;18094:5;18090:16;18083:75;18021:148;18229:2;18270:49;18315:3;18306:6;18295:9;18291:22;18270:49;:::i;:::-;18263:4;18256:5;18252:16;18245:75;18179:152;18418:2;18407:9;18403:18;18390:32;18449:18;18441:6;18438:30;18435:117;;;18471:79;;:::i;:::-;18435:117;18591:58;18645:3;18636:6;18625:9;18621:22;18591:58;:::i;:::-;18584:4;18577:5;18573:16;18566:84;18341:320;17766:902;;;;:::o;18696:987::-;18816:5;18841:105;18857:88;18938:6;18857:88;:::i;:::-;18841:105;:::i;:::-;18832:114;;18966:5;18995:6;18988:5;18981:21;19029:4;19022:5;19018:16;19011:23;;19082:4;19074:6;19070:17;19062:6;19058:30;19111:3;19103:6;19100:15;19097:122;;;19130:79;;:::i;:::-;19097:122;19245:6;19228:449;19262:6;19257:3;19254:15;19228:449;;;19351:3;19338:17;19387:18;19374:11;19371:35;19368:122;;;19409:79;;:::i;:::-;19368:122;19533:11;19525:6;19521:24;19571:61;19628:3;19616:10;19571:61;:::i;:::-;19566:3;19559:74;19662:4;19657:3;19653:14;19646:21;;19304:373;;19288:4;19283:3;19279:14;19272:21;;19228:449;;;19232:21;18822:861;;18696:987;;;;;:::o;19711:418::-;19806:5;19855:3;19848:4;19840:6;19836:17;19832:27;19822:122;;19863:79;;:::i;:::-;19822:122;19980:6;19967:20;20005:118;20119:3;20111:6;20104:4;20096:6;20092:17;20005:118;:::i;:::-;19996:127;;19812:317;19711:418;;;;:::o;20135:587::-;20243:6;20292:2;20280:9;20271:7;20267:23;20263:32;20260:119;;;20298:79;;:::i;:::-;20260:119;20446:1;20435:9;20431:17;20418:31;20476:18;20468:6;20465:30;20462:117;;;20498:79;;:::i;:::-;20462:117;20603:102;20697:7;20688:6;20677:9;20673:22;20603:102;:::i;:::-;20593:112;;20389:326;20135:587;;;;:::o;20728:910::-;20854:6;20862;20911:2;20899:9;20890:7;20886:23;20882:32;20879:119;;;20917:79;;:::i;:::-;20879:119;21065:1;21054:9;21050:17;21037:31;21095:18;21087:6;21084:30;21081:117;;;21117:79;;:::i;:::-;21081:117;21222:102;21316:7;21307:6;21296:9;21292:22;21222:102;:::i;:::-;21212:112;;21008:326;21401:2;21390:9;21386:18;21373:32;21432:18;21424:6;21421:30;21418:117;;;21454:79;;:::i;:::-;21418:117;21559:62;21613:7;21604:6;21593:9;21589:22;21559:62;:::i;:::-;21549:72;;21344:287;20728:910;;;;;:::o;21644:664::-;21849:4;21887:3;21876:9;21872:19;21864:27;;21901:71;21969:1;21958:9;21954:17;21945:6;21901:71;:::i;:::-;21982:72;22050:2;22039:9;22035:18;22026:6;21982:72;:::i;:::-;22064;22132:2;22121:9;22117:18;22108:6;22064:72;:::i;:::-;22146;22214:2;22203:9;22199:18;22190:6;22146:72;:::i;:::-;22228:73;22296:3;22285:9;22281:19;22272:6;22228:73;:::i;:::-;21644:664;;;;;;;;:::o;22314:180::-;22362:77;22359:1;22352:88;22459:4;22456:1;22449:15;22483:4;22480:1;22473:15;22500:320;22544:6;22581:1;22575:4;22571:12;22561:22;;22628:1;22622:4;22618:12;22649:18;22639:81;;22705:4;22697:6;22693:17;22683:27;;22639:81;22767:2;22759:6;22756:14;22736:18;22733:38;22730:84;;22786:18;;:::i;:::-;22730:84;22551:269;22500:320;;;:::o;22826:141::-;22882:5;22913:6;22907:13;22898:22;;22929:32;22955:5;22929:32;:::i;:::-;22826:141;;;;:::o;22973:169::-;23043:5;23074:6;23068:13;23059:22;;23090:46;23130:5;23090:46;:::i;:::-;22973:169;;;;:::o;23148:137::-;23202:5;23233:6;23227:13;23218:22;;23249:30;23273:5;23249:30;:::i;:::-;23148:137;;;;:::o;23291:432::-;23379:5;23404:65;23420:48;23461:6;23420:48;:::i;:::-;23404:65;:::i;:::-;23395:74;;23492:6;23485:5;23478:21;23530:4;23523:5;23519:16;23568:3;23559:6;23554:3;23550:16;23547:25;23544:112;;;23575:79;;:::i;:::-;23544:112;23665:52;23710:6;23705:3;23700;23665:52;:::i;:::-;23385:338;23291:432;;;;;:::o;23742:353::-;23808:5;23857:3;23850:4;23842:6;23838:17;23834:27;23824:122;;23865:79;;:::i;:::-;23824:122;23975:6;23969:13;24000:89;24085:3;24077:6;24070:4;24062:6;24058:17;24000:89;:::i;:::-;23991:98;;23814:281;23742:353;;;;:::o;24119:1137::-;24201:5;24245:4;24233:9;24228:3;24224:19;24220:30;24217:117;;;24253:79;;:::i;:::-;24217:117;24352:21;24368:4;24352:21;:::i;:::-;24343:30;;24434:1;24474:59;24529:3;24520:6;24509:9;24505:22;24474:59;:::i;:::-;24467:4;24460:5;24456:16;24449:85;24383:162;24607:2;24648:73;24717:3;24708:6;24697:9;24693:22;24648:73;:::i;:::-;24641:4;24634:5;24630:16;24623:99;24555:178;24800:2;24841:57;24894:3;24885:6;24874:9;24870:22;24841:57;:::i;:::-;24834:4;24827:5;24823:16;24816:83;24743:167;24995:2;24984:9;24980:18;24974:25;25026:18;25018:6;25015:30;25012:117;;;25048:79;;:::i;:::-;25012:117;25168:69;25233:3;25224:6;25213:9;25209:22;25168:69;:::i;:::-;25161:4;25154:5;25150:16;25143:95;24920:329;24119:1137;;;;:::o;25262:548::-;25354:6;25403:2;25391:9;25382:7;25378:23;25374:32;25371:119;;;25409:79;;:::i;:::-;25371:119;25550:1;25539:9;25535:17;25529:24;25580:18;25572:6;25569:30;25566:117;;;25602:79;;:::i;:::-;25566:117;25707:86;25785:7;25776:6;25765:9;25761:22;25707:86;:::i;:::-;25697:96;;25500:303;25262:548;;;;:::o;25816:332::-;25937:4;25975:2;25964:9;25960:18;25952:26;;25988:71;26056:1;26045:9;26041:17;26032:6;25988:71;:::i;:::-;26069:72;26137:2;26126:9;26122:18;26113:6;26069:72;:::i;:::-;25816:332;;;;;:::o;26154:148::-;26256:11;26293:3;26278:18;;26154:148;;;;:::o;26308:214::-;26448:66;26444:1;26436:6;26432:14;26425:90;26308:214;:::o;26528:400::-;26688:3;26709:84;26791:1;26786:3;26709:84;:::i;:::-;26702:91;;26802:93;26891:3;26802:93;:::i;:::-;26920:1;26915:3;26911:11;26904:18;;26528:400;;;:::o;26934:79::-;26973:7;27002:5;26991:16;;26934:79;;;:::o;27019:157::-;27124:45;27144:24;27162:5;27144:24;:::i;:::-;27124:45;:::i;:::-;27119:3;27112:58;27019:157;;:::o;27182:663::-;27423:3;27445:148;27589:3;27445:148;:::i;:::-;27438:155;;27603:75;27674:3;27665:6;27603:75;:::i;:::-;27703:2;27698:3;27694:12;27687:19;;27716:75;27787:3;27778:6;27716:75;:::i;:::-;27816:2;27811:3;27807:12;27800:19;;27836:3;27829:10;;27182:663;;;;;:::o;27851:140::-;27899:4;27922:3;27914:11;;27945:3;27942:1;27935:14;27979:4;27976:1;27966:18;27958:26;;27851:140;;;:::o;27997:93::-;28034:6;28081:2;28076;28069:5;28065:14;28061:23;28051:33;;27997:93;;;:::o;28096:107::-;28140:8;28190:5;28184:4;28180:16;28159:37;;28096:107;;;;:::o;28209:393::-;28278:6;28328:1;28316:10;28312:18;28351:97;28381:66;28370:9;28351:97;:::i;:::-;28469:39;28499:8;28488:9;28469:39;:::i;:::-;28457:51;;28541:4;28537:9;28530:5;28526:21;28517:30;;28590:4;28580:8;28576:19;28569:5;28566:30;28556:40;;28285:317;;28209:393;;;;;:::o;28608:60::-;28636:3;28657:5;28650:12;;28608:60;;;:::o;28674:142::-;28724:9;28757:53;28775:34;28784:24;28802:5;28784:24;:::i;:::-;28775:34;:::i;:::-;28757:53;:::i;:::-;28744:66;;28674:142;;;:::o;28822:75::-;28865:3;28886:5;28879:12;;28822:75;;;:::o;28903:269::-;29013:39;29044:7;29013:39;:::i;:::-;29074:91;29123:41;29147:16;29123:41;:::i;:::-;29115:6;29108:4;29102:11;29074:91;:::i;:::-;29068:4;29061:105;28979:193;28903:269;;;:::o;29178:73::-;29223:3;29178:73;:::o;29257:189::-;29334:32;;:::i;:::-;29375:65;29433:6;29425;29419:4;29375:65;:::i;:::-;29310:136;29257:189;;:::o;29452:186::-;29512:120;29529:3;29522:5;29519:14;29512:120;;;29583:39;29620:1;29613:5;29583:39;:::i;:::-;29556:1;29549:5;29545:13;29536:22;;29512:120;;;29452:186;;:::o;29644:541::-;29744:2;29739:3;29736:11;29733:445;;;29778:37;29809:5;29778:37;:::i;:::-;29861:29;29879:10;29861:29;:::i;:::-;29851:8;29847:44;30044:2;30032:10;30029:18;30026:49;;;30065:8;30050:23;;30026:49;30088:80;30144:22;30162:3;30144:22;:::i;:::-;30134:8;30130:37;30117:11;30088:80;:::i;:::-;29748:430;;29733:445;29644:541;;;:::o;30191:117::-;30245:8;30295:5;30289:4;30285:16;30264:37;;30191:117;;;;:::o;30314:169::-;30358:6;30391:51;30439:1;30435:6;30427:5;30424:1;30420:13;30391:51;:::i;:::-;30387:56;30472:4;30466;30462:15;30452:25;;30365:118;30314:169;;;;:::o;30488:295::-;30564:4;30710:29;30735:3;30729:4;30710:29;:::i;:::-;30702:37;;30772:3;30769:1;30765:11;30759:4;30756:21;30748:29;;30488:295;;;;:::o;30788:1390::-;30903:36;30935:3;30903:36;:::i;:::-;31004:18;30996:6;30993:30;30990:56;;;31026:18;;:::i;:::-;30990:56;31070:38;31102:4;31096:11;31070:38;:::i;:::-;31155:66;31214:6;31206;31200:4;31155:66;:::i;:::-;31248:1;31272:4;31259:17;;31304:2;31296:6;31293:14;31321:1;31316:617;;;;31977:1;31994:6;31991:77;;;32043:9;32038:3;32034:19;32028:26;32019:35;;31991:77;32094:67;32154:6;32147:5;32094:67;:::i;:::-;32088:4;32081:81;31950:222;31286:886;;31316:617;31368:4;31364:9;31356:6;31352:22;31402:36;31433:4;31402:36;:::i;:::-;31460:1;31474:208;31488:7;31485:1;31482:14;31474:208;;;31567:9;31562:3;31558:19;31552:26;31544:6;31537:42;31618:1;31610:6;31606:14;31596:24;;31665:2;31654:9;31650:18;31637:31;;31511:4;31508:1;31504:12;31499:17;;31474:208;;;31710:6;31701:7;31698:19;31695:179;;;31768:9;31763:3;31759:19;31753:26;31811:48;31853:4;31845:6;31841:17;31830:9;31811:48;:::i;:::-;31803:6;31796:64;31718:156;31695:179;31920:1;31916;31908:6;31904:14;31900:22;31894:4;31887:36;31323:610;;;31286:886;;30878:1300;;;30788:1390;;:::o;32184:180::-;32232:77;32229:1;32222:88;32329:4;32326:1;32319:15;32353:4;32350:1;32343:15;32370:168;32453:11;32487:6;32482:3;32475:19;32527:4;32522:3;32518:14;32503:29;;32370:168;;;;:::o;32544:373::-;32630:3;32658:38;32690:5;32658:38;:::i;:::-;32712:70;32775:6;32770:3;32712:70;:::i;:::-;32705:77;;32791:65;32849:6;32844:3;32837:4;32830:5;32826:16;32791:65;:::i;:::-;32881:29;32903:6;32881:29;:::i;:::-;32876:3;32872:39;32865:46;;32634:283;32544:373;;;;:::o;32923:309::-;33034:4;33072:2;33061:9;33057:18;33049:26;;33121:9;33115:4;33111:20;33107:1;33096:9;33092:17;33085:47;33149:76;33220:4;33211:6;33149:76;:::i;:::-;33141:84;;32923:309;;;;:::o;33238:165::-;33378:17;33374:1;33366:6;33362:14;33355:41;33238:165;:::o;33409:366::-;33551:3;33572:67;33636:2;33631:3;33572:67;:::i;:::-;33565:74;;33648:93;33737:3;33648:93;:::i;:::-;33766:2;33761:3;33757:12;33750:19;;33409:366;;;:::o;33781:419::-;33947:4;33985:2;33974:9;33970:18;33962:26;;34034:9;34028:4;34024:20;34020:1;34009:9;34005:17;33998:47;34062:131;34188:4;34062:131;:::i;:::-;34054:139;;33781:419;;;:::o;34206:153::-;34304:48;34346:5;34304:48;:::i;:::-;34299:3;34292:61;34206:153;;:::o;34365:354::-;34497:4;34535:2;34524:9;34520:18;34512:26;;34548:82;34627:1;34616:9;34612:17;34603:6;34548:82;:::i;:::-;34640:72;34708:2;34697:9;34693:18;34684:6;34640:72;:::i;:::-;34365:354;;;;;:::o;34725:147::-;34826:11;34863:3;34848:18;;34725:147;;;;:::o;34878:386::-;34982:3;35010:38;35042:5;35010:38;:::i;:::-;35064:88;35145:6;35140:3;35064:88;:::i;:::-;35057:95;;35161:65;35219:6;35214:3;35207:4;35200:5;35196:16;35161:65;:::i;:::-;35251:6;35246:3;35242:16;35235:23;;34986:278;34878:386;;;;:::o;35270:271::-;35400:3;35422:93;35511:3;35502:6;35422:93;:::i;:::-;35415:100;;35532:3;35525:10;;35270:271;;;;:::o","linkReferences":{},"immutableReferences":{"41174":[{"start":1326,"length":32}],"41176":[{"start":1359,"length":32}]}},"methodIdentifiers":{"authorize((uint40,uint8,bool,bytes))":"cebfe336","domainSeparator()":"f698da25","eip712Domain()":"84b0196e","execute(bytes32,bytes)":"e9ae5c53","getKey(bytes32)":"12aaac70","hashTypedData(bytes32)":"6575f6aa","isValidSignature(bytes32,bytes)":"1626ba7e","keyAt(uint256)":"4223b5c2","keyCount()":"fac750e0","revoke(bytes32)":"b75c7dc6","supportsExecutionMode(bytes32)":"d03c7914"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.26+commit.8a97fa7a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"CallFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IndexOutOfBounds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"KeyDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedExecutionMode\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint40\",\"name\":\"expiry\",\"type\":\"uint40\"},{\"internalType\":\"enum KeyType\",\"name\":\"keyType\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSuperAdmin\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"publicKey\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"struct Key\",\"name\":\"key\",\"type\":\"tuple\"}],\"name\":\"Authorized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EIP712DomainChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"Revoked\",\"type\":\"event\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint40\",\"name\":\"expiry\",\"type\":\"uint40\"},{\"internalType\":\"enum KeyType\",\"name\":\"keyType\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSuperAdmin\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"publicKey\",\"type\":\"bytes\"}],\"internalType\":\"struct Key\",\"name\":\"key\",\"type\":\"tuple\"}],\"name\":\"authorize\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"domainSeparator\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eip712Domain\",\"outputs\":[{\"internalType\":\"bytes1\",\"name\":\"fields\",\"type\":\"bytes1\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifyingContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"extensions\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"mode\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"executionData\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"getKey\",\"outputs\":[{\"components\":[{\"internalType\":\"uint40\",\"name\":\"expiry\",\"type\":\"uint40\"},{\"internalType\":\"enum KeyType\",\"name\":\"keyType\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSuperAdmin\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"publicKey\",\"type\":\"bytes\"}],\"internalType\":\"struct Key\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"}],\"name\":\"hashTypedData\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"isValidSignature\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"result\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"i\",\"type\":\"uint256\"}],\"name\":\"keyAt\",\"outputs\":[{\"components\":[{\"internalType\":\"uint40\",\"name\":\"expiry\",\"type\":\"uint40\"},{\"internalType\":\"enum KeyType\",\"name\":\"keyType\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSuperAdmin\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"publicKey\",\"type\":\"bytes\"}],\"internalType\":\"struct Key\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"keyCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"revoke\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"mode\",\"type\":\"bytes32\"}],\"name\":\"supportsExecutionMode\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"IndexOutOfBounds()\":[{\"details\":\"The index must be less than the length.\"}],\"KeyDoesNotExist()\":[{\"details\":\"The key does not exist.\"}]},\"events\":{\"Authorized(bytes32,(uint40,uint8,bool,bytes))\":{\"details\":\"Emitted when a key is authorized.\"},\"EIP712DomainChanged()\":{\"details\":\"MAY be emitted to signal that the domain could have changed.\"},\"Revoked(bytes32)\":{\"details\":\"Emitted when a key is revoked.\"}},\"kind\":\"dev\",\"methods\":{\"authorize((uint40,uint8,bool,bytes))\":{\"details\":\"Authorizes the `key`.\"},\"domainSeparator()\":{\"returns\":{\"_0\":\"The 32 bytes domain separator result.\"}},\"eip712Domain()\":{\"details\":\"Follows ERC-5267 (see https://eips.ethereum.org/EIPS/eip-5267).\",\"returns\":{\"chainId\":\"The value of the `EIP712Domain.chainId` field.\",\"extensions\":\"The list of EIP numbers, that extends EIP-712 with new domain fields.\",\"fields\":\"The bitmap of used fields.\",\"name\":\"The value of the `EIP712Domain.name` field.\",\"salt\":\"The value of the `EIP712Domain.salt` field.\",\"verifyingContract\":\"The value of the `EIP712Domain.verifyingContract` field.\",\"version\":\"The value of the `EIP712Domain.version` field.\"}},\"getKey(bytes32)\":{\"details\":\"Returns the key corresponding to the `keyHash`. Reverts if the key does not exist.\"},\"hashTypedData(bytes32)\":{\"returns\":{\"_0\":\"The corresponding replay-safe hash.\"}},\"isValidSignature(bytes32,bytes)\":{\"details\":\"Hashes the given `hash` to be replay safe and validates the signature against it.\",\"returns\":{\"result\":\"`0x1626ba7e` if validation succeeded, else `0xffffffff`.\"}},\"keyAt(uint256)\":{\"details\":\"Returns the key at the `i`-th position in the key list.\"},\"keyCount()\":{\"details\":\"Returns the number of authorized keys.\"},\"revoke(bytes32)\":{\"details\":\"Revokes the key with the `keyHash`.\"},\"supportsExecutionMode(bytes32)\":{\"details\":\"Provided for execution mode support detection.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"domainSeparator()\":{\"notice\":\"Returns the `domainSeparator` used to create EIP-712 compliant hashes.\"},\"eip712Domain()\":{\"notice\":\"Returns information about the `EIP712Domain` used to create EIP-712 compliant hashes.\"},\"hashTypedData(bytes32)\":{\"notice\":\"Public getter for `_hashTypedData()` to produce a replay-safe hash from the given `hash`.\"},\"isValidSignature(bytes32,bytes)\":{\"notice\":\"Validates the `signature` against the given `hash`.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/MinimalDelegation.sol\":\"MinimalDelegation\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"lib/account-abstraction/contracts/interfaces/IAccount.sol\":{\"keccak256\":\"0x38710bec0cb20ff4ceef46a80475b5bdabc27b7efd2687fd473db68332f61b78\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://dea7a723e1ef852e8764e69914a345d2e8bc5e13facfc9d5c29d791cb4ab0020\",\"dweb:/ipfs/QmU8dYgyF4DBJXFqjwLAtnE3q8q259ChfoEk9a6wyhHzEP\"]},\"lib/account-abstraction/contracts/interfaces/PackedUserOperation.sol\":{\"keccak256\":\"0x1129b46381db68eddbc5cb49e50664667b66b03c480453858e7b25eabe444359\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://499a948aba60480dba6e25c763b8d918f1c246eb7a3302e04f493e080f3295be\",\"dweb:/ipfs/QmeRhhswf4NACcBKam2PyjpTP2ddSm648kah5kkQJsvwz3\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC1271.sol\":{\"keccak256\":\"0x4aaaf1c0737dd16e81f0d2b9833c549747a5ede6873bf1444bc72aa572d03e98\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://eada27d7668eebaea16c3b890aa1b38ffc53965292e26c96f7c44834623f4710\",\"dweb:/ipfs/QmVSWuLtxyCqNbLyY89ptxkvsk4CLLKDQYigEne5Qj8k1L\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC5267.sol\":{\"keccak256\":\"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a\",\"dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP\"]},\"lib/solady/src/utils/ECDSA.sol\":{\"keccak256\":\"0xcf0e0d6f9178f2a077cccbfe1e4cbdbf7e3380a9074191cdb99756c958646053\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c8889c160364eb3985a10b8a7a8de88357a02adaf1ac100177ccbfda9f3797b7\",\"dweb:/ipfs/QmW8w6QDxWkg44duxBAQ3gpSxGERTaPk4dvUkWAX8fQXpm\"]},\"lib/solady/src/utils/EnumerableSetLib.sol\":{\"keccak256\":\"0x9cb48b991323228021af1044398e837a6f073839af296c1dd4b0ace80820279b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://307e592c572f2138f725936da9e1e4564c14b5d3ce07202b1425f807e881a07f\",\"dweb:/ipfs/QmWds35sTi62ZjUkG3ZmAZ1PBCG3R4xw9utKJKb37NxGtp\"]},\"src/EIP712.sol\":{\"keccak256\":\"0x052e53a7bd611db54a134b19c98c983146ff6ff6266f567f8ed1e621c735d173\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://45815f4a4b5471e19c4f9c7113f594096c4bac1304172fa13fef7d9f5eb17525\",\"dweb:/ipfs/QmRgv4ZSsN6MMUZW5pVJujMgD3db7dacsXpD1PkpaRGD1j\"]},\"src/ERC1271.sol\":{\"keccak256\":\"0xc8b137f2028e5fd10556344f467a85620b64553a16408b1fd799ded00fbd62f7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://89fc2e026be2b27eaf80be2b123cf19ef08e5c0129feef38a4983aa167612098\",\"dweb:/ipfs/QmdnjQo8EZCyssvy38V4MW7xpRibPfxJiWtM7Q511smnLG\"]},\"src/MinimalDelegation.sol\":{\"keccak256\":\"0x3d4926aa470ad48e92bea0f74083c0626db384f5552205d0ad91b33b5243cb8e\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://027bc4a3c0845ac5f4a447d353567e70e7b58ba4c50d2c29d260e44fffe28598\",\"dweb:/ipfs/QmZg8wCjBuQj2AvkubDzLUbZoiSFgS6U4ohLQxc1ErZcdw\"]},\"src/interfaces/IEIP712.sol\":{\"keccak256\":\"0x5d6618485d24ae3356d7b61a6ebce0d180948a961425f7e3f2fbb430e5a362cd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://16efbfffd5ec264242ffa91c79c44959a7c019f26ac243dd59346b3e50054f41\",\"dweb:/ipfs/Qmax2JBi7Htfxge5skubDCY23THpz3Jvc5ZBixqkjpGz6L\"]},\"src/interfaces/IERC1271.sol\":{\"keccak256\":\"0x130e2daa995138fb6dd65ca79014e07c25d0a404616ea4963059493921697099\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5eb8d7553acb0d017fefca58eaef997786faabacc9391907a4f314300ae2cb57\",\"dweb:/ipfs/QmXQ9ASxMVcaUqRq4UVKyaHcbqpj6MZTbpzNt8GUTvhpR7\"]},\"src/interfaces/IERC7821.sol\":{\"keccak256\":\"0x031323642d7924474c0377f3eda137dcd476304947969258a2d71f26c85b7cf5\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://cf98f3718f3a69131e33ff71a021e2b07aa66bd5b4a8b12a499738db5c58b71b\",\"dweb:/ipfs/QmXCrpR2h4mLUqYnzysGPafP2y9amdCLcJ1xyPH71Tb5Nu\"]},\"src/interfaces/IKeyManagement.sol\":{\"keccak256\":\"0x26eb88cf225e0f65e04f7ac42ebe86d9277d37dbc18930f4294cf6fb5881b767\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://4fa1bc6c9f11ef53f8638b64c907db00dc6dd84c21fd0ee2fe12ee76d128c6a4\",\"dweb:/ipfs/QmV6ViCyeYEmYNmLo4F9d5nBWbFT9vvjjErLihHi6ipbGX\"]},\"src/interfaces/IMinimalDelegation.sol\":{\"keccak256\":\"0x34325cf371aca80617759cabce8ac9cb841c914149cbf5f99e04b89aecb379c0\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://a48fd56504d0f54db22cc6083898f7071ee3211be10f35722a76f7f436aa50cc\",\"dweb:/ipfs/QmcgSe7nKrjX2uU4AUGy5FASJZDBdcoeNs1fEYqNcT5tz6\"]},\"src/libraries/KeyLib.sol\":{\"keccak256\":\"0x00e8b163fe751c79606dcc527f8837e47b6a0ecefa5e1636ae994632f380b2f6\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://f811d76b2abb8deb5c5bf80416a0f770fd83d16176d208f11ad1bfdb2a347233\",\"dweb:/ipfs/Qmf8NTjjaCKpbi5QBLuG4tARYa8rfcfAzwxmxkvWsRK9Lz\"]},\"src/libraries/MinimalDelegationStorage.sol\":{\"keccak256\":\"0x2bc40ae3bf8081ae61c3210479238b9644edf9b11e34b803a53ab2224761535b\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://9a457d84ef4016313fc64a00634a36eab961a3a4c3f943213a875113ee372ca4\",\"dweb:/ipfs/QmagB7YwYuLxD9SN5mULg9SiJzJ6qmGExYvSAhnToB2xtX\"]},\"src/libraries/ModeDecoder.sol\":{\"keccak256\":\"0x9af8e3e1f4b592921ebd5f70fe40119ec93f92427515921d0a616a3dbe9700fb\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://b840259a56db48eda30c3cb4ade297b65d742a6ac2b1e38670fe5e04e8347567\",\"dweb:/ipfs/QmdVB3mL7WvEj3ySxrBrvR9kfHBY4RjEnYzfqSviVkUjuU\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.26+commit.8a97fa7a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes","name":"reason","type":"bytes"}],"type":"error","name":"CallFailed"},{"inputs":[],"type":"error","name":"IndexOutOfBounds"},{"inputs":[],"type":"error","name":"KeyDoesNotExist"},{"inputs":[],"type":"error","name":"Unauthorized"},{"inputs":[],"type":"error","name":"UnsupportedExecutionMode"},{"inputs":[{"internalType":"bytes32","name":"keyHash","type":"bytes32","indexed":true},{"internalType":"struct Key","name":"key","type":"tuple","components":[{"internalType":"uint40","name":"expiry","type":"uint40"},{"internalType":"enum KeyType","name":"keyType","type":"uint8"},{"internalType":"bool","name":"isSuperAdmin","type":"bool"},{"internalType":"bytes","name":"publicKey","type":"bytes"}],"indexed":false}],"type":"event","name":"Authorized","anonymous":false},{"inputs":[],"type":"event","name":"EIP712DomainChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"keyHash","type":"bytes32","indexed":true}],"type":"event","name":"Revoked","anonymous":false},{"inputs":[{"internalType":"struct Key","name":"key","type":"tuple","components":[{"internalType":"uint40","name":"expiry","type":"uint40"},{"internalType":"enum KeyType","name":"keyType","type":"uint8"},{"internalType":"bool","name":"isSuperAdmin","type":"bool"},{"internalType":"bytes","name":"publicKey","type":"bytes"}]}],"stateMutability":"nonpayable","type":"function","name":"authorize","outputs":[{"internalType":"bytes32","name":"keyHash","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}]},{"inputs":[{"internalType":"bytes32","name":"mode","type":"bytes32"},{"internalType":"bytes","name":"executionData","type":"bytes"}],"stateMutability":"payable","type":"function","name":"execute"},{"inputs":[{"internalType":"bytes32","name":"keyHash","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getKey","outputs":[{"internalType":"struct Key","name":"","type":"tuple","components":[{"internalType":"uint40","name":"expiry","type":"uint40"},{"internalType":"enum KeyType","name":"keyType","type":"uint8"},{"internalType":"bool","name":"isSuperAdmin","type":"bool"},{"internalType":"bytes","name":"publicKey","type":"bytes"}]}]},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"}],"stateMutability":"view","type":"function","name":"hashTypedData","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"stateMutability":"view","type":"function","name":"isValidSignature","outputs":[{"internalType":"bytes4","name":"result","type":"bytes4"}]},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"stateMutability":"view","type":"function","name":"keyAt","outputs":[{"internalType":"struct Key","name":"","type":"tuple","components":[{"internalType":"uint40","name":"expiry","type":"uint40"},{"internalType":"enum KeyType","name":"keyType","type":"uint8"},{"internalType":"bool","name":"isSuperAdmin","type":"bool"},{"internalType":"bytes","name":"publicKey","type":"bytes"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"keyCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"bytes32","name":"keyHash","type":"bytes32"}],"stateMutability":"nonpayable","type":"function","name":"revoke"},{"inputs":[{"internalType":"bytes32","name":"mode","type":"bytes32"}],"stateMutability":"pure","type":"function","name":"supportsExecutionMode","outputs":[{"internalType":"bool","name":"result","type":"bool"}]}],"devdoc":{"kind":"dev","methods":{"authorize((uint40,uint8,bool,bytes))":{"details":"Authorizes the `key`."},"domainSeparator()":{"returns":{"_0":"The 32 bytes domain separator result."}},"eip712Domain()":{"details":"Follows ERC-5267 (see https://eips.ethereum.org/EIPS/eip-5267).","returns":{"chainId":"The value of the `EIP712Domain.chainId` field.","extensions":"The list of EIP numbers, that extends EIP-712 with new domain fields.","fields":"The bitmap of used fields.","name":"The value of the `EIP712Domain.name` field.","salt":"The value of the `EIP712Domain.salt` field.","verifyingContract":"The value of the `EIP712Domain.verifyingContract` field.","version":"The value of the `EIP712Domain.version` field."}},"getKey(bytes32)":{"details":"Returns the key corresponding to the `keyHash`. Reverts if the key does not exist."},"hashTypedData(bytes32)":{"returns":{"_0":"The corresponding replay-safe hash."}},"isValidSignature(bytes32,bytes)":{"details":"Hashes the given `hash` to be replay safe and validates the signature against it.","returns":{"result":"`0x1626ba7e` if validation succeeded, else `0xffffffff`."}},"keyAt(uint256)":{"details":"Returns the key at the `i`-th position in the key list."},"keyCount()":{"details":"Returns the number of authorized keys."},"revoke(bytes32)":{"details":"Revokes the key with the `keyHash`."},"supportsExecutionMode(bytes32)":{"details":"Provided for execution mode support detection."}},"version":1},"userdoc":{"kind":"user","methods":{"domainSeparator()":{"notice":"Returns the `domainSeparator` used to create EIP-712 compliant hashes."},"eip712Domain()":{"notice":"Returns information about the `EIP712Domain` used to create EIP-712 compliant hashes."},"hashTypedData(bytes32)":{"notice":"Public getter for `_hashTypedData()` to produce a replay-safe hash from the given `hash`."},"isValidSignature(bytes32,bytes)":{"notice":"Validates the `signature` against the given `hash`."}},"version":1}},"settings":{"remappings":["@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","account-abstraction/=lib/account-abstraction/contracts/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/","solady/=lib/solady/src/"],"optimizer":{"enabled":false,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/MinimalDelegation.sol":"MinimalDelegation"},"evmVersion":"cancun","libraries":{}},"sources":{"lib/account-abstraction/contracts/interfaces/IAccount.sol":{"keccak256":"0x38710bec0cb20ff4ceef46a80475b5bdabc27b7efd2687fd473db68332f61b78","urls":["bzz-raw://dea7a723e1ef852e8764e69914a345d2e8bc5e13facfc9d5c29d791cb4ab0020","dweb:/ipfs/QmU8dYgyF4DBJXFqjwLAtnE3q8q259ChfoEk9a6wyhHzEP"],"license":"GPL-3.0"},"lib/account-abstraction/contracts/interfaces/PackedUserOperation.sol":{"keccak256":"0x1129b46381db68eddbc5cb49e50664667b66b03c480453858e7b25eabe444359","urls":["bzz-raw://499a948aba60480dba6e25c763b8d918f1c246eb7a3302e04f493e080f3295be","dweb:/ipfs/QmeRhhswf4NACcBKam2PyjpTP2ddSm648kah5kkQJsvwz3"],"license":"GPL-3.0"},"lib/openzeppelin-contracts/contracts/interfaces/IERC1271.sol":{"keccak256":"0x4aaaf1c0737dd16e81f0d2b9833c549747a5ede6873bf1444bc72aa572d03e98","urls":["bzz-raw://eada27d7668eebaea16c3b890aa1b38ffc53965292e26c96f7c44834623f4710","dweb:/ipfs/QmVSWuLtxyCqNbLyY89ptxkvsk4CLLKDQYigEne5Qj8k1L"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/interfaces/IERC5267.sol":{"keccak256":"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92","urls":["bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a","dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP"],"license":"MIT"},"lib/solady/src/utils/ECDSA.sol":{"keccak256":"0xcf0e0d6f9178f2a077cccbfe1e4cbdbf7e3380a9074191cdb99756c958646053","urls":["bzz-raw://c8889c160364eb3985a10b8a7a8de88357a02adaf1ac100177ccbfda9f3797b7","dweb:/ipfs/QmW8w6QDxWkg44duxBAQ3gpSxGERTaPk4dvUkWAX8fQXpm"],"license":"MIT"},"lib/solady/src/utils/EnumerableSetLib.sol":{"keccak256":"0x9cb48b991323228021af1044398e837a6f073839af296c1dd4b0ace80820279b","urls":["bzz-raw://307e592c572f2138f725936da9e1e4564c14b5d3ce07202b1425f807e881a07f","dweb:/ipfs/QmWds35sTi62ZjUkG3ZmAZ1PBCG3R4xw9utKJKb37NxGtp"],"license":"MIT"},"src/EIP712.sol":{"keccak256":"0x052e53a7bd611db54a134b19c98c983146ff6ff6266f567f8ed1e621c735d173","urls":["bzz-raw://45815f4a4b5471e19c4f9c7113f594096c4bac1304172fa13fef7d9f5eb17525","dweb:/ipfs/QmRgv4ZSsN6MMUZW5pVJujMgD3db7dacsXpD1PkpaRGD1j"],"license":"MIT"},"src/ERC1271.sol":{"keccak256":"0xc8b137f2028e5fd10556344f467a85620b64553a16408b1fd799ded00fbd62f7","urls":["bzz-raw://89fc2e026be2b27eaf80be2b123cf19ef08e5c0129feef38a4983aa167612098","dweb:/ipfs/QmdnjQo8EZCyssvy38V4MW7xpRibPfxJiWtM7Q511smnLG"],"license":"MIT"},"src/MinimalDelegation.sol":{"keccak256":"0x3d4926aa470ad48e92bea0f74083c0626db384f5552205d0ad91b33b5243cb8e","urls":["bzz-raw://027bc4a3c0845ac5f4a447d353567e70e7b58ba4c50d2c29d260e44fffe28598","dweb:/ipfs/QmZg8wCjBuQj2AvkubDzLUbZoiSFgS6U4ohLQxc1ErZcdw"],"license":"UNLICENSED"},"src/interfaces/IEIP712.sol":{"keccak256":"0x5d6618485d24ae3356d7b61a6ebce0d180948a961425f7e3f2fbb430e5a362cd","urls":["bzz-raw://16efbfffd5ec264242ffa91c79c44959a7c019f26ac243dd59346b3e50054f41","dweb:/ipfs/Qmax2JBi7Htfxge5skubDCY23THpz3Jvc5ZBixqkjpGz6L"],"license":"MIT"},"src/interfaces/IERC1271.sol":{"keccak256":"0x130e2daa995138fb6dd65ca79014e07c25d0a404616ea4963059493921697099","urls":["bzz-raw://5eb8d7553acb0d017fefca58eaef997786faabacc9391907a4f314300ae2cb57","dweb:/ipfs/QmXQ9ASxMVcaUqRq4UVKyaHcbqpj6MZTbpzNt8GUTvhpR7"],"license":"MIT"},"src/interfaces/IERC7821.sol":{"keccak256":"0x031323642d7924474c0377f3eda137dcd476304947969258a2d71f26c85b7cf5","urls":["bzz-raw://cf98f3718f3a69131e33ff71a021e2b07aa66bd5b4a8b12a499738db5c58b71b","dweb:/ipfs/QmXCrpR2h4mLUqYnzysGPafP2y9amdCLcJ1xyPH71Tb5Nu"],"license":"UNLICENSED"},"src/interfaces/IKeyManagement.sol":{"keccak256":"0x26eb88cf225e0f65e04f7ac42ebe86d9277d37dbc18930f4294cf6fb5881b767","urls":["bzz-raw://4fa1bc6c9f11ef53f8638b64c907db00dc6dd84c21fd0ee2fe12ee76d128c6a4","dweb:/ipfs/QmV6ViCyeYEmYNmLo4F9d5nBWbFT9vvjjErLihHi6ipbGX"],"license":"UNLICENSED"},"src/interfaces/IMinimalDelegation.sol":{"keccak256":"0x34325cf371aca80617759cabce8ac9cb841c914149cbf5f99e04b89aecb379c0","urls":["bzz-raw://a48fd56504d0f54db22cc6083898f7071ee3211be10f35722a76f7f436aa50cc","dweb:/ipfs/QmcgSe7nKrjX2uU4AUGy5FASJZDBdcoeNs1fEYqNcT5tz6"],"license":"UNLICENSED"},"src/libraries/KeyLib.sol":{"keccak256":"0x00e8b163fe751c79606dcc527f8837e47b6a0ecefa5e1636ae994632f380b2f6","urls":["bzz-raw://f811d76b2abb8deb5c5bf80416a0f770fd83d16176d208f11ad1bfdb2a347233","dweb:/ipfs/Qmf8NTjjaCKpbi5QBLuG4tARYa8rfcfAzwxmxkvWsRK9Lz"],"license":"UNLICENSED"},"src/libraries/MinimalDelegationStorage.sol":{"keccak256":"0x2bc40ae3bf8081ae61c3210479238b9644edf9b11e34b803a53ab2224761535b","urls":["bzz-raw://9a457d84ef4016313fc64a00634a36eab961a3a4c3f943213a875113ee372ca4","dweb:/ipfs/QmagB7YwYuLxD9SN5mULg9SiJzJ6qmGExYvSAhnToB2xtX"],"license":"UNLICENSED"},"src/libraries/ModeDecoder.sol":{"keccak256":"0x9af8e3e1f4b592921ebd5f70fe40119ec93f92427515921d0a616a3dbe9700fb","urls":["bzz-raw://b840259a56db48eda30c3cb4ade297b65d742a6ac2b1e38670fe5e04e8347567","dweb:/ipfs/QmdVB3mL7WvEj3ySxrBrvR9kfHBY4RjEnYzfqSviVkUjuU"],"license":"UNLICENSED"}},"version":1},"id":32} diff --git a/sdks/smart-wallet-sdk/jest.config.js b/sdks/smart-wallet-sdk/jest.config.js new file mode 100644 index 00000000..1ff01cdf --- /dev/null +++ b/sdks/smart-wallet-sdk/jest.config.js @@ -0,0 +1,11 @@ +/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + rootDir: 'src', + globals: { + 'ts-jest': { + tsconfig: 'tsconfig.base.json', + }, + }, +} \ No newline at end of file diff --git a/sdks/smart-wallet-sdk/package.json b/sdks/smart-wallet-sdk/package.json new file mode 100644 index 00000000..04e0b1b5 --- /dev/null +++ b/sdks/smart-wallet-sdk/package.json @@ -0,0 +1,94 @@ +{ + "name": "@uniswap/smart-wallet-sdk", + "description": "⚒️ An SDK for building applications with smart wallets on Uniswap", + "repository": "https://github.com/Uniswap/sdks.git", + "keywords": [ + "uniswap", + "ethereum", + "smart-wallet" + ], + "license": "MIT", + "main": "./dist/cjs/src/index.js", + "module": "./dist/esm/src/index.js", + "types": "./dist/types/src/index.d.ts", + "files": [ + "dist" + ], + "engines": { + "node": ">=14" + }, + "scripts": { + "clean": "rm -rf dist src/contracts", + "build": "yarn clean && yarn build:cjs && yarn build:esm && yarn build:types", + "build:cjs": "tsc -p tsconfig.cjs.json", + "build:esm": "tsc -p tsconfig.esm.json", + "build:types": "tsc -p tsconfig.types.json", + "lint": "eslint src --ext .ts", + "test": "jest" + }, + "exports": { + ".": { + "types": "./dist/types/src/index.d.ts", + "import": "./dist/esm/src/index.js", + "require": "./dist/cjs/src/index.js" + } + }, + "sideEffects": false, + "dependencies": { + "@uniswap/sdk-core": "^7.6.0", + "viem": "^2.23.5" + }, + "devDependencies": { + "@types/jest": "^24.0.25", + "@types/node": "^18.7.16", + "eslint": "^7.8.0", + "eslint-config-prettier": "^6.11.0", + "eslint-plugin-eslint-comments": "^3.2.0", + "eslint-plugin-functional": "^3.0.2", + "eslint-plugin-import": "^2.22.0", + "jest": "25.5.0", + "prettier": "^2.4.1", + "ts-jest": "^25.5.1", + "ts-node": "^10.9.1", + "tslib": "^2.3.0", + "typescript": "npm:typescript@^5.6.2" + }, + "prettier": { + "printWidth": 120, + "semi": false, + "singleQuote": true + }, + "publishConfig": { + "access": "public", + "provenance": true + }, + "release": { + "extends": "semantic-release-monorepo", + "branches": [ + { + "name": "main", + "prerelease": false + } + ], + "plugins": [ + [ + "@semantic-release/commit-analyzer", + { + "preset": "angular", + "releaseRules": "../../publishing/release-rules.cjs" + } + ], + "@semantic-release/release-notes-generator", + "@semantic-release/npm", + "@semantic-release/github", + [ + "@semantic-release/exec", + { + "successCmd": "git restore yarn.lock && yarn", + "failCmd": "git restore yarn.lock && yarn", + "execCwd": "../.." + } + ] + ] + } +} diff --git a/sdks/smart-wallet-sdk/src/constants.ts b/sdks/smart-wallet-sdk/src/constants.ts new file mode 100644 index 00000000..19ce3de5 --- /dev/null +++ b/sdks/smart-wallet-sdk/src/constants.ts @@ -0,0 +1,59 @@ +import { ChainId } from '@uniswap/sdk-core' + +/** + * The target address for self-calls is address(0) + */ +export const SELF_CALL_TARGET = "0x0000000000000000000000000000000000000000" + +/** + * Call types for smart wallet calls + * Follows ERC-7579 + */ +export enum ModeType { + BATCHED_CALL = '0x0100000000000000000000000000000000000000000000000000000000000000', + BATCHED_CALL_CAN_REVERT = '0x0101000000000000000000000000000000000000000000000000000000000000', + BATCHED_CALL_SUPPORTS_OPDATA = '0x0100000000007821000100000000000000000000000000000000000000000000', + BATCHED_CALL_SUPPORTS_OPDATA_AND_CAN_REVERT = '0x0101000000007821000100000000000000000000000000000000000000000000' +} + +const BATCHED_CALL_EXECUTION_DATA_ABI = [ + { + type: 'tuple[]', + components: [ + { type: 'address', name: 'to' }, + { type: 'uint256', name: 'value' }, + { type: 'bytes', name: 'data' } + ] + } +] + +const BATCHED_CALL_SUPPORTS_OPDATA_EXECUTION_DATA_ABI = [ + ...BATCHED_CALL_EXECUTION_DATA_ABI, + { type: 'bytes', name: 'opData' } +] + +/** + * ABI encoding for each mode type + */ +export const MODE_TYPE_ABI_PARAMETERS = { + [ModeType.BATCHED_CALL]: BATCHED_CALL_EXECUTION_DATA_ABI, + [ModeType.BATCHED_CALL_CAN_REVERT]: BATCHED_CALL_EXECUTION_DATA_ABI, + [ModeType.BATCHED_CALL_SUPPORTS_OPDATA]: BATCHED_CALL_SUPPORTS_OPDATA_EXECUTION_DATA_ABI, + [ModeType.BATCHED_CALL_SUPPORTS_OPDATA_AND_CAN_REVERT]: BATCHED_CALL_SUPPORTS_OPDATA_EXECUTION_DATA_ABI +} as const + +/** + * Mapping of chainId to Smart Wallet contract addresses + */ +export const SMART_WALLET_ADDRESSES: { [chainId in ChainId]?: `0x${string}` } = { + // Mainnet + [ChainId.MAINNET]: '0x0000000000000000000000000000000000000000', // Placeholder - to be replaced + // Optimism + [ChainId.OPTIMISM]: '0x0000000000000000000000000000000000000000', // Placeholder - to be replaced + // Polygon + [ChainId.POLYGON]: '0x0000000000000000000000000000000000000000', // Placeholder - to be replaced + // Arbitrum + [ChainId.ARBITRUM_ONE]: '0x0000000000000000000000000000000000000000', // Placeholder - to be replaced + // Base + [ChainId.BASE]: '0x0000000000000000000000000000000000000000', // Placeholder - to be replaced +} diff --git a/sdks/smart-wallet-sdk/src/index.ts b/sdks/smart-wallet-sdk/src/index.ts new file mode 100644 index 00000000..cd663521 --- /dev/null +++ b/sdks/smart-wallet-sdk/src/index.ts @@ -0,0 +1,17 @@ +// Smart Wallet SDK entry point +export const VERSION = '0.1.0' + +// Export all types +export * from './types' + +// Export constants +export * from './constants' + +// Export utilities +export * from './utils' + +// Export main class +export * from './smartWallet' + +// Export generated contracts (will be available after running typechain) +// export * from './contracts' \ No newline at end of file diff --git a/sdks/smart-wallet-sdk/src/smartWallet.test.ts b/sdks/smart-wallet-sdk/src/smartWallet.test.ts new file mode 100644 index 00000000..551cc279 --- /dev/null +++ b/sdks/smart-wallet-sdk/src/smartWallet.test.ts @@ -0,0 +1,90 @@ +import { ChainId } from '@uniswap/sdk-core' + +import { ModeType, SMART_WALLET_ADDRESSES } from './constants'; +import { SmartWallet } from './smartWallet' +import { Call } from './types' + +const EXECUTE_SELECTOR = "0xe9ae5c53" as `0x${string}` + +describe('SmartWallet', () => { + describe('encodeExecute', () => { + it('encodes batch calls correctly', () => { + const calls: Call[] = [ + { + to: '0x1111111111111111111111111111111111111111', + data: '0x1234', + value: 0n + }, + { + to: '0x2222222222222222222222222222222222222222', + data: '0x5678', + value: 1n + } + ] + + const result = SmartWallet.encodeCalls(calls) + expect(result).toBeDefined() + expect(result.calldata).toBeDefined() + expect(result.value).toBeDefined() + }) + + it('encodes batch calls with revertOnFailure option', () => { + const calls: Call[] = [ + { + to: '0x1111111111111111111111111111111111111111', + data: '0x1234', + value: 0n + } + ] + + const result = SmartWallet.encodeCalls(calls, { revertOnFailure: true }) + expect(result).toBeDefined() + expect(result.calldata).toBeDefined() + expect(result.value).toBeDefined() + }) + + it('throws an error if the mode is not supported', () => { + // mock getModeFromOptions + jest.spyOn(SmartWallet, 'getModeFromOptions').mockReturnValue(ModeType.BATCHED_CALL_SUPPORTS_OPDATA) + const calls: Call[] = [ + { + to: '0x1111111111111111111111111111111111111111', + data: '0x1234', + value: 0n + } + ] + expect(() => SmartWallet.encodeCalls(calls)).toThrow() + + jest.restoreAllMocks() + }) + }) + + describe('createExecute', () => { + it('creates an execute call for specific chain', () => { + const methodParams = { + calldata: EXECUTE_SELECTOR, + value: 0n + } + + const call = SmartWallet.createExecute(methodParams, ChainId.MAINNET) + + // Verify the result + expect(call).toBeDefined() + expect(call.to).toBe(SMART_WALLET_ADDRESSES[ChainId.MAINNET]) + expect(call.data).toBe(EXECUTE_SELECTOR) + expect(call.value).toBe(0n) + }) + }) + + describe('getModeFromOptions', () => { + for(const canRevert of [true, false]) { + it(`returns the correct mode type for canRevert: ${canRevert}`, () => { + if(canRevert) { + expect(SmartWallet.getModeFromOptions({ revertOnFailure: canRevert })).toBe(ModeType.BATCHED_CALL_CAN_REVERT) + } else { + expect(SmartWallet.getModeFromOptions({ revertOnFailure: canRevert })).toBe(ModeType.BATCHED_CALL) + } + }) + } + }) +}) diff --git a/sdks/smart-wallet-sdk/src/smartWallet.ts b/sdks/smart-wallet-sdk/src/smartWallet.ts new file mode 100644 index 00000000..996d22a7 --- /dev/null +++ b/sdks/smart-wallet-sdk/src/smartWallet.ts @@ -0,0 +1,92 @@ +import { ChainId } from '@uniswap/sdk-core' +import { encodeAbiParameters, encodeFunctionData } from 'viem' + +import { abi } from '../abis/MinimalDelegation.json' + +import { MODE_TYPE_ABI_PARAMETERS, ModeType, SMART_WALLET_ADDRESSES } from './constants' +import { Call, MethodParameters, ExecuteOptions, AdvancedCall } from './types' +import { CallPlanner } from './utils' + +/** + * Main SDK class for interacting with ERC7821-compatible smart wallets + */ +export class SmartWallet { + /** + * Creates method parameters for executing a simple batch of calls through a smart wallet + * @dev does not support opData + * @param calls Array of calls to encode + * @returns Method parameters with calldata and value + */ + public static encodeCalls(calls: Call[], options: ExecuteOptions = {}): MethodParameters { + const mode = this.getModeFromOptions(options) + if(mode != ModeType.BATCHED_CALL && mode != ModeType.BATCHED_CALL_CAN_REVERT) { + throw new Error(`Invalid mode: ${mode}`) + } + const planner = new CallPlanner(calls) + + const executionData = planner.encode() + const encoded = this._encodeExecute(mode, executionData) + return { + calldata: encoded, + value: planner.value + } + } + + /// To be implemented + public static encodeAdvancedCalls(calls: AdvancedCall[], opData: string, _options: ExecuteOptions = {}): MethodParameters { + throw new Error('Not implemented') + } + + /** + * Creates a call to execute a method through a smart wallet + * @dev can be refactored to return a Transaction object as well + * @param methodParameters The method parameters to execute + * @param chainId The chain ID for the smart wallet + * @returns The call to execute + */ + public static createExecute(methodParameters: MethodParameters, chainId: ChainId ): Call { + const address = SMART_WALLET_ADDRESSES[chainId] + if(!address) { + throw new Error(`Smart wallet not found for chainId: ${chainId}`) + } + return { + to: address, + data: methodParameters.calldata, + value: methodParameters.value + } + } + + /** + * Get the mode type from the options + */ + public static getModeFromOptions(options: ExecuteOptions): ModeType { + if(options.revertOnFailure) { + return ModeType.BATCHED_CALL_CAN_REVERT + } + + return ModeType.BATCHED_CALL + } + + /** Internal methods */ + + protected static _encodeExecute(mode: ModeType, data: `0x${string}`): `0x${string}` { + return encodeFunctionData({ + abi, + functionName: 'execute', + args: [ + mode, + data + ] + }) + } + + protected static _encodeBatchedCallSupportsOpdata( + planner: CallPlanner, + opData: `0x${string}` + ): `0x${string}` { + return encodeAbiParameters( + MODE_TYPE_ABI_PARAMETERS[ModeType.BATCHED_CALL_SUPPORTS_OPDATA], + [planner.encode(), opData] + ) + } +} diff --git a/sdks/smart-wallet-sdk/src/types.ts b/sdks/smart-wallet-sdk/src/types.ts new file mode 100644 index 00000000..142ba4cd --- /dev/null +++ b/sdks/smart-wallet-sdk/src/types.ts @@ -0,0 +1,44 @@ +/** + * Represents a call to a smart contract + */ +export interface Call { + /** The address of the contract to call */ + to: `0x${string}` + /** The encoded calldata for the call */ + data: `0x${string}` + /** The amount of ETH to send with the call */ + value: bigint + /** The chain ID for the call (for client-side use) */ + chainId?: number | string +} + +/** + * Represents a call with advanced options like partial failure handling + */ +export interface AdvancedCall extends Call { + /** Whether to revert the entire transaction if this call fails */ + revertOnFailure?: boolean +} + +/** + * Parameters for method execution + */ +export interface MethodParameters { + /** Encoded calldata to be sent to the user's delegated account */ + calldata: `0x${string}` + /** The amount of ETH to send with the transaction */ + value: bigint +} + +/** + * Options for the execute method + */ +export interface ExecuteOptions { + /** Whether to allow the call to revert */ + revertOnFailure?: boolean +} + +export interface AdvancedExecuteOptions extends ExecuteOptions { + /** Whether the call supports opData */ + senderIsUser?: boolean +} diff --git a/sdks/smart-wallet-sdk/src/utils/callPlanner.test.ts b/sdks/smart-wallet-sdk/src/utils/callPlanner.test.ts new file mode 100644 index 00000000..1cee597d --- /dev/null +++ b/sdks/smart-wallet-sdk/src/utils/callPlanner.test.ts @@ -0,0 +1,102 @@ +import { zeroAddress } from 'viem' + +import { CallPlanner } from './callPlanner' + + +// Test constants +const TEST_ADDRESS_1 = zeroAddress +const TEST_DATA_1 = '0x123456' as `0x${string}` +const TEST_DATA_2 = '0xabcdef0123456789' as `0x${string}` +const TEST_VALUE_1 = 100n +const TEST_VALUE_2 = 200n + +describe('CallPlanner', () => { + describe('constructor', () => { + it('should initialize with an empty array of calls', () => { + const planner = new CallPlanner() + expect(planner.calls).toEqual([]) + }) + + it('should initialize with a provided array of calls', () => { + const calls = [ + { to: TEST_ADDRESS_1, data: TEST_DATA_1, value: TEST_VALUE_1 }, + { to: TEST_ADDRESS_1, data: TEST_DATA_2, value: TEST_VALUE_2 } + ] + const planner = new CallPlanner(calls) + expect(planner.calls).toEqual(calls) + }) + }) + + describe('value', () => { + it('should return 0 when no calls are present', () => { + const planner = new CallPlanner() + expect(planner.value.toString()).toBe('0') + }) + + it('should sum the values of all calls', () => { + const planner = new CallPlanner([ + { to: TEST_ADDRESS_1, data: TEST_DATA_1, value: TEST_VALUE_1 }, + { to: TEST_ADDRESS_1, data: TEST_DATA_2, value: TEST_VALUE_2 } + ]) + expect(planner.value.toString()).toBe('300') + }) + + it('should handle undefined values as 0', () => { + const planner = new CallPlanner([ + { to: TEST_ADDRESS_1, data: TEST_DATA_1, value: TEST_VALUE_1 }, + { to: TEST_ADDRESS_1, data: TEST_DATA_2, value: undefined as unknown as bigint } + ]) + expect(planner.value.toString()).toBe('100') + }) + }) + + describe('encode', () => { + it('should correctly abi encode the calls', () => { + const planner = new CallPlanner([ + { to: TEST_ADDRESS_1, data: TEST_DATA_1, value: TEST_VALUE_1 } + ]) + + const encoded = planner.encode() + // We're just checking that it returns a hex string and doesn't throw + expect(encoded).toMatch(/^0x/) + expect(typeof encoded).toBe('string') + }) + + it('should throw an error if there are no calls to encode', () => { + const planner = new CallPlanner() + expect(() => planner.encode()).toThrow("No calls to encode") + }) + }) + + describe('add', () => { + it('should add a new call to the calls array', () => { + const planner = new CallPlanner() + planner.add(TEST_ADDRESS_1, TEST_DATA_1, TEST_VALUE_1) + expect(planner.calls).toEqual([{ to: TEST_ADDRESS_1, data: TEST_DATA_1, value: TEST_VALUE_1 }]) + }) + + it('should add a new call with bigint value', () => { + const planner = new CallPlanner() + planner.add(TEST_ADDRESS_1, TEST_DATA_1, 100n) + expect(planner.calls).toEqual([{ to: TEST_ADDRESS_1, data: TEST_DATA_1, value: 100n }]) + }) + + it('should return the planner instance for chaining', () => { + const planner = new CallPlanner() + const result = planner.add(TEST_ADDRESS_1, TEST_DATA_1, TEST_VALUE_1) + expect(result).toBe(planner) + }) + + it('should allow chaining multiple add calls', () => { + const planner = new CallPlanner() + planner + .add(TEST_ADDRESS_1, TEST_DATA_1, TEST_VALUE_1) + .add(TEST_ADDRESS_1, TEST_DATA_2, TEST_VALUE_2) + + expect(planner.calls).toEqual([ + { to: TEST_ADDRESS_1, data: TEST_DATA_1, value: TEST_VALUE_1 }, + { to: TEST_ADDRESS_1, data: TEST_DATA_2, value: TEST_VALUE_2 } + ]) + }) + }) +}) diff --git a/sdks/smart-wallet-sdk/src/utils/callPlanner.ts b/sdks/smart-wallet-sdk/src/utils/callPlanner.ts new file mode 100644 index 00000000..a3bf58a7 --- /dev/null +++ b/sdks/smart-wallet-sdk/src/utils/callPlanner.ts @@ -0,0 +1,67 @@ +import { encodeAbiParameters } from 'viem' + +import { Call } from '../types' + +// Define the ABI parameter type for the call tuple +const CALL_ABI_PARAMS = [ + { + type: 'tuple[]', + components: [ + { type: 'address', name: 'to' }, + { type: 'bytes', name: 'data' }, + { type: 'uint256', name: 'value' } + ] + } +] as const + +/** + * CallPlanner is used to encode a series Calls + */ +export class CallPlanner { + calls: Call[] + + /** + * Create a new CallPlanner + * @param calls optionally initialize with a list of calls + */ + constructor(calls: Call[] = []) { + this.calls = calls + } + + /** + * Get the total value of the calls + */ + get value(): bigint { + return this.calls.reduce((acc, call) => { + // Convert string values to bigint + const callValue = typeof call.value === 'string' + ? BigInt(call.value || '0') + : (call.value || 0n) + + return acc + callValue + }, 0n) + } + + /** + * abi encode the Calls[] + */ + encode(): `0x${string}` { + if (this.calls.length === 0) { + throw new Error("No calls to encode") + } + + + return encodeAbiParameters(CALL_ABI_PARAMS, [this.calls]) + } + + /** + * Add a command to execute a call + * @param to The target address of the call + * @param data The calldata for the call + * @param value The ETH value to send with the call + */ + add(to: `0x${string}`, data: `0x${string}`, value: bigint): CallPlanner { + this.calls.push({ to, data, value }) + return this + } +} diff --git a/sdks/smart-wallet-sdk/src/utils/index.ts b/sdks/smart-wallet-sdk/src/utils/index.ts new file mode 100644 index 00000000..0ce8b352 --- /dev/null +++ b/sdks/smart-wallet-sdk/src/utils/index.ts @@ -0,0 +1 @@ +export * from './callPlanner' diff --git a/sdks/smart-wallet-sdk/tsconfig.base.json b/sdks/smart-wallet-sdk/tsconfig.base.json new file mode 100644 index 00000000..1c119e93 --- /dev/null +++ b/sdks/smart-wallet-sdk/tsconfig.base.json @@ -0,0 +1,19 @@ +{ + "include": ["src"], + "compilerOptions": { + "rootDir": ".", + "baseUrl": ".", + "target": "es2020", + "module": "esnext", + "importHelpers": true, + "declaration": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "esModuleInterop": true, + "skipLibCheck": true, + "isolatedModules": true, + "lib": ["es2020", "dom"] + } +} \ No newline at end of file diff --git a/sdks/smart-wallet-sdk/tsconfig.cjs.json b/sdks/smart-wallet-sdk/tsconfig.cjs.json new file mode 100644 index 00000000..ef807829 --- /dev/null +++ b/sdks/smart-wallet-sdk/tsconfig.cjs.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "commonjs", + "outDir": "dist/cjs" + } +} \ No newline at end of file diff --git a/sdks/smart-wallet-sdk/tsconfig.esm.json b/sdks/smart-wallet-sdk/tsconfig.esm.json new file mode 100644 index 00000000..31fa22f4 --- /dev/null +++ b/sdks/smart-wallet-sdk/tsconfig.esm.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "esnext", + "outDir": "dist/esm" + } +} \ No newline at end of file diff --git a/sdks/smart-wallet-sdk/tsconfig.types.json b/sdks/smart-wallet-sdk/tsconfig.types.json new file mode 100644 index 00000000..d4bb33fa --- /dev/null +++ b/sdks/smart-wallet-sdk/tsconfig.types.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "declaration": true, + "emitDeclarationOnly": true, + "outDir": "dist/types" + } +} \ No newline at end of file diff --git a/sdks/uniswapx-sdk/package.json b/sdks/uniswapx-sdk/package.json index 743c6c9d..bbc08bfb 100644 --- a/sdks/uniswapx-sdk/package.json +++ b/sdks/uniswapx-sdk/package.json @@ -53,7 +53,7 @@ "jest-environment-node": "25.5.0", "npm-run-all": "^4.1.5", "prettier": "^2.4.1", - "ts-jest": "25.5.0", + "ts-jest": "^25.5.1", "ts-node": "^10.9.1", "typechain": "^8.1.0", "typescript": "^4.3.3" diff --git a/yarn.lock b/yarn.lock index 62136ddb..1b0beaaf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,6 +12,13 @@ __metadata: languageName: node linkType: hard +"@adraffy/ens-normalize@npm:^1.10.1": + version: 1.11.0 + resolution: "@adraffy/ens-normalize@npm:1.11.0" + checksum: b2911269e3e0ec6396a2e5433a99e0e1f9726befc6c167994448cd0e53dbdd0be22b4835b4f619558b568ed9aa7312426b8fa6557a13999463489daa88169ee5 + languageName: node + linkType: hard + "@ampproject/remapping@npm:^2.2.0": version: 2.2.1 resolution: "@ampproject/remapping@npm:2.2.1" @@ -1332,6 +1339,15 @@ __metadata: languageName: node linkType: hard +"@noble/curves@npm:1.8.1, @noble/curves@npm:^1.6.0, @noble/curves@npm:~1.8.1": + version: 1.8.1 + resolution: "@noble/curves@npm:1.8.1" + dependencies: + "@noble/hashes": 1.7.1 + checksum: 4143f1248ed57c1ae46dfef5c692a91383e5830420b9c72d3ff1061aa9ebbf8999297da6d2aed8a9716fef8e6b1f5a45737feeab02abf55ca2a4f514bf9339ec + languageName: node + linkType: hard + "@noble/hashes@npm:1.2.0, @noble/hashes@npm:~1.2.0": version: 1.2.0 resolution: "@noble/hashes@npm:1.2.0" @@ -1339,6 +1355,13 @@ __metadata: languageName: node linkType: hard +"@noble/hashes@npm:1.7.1, @noble/hashes@npm:^1.5.0, @noble/hashes@npm:~1.7.1": + version: 1.7.1 + resolution: "@noble/hashes@npm:1.7.1" + checksum: 4f1b56428a10323feef17e4f437c9093556cb18db06f94d254043fadb69c3da8475f96eb3f8322d41e8670117d7486475a8875e68265c2839f60fd03edd6a616 + languageName: node + linkType: hard + "@noble/secp256k1@npm:1.7.1, @noble/secp256k1@npm:~1.7.0": version: 1.7.1 resolution: "@noble/secp256k1@npm:1.7.1" @@ -2193,6 +2216,13 @@ __metadata: languageName: node linkType: hard +"@scure/base@npm:~1.2.2, @scure/base@npm:~1.2.4": + version: 1.2.4 + resolution: "@scure/base@npm:1.2.4" + checksum: db554eb550a1bd17684af9282e1ad751050a13d4add0e83ad61cc496680d7d1c1c1120ca780e72935a293bb59721c20a006a53a5eec6f6b5bdcd702cf27c8cae + languageName: node + linkType: hard + "@scure/bip32@npm:1.1.5": version: 1.1.5 resolution: "@scure/bip32@npm:1.1.5" @@ -2204,6 +2234,17 @@ __metadata: languageName: node linkType: hard +"@scure/bip32@npm:1.6.2, @scure/bip32@npm:^1.5.0": + version: 1.6.2 + resolution: "@scure/bip32@npm:1.6.2" + dependencies: + "@noble/curves": ~1.8.1 + "@noble/hashes": ~1.7.1 + "@scure/base": ~1.2.2 + checksum: e7586619f8a669e522267ce71a90b2d00c3a91da658f1f50e54072cf9f432ba26d2bb4d3d91a5d06932ab96612b8bd038bc31d885bbc048cebfb6509c4a790fc + languageName: node + linkType: hard + "@scure/bip39@npm:1.1.1": version: 1.1.1 resolution: "@scure/bip39@npm:1.1.1" @@ -2214,6 +2255,16 @@ __metadata: languageName: node linkType: hard +"@scure/bip39@npm:1.5.4, @scure/bip39@npm:^1.4.0": + version: 1.5.4 + resolution: "@scure/bip39@npm:1.5.4" + dependencies: + "@noble/hashes": ~1.7.1 + "@scure/base": ~1.2.4 + checksum: 744f302559ad05ee6ea4928572ac8f0b5443e8068fd53234c9c2e158814e910a043c54f0688d05546decadd2ff66e0d0c76355d10e103a28cb8f44efe140857a + languageName: node + linkType: hard + "@semantic-release/commit-analyzer@npm:^9.0.2": version: 9.0.2 resolution: "@semantic-release/commit-analyzer@npm:9.0.2" @@ -3142,6 +3193,28 @@ __metadata: languageName: unknown linkType: soft +"@uniswap/smart-wallet-sdk@workspace:sdks/smart-wallet-sdk": + version: 0.0.0-use.local + resolution: "@uniswap/smart-wallet-sdk@workspace:sdks/smart-wallet-sdk" + dependencies: + "@types/jest": ^24.0.25 + "@types/node": ^18.7.16 + "@uniswap/sdk-core": ^7.6.0 + eslint: ^7.8.0 + eslint-config-prettier: ^6.11.0 + eslint-plugin-eslint-comments: ^3.2.0 + eslint-plugin-functional: ^3.0.2 + eslint-plugin-import: ^2.22.0 + jest: 25.5.0 + prettier: ^2.4.1 + ts-jest: ^25.5.1 + ts-node: ^10.9.1 + tslib: ^2.3.0 + typescript: "npm:typescript@^5.6.2" + viem: ^2.23.5 + languageName: unknown + linkType: soft + "@uniswap/swap-router-contracts@npm:^1.3.0": version: 1.3.1 resolution: "@uniswap/swap-router-contracts@npm:1.3.1" @@ -3180,7 +3253,7 @@ __metadata: jest-environment-node: 25.5.0 npm-run-all: ^4.1.5 prettier: ^2.4.1 - ts-jest: 25.5.0 + ts-jest: ^25.5.1 ts-node: ^10.9.1 typechain: ^8.1.0 typescript: ^4.3.3 @@ -3443,6 +3516,21 @@ __metadata: languageName: node linkType: hard +"abitype@npm:1.0.8, abitype@npm:^1.0.6": + version: 1.0.8 + resolution: "abitype@npm:1.0.8" + peerDependencies: + typescript: ">=5.0.4" + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + checksum: 104bc2f6820ced8d2cb61521916f7f22c0981a846216f5b6144f69461265f7da137a4ae108bf4b84cd8743f2dd1e9fdadffc0f95371528e15a59e0a369e08438 + languageName: node + linkType: hard + "acorn-globals@npm:^4.3.2": version: 4.3.4 resolution: "acorn-globals@npm:4.3.4" @@ -6371,6 +6459,13 @@ __metadata: languageName: node linkType: hard +"eventemitter3@npm:5.0.1": + version: 5.0.1 + resolution: "eventemitter3@npm:5.0.1" + checksum: 543d6c858ab699303c3c32e0f0f47fc64d360bf73c3daf0ac0b5079710e340d6fe9f15487f94e66c629f5f82cd1a8678d692f3dbb6f6fcd1190e1b97fcad36f8 + languageName: node + linkType: hard + "evp_bytestokey@npm:^1.0.3": version: 1.0.3 resolution: "evp_bytestokey@npm:1.0.3" @@ -8539,6 +8634,15 @@ __metadata: languageName: node linkType: hard +"isows@npm:1.0.6": + version: 1.0.6 + resolution: "isows@npm:1.0.6" + peerDependencies: + ws: "*" + checksum: ab9e85b50bcc3d70aa5ec875aa2746c5daf9321cb376ed4e5434d3c2643c5d62b1f466d93a05cd2ad0ead5297224922748c31707cb4fbd68f5d05d0479dce99c + languageName: node + linkType: hard + "isstream@npm:~0.1.2": version: 0.1.2 resolution: "isstream@npm:0.1.2" @@ -11271,6 +11375,26 @@ __metadata: languageName: node linkType: hard +"ox@npm:0.6.7": + version: 0.6.7 + resolution: "ox@npm:0.6.7" + dependencies: + "@adraffy/ens-normalize": ^1.10.1 + "@noble/curves": ^1.6.0 + "@noble/hashes": ^1.5.0 + "@scure/bip32": ^1.5.0 + "@scure/bip39": ^1.4.0 + abitype: ^1.0.6 + eventemitter3: 5.0.1 + peerDependencies: + typescript: ">=5.4.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 99acb683ff1cf78749f2b4230d3c208b8cdea0b3bf2bff0db564207917ae6833093b203cb7b9853fc8ec642ca0c8c87cd70a50eab9ff9944c55bf990436112b5 + languageName: node + linkType: hard + "p-cancelable@npm:^1.0.0": version: 1.1.0 resolution: "p-cancelable@npm:1.1.0" @@ -14025,9 +14149,9 @@ __metadata: languageName: node linkType: hard -"ts-jest@npm:25.5.0": - version: 25.5.0 - resolution: "ts-jest@npm:25.5.0" +"ts-jest@npm:^25.5.1": + version: 25.5.1 + resolution: "ts-jest@npm:25.5.1" dependencies: bs-logger: 0.x buffer-from: 1.x @@ -14044,7 +14168,7 @@ __metadata: typescript: ">=3.4 <4.0" bin: ts-jest: cli.js - checksum: d4fc62f79c3e147189d42acf21edfaa87bfca7b34e872cdb15e1e0a7bce38ad6c23e01f9dfe80c9ed4a6cd920f80fcc472e8ff2a0031830b4136782e914b8ec4 + checksum: 2bbb57f7add2181e6dbc5a9caca713ba65d0d76c26fc41d9d2ee72006c4926482238a5999a430720fe8907a935b54b2cb0454ef7346623f7ca8463f7f0d27eb4 languageName: node linkType: hard @@ -14434,6 +14558,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:typescript@^5.6.2": + version: 5.8.2 + resolution: "typescript@npm:5.8.2" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 7f9e3d7ac15da6df713e439e785e51facd65d6450d5f51fab3e8d2f2e3f4eb317080d895480b8e305450cdbcb37e17383e8bf521e7395f8b556e2f2a4730ed86 + languageName: node + linkType: hard + "typescript@patch:typescript@^4.3.3#~builtin": version: 4.9.5 resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=a1c5e5" @@ -14444,6 +14578,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@npm%3Atypescript@^5.6.2#~builtin": + version: 5.8.2 + resolution: "typescript@patch:typescript@npm%3A5.8.2#~builtin::version=5.8.2&hash=a1c5e5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: a58d19ff9811c1764a299dd83ca20ed8020f0ab642906dafc880121b710751227201531fdc99878158205c356ac79679b0b61ac5b42eda0e28bfb180947a258d + languageName: node + linkType: hard + "typical@npm:^4.0.0": version: 4.0.0 resolution: "typical@npm:4.0.0" @@ -14756,6 +14900,27 @@ __metadata: languageName: node linkType: hard +"viem@npm:^2.23.5": + version: 2.23.5 + resolution: "viem@npm:2.23.5" + dependencies: + "@noble/curves": 1.8.1 + "@noble/hashes": 1.7.1 + "@scure/bip32": 1.6.2 + "@scure/bip39": 1.5.4 + abitype: 1.0.8 + isows: 1.0.6 + ox: 0.6.7 + ws: 8.18.0 + peerDependencies: + typescript: ">=5.0.4" + peerDependenciesMeta: + typescript: + optional: true + checksum: eb8763ea8efec1ba983a44ad243ad7de5bfdec1b2da8ed7d293bbcbf7ac03c20103b4e0a4bbc99d2fe7d50358dc8bc7efd859b7604e13e406f22eb902e28806d + languageName: node + linkType: hard + "vscode-oniguruma@npm:^1.6.1": version: 1.7.0 resolution: "vscode-oniguruma@npm:1.7.0" @@ -15058,6 +15223,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:8.18.0": + version: 8.18.0 + resolution: "ws@npm:8.18.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 91d4d35bc99ff6df483bdf029b9ea4bfd7af1f16fc91231a96777a63d263e1eabf486e13a2353970efc534f9faa43bdbf9ee76525af22f4752cbc5ebda333975 + languageName: node + linkType: hard + "ws@npm:^7.0.0, ws@npm:^7.4.6": version: 7.5.9 resolution: "ws@npm:7.5.9"