diff --git a/contracts/artifacts/trails-contracts/TrailsUtils.sol/TrailsUtils.json b/contracts/artifacts/trails-contracts/TrailsUtils.sol/TrailsUtils.json new file mode 100644 index 00000000..f63a8e59 --- /dev/null +++ b/contracts/artifacts/trails-contracts/TrailsUtils.sol/TrailsUtils.json @@ -0,0 +1 @@ +{"abi":[{"type":"receive","stateMutability":"payable"},{"type":"function","name":"handleSequenceDelegateCall","inputs":[{"name":"","type":"bytes32","internalType":"bytes32"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hydrateExecute","inputs":[{"name":"packedPayload","type":"bytes","internalType":"bytes"},{"name":"hydratePayload","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"hydrateExecuteAndSweep","inputs":[{"name":"packedPayload","type":"bytes","internalType":"bytes"},{"name":"sweepTarget","type":"address","internalType":"address"},{"name":"tokensToSweep","type":"address[]","internalType":"address[]"},{"name":"sweepNative","type":"bool","internalType":"bool"},{"name":"hydratePayload","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"recoverSapientSignature","inputs":[{"name":"payload","type":"tuple","internalType":"struct Payload.Decoded","components":[{"name":"kind","type":"uint8","internalType":"uint8"},{"name":"noChainId","type":"bool","internalType":"bool"},{"name":"calls","type":"tuple[]","internalType":"struct Payload.Call[]","components":[{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"},{"name":"gasLimit","type":"uint256","internalType":"uint256"},{"name":"delegateCall","type":"bool","internalType":"bool"},{"name":"onlyFallback","type":"bool","internalType":"bool"},{"name":"behaviorOnError","type":"uint256","internalType":"uint256"}]},{"name":"space","type":"uint256","internalType":"uint256"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"message","type":"bytes","internalType":"bytes"},{"name":"imageHash","type":"bytes32","internalType":"bytes32"},{"name":"digest","type":"bytes32","internalType":"bytes32"},{"name":"parentWallets","type":"address[]","internalType":"address[]"}]},{"name":"signature","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"imageHash","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"requireERC1155Approval","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"owner","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"requireERC1155ApprovalSelf","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"requireERC721Approval","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"requireERC721ApprovalSelf","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"requireMinBalance","inputs":[{"name":"wallet","type":"address","internalType":"address"},{"name":"minBalance","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"requireMinBalanceSelf","inputs":[{"name":"minBalance","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"requireMinERC1155Balance","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"wallet","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"minBalance","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"requireMinERC1155BalanceBatch","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"wallet","type":"address","internalType":"address"},{"name":"tokenIds","type":"uint256[]","internalType":"uint256[]"},{"name":"minBalances","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"requireMinERC1155BalanceBatchSelf","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"tokenIds","type":"uint256[]","internalType":"uint256[]"},{"name":"minBalances","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"requireMinERC1155BalanceSelf","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"minBalance","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"requireMinERC20Allowance","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"},{"name":"minAllowance","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"requireMinERC20AllowanceSelf","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"},{"name":"minAllowance","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"requireMinERC20Balance","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"wallet","type":"address","internalType":"address"},{"name":"minBalance","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"requireMinERC20BalanceSelf","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"minBalance","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"requireNonExpired","inputs":[{"name":"expiration","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"sweep","inputs":[{"name":"sweepTarget","type":"address","internalType":"address"},{"name":"tokensToSweep","type":"address[]","internalType":"address[]"},{"name":"sweepNative","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"CallAborted","inputs":[{"name":"_opHash","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"_index","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_returnData","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"CallFailed","inputs":[{"name":"_opHash","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"_index","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_returnData","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"CallSkipped","inputs":[{"name":"_opHash","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"_index","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"CallSucceeded","inputs":[{"name":"_opHash","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"_index","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"BalanceSweepFailed","inputs":[]},{"type":"error","name":"DelegateCallFailed","inputs":[{"name":"result","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"DelegateCallNotAllowed","inputs":[{"name":"index","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ERC1155BalanceTooLow","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"wallet","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"balance","type":"uint256","internalType":"uint256"},{"name":"minBalance","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ERC1155BatchBalanceTooLow","inputs":[{"name":"index","type":"uint256","internalType":"uint256"},{"name":"balance","type":"uint256","internalType":"uint256"},{"name":"minBalance","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ERC1155NotApproved","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"owner","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}]},{"type":"error","name":"ERC20AllowanceTooLow","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"},{"name":"allowance","type":"uint256","internalType":"uint256"},{"name":"minAllowance","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ERC20BalanceTooLow","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"wallet","type":"address","internalType":"address"},{"name":"balance","type":"uint256","internalType":"uint256"},{"name":"minBalance","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ERC721NotApproved","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"}]},{"type":"error","name":"Expired","inputs":[{"name":"expiration","type":"uint256","internalType":"uint256"},{"name":"timestamp","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidKind","inputs":[{"name":"kind","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"LengthMismatch","inputs":[{"name":"a","type":"uint256","internalType":"uint256"},{"name":"b","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"NativeBalanceTooLow","inputs":[{"name":"wallet","type":"address","internalType":"address"},{"name":"balance","type":"uint256","internalType":"uint256"},{"name":"minBalance","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"NonTransactionPayload","inputs":[]},{"type":"error","name":"NotEnoughGas","inputs":[{"name":"_payload","type":"tuple","internalType":"struct Payload.Decoded","components":[{"name":"kind","type":"uint8","internalType":"uint8"},{"name":"noChainId","type":"bool","internalType":"bool"},{"name":"calls","type":"tuple[]","internalType":"struct Payload.Call[]","components":[{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"},{"name":"gasLimit","type":"uint256","internalType":"uint256"},{"name":"delegateCall","type":"bool","internalType":"bool"},{"name":"onlyFallback","type":"bool","internalType":"bool"},{"name":"behaviorOnError","type":"uint256","internalType":"uint256"}]},{"name":"space","type":"uint256","internalType":"uint256"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"message","type":"bytes","internalType":"bytes"},{"name":"imageHash","type":"bytes32","internalType":"bytes32"},{"name":"digest","type":"bytes32","internalType":"bytes32"},{"name":"parentWallets","type":"address[]","internalType":"address[]"}]},{"name":"_index","type":"uint256","internalType":"uint256"},{"name":"_gasLeft","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"OnlyDelegateCallAllowed","inputs":[]},{"type":"error","name":"Reverted","inputs":[{"name":"_payload","type":"tuple","internalType":"struct Payload.Decoded","components":[{"name":"kind","type":"uint8","internalType":"uint8"},{"name":"noChainId","type":"bool","internalType":"bool"},{"name":"calls","type":"tuple[]","internalType":"struct Payload.Call[]","components":[{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"},{"name":"gasLimit","type":"uint256","internalType":"uint256"},{"name":"delegateCall","type":"bool","internalType":"bool"},{"name":"onlyFallback","type":"bool","internalType":"bool"},{"name":"behaviorOnError","type":"uint256","internalType":"uint256"}]},{"name":"space","type":"uint256","internalType":"uint256"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"message","type":"bytes","internalType":"bytes"},{"name":"imageHash","type":"bytes32","internalType":"bytes32"},{"name":"digest","type":"bytes32","internalType":"bytes32"},{"name":"parentWallets","type":"address[]","internalType":"address[]"}]},{"name":"_index","type":"uint256","internalType":"uint256"},{"name":"_returnData","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"SafeERC20FailedOperation","inputs":[{"name":"token","type":"address","internalType":"address"}]},{"type":"error","name":"UnknownHydrateDataCommand","inputs":[{"name":"flag","type":"uint256","internalType":"uint256"}]}],"bytecode":{"object":"0x60a0806040523460295730608052613013908161002e82396080518181816107e80152611c790152f35b5f80fdfe6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c806284290d1461015857806303bbbd65146101535780630cb17e5c1461014e57806313792a4a146101495780632ab793d714610144578063333f790d1461013f578063372618cb1461013a57806342ab921e14610135578063476a5f40146101305780634c4e814c1461012b578063505c7ed3146101265780636d42cf03146101215780636ef1f0dd1461011c5780637f29d538146101175780638d0a9ea714610112578063a7b7ec5a1461010d578063bd1e4acb14610108578063e246466a14610103578063fdc25428146100fe5763fe08e7ca0361000e57610c36565b610bac565b610b93565b610ae3565b610a71565b610a50565b6109e5565b6109cc565b61090c565b6108b5565b610796565b610702565b6106b7565b610617565b6105dc565b610580565b610292565b610212565b6101cb565b61017f565b73ffffffffffffffffffffffffffffffffffffffff81160361017b57565b5f80fd5b3461017b5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b576100186004356101bd8161015d565b602435604435913390610f0e565b3461017b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b576100186004356102098161015d565b60243590611032565b3461017b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b576100186004356102508161015d565b6024359061025d8261015d565b339061109e565b9181601f8401121561017b5782359167ffffffffffffffff831161017b576020838186019501011161017b57565b3461017b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b5760043567ffffffffffffffff811161017b5780600401906101207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc823603011261017b5760243567ffffffffffffffff811161017b57610325903690600401610264565b60ff61033085610c50565b1661055857919061036261035460648401356084850135905f5260205260405f2090565b46905f5260205260405f2090565b9060445f9301915b6103748387610c5e565b90508410156104a1576104996001918561039881610392888c610c5e565b90610cdf565b6104896103a482610d24565b61045d6020840135936060810135906103bf60808201610d31565b60c06103cd60a08401610d31565b92013592604051978896602088019a8b93909796959273ffffffffffffffffffffffffffffffffffffffff60e09693610100875260046101008801527f63616c6c0000000000000000000000000000000000000000000000000000000061012088015261014087019a602088015216604086015260608501526080840152151560a0830152151560c08201520152565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610d89565b519020905f5260205260405f2090565b93019261036a565b939250905f5b8381106104b957604051858152602090f35b82939461054261ffff61050a61053a8a8861053061052660ff6103928c61051e8a9e9f61054f9e6104f59160019092919283013560f81c920190565b9416998a948881013560f01c91600290910190565b9b169a8b9781013560f01c91600290910190565b9e1696610c5e565b6040810190610dca565b9092820192610e1b565b92909161118b565b905f5260205260405f2090565b939291906104a7565b7f3c28730f000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461017b5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b576100186004356105be8161015d565b6024356105ca8161015d565b604435916105d78361015d565b61109e565b3461017b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b5761001860043533611032565b3461017b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b576100186004356106558161015d565b60243590339061124d565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc608091011261017b576004356106968161015d565b906024356106a38161015d565b906044356106b08161015d565b9060643590565b3461017b576100186106c836610660565b9291909161134e565b9181601f8401121561017b5782359167ffffffffffffffff831161017b576020808501948460051b01011161017b57565b3461017b5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b5760043561073d8161015d565b6024356107498161015d565b60443567ffffffffffffffff811161017b576107699036906004016106d1565b606435939167ffffffffffffffff851161017b5761078e6100189536906004016106d1565b9490936115de565b3461017b5760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b5760a43567ffffffffffffffff811161017b576107e5903690600401610264565b907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8116301461088d57825f939284936040519283928337810184815203915af4610843610e6d565b901561084b57005b610889906040519182917ff7a01e4d000000000000000000000000000000000000000000000000000000008352602060048401526024830190610e9c565b0390fd5b7f827e6c75000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461017b5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b576100186004356108f38161015d565b6024356108ff8161015d565b6044359060643592610f0e565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b5760043567ffffffffffffffff811161017b57610956903690600401610264565b6024359167ffffffffffffffff831161017b5761097a610018933690600401610264565b9290916119bd565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606091011261017b576004356109b88161015d565b906024356109c58161015d565b9060443590565b3461017b576100186109dd36610982565b91339061134e565b3461017b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b5760043580421015610a2157005b7faa2fd925000000000000000000000000000000000000000000000000000000005f526004524260245260445ffd5b3461017b57610018610a6136610982565b9161124d565b8015150361017b57565b3461017b5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b57600435610aac8161015d565b6024359067ffffffffffffffff821161017b57610ad06100189236906004016106d1565b9060443592610ade84610a67565b611d40565b60a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b5760043567ffffffffffffffff811161017b57610b2d903690600401610264565b60243591610b3a8361015d565b60443567ffffffffffffffff811161017b57610b5a9036906004016106d1565b60643591610b6783610a67565b6084359567ffffffffffffffff871161017b57610b8b610018973690600401610264565b969095610edf565b3461017b57610018610ba436610982565b913390611e9f565b3461017b5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b57600435610be78161015d565b60243567ffffffffffffffff811161017b57610c079036906004016106d1565b916044359267ffffffffffffffff841161017b57610c2c6100189436906004016106d1565b93909233906115de565b3461017b57610018610c4736610660565b92919091611e9f565b3560ff8116810361017b5790565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561017b570180359067ffffffffffffffff821161017b57602001918160051b3603831361017b57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9190811015610d1f5760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff218136030182121561017b570190565b610cb2565b35610d2e8161015d565b90565b35610d2e81610a67565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60e0810190811067ffffffffffffffff821117610d8457604052565b610d3b565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610d8457604052565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561017b570180359067ffffffffffffffff821161017b5760200191813603831361017b57565b9093929384831161017b57841161017b578101920390565b67ffffffffffffffff8111610d8457601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b3d15610e97573d90610e7e82610e33565b91610e8c6040519384610d89565b82523d5f602084013e565b606090565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602080948051918291828752018686015e5f8582860101520116010190565b95610ef29791610ade93949596976119bd565b565b9081602091031261017b575190565b6040513d5f823e3d90fd5b91929092604051907efdd58e00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff8516600483015280602483015260208260448173ffffffffffffffffffffffffffffffffffffffff88165afa91821561102d575f92610ffc575b50828210610f96575050505050565b6040517fbf8ee56100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff948516600482015294909316602485015260448401929092526064830191909152608482015260a490fd5b61101f91925060203d602011611026575b6110178183610d89565b810190610ef4565b905f610f87565b503d61100d565b610f03565b80319082821061104157505050565b73ffffffffffffffffffffffffffffffffffffffff907f1afe1f42000000000000000000000000000000000000000000000000000000005f521660045260245260445260645ffd5b9081602091031261017b5751610d2e81610a67565b6040517fe985e9c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015284811660248301529190911690602081604481855afa90811561102d575f9161115c575b501561111057505050565b73ffffffffffffffffffffffffffffffffffffffff929183917f628b17c6000000000000000000000000000000000000000000000000000000005f52600452166024521660445260645ffd5b61117e915060203d602011611184575b6111768183610d89565b810190611089565b5f611105565b503d61116c565b92611247917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6101009380604051978895602087019a60808c52600e60a08901527f7374617469632d73656374696f6e00000000000000000000000000000000000060c08901526040880152606087015260c060808701528160e0870152868601375f8582860101520116810103017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610d89565b51902090565b919091604051917f70a0823100000000000000000000000000000000000000000000000000000000835273ffffffffffffffffffffffffffffffffffffffff8416600484015260208360248173ffffffffffffffffffffffffffffffffffffffff86165afa92831561102d575f9361132d575b508083106112ce5750505050565b60606040519485947f7684050d00000000000000000000000000000000000000000000000000000000865273ffffffffffffffffffffffffffffffffffffffff6004870192816080850197168452166020830152604082015201520390fd5b61134791935060203d602011611026576110178183610d89565b915f6112c0565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015284811660248301529190911693929091602083604481885afa92831561102d575f93611427575b508383106113c7575050505050565b60a495509073ffffffffffffffffffffffffffffffffffffffff8092604051967f73cf338a000000000000000000000000000000000000000000000000000000008852600488015216602486015216604484015260648301526084820152fd5b61144191935060203d602011611026576110178183610d89565b915f6113b8565b67ffffffffffffffff8111610d845760051b60200190565b9061146a82611448565b6114776040519182610d89565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06114a58294611448565b0190602036910137565b8051821015610d1f5760209160051b010190565b60208183031261017b5780519067ffffffffffffffff821161017b57019080601f8301121561017b5781516114f781611448565b926115056040519485610d89565b81845260208085019260051b82010192831161017b57602001905b82821061152d5750505090565b8151815260209182019101611520565b604081016040825282518091526020606083019301905f5b8181106115a25750505060208183039101528281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161017b5760209260051b809284830137010190565b825173ffffffffffffffffffffffffffffffffffffffff16855260209485019490920191600101611555565b9190811015610d1f5760051b0190565b919093929385850361174c579084916115f683611460565b905f5b848110611711575050925f929173ffffffffffffffffffffffffffffffffffffffff61165595604051968795869485937f4e1273f40000000000000000000000000000000000000000000000000000000085526004850161153d565b0392165afa90811561102d575f916116ef575b505f5b838110611679575050505050565b61168381836114af565b5161168f8287866115ce565b351161169d5760010161166b565b826116b782876116b0826116ec976114af565b51936115ce565b7fe3758044000000000000000000000000000000000000000000000000000000005f5260049290925260245235604452606490565b5ffd5b61170b91503d805f833e6117038183610d89565b8101906114c3565b5f611668565b829394506117418261172683600195966114af565b9073ffffffffffffffffffffffffffffffffffffffff169052565b0190869392916115f9565b7fab8b67c6000000000000000000000000000000000000000000000000000000005f526004859052602486905260445ffd5b92919261178a82610e33565b916117986040519384610d89565b82948184528183011161017b578281602093845f960137010152565b9080602083519182815201916020808360051b8301019401925f915b8383106117df57505050505090565b9091929394602080827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0856001950301865288519073ffffffffffffffffffffffffffffffffffffffff8251168152828201518382015260c080611852604085015160e0604086015260e0850190610e9c565b936060810151606085015260808101511515608085015260a0810151151560a08501520151910152970193019301919392906117d0565b90602080835192838152019201905f5b8181106118a65750505090565b825173ffffffffffffffffffffffffffffffffffffffff16845260209384019390920191600101611899565b805160ff168252610d2e9160208281015115159082015261010061193061190a604085015161012060408601526101208501906117b4565b606085015160608501526080850151608085015260a085015184820360a0860152610e9c565b9260c081015160c084015260e081015160e0840152015190610100818403910152611889565b61196e604092959493956060835260608301906118d2565b9460208201520152565b610d2e9392606092825260208201528160408201520190610e9c565b6119aa610d2e94926060835260608301906118d2565b9260208201526040818403910152610e9c565b906119c79161217a565b6119f26119d38261243b565b6119de36868661177e565b60208151910120905f5260205260405f2090565b916119fd8482612547565b915f926040850192835151975f5b898110611a1f575b50505050505050505050565b808414611d29575b611a328187516114af565b5196611a4160a0890151151590565b80611d21575b611ce157505f966060810151801590811580611cd8575b611ca057608083018051151580611c61575b611c34575115611beb5790611ab191611a9d845173ffffffffffffffffffffffffffffffffffffffff1690565b9115611be657505a5b604084015191612b1c565b15611af4575b50604080518a815260208101839052600192917f5a589b1d8062f33451d29cae3dabd9b2e36c62aee644178c600977ca8dda661a91a15b01611a0b565b60c001805115611ba9576001815114611b6a5751600214611b15575f611ab7565b9796505050505050507fc2c704302430fe0dc8d95f272e2f4e54bbbc51a3327fd5d75ab41f9fc8fd129b9250611b58611b4c612b2d565b60405193849384611978565b0390a15f808080808080808080611a13565b5087610889611b77612b2d565b6040519384937f7f6b0bb100000000000000000000000000000000000000000000000000000000855260048501611994565b509550600180967f115f347c00e69f252cd6b63c4f81022a9564c6befe8aa719cb74640a4a306f0d818b611bde611b4c612b2d565b0390a1611aee565b611aa6565b611c2991611c0d845173ffffffffffffffffffffffffffffffffffffffff1690565b916020850151915f14611c2e57505a905b604085015192612b0b565b611ab1565b90611c1e565b7f230d1ccc000000000000000000000000000000000000000000000000000000005f52600485905260245ffd5b5073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163014611a70565b838b6108895a6040519384937f2139527400000000000000000000000000000000000000000000000000000000855260048501611956565b50805a10611a5e565b604080518b815260208101849052919850600192917f9ae934bf8a986157c889a24c3b3fa85e74b7e4ee4b1f8fc6e7362cb4c1d19d8b9181908101611bde565b508015611a47565b91928193611d3892868a6125ac565b929091611a27565b91929173ffffffffffffffffffffffffffffffffffffffff8116611e84575033925b5f5b818110611dc55750505080611dbc575b611d7b5750565b5f8080809347905af1611d8c610e6d565b5015611d9457565b7fd92fb848000000000000000000000000000000000000000000000000000000005f5260045ffd5b50471515611d74565b611df4611ddb611dd68385876115ce565b610d24565b73ffffffffffffffffffffffffffffffffffffffff1690565b90611e09611ddb611ddb611dd68487896115ce565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529290602090849060249082905afa801561102d5787611e5e926001955f93611e64575b50612b47565b01611d64565b611e7d91935060203d8111611026576110178183610d89565b915f611e58565b92611d62565b9081602091031261017b5751610d2e8161015d565b919073ffffffffffffffffffffffffffffffffffffffff83166040517f081812fc00000000000000000000000000000000000000000000000000000000815260208180611ef489600483019190602083019252565b0381855afa90811561102d575f91612020575b5073ffffffffffffffffffffffffffffffffffffffff808516911614159081611f93575b50611f365750505050565b6040517f6a7e2cc800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9384166004820152602481019490945282166044840152166064820152608490fd5b6040517fe985e9c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152851660248201529150602090829060449082905afa90811561102d575f91612001575b50155f611f2b565b61201a915060203d602011611184576111768183610d89565b5f611ff9565b612042915060203d602011612048575b61203a8183610d89565b810190611e8a565b5f611f07565b503d612030565b60405190610120820182811067ffffffffffffffff821117610d84576040526060610100835f81525f60208201528260408201525f838201525f60808201528260a08201525f60c08201525f60e08201520152565b906120ae82611448565b6120bb6040519182610d89565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06120e98294611448565b01905f5b8281106120f957505050565b60209060405161210881610d68565b5f81525f83820152606060408201525f60608201525f60808201525f60a08201525f60c0820152828285010152016120ed565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9190820180921161217557565b61213b565b91909161218561204f565b5f815292600190823560f81c827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183160161242457505f60608701525b60076121d260ff831660011c90565b16806123d3575b5060108181160361239e57506001925b6121f2846120a4565b92604087019384525f905b85821061220c57505050505050565b8281013560f81c9060010190918160018085160361237c5750612250306122348389516114af565b519073ffffffffffffffffffffffffffffffffffffffff169052565b60028084161461235c575b60048084161461230e575b6008808416146122db575b6122c46122be60c08561229d8a60806122948860108060019c9d161493516114af565b51019015159052565b6122b48a60a06122948860208087161493516114af565b1660061c60031690565b60ff1690565b60c06122d18389516114af565b51015201906121fd565b6001916122c4906122be9060c090878101359060200196906060612300878d516114af565b510152959450505050612271565b90612356908481013560e81c9060030161234f61233661232e8484612168565b838a8a610e1b565b91906040612345888d516114af565b510192369161177e565b9052612168565b90612266565b908381013590602001919060206123748389516114af565b51015261225b565b61239992508481013560601c9060140192906122348389516114af565b612250565b6020908116036123c05761ffff918381013560f01c906002015b9216926121e9565b60ff918381013560f81c906001016123b8565b612417919385929190928160031b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001821b019185013590610100031c16920190565b929060808701525f6121d9565b80850135606090811c9088015260140192506121c3565b60208101511561252c5761045d6112476124ea5f5b60405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83527f4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c5631860408301527f2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de606083015260808201523060a082015260a081526124e160c082610d89565b51902093612c53565b60405192839160208301958690916042927f19010000000000000000000000000000000000000000000000000000000000008352600283015260228201520190565b61045d6112476124ea46612450565b90821015610d1f570190565b919015612558576001913560f81c90565b5f91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146121755760010190565b94909193926125c6905b8381013560f81c91600190910190565b60ff819216918215612a865785918891600b85116129f257508086013560f01c93600290910192908390600181036126205750509260406126106125c6958261261b9501516114af565b510151903091612e45565b6125b6565b6002810361264b5750509260406126406125c6958261261b9501516114af565b510151903391612e45565b6003810361267657505092604061266b6125c6958261261b9501516114af565b510151903291612e45565b600481036126a15750509260406126966125c6958261261b9501516114af565b510151904791612e2c565b600581036126cd5750509260406126c16125c6958261261b9501516114af565b51015190333191612e2c565b600681036126f95750509260406126ed6125c6958261261b9501516114af565b51015190323191612e2c565b6007810361273557506125c6949361261b93508781013560601c9250601401905092604061272a89828d01516114af565b510151913191612e2c565b600881036127f157505050508381013560601c9060140190604061275c87828b01516114af565b5101516040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529093909160209083908173ffffffffffffffffffffffffffffffffffffffff81602481015b0392165afa90811561102d576125c69461261b935f936127d1575b50612e2c565b6127ea91935060203d8111611026576110178183610d89565b915f6127cb565b6009810361287057505050508381013560601c9060140190604061281887828b01516114af565b5101516040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201529093909160209083908173ffffffffffffffffffffffffffffffffffffffff81602481016127b0565b600a810361290757505050508381013560601c9060140190604061289787828b01516114af565b5101516040517f70a08231000000000000000000000000000000000000000000000000000000008152326004820152909390916020908390602490829073ffffffffffffffffffffffffffffffffffffffff165afa90811561102d576125c69461261b935f936127d15750612e2c565b93949293600b14612920575b505050506125c6906125b6565b6040945073ffffffffffffffffffffffffffffffffffffffff92916020916129c791612967918891612971918c81013560601c906014019094818e013560601c9160140190565b99909a01516114af565b510151966040519586809481937f70a082310000000000000000000000000000000000000000000000000000000083526004830191909173ffffffffffffffffffffffffffffffffffffffff6020820193169052565b0392165afa90811561102d576125c6946129e7935f936127d15750612e2c565b9050855f8581612913565b9392505050600c8103612a1657506125c69061261b336122348760408b01516114af565b600d8103612a3557506125c69061261b326122348760408b01516114af565b600e8103612a5b57506125c690476020612a538760408b01516114af565b5101526125b6565b7f324dd124000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b96505050929150838281105f14612ae457612ad4612aae6122be92612ae095612ada9561253b565b357fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b9261257f565b9190565b5050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b915f9391849360208451940192f190565b915f9291839260208351930191f490565b3d90604051916020818401016040528083525f602084013e565b9173ffffffffffffffffffffffffffffffffffffffff604051927fa9059cbb000000000000000000000000000000000000000000000000000000005f521660045260245260205f60448180865af160015f5114811615612bf1575b60409190915215612bb05750565b7f5274afe7000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff1660045260245ffd5b6001811516612c07573d15833b15151616612ba2565b503d5f823e3d90fd5b80516020909101905f5b818110612c275750505090565b825173ffffffffffffffffffffffffffffffffffffffff16845260209384019390920191600101612c1a565b610100810151604051612c6e8161045d602082018095612c10565b51902090612c7d815160ff1690565b60ff811680612cf657505090611247612c996040840151612ea3565b9261045d60806060830151920151936040519485936020850197889094939260809260a08301967f11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a284526020840152604083015260608201520152565b60018103612d5457505060a001518051602091820120604080517fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d46693810193845290810191909152606081019290925290611247816080810161045d565b60028103612daa57505060c00151604080517f11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e460208201908152918101929092526060820192909252611247816080810161045d565b600303612dfe575060e00151604080517fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d46660208201908152918101929092526060820192909252611247816080810161045d565b7f04818320000000000000000000000000000000000000000000000000000000005f5260ff1660045260245ffd5b908151602082019082821091111761017b570160200152565b908151601482019082821091111761017b576020910101906bffffffffffffffffffffffff8251169060601b179052565b80516020909101905f5b818110612e8d5750505090565b8251845260209384019390920191600101612e80565b9081517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0612ee9612ed383611448565b92612ee16040519485610d89565b808452611448565b013660208301375f5b8351811015612fc45780612f08600192866114af565b5173ffffffffffffffffffffffffffffffffffffffff81511690602081015190604081015160208151910120906060810151608082015115159060c060a08401511515930151936040519560208701977f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef437895260408801526060870152608086015260a085015260c084015260e08301526101008201526101008152612fb061012082610d89565b519020612fbd82856114af565b5201612ef2565b509091506040516112478161045d602082018095612e7656fea264697066735822122001031968cb5ed5075c2647347ed676838da85e531feafbedf6b1c523eefc070864736f6c634300081e0033","sourceMap":"615:71:43:-:0;;;;;;;3100:4:44;3092:13;;615:71:43;;;;;;3092:13:44;615:71:43;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c806284290d1461015857806303bbbd65146101535780630cb17e5c1461014e57806313792a4a146101495780632ab793d714610144578063333f790d1461013f578063372618cb1461013a57806342ab921e14610135578063476a5f40146101305780634c4e814c1461012b578063505c7ed3146101265780636d42cf03146101215780636ef1f0dd1461011c5780637f29d538146101175780638d0a9ea714610112578063a7b7ec5a1461010d578063bd1e4acb14610108578063e246466a14610103578063fdc25428146100fe5763fe08e7ca0361000e57610c36565b610bac565b610b93565b610ae3565b610a71565b610a50565b6109e5565b6109cc565b61090c565b6108b5565b610796565b610702565b6106b7565b610617565b6105dc565b610580565b610292565b610212565b6101cb565b61017f565b73ffffffffffffffffffffffffffffffffffffffff81160361017b57565b5f80fd5b3461017b5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b576100186004356101bd8161015d565b602435604435913390610f0e565b3461017b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b576100186004356102098161015d565b60243590611032565b3461017b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b576100186004356102508161015d565b6024359061025d8261015d565b339061109e565b9181601f8401121561017b5782359167ffffffffffffffff831161017b576020838186019501011161017b57565b3461017b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b5760043567ffffffffffffffff811161017b5780600401906101207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc823603011261017b5760243567ffffffffffffffff811161017b57610325903690600401610264565b60ff61033085610c50565b1661055857919061036261035460648401356084850135905f5260205260405f2090565b46905f5260205260405f2090565b9060445f9301915b6103748387610c5e565b90508410156104a1576104996001918561039881610392888c610c5e565b90610cdf565b6104896103a482610d24565b61045d6020840135936060810135906103bf60808201610d31565b60c06103cd60a08401610d31565b92013592604051978896602088019a8b93909796959273ffffffffffffffffffffffffffffffffffffffff60e09693610100875260046101008801527f63616c6c0000000000000000000000000000000000000000000000000000000061012088015261014087019a602088015216604086015260608501526080840152151560a0830152151560c08201520152565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610d89565b519020905f5260205260405f2090565b93019261036a565b939250905f5b8381106104b957604051858152602090f35b82939461054261ffff61050a61053a8a8861053061052660ff6103928c61051e8a9e9f61054f9e6104f59160019092919283013560f81c920190565b9416998a948881013560f01c91600290910190565b9b169a8b9781013560f01c91600290910190565b9e1696610c5e565b6040810190610dca565b9092820192610e1b565b92909161118b565b905f5260205260405f2090565b939291906104a7565b7f3c28730f000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461017b5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b576100186004356105be8161015d565b6024356105ca8161015d565b604435916105d78361015d565b61109e565b3461017b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b5761001860043533611032565b3461017b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b576100186004356106558161015d565b60243590339061124d565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc608091011261017b576004356106968161015d565b906024356106a38161015d565b906044356106b08161015d565b9060643590565b3461017b576100186106c836610660565b9291909161134e565b9181601f8401121561017b5782359167ffffffffffffffff831161017b576020808501948460051b01011161017b57565b3461017b5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b5760043561073d8161015d565b6024356107498161015d565b60443567ffffffffffffffff811161017b576107699036906004016106d1565b606435939167ffffffffffffffff851161017b5761078e6100189536906004016106d1565b9490936115de565b3461017b5760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b5760a43567ffffffffffffffff811161017b576107e5903690600401610264565b907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8116301461088d57825f939284936040519283928337810184815203915af4610843610e6d565b901561084b57005b610889906040519182917ff7a01e4d000000000000000000000000000000000000000000000000000000008352602060048401526024830190610e9c565b0390fd5b7f827e6c75000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461017b5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b576100186004356108f38161015d565b6024356108ff8161015d565b6044359060643592610f0e565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b5760043567ffffffffffffffff811161017b57610956903690600401610264565b6024359167ffffffffffffffff831161017b5761097a610018933690600401610264565b9290916119bd565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606091011261017b576004356109b88161015d565b906024356109c58161015d565b9060443590565b3461017b576100186109dd36610982565b91339061134e565b3461017b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b5760043580421015610a2157005b7faa2fd925000000000000000000000000000000000000000000000000000000005f526004524260245260445ffd5b3461017b57610018610a6136610982565b9161124d565b8015150361017b57565b3461017b5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b57600435610aac8161015d565b6024359067ffffffffffffffff821161017b57610ad06100189236906004016106d1565b9060443592610ade84610a67565b611d40565b60a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b5760043567ffffffffffffffff811161017b57610b2d903690600401610264565b60243591610b3a8361015d565b60443567ffffffffffffffff811161017b57610b5a9036906004016106d1565b60643591610b6783610a67565b6084359567ffffffffffffffff871161017b57610b8b610018973690600401610264565b969095610edf565b3461017b57610018610ba436610982565b913390611e9f565b3461017b5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b57600435610be78161015d565b60243567ffffffffffffffff811161017b57610c079036906004016106d1565b916044359267ffffffffffffffff841161017b57610c2c6100189436906004016106d1565b93909233906115de565b3461017b57610018610c4736610660565b92919091611e9f565b3560ff8116810361017b5790565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561017b570180359067ffffffffffffffff821161017b57602001918160051b3603831361017b57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9190811015610d1f5760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff218136030182121561017b570190565b610cb2565b35610d2e8161015d565b90565b35610d2e81610a67565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60e0810190811067ffffffffffffffff821117610d8457604052565b610d3b565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610d8457604052565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561017b570180359067ffffffffffffffff821161017b5760200191813603831361017b57565b9093929384831161017b57841161017b578101920390565b67ffffffffffffffff8111610d8457601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b3d15610e97573d90610e7e82610e33565b91610e8c6040519384610d89565b82523d5f602084013e565b606090565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602080948051918291828752018686015e5f8582860101520116010190565b95610ef29791610ade93949596976119bd565b565b9081602091031261017b575190565b6040513d5f823e3d90fd5b91929092604051907efdd58e00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff8516600483015280602483015260208260448173ffffffffffffffffffffffffffffffffffffffff88165afa91821561102d575f92610ffc575b50828210610f96575050505050565b6040517fbf8ee56100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff948516600482015294909316602485015260448401929092526064830191909152608482015260a490fd5b61101f91925060203d602011611026575b6110178183610d89565b810190610ef4565b905f610f87565b503d61100d565b610f03565b80319082821061104157505050565b73ffffffffffffffffffffffffffffffffffffffff907f1afe1f42000000000000000000000000000000000000000000000000000000005f521660045260245260445260645ffd5b9081602091031261017b5751610d2e81610a67565b6040517fe985e9c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015284811660248301529190911690602081604481855afa90811561102d575f9161115c575b501561111057505050565b73ffffffffffffffffffffffffffffffffffffffff929183917f628b17c6000000000000000000000000000000000000000000000000000000005f52600452166024521660445260645ffd5b61117e915060203d602011611184575b6111768183610d89565b810190611089565b5f611105565b503d61116c565b92611247917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6101009380604051978895602087019a60808c52600e60a08901527f7374617469632d73656374696f6e00000000000000000000000000000000000060c08901526040880152606087015260c060808701528160e0870152868601375f8582860101520116810103017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610d89565b51902090565b919091604051917f70a0823100000000000000000000000000000000000000000000000000000000835273ffffffffffffffffffffffffffffffffffffffff8416600484015260208360248173ffffffffffffffffffffffffffffffffffffffff86165afa92831561102d575f9361132d575b508083106112ce5750505050565b60606040519485947f7684050d00000000000000000000000000000000000000000000000000000000865273ffffffffffffffffffffffffffffffffffffffff6004870192816080850197168452166020830152604082015201520390fd5b61134791935060203d602011611026576110178183610d89565b915f6112c0565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015284811660248301529190911693929091602083604481885afa92831561102d575f93611427575b508383106113c7575050505050565b60a495509073ffffffffffffffffffffffffffffffffffffffff8092604051967f73cf338a000000000000000000000000000000000000000000000000000000008852600488015216602486015216604484015260648301526084820152fd5b61144191935060203d602011611026576110178183610d89565b915f6113b8565b67ffffffffffffffff8111610d845760051b60200190565b9061146a82611448565b6114776040519182610d89565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06114a58294611448565b0190602036910137565b8051821015610d1f5760209160051b010190565b60208183031261017b5780519067ffffffffffffffff821161017b57019080601f8301121561017b5781516114f781611448565b926115056040519485610d89565b81845260208085019260051b82010192831161017b57602001905b82821061152d5750505090565b8151815260209182019101611520565b604081016040825282518091526020606083019301905f5b8181106115a25750505060208183039101528281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161017b5760209260051b809284830137010190565b825173ffffffffffffffffffffffffffffffffffffffff16855260209485019490920191600101611555565b9190811015610d1f5760051b0190565b919093929385850361174c579084916115f683611460565b905f5b848110611711575050925f929173ffffffffffffffffffffffffffffffffffffffff61165595604051968795869485937f4e1273f40000000000000000000000000000000000000000000000000000000085526004850161153d565b0392165afa90811561102d575f916116ef575b505f5b838110611679575050505050565b61168381836114af565b5161168f8287866115ce565b351161169d5760010161166b565b826116b782876116b0826116ec976114af565b51936115ce565b7fe3758044000000000000000000000000000000000000000000000000000000005f5260049290925260245235604452606490565b5ffd5b61170b91503d805f833e6117038183610d89565b8101906114c3565b5f611668565b829394506117418261172683600195966114af565b9073ffffffffffffffffffffffffffffffffffffffff169052565b0190869392916115f9565b7fab8b67c6000000000000000000000000000000000000000000000000000000005f526004859052602486905260445ffd5b92919261178a82610e33565b916117986040519384610d89565b82948184528183011161017b578281602093845f960137010152565b9080602083519182815201916020808360051b8301019401925f915b8383106117df57505050505090565b9091929394602080827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0856001950301865288519073ffffffffffffffffffffffffffffffffffffffff8251168152828201518382015260c080611852604085015160e0604086015260e0850190610e9c565b936060810151606085015260808101511515608085015260a0810151151560a08501520151910152970193019301919392906117d0565b90602080835192838152019201905f5b8181106118a65750505090565b825173ffffffffffffffffffffffffffffffffffffffff16845260209384019390920191600101611899565b805160ff168252610d2e9160208281015115159082015261010061193061190a604085015161012060408601526101208501906117b4565b606085015160608501526080850151608085015260a085015184820360a0860152610e9c565b9260c081015160c084015260e081015160e0840152015190610100818403910152611889565b61196e604092959493956060835260608301906118d2565b9460208201520152565b610d2e9392606092825260208201528160408201520190610e9c565b6119aa610d2e94926060835260608301906118d2565b9260208201526040818403910152610e9c565b906119c79161217a565b6119f26119d38261243b565b6119de36868661177e565b60208151910120905f5260205260405f2090565b916119fd8482612547565b915f926040850192835151975f5b898110611a1f575b50505050505050505050565b808414611d29575b611a328187516114af565b5196611a4160a0890151151590565b80611d21575b611ce157505f966060810151801590811580611cd8575b611ca057608083018051151580611c61575b611c34575115611beb5790611ab191611a9d845173ffffffffffffffffffffffffffffffffffffffff1690565b9115611be657505a5b604084015191612b1c565b15611af4575b50604080518a815260208101839052600192917f5a589b1d8062f33451d29cae3dabd9b2e36c62aee644178c600977ca8dda661a91a15b01611a0b565b60c001805115611ba9576001815114611b6a5751600214611b15575f611ab7565b9796505050505050507fc2c704302430fe0dc8d95f272e2f4e54bbbc51a3327fd5d75ab41f9fc8fd129b9250611b58611b4c612b2d565b60405193849384611978565b0390a15f808080808080808080611a13565b5087610889611b77612b2d565b6040519384937f7f6b0bb100000000000000000000000000000000000000000000000000000000855260048501611994565b509550600180967f115f347c00e69f252cd6b63c4f81022a9564c6befe8aa719cb74640a4a306f0d818b611bde611b4c612b2d565b0390a1611aee565b611aa6565b611c2991611c0d845173ffffffffffffffffffffffffffffffffffffffff1690565b916020850151915f14611c2e57505a905b604085015192612b0b565b611ab1565b90611c1e565b7f230d1ccc000000000000000000000000000000000000000000000000000000005f52600485905260245ffd5b5073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163014611a70565b838b6108895a6040519384937f2139527400000000000000000000000000000000000000000000000000000000855260048501611956565b50805a10611a5e565b604080518b815260208101849052919850600192917f9ae934bf8a986157c889a24c3b3fa85e74b7e4ee4b1f8fc6e7362cb4c1d19d8b9181908101611bde565b508015611a47565b91928193611d3892868a6125ac565b929091611a27565b91929173ffffffffffffffffffffffffffffffffffffffff8116611e84575033925b5f5b818110611dc55750505080611dbc575b611d7b5750565b5f8080809347905af1611d8c610e6d565b5015611d9457565b7fd92fb848000000000000000000000000000000000000000000000000000000005f5260045ffd5b50471515611d74565b611df4611ddb611dd68385876115ce565b610d24565b73ffffffffffffffffffffffffffffffffffffffff1690565b90611e09611ddb611ddb611dd68487896115ce565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529290602090849060249082905afa801561102d5787611e5e926001955f93611e64575b50612b47565b01611d64565b611e7d91935060203d8111611026576110178183610d89565b915f611e58565b92611d62565b9081602091031261017b5751610d2e8161015d565b919073ffffffffffffffffffffffffffffffffffffffff83166040517f081812fc00000000000000000000000000000000000000000000000000000000815260208180611ef489600483019190602083019252565b0381855afa90811561102d575f91612020575b5073ffffffffffffffffffffffffffffffffffffffff808516911614159081611f93575b50611f365750505050565b6040517f6a7e2cc800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9384166004820152602481019490945282166044840152166064820152608490fd5b6040517fe985e9c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152851660248201529150602090829060449082905afa90811561102d575f91612001575b50155f611f2b565b61201a915060203d602011611184576111768183610d89565b5f611ff9565b612042915060203d602011612048575b61203a8183610d89565b810190611e8a565b5f611f07565b503d612030565b60405190610120820182811067ffffffffffffffff821117610d84576040526060610100835f81525f60208201528260408201525f838201525f60808201528260a08201525f60c08201525f60e08201520152565b906120ae82611448565b6120bb6040519182610d89565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06120e98294611448565b01905f5b8281106120f957505050565b60209060405161210881610d68565b5f81525f83820152606060408201525f60608201525f60808201525f60a08201525f60c0820152828285010152016120ed565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9190820180921161217557565b61213b565b91909161218561204f565b5f815292600190823560f81c827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183160161242457505f60608701525b60076121d260ff831660011c90565b16806123d3575b5060108181160361239e57506001925b6121f2846120a4565b92604087019384525f905b85821061220c57505050505050565b8281013560f81c9060010190918160018085160361237c5750612250306122348389516114af565b519073ffffffffffffffffffffffffffffffffffffffff169052565b60028084161461235c575b60048084161461230e575b6008808416146122db575b6122c46122be60c08561229d8a60806122948860108060019c9d161493516114af565b51019015159052565b6122b48a60a06122948860208087161493516114af565b1660061c60031690565b60ff1690565b60c06122d18389516114af565b51015201906121fd565b6001916122c4906122be9060c090878101359060200196906060612300878d516114af565b510152959450505050612271565b90612356908481013560e81c9060030161234f61233661232e8484612168565b838a8a610e1b565b91906040612345888d516114af565b510192369161177e565b9052612168565b90612266565b908381013590602001919060206123748389516114af565b51015261225b565b61239992508481013560601c9060140192906122348389516114af565b612250565b6020908116036123c05761ffff918381013560f01c906002015b9216926121e9565b60ff918381013560f81c906001016123b8565b612417919385929190928160031b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001821b019185013590610100031c16920190565b929060808701525f6121d9565b80850135606090811c9088015260140192506121c3565b60208101511561252c5761045d6112476124ea5f5b60405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83527f4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c5631860408301527f2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de606083015260808201523060a082015260a081526124e160c082610d89565b51902093612c53565b60405192839160208301958690916042927f19010000000000000000000000000000000000000000000000000000000000008352600283015260228201520190565b61045d6112476124ea46612450565b90821015610d1f570190565b919015612558576001913560f81c90565b5f91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146121755760010190565b94909193926125c6905b8381013560f81c91600190910190565b60ff819216918215612a865785918891600b85116129f257508086013560f01c93600290910192908390600181036126205750509260406126106125c6958261261b9501516114af565b510151903091612e45565b6125b6565b6002810361264b5750509260406126406125c6958261261b9501516114af565b510151903391612e45565b6003810361267657505092604061266b6125c6958261261b9501516114af565b510151903291612e45565b600481036126a15750509260406126966125c6958261261b9501516114af565b510151904791612e2c565b600581036126cd5750509260406126c16125c6958261261b9501516114af565b51015190333191612e2c565b600681036126f95750509260406126ed6125c6958261261b9501516114af565b51015190323191612e2c565b6007810361273557506125c6949361261b93508781013560601c9250601401905092604061272a89828d01516114af565b510151913191612e2c565b600881036127f157505050508381013560601c9060140190604061275c87828b01516114af565b5101516040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529093909160209083908173ffffffffffffffffffffffffffffffffffffffff81602481015b0392165afa90811561102d576125c69461261b935f936127d1575b50612e2c565b6127ea91935060203d8111611026576110178183610d89565b915f6127cb565b6009810361287057505050508381013560601c9060140190604061281887828b01516114af565b5101516040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201529093909160209083908173ffffffffffffffffffffffffffffffffffffffff81602481016127b0565b600a810361290757505050508381013560601c9060140190604061289787828b01516114af565b5101516040517f70a08231000000000000000000000000000000000000000000000000000000008152326004820152909390916020908390602490829073ffffffffffffffffffffffffffffffffffffffff165afa90811561102d576125c69461261b935f936127d15750612e2c565b93949293600b14612920575b505050506125c6906125b6565b6040945073ffffffffffffffffffffffffffffffffffffffff92916020916129c791612967918891612971918c81013560601c906014019094818e013560601c9160140190565b99909a01516114af565b510151966040519586809481937f70a082310000000000000000000000000000000000000000000000000000000083526004830191909173ffffffffffffffffffffffffffffffffffffffff6020820193169052565b0392165afa90811561102d576125c6946129e7935f936127d15750612e2c565b9050855f8581612913565b9392505050600c8103612a1657506125c69061261b336122348760408b01516114af565b600d8103612a3557506125c69061261b326122348760408b01516114af565b600e8103612a5b57506125c690476020612a538760408b01516114af565b5101526125b6565b7f324dd124000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b96505050929150838281105f14612ae457612ad4612aae6122be92612ae095612ada9561253b565b357fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b9261257f565b9190565b5050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b915f9391849360208451940192f190565b915f9291839260208351930191f490565b3d90604051916020818401016040528083525f602084013e565b9173ffffffffffffffffffffffffffffffffffffffff604051927fa9059cbb000000000000000000000000000000000000000000000000000000005f521660045260245260205f60448180865af160015f5114811615612bf1575b60409190915215612bb05750565b7f5274afe7000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff1660045260245ffd5b6001811516612c07573d15833b15151616612ba2565b503d5f823e3d90fd5b80516020909101905f5b818110612c275750505090565b825173ffffffffffffffffffffffffffffffffffffffff16845260209384019390920191600101612c1a565b610100810151604051612c6e8161045d602082018095612c10565b51902090612c7d815160ff1690565b60ff811680612cf657505090611247612c996040840151612ea3565b9261045d60806060830151920151936040519485936020850197889094939260809260a08301967f11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a284526020840152604083015260608201520152565b60018103612d5457505060a001518051602091820120604080517fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d46693810193845290810191909152606081019290925290611247816080810161045d565b60028103612daa57505060c00151604080517f11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e460208201908152918101929092526060820192909252611247816080810161045d565b600303612dfe575060e00151604080517fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d46660208201908152918101929092526060820192909252611247816080810161045d565b7f04818320000000000000000000000000000000000000000000000000000000005f5260ff1660045260245ffd5b908151602082019082821091111761017b570160200152565b908151601482019082821091111761017b576020910101906bffffffffffffffffffffffff8251169060601b179052565b80516020909101905f5b818110612e8d5750505090565b8251845260209384019390920191600101612e80565b9081517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0612ee9612ed383611448565b92612ee16040519485610d89565b808452611448565b013660208301375f5b8351811015612fc45780612f08600192866114af565b5173ffffffffffffffffffffffffffffffffffffffff81511690602081015190604081015160208151910120906060810151608082015115159060c060a08401511515930151936040519560208701977f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef437895260408801526060870152608086015260a085015260c084015260e08301526101008201526101008152612fb061012082610d89565b519020612fbd82856114af565b5201612ef2565b509091506040516112478161045d602082018095612e7656fea264697066735822122001031968cb5ed5075c2647347ed676838da85e531feafbedf6b1c523eefc070864736f6c634300081e0033","sourceMap":"615:71:43:-:0;;;;;;;;;-1:-1:-1;615:71:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;:::o;:::-;;;;;;;;;;;;;;;6588:10:46;615:71:43;;;;;:::i;:::-;;;;;6567:10:46;;6588;;:::i;615:71:43:-;;;;;;;;;;;4209:10:46;615:71:43;;;;;:::i;:::-;;;4209:10:46;;:::i;615:71:43:-;;;;;;;;;;;7799:8:46;615:71:43;;;;;:::i;:::-;;;;;;;:::i;:::-;7787:10:46;7799:8;;:::i;615:71:43:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1626:12:45;;;:::i;:::-;615:71:43;1622:92:45;;1791:13;;1955:49;1763:67;1791:13;;;615:71:43;1815:13:45;;;615:71:43;1763:67:45;545:85:42;;;;;;;461:173;;1763:67:45;1989:13;1955:49;545:85:42;;;;;;;461:173;;1955:49:45;2078:13;2097;-1:-1:-1;2097:13:45;;2073:369;2119:3;2097:13;;;;:::i;:::-;2093:24;;;;;;;2196:237;2321:4:29;2163:13:45;;:16;:13;;;;;:::i;:::-;:16;;:::i;:::-;2266:145;2303:7;;;:::i;:::-;2266:145;615:71:43;2312:10:45;;615:71:43;2324:13:45;1791;2324;;615:71:43;2339:17:45;;1815:13;2339:17;;;:::i;:::-;2377:20;2358:17;;;;;:::i;:::-;2377:20;;615:71:43;;;;2266:145:45;;;615:71:43;2266:145:45;;;;2321:4:29;;;;;;615:71:43;2321:4:29;;;;;;;;;;;;;;;;;;;;;;;615:71:43;;2321:4:29;;;;;;;615:71:43;2321:4:29;;;615:71:43;;;2321:4:29;;;;615:71:43;;2321:4:29;;;;;615:71:43;2321:4:29;2266:145:45;;;;;;;;;:::i;:::-;2321:4:29;2243:180:45;;2196:237;545:85:42;;;;;;;461:173;;2196:237:45;2119:3;2321:4:29;2078:13:45;;;2093:24;;;;;-1:-1:-1;2544:25:45;;;;;;615:71:43;;;;;;;;2537:457:45;683:254:41;;;2850:80:45;2321:4:29;941:256:41;2881:48:45;683:254:41;;2881:26:45;:21;615:71:43;2881:13:45;683:254:41;941:256;683:254;;;2947:38:45;683:254:41;;;798:135;683:254;;;;798:135;;;;;;;683:254;;;615:71:43;;;;;1058:135:41;;;;;;;;;;;;941:256;;2321:4:29;;;;;1058:135:41;;;;;;;;;;;941:256;;2694:45:45;2321:4:29;2881:13:45;;:::i;:21::-;615:71:43;2881:26:45;;;;:::i;:::-;2321:4:29;;;;2881:48:45;;:::i;:::-;2850:80;;;;:::i;:::-;2947:38;545:85:42;;;;;;;461:173;;2947:38:45;2537:457;;;;;;1622:92;1684:23;-1:-1:-1;1684:23:45;615:71:43;-1:-1:-1;1684:23:45;615:71:43;;;;;;;;;;;7542:8:46;615:71:43;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::i;:::-;7542:8:46;:::i;615:71:43:-;;;;;;;;;;;4408:10:46;615:71:43;;4396:10:46;4408;:::i;615:71:43:-;;;;;;;;;;;4874:10:46;615:71:43;;;;;:::i;:::-;;;4862:10:46;;4874;;:::i;615:71:43:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;5159:12:46;615:71:43;;;:::i;:::-;5159:12:46;;;;;:::i;615:71:43:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;6941:11:46;615:71:43;;;;;;:::i;:::-;6941:11:46;;;;:::i;615:71:43:-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4148:4:44;;615:71:43;;;4139:4:44;4131:21;4127:74;;615:71:43;-1:-1:-1;615:71:43;;;;;;;;;;;;;;;;4244:23:44;;;;;;:::i;:::-;4277:8;;4273:62;;615:71:43;4273:62:44;615:71:43;;;;4302:26:44;;;;;;615:71:43;;4302:26:44;;615:71:43;;;;;;:::i;:::-;4302:26:44;;;4127:74;4169:25;-1:-1:-1;4169:25:44;615:71:43;-1:-1:-1;4169:25:44;615:71:43;;;;;;;;;;;6304:10:46;615:71:43;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;6304:10:46;;:::i;615:71:43:-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;3786:14:44;615:71:43;;;;;;:::i;:::-;3786:14:44;;;;:::i;615:71:43:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;5445:12:46;615:71:43;;;:::i;:::-;5424:10:46;;5445:12;;:::i;615:71:43:-;;;;;;;;;;;;;3929:15:46;;:29;;3925:93;;615:71:43;3925:93:46;3975:36;-1:-1:-1;3975:36:46;615:71:43;;3929:15:46;615:71:43;;;-1:-1:-1;3975:36:46;615:71:43;;;;4643:10:46;615:71:43;;;:::i;:::-;4643:10:46;;:::i;615:71:43:-;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;806:11:47;615:71:43;;;;;;:::i;:::-;;;;;;;;:::i;:::-;806:11:47;:::i;615:71:43:-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;6019:7:46;615:71:43;;;:::i;:::-;5998:10:46;;6019:7;;:::i;615:71:43:-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;7281:11:46;615:71:43;;;;;;:::i;:::-;7259:10:46;;;;7281:11;;:::i;615:71:43:-;;;;5735:7:46;615:71:43;;;:::i;:::-;5735:7:46;;;;;:::i;615:71:43:-;;;;;;;;;;:::o;2321:4:29:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;;;615:71:43;2321:4:29;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;615:71:43:-;;;;;;2321:4:29;;;;615:71:43;;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;-1:-1:-1;615:71:43;;;;:::o;:::-;;;:::o;:::-;;2321:4:29;;;615:71:43;;2321:4:29;;;;;;;;615:71:43;2321:4:29;;;615:71:43;-1:-1:-1;615:71:43;;;;;;2321:4:29;;615:71:43;;;:::o;4647:317:44:-;;4947:11;4647:317;;4891:14;4647:317;;;;;4891:14;:::i;4947:11::-;4647:317::o;615:71:43:-;;;;;;;;;;;:::o;:::-;;;;;;;;;;2478:305:46;;;;;615:71:43;;2618:42:46;615:71:43;2618:42:46;;615:71:43;;;2618:42:46;;;2321:4:29;615:71:43;;;;;;;2618:42:46;615:71:43;;;;2618:42:46;;;;;;;-1:-1:-1;2618:42:46;;;2478:305;2670:20;;;;2666:113;;2478:305;;;;;:::o;2666:113::-;615:71:43;;2707:65:46;;;615:71:43;;;;2618:42:46;2707:65;;2321:4:29;615:71:43;;;;;;;2321:4:29;615:71:43;;;;;;;;;;;;;;;;;;;;4302:26:44;2618:42:46;;;;;615:71:43;2618:42:46;615:71:43;2618:42:46;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;:::i;1338:221::-;1439:14;;1463:20;;;;1459:96;;1338:221;;;:::o;1459:96::-;615:71:43;1500:48:46;;;;615:71:43;1500:48:46;2321:4:29;615:71:43;;;;;1500:48:46;;615:71:43;;;;;;;;;;;;;:::i;3511:258:46:-;615:71:43;;;3629:49:46;;615:71:43;;;;3629:49:46;;;2321:4:29;615:71:43;;;;;;2321:4:29;615:71:43;;;;;3629:49:46;615:71:43;;;;3629:49:46;;;;;;;-1:-1:-1;3629:49:46;;;3511:258;3688:11;;3684:81;;3511:258;;;:::o;3684:81::-;615:71:43;3716:42:46;;;;;-1:-1:-1;3716:42:46;3629:49;2321:4:29;615:71:43;;2321:4:29;615:71:43;;2321:4:29;615:71:43;-1:-1:-1;3716:42:46;3629:49;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3028:194:45;;3163:53;3028:194;615:71:43;2321:4:29;;3028:194:45;615:71:43;;;3163:53:45;;;;;;615:71:43;;;;;;;;2321:4:29;615:71:43;2321:4:29;;;615:71:43;;;;;;;;;2321:4:29;615:71:43;;;;;;;;2321:4:29;;;;615:71:43;-1:-1:-1;615:71:43;;;;;;2321:4:29;;615:71:43;;3163:53:45;;615:71:43;3163:53:45;;;;;;:::i;:::-;2321:4:29;3153:64:45;;3028:194;:::o;1563:264:46:-;;;;615:71:43;;1684:31:46;615:71:43;1684:31:46;;615:71:43;;;1684:31:46;;;2321:4:29;615:71:43;;1684:31:46;615:71:43;;;;1684:31:46;;;;;;;-1:-1:-1;1684:31:46;;;1563:264;1725:20;;;;1721:102;;1563:264;;;;:::o;1721:102::-;615:71:43;;;1762:54:46;;;;;;615:71:43;1684:31:46;1762:54;;;615:71:43;;;;;;2321:4:29;;615:71:43;;;;2321:4:29;615:71:43;;;;;;1762:54:46;;;1684:31;;;;;615:71:43;1684:31:46;615:71:43;1684:31:46;;;;;;;:::i;:::-;;;;;1831:312;615:71:43;;;1974:39:46;;615:71:43;;;;1974:39:46;;;2321:4:29;615:71:43;;;;;;2321:4:29;615:71:43;;;;;;;;1974:39:46;615:71:43;;;;1974:39:46;;;;;;;-1:-1:-1;1974:39:46;;;1831:312;2023:24;;;;2019:120;;1831:312;;;;;:::o;2019:120::-;2064:68;615:71:43;;;;;;;;2064:68:46;;;;1974:39;2064:68;;2321:4:29;615:71:43;;;;2321:4:29;615:71:43;;;;2321:4:29;615:71:43;;;;;;;;2064:68:46;1974:39;;;;;;;;;;;;;;;:::i;:::-;;;;;615:71:43;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;:::o;:::-;2321:4:29;;615:71:43;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;2321:4:29;;;;;;;;;;;615:71:43;;;;;;;;;;;2321:4:29;615:71:43;;;;;;2321:4:29;;;615:71:43;;;;;2321:4:29;615:71:43;;;2321:4:29;;;;;615:71:43;;;;:::o;:::-;;;;;2321:4:29;;;615:71:43;;;;;;;;;;;;;;;;;;;;;;;;:::o;2787:720:46:-;;;;;;2962:37;;;2958:116;;3146:21;;;;;;:::i;:::-;3178:13;3190:1;3193:10;;;;;;615:71:43;;;3190:1:46;615:71:43;;;3279:50:46;615:71:43;;;3279:50:46;;;;;;;615:71:43;3279:50:46;;;;;;:::i;:::-;;615:71:43;;3279:50:46;;;;;;;3190:1;3279:50;;;3173:72;3340:13;3190:1;3355:10;;;;;;2787:720;;;;;:::o;3367:3::-;3384:11;;;;:::i;:::-;615:71:43;3398:14:46;;;;;:::i;:::-;615:71:43;-1:-1:-1;3380:117:46;;2321:4:29;;3340:13:46;;3380:117;3460:11;3473:14;3460:11;;;;3431:57;3460:11;;:::i;:::-;615:71:43;3473:14:46;;:::i;:::-;3431:57;3190:1;3431:57;3279:50;615:71:43;;;;;;;;;;;;3431:57:46;3190:1;3431:57;3279:50;;;;;;3190:1;3279:50;;;;;;:::i;:::-;;;;;:::i;:::-;;;;3205:3;3218:20;;;;;;;;2321:4:29;3218:20:46;;;:::i;:::-;615:71:43;;;;;;3218:20:46;2321:4:29;3178:13:46;;;;;;;2958:116;3016:51;;;;615:71:43;;;;;;;;3190:1:46;3431:57;615:71:43;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;615:71:43;;;;;;:::o;:::-;;;2321:4:29;;;;;;;;615:71:43;2321:4:29;615:71:43;;;;;;;2321:4:29;;615:71:43;-1:-1:-1;615:71:43;;;;;;;;;;;;;:::o;:::-;;;;;;2321:4:29;615:71:43;;;;;;;;;;;;;;;;;2321:4:29;;615:71:43;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2321:4:29;615:71:43;;;;;;;;;2321:4:29;615:71:43;;;;;;;;;;;;;;;;;;;2321:4:29;;;;;;;;;;;615:71:43;-1:-1:-1;615:71:43;;;;;;;;;;:::o;:::-;;;;;2321:4:29;;;615:71:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2321:4:29;615:71:43;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;2657:4:29:-;;;;;;615:71:43;;2657:4:29;;;615:71:43;2657:4:29;;;;;;;;:::i;2763:::-;;;;;;;;;;;;;:::i;:::-;;;;;615:71:43;2763:4:29;;;;;;;;:::i;4968:2430:44:-;;5213:38;4968:2430;5213:38;:::i;:::-;5332:54;5276:21;;;:::i;:::-;615:71:43;;;;;:::i;:::-;2321:4:29;;;;;5360:25:44;5332:54;545:85:42;;;;;;;461:173;;5332:54:44;5430:33;;;;;:::i;:::-;5471:22;5488:5;5521:13;;;;;;;2321:4:29;5554:13:44;5488:5;5569:12;;;;;;5549:1839;4968:2430;;;;;;;;;;:::o;5583:3::-;5602:11;;;5598:108;;5583:3;5743:16;:13;;;:16;:::i;:::-;;5873:17;615:71:43;5873:17:44;;;615:71:43;;;;;;5873:31:44;;;5583:3;5869:123;;6074:17;5488:5;6121:13;;;;615:71:43;6148:13:44;;;;;:37;;;5583:3;6144:114;;6272:17;;;615:71:43;;;;6272:42:44;;;5583:3;6268:172;;615:71:43;;6476:17:44;;615:71:43;6519:79:44;615:71:43;;;;;;;;;6550:36:44;;;;6566:9;;6550:36;5521:13;6588:9;;;6519:79;;:::i;:::-;6747:8;6743:581;;6472:261;-1:-1:-1;5521:13:44;615:71:43;;;;;;;;;;;2321:4:29;;615:71:43;7339:40:44;;;5554:13;2321:4:29;5554:13:44;;6743:581;6773:20;;615:71:43;;6773:53:44;6769:203;;2321:4:29;615:71:43;;6988:56:44;6984:145;;615:71:43;2867:4:29;7145:55:44;7141:173;;6743:581;;;7141:173;7260:21;;;;;;;;;7221:61;7260:21;;7221:61;7260:21;;:::i;:::-;5521:13;615:71:43;7221:61:44;;;;;:::i;:::-;;;;7296:5;;;;;;;;;;;;6984:145;7094:21;;7067:49;7094:21;;:::i;:::-;5521:13;615:71:43;7067:49:44;;;;;;;;;;:::i;6769:203::-;6842:16;;;2321:4:29;6842:16:44;6915:21;6877:60;6915:21;;6877:60;6915:21;;:::i;6877:60::-;;;;6951:8;;6550:36;;;6472:261;6639:83;615:71:43;;;;;;;;;6662:10:44;2321:4:29;6662:10:44;;615:71:43;6674:36:44;;;;;6690:9;;6674:36;;5521:13;6712:9;;;6639:83;;:::i;:::-;6472:261;;6674:36;;;;6268:172;6404:25;5488:5;6404:25;;615:71:43;;;;3190:1:46;3431:57;6272:42:44;6310:4;615:71:43;6310:4:44;615:71:43;6301:4:44;6293:21;6272:42;;6144:114;6237:9;;6206:41;6237:9;5521:13;615:71:43;6206:41:44;;;;;;;;;;:::i;6148:37::-;6165:9;;;:20;6148:37;;5869:123;5521:13;615:71:43;;;;;;;;;;;;;-1:-1:-1;2321:4:29;;615:71:43;5923:38:44;;615:71:43;;;;5923:38:44;615:71:43;5873:31:44;5894:10;;;5873:31;;5598:108;5646:49;;;;;;;;;:::i;:::-;5627:68;;5598:108;;;827:779:47;;;;615:71:43;;;;;1085:10:47;;1057:52;;1080:1;1183:24;;;;;;1391:40;;;;;;1163:174;1387:209;;827:779;:::o;1387:209::-;1080:1;1488:21;;;;;1461:53;;;;;:::i;:::-;;1528:8;1524:64;;827:779::o;1524:64::-;1557:20;1080:1;1557:20;1278:49;1080:1;1557:20;1391:40;1406:21;;:25;;1391:40;;1209:3;1224:24;1231:16;;;;;;:::i;:::-;;:::i;:::-;615:71:43;;;;1224:24:47;1285:16;1278:34;:24;1285:16;;;;;;:::i;1278:34::-;615:71:43;;;1278:49:47;;1321:4;1278:49;;;2321:4:29;615:71:43;;1278:49:47;;615:71:43;;;;;;1278:49:47;;;;;;;;;2321:4:29;1278:49:47;1080:1;1278:49;;;1209:3;1278:49;;:::i;:::-;2321:4:29;1168:13:47;;1278:49;;;;;;;;;;;;;;;:::i;:::-;;;;;1057:52;;;;615:71:43;;;;;;;;;;;;;:::i;2147:327:46:-;;;615:71:43;;;;;;2281:35:46;;;;;;;;;;615:71:43;;;;;;;;2281:35:46;;;;;;;;;;;-1:-1:-1;2281:35:46;;;2147:327;615:71:43;;;;;;;2326:19:46;;:71;;;;2147:327;2322:148;;;2147:327;;;;:::o;2322:148::-;615:71:43;;2414:49:46;;;615:71:43;;;;2281:35:46;2414:49;;2321:4:29;615:71:43;;;;;;;;;;;;2321:4:29;615:71:43;;;;2321:4:29;615:71:43;;4302:26:44;2326:71:46;615::43;;;2350:47:46;;615:71:43;;;;2281:35:46;2350:47;;2321:4:29;615:71:43;;;;;2321:4:29;615:71:43;-1:-1:-1;2281:35:46;;615:71:43;;;;;;2350:47:46;;;;;;;-1:-1:-1;2350:47:46;;;2326:71;2349:48;;2326:71;;;2350:47;;;;2281:35;2350:47;2281:35;2350:47;;;;;;;:::i;:::-;;;;2281:35;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;615:71:43;;;2321:4:29;615:71:43;2321:4:29;;;;;;;;;;;615:71:43;2321:4:29;615:71:43;;;-1:-1:-1;615:71:43;;-1:-1:-1;615:71:43;;;;;;;;;-1:-1:-1;615:71:43;;;;-1:-1:-1;615:71:43;;;;;;;;;-1:-1:-1;615:71:43;;;;-1:-1:-1;615:71:43;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;615:71:43;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;-1:-1:-1;615:71:43;;-1:-1:-1;615:71:43;;;;;;;;;-1:-1:-1;615:71:43;;;;-1:-1:-1;615:71:43;;;;-1:-1:-1;615:71:43;;;;-1:-1:-1;615:71:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;4827:2701:29:-;;;;615:71:43;;:::i;:::-;;;;;566:109:41;;;;;;;5131:25:29;:17;;;:25;5144:4;;5166:14;2321:4;5166:14;;;615:71:43;5127:140:29;5364:4;5345:15;615:71:43;;;;;;;5345:15:29;5344:24;5379:13;5375:122;;5127:140;-1:-1:-1;5603:4:29;5590:17;;;:25;5603:4;;5625:12;5144:4;5586:320;;5951:20;;;:::i;:::-;5934:14;;;;:37;;;2321:4;5978:1546;5998:12;;;;;;4827:2701;;;;;;:::o;6012:3::-;798:135:41;;;;;;;;;6044:44:29;;;5144:4;6195:12;;;:20;5144:4;;6282;6251:36;6282:4;6251:17;:14;;;:17;:::i;:::-;;615:71:43;;;;;;6251:36:29;6497:4;6489:12;;;:20;6485:109;;6191:226;6672:4;6664:12;;;:20;6660:287;;6191:226;7033:4;7025:12;;;:20;7021:112;;6191:226;7462:55;7498:19;7507:4;7243:12;7209:55;7243:12;7209:30;:17;7243:12;5603:4;7243:12;5144:4;7243:12;;;:20;7209:14;;:17;:::i;:::-;;:30;615:71:43;;;;;;7209:55:29;7332;7366:12;7332:30;:17;7366:12;7374:4;7366:12;;;:20;7332:14;;:17;:::i;:55::-;7499:12;615:71:43;;;;;;7498:19:29;615:71:43;;;;7462:55:29;7507:4;7462:17;:14;;;:17;:::i;:::-;;:33;615:71:43;2321:4:29;5983:13;;;7021:112;5144:4;;7462:55;;7498:19;;7507:4;;2102:103:41;;;;;;;7058:14:29;;:26;:17;:14;;;:17;:::i;:::-;;:26;615:71:43;7021:112:29;;;;;;;;6660:287;1201:256:41;6915:23:29;;1318:135:41;;;;;;;;;615:71:43;6867:38:29;6882:22;1318:135:41;;6882:22:29;:::i;:::-;6867:38;;;;:::i;:::-;6842:14;;5934;6842:17;:14;;;:17;:::i;:::-;;:22;615:71:43;;;;:::i;:::-;6842:63:29;;6915:23;:::i;:::-;6660:287;;;6485:109;1983:226:41;2102:103;;;;;;;6522:14:29;;7374:4;6522:17;:14;;;:17;:::i;:::-;;:23;615:71:43;6485:109:29;;6191:226;6347:61;;-1:-1:-1;1840:135:41;;;;;;;;;6348:14:29;;:17;:14;;;:17;:::i;6347:61::-;6191:226;;5586:320;5747:4;5734:17;;;:25;5747:4;;2321;;1058:135:41;;;;;;;;;941:256;5771:48:29;2321:4;5730:170;5586:320;;5730:170;615:71:43;;798:135:41;;;;;;;;;683:254;;5375:122:29;2213:380:41;;;;;;;;2363:226;;;;;;;;;;;;;;;;;;;2213:380;;;5426:64:29;;5427:14;;;615:71:43;5375:122:29;;;5127:140;1840:135:41;;;;;;;;5206:14:29;;;615:71:43;1840:135:41;;;-1:-1:-1;5127:140:29;;9532:274;9650:18;;;615:71:43;;1206:48:29;;9752;;9711:18;-1:-1:-1;1206:48:29;615:71:43;;9650:18:29;1077:202;;615:71:43;539:66:29;615:71:43;;709:66:29;615:71:43;868:66:29;;615:71:43;868:66:29;;;;615:71:43;868:66:29;;;615:71:43;9678:4:29;868:66;;;2321:4;868:66;1077:202;;;;;;:::i;:::-;2321:4;1060:225;;9711:18;;:::i;:::-;615:71:43;;9752:48:29;;;9650:18;9752:48;;;;615:71:43;;;;;;;;;;;;;;;;;;1206:48:29;9752;;9711:18;1240:13;1206:48;;615:71:43;;;;;;;;;:::o;7402:281:44:-;;;7543:26;7539:80;;615:71:43;7652:17:44;;615:71:43;;7402:281:44;:::o;7539:80::-;7568:1;;-1:-1:-1;7592:17:44;;7581:29::o;2575:4::-;;;;;;;;;:::o;7687:4623::-;;;;;;683:254:41;7687:4623:44;7916:4077;798:135:41;;;;;;;;;;;;683:254;;615:71:43;7937:49:44;615:71:43;;7999:27:44;;;7995:57;;8064:46;;;;2649:4;8064:46;;2649:4;;-1:-1:-1;1058:135:41;;;;;;;;;;;;8203:52:44;1058:135:41;;1927:4:44;8270:33;;1927:4;;8391:13;;;;:21;683:254:41;8391:13:44;;8441;8391;;;:21;:::i;:::-;;:26;;8449:4;;8441:13;;:::i;:::-;7916:4077;;8266:3094;1998:4;8476:43;;1998:4;;8604:13;;;;:21;683:254:41;8604:13:44;;8654:10;8604:13;;;:21;:::i;:::-;;:26;;8654:10;;;;:::i;8472:2888::-;2073:4;8686:47;;2073:4;;8817:13;;;;:21;683:254:41;8817:13:44;;8867:9;8817:13;;;:21;:::i;:::-;;:26;;8867:9;;;;:::i;8682:2678::-;2135:4;8898:33;;2135:4;;9015:13;;;;:21;683:254:41;9015:13:44;;9065:21;9015:13;;;:21;:::i;:::-;;:26;;9065:21;;;;:::i;8894:2466::-;2206:4;9108:43;;2206:4;;9232:13;;;;:21;683:254:41;9232:13:44;;9282:18;9232:13;;;:21;:::i;:::-;;:26;;9282:10;;:18;;;:::i;9104:2256::-;2281:4;9322:47;;2281:4;;9449:13;;;;:21;683:254:41;9449:13:44;;9499:17;9449:13;;;:21;:::i;:::-;;:26;;9499:9;;:17;;;:::i;9318:2042::-;2349:4;9538:40;;2349:4;;-1:-1:-1;683:254:41;;3162:307;9816:12:44;;-1:-1:-1;1840:135:41;;;;;;;-1:-1:-1;1840:135:41;;;-1:-1:-1;9766:13:44;;:21;:13;;;;;:21;:::i;:::-;;:26;;9816:12;;;;:::i;9534:1826::-;2417:4;9850:39;;2417:4;;-1:-1:-1;;;;1840:135:41;;;;;;;;;10080:13:44;;:21;:13;;;;;:21;:::i;:::-;;:26;;:13;615:71:43;;10130:38:44;;10162:4;2135;10130:38;;2321:4:29;10080:26:44;;615:71:43;;10130:38:44;;615:71:43;;;;;;;;10130:38:44;;615:71:43;;10130:38:44;;;;;;;683:254:41;10130:38:44;;;-1:-1:-1;10130:38:44;;;9846:1514;10130:38;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;9846:1514;2494:4;10190:49;;2494:4;;-1:-1:-1;;;;1840:135:41;;;;;;;;;10429:13:44;;:21;:13;;;;;:21;:::i;:::-;;:26;;:13;615:71:43;;10479:35:44;;10503:10;2135:4;10479:35;;2321:4:29;10429:26:44;;615:71:43;;10479:35:44;;615:71:43;;;;;;;;10479:35:44;615:71:43;10186:1174:44;2575:4;10536:53;;2575:4;;-1:-1:-1;;;;1840:135:41;;;;;;;;;10778:13:44;;:21;:13;;;;;:21;:::i;:::-;;:26;;:13;615:71:43;;10828:34:44;;10852:9;2135:4;10828:34;;2321:4:29;10778:26:44;;615:71:43;;10828:34:44;;615:71:43;;;;;;;;10828:34:44;;;;;;;683:254:41;10828:34:44;;;-1:-1:-1;10828:34:44;;;;;:::i;10532:828::-;10884:46;;;;2649:4;10884:46;10880:480;;10532:828;;;;;683:254:41;10532:828:44;7916:4077;;10880:480;11269:13;;-1:-1:-1;615:71:43;;3162:307:41;11319:29:44;;;;3162:307:41;;11269:13:44;;:21;;1840:135:41;;;;;;;;;3162:307;;1840:135;;;;;;;;;;1721:258;3162:307;11269:13:44;;;;;:21;:::i;:::-;;:26;;615:71:43;11269:13:44;615:71:43;11319:29:44;;;;;;615:71:43;11319:29:44;;2135:4;11319:29;;615:71:43;;;;;;;;;2321:4:29;;615:71:43;11319:29:44;;615:71:43;;11319:29:44;;;;;;;683:254:41;11319:29:44;;;-1:-1:-1;11319:29:44;;;;;:::i;:::-;10880:480;;;;;;;;8060:3927;11378:41;;-1:-1:-1;;;2780:4:44;11378:41;;2780:4;;11525:10;683:254:41;11525:10:44;11498:37;11525:10;11498:21;:13;;;;;:21;:::i;11374:613::-;2853:4;11554:45;;2853:4;;11709:9;683:254:41;11709:9:44;11682:36;11709:9;11682:21;:13;;;;;:21;:::i;11550:437::-;2981:4;11737:35;;2981:4;;11894:21;683:254:41;11894:21:44;;11864:27;:21;:13;;;;;:21;:::i;:::-;;:27;615:71:43;7916:4077:44;;11733:254;11947:31;-1:-1:-1;11947:31:44;6404:25;615:71:43;;3190:1:46;3431:57;7995::44;8038:5;;;;;;;12082:30;;;;12078:198;12091:21;;;12145:22;;12139:29;12145:22;12177:8;12145:22;12131:38;12145:22;;:::i;:::-;;615:71:43;;;;12145:22:44;615:71:43;;;;12131:38:44;12177:8;;:::i;:::-;12282:23;7687:4623;:::o;12078:198::-;12243:26;;;12252:17;7687:4623;:::o;1431:196:42:-;;1538:85;1431:196;;;;1538:85;;;;;;;1431:196;:::o;1997:192::-;;2098:87;1997:192;;;;2098:87;;;;;;;1997:192;:::o;758:271::-;825:200;;;;;;;;;;;;;;;;;;;;758:271::o;1219:204:5:-;;8544:1067;;;;8509:24;-1:-1:-1;8544:1067:5;;;;;;;-1:-1:-1;8544:1067:5;;;;;;1338:4;-1:-1:-1;8544:1067:5;;;;;;;1219:204;8544:1067;;;;;1305:38;1301:116;;1219:204;:::o;1301:116::-;1366:40;-1:-1:-1;1366:40:5;8544:1067;615:71:43;8544:1067:5;2321:4:29;615:71:43;3190:1:46;3431:57;8544:1067:5;1338:4;8544:1067;;;;;;;;;;;;;;;;;;-1:-1:-1;8544:1067:5;;;;;615:71:43;2321:4:29;;;;;;;615:71:43;;;;;;;;;;;:::o;:::-;;;;;2321:4:29;;;615:71:43;;;;;;;;;;;;8246:1282:29;8384:22;;;;615:71:43;;8367:40:29;;615:71:43;8367:40:29;;;615:71:43;;;:::i;8367:40:29:-;2321:4;8357:51;;615:71:43;;;;;;;;;;;;8419:34:29;615:71:43;;8493:14:29;;;8680:82;8483:25;615:71:43;8493:14:29;;;8483:25;:::i;:::-;8718:14;8680:82;8734:14;8718;;;615:71:43;8734:14:29;;615:71:43;;;;8680:82:29;;;8367:40;8680:82;;;;1799:66;;;;;;;;;615:71:43;1799:66:29;615:71:43;;1799:66:29;;;615:71:43;1799:66:29;;;615:71:43;1799:66:29;;;615:71:43;1799:66:29;615:71:43;1799:66:29;8415:1109;2763:4;8780:29;;2763:4;;-1:-1:-1;;8966:16:29;;;2321:4;;8367:40;2321:4;;;8956:27;615:71:43;;;1979:66:29;8927:70;;;615:71:43;;;1979:66:29;;;615:71:43;;;;1979:66:29;;;615:71:43;;;;8927:70:29;;615:71:43;1979:66:29;;;8927:70;1979:66;8776:748;2867:4;9015:35;;2867:4;;-1:-1:-1;;9184:18:29;;1979:66;615:71:43;;;2174:66:29;8367:40;9149:67;;615:71:43;;;1979:66:29;;;615:71:43;;;;1979:66:29;;;615:71:43;;;;9149:67:29;615:71:43;1979:66:29;;;9149:67;1979:66;9011:513;2556:4;9234:28;2556:4;;-1:-1:-1;9411:15:29;;1979:66;615:71:43;;;1979:66:29;8367:40;9382:58;;615:71:43;;;1979:66:29;;;615:71:43;;;;1979:66:29;;;615:71:43;;;;9382:58:29;615:71:43;1979:66:29;;;9382:58;1979:66;9230:294;9491:26;615:71:43;9491:26:29;615:71:43;;9491:26:29;615:71:43;2556:4:29;3190:1:46;3431:57;1452:342:49;;1544:246;;;;;;;;;;;;;;;;;;1452:342::o;449:825::-;;542:728;;;;;;;;;;;;;;;;;;;;;;;;;;;;;449:825::o;615:71:43:-;2321:4:29;;;;;;;615:71:43;;;;;;;;;;;:::o;:::-;;;;;2321:4:29;615:71:43;;;;;;;;;;;;7788:454:29;;2321:4;;615:71:43;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;-1:-1:-1;8132:3:29;2321:4;;8114:16;;;;;8170:8;;2321:4;8170:8;;;:::i;:::-;;615:71:43;;;;7676:7:29;615:71:43;7676:7:29;;615:71:43;7695:6:29;615:71:43;7695:6:29;;;615:71:43;2321:4:29;;;;7685:17;7704:10;;;;615:71:43;7716:14:29;;;615:71:43;;;7732:14:29;7748:17;7732:14;;;615:71:43;;;7748:17:29;;615:71:43;;;;7635:138:29;615:71:43;7635:138:29;;615:71:43;1478:66:29;615:71:43;;;1478:66:29;;2321:4;7704:10;1478:66;;615:71:43;7716:14:29;1478:66;;615:71:43;7732:14:29;1478:66;;615:71:43;7748:17:29;1478:66;;2321:4;1478:66;;;2321:4;1478:66;;;615:71:43;1478:66:29;7635:138;;;;;;:::i;:::-;2321:4;7618:161;;8145:34;;;;:::i;:::-;615:71:43;2321:4:29;8099:13;;8114:16;;;;;615:71:43;;8208:28:29;;615:71:43;;8208:28:29;;615:71:43;;;:::i","linkReferences":{},"immutableReferences":{"44246":[{"start":2024,"length":32},{"start":7289,"length":32}]}},"methodIdentifiers":{"handleSequenceDelegateCall(bytes32,uint256,uint256,uint256,uint256,bytes)":"4c4e814c","hydrateExecute(bytes,bytes)":"6d42cf03","hydrateExecuteAndSweep(bytes,address,address[],bool,bytes)":"bd1e4acb","recoverSapientSignature((uint8,bool,(address,uint256,bytes,uint256,bool,bool,uint256)[],uint256,uint256,bytes,bytes32,bytes32,address[]),bytes)":"13792a4a","requireERC1155Approval(address,address,address)":"2ab793d7","requireERC1155ApprovalSelf(address,address)":"0cb17e5c","requireERC721Approval(address,address,address,uint256)":"fe08e7ca","requireERC721ApprovalSelf(address,address,uint256)":"e246466a","requireMinBalance(address,uint256)":"03bbbd65","requireMinBalanceSelf(uint256)":"333f790d","requireMinERC1155Balance(address,address,uint256,uint256)":"505c7ed3","requireMinERC1155BalanceBatch(address,address,uint256[],uint256[])":"476a5f40","requireMinERC1155BalanceBatchSelf(address,uint256[],uint256[])":"fdc25428","requireMinERC1155BalanceSelf(address,uint256,uint256)":"0084290d","requireMinERC20Allowance(address,address,address,uint256)":"42ab921e","requireMinERC20AllowanceSelf(address,address,uint256)":"6ef1f0dd","requireMinERC20Balance(address,address,uint256)":"8d0a9ea7","requireMinERC20BalanceSelf(address,uint256)":"372618cb","requireNonExpired(uint256)":"7f29d538","sweep(address,address[],bool)":"a7b7ec5a"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"BalanceSweepFailed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"name\":\"DelegateCallFailed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"DelegateCallNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minBalance\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceTooLow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minBalance\",\"type\":\"uint256\"}],\"name\":\"ERC1155BatchBalanceTooLow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"ERC1155NotApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minAllowance\",\"type\":\"uint256\"}],\"name\":\"ERC20AllowanceTooLow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minBalance\",\"type\":\"uint256\"}],\"name\":\"ERC20BalanceTooLow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"ERC721NotApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"Expired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"kind\",\"type\":\"uint8\"}],\"name\":\"InvalidKind\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"a\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"b\",\"type\":\"uint256\"}],\"name\":\"LengthMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minBalance\",\"type\":\"uint256\"}],\"name\":\"NativeBalanceTooLow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonTransactionPayload\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"kind\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"noChainId\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"delegateCall\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"onlyFallback\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"behaviorOnError\",\"type\":\"uint256\"}],\"internalType\":\"struct Payload.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"space\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"imageHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"digest\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"parentWallets\",\"type\":\"address[]\"}],\"internalType\":\"struct Payload.Decoded\",\"name\":\"_payload\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLeft\",\"type\":\"uint256\"}],\"name\":\"NotEnoughGas\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyDelegateCallAllowed\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"kind\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"noChainId\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"delegateCall\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"onlyFallback\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"behaviorOnError\",\"type\":\"uint256\"}],\"internalType\":\"struct Payload.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"space\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"imageHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"digest\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"parentWallets\",\"type\":\"address[]\"}],\"internalType\":\"struct Payload.Decoded\",\"name\":\"_payload\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_returnData\",\"type\":\"bytes\"}],\"name\":\"Reverted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"flag\",\"type\":\"uint256\"}],\"name\":\"UnknownHydrateDataCommand\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_opHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_returnData\",\"type\":\"bytes\"}],\"name\":\"CallAborted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_opHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_returnData\",\"type\":\"bytes\"}],\"name\":\"CallFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_opHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"CallSkipped\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_opHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"CallSucceeded\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"handleSequenceDelegateCall\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"packedPayload\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"hydratePayload\",\"type\":\"bytes\"}],\"name\":\"hydrateExecute\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"packedPayload\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"sweepTarget\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"tokensToSweep\",\"type\":\"address[]\"},{\"internalType\":\"bool\",\"name\":\"sweepNative\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"hydratePayload\",\"type\":\"bytes\"}],\"name\":\"hydrateExecuteAndSweep\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"kind\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"noChainId\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"delegateCall\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"onlyFallback\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"behaviorOnError\",\"type\":\"uint256\"}],\"internalType\":\"struct Payload.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"space\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"imageHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"digest\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"parentWallets\",\"type\":\"address[]\"}],\"internalType\":\"struct Payload.Decoded\",\"name\":\"payload\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"recoverSapientSignature\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"imageHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"requireERC1155Approval\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"requireERC1155ApprovalSelf\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"requireERC721Approval\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"requireERC721ApprovalSelf\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minBalance\",\"type\":\"uint256\"}],\"name\":\"requireMinBalance\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minBalance\",\"type\":\"uint256\"}],\"name\":\"requireMinBalanceSelf\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minBalance\",\"type\":\"uint256\"}],\"name\":\"requireMinERC1155Balance\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"minBalances\",\"type\":\"uint256[]\"}],\"name\":\"requireMinERC1155BalanceBatch\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"minBalances\",\"type\":\"uint256[]\"}],\"name\":\"requireMinERC1155BalanceBatchSelf\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minBalance\",\"type\":\"uint256\"}],\"name\":\"requireMinERC1155BalanceSelf\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minAllowance\",\"type\":\"uint256\"}],\"name\":\"requireMinERC20Allowance\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minAllowance\",\"type\":\"uint256\"}],\"name\":\"requireMinERC20AllowanceSelf\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minBalance\",\"type\":\"uint256\"}],\"name\":\"requireMinERC20Balance\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minBalance\",\"type\":\"uint256\"}],\"name\":\"requireMinERC20BalanceSelf\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expiration\",\"type\":\"uint256\"}],\"name\":\"requireNonExpired\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sweepTarget\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"tokensToSweep\",\"type\":\"address[]\"},{\"internalType\":\"bool\",\"name\":\"sweepNative\",\"type\":\"bool\"}],\"name\":\"sweep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"This contract intentionally contains no additional logic; it simply inherits: - {MalleableSapient} for malleable commitments - {HydrateProxy} for hydrate + execute flows - {RequireUtils} for precondition checks\",\"errors\":{\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"kind\":\"dev\",\"methods\":{\"handleSequenceDelegateCall(bytes32,uint256,uint256,uint256,uint256,bytes)\":{\"details\":\"Expects `data` to be ABI-encoded as `(bytes packedPayload, bytes hydratePayload)`.\"},\"hydrateExecute(bytes,bytes)\":{\"details\":\"`hydratePayload` is a byte stream grouped by call index: - Starts with a 1-byte `tindex` (the call to hydrate). - Followed by commands for that call. Each command starts with a 1-byte `flag`. - A `SIGNAL_NEXT_HYDRATE` (0x00) ends the current call's section; if more bytes remain, the next byte is the next `tindex`. The supported command flags are the `HYDRATE_*` constants in this file.\"},\"hydrateExecuteAndSweep(bytes,address,address[],bool,bytes)\":{\"params\":{\"sweepNative\":\"Whether to sweep native tokens\",\"sweepTarget\":\"If zero address, defaults to `msg.sender`.\",\"tokensToSweep\":\"Token list to sweep (each full balance of this contract).\"}},\"recoverSapientSignature((uint8,bool,(address,uint256,bytes,uint256,bool,bool,uint256)[],uint256,uint256,bytes,bytes32,bytes32,address[]),bytes)\":{\"details\":\"Reverts if `payload.kind` is not `Payload.KIND_TRANSACTIONS`.\"},\"sweep(address,address[],bool)\":{\"params\":{\"sweepNative\":\"Whether to sweep native tokens\",\"sweepTarget\":\"The address to sweep the balances to\",\"tokensToSweep\":\"The tokens to sweep\"}}},\"title\":\"TrailsUtils\",\"version\":1},\"userdoc\":{\"errors\":{\"BalanceSweepFailed()\":[{\"notice\":\"Error thrown when a balance sweep fails\"}],\"InvalidKind(uint8)\":[{\"notice\":\"Error thrown when the kind is invalid\"}],\"NotEnoughGas((uint8,bool,(address,uint256,bytes,uint256,bool,bool,uint256)[],uint256,uint256,bytes,bytes32,bytes32,address[]),uint256,uint256)\":[{\"notice\":\"Error thrown when there is not enough gas\"}],\"Reverted((uint8,bool,(address,uint256,bytes,uint256,bool,bool,uint256)[],uint256,uint256,bytes,bytes32,bytes32,address[]),uint256,bytes)\":[{\"notice\":\"Error thrown when a call reverts\"}]},\"events\":{\"CallAborted(bytes32,uint256,bytes)\":{\"notice\":\"Emitted when a call is aborted\"},\"CallFailed(bytes32,uint256,bytes)\":{\"notice\":\"Emitted when a call fails\"},\"CallSkipped(bytes32,uint256)\":{\"notice\":\"Emitted when a call is skipped\"},\"CallSucceeded(bytes32,uint256)\":{\"notice\":\"Emitted when a call succeeds\"}},\"kind\":\"user\",\"methods\":{\"handleSequenceDelegateCall(bytes32,uint256,uint256,uint256,uint256,bytes)\":{\"notice\":\"Hook used by Sequence wallets for delegatecall-based execution.\"},\"hydrateExecute(bytes,bytes)\":{\"notice\":\"Hydrates `packedPayload` using `hydratePayload` and then executes the batch.\"},\"hydrateExecuteAndSweep(bytes,address,address[],bool,bytes)\":{\"notice\":\"Hydrates + executes, then sweeps ETH and a set of ERC20s to a recipient.\"},\"recoverSapientSignature((uint8,bool,(address,uint256,bytes,uint256,bool,bool,uint256)[],uint256,uint256,bytes,bytes32,bytes32,address[]),bytes)\":{\"notice\":\"Computes the `imageHash` for a transaction payload with a malleable `data` commitment.\"},\"requireERC1155Approval(address,address,address)\":{\"notice\":\"Reverts if `operator` is not approved for all of `owner`'s tokens on `token` (ERC1155).\"},\"requireERC1155ApprovalSelf(address,address)\":{\"notice\":\"Reverts if `operator` is not approved for all of `msg.sender`'s tokens on `token` (ERC1155).\"},\"requireERC721Approval(address,address,address,uint256)\":{\"notice\":\"Reverts if `spender` is not approved to transfer `tokenId` from `owner` on `token` (ERC721).\"},\"requireERC721ApprovalSelf(address,address,uint256)\":{\"notice\":\"Reverts if `spender` is not approved to transfer `tokenId` from `msg.sender` on `token` (ERC721).\"},\"requireMinBalance(address,uint256)\":{\"notice\":\"Reverts if `wallet` has less than `minBalance` native ETH.\"},\"requireMinBalanceSelf(uint256)\":{\"notice\":\"Reverts if `msg.sender` has less than `minBalance` native ETH.\"},\"requireMinERC1155Balance(address,address,uint256,uint256)\":{\"notice\":\"Reverts if `wallet` has less than `minBalance` of `tokenId` on `token` (ERC1155).\"},\"requireMinERC1155BalanceBatch(address,address,uint256[],uint256[])\":{\"notice\":\"Reverts if any `tokenIds[i]` balance of `wallet` is below `minBalances[i]` (ERC1155 batch).\"},\"requireMinERC1155BalanceBatchSelf(address,uint256[],uint256[])\":{\"notice\":\"Reverts if any `tokenIds[i]` balance of `msg.sender` is below `minBalances[i]` (ERC1155 batch).\"},\"requireMinERC1155BalanceSelf(address,uint256,uint256)\":{\"notice\":\"Reverts if `msg.sender` has less than `minBalance` of `tokenId` on `token` (ERC1155).\"},\"requireMinERC20Allowance(address,address,address,uint256)\":{\"notice\":\"Reverts if `owner` has granted `spender` less than `minAllowance` for `token`.\"},\"requireMinERC20AllowanceSelf(address,address,uint256)\":{\"notice\":\"Reverts if `msg.sender` has granted `spender` less than `minAllowance` for `token`.\"},\"requireMinERC20Balance(address,address,uint256)\":{\"notice\":\"Reverts if `wallet` has less than `minBalance` of `token`.\"},\"requireMinERC20BalanceSelf(address,uint256)\":{\"notice\":\"Reverts if `msg.sender` has less than `minBalance` of `token`.\"},\"requireNonExpired(uint256)\":{\"notice\":\"Reverts if `block.timestamp` is greater than or equal to `expiration`.\"},\"sweep(address,address[],bool)\":{\"notice\":\"Sweeps balances to a target address\"}},\"notice\":\"Convenience contract that bundles multiple utility modules under a single deployed address.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/TrailsUtils.sol\":\"TrailsUtils\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":4294967295},\"remappings\":[\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":account-abstraction/=lib/wallet-contracts-v3/lib/account-abstraction/contracts/\",\":erc2470-libs/=lib/wallet-contracts-v3/lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/wallet-contracts-v3/lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":trails-test/=test/\",\":wallet-contracts-v3-external/=../wallet-contracts-v3/src/\",\":wallet-contracts-v3/=lib/wallet-contracts-v3/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol\":{\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100\",\"dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037\",\"dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d\",\"dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF\"]},\"lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol\":{\"keccak256\":\"0xf189f9b417fe1931e1ab706838aff1128528694a9fcdb5ff7665197f2ca57d09\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2ff0143c836c8c9f85d13708733c09e21251395847fccfb518bf3b556726a840\",\"dweb:/ipfs/QmP69sjjrQrhYAsvCSSB69Bx66SiUPdQUqdzMYnf4wANHm\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303\",\"dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x869c06fcfd4e33df584f63c033467c3d4f5e51bdf78bc69d0eeef5c07e395ad9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://436721c3801101a789b998f14f161de63edb64229ff307b0951a97a964f07168\",\"dweb:/ipfs/QmaFWLRmVXFL629AyThz8Nc8W7RakZBVGo14AWB2WLyKcP\"]},\"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0xf78f05f3b8c9f75570e85300d7b4600d7f6f6a198449273f31d44c1641adb46f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e28b872613b45e0e801d4995aa4380be2531147bfe2d85c1d6275f1de514fba3\",\"dweb:/ipfs/QmeeFcfShHYaS3BdgVj78nxR28ZaVUwbvr66ud8bT6kzw9\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]},\"lib/wallet-contracts-v3/src/modules/Calls.sol\":{\"keccak256\":\"0xd3377786c934649567774cc07e4b29196e9192e5cd5267e94e270a924b87ba36\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e2540650137b16ad9e924077992b0f5e1790074bd5de638a3a92362c1df890ea\",\"dweb:/ipfs/QmYqWZ9x1HJHDvHgDGNKFTymqj8BQjnZLMQ7TydV9Wb8qX\"]},\"lib/wallet-contracts-v3/src/modules/Nonce.sol\":{\"keccak256\":\"0x56fbf6dc9b34ab60ae8a32ffb6f583c003bb8f4a5223ce704e982400fa403fab\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://492f53628633b862702cf8f9b726067a722c94028133a8a4c4fcf3d0e73ad803\",\"dweb:/ipfs/QmTHNy4XbH47YZaqKDpknb5aApjRH9HVAREHN7N5vEFWEV\"]},\"lib/wallet-contracts-v3/src/modules/Payload.sol\":{\"keccak256\":\"0x03b3dc2a4a556d3007671e910813dc4703ecb16f5bc2c6645e4c0d8512f2d76a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://9b41263156d5a310a48038e8c3871e9acdb806c018bc952d1a56efed62954e17\",\"dweb:/ipfs/QmaiuTbQgaiCvtN2V6roe4RTi6hHV85mNZpWKqvKA8ofqw\"]},\"lib/wallet-contracts-v3/src/modules/ReentrancyGuard.sol\":{\"keccak256\":\"0x566e105b1a53f49cf099037f3cb4a9739522d72739dc65f1169b97e4fbe07b32\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d811a16613746e5290eab76eb4055d98a1e64e1086632697d09b0a3759a6bac5\",\"dweb:/ipfs/QmPJ33JvAxwn1sTCNvYG2TWsFo991KND2ia8JcvZ26Dge9\"]},\"lib/wallet-contracts-v3/src/modules/Storage.sol\":{\"keccak256\":\"0xa6bc516642ea99194f3ac4375853daee3190272c4006d1e32f84ba88ec30173f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://209ba57704f952514910c54896df70197c695c2b4eeb1166a2c6ed29380741da\",\"dweb:/ipfs/QmNmQpemo7qQxb2aDXdFooE6xNW1cp7gXGYa8xUUcJ4WWn\"]},\"lib/wallet-contracts-v3/src/modules/auth/BaseAuth.sol\":{\"keccak256\":\"0xbf2e40def03fcb5f4a5129b2f5803e21951325b92e00126cbe1427b7c25cfefd\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b560905fcc4b957d27c2abed78a1e82529c89fa472e91b3d108fbfd91aa7c3f7\",\"dweb:/ipfs/QmRjLLtTWE6dFX2kBQCgLz7ossfMxhAFgDC8Jx9XuGL6Wy\"]},\"lib/wallet-contracts-v3/src/modules/auth/BaseSig.sol\":{\"keccak256\":\"0x394ed24efe7a4468966e51f649f754bbb66dfffc0574499ec758dc1a5a8e1caa\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://ff4abc523d721df1680d6809c382fbf20b9e5cc17e5bdfd8f623ca7cf00061c8\",\"dweb:/ipfs/QmUXnDME7rDCLvhvFVN7eLFjHbH955DWNmWefLxEyDV4W3\"]},\"lib/wallet-contracts-v3/src/modules/auth/SelfAuth.sol\":{\"keccak256\":\"0x4d517af51c3af39a19a4ed00f3fc89e965e45942c264189085bc24f1987a526c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1be166f75d2821e305b6906c34311a62629b1b3c90ac306d775e7330f23d5b42\",\"dweb:/ipfs/QmYFLASBDFzcTXioV5459qvQ1NGaqzWMoLzGJeMas3Lg5W\"]},\"lib/wallet-contracts-v3/src/modules/interfaces/IAuth.sol\":{\"keccak256\":\"0xf6fa30af2ec91d5fbeac17c9b1f2aa73b7883c9ac98745605007e57666394b91\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6e90a87978519462f9612f4a17e38fddc1c7bcf700ff834a1de7dce326f30353\",\"dweb:/ipfs/QmXmWAsRRK6t4jPs4VcXrouyokxdALM28D3odX7ub48WEp\"]},\"lib/wallet-contracts-v3/src/modules/interfaces/ICheckpointer.sol\":{\"keccak256\":\"0xa9ae32596a0bc2d6676b48826e9edaf6e97ee2f3f222e9ad7058be3ba1718513\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0f3a846233ba32fd7b89aac58415d969c4fa72f846e4a2c8e1be38b8d2eeb6a1\",\"dweb:/ipfs/Qma5HMU9LCMXtzmevvZFU9mGH2fDgw5V11WQpez5QhCc7t\"]},\"lib/wallet-contracts-v3/src/modules/interfaces/IDelegatedExtension.sol\":{\"keccak256\":\"0xa2ae897e90fd70dd4a9e172bc04d019ba9c512e72c2df65fcb6daf87dd5ceb90\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://cdf4b7c3dfb0aef6c9dbe8b2a0542018dc756ef2252d7101bcb3186192da0a11\",\"dweb:/ipfs/QmPHCVu1DJ7fBrPBYA5y3hoF3a3XFEBwYCZ1ErGaxPhcYL\"]},\"lib/wallet-contracts-v3/src/modules/interfaces/IERC1271.sol\":{\"keccak256\":\"0xb33a198eb641c43c3ab89705f693e342ad87fcc28bfa48d63b5ed105968434c9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a1abd7475b239c551d34325466804b09e587b62559faf9109ad1ac019eb57a6b\",\"dweb:/ipfs/Qmd3MDHAmpFpLXdHY5Tnb7niJjPDr5hEnc4d63tpyFGmgF\"]},\"lib/wallet-contracts-v3/src/modules/interfaces/IPartialAuth.sol\":{\"keccak256\":\"0x0d1aa021615d8e90696e71a9468331457a1babfa2ffe169654b7456e5bcb7a73\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://bbacd149a6358ab0d4b9c588d2e3a55fc71ed4723269150d7b91ca70092f6519\",\"dweb:/ipfs/QmUSwtrYCrRcRFsy5rCzdMPrw1FCU7ZoeXdsW6kK9yc8FK\"]},\"lib/wallet-contracts-v3/src/modules/interfaces/ISapient.sol\":{\"keccak256\":\"0x3668daa83a61af054146345e53e571daf403f9bca9c3cc702f6f1cb655770359\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://13aa453c7021c83d305ac7d714a93f78a03a8cc0032cb06cf54d5ebf09100489\",\"dweb:/ipfs/QmSxar3KETtMzHXQuqQA9b8iK8cG3Z62EpWSeu8hhKW2xn\"]},\"lib/wallet-contracts-v3/src/utils/LibBytes.sol\":{\"keccak256\":\"0x4fe0b4786b2157e12384b90ae9daa1009b74b2547a8a24b800a8b998278c874b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://065129e32d1a318e89fb7587e136c33177a7848393f9055c0ac601b84741cd8c\",\"dweb:/ipfs/QmVWucfHSHRJriRFNoJqoeDcVB4fDfqbccM8KPBmwcxVu3\"]},\"lib/wallet-contracts-v3/src/utils/LibOptim.sol\":{\"keccak256\":\"0x1d1e2234eec89069c3f8d59e370fd3470faaef9c1641cd722bae83f4e4921bde\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4c3d8b24e6c11fcea3462017b2df71ed4b9b32b2dab8a591cc91afc0b6c8dd81\",\"dweb:/ipfs/QmXtrdWcNTfaYHodKRovkdDyRCQJcffDUZQAdgQCJNoq2x\"]},\"src/TrailsUtils.sol\":{\"keccak256\":\"0x86c794bd2a5e0d6c4e56772239eb857b9a3fc19b2d24d82e0f2e5275dd0ff147\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://aedb53e138547fe408a265dfdf91f9c65c654d4bf18dd663624df0f909fa803a\",\"dweb:/ipfs/QmSNpUNU9Ksm6Zi6YmCugfHcm5bD5JDfoiFa2Rg4yy58UY\"]},\"src/modules/HydrateProxy.sol\":{\"keccak256\":\"0x752af9c737c139f76c66a923367fc54be4376380ec2a96f9d7d99642ec5948fe\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://9eabbdb47f06d4a98bb4346e63ed76feb76e1b8169fc49ef5510fbe3f455da40\",\"dweb:/ipfs/QmeGobfYp8rvDheTimBn3PXLc9hXum4mtQwepkU3YT1ijQ\"]},\"src/modules/MalleableSapient.sol\":{\"keccak256\":\"0x674853f51a7f0b38643068f55052ff7aa786319c690ddd89472571ad26e99801\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a5ce017d5831ca856f26bd7a3f7f18304499807803c6cdd6133ed2e253ce9792\",\"dweb:/ipfs/QmT5pX43g45XAFMpaJtxGGeyzbbYXMieve1Y19vLsUgfkd\"]},\"src/modules/RequireUtils.sol\":{\"keccak256\":\"0x8d102f739601d79869f7c819c2a5658f8d077f6bfeacbfddc1cde7ba075b60d1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6b5a8ae6abf6e58c3f63e9d39d0adf447f427bbd5f5d9186f51526066a450b20\",\"dweb:/ipfs/QmRrntmAjVdAgx4yp3i11KHNEC4gQM6UtNaDZjPWBaVKuK\"]},\"src/modules/Sweep.sol\":{\"keccak256\":\"0x7f9ae4111a83d775ad662eb915eeee25f9a4ea1647fa94c31ebb785582d3e45f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d6b70167c7335d3d985e1ab8ea000af2a2e4b3bd2e04bddd0f3cb5c8fe16dc5b\",\"dweb:/ipfs/QmcHRFVcNAGiHFsxwbgiC9omWJzsLvZcp3Gt9ipgNgnpES\"]},\"src/utils/CalldataDecode.sol\":{\"keccak256\":\"0xeb8828430170582d97302eda0617cc339ea92fbd422e5499841ee0876a63385d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://bfdffd2cd35b13f83289032cbf4853a7323de127275745937ac4d32383d5c7f2\",\"dweb:/ipfs/QmXDHL5vceS5B1JM9cBZ39VqwwNbVDm23guNi4x5RARhEm\"]},\"src/utils/ReplaceBytes.sol\":{\"keccak256\":\"0xb2123b6a149480333fa113f914962351cd1f84c3bf6decd6dc85d8e6f692ba1f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://9c283b95243c2dc8569f098e3dcf035b0db3c611f5bd5ce6a643617f0c3e9de4\",\"dweb:/ipfs/QmbQUKSxFCQBxCj4YSqtPtuQWKc2fqYm7WE81Lbd4EkVUb\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"BalanceSweepFailed"},{"inputs":[{"internalType":"bytes","name":"result","type":"bytes"}],"type":"error","name":"DelegateCallFailed"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"type":"error","name":"DelegateCallNotAllowed"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"minBalance","type":"uint256"}],"type":"error","name":"ERC1155BalanceTooLow"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"minBalance","type":"uint256"}],"type":"error","name":"ERC1155BatchBalanceTooLow"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"type":"error","name":"ERC1155NotApproved"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"minAllowance","type":"uint256"}],"type":"error","name":"ERC20AllowanceTooLow"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"minBalance","type":"uint256"}],"type":"error","name":"ERC20BalanceTooLow"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"type":"error","name":"ERC721NotApproved"},{"inputs":[{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"type":"error","name":"Expired"},{"inputs":[{"internalType":"uint8","name":"kind","type":"uint8"}],"type":"error","name":"InvalidKind"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"}],"type":"error","name":"LengthMismatch"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"minBalance","type":"uint256"}],"type":"error","name":"NativeBalanceTooLow"},{"inputs":[],"type":"error","name":"NonTransactionPayload"},{"inputs":[{"internalType":"struct Payload.Decoded","name":"_payload","type":"tuple","components":[{"internalType":"uint8","name":"kind","type":"uint8"},{"internalType":"bool","name":"noChainId","type":"bool"},{"internalType":"struct Payload.Call[]","name":"calls","type":"tuple[]","components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"bool","name":"delegateCall","type":"bool"},{"internalType":"bool","name":"onlyFallback","type":"bool"},{"internalType":"uint256","name":"behaviorOnError","type":"uint256"}]},{"internalType":"uint256","name":"space","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bytes32","name":"imageHash","type":"bytes32"},{"internalType":"bytes32","name":"digest","type":"bytes32"},{"internalType":"address[]","name":"parentWallets","type":"address[]"}]},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_gasLeft","type":"uint256"}],"type":"error","name":"NotEnoughGas"},{"inputs":[],"type":"error","name":"OnlyDelegateCallAllowed"},{"inputs":[{"internalType":"struct Payload.Decoded","name":"_payload","type":"tuple","components":[{"internalType":"uint8","name":"kind","type":"uint8"},{"internalType":"bool","name":"noChainId","type":"bool"},{"internalType":"struct Payload.Call[]","name":"calls","type":"tuple[]","components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"bool","name":"delegateCall","type":"bool"},{"internalType":"bool","name":"onlyFallback","type":"bool"},{"internalType":"uint256","name":"behaviorOnError","type":"uint256"}]},{"internalType":"uint256","name":"space","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bytes32","name":"imageHash","type":"bytes32"},{"internalType":"bytes32","name":"digest","type":"bytes32"},{"internalType":"address[]","name":"parentWallets","type":"address[]"}]},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"bytes","name":"_returnData","type":"bytes"}],"type":"error","name":"Reverted"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"type":"error","name":"SafeERC20FailedOperation"},{"inputs":[{"internalType":"uint256","name":"flag","type":"uint256"}],"type":"error","name":"UnknownHydrateDataCommand"},{"inputs":[{"internalType":"bytes32","name":"_opHash","type":"bytes32","indexed":false},{"internalType":"uint256","name":"_index","type":"uint256","indexed":false},{"internalType":"bytes","name":"_returnData","type":"bytes","indexed":false}],"type":"event","name":"CallAborted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"_opHash","type":"bytes32","indexed":false},{"internalType":"uint256","name":"_index","type":"uint256","indexed":false},{"internalType":"bytes","name":"_returnData","type":"bytes","indexed":false}],"type":"event","name":"CallFailed","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"_opHash","type":"bytes32","indexed":false},{"internalType":"uint256","name":"_index","type":"uint256","indexed":false}],"type":"event","name":"CallSkipped","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"_opHash","type":"bytes32","indexed":false},{"internalType":"uint256","name":"_index","type":"uint256","indexed":false}],"type":"event","name":"CallSucceeded","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"handleSequenceDelegateCall"},{"inputs":[{"internalType":"bytes","name":"packedPayload","type":"bytes"},{"internalType":"bytes","name":"hydratePayload","type":"bytes"}],"stateMutability":"payable","type":"function","name":"hydrateExecute"},{"inputs":[{"internalType":"bytes","name":"packedPayload","type":"bytes"},{"internalType":"address","name":"sweepTarget","type":"address"},{"internalType":"address[]","name":"tokensToSweep","type":"address[]"},{"internalType":"bool","name":"sweepNative","type":"bool"},{"internalType":"bytes","name":"hydratePayload","type":"bytes"}],"stateMutability":"payable","type":"function","name":"hydrateExecuteAndSweep"},{"inputs":[{"internalType":"struct Payload.Decoded","name":"payload","type":"tuple","components":[{"internalType":"uint8","name":"kind","type":"uint8"},{"internalType":"bool","name":"noChainId","type":"bool"},{"internalType":"struct Payload.Call[]","name":"calls","type":"tuple[]","components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"bool","name":"delegateCall","type":"bool"},{"internalType":"bool","name":"onlyFallback","type":"bool"},{"internalType":"uint256","name":"behaviorOnError","type":"uint256"}]},{"internalType":"uint256","name":"space","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bytes32","name":"imageHash","type":"bytes32"},{"internalType":"bytes32","name":"digest","type":"bytes32"},{"internalType":"address[]","name":"parentWallets","type":"address[]"}]},{"internalType":"bytes","name":"signature","type":"bytes"}],"stateMutability":"view","type":"function","name":"recoverSapientSignature","outputs":[{"internalType":"bytes32","name":"imageHash","type":"bytes32"}]},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"requireERC1155Approval"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"requireERC1155ApprovalSelf"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"requireERC721Approval"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"requireERC721ApprovalSelf"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"minBalance","type":"uint256"}],"stateMutability":"view","type":"function","name":"requireMinBalance"},{"inputs":[{"internalType":"uint256","name":"minBalance","type":"uint256"}],"stateMutability":"view","type":"function","name":"requireMinBalanceSelf"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"minBalance","type":"uint256"}],"stateMutability":"view","type":"function","name":"requireMinERC1155Balance"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"minBalances","type":"uint256[]"}],"stateMutability":"view","type":"function","name":"requireMinERC1155BalanceBatch"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"minBalances","type":"uint256[]"}],"stateMutability":"view","type":"function","name":"requireMinERC1155BalanceBatchSelf"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"minBalance","type":"uint256"}],"stateMutability":"view","type":"function","name":"requireMinERC1155BalanceSelf"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"minAllowance","type":"uint256"}],"stateMutability":"view","type":"function","name":"requireMinERC20Allowance"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"minAllowance","type":"uint256"}],"stateMutability":"view","type":"function","name":"requireMinERC20AllowanceSelf"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"minBalance","type":"uint256"}],"stateMutability":"view","type":"function","name":"requireMinERC20Balance"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"minBalance","type":"uint256"}],"stateMutability":"view","type":"function","name":"requireMinERC20BalanceSelf"},{"inputs":[{"internalType":"uint256","name":"expiration","type":"uint256"}],"stateMutability":"view","type":"function","name":"requireNonExpired"},{"inputs":[{"internalType":"address","name":"sweepTarget","type":"address"},{"internalType":"address[]","name":"tokensToSweep","type":"address[]"},{"internalType":"bool","name":"sweepNative","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"sweep"},{"inputs":[],"stateMutability":"payable","type":"receive"}],"devdoc":{"kind":"dev","methods":{"handleSequenceDelegateCall(bytes32,uint256,uint256,uint256,uint256,bytes)":{"details":"Expects `data` to be ABI-encoded as `(bytes packedPayload, bytes hydratePayload)`."},"hydrateExecute(bytes,bytes)":{"details":"`hydratePayload` is a byte stream grouped by call index: - Starts with a 1-byte `tindex` (the call to hydrate). - Followed by commands for that call. Each command starts with a 1-byte `flag`. - A `SIGNAL_NEXT_HYDRATE` (0x00) ends the current call's section; if more bytes remain, the next byte is the next `tindex`. The supported command flags are the `HYDRATE_*` constants in this file."},"hydrateExecuteAndSweep(bytes,address,address[],bool,bytes)":{"params":{"sweepNative":"Whether to sweep native tokens","sweepTarget":"If zero address, defaults to `msg.sender`.","tokensToSweep":"Token list to sweep (each full balance of this contract)."}},"recoverSapientSignature((uint8,bool,(address,uint256,bytes,uint256,bool,bool,uint256)[],uint256,uint256,bytes,bytes32,bytes32,address[]),bytes)":{"details":"Reverts if `payload.kind` is not `Payload.KIND_TRANSACTIONS`."},"sweep(address,address[],bool)":{"params":{"sweepNative":"Whether to sweep native tokens","sweepTarget":"The address to sweep the balances to","tokensToSweep":"The tokens to sweep"}}},"version":1},"userdoc":{"kind":"user","methods":{"handleSequenceDelegateCall(bytes32,uint256,uint256,uint256,uint256,bytes)":{"notice":"Hook used by Sequence wallets for delegatecall-based execution."},"hydrateExecute(bytes,bytes)":{"notice":"Hydrates `packedPayload` using `hydratePayload` and then executes the batch."},"hydrateExecuteAndSweep(bytes,address,address[],bool,bytes)":{"notice":"Hydrates + executes, then sweeps ETH and a set of ERC20s to a recipient."},"recoverSapientSignature((uint8,bool,(address,uint256,bytes,uint256,bool,bool,uint256)[],uint256,uint256,bytes,bytes32,bytes32,address[]),bytes)":{"notice":"Computes the `imageHash` for a transaction payload with a malleable `data` commitment."},"requireERC1155Approval(address,address,address)":{"notice":"Reverts if `operator` is not approved for all of `owner`'s tokens on `token` (ERC1155)."},"requireERC1155ApprovalSelf(address,address)":{"notice":"Reverts if `operator` is not approved for all of `msg.sender`'s tokens on `token` (ERC1155)."},"requireERC721Approval(address,address,address,uint256)":{"notice":"Reverts if `spender` is not approved to transfer `tokenId` from `owner` on `token` (ERC721)."},"requireERC721ApprovalSelf(address,address,uint256)":{"notice":"Reverts if `spender` is not approved to transfer `tokenId` from `msg.sender` on `token` (ERC721)."},"requireMinBalance(address,uint256)":{"notice":"Reverts if `wallet` has less than `minBalance` native ETH."},"requireMinBalanceSelf(uint256)":{"notice":"Reverts if `msg.sender` has less than `minBalance` native ETH."},"requireMinERC1155Balance(address,address,uint256,uint256)":{"notice":"Reverts if `wallet` has less than `minBalance` of `tokenId` on `token` (ERC1155)."},"requireMinERC1155BalanceBatch(address,address,uint256[],uint256[])":{"notice":"Reverts if any `tokenIds[i]` balance of `wallet` is below `minBalances[i]` (ERC1155 batch)."},"requireMinERC1155BalanceBatchSelf(address,uint256[],uint256[])":{"notice":"Reverts if any `tokenIds[i]` balance of `msg.sender` is below `minBalances[i]` (ERC1155 batch)."},"requireMinERC1155BalanceSelf(address,uint256,uint256)":{"notice":"Reverts if `msg.sender` has less than `minBalance` of `tokenId` on `token` (ERC1155)."},"requireMinERC20Allowance(address,address,address,uint256)":{"notice":"Reverts if `owner` has granted `spender` less than `minAllowance` for `token`."},"requireMinERC20AllowanceSelf(address,address,uint256)":{"notice":"Reverts if `msg.sender` has granted `spender` less than `minAllowance` for `token`."},"requireMinERC20Balance(address,address,uint256)":{"notice":"Reverts if `wallet` has less than `minBalance` of `token`."},"requireMinERC20BalanceSelf(address,uint256)":{"notice":"Reverts if `msg.sender` has less than `minBalance` of `token`."},"requireNonExpired(uint256)":{"notice":"Reverts if `block.timestamp` is greater than or equal to `expiration`."},"sweep(address,address[],bool)":{"notice":"Sweeps balances to a target address"}},"version":1}},"settings":{"remappings":["@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","account-abstraction/=lib/wallet-contracts-v3/lib/account-abstraction/contracts/","erc2470-libs/=lib/wallet-contracts-v3/lib/erc2470-libs/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/wallet-contracts-v3/lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/","trails-test/=test/","wallet-contracts-v3-external/=../wallet-contracts-v3/src/","wallet-contracts-v3/=lib/wallet-contracts-v3/src/"],"optimizer":{"enabled":true,"runs":4294967295},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/TrailsUtils.sol":"TrailsUtils"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol":{"keccak256":"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d","urls":["bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100","dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"keccak256":"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc","urls":["bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037","dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol":{"keccak256":"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44","urls":["bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d","dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol":{"keccak256":"0xf189f9b417fe1931e1ab706838aff1128528694a9fcdb5ff7665197f2ca57d09","urls":["bzz-raw://2ff0143c836c8c9f85d13708733c09e21251395847fccfb518bf3b556726a840","dweb:/ipfs/QmP69sjjrQrhYAsvCSSB69Bx66SiUPdQUqdzMYnf4wANHm"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2","urls":["bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303","dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x869c06fcfd4e33df584f63c033467c3d4f5e51bdf78bc69d0eeef5c07e395ad9","urls":["bzz-raw://436721c3801101a789b998f14f161de63edb64229ff307b0951a97a964f07168","dweb:/ipfs/QmaFWLRmVXFL629AyThz8Nc8W7RakZBVGo14AWB2WLyKcP"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol":{"keccak256":"0xf78f05f3b8c9f75570e85300d7b4600d7f6f6a198449273f31d44c1641adb46f","urls":["bzz-raw://e28b872613b45e0e801d4995aa4380be2531147bfe2d85c1d6275f1de514fba3","dweb:/ipfs/QmeeFcfShHYaS3BdgVj78nxR28ZaVUwbvr66ud8bT6kzw9"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"},"lib/wallet-contracts-v3/src/modules/Calls.sol":{"keccak256":"0xd3377786c934649567774cc07e4b29196e9192e5cd5267e94e270a924b87ba36","urls":["bzz-raw://e2540650137b16ad9e924077992b0f5e1790074bd5de638a3a92362c1df890ea","dweb:/ipfs/QmYqWZ9x1HJHDvHgDGNKFTymqj8BQjnZLMQ7TydV9Wb8qX"],"license":"Apache-2.0"},"lib/wallet-contracts-v3/src/modules/Nonce.sol":{"keccak256":"0x56fbf6dc9b34ab60ae8a32ffb6f583c003bb8f4a5223ce704e982400fa403fab","urls":["bzz-raw://492f53628633b862702cf8f9b726067a722c94028133a8a4c4fcf3d0e73ad803","dweb:/ipfs/QmTHNy4XbH47YZaqKDpknb5aApjRH9HVAREHN7N5vEFWEV"],"license":"Apache-2.0"},"lib/wallet-contracts-v3/src/modules/Payload.sol":{"keccak256":"0x03b3dc2a4a556d3007671e910813dc4703ecb16f5bc2c6645e4c0d8512f2d76a","urls":["bzz-raw://9b41263156d5a310a48038e8c3871e9acdb806c018bc952d1a56efed62954e17","dweb:/ipfs/QmaiuTbQgaiCvtN2V6roe4RTi6hHV85mNZpWKqvKA8ofqw"],"license":"Apache-2.0"},"lib/wallet-contracts-v3/src/modules/ReentrancyGuard.sol":{"keccak256":"0x566e105b1a53f49cf099037f3cb4a9739522d72739dc65f1169b97e4fbe07b32","urls":["bzz-raw://d811a16613746e5290eab76eb4055d98a1e64e1086632697d09b0a3759a6bac5","dweb:/ipfs/QmPJ33JvAxwn1sTCNvYG2TWsFo991KND2ia8JcvZ26Dge9"],"license":"MIT"},"lib/wallet-contracts-v3/src/modules/Storage.sol":{"keccak256":"0xa6bc516642ea99194f3ac4375853daee3190272c4006d1e32f84ba88ec30173f","urls":["bzz-raw://209ba57704f952514910c54896df70197c695c2b4eeb1166a2c6ed29380741da","dweb:/ipfs/QmNmQpemo7qQxb2aDXdFooE6xNW1cp7gXGYa8xUUcJ4WWn"],"license":"Apache-2.0"},"lib/wallet-contracts-v3/src/modules/auth/BaseAuth.sol":{"keccak256":"0xbf2e40def03fcb5f4a5129b2f5803e21951325b92e00126cbe1427b7c25cfefd","urls":["bzz-raw://b560905fcc4b957d27c2abed78a1e82529c89fa472e91b3d108fbfd91aa7c3f7","dweb:/ipfs/QmRjLLtTWE6dFX2kBQCgLz7ossfMxhAFgDC8Jx9XuGL6Wy"],"license":"Apache-2.0"},"lib/wallet-contracts-v3/src/modules/auth/BaseSig.sol":{"keccak256":"0x394ed24efe7a4468966e51f649f754bbb66dfffc0574499ec758dc1a5a8e1caa","urls":["bzz-raw://ff4abc523d721df1680d6809c382fbf20b9e5cc17e5bdfd8f623ca7cf00061c8","dweb:/ipfs/QmUXnDME7rDCLvhvFVN7eLFjHbH955DWNmWefLxEyDV4W3"],"license":"Apache-2.0"},"lib/wallet-contracts-v3/src/modules/auth/SelfAuth.sol":{"keccak256":"0x4d517af51c3af39a19a4ed00f3fc89e965e45942c264189085bc24f1987a526c","urls":["bzz-raw://1be166f75d2821e305b6906c34311a62629b1b3c90ac306d775e7330f23d5b42","dweb:/ipfs/QmYFLASBDFzcTXioV5459qvQ1NGaqzWMoLzGJeMas3Lg5W"],"license":"Apache-2.0"},"lib/wallet-contracts-v3/src/modules/interfaces/IAuth.sol":{"keccak256":"0xf6fa30af2ec91d5fbeac17c9b1f2aa73b7883c9ac98745605007e57666394b91","urls":["bzz-raw://6e90a87978519462f9612f4a17e38fddc1c7bcf700ff834a1de7dce326f30353","dweb:/ipfs/QmXmWAsRRK6t4jPs4VcXrouyokxdALM28D3odX7ub48WEp"],"license":"Apache-2.0"},"lib/wallet-contracts-v3/src/modules/interfaces/ICheckpointer.sol":{"keccak256":"0xa9ae32596a0bc2d6676b48826e9edaf6e97ee2f3f222e9ad7058be3ba1718513","urls":["bzz-raw://0f3a846233ba32fd7b89aac58415d969c4fa72f846e4a2c8e1be38b8d2eeb6a1","dweb:/ipfs/Qma5HMU9LCMXtzmevvZFU9mGH2fDgw5V11WQpez5QhCc7t"],"license":"Apache-2.0"},"lib/wallet-contracts-v3/src/modules/interfaces/IDelegatedExtension.sol":{"keccak256":"0xa2ae897e90fd70dd4a9e172bc04d019ba9c512e72c2df65fcb6daf87dd5ceb90","urls":["bzz-raw://cdf4b7c3dfb0aef6c9dbe8b2a0542018dc756ef2252d7101bcb3186192da0a11","dweb:/ipfs/QmPHCVu1DJ7fBrPBYA5y3hoF3a3XFEBwYCZ1ErGaxPhcYL"],"license":"Apache-2.0"},"lib/wallet-contracts-v3/src/modules/interfaces/IERC1271.sol":{"keccak256":"0xb33a198eb641c43c3ab89705f693e342ad87fcc28bfa48d63b5ed105968434c9","urls":["bzz-raw://a1abd7475b239c551d34325466804b09e587b62559faf9109ad1ac019eb57a6b","dweb:/ipfs/Qmd3MDHAmpFpLXdHY5Tnb7niJjPDr5hEnc4d63tpyFGmgF"],"license":"Apache-2.0"},"lib/wallet-contracts-v3/src/modules/interfaces/IPartialAuth.sol":{"keccak256":"0x0d1aa021615d8e90696e71a9468331457a1babfa2ffe169654b7456e5bcb7a73","urls":["bzz-raw://bbacd149a6358ab0d4b9c588d2e3a55fc71ed4723269150d7b91ca70092f6519","dweb:/ipfs/QmUSwtrYCrRcRFsy5rCzdMPrw1FCU7ZoeXdsW6kK9yc8FK"],"license":"Apache-2.0"},"lib/wallet-contracts-v3/src/modules/interfaces/ISapient.sol":{"keccak256":"0x3668daa83a61af054146345e53e571daf403f9bca9c3cc702f6f1cb655770359","urls":["bzz-raw://13aa453c7021c83d305ac7d714a93f78a03a8cc0032cb06cf54d5ebf09100489","dweb:/ipfs/QmSxar3KETtMzHXQuqQA9b8iK8cG3Z62EpWSeu8hhKW2xn"],"license":"Apache-2.0"},"lib/wallet-contracts-v3/src/utils/LibBytes.sol":{"keccak256":"0x4fe0b4786b2157e12384b90ae9daa1009b74b2547a8a24b800a8b998278c874b","urls":["bzz-raw://065129e32d1a318e89fb7587e136c33177a7848393f9055c0ac601b84741cd8c","dweb:/ipfs/QmVWucfHSHRJriRFNoJqoeDcVB4fDfqbccM8KPBmwcxVu3"],"license":"Apache-2.0"},"lib/wallet-contracts-v3/src/utils/LibOptim.sol":{"keccak256":"0x1d1e2234eec89069c3f8d59e370fd3470faaef9c1641cd722bae83f4e4921bde","urls":["bzz-raw://4c3d8b24e6c11fcea3462017b2df71ed4b9b32b2dab8a591cc91afc0b6c8dd81","dweb:/ipfs/QmXtrdWcNTfaYHodKRovkdDyRCQJcffDUZQAdgQCJNoq2x"],"license":"Apache-2.0"},"src/TrailsUtils.sol":{"keccak256":"0x86c794bd2a5e0d6c4e56772239eb857b9a3fc19b2d24d82e0f2e5275dd0ff147","urls":["bzz-raw://aedb53e138547fe408a265dfdf91f9c65c654d4bf18dd663624df0f909fa803a","dweb:/ipfs/QmSNpUNU9Ksm6Zi6YmCugfHcm5bD5JDfoiFa2Rg4yy58UY"],"license":"Apache-2.0"},"src/modules/HydrateProxy.sol":{"keccak256":"0x752af9c737c139f76c66a923367fc54be4376380ec2a96f9d7d99642ec5948fe","urls":["bzz-raw://9eabbdb47f06d4a98bb4346e63ed76feb76e1b8169fc49ef5510fbe3f455da40","dweb:/ipfs/QmeGobfYp8rvDheTimBn3PXLc9hXum4mtQwepkU3YT1ijQ"],"license":"Apache-2.0"},"src/modules/MalleableSapient.sol":{"keccak256":"0x674853f51a7f0b38643068f55052ff7aa786319c690ddd89472571ad26e99801","urls":["bzz-raw://a5ce017d5831ca856f26bd7a3f7f18304499807803c6cdd6133ed2e253ce9792","dweb:/ipfs/QmT5pX43g45XAFMpaJtxGGeyzbbYXMieve1Y19vLsUgfkd"],"license":"Apache-2.0"},"src/modules/RequireUtils.sol":{"keccak256":"0x8d102f739601d79869f7c819c2a5658f8d077f6bfeacbfddc1cde7ba075b60d1","urls":["bzz-raw://6b5a8ae6abf6e58c3f63e9d39d0adf447f427bbd5f5d9186f51526066a450b20","dweb:/ipfs/QmRrntmAjVdAgx4yp3i11KHNEC4gQM6UtNaDZjPWBaVKuK"],"license":"Apache-2.0"},"src/modules/Sweep.sol":{"keccak256":"0x7f9ae4111a83d775ad662eb915eeee25f9a4ea1647fa94c31ebb785582d3e45f","urls":["bzz-raw://d6b70167c7335d3d985e1ab8ea000af2a2e4b3bd2e04bddd0f3cb5c8fe16dc5b","dweb:/ipfs/QmcHRFVcNAGiHFsxwbgiC9omWJzsLvZcp3Gt9ipgNgnpES"],"license":"Apache-2.0"},"src/utils/CalldataDecode.sol":{"keccak256":"0xeb8828430170582d97302eda0617cc339ea92fbd422e5499841ee0876a63385d","urls":["bzz-raw://bfdffd2cd35b13f83289032cbf4853a7323de127275745937ac4d32383d5c7f2","dweb:/ipfs/QmXDHL5vceS5B1JM9cBZ39VqwwNbVDm23guNi4x5RARhEm"],"license":"Apache-2.0"},"src/utils/ReplaceBytes.sol":{"keccak256":"0xb2123b6a149480333fa113f914962351cd1f84c3bf6decd6dc85d8e6f692ba1f","urls":["bzz-raw://9c283b95243c2dc8569f098e3dcf035b0db3c611f5bd5ce6a643617f0c3e9de4","dweb:/ipfs/QmbQUKSxFCQBxCj4YSqtPtuQWKc2fqYm7WE81Lbd4EkVUb"],"license":"Apache-2.0"}},"version":1},"ast":{"absolutePath":"src/TrailsUtils.sol","id":44152,"exportedSymbols":{"HydrateProxy":[45063],"MalleableSapient":[45277],"RequireUtils":[45942],"TrailsUtils":[44151]},"nodeType":"SourceUnit","src":"39:648:43","nodes":[{"id":44137,"nodeType":"PragmaDirective","src":"39:24:43","nodes":[],"literals":["solidity","^","0.8",".27"]},{"id":44139,"nodeType":"ImportDirective","src":"65:66:43","nodes":[],"absolutePath":"src/modules/MalleableSapient.sol","file":"src/modules/MalleableSapient.sol","nameLocation":"-1:-1:-1","scope":44152,"sourceUnit":45278,"symbolAliases":[{"foreign":{"id":44138,"name":"MalleableSapient","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":45277,"src":"73:16:43","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":44141,"nodeType":"ImportDirective","src":"132:58:43","nodes":[],"absolutePath":"src/modules/HydrateProxy.sol","file":"src/modules/HydrateProxy.sol","nameLocation":"-1:-1:-1","scope":44152,"sourceUnit":45064,"symbolAliases":[{"foreign":{"id":44140,"name":"HydrateProxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":45063,"src":"140:12:43","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":44143,"nodeType":"ImportDirective","src":"191:58:43","nodes":[],"absolutePath":"src/modules/RequireUtils.sol","file":"src/modules/RequireUtils.sol","nameLocation":"-1:-1:-1","scope":44152,"sourceUnit":45943,"symbolAliases":[{"foreign":{"id":44142,"name":"RequireUtils","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":45942,"src":"199:12:43","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":44151,"nodeType":"ContractDefinition","src":"615:71:43","nodes":[],"abstract":false,"baseContracts":[{"baseName":{"id":44145,"name":"MalleableSapient","nameLocations":["639:16:43"],"nodeType":"IdentifierPath","referencedDeclaration":45277,"src":"639:16:43"},"id":44146,"nodeType":"InheritanceSpecifier","src":"639:16:43"},{"baseName":{"id":44147,"name":"HydrateProxy","nameLocations":["657:12:43"],"nodeType":"IdentifierPath","referencedDeclaration":45063,"src":"657:12:43"},"id":44148,"nodeType":"InheritanceSpecifier","src":"657:12:43"},{"baseName":{"id":44149,"name":"RequireUtils","nameLocations":["671:12:43"],"nodeType":"IdentifierPath","referencedDeclaration":45942,"src":"671:12:43"},"id":44150,"nodeType":"InheritanceSpecifier","src":"671:12:43"}],"canonicalName":"TrailsUtils","contractDependencies":[],"contractKind":"contract","documentation":{"id":44144,"nodeType":"StructuredDocumentation","src":"251:363:43","text":" @title TrailsUtils\n @notice Convenience contract that bundles multiple utility modules under a single deployed address.\n @dev\n This contract intentionally contains no additional logic; it simply inherits:\n - {MalleableSapient} for malleable commitments\n - {HydrateProxy} for hydrate + execute flows\n - {RequireUtils} for precondition checks"},"fullyImplemented":true,"linearizedBaseContracts":[44151,45942,45063,46068,45277,43865],"name":"TrailsUtils","nameLocation":"624:11:43","scope":44152,"usedErrors":[302,40256,40274,40697,44185,44189,44191,44195,45078,45292,45302,45314,45324,45336,45342,45350,45358,45366,45956],"usedEvents":[40221,40230,40239,40246]}],"license":"Apache-2.0"},"id":43} \ No newline at end of file diff --git a/contracts/contracts.go b/contracts/contracts.go index 2e3a35f4..36b35491 100644 --- a/contracts/contracts.go +++ b/contracts/contracts.go @@ -18,6 +18,7 @@ import ( seqsale721v0 "github.com/0xsequence/go-sequence/contracts/gen/seq_sale/erc721v0" "github.com/0xsequence/go-sequence/contracts/gen/supply" "github.com/0xsequence/go-sequence/contracts/gen/tokens" + trailsutils "github.com/0xsequence/go-sequence/contracts/gen/trailsutils" v1Factory "github.com/0xsequence/go-sequence/contracts/gen/v1/walletfactory" v1Estimator "github.com/0xsequence/go-sequence/contracts/gen/v1/walletgasestimator" v1Guest "github.com/0xsequence/go-sequence/contracts/gen/v1/walletguest" @@ -43,6 +44,7 @@ var GasEstimator, IERC1271, ISapient, ISapientCompact, + TrailsUtils, ERC20Mock, IERC20, IERC721, @@ -131,6 +133,7 @@ func init() { IERC1271 = artifact("IERC1271", ierc1271.IERC1271ABI, "") ISapient = artifact("ISapient", isapient.ISapientABI, "") ISapientCompact = artifact("ISapientCompact", isapient.ISapientCompactABI, "") + TrailsUtils = artifact("TRAILS_UTILS", trailsutils.TrailsUtilsABI, trailsutils.TrailsUtilsBin) IERC20 = artifact("IERC20", tokens.IERC20ABI, "") IERC721 = artifact("IERC721", tokens.IERC721ABI, "") diff --git a/contracts/gen/gen.go b/contracts/gen/gen.go index 664afa5e..1502fdb9 100644 --- a/contracts/gen/gen.go +++ b/contracts/gen/gen.go @@ -76,6 +76,11 @@ //go:generate go run github.com/0xsequence/ethkit/cmd/ethkit abigen --pkg=isapient --type=ISapient --outFile=./isapient/isapient.gen.go --artifactsFile=../artifacts/wallet-contracts-v3/ISapient.sol/ISapient.json //go:generate go run github.com/0xsequence/ethkit/cmd/ethkit abigen --pkg=isapient --type=ISapientCompact --outFile=./isapient/isapientcompact.gen.go --artifactsFile=../artifacts/wallet-contracts-v3/ISapient.sol/ISapientCompact.json +// +// trails +// +//go:generate go run github.com/0xsequence/ethkit/cmd/ethkit abigen --pkg=trailsutils --type=TrailsUtils --outFile=./trailsutils/trails_utils.gen.go --artifactsFile=../artifacts/trails-contracts/TrailsUtils.sol/TrailsUtils.json + // // sequence marketplace // diff --git a/contracts/gen/trailsutils/trails_utils.gen.go b/contracts/gen/trailsutils/trails_utils.gen.go new file mode 100644 index 00000000..cb2646e4 --- /dev/null +++ b/contracts/gen/trailsutils/trails_utils.gen.go @@ -0,0 +1,1340 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package trailsutils + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/0xsequence/ethkit/go-ethereum" + "github.com/0xsequence/ethkit/go-ethereum/accounts/abi" + "github.com/0xsequence/ethkit/go-ethereum/accounts/abi/bind" + "github.com/0xsequence/ethkit/go-ethereum/common" + "github.com/0xsequence/ethkit/go-ethereum/core/types" + "github.com/0xsequence/ethkit/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// PayloadCall is an auto generated low-level Go binding around an user-defined struct. +type PayloadCall struct { + To common.Address + Value *big.Int + Data []byte + GasLimit *big.Int + DelegateCall bool + OnlyFallback bool + BehaviorOnError *big.Int +} + +// PayloadDecoded is an auto generated low-level Go binding around an user-defined struct. +type PayloadDecoded struct { + Kind uint8 + NoChainId bool + Calls []PayloadCall + Space *big.Int + Nonce *big.Int + Message []byte + ImageHash [32]byte + Digest [32]byte + ParentWallets []common.Address +} + +// TrailsUtilsMetaData contains all meta data concerning the TrailsUtils contract. +var TrailsUtilsMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"handleSequenceDelegateCall\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"hydrateExecute\",\"inputs\":[{\"name\":\"packedPayload\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"hydratePayload\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"hydrateExecuteAndSweep\",\"inputs\":[{\"name\":\"packedPayload\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sweepTarget\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokensToSweep\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"sweepNative\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"hydratePayload\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"recoverSapientSignature\",\"inputs\":[{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structPayload.Decoded\",\"components\":[{\"name\":\"kind\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"noChainId\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"calls\",\"type\":\"tuple[]\",\"internalType\":\"structPayload.Call[]\",\"components\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"delegateCall\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onlyFallback\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"behaviorOnError\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"space\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"imageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"digest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"parentWallets\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"imageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"requireERC1155Approval\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"requireERC1155ApprovalSelf\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"requireERC721Approval\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"requireERC721ApprovalSelf\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"requireMinBalance\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"minBalance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"requireMinBalanceSelf\",\"inputs\":[{\"name\":\"minBalance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"requireMinERC1155Balance\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minBalance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"requireMinERC1155BalanceBatch\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"minBalances\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"requireMinERC1155BalanceBatchSelf\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"minBalances\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"requireMinERC1155BalanceSelf\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minBalance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"requireMinERC20Allowance\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"minAllowance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"requireMinERC20AllowanceSelf\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"minAllowance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"requireMinERC20Balance\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"minBalance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"requireMinERC20BalanceSelf\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"minBalance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"requireNonExpired\",\"inputs\":[{\"name\":\"expiration\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sweep\",\"inputs\":[{\"name\":\"sweepTarget\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokensToSweep\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"sweepNative\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"CallAborted\",\"inputs\":[{\"name\":\"_opHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"_index\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"_returnData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CallFailed\",\"inputs\":[{\"name\":\"_opHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"_index\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"_returnData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CallSkipped\",\"inputs\":[{\"name\":\"_opHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"_index\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CallSucceeded\",\"inputs\":[{\"name\":\"_opHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"_index\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BalanceSweepFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DelegateCallFailed\",\"inputs\":[{\"name\":\"result\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"DelegateCallNotAllowed\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC1155BalanceTooLow\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minBalance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC1155BatchBalanceTooLow\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minBalance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC1155NotApproved\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC20AllowanceTooLow\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minAllowance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC20BalanceTooLow\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minBalance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC721NotApproved\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Expired\",\"inputs\":[{\"name\":\"expiration\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidKind\",\"inputs\":[{\"name\":\"kind\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"LengthMismatch\",\"inputs\":[{\"name\":\"a\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"b\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"NativeBalanceTooLow\",\"inputs\":[{\"name\":\"wallet\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minBalance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"NonTransactionPayload\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotEnoughGas\",\"inputs\":[{\"name\":\"_payload\",\"type\":\"tuple\",\"internalType\":\"structPayload.Decoded\",\"components\":[{\"name\":\"kind\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"noChainId\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"calls\",\"type\":\"tuple[]\",\"internalType\":\"structPayload.Call[]\",\"components\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"delegateCall\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onlyFallback\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"behaviorOnError\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"space\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"imageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"digest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"parentWallets\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"_index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_gasLeft\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OnlyDelegateCallAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Reverted\",\"inputs\":[{\"name\":\"_payload\",\"type\":\"tuple\",\"internalType\":\"structPayload.Decoded\",\"components\":[{\"name\":\"kind\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"noChainId\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"calls\",\"type\":\"tuple[]\",\"internalType\":\"structPayload.Call[]\",\"components\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"delegateCall\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onlyFallback\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"behaviorOnError\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"space\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"imageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"digest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"parentWallets\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"_index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_returnData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnknownHydrateDataCommand\",\"inputs\":[{\"name\":\"flag\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", + Bin: "0x60a0806040523460295730608052613013908161002e82396080518181816107e80152611c790152f35b5f80fdfe6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c806284290d1461015857806303bbbd65146101535780630cb17e5c1461014e57806313792a4a146101495780632ab793d714610144578063333f790d1461013f578063372618cb1461013a57806342ab921e14610135578063476a5f40146101305780634c4e814c1461012b578063505c7ed3146101265780636d42cf03146101215780636ef1f0dd1461011c5780637f29d538146101175780638d0a9ea714610112578063a7b7ec5a1461010d578063bd1e4acb14610108578063e246466a14610103578063fdc25428146100fe5763fe08e7ca0361000e57610c36565b610bac565b610b93565b610ae3565b610a71565b610a50565b6109e5565b6109cc565b61090c565b6108b5565b610796565b610702565b6106b7565b610617565b6105dc565b610580565b610292565b610212565b6101cb565b61017f565b73ffffffffffffffffffffffffffffffffffffffff81160361017b57565b5f80fd5b3461017b5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b576100186004356101bd8161015d565b602435604435913390610f0e565b3461017b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b576100186004356102098161015d565b60243590611032565b3461017b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b576100186004356102508161015d565b6024359061025d8261015d565b339061109e565b9181601f8401121561017b5782359167ffffffffffffffff831161017b576020838186019501011161017b57565b3461017b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b5760043567ffffffffffffffff811161017b5780600401906101207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc823603011261017b5760243567ffffffffffffffff811161017b57610325903690600401610264565b60ff61033085610c50565b1661055857919061036261035460648401356084850135905f5260205260405f2090565b46905f5260205260405f2090565b9060445f9301915b6103748387610c5e565b90508410156104a1576104996001918561039881610392888c610c5e565b90610cdf565b6104896103a482610d24565b61045d6020840135936060810135906103bf60808201610d31565b60c06103cd60a08401610d31565b92013592604051978896602088019a8b93909796959273ffffffffffffffffffffffffffffffffffffffff60e09693610100875260046101008801527f63616c6c0000000000000000000000000000000000000000000000000000000061012088015261014087019a602088015216604086015260608501526080840152151560a0830152151560c08201520152565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610d89565b519020905f5260205260405f2090565b93019261036a565b939250905f5b8381106104b957604051858152602090f35b82939461054261ffff61050a61053a8a8861053061052660ff6103928c61051e8a9e9f61054f9e6104f59160019092919283013560f81c920190565b9416998a948881013560f01c91600290910190565b9b169a8b9781013560f01c91600290910190565b9e1696610c5e565b6040810190610dca565b9092820192610e1b565b92909161118b565b905f5260205260405f2090565b939291906104a7565b7f3c28730f000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461017b5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b576100186004356105be8161015d565b6024356105ca8161015d565b604435916105d78361015d565b61109e565b3461017b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b5761001860043533611032565b3461017b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b576100186004356106558161015d565b60243590339061124d565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc608091011261017b576004356106968161015d565b906024356106a38161015d565b906044356106b08161015d565b9060643590565b3461017b576100186106c836610660565b9291909161134e565b9181601f8401121561017b5782359167ffffffffffffffff831161017b576020808501948460051b01011161017b57565b3461017b5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b5760043561073d8161015d565b6024356107498161015d565b60443567ffffffffffffffff811161017b576107699036906004016106d1565b606435939167ffffffffffffffff851161017b5761078e6100189536906004016106d1565b9490936115de565b3461017b5760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b5760a43567ffffffffffffffff811161017b576107e5903690600401610264565b907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8116301461088d57825f939284936040519283928337810184815203915af4610843610e6d565b901561084b57005b610889906040519182917ff7a01e4d000000000000000000000000000000000000000000000000000000008352602060048401526024830190610e9c565b0390fd5b7f827e6c75000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461017b5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b576100186004356108f38161015d565b6024356108ff8161015d565b6044359060643592610f0e565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b5760043567ffffffffffffffff811161017b57610956903690600401610264565b6024359167ffffffffffffffff831161017b5761097a610018933690600401610264565b9290916119bd565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606091011261017b576004356109b88161015d565b906024356109c58161015d565b9060443590565b3461017b576100186109dd36610982565b91339061134e565b3461017b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b5760043580421015610a2157005b7faa2fd925000000000000000000000000000000000000000000000000000000005f526004524260245260445ffd5b3461017b57610018610a6136610982565b9161124d565b8015150361017b57565b3461017b5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b57600435610aac8161015d565b6024359067ffffffffffffffff821161017b57610ad06100189236906004016106d1565b9060443592610ade84610a67565b611d40565b60a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b5760043567ffffffffffffffff811161017b57610b2d903690600401610264565b60243591610b3a8361015d565b60443567ffffffffffffffff811161017b57610b5a9036906004016106d1565b60643591610b6783610a67565b6084359567ffffffffffffffff871161017b57610b8b610018973690600401610264565b969095610edf565b3461017b57610018610ba436610982565b913390611e9f565b3461017b5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017b57600435610be78161015d565b60243567ffffffffffffffff811161017b57610c079036906004016106d1565b916044359267ffffffffffffffff841161017b57610c2c6100189436906004016106d1565b93909233906115de565b3461017b57610018610c4736610660565b92919091611e9f565b3560ff8116810361017b5790565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561017b570180359067ffffffffffffffff821161017b57602001918160051b3603831361017b57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9190811015610d1f5760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff218136030182121561017b570190565b610cb2565b35610d2e8161015d565b90565b35610d2e81610a67565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60e0810190811067ffffffffffffffff821117610d8457604052565b610d3b565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610d8457604052565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561017b570180359067ffffffffffffffff821161017b5760200191813603831361017b57565b9093929384831161017b57841161017b578101920390565b67ffffffffffffffff8111610d8457601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b3d15610e97573d90610e7e82610e33565b91610e8c6040519384610d89565b82523d5f602084013e565b606090565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602080948051918291828752018686015e5f8582860101520116010190565b95610ef29791610ade93949596976119bd565b565b9081602091031261017b575190565b6040513d5f823e3d90fd5b91929092604051907efdd58e00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff8516600483015280602483015260208260448173ffffffffffffffffffffffffffffffffffffffff88165afa91821561102d575f92610ffc575b50828210610f96575050505050565b6040517fbf8ee56100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff948516600482015294909316602485015260448401929092526064830191909152608482015260a490fd5b61101f91925060203d602011611026575b6110178183610d89565b810190610ef4565b905f610f87565b503d61100d565b610f03565b80319082821061104157505050565b73ffffffffffffffffffffffffffffffffffffffff907f1afe1f42000000000000000000000000000000000000000000000000000000005f521660045260245260445260645ffd5b9081602091031261017b5751610d2e81610a67565b6040517fe985e9c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015284811660248301529190911690602081604481855afa90811561102d575f9161115c575b501561111057505050565b73ffffffffffffffffffffffffffffffffffffffff929183917f628b17c6000000000000000000000000000000000000000000000000000000005f52600452166024521660445260645ffd5b61117e915060203d602011611184575b6111768183610d89565b810190611089565b5f611105565b503d61116c565b92611247917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6101009380604051978895602087019a60808c52600e60a08901527f7374617469632d73656374696f6e00000000000000000000000000000000000060c08901526040880152606087015260c060808701528160e0870152868601375f8582860101520116810103017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610d89565b51902090565b919091604051917f70a0823100000000000000000000000000000000000000000000000000000000835273ffffffffffffffffffffffffffffffffffffffff8416600484015260208360248173ffffffffffffffffffffffffffffffffffffffff86165afa92831561102d575f9361132d575b508083106112ce5750505050565b60606040519485947f7684050d00000000000000000000000000000000000000000000000000000000865273ffffffffffffffffffffffffffffffffffffffff6004870192816080850197168452166020830152604082015201520390fd5b61134791935060203d602011611026576110178183610d89565b915f6112c0565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015284811660248301529190911693929091602083604481885afa92831561102d575f93611427575b508383106113c7575050505050565b60a495509073ffffffffffffffffffffffffffffffffffffffff8092604051967f73cf338a000000000000000000000000000000000000000000000000000000008852600488015216602486015216604484015260648301526084820152fd5b61144191935060203d602011611026576110178183610d89565b915f6113b8565b67ffffffffffffffff8111610d845760051b60200190565b9061146a82611448565b6114776040519182610d89565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06114a58294611448565b0190602036910137565b8051821015610d1f5760209160051b010190565b60208183031261017b5780519067ffffffffffffffff821161017b57019080601f8301121561017b5781516114f781611448565b926115056040519485610d89565b81845260208085019260051b82010192831161017b57602001905b82821061152d5750505090565b8151815260209182019101611520565b604081016040825282518091526020606083019301905f5b8181106115a25750505060208183039101528281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161017b5760209260051b809284830137010190565b825173ffffffffffffffffffffffffffffffffffffffff16855260209485019490920191600101611555565b9190811015610d1f5760051b0190565b919093929385850361174c579084916115f683611460565b905f5b848110611711575050925f929173ffffffffffffffffffffffffffffffffffffffff61165595604051968795869485937f4e1273f40000000000000000000000000000000000000000000000000000000085526004850161153d565b0392165afa90811561102d575f916116ef575b505f5b838110611679575050505050565b61168381836114af565b5161168f8287866115ce565b351161169d5760010161166b565b826116b782876116b0826116ec976114af565b51936115ce565b7fe3758044000000000000000000000000000000000000000000000000000000005f5260049290925260245235604452606490565b5ffd5b61170b91503d805f833e6117038183610d89565b8101906114c3565b5f611668565b829394506117418261172683600195966114af565b9073ffffffffffffffffffffffffffffffffffffffff169052565b0190869392916115f9565b7fab8b67c6000000000000000000000000000000000000000000000000000000005f526004859052602486905260445ffd5b92919261178a82610e33565b916117986040519384610d89565b82948184528183011161017b578281602093845f960137010152565b9080602083519182815201916020808360051b8301019401925f915b8383106117df57505050505090565b9091929394602080827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0856001950301865288519073ffffffffffffffffffffffffffffffffffffffff8251168152828201518382015260c080611852604085015160e0604086015260e0850190610e9c565b936060810151606085015260808101511515608085015260a0810151151560a08501520151910152970193019301919392906117d0565b90602080835192838152019201905f5b8181106118a65750505090565b825173ffffffffffffffffffffffffffffffffffffffff16845260209384019390920191600101611899565b805160ff168252610d2e9160208281015115159082015261010061193061190a604085015161012060408601526101208501906117b4565b606085015160608501526080850151608085015260a085015184820360a0860152610e9c565b9260c081015160c084015260e081015160e0840152015190610100818403910152611889565b61196e604092959493956060835260608301906118d2565b9460208201520152565b610d2e9392606092825260208201528160408201520190610e9c565b6119aa610d2e94926060835260608301906118d2565b9260208201526040818403910152610e9c565b906119c79161217a565b6119f26119d38261243b565b6119de36868661177e565b60208151910120905f5260205260405f2090565b916119fd8482612547565b915f926040850192835151975f5b898110611a1f575b50505050505050505050565b808414611d29575b611a328187516114af565b5196611a4160a0890151151590565b80611d21575b611ce157505f966060810151801590811580611cd8575b611ca057608083018051151580611c61575b611c34575115611beb5790611ab191611a9d845173ffffffffffffffffffffffffffffffffffffffff1690565b9115611be657505a5b604084015191612b1c565b15611af4575b50604080518a815260208101839052600192917f5a589b1d8062f33451d29cae3dabd9b2e36c62aee644178c600977ca8dda661a91a15b01611a0b565b60c001805115611ba9576001815114611b6a5751600214611b15575f611ab7565b9796505050505050507fc2c704302430fe0dc8d95f272e2f4e54bbbc51a3327fd5d75ab41f9fc8fd129b9250611b58611b4c612b2d565b60405193849384611978565b0390a15f808080808080808080611a13565b5087610889611b77612b2d565b6040519384937f7f6b0bb100000000000000000000000000000000000000000000000000000000855260048501611994565b509550600180967f115f347c00e69f252cd6b63c4f81022a9564c6befe8aa719cb74640a4a306f0d818b611bde611b4c612b2d565b0390a1611aee565b611aa6565b611c2991611c0d845173ffffffffffffffffffffffffffffffffffffffff1690565b916020850151915f14611c2e57505a905b604085015192612b0b565b611ab1565b90611c1e565b7f230d1ccc000000000000000000000000000000000000000000000000000000005f52600485905260245ffd5b5073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163014611a70565b838b6108895a6040519384937f2139527400000000000000000000000000000000000000000000000000000000855260048501611956565b50805a10611a5e565b604080518b815260208101849052919850600192917f9ae934bf8a986157c889a24c3b3fa85e74b7e4ee4b1f8fc6e7362cb4c1d19d8b9181908101611bde565b508015611a47565b91928193611d3892868a6125ac565b929091611a27565b91929173ffffffffffffffffffffffffffffffffffffffff8116611e84575033925b5f5b818110611dc55750505080611dbc575b611d7b5750565b5f8080809347905af1611d8c610e6d565b5015611d9457565b7fd92fb848000000000000000000000000000000000000000000000000000000005f5260045ffd5b50471515611d74565b611df4611ddb611dd68385876115ce565b610d24565b73ffffffffffffffffffffffffffffffffffffffff1690565b90611e09611ddb611ddb611dd68487896115ce565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529290602090849060249082905afa801561102d5787611e5e926001955f93611e64575b50612b47565b01611d64565b611e7d91935060203d8111611026576110178183610d89565b915f611e58565b92611d62565b9081602091031261017b5751610d2e8161015d565b919073ffffffffffffffffffffffffffffffffffffffff83166040517f081812fc00000000000000000000000000000000000000000000000000000000815260208180611ef489600483019190602083019252565b0381855afa90811561102d575f91612020575b5073ffffffffffffffffffffffffffffffffffffffff808516911614159081611f93575b50611f365750505050565b6040517f6a7e2cc800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9384166004820152602481019490945282166044840152166064820152608490fd5b6040517fe985e9c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152851660248201529150602090829060449082905afa90811561102d575f91612001575b50155f611f2b565b61201a915060203d602011611184576111768183610d89565b5f611ff9565b612042915060203d602011612048575b61203a8183610d89565b810190611e8a565b5f611f07565b503d612030565b60405190610120820182811067ffffffffffffffff821117610d84576040526060610100835f81525f60208201528260408201525f838201525f60808201528260a08201525f60c08201525f60e08201520152565b906120ae82611448565b6120bb6040519182610d89565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06120e98294611448565b01905f5b8281106120f957505050565b60209060405161210881610d68565b5f81525f83820152606060408201525f60608201525f60808201525f60a08201525f60c0820152828285010152016120ed565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9190820180921161217557565b61213b565b91909161218561204f565b5f815292600190823560f81c827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183160161242457505f60608701525b60076121d260ff831660011c90565b16806123d3575b5060108181160361239e57506001925b6121f2846120a4565b92604087019384525f905b85821061220c57505050505050565b8281013560f81c9060010190918160018085160361237c5750612250306122348389516114af565b519073ffffffffffffffffffffffffffffffffffffffff169052565b60028084161461235c575b60048084161461230e575b6008808416146122db575b6122c46122be60c08561229d8a60806122948860108060019c9d161493516114af565b51019015159052565b6122b48a60a06122948860208087161493516114af565b1660061c60031690565b60ff1690565b60c06122d18389516114af565b51015201906121fd565b6001916122c4906122be9060c090878101359060200196906060612300878d516114af565b510152959450505050612271565b90612356908481013560e81c9060030161234f61233661232e8484612168565b838a8a610e1b565b91906040612345888d516114af565b510192369161177e565b9052612168565b90612266565b908381013590602001919060206123748389516114af565b51015261225b565b61239992508481013560601c9060140192906122348389516114af565b612250565b6020908116036123c05761ffff918381013560f01c906002015b9216926121e9565b60ff918381013560f81c906001016123b8565b612417919385929190928160031b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001821b019185013590610100031c16920190565b929060808701525f6121d9565b80850135606090811c9088015260140192506121c3565b60208101511561252c5761045d6112476124ea5f5b60405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83527f4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c5631860408301527f2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de606083015260808201523060a082015260a081526124e160c082610d89565b51902093612c53565b60405192839160208301958690916042927f19010000000000000000000000000000000000000000000000000000000000008352600283015260228201520190565b61045d6112476124ea46612450565b90821015610d1f570190565b919015612558576001913560f81c90565b5f91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146121755760010190565b94909193926125c6905b8381013560f81c91600190910190565b60ff819216918215612a865785918891600b85116129f257508086013560f01c93600290910192908390600181036126205750509260406126106125c6958261261b9501516114af565b510151903091612e45565b6125b6565b6002810361264b5750509260406126406125c6958261261b9501516114af565b510151903391612e45565b6003810361267657505092604061266b6125c6958261261b9501516114af565b510151903291612e45565b600481036126a15750509260406126966125c6958261261b9501516114af565b510151904791612e2c565b600581036126cd5750509260406126c16125c6958261261b9501516114af565b51015190333191612e2c565b600681036126f95750509260406126ed6125c6958261261b9501516114af565b51015190323191612e2c565b6007810361273557506125c6949361261b93508781013560601c9250601401905092604061272a89828d01516114af565b510151913191612e2c565b600881036127f157505050508381013560601c9060140190604061275c87828b01516114af565b5101516040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529093909160209083908173ffffffffffffffffffffffffffffffffffffffff81602481015b0392165afa90811561102d576125c69461261b935f936127d1575b50612e2c565b6127ea91935060203d8111611026576110178183610d89565b915f6127cb565b6009810361287057505050508381013560601c9060140190604061281887828b01516114af565b5101516040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201529093909160209083908173ffffffffffffffffffffffffffffffffffffffff81602481016127b0565b600a810361290757505050508381013560601c9060140190604061289787828b01516114af565b5101516040517f70a08231000000000000000000000000000000000000000000000000000000008152326004820152909390916020908390602490829073ffffffffffffffffffffffffffffffffffffffff165afa90811561102d576125c69461261b935f936127d15750612e2c565b93949293600b14612920575b505050506125c6906125b6565b6040945073ffffffffffffffffffffffffffffffffffffffff92916020916129c791612967918891612971918c81013560601c906014019094818e013560601c9160140190565b99909a01516114af565b510151966040519586809481937f70a082310000000000000000000000000000000000000000000000000000000083526004830191909173ffffffffffffffffffffffffffffffffffffffff6020820193169052565b0392165afa90811561102d576125c6946129e7935f936127d15750612e2c565b9050855f8581612913565b9392505050600c8103612a1657506125c69061261b336122348760408b01516114af565b600d8103612a3557506125c69061261b326122348760408b01516114af565b600e8103612a5b57506125c690476020612a538760408b01516114af565b5101526125b6565b7f324dd124000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b96505050929150838281105f14612ae457612ad4612aae6122be92612ae095612ada9561253b565b357fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b9261257f565b9190565b5050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b915f9391849360208451940192f190565b915f9291839260208351930191f490565b3d90604051916020818401016040528083525f602084013e565b9173ffffffffffffffffffffffffffffffffffffffff604051927fa9059cbb000000000000000000000000000000000000000000000000000000005f521660045260245260205f60448180865af160015f5114811615612bf1575b60409190915215612bb05750565b7f5274afe7000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff1660045260245ffd5b6001811516612c07573d15833b15151616612ba2565b503d5f823e3d90fd5b80516020909101905f5b818110612c275750505090565b825173ffffffffffffffffffffffffffffffffffffffff16845260209384019390920191600101612c1a565b610100810151604051612c6e8161045d602082018095612c10565b51902090612c7d815160ff1690565b60ff811680612cf657505090611247612c996040840151612ea3565b9261045d60806060830151920151936040519485936020850197889094939260809260a08301967f11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a284526020840152604083015260608201520152565b60018103612d5457505060a001518051602091820120604080517fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d46693810193845290810191909152606081019290925290611247816080810161045d565b60028103612daa57505060c00151604080517f11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e460208201908152918101929092526060820192909252611247816080810161045d565b600303612dfe575060e00151604080517fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d46660208201908152918101929092526060820192909252611247816080810161045d565b7f04818320000000000000000000000000000000000000000000000000000000005f5260ff1660045260245ffd5b908151602082019082821091111761017b570160200152565b908151601482019082821091111761017b576020910101906bffffffffffffffffffffffff8251169060601b179052565b80516020909101905f5b818110612e8d5750505090565b8251845260209384019390920191600101612e80565b9081517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0612ee9612ed383611448565b92612ee16040519485610d89565b808452611448565b013660208301375f5b8351811015612fc45780612f08600192866114af565b5173ffffffffffffffffffffffffffffffffffffffff81511690602081015190604081015160208151910120906060810151608082015115159060c060a08401511515930151936040519560208701977f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef437895260408801526060870152608086015260a085015260c084015260e08301526101008201526101008152612fb061012082610d89565b519020612fbd82856114af565b5201612ef2565b509091506040516112478161045d602082018095612e7656fea264697066735822122001031968cb5ed5075c2647347ed676838da85e531feafbedf6b1c523eefc070864736f6c634300081e0033", +} + +// TrailsUtilsABI is the input ABI used to generate the binding from. +// Deprecated: Use TrailsUtilsMetaData.ABI instead. +var TrailsUtilsABI = TrailsUtilsMetaData.ABI + +// TrailsUtilsBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use TrailsUtilsMetaData.Bin instead. +var TrailsUtilsBin = TrailsUtilsMetaData.Bin + +// DeployTrailsUtils deploys a new Ethereum contract, binding an instance of TrailsUtils to it. +func DeployTrailsUtils(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *TrailsUtils, error) { + parsed, err := TrailsUtilsMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(TrailsUtilsBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &TrailsUtils{TrailsUtilsCaller: TrailsUtilsCaller{contract: contract}, TrailsUtilsTransactor: TrailsUtilsTransactor{contract: contract}, TrailsUtilsFilterer: TrailsUtilsFilterer{contract: contract}}, nil +} + +// TrailsUtils is an auto generated Go binding around an Ethereum contract. +type TrailsUtils struct { + TrailsUtilsCaller // Read-only binding to the contract + TrailsUtilsTransactor // Write-only binding to the contract + TrailsUtilsFilterer // Log filterer for contract events +} + +// TrailsUtilsCaller is an auto generated read-only Go binding around an Ethereum contract. +type TrailsUtilsCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// TrailsUtilsTransactor is an auto generated write-only Go binding around an Ethereum contract. +type TrailsUtilsTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// TrailsUtilsFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type TrailsUtilsFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// TrailsUtilsSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type TrailsUtilsSession struct { + Contract *TrailsUtils // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// TrailsUtilsCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type TrailsUtilsCallerSession struct { + Contract *TrailsUtilsCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// TrailsUtilsTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type TrailsUtilsTransactorSession struct { + Contract *TrailsUtilsTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// TrailsUtilsRaw is an auto generated low-level Go binding around an Ethereum contract. +type TrailsUtilsRaw struct { + Contract *TrailsUtils // Generic contract binding to access the raw methods on +} + +// TrailsUtilsCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type TrailsUtilsCallerRaw struct { + Contract *TrailsUtilsCaller // Generic read-only contract binding to access the raw methods on +} + +// TrailsUtilsTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type TrailsUtilsTransactorRaw struct { + Contract *TrailsUtilsTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewTrailsUtils creates a new instance of TrailsUtils, bound to a specific deployed contract. +func NewTrailsUtils(address common.Address, backend bind.ContractBackend) (*TrailsUtils, error) { + contract, err := bindTrailsUtils(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &TrailsUtils{TrailsUtilsCaller: TrailsUtilsCaller{contract: contract}, TrailsUtilsTransactor: TrailsUtilsTransactor{contract: contract}, TrailsUtilsFilterer: TrailsUtilsFilterer{contract: contract}}, nil +} + +// NewTrailsUtilsCaller creates a new read-only instance of TrailsUtils, bound to a specific deployed contract. +func NewTrailsUtilsCaller(address common.Address, caller bind.ContractCaller) (*TrailsUtilsCaller, error) { + contract, err := bindTrailsUtils(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &TrailsUtilsCaller{contract: contract}, nil +} + +// NewTrailsUtilsTransactor creates a new write-only instance of TrailsUtils, bound to a specific deployed contract. +func NewTrailsUtilsTransactor(address common.Address, transactor bind.ContractTransactor) (*TrailsUtilsTransactor, error) { + contract, err := bindTrailsUtils(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &TrailsUtilsTransactor{contract: contract}, nil +} + +// NewTrailsUtilsFilterer creates a new log filterer instance of TrailsUtils, bound to a specific deployed contract. +func NewTrailsUtilsFilterer(address common.Address, filterer bind.ContractFilterer) (*TrailsUtilsFilterer, error) { + contract, err := bindTrailsUtils(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &TrailsUtilsFilterer{contract: contract}, nil +} + +// bindTrailsUtils binds a generic wrapper to an already deployed contract. +func bindTrailsUtils(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := TrailsUtilsMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_TrailsUtils *TrailsUtilsRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _TrailsUtils.Contract.TrailsUtilsCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_TrailsUtils *TrailsUtilsRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _TrailsUtils.Contract.TrailsUtilsTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_TrailsUtils *TrailsUtilsRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _TrailsUtils.Contract.TrailsUtilsTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_TrailsUtils *TrailsUtilsCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _TrailsUtils.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_TrailsUtils *TrailsUtilsTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _TrailsUtils.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_TrailsUtils *TrailsUtilsTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _TrailsUtils.Contract.contract.Transact(opts, method, params...) +} + +// RecoverSapientSignature is a free data retrieval call binding the contract method 0x13792a4a. +// +// Solidity: function recoverSapientSignature((uint8,bool,(address,uint256,bytes,uint256,bool,bool,uint256)[],uint256,uint256,bytes,bytes32,bytes32,address[]) payload, bytes signature) view returns(bytes32 imageHash) +func (_TrailsUtils *TrailsUtilsCaller) RecoverSapientSignature(opts *bind.CallOpts, payload PayloadDecoded, signature []byte) ([32]byte, error) { + var out []interface{} + err := _TrailsUtils.contract.Call(opts, &out, "recoverSapientSignature", payload, signature) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// RecoverSapientSignature is a free data retrieval call binding the contract method 0x13792a4a. +// +// Solidity: function recoverSapientSignature((uint8,bool,(address,uint256,bytes,uint256,bool,bool,uint256)[],uint256,uint256,bytes,bytes32,bytes32,address[]) payload, bytes signature) view returns(bytes32 imageHash) +func (_TrailsUtils *TrailsUtilsSession) RecoverSapientSignature(payload PayloadDecoded, signature []byte) ([32]byte, error) { + return _TrailsUtils.Contract.RecoverSapientSignature(&_TrailsUtils.CallOpts, payload, signature) +} + +// RecoverSapientSignature is a free data retrieval call binding the contract method 0x13792a4a. +// +// Solidity: function recoverSapientSignature((uint8,bool,(address,uint256,bytes,uint256,bool,bool,uint256)[],uint256,uint256,bytes,bytes32,bytes32,address[]) payload, bytes signature) view returns(bytes32 imageHash) +func (_TrailsUtils *TrailsUtilsCallerSession) RecoverSapientSignature(payload PayloadDecoded, signature []byte) ([32]byte, error) { + return _TrailsUtils.Contract.RecoverSapientSignature(&_TrailsUtils.CallOpts, payload, signature) +} + +// RequireERC1155Approval is a free data retrieval call binding the contract method 0x2ab793d7. +// +// Solidity: function requireERC1155Approval(address token, address owner, address operator) view returns() +func (_TrailsUtils *TrailsUtilsCaller) RequireERC1155Approval(opts *bind.CallOpts, token common.Address, owner common.Address, operator common.Address) error { + var out []interface{} + err := _TrailsUtils.contract.Call(opts, &out, "requireERC1155Approval", token, owner, operator) + + if err != nil { + return err + } + + return err + +} + +// RequireERC1155Approval is a free data retrieval call binding the contract method 0x2ab793d7. +// +// Solidity: function requireERC1155Approval(address token, address owner, address operator) view returns() +func (_TrailsUtils *TrailsUtilsSession) RequireERC1155Approval(token common.Address, owner common.Address, operator common.Address) error { + return _TrailsUtils.Contract.RequireERC1155Approval(&_TrailsUtils.CallOpts, token, owner, operator) +} + +// RequireERC1155Approval is a free data retrieval call binding the contract method 0x2ab793d7. +// +// Solidity: function requireERC1155Approval(address token, address owner, address operator) view returns() +func (_TrailsUtils *TrailsUtilsCallerSession) RequireERC1155Approval(token common.Address, owner common.Address, operator common.Address) error { + return _TrailsUtils.Contract.RequireERC1155Approval(&_TrailsUtils.CallOpts, token, owner, operator) +} + +// RequireERC1155ApprovalSelf is a free data retrieval call binding the contract method 0x0cb17e5c. +// +// Solidity: function requireERC1155ApprovalSelf(address token, address operator) view returns() +func (_TrailsUtils *TrailsUtilsCaller) RequireERC1155ApprovalSelf(opts *bind.CallOpts, token common.Address, operator common.Address) error { + var out []interface{} + err := _TrailsUtils.contract.Call(opts, &out, "requireERC1155ApprovalSelf", token, operator) + + if err != nil { + return err + } + + return err + +} + +// RequireERC1155ApprovalSelf is a free data retrieval call binding the contract method 0x0cb17e5c. +// +// Solidity: function requireERC1155ApprovalSelf(address token, address operator) view returns() +func (_TrailsUtils *TrailsUtilsSession) RequireERC1155ApprovalSelf(token common.Address, operator common.Address) error { + return _TrailsUtils.Contract.RequireERC1155ApprovalSelf(&_TrailsUtils.CallOpts, token, operator) +} + +// RequireERC1155ApprovalSelf is a free data retrieval call binding the contract method 0x0cb17e5c. +// +// Solidity: function requireERC1155ApprovalSelf(address token, address operator) view returns() +func (_TrailsUtils *TrailsUtilsCallerSession) RequireERC1155ApprovalSelf(token common.Address, operator common.Address) error { + return _TrailsUtils.Contract.RequireERC1155ApprovalSelf(&_TrailsUtils.CallOpts, token, operator) +} + +// RequireERC721Approval is a free data retrieval call binding the contract method 0xfe08e7ca. +// +// Solidity: function requireERC721Approval(address token, address owner, address spender, uint256 tokenId) view returns() +func (_TrailsUtils *TrailsUtilsCaller) RequireERC721Approval(opts *bind.CallOpts, token common.Address, owner common.Address, spender common.Address, tokenId *big.Int) error { + var out []interface{} + err := _TrailsUtils.contract.Call(opts, &out, "requireERC721Approval", token, owner, spender, tokenId) + + if err != nil { + return err + } + + return err + +} + +// RequireERC721Approval is a free data retrieval call binding the contract method 0xfe08e7ca. +// +// Solidity: function requireERC721Approval(address token, address owner, address spender, uint256 tokenId) view returns() +func (_TrailsUtils *TrailsUtilsSession) RequireERC721Approval(token common.Address, owner common.Address, spender common.Address, tokenId *big.Int) error { + return _TrailsUtils.Contract.RequireERC721Approval(&_TrailsUtils.CallOpts, token, owner, spender, tokenId) +} + +// RequireERC721Approval is a free data retrieval call binding the contract method 0xfe08e7ca. +// +// Solidity: function requireERC721Approval(address token, address owner, address spender, uint256 tokenId) view returns() +func (_TrailsUtils *TrailsUtilsCallerSession) RequireERC721Approval(token common.Address, owner common.Address, spender common.Address, tokenId *big.Int) error { + return _TrailsUtils.Contract.RequireERC721Approval(&_TrailsUtils.CallOpts, token, owner, spender, tokenId) +} + +// RequireERC721ApprovalSelf is a free data retrieval call binding the contract method 0xe246466a. +// +// Solidity: function requireERC721ApprovalSelf(address token, address spender, uint256 tokenId) view returns() +func (_TrailsUtils *TrailsUtilsCaller) RequireERC721ApprovalSelf(opts *bind.CallOpts, token common.Address, spender common.Address, tokenId *big.Int) error { + var out []interface{} + err := _TrailsUtils.contract.Call(opts, &out, "requireERC721ApprovalSelf", token, spender, tokenId) + + if err != nil { + return err + } + + return err + +} + +// RequireERC721ApprovalSelf is a free data retrieval call binding the contract method 0xe246466a. +// +// Solidity: function requireERC721ApprovalSelf(address token, address spender, uint256 tokenId) view returns() +func (_TrailsUtils *TrailsUtilsSession) RequireERC721ApprovalSelf(token common.Address, spender common.Address, tokenId *big.Int) error { + return _TrailsUtils.Contract.RequireERC721ApprovalSelf(&_TrailsUtils.CallOpts, token, spender, tokenId) +} + +// RequireERC721ApprovalSelf is a free data retrieval call binding the contract method 0xe246466a. +// +// Solidity: function requireERC721ApprovalSelf(address token, address spender, uint256 tokenId) view returns() +func (_TrailsUtils *TrailsUtilsCallerSession) RequireERC721ApprovalSelf(token common.Address, spender common.Address, tokenId *big.Int) error { + return _TrailsUtils.Contract.RequireERC721ApprovalSelf(&_TrailsUtils.CallOpts, token, spender, tokenId) +} + +// RequireMinBalance is a free data retrieval call binding the contract method 0x03bbbd65. +// +// Solidity: function requireMinBalance(address wallet, uint256 minBalance) view returns() +func (_TrailsUtils *TrailsUtilsCaller) RequireMinBalance(opts *bind.CallOpts, wallet common.Address, minBalance *big.Int) error { + var out []interface{} + err := _TrailsUtils.contract.Call(opts, &out, "requireMinBalance", wallet, minBalance) + + if err != nil { + return err + } + + return err + +} + +// RequireMinBalance is a free data retrieval call binding the contract method 0x03bbbd65. +// +// Solidity: function requireMinBalance(address wallet, uint256 minBalance) view returns() +func (_TrailsUtils *TrailsUtilsSession) RequireMinBalance(wallet common.Address, minBalance *big.Int) error { + return _TrailsUtils.Contract.RequireMinBalance(&_TrailsUtils.CallOpts, wallet, minBalance) +} + +// RequireMinBalance is a free data retrieval call binding the contract method 0x03bbbd65. +// +// Solidity: function requireMinBalance(address wallet, uint256 minBalance) view returns() +func (_TrailsUtils *TrailsUtilsCallerSession) RequireMinBalance(wallet common.Address, minBalance *big.Int) error { + return _TrailsUtils.Contract.RequireMinBalance(&_TrailsUtils.CallOpts, wallet, minBalance) +} + +// RequireMinBalanceSelf is a free data retrieval call binding the contract method 0x333f790d. +// +// Solidity: function requireMinBalanceSelf(uint256 minBalance) view returns() +func (_TrailsUtils *TrailsUtilsCaller) RequireMinBalanceSelf(opts *bind.CallOpts, minBalance *big.Int) error { + var out []interface{} + err := _TrailsUtils.contract.Call(opts, &out, "requireMinBalanceSelf", minBalance) + + if err != nil { + return err + } + + return err + +} + +// RequireMinBalanceSelf is a free data retrieval call binding the contract method 0x333f790d. +// +// Solidity: function requireMinBalanceSelf(uint256 minBalance) view returns() +func (_TrailsUtils *TrailsUtilsSession) RequireMinBalanceSelf(minBalance *big.Int) error { + return _TrailsUtils.Contract.RequireMinBalanceSelf(&_TrailsUtils.CallOpts, minBalance) +} + +// RequireMinBalanceSelf is a free data retrieval call binding the contract method 0x333f790d. +// +// Solidity: function requireMinBalanceSelf(uint256 minBalance) view returns() +func (_TrailsUtils *TrailsUtilsCallerSession) RequireMinBalanceSelf(minBalance *big.Int) error { + return _TrailsUtils.Contract.RequireMinBalanceSelf(&_TrailsUtils.CallOpts, minBalance) +} + +// RequireMinERC1155Balance is a free data retrieval call binding the contract method 0x505c7ed3. +// +// Solidity: function requireMinERC1155Balance(address token, address wallet, uint256 tokenId, uint256 minBalance) view returns() +func (_TrailsUtils *TrailsUtilsCaller) RequireMinERC1155Balance(opts *bind.CallOpts, token common.Address, wallet common.Address, tokenId *big.Int, minBalance *big.Int) error { + var out []interface{} + err := _TrailsUtils.contract.Call(opts, &out, "requireMinERC1155Balance", token, wallet, tokenId, minBalance) + + if err != nil { + return err + } + + return err + +} + +// RequireMinERC1155Balance is a free data retrieval call binding the contract method 0x505c7ed3. +// +// Solidity: function requireMinERC1155Balance(address token, address wallet, uint256 tokenId, uint256 minBalance) view returns() +func (_TrailsUtils *TrailsUtilsSession) RequireMinERC1155Balance(token common.Address, wallet common.Address, tokenId *big.Int, minBalance *big.Int) error { + return _TrailsUtils.Contract.RequireMinERC1155Balance(&_TrailsUtils.CallOpts, token, wallet, tokenId, minBalance) +} + +// RequireMinERC1155Balance is a free data retrieval call binding the contract method 0x505c7ed3. +// +// Solidity: function requireMinERC1155Balance(address token, address wallet, uint256 tokenId, uint256 minBalance) view returns() +func (_TrailsUtils *TrailsUtilsCallerSession) RequireMinERC1155Balance(token common.Address, wallet common.Address, tokenId *big.Int, minBalance *big.Int) error { + return _TrailsUtils.Contract.RequireMinERC1155Balance(&_TrailsUtils.CallOpts, token, wallet, tokenId, minBalance) +} + +// RequireMinERC1155BalanceBatch is a free data retrieval call binding the contract method 0x476a5f40. +// +// Solidity: function requireMinERC1155BalanceBatch(address token, address wallet, uint256[] tokenIds, uint256[] minBalances) view returns() +func (_TrailsUtils *TrailsUtilsCaller) RequireMinERC1155BalanceBatch(opts *bind.CallOpts, token common.Address, wallet common.Address, tokenIds []*big.Int, minBalances []*big.Int) error { + var out []interface{} + err := _TrailsUtils.contract.Call(opts, &out, "requireMinERC1155BalanceBatch", token, wallet, tokenIds, minBalances) + + if err != nil { + return err + } + + return err + +} + +// RequireMinERC1155BalanceBatch is a free data retrieval call binding the contract method 0x476a5f40. +// +// Solidity: function requireMinERC1155BalanceBatch(address token, address wallet, uint256[] tokenIds, uint256[] minBalances) view returns() +func (_TrailsUtils *TrailsUtilsSession) RequireMinERC1155BalanceBatch(token common.Address, wallet common.Address, tokenIds []*big.Int, minBalances []*big.Int) error { + return _TrailsUtils.Contract.RequireMinERC1155BalanceBatch(&_TrailsUtils.CallOpts, token, wallet, tokenIds, minBalances) +} + +// RequireMinERC1155BalanceBatch is a free data retrieval call binding the contract method 0x476a5f40. +// +// Solidity: function requireMinERC1155BalanceBatch(address token, address wallet, uint256[] tokenIds, uint256[] minBalances) view returns() +func (_TrailsUtils *TrailsUtilsCallerSession) RequireMinERC1155BalanceBatch(token common.Address, wallet common.Address, tokenIds []*big.Int, minBalances []*big.Int) error { + return _TrailsUtils.Contract.RequireMinERC1155BalanceBatch(&_TrailsUtils.CallOpts, token, wallet, tokenIds, minBalances) +} + +// RequireMinERC1155BalanceBatchSelf is a free data retrieval call binding the contract method 0xfdc25428. +// +// Solidity: function requireMinERC1155BalanceBatchSelf(address token, uint256[] tokenIds, uint256[] minBalances) view returns() +func (_TrailsUtils *TrailsUtilsCaller) RequireMinERC1155BalanceBatchSelf(opts *bind.CallOpts, token common.Address, tokenIds []*big.Int, minBalances []*big.Int) error { + var out []interface{} + err := _TrailsUtils.contract.Call(opts, &out, "requireMinERC1155BalanceBatchSelf", token, tokenIds, minBalances) + + if err != nil { + return err + } + + return err + +} + +// RequireMinERC1155BalanceBatchSelf is a free data retrieval call binding the contract method 0xfdc25428. +// +// Solidity: function requireMinERC1155BalanceBatchSelf(address token, uint256[] tokenIds, uint256[] minBalances) view returns() +func (_TrailsUtils *TrailsUtilsSession) RequireMinERC1155BalanceBatchSelf(token common.Address, tokenIds []*big.Int, minBalances []*big.Int) error { + return _TrailsUtils.Contract.RequireMinERC1155BalanceBatchSelf(&_TrailsUtils.CallOpts, token, tokenIds, minBalances) +} + +// RequireMinERC1155BalanceBatchSelf is a free data retrieval call binding the contract method 0xfdc25428. +// +// Solidity: function requireMinERC1155BalanceBatchSelf(address token, uint256[] tokenIds, uint256[] minBalances) view returns() +func (_TrailsUtils *TrailsUtilsCallerSession) RequireMinERC1155BalanceBatchSelf(token common.Address, tokenIds []*big.Int, minBalances []*big.Int) error { + return _TrailsUtils.Contract.RequireMinERC1155BalanceBatchSelf(&_TrailsUtils.CallOpts, token, tokenIds, minBalances) +} + +// RequireMinERC1155BalanceSelf is a free data retrieval call binding the contract method 0x0084290d. +// +// Solidity: function requireMinERC1155BalanceSelf(address token, uint256 tokenId, uint256 minBalance) view returns() +func (_TrailsUtils *TrailsUtilsCaller) RequireMinERC1155BalanceSelf(opts *bind.CallOpts, token common.Address, tokenId *big.Int, minBalance *big.Int) error { + var out []interface{} + err := _TrailsUtils.contract.Call(opts, &out, "requireMinERC1155BalanceSelf", token, tokenId, minBalance) + + if err != nil { + return err + } + + return err + +} + +// RequireMinERC1155BalanceSelf is a free data retrieval call binding the contract method 0x0084290d. +// +// Solidity: function requireMinERC1155BalanceSelf(address token, uint256 tokenId, uint256 minBalance) view returns() +func (_TrailsUtils *TrailsUtilsSession) RequireMinERC1155BalanceSelf(token common.Address, tokenId *big.Int, minBalance *big.Int) error { + return _TrailsUtils.Contract.RequireMinERC1155BalanceSelf(&_TrailsUtils.CallOpts, token, tokenId, minBalance) +} + +// RequireMinERC1155BalanceSelf is a free data retrieval call binding the contract method 0x0084290d. +// +// Solidity: function requireMinERC1155BalanceSelf(address token, uint256 tokenId, uint256 minBalance) view returns() +func (_TrailsUtils *TrailsUtilsCallerSession) RequireMinERC1155BalanceSelf(token common.Address, tokenId *big.Int, minBalance *big.Int) error { + return _TrailsUtils.Contract.RequireMinERC1155BalanceSelf(&_TrailsUtils.CallOpts, token, tokenId, minBalance) +} + +// RequireMinERC20Allowance is a free data retrieval call binding the contract method 0x42ab921e. +// +// Solidity: function requireMinERC20Allowance(address token, address owner, address spender, uint256 minAllowance) view returns() +func (_TrailsUtils *TrailsUtilsCaller) RequireMinERC20Allowance(opts *bind.CallOpts, token common.Address, owner common.Address, spender common.Address, minAllowance *big.Int) error { + var out []interface{} + err := _TrailsUtils.contract.Call(opts, &out, "requireMinERC20Allowance", token, owner, spender, minAllowance) + + if err != nil { + return err + } + + return err + +} + +// RequireMinERC20Allowance is a free data retrieval call binding the contract method 0x42ab921e. +// +// Solidity: function requireMinERC20Allowance(address token, address owner, address spender, uint256 minAllowance) view returns() +func (_TrailsUtils *TrailsUtilsSession) RequireMinERC20Allowance(token common.Address, owner common.Address, spender common.Address, minAllowance *big.Int) error { + return _TrailsUtils.Contract.RequireMinERC20Allowance(&_TrailsUtils.CallOpts, token, owner, spender, minAllowance) +} + +// RequireMinERC20Allowance is a free data retrieval call binding the contract method 0x42ab921e. +// +// Solidity: function requireMinERC20Allowance(address token, address owner, address spender, uint256 minAllowance) view returns() +func (_TrailsUtils *TrailsUtilsCallerSession) RequireMinERC20Allowance(token common.Address, owner common.Address, spender common.Address, minAllowance *big.Int) error { + return _TrailsUtils.Contract.RequireMinERC20Allowance(&_TrailsUtils.CallOpts, token, owner, spender, minAllowance) +} + +// RequireMinERC20AllowanceSelf is a free data retrieval call binding the contract method 0x6ef1f0dd. +// +// Solidity: function requireMinERC20AllowanceSelf(address token, address spender, uint256 minAllowance) view returns() +func (_TrailsUtils *TrailsUtilsCaller) RequireMinERC20AllowanceSelf(opts *bind.CallOpts, token common.Address, spender common.Address, minAllowance *big.Int) error { + var out []interface{} + err := _TrailsUtils.contract.Call(opts, &out, "requireMinERC20AllowanceSelf", token, spender, minAllowance) + + if err != nil { + return err + } + + return err + +} + +// RequireMinERC20AllowanceSelf is a free data retrieval call binding the contract method 0x6ef1f0dd. +// +// Solidity: function requireMinERC20AllowanceSelf(address token, address spender, uint256 minAllowance) view returns() +func (_TrailsUtils *TrailsUtilsSession) RequireMinERC20AllowanceSelf(token common.Address, spender common.Address, minAllowance *big.Int) error { + return _TrailsUtils.Contract.RequireMinERC20AllowanceSelf(&_TrailsUtils.CallOpts, token, spender, minAllowance) +} + +// RequireMinERC20AllowanceSelf is a free data retrieval call binding the contract method 0x6ef1f0dd. +// +// Solidity: function requireMinERC20AllowanceSelf(address token, address spender, uint256 minAllowance) view returns() +func (_TrailsUtils *TrailsUtilsCallerSession) RequireMinERC20AllowanceSelf(token common.Address, spender common.Address, minAllowance *big.Int) error { + return _TrailsUtils.Contract.RequireMinERC20AllowanceSelf(&_TrailsUtils.CallOpts, token, spender, minAllowance) +} + +// RequireMinERC20Balance is a free data retrieval call binding the contract method 0x8d0a9ea7. +// +// Solidity: function requireMinERC20Balance(address token, address wallet, uint256 minBalance) view returns() +func (_TrailsUtils *TrailsUtilsCaller) RequireMinERC20Balance(opts *bind.CallOpts, token common.Address, wallet common.Address, minBalance *big.Int) error { + var out []interface{} + err := _TrailsUtils.contract.Call(opts, &out, "requireMinERC20Balance", token, wallet, minBalance) + + if err != nil { + return err + } + + return err + +} + +// RequireMinERC20Balance is a free data retrieval call binding the contract method 0x8d0a9ea7. +// +// Solidity: function requireMinERC20Balance(address token, address wallet, uint256 minBalance) view returns() +func (_TrailsUtils *TrailsUtilsSession) RequireMinERC20Balance(token common.Address, wallet common.Address, minBalance *big.Int) error { + return _TrailsUtils.Contract.RequireMinERC20Balance(&_TrailsUtils.CallOpts, token, wallet, minBalance) +} + +// RequireMinERC20Balance is a free data retrieval call binding the contract method 0x8d0a9ea7. +// +// Solidity: function requireMinERC20Balance(address token, address wallet, uint256 minBalance) view returns() +func (_TrailsUtils *TrailsUtilsCallerSession) RequireMinERC20Balance(token common.Address, wallet common.Address, minBalance *big.Int) error { + return _TrailsUtils.Contract.RequireMinERC20Balance(&_TrailsUtils.CallOpts, token, wallet, minBalance) +} + +// RequireMinERC20BalanceSelf is a free data retrieval call binding the contract method 0x372618cb. +// +// Solidity: function requireMinERC20BalanceSelf(address token, uint256 minBalance) view returns() +func (_TrailsUtils *TrailsUtilsCaller) RequireMinERC20BalanceSelf(opts *bind.CallOpts, token common.Address, minBalance *big.Int) error { + var out []interface{} + err := _TrailsUtils.contract.Call(opts, &out, "requireMinERC20BalanceSelf", token, minBalance) + + if err != nil { + return err + } + + return err + +} + +// RequireMinERC20BalanceSelf is a free data retrieval call binding the contract method 0x372618cb. +// +// Solidity: function requireMinERC20BalanceSelf(address token, uint256 minBalance) view returns() +func (_TrailsUtils *TrailsUtilsSession) RequireMinERC20BalanceSelf(token common.Address, minBalance *big.Int) error { + return _TrailsUtils.Contract.RequireMinERC20BalanceSelf(&_TrailsUtils.CallOpts, token, minBalance) +} + +// RequireMinERC20BalanceSelf is a free data retrieval call binding the contract method 0x372618cb. +// +// Solidity: function requireMinERC20BalanceSelf(address token, uint256 minBalance) view returns() +func (_TrailsUtils *TrailsUtilsCallerSession) RequireMinERC20BalanceSelf(token common.Address, minBalance *big.Int) error { + return _TrailsUtils.Contract.RequireMinERC20BalanceSelf(&_TrailsUtils.CallOpts, token, minBalance) +} + +// RequireNonExpired is a free data retrieval call binding the contract method 0x7f29d538. +// +// Solidity: function requireNonExpired(uint256 expiration) view returns() +func (_TrailsUtils *TrailsUtilsCaller) RequireNonExpired(opts *bind.CallOpts, expiration *big.Int) error { + var out []interface{} + err := _TrailsUtils.contract.Call(opts, &out, "requireNonExpired", expiration) + + if err != nil { + return err + } + + return err + +} + +// RequireNonExpired is a free data retrieval call binding the contract method 0x7f29d538. +// +// Solidity: function requireNonExpired(uint256 expiration) view returns() +func (_TrailsUtils *TrailsUtilsSession) RequireNonExpired(expiration *big.Int) error { + return _TrailsUtils.Contract.RequireNonExpired(&_TrailsUtils.CallOpts, expiration) +} + +// RequireNonExpired is a free data retrieval call binding the contract method 0x7f29d538. +// +// Solidity: function requireNonExpired(uint256 expiration) view returns() +func (_TrailsUtils *TrailsUtilsCallerSession) RequireNonExpired(expiration *big.Int) error { + return _TrailsUtils.Contract.RequireNonExpired(&_TrailsUtils.CallOpts, expiration) +} + +// HandleSequenceDelegateCall is a paid mutator transaction binding the contract method 0x4c4e814c. +// +// Solidity: function handleSequenceDelegateCall(bytes32 , uint256 , uint256 , uint256 , uint256 , bytes data) returns() +func (_TrailsUtils *TrailsUtilsTransactor) HandleSequenceDelegateCall(opts *bind.TransactOpts, arg0 [32]byte, arg1 *big.Int, arg2 *big.Int, arg3 *big.Int, arg4 *big.Int, data []byte) (*types.Transaction, error) { + return _TrailsUtils.contract.Transact(opts, "handleSequenceDelegateCall", arg0, arg1, arg2, arg3, arg4, data) +} + +// HandleSequenceDelegateCall is a paid mutator transaction binding the contract method 0x4c4e814c. +// +// Solidity: function handleSequenceDelegateCall(bytes32 , uint256 , uint256 , uint256 , uint256 , bytes data) returns() +func (_TrailsUtils *TrailsUtilsSession) HandleSequenceDelegateCall(arg0 [32]byte, arg1 *big.Int, arg2 *big.Int, arg3 *big.Int, arg4 *big.Int, data []byte) (*types.Transaction, error) { + return _TrailsUtils.Contract.HandleSequenceDelegateCall(&_TrailsUtils.TransactOpts, arg0, arg1, arg2, arg3, arg4, data) +} + +// HandleSequenceDelegateCall is a paid mutator transaction binding the contract method 0x4c4e814c. +// +// Solidity: function handleSequenceDelegateCall(bytes32 , uint256 , uint256 , uint256 , uint256 , bytes data) returns() +func (_TrailsUtils *TrailsUtilsTransactorSession) HandleSequenceDelegateCall(arg0 [32]byte, arg1 *big.Int, arg2 *big.Int, arg3 *big.Int, arg4 *big.Int, data []byte) (*types.Transaction, error) { + return _TrailsUtils.Contract.HandleSequenceDelegateCall(&_TrailsUtils.TransactOpts, arg0, arg1, arg2, arg3, arg4, data) +} + +// HydrateExecute is a paid mutator transaction binding the contract method 0x6d42cf03. +// +// Solidity: function hydrateExecute(bytes packedPayload, bytes hydratePayload) payable returns() +func (_TrailsUtils *TrailsUtilsTransactor) HydrateExecute(opts *bind.TransactOpts, packedPayload []byte, hydratePayload []byte) (*types.Transaction, error) { + return _TrailsUtils.contract.Transact(opts, "hydrateExecute", packedPayload, hydratePayload) +} + +// HydrateExecute is a paid mutator transaction binding the contract method 0x6d42cf03. +// +// Solidity: function hydrateExecute(bytes packedPayload, bytes hydratePayload) payable returns() +func (_TrailsUtils *TrailsUtilsSession) HydrateExecute(packedPayload []byte, hydratePayload []byte) (*types.Transaction, error) { + return _TrailsUtils.Contract.HydrateExecute(&_TrailsUtils.TransactOpts, packedPayload, hydratePayload) +} + +// HydrateExecute is a paid mutator transaction binding the contract method 0x6d42cf03. +// +// Solidity: function hydrateExecute(bytes packedPayload, bytes hydratePayload) payable returns() +func (_TrailsUtils *TrailsUtilsTransactorSession) HydrateExecute(packedPayload []byte, hydratePayload []byte) (*types.Transaction, error) { + return _TrailsUtils.Contract.HydrateExecute(&_TrailsUtils.TransactOpts, packedPayload, hydratePayload) +} + +// HydrateExecuteAndSweep is a paid mutator transaction binding the contract method 0xbd1e4acb. +// +// Solidity: function hydrateExecuteAndSweep(bytes packedPayload, address sweepTarget, address[] tokensToSweep, bool sweepNative, bytes hydratePayload) payable returns() +func (_TrailsUtils *TrailsUtilsTransactor) HydrateExecuteAndSweep(opts *bind.TransactOpts, packedPayload []byte, sweepTarget common.Address, tokensToSweep []common.Address, sweepNative bool, hydratePayload []byte) (*types.Transaction, error) { + return _TrailsUtils.contract.Transact(opts, "hydrateExecuteAndSweep", packedPayload, sweepTarget, tokensToSweep, sweepNative, hydratePayload) +} + +// HydrateExecuteAndSweep is a paid mutator transaction binding the contract method 0xbd1e4acb. +// +// Solidity: function hydrateExecuteAndSweep(bytes packedPayload, address sweepTarget, address[] tokensToSweep, bool sweepNative, bytes hydratePayload) payable returns() +func (_TrailsUtils *TrailsUtilsSession) HydrateExecuteAndSweep(packedPayload []byte, sweepTarget common.Address, tokensToSweep []common.Address, sweepNative bool, hydratePayload []byte) (*types.Transaction, error) { + return _TrailsUtils.Contract.HydrateExecuteAndSweep(&_TrailsUtils.TransactOpts, packedPayload, sweepTarget, tokensToSweep, sweepNative, hydratePayload) +} + +// HydrateExecuteAndSweep is a paid mutator transaction binding the contract method 0xbd1e4acb. +// +// Solidity: function hydrateExecuteAndSweep(bytes packedPayload, address sweepTarget, address[] tokensToSweep, bool sweepNative, bytes hydratePayload) payable returns() +func (_TrailsUtils *TrailsUtilsTransactorSession) HydrateExecuteAndSweep(packedPayload []byte, sweepTarget common.Address, tokensToSweep []common.Address, sweepNative bool, hydratePayload []byte) (*types.Transaction, error) { + return _TrailsUtils.Contract.HydrateExecuteAndSweep(&_TrailsUtils.TransactOpts, packedPayload, sweepTarget, tokensToSweep, sweepNative, hydratePayload) +} + +// Sweep is a paid mutator transaction binding the contract method 0xa7b7ec5a. +// +// Solidity: function sweep(address sweepTarget, address[] tokensToSweep, bool sweepNative) returns() +func (_TrailsUtils *TrailsUtilsTransactor) Sweep(opts *bind.TransactOpts, sweepTarget common.Address, tokensToSweep []common.Address, sweepNative bool) (*types.Transaction, error) { + return _TrailsUtils.contract.Transact(opts, "sweep", sweepTarget, tokensToSweep, sweepNative) +} + +// Sweep is a paid mutator transaction binding the contract method 0xa7b7ec5a. +// +// Solidity: function sweep(address sweepTarget, address[] tokensToSweep, bool sweepNative) returns() +func (_TrailsUtils *TrailsUtilsSession) Sweep(sweepTarget common.Address, tokensToSweep []common.Address, sweepNative bool) (*types.Transaction, error) { + return _TrailsUtils.Contract.Sweep(&_TrailsUtils.TransactOpts, sweepTarget, tokensToSweep, sweepNative) +} + +// Sweep is a paid mutator transaction binding the contract method 0xa7b7ec5a. +// +// Solidity: function sweep(address sweepTarget, address[] tokensToSweep, bool sweepNative) returns() +func (_TrailsUtils *TrailsUtilsTransactorSession) Sweep(sweepTarget common.Address, tokensToSweep []common.Address, sweepNative bool) (*types.Transaction, error) { + return _TrailsUtils.Contract.Sweep(&_TrailsUtils.TransactOpts, sweepTarget, tokensToSweep, sweepNative) +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_TrailsUtils *TrailsUtilsTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { + return _TrailsUtils.contract.RawTransact(opts, nil) // calldata is disallowed for receive function +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_TrailsUtils *TrailsUtilsSession) Receive() (*types.Transaction, error) { + return _TrailsUtils.Contract.Receive(&_TrailsUtils.TransactOpts) +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_TrailsUtils *TrailsUtilsTransactorSession) Receive() (*types.Transaction, error) { + return _TrailsUtils.Contract.Receive(&_TrailsUtils.TransactOpts) +} + +// TrailsUtilsCallAbortedIterator is returned from FilterCallAborted and is used to iterate over the raw logs and unpacked data for CallAborted events raised by the TrailsUtils contract. +type TrailsUtilsCallAbortedIterator struct { + Event *TrailsUtilsCallAborted // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TrailsUtilsCallAbortedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TrailsUtilsCallAborted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TrailsUtilsCallAborted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TrailsUtilsCallAbortedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TrailsUtilsCallAbortedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TrailsUtilsCallAborted represents a CallAborted event raised by the TrailsUtils contract. +type TrailsUtilsCallAborted struct { + OpHash [32]byte + Index *big.Int + ReturnData []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCallAborted is a free log retrieval operation binding the contract event 0xc2c704302430fe0dc8d95f272e2f4e54bbbc51a3327fd5d75ab41f9fc8fd129b. +// +// Solidity: event CallAborted(bytes32 _opHash, uint256 _index, bytes _returnData) +func (_TrailsUtils *TrailsUtilsFilterer) FilterCallAborted(opts *bind.FilterOpts) (*TrailsUtilsCallAbortedIterator, error) { + + logs, sub, err := _TrailsUtils.contract.FilterLogs(opts, "CallAborted") + if err != nil { + return nil, err + } + return &TrailsUtilsCallAbortedIterator{contract: _TrailsUtils.contract, event: "CallAborted", logs: logs, sub: sub}, nil +} + +// WatchCallAborted is a free log subscription operation binding the contract event 0xc2c704302430fe0dc8d95f272e2f4e54bbbc51a3327fd5d75ab41f9fc8fd129b. +// +// Solidity: event CallAborted(bytes32 _opHash, uint256 _index, bytes _returnData) +func (_TrailsUtils *TrailsUtilsFilterer) WatchCallAborted(opts *bind.WatchOpts, sink chan<- *TrailsUtilsCallAborted) (event.Subscription, error) { + + logs, sub, err := _TrailsUtils.contract.WatchLogs(opts, "CallAborted") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TrailsUtilsCallAborted) + if err := _TrailsUtils.contract.UnpackLog(event, "CallAborted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseCallAborted is a log parse operation binding the contract event 0xc2c704302430fe0dc8d95f272e2f4e54bbbc51a3327fd5d75ab41f9fc8fd129b. +// +// Solidity: event CallAborted(bytes32 _opHash, uint256 _index, bytes _returnData) +func (_TrailsUtils *TrailsUtilsFilterer) ParseCallAborted(log types.Log) (*TrailsUtilsCallAborted, error) { + event := new(TrailsUtilsCallAborted) + if err := _TrailsUtils.contract.UnpackLog(event, "CallAborted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TrailsUtilsCallFailedIterator is returned from FilterCallFailed and is used to iterate over the raw logs and unpacked data for CallFailed events raised by the TrailsUtils contract. +type TrailsUtilsCallFailedIterator struct { + Event *TrailsUtilsCallFailed // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TrailsUtilsCallFailedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TrailsUtilsCallFailed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TrailsUtilsCallFailed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TrailsUtilsCallFailedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TrailsUtilsCallFailedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TrailsUtilsCallFailed represents a CallFailed event raised by the TrailsUtils contract. +type TrailsUtilsCallFailed struct { + OpHash [32]byte + Index *big.Int + ReturnData []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCallFailed is a free log retrieval operation binding the contract event 0x115f347c00e69f252cd6b63c4f81022a9564c6befe8aa719cb74640a4a306f0d. +// +// Solidity: event CallFailed(bytes32 _opHash, uint256 _index, bytes _returnData) +func (_TrailsUtils *TrailsUtilsFilterer) FilterCallFailed(opts *bind.FilterOpts) (*TrailsUtilsCallFailedIterator, error) { + + logs, sub, err := _TrailsUtils.contract.FilterLogs(opts, "CallFailed") + if err != nil { + return nil, err + } + return &TrailsUtilsCallFailedIterator{contract: _TrailsUtils.contract, event: "CallFailed", logs: logs, sub: sub}, nil +} + +// WatchCallFailed is a free log subscription operation binding the contract event 0x115f347c00e69f252cd6b63c4f81022a9564c6befe8aa719cb74640a4a306f0d. +// +// Solidity: event CallFailed(bytes32 _opHash, uint256 _index, bytes _returnData) +func (_TrailsUtils *TrailsUtilsFilterer) WatchCallFailed(opts *bind.WatchOpts, sink chan<- *TrailsUtilsCallFailed) (event.Subscription, error) { + + logs, sub, err := _TrailsUtils.contract.WatchLogs(opts, "CallFailed") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TrailsUtilsCallFailed) + if err := _TrailsUtils.contract.UnpackLog(event, "CallFailed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseCallFailed is a log parse operation binding the contract event 0x115f347c00e69f252cd6b63c4f81022a9564c6befe8aa719cb74640a4a306f0d. +// +// Solidity: event CallFailed(bytes32 _opHash, uint256 _index, bytes _returnData) +func (_TrailsUtils *TrailsUtilsFilterer) ParseCallFailed(log types.Log) (*TrailsUtilsCallFailed, error) { + event := new(TrailsUtilsCallFailed) + if err := _TrailsUtils.contract.UnpackLog(event, "CallFailed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TrailsUtilsCallSkippedIterator is returned from FilterCallSkipped and is used to iterate over the raw logs and unpacked data for CallSkipped events raised by the TrailsUtils contract. +type TrailsUtilsCallSkippedIterator struct { + Event *TrailsUtilsCallSkipped // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TrailsUtilsCallSkippedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TrailsUtilsCallSkipped) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TrailsUtilsCallSkipped) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TrailsUtilsCallSkippedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TrailsUtilsCallSkippedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TrailsUtilsCallSkipped represents a CallSkipped event raised by the TrailsUtils contract. +type TrailsUtilsCallSkipped struct { + OpHash [32]byte + Index *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCallSkipped is a free log retrieval operation binding the contract event 0x9ae934bf8a986157c889a24c3b3fa85e74b7e4ee4b1f8fc6e7362cb4c1d19d8b. +// +// Solidity: event CallSkipped(bytes32 _opHash, uint256 _index) +func (_TrailsUtils *TrailsUtilsFilterer) FilterCallSkipped(opts *bind.FilterOpts) (*TrailsUtilsCallSkippedIterator, error) { + + logs, sub, err := _TrailsUtils.contract.FilterLogs(opts, "CallSkipped") + if err != nil { + return nil, err + } + return &TrailsUtilsCallSkippedIterator{contract: _TrailsUtils.contract, event: "CallSkipped", logs: logs, sub: sub}, nil +} + +// WatchCallSkipped is a free log subscription operation binding the contract event 0x9ae934bf8a986157c889a24c3b3fa85e74b7e4ee4b1f8fc6e7362cb4c1d19d8b. +// +// Solidity: event CallSkipped(bytes32 _opHash, uint256 _index) +func (_TrailsUtils *TrailsUtilsFilterer) WatchCallSkipped(opts *bind.WatchOpts, sink chan<- *TrailsUtilsCallSkipped) (event.Subscription, error) { + + logs, sub, err := _TrailsUtils.contract.WatchLogs(opts, "CallSkipped") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TrailsUtilsCallSkipped) + if err := _TrailsUtils.contract.UnpackLog(event, "CallSkipped", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseCallSkipped is a log parse operation binding the contract event 0x9ae934bf8a986157c889a24c3b3fa85e74b7e4ee4b1f8fc6e7362cb4c1d19d8b. +// +// Solidity: event CallSkipped(bytes32 _opHash, uint256 _index) +func (_TrailsUtils *TrailsUtilsFilterer) ParseCallSkipped(log types.Log) (*TrailsUtilsCallSkipped, error) { + event := new(TrailsUtilsCallSkipped) + if err := _TrailsUtils.contract.UnpackLog(event, "CallSkipped", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TrailsUtilsCallSucceededIterator is returned from FilterCallSucceeded and is used to iterate over the raw logs and unpacked data for CallSucceeded events raised by the TrailsUtils contract. +type TrailsUtilsCallSucceededIterator struct { + Event *TrailsUtilsCallSucceeded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TrailsUtilsCallSucceededIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TrailsUtilsCallSucceeded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TrailsUtilsCallSucceeded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TrailsUtilsCallSucceededIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TrailsUtilsCallSucceededIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TrailsUtilsCallSucceeded represents a CallSucceeded event raised by the TrailsUtils contract. +type TrailsUtilsCallSucceeded struct { + OpHash [32]byte + Index *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCallSucceeded is a free log retrieval operation binding the contract event 0x5a589b1d8062f33451d29cae3dabd9b2e36c62aee644178c600977ca8dda661a. +// +// Solidity: event CallSucceeded(bytes32 _opHash, uint256 _index) +func (_TrailsUtils *TrailsUtilsFilterer) FilterCallSucceeded(opts *bind.FilterOpts) (*TrailsUtilsCallSucceededIterator, error) { + + logs, sub, err := _TrailsUtils.contract.FilterLogs(opts, "CallSucceeded") + if err != nil { + return nil, err + } + return &TrailsUtilsCallSucceededIterator{contract: _TrailsUtils.contract, event: "CallSucceeded", logs: logs, sub: sub}, nil +} + +// WatchCallSucceeded is a free log subscription operation binding the contract event 0x5a589b1d8062f33451d29cae3dabd9b2e36c62aee644178c600977ca8dda661a. +// +// Solidity: event CallSucceeded(bytes32 _opHash, uint256 _index) +func (_TrailsUtils *TrailsUtilsFilterer) WatchCallSucceeded(opts *bind.WatchOpts, sink chan<- *TrailsUtilsCallSucceeded) (event.Subscription, error) { + + logs, sub, err := _TrailsUtils.contract.WatchLogs(opts, "CallSucceeded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TrailsUtilsCallSucceeded) + if err := _TrailsUtils.contract.UnpackLog(event, "CallSucceeded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseCallSucceeded is a log parse operation binding the contract event 0x5a589b1d8062f33451d29cae3dabd9b2e36c62aee644178c600977ca8dda661a. +// +// Solidity: event CallSucceeded(bytes32 _opHash, uint256 _index) +func (_TrailsUtils *TrailsUtilsFilterer) ParseCallSucceeded(log types.Log) (*TrailsUtilsCallSucceeded, error) { + event := new(TrailsUtilsCallSucceeded) + if err := _TrailsUtils.contract.UnpackLog(event, "CallSucceeded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/go.work.sum b/go.work.sum index 1f3c2225..cfc47b58 100644 --- a/go.work.sum +++ b/go.work.sum @@ -47,6 +47,7 @@ cloud.google.com/go/storage v1.44.0/go.mod h1:wpPblkIuMP5jCB/E48Pz9zIo2S/zD8g+IT dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/0xsequence/ethkit v1.27.11 h1:fWcABQx1WIH4SWvesCuKBJ+D4XdwZcIGWGSYnBCM+VU= @@ -70,14 +71,17 @@ github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy86 github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= +github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs= github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/ProtonMail/go-crypto v1.1.5/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= +github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw= github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= @@ -104,6 +108,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= github.com/cloudflare/circl v1.6.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= +github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= @@ -125,6 +130,7 @@ github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46t github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyphar/filepath-securejoin v0.2.5 h1:6iR5tXJ/e6tJZzzdMc1km3Sa7RRIVBKAK32O2s7AYfo= github.com/cyphar/filepath-securejoin v0.2.5/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s= github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= github.com/deckarep/golang-set v1.7.1 h1:SCQV0S6gTtp6itiFrTqI+pfmJ4LN85S1YzhDf9rTHJQ= github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= @@ -154,10 +160,12 @@ github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66D github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY= github.com/go-git/go-git/v5 v5.13.2/go.mod h1:hWdW5P4YZRjmpGHwRH2v3zkWcNl6HeXaXQEMGb3NJ9A= +github.com/go-git/go-git/v5 v5.16.2 h1:fT6ZIOjE5iEnkzKyxTHK1W4HGAsPhqEqiSAssSO77hM= github.com/go-git/go-git/v5 v5.16.2/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -176,6 +184,7 @@ github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4er github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -267,6 +276,7 @@ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI= github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -282,6 +292,7 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kevinburke/ssh_config v1.4.0 h1:6xxtP5bZ2E4NF5tuQulISpTO2z8XbtH8cg1PWkxoFkQ= github.com/kevinburke/ssh_config v1.4.0/go.mod h1:q2RIzfka+BXARoNexmF9gkxEX7DmvbW9P4hIVx2Kg4M= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= @@ -323,6 +334,7 @@ github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCko github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pjbgf/sha1cd v0.3.2/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A= +github.com/pjbgf/sha1cd v0.5.0 h1:a+UkboSi1znleCDUNT3M5YxjOnN1fz2FhN48FlwCxs0= github.com/pjbgf/sha1cd v0.5.0/go.mod h1:lhpGlyHLpQZoxMv8HcgXvZEhcGs0PG/vsZnEJ7H0iCM= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -349,6 +361,7 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= +github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw= github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= @@ -360,6 +373,7 @@ github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A= github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= +github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8= github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY= github.com/smarty/assertions v1.15.0/go.mod h1:yABtdzeQs6l1brC900WlRNwj6ZR55d7B+E8C6HtKdec= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= @@ -370,6 +384,7 @@ github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= @@ -393,6 +408,7 @@ github.com/webrpc/gen-dart v0.1.1/go.mod h1:yq0ThW3ANNulJLyR50jx1aZMEVBDp19VUHuc github.com/webrpc/gen-golang v0.14.8 h1:nIzRezd2Nidxz+Iwsv/anW/8POjwRJALgIJkO+NUaFo= github.com/webrpc/gen-golang v0.14.8/go.mod h1:qy1qEWMlTvrRzjSuQLy+176RqNaX1ymUULDtlo7Dapo= github.com/webrpc/gen-golang v0.18.2/go.mod h1:t8tIVL/AQhaMteA31xNbzWUrumiMXc7OcKmnNALpnAM= +github.com/webrpc/gen-golang v0.21.0 h1:eQuv7x7nZQfT9zFyAOE6d2dc2zT+znOlelsy8LnGRn0= github.com/webrpc/gen-golang v0.21.0/go.mod h1:t8tIVL/AQhaMteA31xNbzWUrumiMXc7OcKmnNALpnAM= github.com/webrpc/gen-javascript v0.13.0 h1:tw7U1xueUjZz3cQAAA4/DZ90BHydkQKiJC4VXd/j2hg= github.com/webrpc/gen-javascript v0.13.0/go.mod h1:5EhapSJgzbiWrIGlqzZN9Lg9mE9209wwX+Du2dgn4EU= @@ -401,10 +417,12 @@ github.com/webrpc/gen-kotlin v0.1.0/go.mod h1:PIPys9Gn1Ro7q7uoacydEX8CtqBlAJSV98 github.com/webrpc/gen-openapi v0.13.0 h1:+FrIyqdCBkjCbUBD3HJ6mVERJL2mPrhuIsW31BMkb7Y= github.com/webrpc/gen-openapi v0.13.0/go.mod h1:fwY3ylZmdiCr+WXjR8Ek8wm08CFRr2/GaXI7Zd/Ou4Y= github.com/webrpc/gen-openapi v0.15.0/go.mod h1:fwY3ylZmdiCr+WXjR8Ek8wm08CFRr2/GaXI7Zd/Ou4Y= +github.com/webrpc/gen-openapi v0.16.3 h1:Gwj1Wxdqu+jLsVd+JeUuvf92JyLTZ/nMNcSwVpdqEWs= github.com/webrpc/gen-openapi v0.16.3/go.mod h1:fwY3ylZmdiCr+WXjR8Ek8wm08CFRr2/GaXI7Zd/Ou4Y= github.com/webrpc/gen-typescript v0.13.0 h1:QgmGmm+OuKZAIDr8Qg/fNLzFem5aUUkH9z+k3OKkf3o= github.com/webrpc/gen-typescript v0.13.0/go.mod h1:xQzYnVaSMfcygDXA5SuW8eYyCLHBHkj15wCF7gcJF5Y= github.com/webrpc/gen-typescript v0.16.3/go.mod h1:xQzYnVaSMfcygDXA5SuW8eYyCLHBHkj15wCF7gcJF5Y= +github.com/webrpc/gen-typescript v0.19.0 h1:apV8DsHAVzyOG4i45I93/YQeDXsy/fBPqFSV6CjWSWM= github.com/webrpc/gen-typescript v0.19.0/go.mod h1:xQzYnVaSMfcygDXA5SuW8eYyCLHBHkj15wCF7gcJF5Y= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= diff --git a/intent_config.go b/intent_config.go index 1ff1546e..05905110 100644 --- a/intent_config.go +++ b/intent_config.go @@ -6,6 +6,7 @@ import ( "math/big" "github.com/0xsequence/ethkit/ethcoder" + "github.com/0xsequence/ethkit/ethrpc" "github.com/0xsequence/ethkit/go-ethereum/accounts/abi" "github.com/0xsequence/ethkit/go-ethereum/common" "github.com/0xsequence/go-sequence/core" @@ -24,6 +25,14 @@ type DestinationToken struct { Amount *big.Int `abi:"amount"` } +// MalleableSapientConfig contains the configuration for a MalleableSapient signer for a single call payload. +// Each call payload can have its own sapient address, signature, and provider (for different chains). +type MalleableSapientConfig struct { + Address common.Address // The MalleableSapient contract address + Signature []byte // Signature describing which parts are static vs malleable + Provider *ethrpc.Provider // Provider for the chain this call is on +} + // IntentParams is a new version of intent parameters that uses CallsPayload for destination calls. type IntentParams struct { UserAddress common.Address @@ -188,10 +197,15 @@ func CreateAnyAddressSubdigestTree(calls []*v3.CallsPayload) ([]v3.WalletConfigT // `CreateIntentTree` creates a tree from a list of intent operations and a main signer address. func CreateIntentTree(mainSigner common.Address, calls []*v3.CallsPayload, sapientSignerLeafNode v3.WalletConfigTree) (*v3.WalletConfigTree, error) { - // Create the subdigest leaves from the batched transactions. - leaves, err := CreateAnyAddressSubdigestTree(calls) - if err != nil { - return nil, err + var leaves []v3.WalletConfigTree + + if len(calls) > 0 { + // Create the subdigest leaves from the batched transactions. + subdigestLeaves, err := CreateAnyAddressSubdigestTree(calls) + if err != nil { + return nil, err + } + leaves = append(leaves, subdigestLeaves...) } // If the sapient signer leaf is not nil, add it to the leaves. @@ -205,6 +219,10 @@ func CreateIntentTree(mainSigner common.Address, calls []*v3.CallsPayload, sapie Address: mainSigner, } + if len(leaves) == 0 { + return nil, fmt.Errorf("no leaves to create tree from") + } + // If the length of the leaves is 1 if len(leaves) == 1 { tree := v3.WalletConfigTreeNodes(mainSignerLeaf, leaves[0]) @@ -221,7 +239,7 @@ func CreateIntentTree(mainSigner common.Address, calls []*v3.CallsPayload, sapie } // `CreateIntentConfiguration` creates a wallet configuration where the intent's transaction batches are grouped into the initial subdigest. -func CreateIntentConfiguration(mainSigner common.Address, calls []*v3.CallsPayload, sapientSignerLeafNode v3.WalletConfigTree) (*v3.WalletConfig, error) { +func CreateIntentConfiguration(mainSigner common.Address, calls []*v3.CallsPayload, sapientSignerLeafNode v3.WalletConfigTree, checkpoint uint64) (*v3.WalletConfig, error) { // Create the subdigest leaves from the batched transactions. tree, err := CreateIntentTree(mainSigner, calls, sapientSignerLeafNode) if err != nil { @@ -231,37 +249,97 @@ func CreateIntentConfiguration(mainSigner common.Address, calls []*v3.CallsPaylo // Construct the new wallet config using: config := &v3.WalletConfig{ Threshold_: 1, - Checkpoint_: 0, + Checkpoint_: checkpoint, Tree: *tree, } return config, nil } -// `GetIntentConfigurationSignature` creates a signature for the intent configuration that can be used to bypass chain ID validation. -// The signature is based on the transaction bundle digests only. -func GetIntentConfigurationSignature( +// `CreateIntentConfigurationWithMalleableSapient` creates a wallet configuration with optional MalleableSapient configuration +func CreateIntentConfigurationWithMalleableSapient( + ctx context.Context, mainSigner common.Address, - calls []*v3.CallsPayload, -) ([]byte, error) { - // Default case without any sapient signer - config, err := CreateIntentConfiguration(mainSigner, calls, nil) - if err != nil { - return nil, err + payloads []*v3.CallsPayload, + configs []MalleableSapientConfig, + checkpoint uint64, +) (*v3.WalletConfig, error) { + if len(payloads) == 0 { + return nil, fmt.Errorf("calls cannot be empty") } + if len(configs) != len(payloads) { + return nil, fmt.Errorf("configs length (%d) must match payloads length (%d)", len(configs), len(payloads)) + } + + var callsWithoutMalleableSapient []*v3.CallsPayload + var sapientSignerLeaves []v3.WalletConfigTree + for i, callPayload := range payloads { + config := configs[i] + + // Skip if address is zero address. Will be handled by CreateIntentConfiguration. + if config.Address == (common.Address{}) { + callsWithoutMalleableSapient = append(callsWithoutMalleableSapient, callPayload) + continue + } + + if config.Provider == nil { + return nil, fmt.Errorf("provider is required for configs[%d]", i) + } + + // Recover the image hash for the payload and configuration + imageHash, err := v3.RecoverSapientSignature(ctx, config.Address, *callPayload, config.Signature, config.Provider) + if err != nil { + return nil, fmt.Errorf("failed to recover sapient signature for configs[%d]: %w", i, err) + } + + // Create a SapientSignerLeaf for this payload + sapientSignerLeaf := &v3.WalletConfigTreeSapientSignerLeaf{ + Weight: 1, + Address: config.Address, + ImageHash_: imageHash, + } + sapientSignerLeaves = append(sapientSignerLeaves, sapientSignerLeaf) + } + + // Create a tree from all the SapientSignerLeaves + var sapientSignerTree v3.WalletConfigTree + if len(sapientSignerLeaves) > 0 { + sapientSignerTree = v3.WalletConfigTreeNodes(sapientSignerLeaves...) + } + + // Remaining calls go to CreateIntentConfiguration + return CreateIntentConfiguration(mainSigner, callsWithoutMalleableSapient, sapientSignerTree, checkpoint) +} + +type SignerSignature struct { + Address common.Address + Signature []byte + Type core.SignerSignatureType +} + +// `GetIntentConfigurationSignature` creates a signature for the intent configuration that can be used to bypass chain ID validation. +// `SignerSignatures` can be nil when executing a preapproved static payload. +func GetIntentConfigurationSignature( + ctx context.Context, + config *v3.WalletConfig, + signerSignatures []*SignerSignature, +) ([]byte, error) { // spew.Dump(config) // spew.Dump(config.Tree) signingFunc := func(ctx context.Context, signer core.Signer, _ []core.SignerSignature) (core.SignerSignatureType, []byte, error) { - // For mainSigner or other signers, we don't provide a signature here. - // This will result in an AddressLeaf or NodeLeaf in the signature tree. + for _, signerSignature := range signerSignatures { + if signer.Address == signerSignature.Address { + return signerSignature.Type, signerSignature.Signature, nil + } + } return 0, nil, nil } // Build the signature using BuildNoChainIDSignature, which allows us to inject custom signatures via SigningFunction. // Set validateSigningPower to false, as we are not necessarily providing signatures for all parts of the config. - sig, err := config.BuildRegularSignature(context.Background(), signingFunc, false) + sig, err := config.BuildRegularSignature(ctx, signingFunc, false) if err != nil { return nil, fmt.Errorf("failed to build regular signature: %w", err) } @@ -301,42 +379,3 @@ func GetIntentConfigurationSignature( return data, nil } - -// // replaceSapientSignerWithNodeInConfigTree recursively traverses the WalletConfigTree. -// func replaceSapientSignerWithNodeInConfigTree(tree v3.WalletConfigTree) v3.WalletConfigTree { -// if tree == nil { -// return nil -// } - -// switch node := tree.(type) { -// case *v3.WalletConfigTreeNode: -// // Recursively call on left and right children -// left := replaceSapientSignerWithNodeInConfigTree(node.Left) -// right := replaceSapientSignerWithNodeInConfigTree(node.Right) - -// if left == node.Left && right == node.Right { -// return node -// } -// return &v3.WalletConfigTreeNode{Left: left, Right: right} - -// case *v3.WalletConfigTreeNestedLeaf: -// // Recursively call on the inner tree -// innerTree := replaceSapientSignerWithNodeInConfigTree(node.Tree) - -// if innerTree == node.Tree { // Check for pointer equality -// return node // No change, return original -// } -// return &v3.WalletConfigTreeNestedLeaf{ -// Weight: node.Weight, -// Threshold: node.Threshold, -// Tree: innerTree, -// } - -// case *v3.WalletConfigTreeSapientSignerLeaf: -// // This is the target node type to replace -// return &v3.WalletConfigTreeNodeLeaf{Node: node.ImageHash()} - -// default: -// return tree -// } -// } diff --git a/intent_config_test.go b/intent_config_test.go index 8ed7babe..bea81e40 100644 --- a/intent_config_test.go +++ b/intent_config_test.go @@ -299,12 +299,648 @@ func TestCreateIntentConfiguration_Valid(t *testing.T) { // Use a valid main signer address. mainSigner := common.HexToAddress("0x1111111111111111111111111111111111111111") - config, err := sequence.CreateIntentConfiguration(mainSigner, []*v3.CallsPayload{&payload}, nil) + config, err := sequence.CreateIntentConfiguration(mainSigner, []*v3.CallsPayload{&payload}, nil, 0) require.NoError(t, err) require.NotNil(t, config) } +// extractSapientSignerLeaves extracts all SapientSignerLeaves from a WalletConfig tree +func extractSapientSignerLeaves(tree v3.WalletConfigTree) []*v3.WalletConfigTreeSapientSignerLeaf { + var leaves []*v3.WalletConfigTreeSapientSignerLeaf + + var extractRecursive func(v3.WalletConfigTree) + extractRecursive = func(t v3.WalletConfigTree) { + if t == nil { + return + } + if sapientLeaf, ok := t.(*v3.WalletConfigTreeSapientSignerLeaf); ok { + leaves = append(leaves, sapientLeaf) + return + } + if node, ok := t.(*v3.WalletConfigTreeNode); ok { + extractRecursive(node.Left) + extractRecursive(node.Right) + } + } + + extractRecursive(tree) + return leaves +} + +// extractSapientSignerTree extracts the SapientSigner tree from a WalletConfig +// The tree structure is: WalletConfig -> WalletConfigTreeNode -> (AddressLeaf, SapientSignerTree) +func extractSapientSignerTree(config *v3.WalletConfig) v3.WalletConfigTree { + if node, ok := config.Tree.(*v3.WalletConfigTreeNode); ok { + // The sapient signer tree should be on the right side (left is the main signer) + return node.Right + } + return nil +} + +// extractAnyAddressSubdigestLeaves extracts all AnyAddressSubdigestLeaves from a WalletConfig tree +func extractAnyAddressSubdigestLeaves(config *v3.WalletConfig) []*v3.WalletConfigTreeAnyAddressSubdigestLeaf { + var leaves []*v3.WalletConfigTreeAnyAddressSubdigestLeaf + + var extractRecursive func(v3.WalletConfigTree) + extractRecursive = func(t v3.WalletConfigTree) { + if t == nil { + return + } + if subdigestLeaf, ok := t.(*v3.WalletConfigTreeAnyAddressSubdigestLeaf); ok { + leaves = append(leaves, subdigestLeaf) + return + } + if node, ok := t.(*v3.WalletConfigTreeNode); ok { + extractRecursive(node.Left) + extractRecursive(node.Right) + } + } + + // Start from the root tree + if node, ok := config.Tree.(*v3.WalletConfigTreeNode); ok { + // The subdigest leaves are in the right side (left is the main signer) + extractRecursive(node.Right) + } + + return leaves +} + +func TestCreateIntentConfigurationWithMalleableSapient_EmptyCalls(t *testing.T) { + ctx := context.Background() + mainSigner := common.HexToAddress("0x1111111111111111111111111111111111111111") + + _, err := sequence.CreateIntentConfigurationWithMalleableSapient(ctx, mainSigner, []*v3.CallsPayload{}, []sequence.MalleableSapientConfig{}, 0) + assert.Error(t, err) + assert.Contains(t, err.Error(), "calls cannot be empty") +} + +func TestCreateIntentConfigurationWithMalleableSapient_NilProvider(t *testing.T) { + ctx := context.Background() + mainSigner := common.HexToAddress("0x1111111111111111111111111111111111111111") + malleableSapientAddress := common.HexToAddress("0x1111111111111111111111111111111111111111") + + payload := v3.NewCallsPayload(common.Address{}, big.NewInt(1), []v3.Call{ + { + To: common.Address{}, + Value: big.NewInt(0), + Data: []byte{0x01, 0x02, 0x03}, + GasLimit: big.NewInt(0), + DelegateCall: false, + OnlyFallback: false, + BehaviorOnError: v3.BehaviorOnErrorRevert, + }, + }, big.NewInt(0), big.NewInt(0)) + + _, err := sequence.CreateIntentConfigurationWithMalleableSapient(ctx, mainSigner, []*v3.CallsPayload{&payload}, []sequence.MalleableSapientConfig{{Address: malleableSapientAddress, Signature: []byte{}, Provider: nil}}, 0) + assert.Error(t, err) + assert.Contains(t, err.Error(), "provider is required") +} + +func TestCreateIntentConfigurationWithMalleableSapient_SinglePayload(t *testing.T) { + ctx := context.Background() + mainSigner := common.HexToAddress("0x1111111111111111111111111111111111111111") + malleableSapientAddress := testChain.DeployTrailsUtils(t) + + payload := v3.NewCallsPayload(common.Address{}, testChain.ChainID(), []v3.Call{ + { + To: common.HexToAddress("0x0000000000000000000000000000000000000001"), + Value: big.NewInt(0), + Data: []byte{0x01, 0x02, 0x03}, + GasLimit: big.NewInt(0), + DelegateCall: false, + OnlyFallback: false, + BehaviorOnError: v3.BehaviorOnErrorRevert, + }, + }, big.NewInt(0), big.NewInt(0)) + + config, err := sequence.CreateIntentConfigurationWithMalleableSapient(ctx, mainSigner, []*v3.CallsPayload{&payload}, []sequence.MalleableSapientConfig{{Address: malleableSapientAddress, Signature: []byte{}, Provider: testChain.Provider}}, 0) + require.NoError(t, err) + require.NotNil(t, config) + + // Verify the config has sapient signer leaves (one per payload) + sapientSignerTree := extractSapientSignerTree(config) + require.NotNil(t, sapientSignerTree, "config should contain a sapient signer tree") + sapientSignerLeaves := extractSapientSignerLeaves(sapientSignerTree) + require.Len(t, sapientSignerLeaves, 1, "should have one sapient signer leaf for single payload") + assert.Equal(t, malleableSapientAddress, sapientSignerLeaves[0].Address, "sapient signer address should match") + assert.NotEqual(t, common.Hash{}, sapientSignerLeaves[0].ImageHash_.Hash, "imageHash should not be zero") + + // Verify that the call with non-zero malleableSapientAddress is NOT included in the subdigest tree + subdigestLeaves := extractAnyAddressSubdigestLeaves(config) + require.Len(t, subdigestLeaves, 0, "should have no subdigest leaves when call has non-zero malleableSapientAddress") +} + +func TestCreateIntentConfigurationWithMalleableSapient_MultiplePayloads(t *testing.T) { + ctx := context.Background() + mainSigner := common.HexToAddress("0x1111111111111111111111111111111111111111") + malleableSapientAddress := testChain.DeployTrailsUtils(t) + + payload1 := v3.NewCallsPayload(common.Address{}, testChain.ChainID(), []v3.Call{ + { + To: common.HexToAddress("0x0000000000000000000000000000000000000001"), + Value: big.NewInt(0), + Data: []byte{0x01, 0x02, 0x03}, + GasLimit: big.NewInt(0), + DelegateCall: false, + OnlyFallback: false, + BehaviorOnError: v3.BehaviorOnErrorRevert, + }, + }, big.NewInt(0), big.NewInt(0)) + + payload2 := v3.NewCallsPayload(common.Address{}, testChain.ChainID(), []v3.Call{ + { + To: common.HexToAddress("0x0000000000000000000000000000000000000002"), + Value: big.NewInt(0), + Data: []byte{0x04, 0x05, 0x06}, + GasLimit: big.NewInt(0), + DelegateCall: false, + OnlyFallback: false, + BehaviorOnError: v3.BehaviorOnErrorRevert, + }, + }, big.NewInt(0), big.NewInt(0)) + + config, err := sequence.CreateIntentConfigurationWithMalleableSapient(ctx, mainSigner, []*v3.CallsPayload{&payload1, &payload2}, []sequence.MalleableSapientConfig{ + {Address: malleableSapientAddress, Signature: []byte{}, Provider: testChain.Provider}, + {Address: malleableSapientAddress, Signature: []byte{}, Provider: testChain.Provider}, + }, 0) + require.NoError(t, err) + require.NotNil(t, config) + + // Verify the config has sapient signer leaves (one per payload) + sapientSignerTree := extractSapientSignerTree(config) + require.NotNil(t, sapientSignerTree, "config should contain a sapient signer tree") + sapientSignerLeaves := extractSapientSignerLeaves(sapientSignerTree) + require.Len(t, sapientSignerLeaves, 2, "should have two sapient signer leaves for two payloads") + for i, leaf := range sapientSignerLeaves { + assert.Equal(t, malleableSapientAddress, leaf.Address, "sapient signer address should match for leaf %d", i) + assert.NotEqual(t, common.Hash{}, leaf.ImageHash_.Hash, "imageHash should not be zero for leaf %d", i) + } + + // Verify that calls with non-zero malleableSapientAddress are NOT included in the subdigest tree + subdigestLeaves := extractAnyAddressSubdigestLeaves(config) + require.Len(t, subdigestLeaves, 0, "should have no subdigest leaves when all calls have non-zero malleableSapientAddress") +} + +func TestCreateIntentConfigurationWithMalleableSapient_CallsWithNonZeroAddressExcludedFromSubdigest(t *testing.T) { + ctx := context.Background() + mainSigner := common.HexToAddress("0x1111111111111111111111111111111111111111") + malleableSapientAddress := testChain.DeployTrailsUtils(t) + + // Create two payloads - one with zero address, one with non-zero address + payload1 := v3.NewCallsPayload(common.Address{}, testChain.ChainID(), []v3.Call{ + { + To: common.HexToAddress("0x0000000000000000000000000000000000000001"), + Value: big.NewInt(0), + Data: []byte{0x01, 0x02, 0x03}, + GasLimit: big.NewInt(0), + DelegateCall: false, + OnlyFallback: false, + BehaviorOnError: v3.BehaviorOnErrorRevert, + }, + }, big.NewInt(0), big.NewInt(0)) + + payload2 := v3.NewCallsPayload(common.Address{}, testChain.ChainID(), []v3.Call{ + { + To: common.HexToAddress("0x0000000000000000000000000000000000000002"), + Value: big.NewInt(0), + Data: []byte{0x04, 0x05, 0x06}, + GasLimit: big.NewInt(0), + DelegateCall: false, + OnlyFallback: false, + BehaviorOnError: v3.BehaviorOnErrorRevert, + }, + }, big.NewInt(0), big.NewInt(0)) + + // Test: payload1 has zero address (should be in subdigest), payload2 has non-zero address (should NOT be in subdigest) + config, err := sequence.CreateIntentConfigurationWithMalleableSapient(ctx, mainSigner, []*v3.CallsPayload{&payload1, &payload2}, []sequence.MalleableSapientConfig{ + {Address: common.Address{}, Signature: []byte{}, Provider: testChain.Provider}, // Zero address - should be in subdigest + {Address: malleableSapientAddress, Signature: []byte{}, Provider: testChain.Provider}, // Non-zero address - should NOT be in subdigest + }, 0) + require.NoError(t, err) + require.NotNil(t, config) + + // Verify sapient signer leaf exists for payload2 + sapientTree := extractSapientSignerTree(config) + require.NotNil(t, sapientTree, "config should contain a sapient signer tree") + sapientLeaves := extractSapientSignerLeaves(sapientTree) + require.Len(t, sapientLeaves, 1, "should have one sapient signer leaf for payload2") + assert.Equal(t, malleableSapientAddress, sapientLeaves[0].Address, "sapient signer address should match") + + // Verify that only payload1 (zero address) is in the subdigest tree, payload2 (non-zero address) is NOT + subdigestLeaves := extractAnyAddressSubdigestLeaves(config) + require.Len(t, subdigestLeaves, 1, "should have one subdigest leaf for payload1") + assert.Equal(t, payload1.Digest().Hash, subdigestLeaves[0].Digest, "subdigest should match payload1") + + // Verify payload2 is NOT in subdigest + for _, leaf := range subdigestLeaves { + assert.NotEqual(t, payload2.Digest().Hash, leaf.Digest, "payload2 should not be in subdigest") + } +} + +func TestCreateIntentConfigurationWithMalleableSapient_EmptyAndNilSignaturesProduceSameImageHash(t *testing.T) { + ctx := context.Background() + mainSigner := common.HexToAddress("0x1111111111111111111111111111111111111111") + malleableSapientAddress := testChain.DeployTrailsUtils(t) + + payload := v3.NewCallsPayload(common.Address{}, testChain.ChainID(), []v3.Call{ + { + To: common.HexToAddress("0x0000000000000000000000000000000000000001"), + Value: big.NewInt(0), + Data: []byte{0x01, 0x02, 0x03}, + GasLimit: big.NewInt(0), + DelegateCall: false, + OnlyFallback: false, + BehaviorOnError: v3.BehaviorOnErrorRevert, + }, + }, big.NewInt(0), big.NewInt(0)) + + // Create config with empty signature + config1, err := sequence.CreateIntentConfigurationWithMalleableSapient(ctx, mainSigner, []*v3.CallsPayload{&payload}, []sequence.MalleableSapientConfig{{Address: malleableSapientAddress, Signature: []byte{}, Provider: testChain.Provider}}, 0) + require.NoError(t, err) + + // Create config with nil signature (should be treated same as empty) + var nilSignature []byte + config2, err := sequence.CreateIntentConfigurationWithMalleableSapient(ctx, mainSigner, []*v3.CallsPayload{&payload}, []sequence.MalleableSapientConfig{{Address: malleableSapientAddress, Signature: nilSignature, Provider: testChain.Provider}}, 0) + require.NoError(t, err) + + // Extract imageHashes from sapient signer trees + sapientTree1 := extractSapientSignerTree(config1) + sapientTree2 := extractSapientSignerTree(config2) + require.NotNil(t, sapientTree1, "config1 should contain a sapient signer tree") + require.NotNil(t, sapientTree2, "config2 should contain a sapient signer tree") + imageHash1 := sapientTree1.ImageHash().Hash + imageHash2 := sapientTree2.ImageHash().Hash + + // Empty and nil signatures should produce the same imageHash + assert.Equal(t, imageHash1, imageHash2, "empty and nil signatures should produce the same imageHash") +} + +func TestCreateIntentConfigurationWithMalleableSapient_DifferentSignaturesProduceDifferentImageHashes(t *testing.T) { + ctx := context.Background() + mainSigner := common.HexToAddress("0x1111111111111111111111111111111111111111") + malleableSapientAddress := testChain.DeployTrailsUtils(t) + + // Create two identical payloads + payload := v3.NewCallsPayload(common.Address{}, testChain.ChainID(), []v3.Call{ + { + To: common.HexToAddress("0x0000000000000000000000000000000000000001"), + Value: big.NewInt(0), + Data: []byte{0x01, 0x02, 0x03, 0x04, 0x05}, // Longer data to allow for signature testing + GasLimit: big.NewInt(0), + DelegateCall: false, + OnlyFallback: false, + BehaviorOnError: v3.BehaviorOnErrorRevert, + }, + }, big.NewInt(0), big.NewInt(0)) + + // Create config with empty signature (all data is static) + config1, err := sequence.CreateIntentConfigurationWithMalleableSapient(ctx, mainSigner, []*v3.CallsPayload{&payload}, []sequence.MalleableSapientConfig{{Address: malleableSapientAddress, Signature: []byte{}, Provider: testChain.Provider}}, 0) + require.NoError(t, err) + + // Create config with a signature that marks some data as malleable + // Signature format: tindex (uint8), cindex (uint16), size (uint16) + // This signature marks bytes 0-2 as static (committed) and the rest as malleable + // tindex=0, cindex=0, size=3 + signatureWithMalleableParts := []byte{0x00, 0x00, 0x00, 0x00, 0x03} + config2, err := sequence.CreateIntentConfigurationWithMalleableSapient(ctx, mainSigner, []*v3.CallsPayload{&payload}, []sequence.MalleableSapientConfig{{Address: malleableSapientAddress, Signature: signatureWithMalleableParts, Provider: testChain.Provider}}, 0) + require.NoError(t, err) + + // Extract imageHashes from sapient signer trees + sapientTree1 := extractSapientSignerTree(config1) + sapientTree2 := extractSapientSignerTree(config2) + require.NotNil(t, sapientTree1, "config1 should contain a sapient signer tree") + require.NotNil(t, sapientTree2, "config2 should contain a sapient signer tree") + imageHash1 := sapientTree1.ImageHash().Hash + imageHash2 := sapientTree2.ImageHash().Hash + + // Different signatures should produce different imageHashes + assert.NotEqual(t, imageHash1, imageHash2, "different signatures should produce different imageHashes") +} + +func TestCreateIntentConfigurationWithMalleableSapient_SameSignatureProducesSameImageHash(t *testing.T) { + ctx := context.Background() + mainSigner := common.HexToAddress("0x1111111111111111111111111111111111111111") + malleableSapientAddress := testChain.DeployTrailsUtils(t) + + payload := v3.NewCallsPayload(common.Address{}, testChain.ChainID(), []v3.Call{ + { + To: common.HexToAddress("0x0000000000000000000000000000000000000001"), + Value: big.NewInt(0), + Data: []byte{0x01, 0x02, 0x03}, + GasLimit: big.NewInt(0), + DelegateCall: false, + OnlyFallback: false, + BehaviorOnError: v3.BehaviorOnErrorRevert, + }, + }, big.NewInt(0), big.NewInt(0)) + + signature := []byte{} // Empty signature + + // Create config twice with same signature + config1, err := sequence.CreateIntentConfigurationWithMalleableSapient(ctx, mainSigner, []*v3.CallsPayload{&payload}, []sequence.MalleableSapientConfig{{Address: malleableSapientAddress, Signature: signature, Provider: testChain.Provider}}, 0) + require.NoError(t, err) + + config2, err := sequence.CreateIntentConfigurationWithMalleableSapient(ctx, mainSigner, []*v3.CallsPayload{&payload}, []sequence.MalleableSapientConfig{{Address: malleableSapientAddress, Signature: signature, Provider: testChain.Provider}}, 0) + require.NoError(t, err) + + // Extract imageHashes from sapient signer trees + sapientTree1 := extractSapientSignerTree(config1) + sapientTree2 := extractSapientSignerTree(config2) + require.NotNil(t, sapientTree1, "config1 should contain a sapient signer tree") + require.NotNil(t, sapientTree2, "config2 should contain a sapient signer tree") + imageHash1 := sapientTree1.ImageHash().Hash + imageHash2 := sapientTree2.ImageHash().Hash + + // Same signature should produce same imageHash + assert.Equal(t, imageHash1, imageHash2, "same signature should produce same imageHash") +} + +func TestCreateIntentConfigurationWithMalleableSapient_DifferentPayloadsProduceDifferentImageHashes(t *testing.T) { + ctx := context.Background() + mainSigner := common.HexToAddress("0x1111111111111111111111111111111111111111") + malleableSapientAddress := testChain.DeployTrailsUtils(t) + + payload1 := v3.NewCallsPayload(common.Address{}, testChain.ChainID(), []v3.Call{ + { + To: common.HexToAddress("0x0000000000000000000000000000000000000001"), + Value: big.NewInt(0), + Data: []byte{0x01, 0x02, 0x03}, + GasLimit: big.NewInt(0), + DelegateCall: false, + OnlyFallback: false, + BehaviorOnError: v3.BehaviorOnErrorRevert, + }, + }, big.NewInt(0), big.NewInt(0)) + + payload2 := v3.NewCallsPayload(common.Address{}, testChain.ChainID(), []v3.Call{ + { + To: common.HexToAddress("0x0000000000000000000000000000000000000002"), + Value: big.NewInt(0), + Data: []byte{0x04, 0x05, 0x06}, + GasLimit: big.NewInt(0), + DelegateCall: false, + OnlyFallback: false, + BehaviorOnError: v3.BehaviorOnErrorRevert, + }, + }, big.NewInt(0), big.NewInt(0)) + + signature := []byte{} + + config1, err := sequence.CreateIntentConfigurationWithMalleableSapient(ctx, mainSigner, []*v3.CallsPayload{&payload1}, []sequence.MalleableSapientConfig{{Address: malleableSapientAddress, Signature: signature, Provider: testChain.Provider}}, 0) + require.NoError(t, err) + + config2, err := sequence.CreateIntentConfigurationWithMalleableSapient(ctx, mainSigner, []*v3.CallsPayload{&payload2}, []sequence.MalleableSapientConfig{{Address: malleableSapientAddress, Signature: signature, Provider: testChain.Provider}}, 0) + require.NoError(t, err) + + // Extract imageHashes from sapient signer trees + sapientTree1 := extractSapientSignerTree(config1) + sapientTree2 := extractSapientSignerTree(config2) + require.NotNil(t, sapientTree1, "config1 should contain a sapient signer tree") + require.NotNil(t, sapientTree2, "config2 should contain a sapient signer tree") + imageHash1 := sapientTree1.ImageHash().Hash + imageHash2 := sapientTree2.ImageHash().Hash + + // Different payloads should produce different imageHashes + assert.NotEqual(t, imageHash1, imageHash2, "different payloads should produce different imageHashes") +} + +func TestCreateIntentConfigurationWithMalleableSapient_ConfigsLengthMismatch(t *testing.T) { + ctx := context.Background() + mainSigner := common.HexToAddress("0x1111111111111111111111111111111111111111") + malleableSapientAddress := testChain.DeployTrailsUtils(t) + + payload1 := v3.NewCallsPayload(common.Address{}, testChain.ChainID(), []v3.Call{ + { + To: common.HexToAddress("0x0000000000000000000000000000000000000001"), + Value: big.NewInt(0), + Data: []byte{0x01, 0x02, 0x03}, + GasLimit: big.NewInt(0), + DelegateCall: false, + OnlyFallback: false, + BehaviorOnError: v3.BehaviorOnErrorRevert, + }, + }, big.NewInt(0), big.NewInt(0)) + + payload2 := v3.NewCallsPayload(common.Address{}, testChain.ChainID(), []v3.Call{ + { + To: common.HexToAddress("0x0000000000000000000000000000000000000002"), + Value: big.NewInt(0), + Data: []byte{0x04, 0x05, 0x06}, + GasLimit: big.NewInt(0), + DelegateCall: false, + OnlyFallback: false, + BehaviorOnError: v3.BehaviorOnErrorRevert, + }, + }, big.NewInt(0), big.NewInt(0)) + + // Test with too few configs + _, err := sequence.CreateIntentConfigurationWithMalleableSapient(ctx, mainSigner, []*v3.CallsPayload{&payload1, &payload2}, []sequence.MalleableSapientConfig{{Address: malleableSapientAddress, Signature: []byte{}, Provider: testChain.Provider}}, 0) + assert.Error(t, err) + assert.Contains(t, err.Error(), "configs length") + + // Test with too many configs + _, err = sequence.CreateIntentConfigurationWithMalleableSapient(ctx, mainSigner, []*v3.CallsPayload{&payload1}, []sequence.MalleableSapientConfig{ + {Address: malleableSapientAddress, Signature: []byte{}, Provider: testChain.Provider}, + {Address: malleableSapientAddress, Signature: []byte{}, Provider: testChain.Provider}, + }, 0) + assert.Error(t, err) + assert.Contains(t, err.Error(), "configs length") +} + +func TestCreateIntentConfigurationWithMalleableSapient_DifferentSignaturesPerCall(t *testing.T) { + ctx := context.Background() + mainSigner := common.HexToAddress("0x1111111111111111111111111111111111111111") + malleableSapientAddress := testChain.DeployTrailsUtils(t) + + // Create two identical payloads to isolate the effect of different signatures + payload1 := v3.NewCallsPayload(common.Address{}, testChain.ChainID(), []v3.Call{ + { + To: common.HexToAddress("0x0000000000000000000000000000000000000001"), + Value: big.NewInt(0), + Data: []byte{0x01, 0x02, 0x03, 0x04, 0x05}, // Longer data to allow for signature testing + GasLimit: big.NewInt(0), + DelegateCall: false, + OnlyFallback: false, + BehaviorOnError: v3.BehaviorOnErrorRevert, + }, + }, big.NewInt(0), big.NewInt(0)) + + payload2 := v3.NewCallsPayload(common.Address{}, testChain.ChainID(), []v3.Call{ + { + To: common.HexToAddress("0x0000000000000000000000000000000000000001"), + Value: big.NewInt(0), + Data: []byte{0x01, 0x02, 0x03, 0x04, 0x05}, // Same data as payload1 + GasLimit: big.NewInt(0), + DelegateCall: false, + OnlyFallback: false, + BehaviorOnError: v3.BehaviorOnErrorRevert, + }, + }, big.NewInt(0), big.NewInt(0)) + + // Create config with different signatures for each call + // Signature 1: empty (all data static) + signature1 := []byte{} + // Signature 2: marks bytes 0-2 as static, rest malleable (tindex=0, cindex=0, size=3) + signature2 := []byte{0x00, 0x00, 0x00, 0x00, 0x03} + config1, err := sequence.CreateIntentConfigurationWithMalleableSapient(ctx, mainSigner, []*v3.CallsPayload{&payload1, &payload2}, []sequence.MalleableSapientConfig{ + {Address: malleableSapientAddress, Signature: signature1, Provider: testChain.Provider}, + {Address: malleableSapientAddress, Signature: signature2, Provider: testChain.Provider}, + }, 0) + require.NoError(t, err) + require.NotNil(t, config1) + + // Verify the config has sapient signer leaves (one per payload) + sapientTree1 := extractSapientSignerTree(config1) + require.NotNil(t, sapientTree1, "config1 should contain a sapient signer tree") + sapientLeaves1 := extractSapientSignerLeaves(sapientTree1) + require.Len(t, sapientLeaves1, 2, "should have two sapient signer leaves for two payloads") + for i, leaf := range sapientLeaves1 { + assert.Equal(t, malleableSapientAddress, leaf.Address, "sapient signer address should match for leaf %d", i) + assert.NotEqual(t, common.Hash{}, leaf.ImageHash_.Hash, "imageHash should not be zero for leaf %d", i) + } + + // Create another config with swapped signatures - should produce different imageHash + config2, err := sequence.CreateIntentConfigurationWithMalleableSapient(ctx, mainSigner, []*v3.CallsPayload{&payload1, &payload2}, []sequence.MalleableSapientConfig{ + {Address: malleableSapientAddress, Signature: signature2, Provider: testChain.Provider}, + {Address: malleableSapientAddress, Signature: signature1, Provider: testChain.Provider}, + }, 0) + require.NoError(t, err) + require.NotNil(t, config2) + + sapientTree2 := extractSapientSignerTree(config2) + require.NotNil(t, sapientTree2, "config2 should contain a sapient signer tree") + + // Different signature assignments per call should produce different imageHashes + imageHash1 := sapientTree1.ImageHash().Hash + imageHash2 := sapientTree2.ImageHash().Hash + assert.NotEqual(t, imageHash1, imageHash2, "different signatures per call should produce different imageHash") +} + +func TestCreateIntentConfigurationWithMalleableSapient_DifferentAddressesPerCall(t *testing.T) { + ctx := context.Background() + mainSigner := common.HexToAddress("0x1111111111111111111111111111111111111111") + malleableSapientAddress1 := testChain.DeployTrailsUtils(t) + malleableSapientAddress2 := testChain.DeployTrailsUtils(t) // Deploy again to get a different address (will be same due to UniDeploy, but tests the structure) + + payload1 := v3.NewCallsPayload(common.Address{}, testChain.ChainID(), []v3.Call{ + { + To: common.HexToAddress("0x0000000000000000000000000000000000000001"), + Value: big.NewInt(0), + Data: []byte{0x01, 0x02, 0x03}, + GasLimit: big.NewInt(0), + DelegateCall: false, + OnlyFallback: false, + BehaviorOnError: v3.BehaviorOnErrorRevert, + }, + }, big.NewInt(0), big.NewInt(0)) + + payload2 := v3.NewCallsPayload(common.Address{}, testChain.ChainID(), []v3.Call{ + { + To: common.HexToAddress("0x0000000000000000000000000000000000000002"), + Value: big.NewInt(0), + Data: []byte{0x04, 0x05, 0x06}, + GasLimit: big.NewInt(0), + DelegateCall: false, + OnlyFallback: false, + BehaviorOnError: v3.BehaviorOnErrorRevert, + }, + }, big.NewInt(0), big.NewInt(0)) + + // Create config with different addresses per call (same provider since we only have one test chain) + config, err := sequence.CreateIntentConfigurationWithMalleableSapient(ctx, mainSigner, []*v3.CallsPayload{&payload1, &payload2}, []sequence.MalleableSapientConfig{ + {Address: malleableSapientAddress1, Signature: []byte{}, Provider: testChain.Provider}, + {Address: malleableSapientAddress2, Signature: []byte{}, Provider: testChain.Provider}, + }, 0) + require.NoError(t, err) + require.NotNil(t, config) + + // Verify the config has sapient signer leaves (one per payload) + sapientTree := extractSapientSignerTree(config) + require.NotNil(t, sapientTree, "config should contain a sapient signer tree") + sapientLeaves := extractSapientSignerLeaves(sapientTree) + require.Len(t, sapientLeaves, 2, "should have two sapient signer leaves for two payloads") + + // Verify each leaf has the correct address + assert.Equal(t, malleableSapientAddress1, sapientLeaves[0].Address, "first leaf should have first address") + assert.Equal(t, malleableSapientAddress2, sapientLeaves[1].Address, "second leaf should have second address") + + // Verify imageHashes are not zero + for i, leaf := range sapientLeaves { + assert.NotEqual(t, common.Hash{}, leaf.ImageHash_.Hash, "imageHash should not be zero for leaf %d", i) + } +} + +func TestCreateIntentConfigurationWithMalleableSapient_ZeroAddressSkipsLeaf(t *testing.T) { + ctx := context.Background() + mainSigner := common.HexToAddress("0x1111111111111111111111111111111111111111") + malleableSapientAddress := testChain.DeployTrailsUtils(t) + + payload1 := v3.NewCallsPayload(common.Address{}, testChain.ChainID(), []v3.Call{ + { + To: common.HexToAddress("0x0000000000000000000000000000000000000001"), + Value: big.NewInt(0), + Data: []byte{0x01, 0x02, 0x03}, + GasLimit: big.NewInt(0), + DelegateCall: false, + OnlyFallback: false, + BehaviorOnError: v3.BehaviorOnErrorRevert, + }, + }, big.NewInt(0), big.NewInt(0)) + + payload2 := v3.NewCallsPayload(common.Address{}, testChain.ChainID(), []v3.Call{ + { + To: common.HexToAddress("0x0000000000000000000000000000000000000002"), + Value: big.NewInt(0), + Data: []byte{0x04, 0x05, 0x06}, + GasLimit: big.NewInt(0), + DelegateCall: false, + OnlyFallback: false, + BehaviorOnError: v3.BehaviorOnErrorRevert, + }, + }, big.NewInt(0), big.NewInt(0)) + + // Test with zero address for first call - should skip creating a leaf for it + config, err := sequence.CreateIntentConfigurationWithMalleableSapient(ctx, mainSigner, []*v3.CallsPayload{&payload1, &payload2}, []sequence.MalleableSapientConfig{ + {Address: common.Address{}, Signature: []byte{}, Provider: testChain.Provider}, // Zero address - should be skipped + {Address: malleableSapientAddress, Signature: []byte{}, Provider: testChain.Provider}, + }, 0) + require.NoError(t, err) + require.NotNil(t, config) + + // Verify only one sapient signer leaf was created (for the second call) + sapientTree := extractSapientSignerTree(config) + require.NotNil(t, sapientTree, "should have a tree structure") + sapientLeaves := extractSapientSignerLeaves(sapientTree) + require.Len(t, sapientLeaves, 1, "should have one sapient signer leaf (zero address skipped)") + assert.Equal(t, malleableSapientAddress, sapientLeaves[0].Address, "leaf should have the non-zero address") + + // Verify that only the call with zero address (payload1) is included in the subdigest tree + subdigestLeaves := extractAnyAddressSubdigestLeaves(config) + require.Len(t, subdigestLeaves, 1, "should have one subdigest leaf for the call with zero address") + assert.Equal(t, payload1.Digest().Hash, subdigestLeaves[0].Digest, "subdigest should match payload1") + + // Test with all zero addresses - should create config without sapient leaves + config2, err := sequence.CreateIntentConfigurationWithMalleableSapient(ctx, mainSigner, []*v3.CallsPayload{&payload1, &payload2}, []sequence.MalleableSapientConfig{ + {Address: common.Address{}, Signature: []byte{}, Provider: testChain.Provider}, + {Address: common.Address{}, Signature: []byte{}, Provider: testChain.Provider}, + }, 0) + require.NoError(t, err) + require.NotNil(t, config2) + + // Verify no sapient signer leaves were created - check the entire config tree + sapientTree2 := extractSapientSignerTree(config2) + if sapientTree2 != nil { + sapientLeaves2 := extractSapientSignerLeaves(sapientTree2) + assert.Len(t, sapientLeaves2, 0, "should have no sapient signer leaves when all addresses are zero") + } + + // Verify that both calls are included in the subdigest tree (since both have zero addresses) + subdigestLeaves2 := extractAnyAddressSubdigestLeaves(config2) + require.Len(t, subdigestLeaves2, 2, "should have two subdigest leaves when all addresses are zero") +} + func TestGetIntentConfigurationSignature(t *testing.T) { + ctx := context.Background() // Create test wallets eoa1, err := ethwallet.NewWalletFromRandomEntropy() require.NoError(t, err) @@ -328,11 +964,11 @@ func TestGetIntentConfigurationSignature(t *testing.T) { t.Run("signature matches subdigest", func(t *testing.T) { // Create the intent configuration - config, err := sequence.CreateIntentConfiguration(eoa1.Address(), []*v3.CallsPayload{&payload}, nil) + config, err := sequence.CreateIntentConfiguration(eoa1.Address(), []*v3.CallsPayload{&payload}, nil, 0) require.NoError(t, err) // Create the signature - signature, err := sequence.GetIntentConfigurationSignature(eoa1.Address(), []*v3.CallsPayload{&payload}) + signature, err := sequence.GetIntentConfigurationSignature(ctx, config, nil) require.NoError(t, err) // fmt.Println("==> signature", common.Bytes2Hex(signature)) @@ -407,10 +1043,14 @@ func TestGetIntentConfigurationSignature(t *testing.T) { }, big.NewInt(0), big.NewInt(0)) // Create signatures for each payload as separate batches - sig1, err := sequence.GetIntentConfigurationSignature(eoa1.Address(), []*v3.CallsPayload{&payload1}) + config1, err := sequence.CreateIntentConfiguration(eoa1.Address(), []*v3.CallsPayload{&payload1}, nil, 0) + require.NoError(t, err) + sig1, err := sequence.GetIntentConfigurationSignature(ctx, config1, nil) require.NoError(t, err) - sig2, err := sequence.GetIntentConfigurationSignature(eoa1.Address(), []*v3.CallsPayload{&payload2}) + config2, err := sequence.CreateIntentConfiguration(eoa1.Address(), []*v3.CallsPayload{&payload2}, nil, 0) + require.NoError(t, err) + sig2, err := sequence.GetIntentConfigurationSignature(ctx, config2, nil) require.NoError(t, err) // Verify signatures are different @@ -419,18 +1059,24 @@ func TestGetIntentConfigurationSignature(t *testing.T) { t.Run("same transactions produce same signatures", func(t *testing.T) { // Use the payload directly - sig1, err := sequence.GetIntentConfigurationSignature(eoa1.Address(), []*v3.CallsPayload{&payload}) + config1, err := sequence.CreateIntentConfiguration(eoa1.Address(), []*v3.CallsPayload{&payload}, nil, 0) + require.NoError(t, err) + sig1, err := sequence.GetIntentConfigurationSignature(ctx, config1, nil) require.NoError(t, err) - sig2, err := sequence.GetIntentConfigurationSignature(eoa1.Address(), []*v3.CallsPayload{&payload}) + config2, err := sequence.CreateIntentConfiguration(eoa1.Address(), []*v3.CallsPayload{&payload}, nil, 0) + require.NoError(t, err) + sig2, err := sequence.GetIntentConfigurationSignature(ctx, config2, nil) require.NoError(t, err) - // Verify signatures are the same + // Verify configs and signatures are the same + require.Equal(t, config1.Tree, config2.Tree, "same transactions should produce same configuration") require.Equal(t, sig1, sig2, "same transactions should produce same signatures") }) } func TestGetIntentConfigurationSignature_MultipleTransactions(t *testing.T) { + ctx := context.Background() // Create test wallets eoa1, err := ethwallet.NewWalletFromRandomEntropy() require.NoError(t, err) @@ -458,7 +1104,9 @@ func TestGetIntentConfigurationSignature_MultipleTransactions(t *testing.T) { }, big.NewInt(0), big.NewInt(0)) // Create a signature - sig, err := sequence.GetIntentConfigurationSignature(eoa1.Address(), []*v3.CallsPayload{&payload1}) + config, err := sequence.CreateIntentConfiguration(eoa1.Address(), []*v3.CallsPayload{&payload1}, nil, 0) + require.NoError(t, err) + sig, err := sequence.GetIntentConfigurationSignature(ctx, config, nil) require.NoError(t, err) // Convert the full signature into a hex string. @@ -469,6 +1117,7 @@ func TestGetIntentConfigurationSignature_MultipleTransactions(t *testing.T) { } func TestIntentTransactionToGuestModuleDeployAndCall(t *testing.T) { + ctx := context.Background() // Create normal txn of: callmockContract.testCall(55, 0x112255) callmockContract := testChain.UniDeploy(t, "WALLET_CALL_RECV_MOCK", 0) calldata1, err := callmockContract.Encode("setRevertFlag", false) @@ -529,7 +1178,9 @@ func TestIntentTransactionToGuestModuleDeployAndCall(t *testing.T) { require.NotZero(t, mainSigner) // Generate a configuration signature for the batch. - intentConfigSig, err := sequence.GetIntentConfigurationSignature(mainSigner, []*v3.CallsPayload{&payload}) + config, err := sequence.CreateIntentConfiguration(mainSigner, []*v3.CallsPayload{&payload}, nil, 0) + require.NoError(t, err) + intentConfigSig, err := sequence.GetIntentConfigurationSignature(ctx, config, nil) require.NoError(t, err) // fmt.Println("==> bundle.Digest", bundle.Digest().Hash) @@ -603,6 +1254,7 @@ func TestIntentTransactionToGuestModuleDeployAndCall(t *testing.T) { } func TestIntentTransactionToGuestModuleDeployAndCallMultiplePayloads(t *testing.T) { + ctx := context.Background() // Create normal txn of: callmockContract.testCall(55, 0x112255) for first chain callmockContract := testChain.UniDeploy(t, "WALLET_CALL_RECV_MOCK", 0) calldata1, err := callmockContract.Encode("setRevertFlag", false) @@ -687,7 +1339,9 @@ func TestIntentTransactionToGuestModuleDeployAndCallMultiplePayloads(t *testing. require.NotZero(t, mainSigner) // Generate a configuration signature for both batches - intentConfigSig, err := sequence.GetIntentConfigurationSignature(mainSigner, payloads) + config, err := sequence.CreateIntentConfiguration(mainSigner, payloads, nil, 0) + require.NoError(t, err) + intentConfigSig, err := sequence.GetIntentConfigurationSignature(ctx, config, nil) require.NoError(t, err) fmt.Printf("--- Intent Config Signature (for all payloads) ---\n%s\n", common.Bytes2Hex(intentConfigSig)) @@ -814,7 +1468,7 @@ func TestIntentConfigurationAddress(t *testing.T) { ) // Create intent configuration - config, err := sequence.CreateIntentConfiguration(mainSigner, []*v3.CallsPayload{&payload}, nil) + config, err := sequence.CreateIntentConfiguration(mainSigner, []*v3.CallsPayload{&payload}, nil, 0) require.NoError(t, err) // Calculate image hash @@ -864,7 +1518,7 @@ func TestIntentConfigurationAddress(t *testing.T) { ) // Create intent configuration - config, err := sequence.CreateIntentConfiguration(mainSigner, []*v3.CallsPayload{&payload1, &payload2}, nil) + config, err := sequence.CreateIntentConfiguration(mainSigner, []*v3.CallsPayload{&payload1, &payload2}, nil, 0) require.NoError(t, err) // Calculate image hash @@ -917,7 +1571,7 @@ func TestIntentConfigurationAddress_RealWorldExample(t *testing.T) { }, big.NewInt(0), big.NewInt(0)) // Create intent configuration - config, err := sequence.CreateIntentConfiguration(mainSigner, []*v3.CallsPayload{&payload1, &payload2}, nil) + config, err := sequence.CreateIntentConfiguration(mainSigner, []*v3.CallsPayload{&payload1, &payload2}, nil, 0) require.NoError(t, err) // Calculate image hash diff --git a/lib/waas/intent.gen.go b/lib/waas/intent.gen.go index fb05baab..3d5ddab8 100644 --- a/lib/waas/intent.gen.go +++ b/lib/waas/intent.gen.go @@ -1,6 +1,6 @@ // sequence-waas-intents v0.1.0 7d401e1a69093dd5519b7a02f14de0c1380595e0 // -- -// Code generated by webrpc-gen@v0.24.0 with golang generator. DO NOT EDIT. +// Code generated by webrpc-gen@v0.28.1 with golang generator. DO NOT EDIT. // // webrpc-gen -schema=intent.ridl -target=golang -pkg=intents -out=./intent.gen.go package intents @@ -18,7 +18,7 @@ import ( const WebrpcHeader = "Webrpc" -const WebrpcHeaderValue = "webrpc@v0.24.0;gen-golang@v0.18.2;sequence-waas-intents@v0.1.0" +const WebrpcHeaderValue = "webrpc@v0.28.1;gen-golang@v0.21.0;sequence-waas-intents@v0.1.0" // WebRPC description and code-gen version func WebRPCVersion() string { @@ -696,9 +696,26 @@ var WebRPCServices = map[string][]string{} // type method struct { - Name string - Service string - Annotations map[string]string + name string + service string + annotations map[string]string +} + +func (m method) Name() string { + return m.name +} + +func (m method) Service() string { + return m.service +} + +func (m method) Annotations() map[string]string { + res := make(map[string]string, len(m.annotations)) + for k, v := range m.annotations { + res[k] = v + } + + return res } type contextKey struct { @@ -804,15 +821,15 @@ func ErrorWithCause(rpcErr WebRPCError, cause error) WebRPCError { // Webrpc errors var ( - ErrWebrpcEndpoint = WebRPCError{Code: 0, Name: "WebrpcEndpoint", Message: "endpoint error", HTTPStatus: 400} - ErrWebrpcRequestFailed = WebRPCError{Code: -1, Name: "WebrpcRequestFailed", Message: "request failed", HTTPStatus: 400} - ErrWebrpcBadRoute = WebRPCError{Code: -2, Name: "WebrpcBadRoute", Message: "bad route", HTTPStatus: 404} - ErrWebrpcBadMethod = WebRPCError{Code: -3, Name: "WebrpcBadMethod", Message: "bad method", HTTPStatus: 405} - ErrWebrpcBadRequest = WebRPCError{Code: -4, Name: "WebrpcBadRequest", Message: "bad request", HTTPStatus: 400} - ErrWebrpcBadResponse = WebRPCError{Code: -5, Name: "WebrpcBadResponse", Message: "bad response", HTTPStatus: 500} - ErrWebrpcServerPanic = WebRPCError{Code: -6, Name: "WebrpcServerPanic", Message: "server panic", HTTPStatus: 500} - ErrWebrpcInternalError = WebRPCError{Code: -7, Name: "WebrpcInternalError", Message: "internal error", HTTPStatus: 500} - ErrWebrpcClientDisconnected = WebRPCError{Code: -8, Name: "WebrpcClientDisconnected", Message: "client disconnected", HTTPStatus: 400} - ErrWebrpcStreamLost = WebRPCError{Code: -9, Name: "WebrpcStreamLost", Message: "stream lost", HTTPStatus: 400} - ErrWebrpcStreamFinished = WebRPCError{Code: -10, Name: "WebrpcStreamFinished", Message: "stream finished", HTTPStatus: 200} + ErrWebrpcEndpoint = WebRPCError{Code: 0, Name: "WebrpcEndpoint", Message: "endpoint error", HTTPStatus: 400} + ErrWebrpcRequestFailed = WebRPCError{Code: -1, Name: "WebrpcRequestFailed", Message: "request failed", HTTPStatus: 400} + ErrWebrpcBadRoute = WebRPCError{Code: -2, Name: "WebrpcBadRoute", Message: "bad route", HTTPStatus: 404} + ErrWebrpcBadMethod = WebRPCError{Code: -3, Name: "WebrpcBadMethod", Message: "bad method", HTTPStatus: 405} + ErrWebrpcBadRequest = WebRPCError{Code: -4, Name: "WebrpcBadRequest", Message: "bad request", HTTPStatus: 400} + ErrWebrpcBadResponse = WebRPCError{Code: -5, Name: "WebrpcBadResponse", Message: "bad response", HTTPStatus: 500} + ErrWebrpcServerPanic = WebRPCError{Code: -6, Name: "WebrpcServerPanic", Message: "server panic", HTTPStatus: 500} + ErrWebrpcInternalError = WebRPCError{Code: -7, Name: "WebrpcInternalError", Message: "internal error", HTTPStatus: 500} + ErrWebrpcClientAborted = WebRPCError{Code: -8, Name: "WebrpcClientAborted", Message: "request aborted by client", HTTPStatus: 400} + ErrWebrpcStreamLost = WebRPCError{Code: -9, Name: "WebrpcStreamLost", Message: "stream lost", HTTPStatus: 400} + ErrWebrpcStreamFinished = WebRPCError{Code: -10, Name: "WebrpcStreamFinished", Message: "stream finished", HTTPStatus: 200} ) diff --git a/services/trailsapi/trailsapi.gen.go b/services/trailsapi/trailsapi.gen.go index fbd4b1bb..74cdc357 100644 --- a/services/trailsapi/trailsapi.gen.go +++ b/services/trailsapi/trailsapi.gen.go @@ -1,4 +1,4 @@ -// trails-api v1-25.12.16-ee270e57 cd6fea50d2e26fb661de670279f19010f6a3f14a +// trails-api v1-26.1.13-e74daec9 0d952fe03ce07d60c89665bb34a732315012ba2c // -- // Code generated by webrpc-gen@v0.31.3 with golang generator. DO NOT EDIT. // @@ -29,12 +29,12 @@ func WebRPCVersion() string { // Schema version of your RIDL schema func WebRPCSchemaVersion() string { - return "v1-25.12.16-ee270e57" + return "v1-26.1.13-e74daec9" } // Schema hash generated from your RIDL schema func WebRPCSchemaHash() string { - return "cd6fea50d2e26fb661de670279f19010f6a3f14a" + return "0d952fe03ce07d60c89665bb34a732315012ba2c" } // @@ -52,6 +52,7 @@ type TrailsClient interface { GetIntentReceipt(ctx context.Context, getIntentReceiptRequest GetIntentReceiptRequest) (*GetIntentReceiptResponse, error) GetIntent(ctx context.Context, getIntentRequest GetIntentRequest) (*GetIntentResponse, error) SearchIntents(ctx context.Context, searchIntentsRequest SearchIntentsRequest) (*SearchIntentsResponse, error) + GetCallsConfiguration(ctx context.Context, getCallsConfigurationRequest GetCallsConfigurationRequest) (*GetCallsConfigurationResponse, error) GetIntentHistory(ctx context.Context, getIntentHistoryRequest GetIntentHistoryRequest) (*GetIntentHistoryResponse, error) AbortIntent(ctx context.Context, abortIntentRequest AbortIntentRequest) (*AbortIntentResponse, error) // GetChains will return the list of supported chains by Trails. @@ -173,6 +174,8 @@ const ( IntentStatus_SUCCEEDED IntentStatus = 4 // done, intent execution was aborted by user IntentStatus_ABORTED IntentStatus = 5 + // done, intent execution was refunded + IntentStatus_REFUNDED IntentStatus = 6 ) var IntentStatus_name = map[uint8]string{ @@ -182,6 +185,7 @@ var IntentStatus_name = map[uint8]string{ 3: "FAILED", 4: "SUCCEEDED", 5: "ABORTED", + 6: "REFUNDED", } var IntentStatus_value = map[string]uint8{ @@ -191,6 +195,7 @@ var IntentStatus_value = map[string]uint8{ "FAILED": 3, "SUCCEEDED": 4, "ABORTED": 5, + "REFUNDED": 6, } func (x IntentStatus) String() string { @@ -338,19 +343,22 @@ const ( TransactionStatus_FAILED TransactionStatus = 8 // terminal state: aborted at one of the stages, and never completed onchain txn TransactionStatus_ABORTED TransactionStatus = 9 + // terminal state: txn mined but call reverted (refund triggered) + TransactionStatus_REVERTED TransactionStatus = 10 ) var TransactionStatus_name = map[uint8]string{ - 0: "UNKNOWN", - 1: "ON_HOLD", - 2: "PENDING", - 3: "RELAYING", - 4: "SENT", - 5: "ERRORED", - 6: "MINING", - 7: "SUCCEEDED", - 8: "FAILED", - 9: "ABORTED", + 0: "UNKNOWN", + 1: "ON_HOLD", + 2: "PENDING", + 3: "RELAYING", + 4: "SENT", + 5: "ERRORED", + 6: "MINING", + 7: "SUCCEEDED", + 8: "FAILED", + 9: "ABORTED", + 10: "REVERTED", } var TransactionStatus_value = map[string]uint8{ @@ -364,6 +372,7 @@ var TransactionStatus_value = map[string]uint8{ "SUCCEEDED": 7, "FAILED": 8, "ABORTED": 9, + "REVERTED": 10, } func (x TransactionStatus) String() string { @@ -483,11 +492,12 @@ type QuoteIntentRequest struct { OriginChainID uint64 `json:"originChainId"` OriginTokenAddress prototyp.Hash `json:"originTokenAddress"` // destination chain, token, and execution details - DestinationChainID uint64 `json:"destinationChainId"` - DestinationTokenAddress prototyp.Hash `json:"destinationTokenAddress"` - DestinationToAddress prototyp.Hash `json:"destinationToAddress"` - DestinationCallData *string `json:"destinationCallData"` - DestinationCallValue *prototyp.BigInt `json:"destinationCallValue"` + DestinationChainID uint64 `json:"destinationChainId"` + DestinationTokenAddress prototyp.Hash `json:"destinationTokenAddress"` + DestinationToAddress prototyp.Hash `json:"destinationToAddress"` + DestinationApproveAddress prototyp.Hash `json:"destinationApproveAddress"` + DestinationCallData *string `json:"destinationCallData"` + DestinationCallValue *prototyp.BigInt `json:"destinationCallValue"` // originTokenAmount is used with EXACT_INPUT txns OriginTokenAmount *prototyp.BigInt `json:"originTokenAmount"` // destinationTokenAmount is used with EXACT_OUTPUT txns @@ -570,6 +580,15 @@ type IntentCalls struct { Calls []*TransactionCall `json:"calls"` } +type IntentConfiguration struct { + // Origin + ImageHash prototyp.Hash `json:"imageHash"` + OwnerAddress prototyp.Hash `json:"ownerAddress"` + Checkpoint uint64 `json:"checkpoint"` + OriginCalls *IntentCalls `json:"originCalls"` + DestinationCalls *IntentCalls `json:"destinationCalls,omitempty"` +} + type TransactionCall struct { To prototyp.Hash `json:"to"` Value prototyp.BigInt `json:"value"` @@ -713,8 +732,7 @@ type IntentTransaction struct { Type TransactionType `json:"type" db:"type"` Context TransactionContext `json:"context" db:"context"` FromAddress prototyp.Hash `json:"fromAddress" db:"from_address"` - // ie. originIntentAddress, TrailsRouter, or TrailsIntentEntrypoint - ToAddress prototyp.Hash `json:"toAddress" db:"to_address"` + ToAddress prototyp.Hash `json:"toAddress" db:"to_address"` // Token being transferred in this transaction TokenAddress prototyp.Hash `json:"tokenAddress" db:"token_address"` // Amount transferred in this transaction @@ -734,6 +752,24 @@ type IntentTransaction struct { CreatedAt *time.Time `json:"createdAt,omitempty" db:"created_at,omitempty"` } +type PriceImpact struct { + PriceImpact float64 `json:"priceImpact"` + PriceImpactUSD float64 `json:"priceImpactUsd"` +} + +type PriceImpactDetails struct { + // Price impact that results from gas fees on origin and destination chains + ExecutionPriceImpact *PriceImpact `json:"executionPriceImpact"` + // Price impact that results from slippage and pure market movement + MarketPriceImpact *PriceImpact `json:"marketPriceImpact"` + // Price impact that results from provider fees, excluding trails (swap + bridge) + ProviderFeesPriceImpact *PriceImpact `json:"providerFeesPriceImpact"` + // Price impact that results from trails fees + TrailsFeesPriceImpact *PriceImpact `json:"trailsFeesPriceImpact"` + // Price impact that results from net result of all fees, currently used in the final price impact shown to user + NetPriceImpact *PriceImpact `json:"netPriceImpact"` +} + // IntentProviderQuote represents the quotes from the underlining providers for both // the swap and/or bridge external providers. If we do both a swap and a bridge, then // the total amount is the sum of both providers. @@ -750,8 +786,10 @@ type IntentProviderQuote struct { ToAmountUSD float64 `json:"toAmountUsd"` ToAmountMinUSD float64 `json:"toAmountMinUsd"` MaxSlippage float64 `json:"maxSlippage"` - PriceImpact float64 `json:"priceImpact"` - PriceImpactUSD float64 `json:"priceImpactUsd"` + // This is the net price impact (same value as priceImpactDetails.netPriceImpact) + PriceImpact float64 `json:"priceImpact"` + PriceImpactUSD float64 `json:"priceImpactUsd"` + PriceImpactDetails *PriceImpactDetails `json:"priceImpactDetails"` } type IntentFees struct { @@ -760,14 +798,35 @@ type IntentFees struct { DestinationGas *IntentTransactionGasFee `json:"destinationGas"` // provider fees (swap + bridge + trails) Provider *IntentProviderFees `json:"provider"` - // total fees including provider fees + gas fees - FeeTokenAddress prototyp.Hash `json:"feeTokenAddress"` - FeeTokenTotal prototyp.BigInt `json:"feeTokenTotal"` - TotalFeeAmount prototyp.BigInt `json:"totalFeeAmount"` - TotalFeeUSD float64 `json:"totalFeeUsd"` + // fee token details + FeeTokenAddress prototyp.Hash `json:"feeTokenAddress"` + // @deprecated: kept for backwards compatibility here, set to `collectorFeeTotal` + FeeTokenAmount prototyp.BigInt `json:"feeTokenAmount"` + // @deprecated: kept for backwards compatibility here, set to `collectorFeeUsd` + // fee token usd = gas + trails fee (amount trails' fee collector gets transferred) + FeeTokenUSD float64 `json:"feeTokenUsd"` + // @deprecated: kept for backwards compatibility here, set to 0 + // fee token amount = provider + trails + origin amount total + FeeTokenTotal prototyp.BigInt `json:"feeTokenTotal"` + // gas fee component (origin + destination gas or orchestraion fee) + GasFeeTotal prototyp.BigInt `json:"gasFeeTotal"` + GasFeeUSD float64 `json:"gasFeeUsd"` + // trails fee component + TrailsFeeTotal prototyp.BigInt `json:"trailsFeeTotal"` + TrailsFeeUSD float64 `json:"trailsFeeUsd"` + // gas + trails fee component (amount trails collects as a fee) + CollectorFeeTotal prototyp.BigInt `json:"collectorFeeTotal"` + CollectedFeeUSD float64 `json:"collectorFeeUsd"` + // provider fee component + ProviderFeeTotal prototyp.BigInt `json:"providerFeeTotal"` + ProviderFeeUSD float64 `json:"providerFeeUsd"` + // display fees (gas + trails + provider) - what user sees + TotalFeeAmount prototyp.BigInt `json:"totalFeeAmount"` + TotalFeeUSD float64 `json:"totalFeeUsd"` } // ProviderFees is the swap+bridge provider fee, trails fee summary and totals +// @deprecated: please use IntentFees instead type IntentProviderFees struct { // quote provider fee component (swap and/or bridge) QuoteProvider string `json:"quoteProvider"` @@ -776,7 +835,11 @@ type IntentProviderFees struct { // trails provider fee component, denominated in the origin token TrailsFee prototyp.BigInt `json:"trailsFee"` TrailsFeeUSD float64 `json:"trailsFeeUsd"` + // provider + trails (non-gas) fee totals + QuoteProviderWithTrailsFee prototyp.BigInt `json:"quoteProviderWithTrailsFee"` + ProviderWithTrailsFeeUSD float64 `json:"providerWithTrailsFeeUsd"` // total provider fees, aka, swap + bridge + trails fees + // @deprecated: kept for backwards compatibility here, sync w/ providerWithTrailsFee TotalFeeAmount prototyp.BigInt `json:"totalFeeAmount"` TotalFeeUSD float64 `json:"totalFeeUsd"` } @@ -920,8 +983,6 @@ type FeeOption struct { // DepositSignature contains all gasless deposit signature parameters for ExecuteIntent type DepositSignature struct { - // Required: EIP-712 TrailsIntent signature (hex) - IntentSignature prototyp.Hash `json:"intentSignature"` // Optional: EIP-2612 permit signature (hex, if token approval needed) PermitSignature *prototyp.Hash `json:"permitSignature"` // Optional: Permit expiration timestamp @@ -930,16 +991,12 @@ type DepositSignature struct { PermitAmount prototyp.BigInt `json:"permitAmount"` // Required: Selected fee option from gasFeeOptions SelectedGasFeeOption *FeeOption `json:"selectedGasFeeOption"` - // Required: User nonce from Intent Entrypoint contract (fetched fresh at execute time) - UserNonce uint64 `json:"userNonce"` // Required: Intent deadline timestamp Deadline uint64 `json:"deadline"` } // DepositIntentEntry contains gasless deposit metadata stored in JSONB type DepositIntentEntry struct { - // EIP-712 TrailsIntent signature (hex) - IntentSignature prototyp.Hash `json:"intentSignature"` // EIP-2612 permit signature (hex, if approval needed) PermitSignature *prototyp.Hash `json:"permitSignature"` // Permit expiration timestamp @@ -952,8 +1009,6 @@ type DepositIntentEntry struct { FeeToken prototyp.Hash `json:"feeToken"` // Address that receives the fee FeeCollector prototyp.Hash `json:"feeCollector"` - // User nonce from Intent Entrypoint contract (provided by client) - UserNonce uint64 `json:"userNonce"` // Intent deadline timestamp Deadline uint64 `json:"deadline"` } @@ -967,9 +1022,7 @@ type TrailsAddressOverrides struct { } type TrailsContracts struct { - TrailsIntentEntrypointAddress prototyp.Hash `json:"trailsIntentEntrypointAddress"` - TrailsRouterAddress prototyp.Hash `json:"trailsRouterAddress"` - TrailsRouterShimAddress prototyp.Hash `json:"trailsRouterShimAddress"` + TrailsUtilsAddress prototyp.Hash `json:"trailsUtilsAddress"` } type ChainInfo struct { @@ -1094,8 +1147,9 @@ type ServiceStatus struct { // NOTE: we use the IntentRequest directly for the QuoteIntent request type. // And do not create a QuoteIntentRequest additional type, as its unnecessary. type QuoteIntentResponse struct { - Intent *Intent `json:"intent"` - GasFeeOptions *GasFeeOptions `json:"gasFeeOptions"` + Intent *Intent `json:"intent"` + GasFeeOptions *GasFeeOptions `json:"gasFeeOptions"` + IntentConfiguration *IntentConfiguration `json:"intentConfiguration,omitempty"` } // CommitIntent accepts a fully formed Intent and commits it for execution. CommitIntent @@ -1183,6 +1237,23 @@ type SearchIntentsResponse struct { Intents []*Intent `json:"intents"` } +type GetCallsConfigurationRequest struct { + OwnerAddress prototyp.Hash `json:"ownerAddress"` + Checkpoint uint64 `json:"checkpoint"` + Calls *IntentCalls `json:"calls"` + // Origin configuration adds permit capability for the source token + PermitTokenAddress prototyp.Hash `json:"permitTokenAddress"` + IsOrigin bool `json:"isOrigin"` + TrailsAddressOverrides *TrailsAddressOverrides `json:"trailsAddressOverrides,omitempty"` +} + +type GetCallsConfigurationResponse struct { + Address prototyp.Hash `json:"address"` + ImageHash prototyp.Hash `json:"imageHash"` + // v3.WalletConfig Same as sessions + WalletConfiguration interface{} `json:"walletConfiguration"` +} + // GetIntentHistory returns the intent history list, with receipt and summary info. type GetIntentHistoryRequest struct { // cursor paging parameters @@ -1330,12 +1401,12 @@ const TrailsPathPrefix = "/rpc/Trails/" type trailsClient struct { client HTTPClient - urls [19]string + urls [20]string } func NewTrailsClient(addr string, client HTTPClient) TrailsClient { prefix := urlBase(addr) + TrailsPathPrefix - urls := [19]string{ + urls := [20]string{ prefix + "Ping", prefix + "RuntimeStatus", prefix + "Clock", @@ -1346,6 +1417,7 @@ func NewTrailsClient(addr string, client HTTPClient) TrailsClient { prefix + "GetIntentReceipt", prefix + "GetIntent", prefix + "SearchIntents", + prefix + "GetCallsConfiguration", prefix + "GetIntentHistory", prefix + "AbortIntent", prefix + "GetChains", @@ -1522,12 +1594,28 @@ func (c *trailsClient) SearchIntents(ctx context.Context, searchIntentsRequest S return out.Ret0, err } +func (c *trailsClient) GetCallsConfiguration(ctx context.Context, getCallsConfigurationRequest GetCallsConfigurationRequest) (*GetCallsConfigurationResponse, error) { + out := struct { + Ret0 *GetCallsConfigurationResponse + }{} + + resp, err := doHTTPRequest(ctx, c.client, c.urls[10], getCallsConfigurationRequest, &out.Ret0) + if resp != nil { + cerr := resp.Body.Close() + if err == nil && cerr != nil { + err = ErrWebrpcRequestFailed.WithCausef("failed to close response body: %w", cerr) + } + } + + return out.Ret0, err +} + func (c *trailsClient) GetIntentHistory(ctx context.Context, getIntentHistoryRequest GetIntentHistoryRequest) (*GetIntentHistoryResponse, error) { out := struct { Ret0 *GetIntentHistoryResponse }{} - resp, err := doHTTPRequest(ctx, c.client, c.urls[10], getIntentHistoryRequest, &out.Ret0) + resp, err := doHTTPRequest(ctx, c.client, c.urls[11], getIntentHistoryRequest, &out.Ret0) if resp != nil { cerr := resp.Body.Close() if err == nil && cerr != nil { @@ -1543,7 +1631,7 @@ func (c *trailsClient) AbortIntent(ctx context.Context, abortIntentRequest Abort Ret0 *AbortIntentResponse }{} - resp, err := doHTTPRequest(ctx, c.client, c.urls[11], abortIntentRequest, &out.Ret0) + resp, err := doHTTPRequest(ctx, c.client, c.urls[12], abortIntentRequest, &out.Ret0) if resp != nil { cerr := resp.Body.Close() if err == nil && cerr != nil { @@ -1559,7 +1647,7 @@ func (c *trailsClient) GetChains(ctx context.Context, getChainsRequest GetChains Ret0 *GetChainsResponse }{} - resp, err := doHTTPRequest(ctx, c.client, c.urls[12], getChainsRequest, &out.Ret0) + resp, err := doHTTPRequest(ctx, c.client, c.urls[13], getChainsRequest, &out.Ret0) if resp != nil { cerr := resp.Body.Close() if err == nil && cerr != nil { @@ -1575,7 +1663,7 @@ func (c *trailsClient) GetExactOutputRoutes(ctx context.Context, getExactOutputR Ret0 *GetExactOutputRoutesResponse }{} - resp, err := doHTTPRequest(ctx, c.client, c.urls[13], getExactOutputRoutesRequest, &out.Ret0) + resp, err := doHTTPRequest(ctx, c.client, c.urls[14], getExactOutputRoutesRequest, &out.Ret0) if resp != nil { cerr := resp.Body.Close() if err == nil && cerr != nil { @@ -1591,7 +1679,7 @@ func (c *trailsClient) GetExactInputRoutes(ctx context.Context, getExactInputRou Ret0 *GetExactInputRoutesResponse }{} - resp, err := doHTTPRequest(ctx, c.client, c.urls[14], getExactInputRoutesRequest, &out.Ret0) + resp, err := doHTTPRequest(ctx, c.client, c.urls[15], getExactInputRoutesRequest, &out.Ret0) if resp != nil { cerr := resp.Body.Close() if err == nil && cerr != nil { @@ -1607,7 +1695,7 @@ func (c *trailsClient) GetTokenList(ctx context.Context, getTokenListRequest Get Ret0 *GetTokenListResponse }{} - resp, err := doHTTPRequest(ctx, c.client, c.urls[15], getTokenListRequest, &out.Ret0) + resp, err := doHTTPRequest(ctx, c.client, c.urls[16], getTokenListRequest, &out.Ret0) if resp != nil { cerr := resp.Body.Close() if err == nil && cerr != nil { @@ -1623,7 +1711,7 @@ func (c *trailsClient) GetTokenPrices(ctx context.Context, getTokenPricesRequest Ret0 *GetTokenPricesResponse }{} - resp, err := doHTTPRequest(ctx, c.client, c.urls[16], getTokenPricesRequest, &out.Ret0) + resp, err := doHTTPRequest(ctx, c.client, c.urls[17], getTokenPricesRequest, &out.Ret0) if resp != nil { cerr := resp.Body.Close() if err == nil && cerr != nil { @@ -1639,7 +1727,7 @@ func (c *trailsClient) GetTrailsContracts(ctx context.Context) (*TrailsContracts Ret0 *TrailsContracts `json:"TrailsContracts"` }{} - resp, err := doHTTPRequest(ctx, c.client, c.urls[17], nil, &out) + resp, err := doHTTPRequest(ctx, c.client, c.urls[18], nil, &out) if resp != nil { cerr := resp.Body.Close() if err == nil && cerr != nil { @@ -1655,7 +1743,7 @@ func (c *trailsClient) GetIntentTransactionHistory(ctx context.Context, getInten Ret0 *GetIntentTransactionHistoryResponse }{} - resp, err := doHTTPRequest(ctx, c.client, c.urls[18], getIntentTransactionHistoryRequest, &out.Ret0) + resp, err := doHTTPRequest(ctx, c.client, c.urls[19], getIntentTransactionHistoryRequest, &out.Ret0) if resp != nil { cerr := resp.Body.Close() if err == nil && cerr != nil { @@ -2057,7 +2145,7 @@ var ( const WebrpcHeader = "Webrpc" -const WebrpcHeaderValue = "webrpc@v0.31.3;gen-golang@v0.23.3;trails-api@v1-25.12.16-ee270e57" +const WebrpcHeaderValue = "webrpc@v0.31.3;gen-golang@v0.23.3;trails-api@v1-26.1.13-e74daec9" type WebrpcGenVersions struct { WebrpcGenVersion string diff --git a/testutil/contracts.go b/testutil/contracts.go index a8d99540..8b841ca2 100644 --- a/testutil/contracts.go +++ b/testutil/contracts.go @@ -22,6 +22,7 @@ var ( func init() { Contracts.MustAdd(contracts.ERC20Mock) Contracts.MustAdd(contracts.V1.WalletFactory) + Contracts.MustAdd(contracts.TrailsUtils) Contracts.MustRegisterJSON("WALLET_CALL_RECV_MOCK", walletcallmock.CallReceiverMockABI, common.FromHex(walletcallmock.CallReceiverMockBin)) } diff --git a/testutil/testutil.go b/testutil/testutil.go index f44a7228..deccf39b 100644 --- a/testutil/testutil.go +++ b/testutil/testutil.go @@ -479,6 +479,13 @@ func (c *TestChain) UniDeploy(t *testing.T, contractName string, contractInstanc return ethcontract.NewContractCaller(contractAddress, artifact.ABI, c.Provider) } +// DeployTrailsUtils deploys TrailsUtils contract and returns its address. +// Multiple calls will deploy just a single instance (using contractInstanceNum 0). +func (c *TestChain) DeployTrailsUtils(t *testing.T) common.Address { + contract := c.UniDeploy(t, "TRAILS_UTILS", 0) + return contract.Address +} + // Deploy will deploy a contract registered in `Contracts` registry using the standard deployment method. Each Deploy call // will instanitate a new contract on the test chain. func (c *TestChain) Deploy(t *testing.T, contractName string, contractConstructorArgs ...interface{}) (*ethcontract.Contract, *types.Receipt) { @@ -721,7 +728,7 @@ func (c *TestChain) V3DummySequenceWalletWithIntentConfig(seed uint64, calls []* } // Create an intent config - intentConfig, err := sequence.CreateIntentConfiguration(owner.Address(), calls, nil) + intentConfig, err := sequence.CreateIntentConfiguration(owner.Address(), calls, nil, 0) if err != nil { return nil, err }