diff --git a/Cargo.lock b/Cargo.lock index e85e4d6826..91dfdc1793 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1424,7 +1424,6 @@ dependencies = [ "configs", "const-hex", "contracts", - "cow-amm", "dashmap 6.1.0", "database", "derive_more 1.0.0", @@ -2961,11 +2960,6 @@ dependencies = [ "cow-contract-baoswaprouter", "cow-contract-chainalysisoracle", "cow-contract-counter", - "cow-contract-cowamm", - "cow-contract-cowammconstantproductfactory", - "cow-contract-cowammfactorygetter", - "cow-contract-cowammlegacyhelper", - "cow-contract-cowammuniswapv2priceoracle", "cow-contract-cowprotocoltoken", "cow-contract-cowswapethflow", "cow-contract-cowswaponchainorders", @@ -3104,34 +3098,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "cow-amm" -version = "0.1.0" -dependencies = [ - "alloy-contract", - "alloy-primitives", - "alloy-provider", - "alloy-rpc-types", - "alloy-sol-types", - "anyhow", - "app-data", - "async-trait", - "const-hex", - "contracts", - "database", - "ethrpc", - "event-indexing", - "futures", - "model", - "observe", - "prometheus", - "prometheus-metric-storage", - "signature-validator", - "sqlx", - "tokio", - "tracing", -] - [[package]] name = "cow-contract-anyoneauthenticator" version = "0.1.0" @@ -3429,61 +3395,6 @@ dependencies = [ "anyhow", ] -[[package]] -name = "cow-contract-cowamm" -version = "0.1.0" -dependencies = [ - "alloy-contract", - "alloy-primitives", - "alloy-provider", - "alloy-sol-types", - "anyhow", -] - -[[package]] -name = "cow-contract-cowammconstantproductfactory" -version = "0.1.0" -dependencies = [ - "alloy-contract", - "alloy-primitives", - "alloy-provider", - "alloy-sol-types", - "anyhow", -] - -[[package]] -name = "cow-contract-cowammfactorygetter" -version = "0.1.0" -dependencies = [ - "alloy-contract", - "alloy-primitives", - "alloy-provider", - "alloy-sol-types", - "anyhow", -] - -[[package]] -name = "cow-contract-cowammlegacyhelper" -version = "0.1.0" -dependencies = [ - "alloy-contract", - "alloy-primitives", - "alloy-provider", - "alloy-sol-types", - "anyhow", -] - -[[package]] -name = "cow-contract-cowammuniswapv2priceoracle" -version = "0.1.0" -dependencies = [ - "alloy-contract", - "alloy-primitives", - "alloy-provider", - "alloy-sol-types", - "anyhow", -] - [[package]] name = "cow-contract-cowprotocoltoken" version = "0.1.0" @@ -4467,7 +4378,6 @@ dependencies = [ "configs", "const-hex", "contracts", - "cow-amm", "dashmap 6.1.0", "derive_more 1.0.0", "eth-domain-types", @@ -4547,7 +4457,6 @@ dependencies = [ "configs", "const-hex", "contracts", - "cow-amm", "database", "driver", "eth-domain-types", diff --git a/Cargo.toml b/Cargo.toml index 04bff7d79b..ff7fe2feb0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -54,7 +54,6 @@ console-subscriber = "0.3.0" const_format = "0.2.32" const-hex = "1.17.0" contracts = { path = "contracts/generated/contracts-facade" } -cow-amm = { path = "crates/cow-amm" } dashmap = "6.1.0" database = { path = "crates/database" } derive_more = { version = "1.0.0", features = ["full"] } diff --git a/contracts/artifacts/CowAmm.json b/contracts/artifacts/CowAmm.json deleted file mode 100644 index eed411938a..0000000000 --- a/contracts/artifacts/CowAmm.json +++ /dev/null @@ -1,1502 +0,0 @@ -{ - "abi": [ - { - "type": "constructor", - "inputs": [ - { - "name": "_solutionSettler", - "type": "address", - "internalType": "contract ISettlement" - }, - { - "name": "_token0", - "type": "address", - "internalType": "contract IERC20" - }, - { - "name": "_token1", - "type": "address", - "internalType": "contract IERC20" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "event", - "name": "TradingDisabled", - "inputs": [], - "anonymous": false - }, - { - "type": "event", - "name": "TradingEnabled", - "inputs": [ - { - "name": "hash", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "params", - "type": "tuple", - "indexed": false, - "internalType": "struct ConstantProduct.TradingParams", - "components": [ - { - "name": "minTradedToken0", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "priceOracle", - "type": "address", - "internalType": "contract IPriceOracle" - }, - { - "name": "priceOracleData", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "appData", - "type": "bytes32", - "internalType": "bytes32" - } - ] - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "CommitOutsideOfSettlement", - "inputs": [] - }, - { - "type": "error", - "name": "OnlyManagerCanCall", - "inputs": [] - }, - { - "type": "error", - "name": "OrderDoesNotMatchCommitmentHash", - "inputs": [] - }, - { - "type": "error", - "name": "OrderDoesNotMatchDefaultTradeableOrder", - "inputs": [] - }, - { - "type": "error", - "name": "OrderDoesNotMatchMessageHash", - "inputs": [] - }, - { - "type": "error", - "name": "OrderNotValid", - "inputs": [ - { - "name": "", - "type": "string", - "internalType": "string" - } - ] - }, - { - "type": "error", - "name": "PollTryAtBlock", - "inputs": [ - { - "name": "blockNumber", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "message", - "type": "string", - "internalType": "string" - } - ] - }, - { - "type": "error", - "name": "TradingParamsDoNotMatchHash", - "inputs": [] - }, - { - "type": "function", - "name": "commit", - "inputs": [ - { - "name": "orderHash", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "hash", - "inputs": [ - { - "name": "tradingParams", - "type": "tuple", - "internalType": "struct ConstantProduct.TradingParams", - "components": [ - { - "name": "minTradedToken0", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "priceOracle", - "type": "address", - "internalType": "contract IPriceOracle" - }, - { - "name": "priceOracleData", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "appData", - "type": "bytes32", - "internalType": "bytes32" - } - ] - } - ], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "isValidSignature", - "inputs": [ - { - "name": "_hash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "signature", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes4", - "internalType": "bytes4" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "manager", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "token0", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "contract IERC20" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "token1", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "contract IERC20" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "verify", - "inputs": [ - { - "name": "tradingParams", - "type": "tuple", - "internalType": "struct ConstantProduct.TradingParams", - "components": [ - { - "name": "minTradedToken0", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "priceOracle", - "type": "address", - "internalType": "contract IPriceOracle" - }, - { - "name": "priceOracleData", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "appData", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "name": "order", - "type": "tuple", - "internalType": "struct GPv2Order.Data", - "components": [ - { - "name": "sellToken", - "type": "address", - "internalType": "contract IERC20" - }, - { - "name": "buyToken", - "type": "address", - "internalType": "contract IERC20" - }, - { - "name": "receiver", - "type": "address", - "internalType": "address" - }, - { - "name": "sellAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "buyAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "validTo", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "appData", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "feeAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "kind", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "partiallyFillable", - "type": "bool", - "internalType": "bool" - }, - { - "name": "sellTokenBalance", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "buyTokenBalance", - "type": "bytes32", - "internalType": "bytes32" - } - ] - } - ], - "outputs": [], - "stateMutability": "view" - } - ], - "bytecode": "0x610120604052348015610010575f80fd5b5060405161267838038061267883398101604081905261002f9161052f565b6001600160a01b03831660808190526040805163f698da2560e01b8152905163f698da259160048082019260209290919082900301815f875af1158015610078573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061009c9190610579565b610100526100aa823361015f565b6100b4813361015f565b336001600160a01b031660e0816001600160a01b0316815250505f836001600160a01b0316639b552cc26040518163ffffffff1660e01b81526004016020604051808303815f875af115801561010c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101309190610590565b905061013c838261015f565b610146828261015f565b506001600160a01b0391821660a0521660c0525061061c565b6101746001600160a01b038316825f19610178565b5050565b8015806101f05750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156101ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ee9190610579565b155b6102675760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084015b60405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526102bd9185916102c216565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201525f9061030e906001600160a01b03851690849061038d565b905080515f148061032e57508080602001905181019061032e91906105b2565b6102bd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161025e565b606061039b84845f856103a3565b949350505050565b6060824710156104045760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161025e565b5f80866001600160a01b0316858760405161041f91906105d1565b5f6040518083038185875af1925050503d805f8114610459576040519150601f19603f3d011682016040523d82523d5f602084013e61045e565b606091505b5090925090506104708783838761047b565b979650505050505050565b606083156104e95782515f036104e2576001600160a01b0385163b6104e25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161025e565b508161039b565b61039b83838151156104fe5781518083602001fd5b8060405162461bcd60e51b815260040161025e91906105e7565b6001600160a01b038116811461052c575f80fd5b50565b5f805f60608486031215610541575f80fd5b835161054c81610518565b602085015190935061055d81610518565b604085015190925061056e81610518565b809150509250925092565b5f60208284031215610589575f80fd5b5051919050565b5f602082840312156105a0575f80fd5b81516105ab81610518565b9392505050565b5f602082840312156105c2575f80fd5b815180151581146105ab575f80fd5b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051611fbd6106bb5f395f81816102db015261042b01525f8181610236015281816104d90152610bf901525f81816102b40152818161059901528181610d5c01528181610ebf01528181610f8e015261100d01525f81816101380152818161057701528181610d3b01528181610e2801528181610f6b015261103001525f818161032201526112140152611fbd5ff3fe608060405234801561000f575f80fd5b506004361061012f575f3560e01c8063b09aaaca116100ad578063e3e6f5b21161007d578063eec50b9711610063578063eec50b9714610344578063f14fcbc81461034c578063ff2dbc9814610203575f80fd5b8063e3e6f5b2146102fd578063e516715b1461031d575f80fd5b8063b09aaaca14610289578063c5f3d2541461029c578063d21220a7146102af578063d25e0cb6146102d6575f80fd5b80631c7de94111610102578063481c6a75116100e8578063481c6a7514610231578063981a160b14610258578063a029a8d414610276575f80fd5b80631c7de941146102035780633e706e321461020a575f80fd5b80630dfe1681146101335780631303a484146101845780631626ba7e146101b557806317700f01146101f9575b5f80fd5b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b7f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b5935c5b60405190815260200161017b565b6101c86101c33660046116bf565b61035f565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161017b565b6102016104d7565b005b6101a75f81565b6101a77f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b59381565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b61026161012c81565b60405163ffffffff909116815260200161017b565b6102016102843660046119ee565b610573565b6101a7610297366004611a3b565b610bc8565b6102016102aa366004611a75565b610bf7565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b6101a77f000000000000000000000000000000000000000000000000000000000000000081565b61031061030b366004611a3b565b610cb7565b60405161017b9190611aac565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b6101a75f5481565b61020161035a366004611b9a565b6111fc565b5f808061036e84860186611bb1565b915091505f5461037d82610bc8565b146103b4576040517ff1a6789000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0820180517fd5a25ba2e97094ad7d83dc28a6572da797d6b3e7fc6663bd93efb789fc17e48982526101a0822091526040517f190100000000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006002820152602281019190915260429020868114610494576040517f593fcacd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f818385611291565b6104a98284610573565b507f1626ba7e00000000000000000000000000000000000000000000000000000000925050505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610546576040517ff87d0d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080556040517fbcb8b8fbdea8aa6dc4ae41213e4da81e605a3d1a56ed851b9355182321c091909190a1565b80517f0000000000000000000000000000000000000000000000000000000000000000907f00000000000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff808416911614610677578073ffffffffffffffffffffffffffffffffffffffff16835f015173ffffffffffffffffffffffffffffffffffffffff1614610675576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c69642073656c6c20746f6b656e000000000000000000000000000060448201526064015b60405180910390fd5b905b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190611bff565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091505f9073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015610772573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107969190611bff565b90508273ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff1614610831576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f696e76616c69642062757920746f6b656e000000000000000000000000000000604482015260640161066c565b604085015173ffffffffffffffffffffffffffffffffffffffff16156108b3576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7265636569766572206d757374206265207a65726f2061646472657373000000604482015260640161066c565b6108bf61012c42611c43565b8560a0015163ffffffff161115610932576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f76616c696469747920746f6f2066617220696e20746865206675747572650000604482015260640161066c565b85606001518560c00151146109a3576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c696420617070446174610000000000000000000000000000000000604482015260640161066c565b60e085015115610a0f576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f66656520616d6f756e74206d757374206265207a65726f000000000000000000604482015260640161066c565b7f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc985610160015114610a9d576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f627579546f6b656e42616c616e6365206d757374206265206572633230000000604482015260640161066c565b7f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc985610140015114610b2b576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f73656c6c546f6b656e42616c616e6365206d7573742062652065726332300000604482015260640161066c565b6060850151610b3a9082611c56565b60808601516060870151610b4e9085611c6d565b610b589190611c56565b1015610bc0576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f726563656976656420616d6f756e7420746f6f206c6f77000000000000000000604482015260640161066c565b505050505050565b5f81604051602001610bda9190611ccc565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610c66576040517ff87d0d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610c7361029783611d27565b9050805f81905550807f510e4a4f76907c2d6158b343f7c4f2f597df385b727c26e9ef90e75093ace19a83604051610cab9190611d79565b60405180910390a25050565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608101919091525f80836020015173ffffffffffffffffffffffffffffffffffffffff1663355efdd97f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000087604001516040518463ffffffff1660e01b8152600401610d9e93929190611e3a565b6040805180830381865afa158015610db8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddc9190611e72565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291935091505f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610e6d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e919190611bff565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610f19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f3d9190611bff565b90925090505f80808080610f518888611c56565b90505f610f5e8a88611c56565b90505f8282101561100b577f000000000000000000000000000000000000000000000000000000000000000096507f00000000000000000000000000000000000000000000000000000000000000009550610fd6610fbd60028b611ec1565b610fd184610fcc8e6002611c56565b611346565b61137e565b945061100185610fe6818d611c56565b610ff09085611c43565b610ffa8c8f611c56565b60016113cb565b9350849050611098565b7f000000000000000000000000000000000000000000000000000000000000000096507f0000000000000000000000000000000000000000000000000000000000000000955061106e61105f60028a611ec1565b610fd185610fcc8f6002611c56565b94506110928561107e818e611c56565b6110889086611c43565b610ffa8b8e611c56565b93508390505b8c518110156110df576110df6040518060400160405280601781526020017f74726164656420616d6f756e7420746f6f20736d616c6c000000000000000000815250611426565b6040518061018001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200161115661012c611466565b63ffffffff1681526020018e6060015181526020015f81526020017ff3b277728b3fee749481eb3e0b3b48980dbbab78658fc419025cb16eee34677581526020016001151581526020017f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc981526020017f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc98152509b505050505050505050505050919050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461126b576040517fbf84897700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b807f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b5935d50565b7f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b5935c8381146113405780156112f2576040517fdafbdd1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6112fc84610cb7565b90506113088382611487565b61133e576040517fd9ff24c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b50505050565b5f82156113735781611359600185611c6d565b6113639190611ec1565b61136e906001611c43565b611375565b5f5b90505b92915050565b5f818310156113c5576113c56040518060400160405280601581526020017f7375627472616374696f6e20756e646572666c6f770000000000000000000000815250611426565b50900390565b5f806113d8868686611599565b905060018360028111156113ee576113ee611ed4565b14801561140a57505f848061140557611405611e94565b868809115b1561141d5761141a600182611c43565b90505b95945050505050565b611431436001611c43565b816040517f1fe8506e00000000000000000000000000000000000000000000000000000000815260040161066c929190611f01565b5f81806114738142611f19565b61147d9190611f3b565b6113789190611f63565b5f80825f015173ffffffffffffffffffffffffffffffffffffffff16845f015173ffffffffffffffffffffffffffffffffffffffff161490505f836020015173ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff161490505f846060015186606001511490505f856080015187608001511490505f8660a0015163ffffffff168860a0015163ffffffff161490505f8761010001518961010001511490505f88610120015115158a6101200151151514905086801561155e5750855b80156115675750845b80156115705750835b80156115795750825b80156115825750815b801561158b5750805b9a9950505050505050505050565b5f80807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709858702925082811083820303915050805f036115ef578382816115e5576115e5611e94565b04925050506104d0565b808411611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f770000000000000000000000604482015260640161066c565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f805f604084860312156116d1575f80fd5b83359250602084013567ffffffffffffffff808211156116ef575f80fd5b818601915086601f830112611702575f80fd5b813581811115611710575f80fd5b876020828501011115611721575f80fd5b6020830194508093505050509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff8111828210171561178457611784611734565b60405290565b604051610180810167ffffffffffffffff8111828210171561178457611784611734565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156117f5576117f5611734565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461181e575f80fd5b50565b5f60808284031215611831575f80fd5b611839611761565b90508135815260208083013561184e816117fd565b82820152604083013567ffffffffffffffff8082111561186c575f80fd5b818501915085601f83011261187f575f80fd5b81358181111561189157611891611734565b6118c1847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016117ae565b915080825286848285010111156118d6575f80fd5b80848401858401375f848284010152508060408501525050506060820135606082015292915050565b803561190a816117fd565b919050565b803563ffffffff8116811461190a575f80fd5b8035801515811461190a575f80fd5b5f6101808284031215611942575f80fd5b61194a61178a565b9050611955826118ff565b8152611963602083016118ff565b6020820152611974604083016118ff565b6040820152606082013560608201526080820135608082015261199960a0830161190f565b60a082015260c082013560c082015260e082013560e08201526101008083013581830152506101206119cc818401611922565b9082015261014082810135908201526101609182013591810191909152919050565b5f806101a08385031215611a00575f80fd5b823567ffffffffffffffff811115611a16575f80fd5b611a2285828601611821565b925050611a328460208501611931565b90509250929050565b5f60208284031215611a4b575f80fd5b813567ffffffffffffffff811115611a61575f80fd5b611a6d84828501611821565b949350505050565b5f60208284031215611a85575f80fd5b813567ffffffffffffffff811115611a9b575f80fd5b8201608081850312156104d0575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff16815261018081016020830151611af2602084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040830151611b1a604084018273ffffffffffffffffffffffffffffffffffffffff169052565b50606083015160608301526080830151608083015260a0830151611b4660a084018263ffffffff169052565b5060c083015160c083015260e083015160e083015261010080840151818401525061012080840151611b7b8285018215159052565b5050610140838101519083015261016092830151929091019190915290565b5f60208284031215611baa575f80fd5b5035919050565b5f806101a08385031215611bc3575f80fd5b611bcd8484611931565b915061018083013567ffffffffffffffff811115611be9575f80fd5b611bf585828601611821565b9150509250929050565b5f60208284031215611c0f575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561137857611378611c16565b808202811582820484141761137857611378611c16565b8181038181111561137857611378611c16565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081528151602082015273ffffffffffffffffffffffffffffffffffffffff60208301511660408201525f604083015160806060840152611d1160a0840182611c80565b9050606084015160808401528091505092915050565b5f6113783683611821565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60208152813560208201525f6020830135611d93816117fd565b73ffffffffffffffffffffffffffffffffffffffff811660408401525060408301357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611de4575f80fd5b830160208101903567ffffffffffffffff811115611e00575f80fd5b803603821315611e0e575f80fd5b60806060850152611e2360a085018284611d32565b915050606084013560808401528091505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff80861683528085166020840152506060604083015261141d6060830184611c80565b5f8060408385031215611e83575f80fd5b505080516020909101519092909150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82611ecf57611ecf611e94565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b828152604060208201525f611a6d6040830184611c80565b5f63ffffffff80841680611f2f57611f2f611e94565b92169190910492915050565b63ffffffff818116838216028082169190828114611f5b57611f5b611c16565b505092915050565b63ffffffff818116838216019080821115611f8057611f80611c16565b509291505056fea2646970667358221220e3fb228b525d90b942c7e58fe2e2034a17bd258c082fd47740e764a7be45bac664736f6c63430008190033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061012f575f3560e01c8063b09aaaca116100ad578063e3e6f5b21161007d578063eec50b9711610063578063eec50b9714610344578063f14fcbc81461034c578063ff2dbc9814610203575f80fd5b8063e3e6f5b2146102fd578063e516715b1461031d575f80fd5b8063b09aaaca14610289578063c5f3d2541461029c578063d21220a7146102af578063d25e0cb6146102d6575f80fd5b80631c7de94111610102578063481c6a75116100e8578063481c6a7514610231578063981a160b14610258578063a029a8d414610276575f80fd5b80631c7de941146102035780633e706e321461020a575f80fd5b80630dfe1681146101335780631303a484146101845780631626ba7e146101b557806317700f01146101f9575b5f80fd5b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b7f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b5935c5b60405190815260200161017b565b6101c86101c33660046116bf565b61035f565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161017b565b6102016104d7565b005b6101a75f81565b6101a77f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b59381565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b61026161012c81565b60405163ffffffff909116815260200161017b565b6102016102843660046119ee565b610573565b6101a7610297366004611a3b565b610bc8565b6102016102aa366004611a75565b610bf7565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b6101a77f000000000000000000000000000000000000000000000000000000000000000081565b61031061030b366004611a3b565b610cb7565b60405161017b9190611aac565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b6101a75f5481565b61020161035a366004611b9a565b6111fc565b5f808061036e84860186611bb1565b915091505f5461037d82610bc8565b146103b4576040517ff1a6789000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0820180517fd5a25ba2e97094ad7d83dc28a6572da797d6b3e7fc6663bd93efb789fc17e48982526101a0822091526040517f190100000000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006002820152602281019190915260429020868114610494576040517f593fcacd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f818385611291565b6104a98284610573565b507f1626ba7e00000000000000000000000000000000000000000000000000000000925050505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610546576040517ff87d0d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080556040517fbcb8b8fbdea8aa6dc4ae41213e4da81e605a3d1a56ed851b9355182321c091909190a1565b80517f0000000000000000000000000000000000000000000000000000000000000000907f00000000000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff808416911614610677578073ffffffffffffffffffffffffffffffffffffffff16835f015173ffffffffffffffffffffffffffffffffffffffff1614610675576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c69642073656c6c20746f6b656e000000000000000000000000000060448201526064015b60405180910390fd5b905b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190611bff565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091505f9073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015610772573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107969190611bff565b90508273ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff1614610831576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f696e76616c69642062757920746f6b656e000000000000000000000000000000604482015260640161066c565b604085015173ffffffffffffffffffffffffffffffffffffffff16156108b3576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7265636569766572206d757374206265207a65726f2061646472657373000000604482015260640161066c565b6108bf61012c42611c43565b8560a0015163ffffffff161115610932576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f76616c696469747920746f6f2066617220696e20746865206675747572650000604482015260640161066c565b85606001518560c00151146109a3576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c696420617070446174610000000000000000000000000000000000604482015260640161066c565b60e085015115610a0f576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f66656520616d6f756e74206d757374206265207a65726f000000000000000000604482015260640161066c565b7f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc985610160015114610a9d576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f627579546f6b656e42616c616e6365206d757374206265206572633230000000604482015260640161066c565b7f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc985610140015114610b2b576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f73656c6c546f6b656e42616c616e6365206d7573742062652065726332300000604482015260640161066c565b6060850151610b3a9082611c56565b60808601516060870151610b4e9085611c6d565b610b589190611c56565b1015610bc0576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f726563656976656420616d6f756e7420746f6f206c6f77000000000000000000604482015260640161066c565b505050505050565b5f81604051602001610bda9190611ccc565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610c66576040517ff87d0d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610c7361029783611d27565b9050805f81905550807f510e4a4f76907c2d6158b343f7c4f2f597df385b727c26e9ef90e75093ace19a83604051610cab9190611d79565b60405180910390a25050565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608101919091525f80836020015173ffffffffffffffffffffffffffffffffffffffff1663355efdd97f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000087604001516040518463ffffffff1660e01b8152600401610d9e93929190611e3a565b6040805180830381865afa158015610db8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddc9190611e72565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291935091505f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610e6d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e919190611bff565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610f19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f3d9190611bff565b90925090505f80808080610f518888611c56565b90505f610f5e8a88611c56565b90505f8282101561100b577f000000000000000000000000000000000000000000000000000000000000000096507f00000000000000000000000000000000000000000000000000000000000000009550610fd6610fbd60028b611ec1565b610fd184610fcc8e6002611c56565b611346565b61137e565b945061100185610fe6818d611c56565b610ff09085611c43565b610ffa8c8f611c56565b60016113cb565b9350849050611098565b7f000000000000000000000000000000000000000000000000000000000000000096507f0000000000000000000000000000000000000000000000000000000000000000955061106e61105f60028a611ec1565b610fd185610fcc8f6002611c56565b94506110928561107e818e611c56565b6110889086611c43565b610ffa8b8e611c56565b93508390505b8c518110156110df576110df6040518060400160405280601781526020017f74726164656420616d6f756e7420746f6f20736d616c6c000000000000000000815250611426565b6040518061018001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200161115661012c611466565b63ffffffff1681526020018e6060015181526020015f81526020017ff3b277728b3fee749481eb3e0b3b48980dbbab78658fc419025cb16eee34677581526020016001151581526020017f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc981526020017f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc98152509b505050505050505050505050919050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461126b576040517fbf84897700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b807f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b5935d50565b7f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b5935c8381146113405780156112f2576040517fdafbdd1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6112fc84610cb7565b90506113088382611487565b61133e576040517fd9ff24c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b50505050565b5f82156113735781611359600185611c6d565b6113639190611ec1565b61136e906001611c43565b611375565b5f5b90505b92915050565b5f818310156113c5576113c56040518060400160405280601581526020017f7375627472616374696f6e20756e646572666c6f770000000000000000000000815250611426565b50900390565b5f806113d8868686611599565b905060018360028111156113ee576113ee611ed4565b14801561140a57505f848061140557611405611e94565b868809115b1561141d5761141a600182611c43565b90505b95945050505050565b611431436001611c43565b816040517f1fe8506e00000000000000000000000000000000000000000000000000000000815260040161066c929190611f01565b5f81806114738142611f19565b61147d9190611f3b565b6113789190611f63565b5f80825f015173ffffffffffffffffffffffffffffffffffffffff16845f015173ffffffffffffffffffffffffffffffffffffffff161490505f836020015173ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff161490505f846060015186606001511490505f856080015187608001511490505f8660a0015163ffffffff168860a0015163ffffffff161490505f8761010001518961010001511490505f88610120015115158a6101200151151514905086801561155e5750855b80156115675750845b80156115705750835b80156115795750825b80156115825750815b801561158b5750805b9a9950505050505050505050565b5f80807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709858702925082811083820303915050805f036115ef578382816115e5576115e5611e94565b04925050506104d0565b808411611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f770000000000000000000000604482015260640161066c565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f805f604084860312156116d1575f80fd5b83359250602084013567ffffffffffffffff808211156116ef575f80fd5b818601915086601f830112611702575f80fd5b813581811115611710575f80fd5b876020828501011115611721575f80fd5b6020830194508093505050509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff8111828210171561178457611784611734565b60405290565b604051610180810167ffffffffffffffff8111828210171561178457611784611734565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156117f5576117f5611734565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461181e575f80fd5b50565b5f60808284031215611831575f80fd5b611839611761565b90508135815260208083013561184e816117fd565b82820152604083013567ffffffffffffffff8082111561186c575f80fd5b818501915085601f83011261187f575f80fd5b81358181111561189157611891611734565b6118c1847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016117ae565b915080825286848285010111156118d6575f80fd5b80848401858401375f848284010152508060408501525050506060820135606082015292915050565b803561190a816117fd565b919050565b803563ffffffff8116811461190a575f80fd5b8035801515811461190a575f80fd5b5f6101808284031215611942575f80fd5b61194a61178a565b9050611955826118ff565b8152611963602083016118ff565b6020820152611974604083016118ff565b6040820152606082013560608201526080820135608082015261199960a0830161190f565b60a082015260c082013560c082015260e082013560e08201526101008083013581830152506101206119cc818401611922565b9082015261014082810135908201526101609182013591810191909152919050565b5f806101a08385031215611a00575f80fd5b823567ffffffffffffffff811115611a16575f80fd5b611a2285828601611821565b925050611a328460208501611931565b90509250929050565b5f60208284031215611a4b575f80fd5b813567ffffffffffffffff811115611a61575f80fd5b611a6d84828501611821565b949350505050565b5f60208284031215611a85575f80fd5b813567ffffffffffffffff811115611a9b575f80fd5b8201608081850312156104d0575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff16815261018081016020830151611af2602084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040830151611b1a604084018273ffffffffffffffffffffffffffffffffffffffff169052565b50606083015160608301526080830151608083015260a0830151611b4660a084018263ffffffff169052565b5060c083015160c083015260e083015160e083015261010080840151818401525061012080840151611b7b8285018215159052565b5050610140838101519083015261016092830151929091019190915290565b5f60208284031215611baa575f80fd5b5035919050565b5f806101a08385031215611bc3575f80fd5b611bcd8484611931565b915061018083013567ffffffffffffffff811115611be9575f80fd5b611bf585828601611821565b9150509250929050565b5f60208284031215611c0f575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561137857611378611c16565b808202811582820484141761137857611378611c16565b8181038181111561137857611378611c16565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081528151602082015273ffffffffffffffffffffffffffffffffffffffff60208301511660408201525f604083015160806060840152611d1160a0840182611c80565b9050606084015160808401528091505092915050565b5f6113783683611821565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60208152813560208201525f6020830135611d93816117fd565b73ffffffffffffffffffffffffffffffffffffffff811660408401525060408301357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611de4575f80fd5b830160208101903567ffffffffffffffff811115611e00575f80fd5b803603821315611e0e575f80fd5b60806060850152611e2360a085018284611d32565b915050606084013560808401528091505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff80861683528085166020840152506060604083015261141d6060830184611c80565b5f8060408385031215611e83575f80fd5b505080516020909101519092909150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82611ecf57611ecf611e94565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b828152604060208201525f611a6d6040830184611c80565b5f63ffffffff80841680611f2f57611f2f611e94565b92169190910492915050565b63ffffffff818116838216028082169190828114611f5b57611f5b611c16565b505092915050565b63ffffffff818116838216019080821115611f8057611f80611c16565b509291505056fea2646970667358221220e3fb228b525d90b942c7e58fe2e2034a17bd258c082fd47740e764a7be45bac664736f6c63430008190033", - "methodIdentifiers": { - "COMMITMENT_SLOT()": "3e706e32", - "EMPTY_COMMITMENT()": "ff2dbc98", - "MAX_ORDER_DURATION()": "981a160b", - "NO_TRADING()": "1c7de941", - "commit(bytes32)": "f14fcbc8", - "commitment()": "1303a484", - "disableTrading()": "17700f01", - "enableTrading((uint256,address,bytes,bytes32))": "c5f3d254", - "getTradeableOrder((uint256,address,bytes,bytes32))": "e3e6f5b2", - "hash((uint256,address,bytes,bytes32))": "b09aaaca", - "isValidSignature(bytes32,bytes)": "1626ba7e", - "manager()": "481c6a75", - "solutionSettler()": "e516715b", - "solutionSettlerDomainSeparator()": "d25e0cb6", - "token0()": "0dfe1681", - "token1()": "d21220a7", - "tradingParamsHash()": "eec50b97", - "verify((uint256,address,bytes,bytes32),(address,address,address,uint256,uint256,uint32,bytes32,uint256,bytes32,bool,bytes32,bytes32))": "a029a8d4" - }, - "rawMetadata": "{\"compiler\":{\"version\":\"0.8.25+commit.b61c2a91\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract ISettlement\",\"name\":\"_solutionSettler\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"_token0\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"_token1\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CommitOutsideOfSettlement\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyManagerCanCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OrderDoesNotMatchCommitmentHash\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OrderDoesNotMatchDefaultTradeableOrder\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OrderDoesNotMatchMessageHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"OrderNotValid\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"PollTryAtBlock\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TradingParamsDoNotMatchHash\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"TradingDisabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"minTradedToken0\",\"type\":\"uint256\"},{\"internalType\":\"contract IPriceOracle\",\"name\":\"priceOracle\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"priceOracleData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"appData\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"struct ConstantProduct.TradingParams\",\"name\":\"params\",\"type\":\"tuple\"}],\"name\":\"TradingEnabled\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"COMMITMENT_SLOT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EMPTY_COMMITMENT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_ORDER_DURATION\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NO_TRADING\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"orderHash\",\"type\":\"bytes32\"}],\"name\":\"commit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"commitment\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"value\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disableTrading\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"minTradedToken0\",\"type\":\"uint256\"},{\"internalType\":\"contract IPriceOracle\",\"name\":\"priceOracle\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"priceOracleData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"appData\",\"type\":\"bytes32\"}],\"internalType\":\"struct ConstantProduct.TradingParams\",\"name\":\"tradingParams\",\"type\":\"tuple\"}],\"name\":\"enableTrading\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"minTradedToken0\",\"type\":\"uint256\"},{\"internalType\":\"contract IPriceOracle\",\"name\":\"priceOracle\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"priceOracleData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"appData\",\"type\":\"bytes32\"}],\"internalType\":\"struct ConstantProduct.TradingParams\",\"name\":\"tradingParams\",\"type\":\"tuple\"}],\"name\":\"getTradeableOrder\",\"outputs\":[{\"components\":[{\"internalType\":\"contract IERC20\",\"name\":\"sellToken\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"buyToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"sellAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"buyAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"validTo\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"appData\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"feeAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"kind\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"partiallyFillable\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"sellTokenBalance\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"buyTokenBalance\",\"type\":\"bytes32\"}],\"internalType\":\"struct GPv2Order.Data\",\"name\":\"order\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"minTradedToken0\",\"type\":\"uint256\"},{\"internalType\":\"contract IPriceOracle\",\"name\":\"priceOracle\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"priceOracleData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"appData\",\"type\":\"bytes32\"}],\"internalType\":\"struct ConstantProduct.TradingParams\",\"name\":\"tradingParams\",\"type\":\"tuple\"}],\"name\":\"hash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"isValidSignature\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"manager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"solutionSettler\",\"outputs\":[{\"internalType\":\"contract ISettlement\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"solutionSettlerDomainSeparator\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token0\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token1\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tradingParamsHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"minTradedToken0\",\"type\":\"uint256\"},{\"internalType\":\"contract IPriceOracle\",\"name\":\"priceOracle\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"priceOracleData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"appData\",\"type\":\"bytes32\"}],\"internalType\":\"struct ConstantProduct.TradingParams\",\"name\":\"tradingParams\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"contract IERC20\",\"name\":\"sellToken\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"buyToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"sellAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"buyAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"validTo\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"appData\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"feeAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"kind\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"partiallyFillable\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"sellTokenBalance\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"buyTokenBalance\",\"type\":\"bytes32\"}],\"internalType\":\"struct GPv2Order.Data\",\"name\":\"order\",\"type\":\"tuple\"}],\"name\":\"verify\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"CoW Protocol Developers\",\"details\":\"Automated market maker based on the concept of function-maximising AMMs. It relies on the CoW Protocol infrastructure to guarantee batch execution of its orders. Order creation and execution is based on the Composable CoW base contracts.\",\"errors\":{\"OrderNotValid(string)\":[{\"details\":\"This error is returned by the `getTradeableOrder` function if the order condition is not met. A parameter of `string` type is included to allow the caller to specify the reason for the failure.\"}]},\"events\":{\"TradingEnabled(bytes32,(uint256,address,bytes,bytes32))\":{\"params\":{\"hash\":\"The hash of the trading parameters.\",\"params\":\"Trading has been enabled for these parameters.\"}}},\"kind\":\"dev\",\"methods\":{\"commit(bytes32)\":{\"details\":\"The commitment is used to enforce that exactly one AMM order is valid when a CoW Protocol batch is settled.\",\"params\":{\"orderHash\":\"the order hash that will be enforced by the order verification function.\"}},\"constructor\":{\"params\":{\"_solutionSettler\":\"The CoW Protocol contract used to settle user orders on the current chain.\",\"_token0\":\"The first of the two tokens traded by this AMM.\",\"_token1\":\"The second of the two tokens traded by this AMM.\"}},\"enableTrading((uint256,address,bytes,bytes32))\":{\"params\":{\"tradingParams\":\"Trading is enabled with the parameters specified here.\"}},\"getTradeableOrder((uint256,address,bytes,bytes32))\":{\"params\":{\"tradingParams\":\"the trading parameters of all discrete orders cut from this AMM\"},\"returns\":{\"order\":\"the tradeable order for submission to the CoW Protocol API\"}},\"hash((uint256,address,bytes,bytes32))\":{\"details\":\"Computes an identifier that uniquely represents the parameters in the function input parameters.\",\"params\":{\"tradingParams\":\"Bytestring that decodes to `TradingParams`\"},\"returns\":{\"_0\":\"The hash of the input parameter, intended to be used as a unique identifier\"}},\"isValidSignature(bytes32,bytes)\":{\"details\":\"Should return whether the signature provided is valid for the provided data\",\"params\":{\"hash\":\"Hash of the data to be signed\",\"signature\":\"Signature byte array associated with _data\"}},\"verify((uint256,address,bytes,bytes32),(address,address,address,uint256,uint256,uint32,bytes32,uint256,bytes32,bool,bytes32,bytes32))\":{\"params\":{\"order\":\"`GPv2Order.Data` of a discrete order to be verified.\",\"tradingParams\":\"the trading parameters of all discrete orders cut from this AMM\"}}},\"stateVariables\":{\"COMMITMENT_SLOT\":{\"details\":\"This value is: uint256(keccak256(\\\"CoWAMM.ConstantProduct.commitment\\\")) - 1\"}},\"title\":\"CoW AMM\",\"version\":1},\"userdoc\":{\"errors\":{\"CommitOutsideOfSettlement()\":[{\"notice\":\"The `commit` function can only be called inside a CoW Swap settlement. This error is thrown when the function is called from another context.\"}],\"OnlyManagerCanCall()\":[{\"notice\":\"This function is permissioned and can only be called by the contract's manager.\"}],\"OrderDoesNotMatchCommitmentHash()\":[{\"notice\":\"Error thrown when a solver tries to settle an AMM order on CoW Protocol whose hash doesn't match the one that has been committed to.\"}],\"OrderDoesNotMatchDefaultTradeableOrder()\":[{\"notice\":\"If an AMM order is settled and the AMM committment is set to empty, then that order must match the output of `getTradeableOrder`. This error is thrown when some of the parameters don't match the expected ones.\"}],\"OrderDoesNotMatchMessageHash()\":[{\"notice\":\"On signature verification, the hash of the order supplied as part of the signature does not match the provided message hash. This usually means that the verification function is being provided a signature that belongs to a different order.\"}],\"PollTryAtBlock(uint256,string)\":[{\"notice\":\"No order is currently available for trading, but the watchtower should try again at the specified block.\"}],\"TradingParamsDoNotMatchHash()\":[{\"notice\":\"The order trade parameters that were provided during signature verification does not match the data stored in this contract _or_ the AMM has not enabled trading.\"}]},\"events\":{\"TradingDisabled()\":{\"notice\":\"Emitted when the manager disables all trades by the AMM. Existing open order will not be tradeable. Note that the AMM could resume trading with different parameters at a later point.\"},\"TradingEnabled(bytes32,(uint256,address,bytes,bytes32))\":{\"notice\":\"Emitted when the manager enables the AMM to trade on CoW Protocol.\"}},\"kind\":\"user\",\"methods\":{\"COMMITMENT_SLOT()\":{\"notice\":\"The transient storage slot specified in this variable stores the value of the order commitment, that is, the only order hash that can be validated by calling `isValidSignature`. The hash corresponding to the constant `EMPTY_COMMITMENT` has special semantics, discussed in the related documentation.\"},\"EMPTY_COMMITMENT()\":{\"notice\":\"The value representing the absence of a commitment. It signifies that the AMM will enforce that the order matches the order obtained from calling `getTradeableOrder`.\"},\"MAX_ORDER_DURATION()\":{\"notice\":\"The largest possible duration of any AMM order, starting from the current block timestamp.\"},\"NO_TRADING()\":{\"notice\":\"The value representing that no trading parameters are currently accepted as valid by this contract, meaning that no trading can occur.\"},\"commit(bytes32)\":{\"notice\":\"Restricts a specific AMM to being able to trade only the order with the specified hash.\"},\"disableTrading()\":{\"notice\":\"Disable any form of trading on CoW Protocol by this AMM.\"},\"enableTrading((uint256,address,bytes,bytes32))\":{\"notice\":\"Once this function is called, it will be possible to trade with this AMM on CoW Protocol.\"},\"getTradeableOrder((uint256,address,bytes,bytes32))\":{\"notice\":\"The order returned by this function is the order that needs to be executed for the price on this AMM to match that of the reference pair.\"},\"manager()\":{\"notice\":\"The address that can execute administrative tasks on this AMM, as for example enabling/disabling trading or withdrawing funds.\"},\"solutionSettler()\":{\"notice\":\"The address of the CoW Protocol settlement contract. It is the only address that can set commitments.\"},\"solutionSettlerDomainSeparator()\":{\"notice\":\"The domain separator used for hashing CoW Protocol orders.\"},\"token0()\":{\"notice\":\"The first of the two tokens traded by this AMM.\"},\"token1()\":{\"notice\":\"The second of the two tokens traded by this AMM.\"},\"tradingParamsHash()\":{\"notice\":\"The hash of the data describing which `TradingParams` currently apply to this AMM. If this parameter is set to `NO_TRADING`, then the AMM does not accept any order as valid. If trading is enabled, then this value will be the [`hash`] of the only admissible [`TradingParams`].\"},\"verify((uint256,address,bytes,bytes32),(address,address,address,uint256,uint256,uint32,bytes32,uint256,bytes32,bool,bytes32,bytes32))\":{\"notice\":\"This function checks that the input order is admissible for the constant-product curve for the given trading parameters.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/ConstantProduct.sol\":\"ConstantProduct\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000},\"remappings\":[\":@openzeppelin/=lib/composable-cow/lib/@openzeppelin/\",\":@openzeppelin/contracts/=lib/composable-cow/lib/@openzeppelin/contracts/\",\":balancer/=lib/composable-cow/lib/balancer/src/\",\":canonical-weth/=lib/composable-cow/lib/canonical-weth/src/\",\":composable-cow/=lib/composable-cow/\",\":cowprotocol/=lib/composable-cow/lib/cowprotocol/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":helpers/=lib/composable-cow/lib/balancer/src/lib/helpers/\",\":math/=lib/composable-cow/lib/balancer/src/lib/math/\",\":murky/=lib/composable-cow/lib/murky/src/\",\":openzeppelin-contracts/=lib/composable-cow/lib/murky/lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin/\",\":safe/=lib/composable-cow/lib/safe/\",\":uniswap-v2-core/=lib/uniswap-v2-core/contracts/\",\"lib/composable-cow:@openzeppelin/=lib/openzeppelin/contracts/\",\"lib/composable-cow:@openzeppelin/contracts/=lib/openzeppelin/contracts/\",\"lib/composable-cow:cowprotocol/=lib/composable-cow/lib/cowprotocol/src/contracts/\",\"lib/composable-cow:safe/=lib/composable-cow/lib/safe/contracts/\"]},\"sources\":{\"lib/composable-cow/lib/cowprotocol/src/contracts/libraries/GPv2Interaction.sol\":{\"keccak256\":\"0xb950f05f76ac8044b82314ea5510941fdbc0f0e76e7f159023d435652b429528\",\"license\":\"LGPL-3.0-or-later\",\"urls\":[\"bzz-raw://c081155e1b18c060aaab781b4887744413efffdfc55ce190db45c321444f165f\",\"dweb:/ipfs/QmbK3Qu7ZgwBfx2Es5EQcvG6q2srkHjzfNK2ziQ4ojxLSF\"]},\"lib/composable-cow/lib/cowprotocol/src/contracts/libraries/GPv2Order.sol\":{\"keccak256\":\"0xffd0cc3de3209aa38045d57def570ccbde028a39a54b00c696dbe19f4f6d7f9f\",\"license\":\"LGPL-3.0-or-later\",\"urls\":[\"bzz-raw://5714a47cae551d3364bfc6a753d92822b29d277298e55942a2814ed1e2afd87d\",\"dweb:/ipfs/QmS2G8ftdhk11qoSYHX8twZK5vFArhcnVVe6gy5UGTvXmg\"]},\"lib/composable-cow/lib/safe/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0x779ed3893a8812e383670b755f65c7727e9343dadaa4d7a4aa7f4aa35d859fdb\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://bb2039e1459ace1e68761e873632fc339866332f9f5ecb7452a0bc3a3b847e89\",\"dweb:/ipfs/QmYXvDQXJnDkXFvsvKLyZXaAv4x42qvtbtmwHftP4RKX38\"]},\"lib/composable-cow/src/BaseConditionalOrder.sol\":{\"keccak256\":\"0x510558386b92b1d5961d8158ae6e3288a1d520c03123d109042a5ec3290b9588\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e071465250cbc11d946f422f4ff774d757291cac00f4c69fbac1d1e34cdae402\",\"dweb:/ipfs/QmUF2qNwJhvs3GeWmsWnL6y21eL6mb3QEW7EPYY7NZc25v\"]},\"lib/composable-cow/src/interfaces/IConditionalOrder.sol\":{\"keccak256\":\"0x52c9a2b5d5cc7345fe4b4c039af88c5621bc7c6059534cc7c76b77833aafae7b\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://1660e1510b82216e38b669f16b69f4a37b012b00655d0fc6794e4d77d2182699\",\"dweb:/ipfs/QmNiZ7rMT74sKT9d6SUEnKXiWjaYLL8nAzSdLBXBAzYNmZ\"]},\"lib/composable-cow/src/types/ConditionalOrdersUtilsLib.sol\":{\"keccak256\":\"0x38e4ce4fc58c018f510ee45d78ae49253e8aa70fdf559d83ebb6c838c6b47aae\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a38ccd5b8ce2895a77b7474b1ac36ebfccc975b3839f6d3bfef72700f8f6f777\",\"dweb:/ipfs/QmSfs5zZ4U14NkZYSqAFUBcuKGjyfMM5Dp2sbj14FmVYPf\"]},\"lib/openzeppelin/contracts/interfaces/IERC1271.sol\":{\"keccak256\":\"0x0705a4b1b86d7b0bd8432118f226ba139c44b9dcaba0a6eafba2dd7d0639c544\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c45b821ef9e882e57c256697a152e108f0f2ad6997609af8904cae99c9bd422e\",\"dweb:/ipfs/QmRKCJW6jjzR5UYZcLpGnhEJ75UVbH6EHkEa49sWx2SKng\"]},\"lib/openzeppelin/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0x6ebf1944ab804b8660eb6fc52f9fe84588cee01c2566a69023e59497e7d27f45\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2900536cdadec954ced8789a9d1ed4b5e640029e1424e91fd5b88026486f4d45\",\"dweb:/ipfs/QmUMUX7CuYoiHvFkhifqtXGaciw2wnm4t9sAoPzETZ3Gbq\"]},\"lib/openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bd39944e8fc06be6dbe2dd1d8449b5336e23c6a7ba3e8e9ae5ae0f37f35283f5\",\"dweb:/ipfs/QmPV3FGYjVwvKSgAXKUN3r9T9GwniZz83CxBpM7vyj2G53\"]},\"lib/openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"keccak256\":\"0xec63854014a5b4f2b3290ab9103a21bdf902a508d0f41a8573fea49e98bf571a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bc5b5dc12fbc4002f282eaa7a5f06d8310ed62c1c77c5770f6283e058454c39a\",\"dweb:/ipfs/Qme9rE2wS3yBuyJq9GgbmzbsBQsW2M2sVFqYYLw7bosGrv\"]},\"lib/openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0xabefac93435967b4d36a4fabcbdbb918d1f0b7ae3c3d85bc30923b326c927ed1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9d213d3befca47da33f6db0310826bcdb148299805c10d77175ecfe1d06a9a68\",\"dweb:/ipfs/QmRgCn6SP1hbBkExUADFuDo8xkT4UU47yjNF5FhCeRbQmS\"]},\"lib/openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2455248c8ddd9cc6a7af76a13973cddf222072427e7b0e2a7d1aff345145e931\",\"dweb:/ipfs/QmfYjnjRbWqYpuxurqveE6HtzsY1Xx323J428AKQgtBJZm\"]},\"lib/openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cc8841b3cd48ad125e2f46323c8bad3aa0e88e399ec62acb9e57efa7e7c8058c\",\"dweb:/ipfs/QmSqE4mXHA2BXW58deDbXE8MTcsL5JSKNDbm23sVQxRLPS\"]},\"src/ConstantProduct.sol\":{\"keccak256\":\"0x51571c926c65861736c96ca0396e4d806d7d04e32608ed8567f1deb86d85c115\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://6ac849b37d6791a1e4f52295720cb6771044c45b613f1308a438e5294ddff085\",\"dweb:/ipfs/QmeftQAdXrQcbL9oV3LaTENX65jjFnGk6zV1oPn4kGfqBf\"]},\"src/interfaces/IPriceOracle.sol\":{\"keccak256\":\"0xf954ab9dc44a0ce3612b65d803b59c3fe1f64803870328580c36802460c8c29e\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://7cef4a090daa870e3c8cfa5d6498efae96427d4fe4e1a2784d26c088eea920e2\",\"dweb:/ipfs/QmU56CEHqif11NaomtVBNqrBTsV6CPPvjfN88SCe7V1Uxu\"]},\"src/interfaces/ISettlement.sol\":{\"keccak256\":\"0x2d7d80f9b93937afe43cd481ed42741055110a24883f3aeda9a96009af638661\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://b4df5b8642906abbf703364abf9d494ab5009e3cd26cf984333d6ebcdec472cd\",\"dweb:/ipfs/QmWifdZWnqVYHEYR2VttRpJdya97AayMExaMmEaFVByKQq\"]},\"src/interfaces/IWatchtowerCustomErrors.sol\":{\"keccak256\":\"0x2dabcdecbfb1d6f50d7281797703afd9f30f580e9124b395f653a509b3c53611\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://8af90375b167d9a1b414c5524a0d5c06659848c6b7747ed3299861b723bce70a\",\"dweb:/ipfs/QmZxan4Ln1Yaau6nXRSXvkUiK4TYC1LUsSvhWsdCmNfnmQ\"]}},\"version\":1}", - "metadata": { - "compiler": { - "version": "0.8.25+commit.b61c2a91" - }, - "language": "Solidity", - "output": { - "abi": [ - { - "inputs": [ - { - "internalType": "contract ISettlement", - "name": "_solutionSettler", - "type": "address" - }, - { - "internalType": "contract IERC20", - "name": "_token0", - "type": "address" - }, - { - "internalType": "contract IERC20", - "name": "_token1", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "type": "error", - "name": "CommitOutsideOfSettlement" - }, - { - "inputs": [], - "type": "error", - "name": "OnlyManagerCanCall" - }, - { - "inputs": [], - "type": "error", - "name": "OrderDoesNotMatchCommitmentHash" - }, - { - "inputs": [], - "type": "error", - "name": "OrderDoesNotMatchDefaultTradeableOrder" - }, - { - "inputs": [], - "type": "error", - "name": "OrderDoesNotMatchMessageHash" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "type": "error", - "name": "OrderNotValid" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "string", - "name": "message", - "type": "string" - } - ], - "type": "error", - "name": "PollTryAtBlock" - }, - { - "inputs": [], - "type": "error", - "name": "TradingParamsDoNotMatchHash" - }, - { - "inputs": [], - "type": "event", - "name": "TradingDisabled", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "hash", - "type": "bytes32", - "indexed": true - }, - { - "internalType": "struct ConstantProduct.TradingParams", - "name": "params", - "type": "tuple", - "components": [ - { - "internalType": "uint256", - "name": "minTradedToken0", - "type": "uint256" - }, - { - "internalType": "contract IPriceOracle", - "name": "priceOracle", - "type": "address" - }, - { - "internalType": "bytes", - "name": "priceOracleData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "appData", - "type": "bytes32" - } - ], - "indexed": false - } - ], - "type": "event", - "name": "TradingEnabled", - "anonymous": false - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "COMMITMENT_SLOT", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "EMPTY_COMMITMENT", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "MAX_ORDER_DURATION", - "outputs": [ - { - "internalType": "uint32", - "name": "", - "type": "uint32" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "NO_TRADING", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ] - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "orderHash", - "type": "bytes32" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "commit" - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "commitment", - "outputs": [ - { - "internalType": "bytes32", - "name": "value", - "type": "bytes32" - } - ] - }, - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "function", - "name": "disableTrading" - }, - { - "inputs": [ - { - "internalType": "struct ConstantProduct.TradingParams", - "name": "tradingParams", - "type": "tuple", - "components": [ - { - "internalType": "uint256", - "name": "minTradedToken0", - "type": "uint256" - }, - { - "internalType": "contract IPriceOracle", - "name": "priceOracle", - "type": "address" - }, - { - "internalType": "bytes", - "name": "priceOracleData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "appData", - "type": "bytes32" - } - ] - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "enableTrading" - }, - { - "inputs": [ - { - "internalType": "struct ConstantProduct.TradingParams", - "name": "tradingParams", - "type": "tuple", - "components": [ - { - "internalType": "uint256", - "name": "minTradedToken0", - "type": "uint256" - }, - { - "internalType": "contract IPriceOracle", - "name": "priceOracle", - "type": "address" - }, - { - "internalType": "bytes", - "name": "priceOracleData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "appData", - "type": "bytes32" - } - ] - } - ], - "stateMutability": "view", - "type": "function", - "name": "getTradeableOrder", - "outputs": [ - { - "internalType": "struct GPv2Order.Data", - "name": "order", - "type": "tuple", - "components": [ - { - "internalType": "contract IERC20", - "name": "sellToken", - "type": "address" - }, - { - "internalType": "contract IERC20", - "name": "buyToken", - "type": "address" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "uint256", - "name": "sellAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "buyAmount", - "type": "uint256" - }, - { - "internalType": "uint32", - "name": "validTo", - "type": "uint32" - }, - { - "internalType": "bytes32", - "name": "appData", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "feeAmount", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "kind", - "type": "bytes32" - }, - { - "internalType": "bool", - "name": "partiallyFillable", - "type": "bool" - }, - { - "internalType": "bytes32", - "name": "sellTokenBalance", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "buyTokenBalance", - "type": "bytes32" - } - ] - } - ] - }, - { - "inputs": [ - { - "internalType": "struct ConstantProduct.TradingParams", - "name": "tradingParams", - "type": "tuple", - "components": [ - { - "internalType": "uint256", - "name": "minTradedToken0", - "type": "uint256" - }, - { - "internalType": "contract IPriceOracle", - "name": "priceOracle", - "type": "address" - }, - { - "internalType": "bytes", - "name": "priceOracleData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "appData", - "type": "bytes32" - } - ] - } - ], - "stateMutability": "pure", - "type": "function", - "name": "hash", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ] - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_hash", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function", - "name": "isValidSignature", - "outputs": [ - { - "internalType": "bytes4", - "name": "", - "type": "bytes4" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "manager", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "solutionSettler", - "outputs": [ - { - "internalType": "contract ISettlement", - "name": "", - "type": "address" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "solutionSettlerDomainSeparator", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "token0", - "outputs": [ - { - "internalType": "contract IERC20", - "name": "", - "type": "address" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "token1", - "outputs": [ - { - "internalType": "contract IERC20", - "name": "", - "type": "address" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "tradingParamsHash", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ] - }, - { - "inputs": [ - { - "internalType": "struct ConstantProduct.TradingParams", - "name": "tradingParams", - "type": "tuple", - "components": [ - { - "internalType": "uint256", - "name": "minTradedToken0", - "type": "uint256" - }, - { - "internalType": "contract IPriceOracle", - "name": "priceOracle", - "type": "address" - }, - { - "internalType": "bytes", - "name": "priceOracleData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "appData", - "type": "bytes32" - } - ] - }, - { - "internalType": "struct GPv2Order.Data", - "name": "order", - "type": "tuple", - "components": [ - { - "internalType": "contract IERC20", - "name": "sellToken", - "type": "address" - }, - { - "internalType": "contract IERC20", - "name": "buyToken", - "type": "address" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "uint256", - "name": "sellAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "buyAmount", - "type": "uint256" - }, - { - "internalType": "uint32", - "name": "validTo", - "type": "uint32" - }, - { - "internalType": "bytes32", - "name": "appData", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "feeAmount", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "kind", - "type": "bytes32" - }, - { - "internalType": "bool", - "name": "partiallyFillable", - "type": "bool" - }, - { - "internalType": "bytes32", - "name": "sellTokenBalance", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "buyTokenBalance", - "type": "bytes32" - } - ] - } - ], - "stateMutability": "view", - "type": "function", - "name": "verify" - } - ], - "devdoc": { - "kind": "dev", - "methods": { - "commit(bytes32)": { - "details": "The commitment is used to enforce that exactly one AMM order is valid when a CoW Protocol batch is settled.", - "params": { - "orderHash": "the order hash that will be enforced by the order verification function." - } - }, - "constructor": { - "params": { - "_solutionSettler": "The CoW Protocol contract used to settle user orders on the current chain.", - "_token0": "The first of the two tokens traded by this AMM.", - "_token1": "The second of the two tokens traded by this AMM." - } - }, - "enableTrading((uint256,address,bytes,bytes32))": { - "params": { - "tradingParams": "Trading is enabled with the parameters specified here." - } - }, - "getTradeableOrder((uint256,address,bytes,bytes32))": { - "params": { - "tradingParams": "the trading parameters of all discrete orders cut from this AMM" - }, - "returns": { - "order": "the tradeable order for submission to the CoW Protocol API" - } - }, - "hash((uint256,address,bytes,bytes32))": { - "details": "Computes an identifier that uniquely represents the parameters in the function input parameters.", - "params": { - "tradingParams": "Bytestring that decodes to `TradingParams`" - }, - "returns": { - "_0": "The hash of the input parameter, intended to be used as a unique identifier" - } - }, - "isValidSignature(bytes32,bytes)": { - "details": "Should return whether the signature provided is valid for the provided data", - "params": { - "hash": "Hash of the data to be signed", - "signature": "Signature byte array associated with _data" - } - }, - "verify((uint256,address,bytes,bytes32),(address,address,address,uint256,uint256,uint32,bytes32,uint256,bytes32,bool,bytes32,bytes32))": { - "params": { - "order": "`GPv2Order.Data` of a discrete order to be verified.", - "tradingParams": "the trading parameters of all discrete orders cut from this AMM" - } - } - }, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "COMMITMENT_SLOT()": { - "notice": "The transient storage slot specified in this variable stores the value of the order commitment, that is, the only order hash that can be validated by calling `isValidSignature`. The hash corresponding to the constant `EMPTY_COMMITMENT` has special semantics, discussed in the related documentation." - }, - "EMPTY_COMMITMENT()": { - "notice": "The value representing the absence of a commitment. It signifies that the AMM will enforce that the order matches the order obtained from calling `getTradeableOrder`." - }, - "MAX_ORDER_DURATION()": { - "notice": "The largest possible duration of any AMM order, starting from the current block timestamp." - }, - "NO_TRADING()": { - "notice": "The value representing that no trading parameters are currently accepted as valid by this contract, meaning that no trading can occur." - }, - "commit(bytes32)": { - "notice": "Restricts a specific AMM to being able to trade only the order with the specified hash." - }, - "disableTrading()": { - "notice": "Disable any form of trading on CoW Protocol by this AMM." - }, - "enableTrading((uint256,address,bytes,bytes32))": { - "notice": "Once this function is called, it will be possible to trade with this AMM on CoW Protocol." - }, - "getTradeableOrder((uint256,address,bytes,bytes32))": { - "notice": "The order returned by this function is the order that needs to be executed for the price on this AMM to match that of the reference pair." - }, - "manager()": { - "notice": "The address that can execute administrative tasks on this AMM, as for example enabling/disabling trading or withdrawing funds." - }, - "solutionSettler()": { - "notice": "The address of the CoW Protocol settlement contract. It is the only address that can set commitments." - }, - "solutionSettlerDomainSeparator()": { - "notice": "The domain separator used for hashing CoW Protocol orders." - }, - "token0()": { - "notice": "The first of the two tokens traded by this AMM." - }, - "token1()": { - "notice": "The second of the two tokens traded by this AMM." - }, - "tradingParamsHash()": { - "notice": "The hash of the data describing which `TradingParams` currently apply to this AMM. If this parameter is set to `NO_TRADING`, then the AMM does not accept any order as valid. If trading is enabled, then this value will be the [`hash`] of the only admissible [`TradingParams`]." - }, - "verify((uint256,address,bytes,bytes32),(address,address,address,uint256,uint256,uint32,bytes32,uint256,bytes32,bool,bytes32,bytes32))": { - "notice": "This function checks that the input order is admissible for the constant-product curve for the given trading parameters." - } - }, - "version": 1 - } - }, - "settings": { - "remappings": [ - "@openzeppelin/=lib/composable-cow/lib/@openzeppelin/", - "@openzeppelin/contracts/=lib/composable-cow/lib/@openzeppelin/contracts/", - "balancer/=lib/composable-cow/lib/balancer/src/", - "canonical-weth/=lib/composable-cow/lib/canonical-weth/src/", - "composable-cow/=lib/composable-cow/", - "cowprotocol/=lib/composable-cow/lib/cowprotocol/", - "ds-test/=lib/forge-std/lib/ds-test/src/", - "erc4626-tests/=lib/openzeppelin/lib/erc4626-tests/", - "forge-std/=lib/forge-std/src/", - "helpers/=lib/composable-cow/lib/balancer/src/lib/helpers/", - "math/=lib/composable-cow/lib/balancer/src/lib/math/", - "murky/=lib/composable-cow/lib/murky/src/", - "openzeppelin-contracts/=lib/composable-cow/lib/murky/lib/openzeppelin-contracts/", - "openzeppelin/=lib/openzeppelin/", - "safe/=lib/composable-cow/lib/safe/", - "uniswap-v2-core/=lib/uniswap-v2-core/contracts/", - "lib/composable-cow:@openzeppelin/=lib/openzeppelin/contracts/", - "lib/composable-cow:@openzeppelin/contracts/=lib/openzeppelin/contracts/", - "lib/composable-cow:cowprotocol/=lib/composable-cow/lib/cowprotocol/src/contracts/", - "lib/composable-cow:safe/=lib/composable-cow/lib/safe/contracts/" - ], - "optimizer": { - "enabled": true, - "runs": 100000 - }, - "metadata": { - "bytecodeHash": "ipfs" - }, - "compilationTarget": { - "src/ConstantProduct.sol": "ConstantProduct" - }, - "evmVersion": "cancun", - "libraries": {} - }, - "sources": { - "lib/composable-cow/lib/cowprotocol/src/contracts/libraries/GPv2Interaction.sol": { - "keccak256": "0xb950f05f76ac8044b82314ea5510941fdbc0f0e76e7f159023d435652b429528", - "urls": [ - "bzz-raw://c081155e1b18c060aaab781b4887744413efffdfc55ce190db45c321444f165f", - "dweb:/ipfs/QmbK3Qu7ZgwBfx2Es5EQcvG6q2srkHjzfNK2ziQ4ojxLSF" - ], - "license": "LGPL-3.0-or-later" - }, - "lib/composable-cow/lib/cowprotocol/src/contracts/libraries/GPv2Order.sol": { - "keccak256": "0xffd0cc3de3209aa38045d57def570ccbde028a39a54b00c696dbe19f4f6d7f9f", - "urls": [ - "bzz-raw://5714a47cae551d3364bfc6a753d92822b29d277298e55942a2814ed1e2afd87d", - "dweb:/ipfs/QmS2G8ftdhk11qoSYHX8twZK5vFArhcnVVe6gy5UGTvXmg" - ], - "license": "LGPL-3.0-or-later" - }, - "lib/composable-cow/lib/safe/contracts/interfaces/IERC165.sol": { - "keccak256": "0x779ed3893a8812e383670b755f65c7727e9343dadaa4d7a4aa7f4aa35d859fdb", - "urls": [ - "bzz-raw://bb2039e1459ace1e68761e873632fc339866332f9f5ecb7452a0bc3a3b847e89", - "dweb:/ipfs/QmYXvDQXJnDkXFvsvKLyZXaAv4x42qvtbtmwHftP4RKX38" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/src/BaseConditionalOrder.sol": { - "keccak256": "0x510558386b92b1d5961d8158ae6e3288a1d520c03123d109042a5ec3290b9588", - "urls": [ - "bzz-raw://e071465250cbc11d946f422f4ff774d757291cac00f4c69fbac1d1e34cdae402", - "dweb:/ipfs/QmUF2qNwJhvs3GeWmsWnL6y21eL6mb3QEW7EPYY7NZc25v" - ], - "license": "MIT" - }, - "lib/composable-cow/src/interfaces/IConditionalOrder.sol": { - "keccak256": "0x52c9a2b5d5cc7345fe4b4c039af88c5621bc7c6059534cc7c76b77833aafae7b", - "urls": [ - "bzz-raw://1660e1510b82216e38b669f16b69f4a37b012b00655d0fc6794e4d77d2182699", - "dweb:/ipfs/QmNiZ7rMT74sKT9d6SUEnKXiWjaYLL8nAzSdLBXBAzYNmZ" - ], - "license": "GPL-3.0" - }, - "lib/composable-cow/src/types/ConditionalOrdersUtilsLib.sol": { - "keccak256": "0x38e4ce4fc58c018f510ee45d78ae49253e8aa70fdf559d83ebb6c838c6b47aae", - "urls": [ - "bzz-raw://a38ccd5b8ce2895a77b7474b1ac36ebfccc975b3839f6d3bfef72700f8f6f777", - "dweb:/ipfs/QmSfs5zZ4U14NkZYSqAFUBcuKGjyfMM5Dp2sbj14FmVYPf" - ], - "license": "MIT" - }, - "lib/openzeppelin/contracts/interfaces/IERC1271.sol": { - "keccak256": "0x0705a4b1b86d7b0bd8432118f226ba139c44b9dcaba0a6eafba2dd7d0639c544", - "urls": [ - "bzz-raw://c45b821ef9e882e57c256697a152e108f0f2ad6997609af8904cae99c9bd422e", - "dweb:/ipfs/QmRKCJW6jjzR5UYZcLpGnhEJ75UVbH6EHkEa49sWx2SKng" - ], - "license": "MIT" - }, - "lib/openzeppelin/contracts/interfaces/IERC20.sol": { - "keccak256": "0x6ebf1944ab804b8660eb6fc52f9fe84588cee01c2566a69023e59497e7d27f45", - "urls": [ - "bzz-raw://2900536cdadec954ced8789a9d1ed4b5e640029e1424e91fd5b88026486f4d45", - "dweb:/ipfs/QmUMUX7CuYoiHvFkhifqtXGaciw2wnm4t9sAoPzETZ3Gbq" - ], - "license": "MIT" - }, - "lib/openzeppelin/contracts/token/ERC20/IERC20.sol": { - "keccak256": "0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305", - "urls": [ - "bzz-raw://bd39944e8fc06be6dbe2dd1d8449b5336e23c6a7ba3e8e9ae5ae0f37f35283f5", - "dweb:/ipfs/QmPV3FGYjVwvKSgAXKUN3r9T9GwniZz83CxBpM7vyj2G53" - ], - "license": "MIT" - }, - "lib/openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": { - "keccak256": "0xec63854014a5b4f2b3290ab9103a21bdf902a508d0f41a8573fea49e98bf571a", - "urls": [ - "bzz-raw://bc5b5dc12fbc4002f282eaa7a5f06d8310ed62c1c77c5770f6283e058454c39a", - "dweb:/ipfs/Qme9rE2wS3yBuyJq9GgbmzbsBQsW2M2sVFqYYLw7bosGrv" - ], - "license": "MIT" - }, - "lib/openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { - "keccak256": "0xabefac93435967b4d36a4fabcbdbb918d1f0b7ae3c3d85bc30923b326c927ed1", - "urls": [ - "bzz-raw://9d213d3befca47da33f6db0310826bcdb148299805c10d77175ecfe1d06a9a68", - "dweb:/ipfs/QmRgCn6SP1hbBkExUADFuDo8xkT4UU47yjNF5FhCeRbQmS" - ], - "license": "MIT" - }, - "lib/openzeppelin/contracts/utils/Address.sol": { - "keccak256": "0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa", - "urls": [ - "bzz-raw://2455248c8ddd9cc6a7af76a13973cddf222072427e7b0e2a7d1aff345145e931", - "dweb:/ipfs/QmfYjnjRbWqYpuxurqveE6HtzsY1Xx323J428AKQgtBJZm" - ], - "license": "MIT" - }, - "lib/openzeppelin/contracts/utils/math/Math.sol": { - "keccak256": "0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3", - "urls": [ - "bzz-raw://cc8841b3cd48ad125e2f46323c8bad3aa0e88e399ec62acb9e57efa7e7c8058c", - "dweb:/ipfs/QmSqE4mXHA2BXW58deDbXE8MTcsL5JSKNDbm23sVQxRLPS" - ], - "license": "MIT" - }, - "src/ConstantProduct.sol": { - "keccak256": "0x51571c926c65861736c96ca0396e4d806d7d04e32608ed8567f1deb86d85c115", - "urls": [ - "bzz-raw://6ac849b37d6791a1e4f52295720cb6771044c45b613f1308a438e5294ddff085", - "dweb:/ipfs/QmeftQAdXrQcbL9oV3LaTENX65jjFnGk6zV1oPn4kGfqBf" - ], - "license": "GPL-3.0" - }, - "src/interfaces/IPriceOracle.sol": { - "keccak256": "0xf954ab9dc44a0ce3612b65d803b59c3fe1f64803870328580c36802460c8c29e", - "urls": [ - "bzz-raw://7cef4a090daa870e3c8cfa5d6498efae96427d4fe4e1a2784d26c088eea920e2", - "dweb:/ipfs/QmU56CEHqif11NaomtVBNqrBTsV6CPPvjfN88SCe7V1Uxu" - ], - "license": "GPL-3.0" - }, - "src/interfaces/ISettlement.sol": { - "keccak256": "0x2d7d80f9b93937afe43cd481ed42741055110a24883f3aeda9a96009af638661", - "urls": [ - "bzz-raw://b4df5b8642906abbf703364abf9d494ab5009e3cd26cf984333d6ebcdec472cd", - "dweb:/ipfs/QmWifdZWnqVYHEYR2VttRpJdya97AayMExaMmEaFVByKQq" - ], - "license": "GPL-3.0" - }, - "src/interfaces/IWatchtowerCustomErrors.sol": { - "keccak256": "0x2dabcdecbfb1d6f50d7281797703afd9f30f580e9124b395f653a509b3c53611", - "urls": [ - "bzz-raw://8af90375b167d9a1b414c5524a0d5c06659848c6b7747ed3299861b723bce70a", - "dweb:/ipfs/QmZxan4Ln1Yaau6nXRSXvkUiK4TYC1LUsSvhWsdCmNfnmQ" - ], - "license": "GPL-3.0" - } - }, - "version": 1 - }, - "id": 169, - "_disabled": [ - { - "type": "function", - "name": "COMMITMENT_SLOT", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "EMPTY_COMMITMENT", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "MAX_ORDER_DURATION", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint32", - "internalType": "uint32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "NO_TRADING", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "commitment", - "inputs": [], - "outputs": [ - { - "name": "value", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "disableTrading", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "enableTrading", - "inputs": [ - { - "name": "tradingParams", - "type": "tuple", - "internalType": "struct ConstantProduct.TradingParams", - "components": [ - { - "name": "minTradedToken0", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "priceOracle", - "type": "address", - "internalType": "contract IPriceOracle" - }, - { - "name": "priceOracleData", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "appData", - "type": "bytes32", - "internalType": "bytes32" - } - ] - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "getTradeableOrder", - "inputs": [ - { - "name": "tradingParams", - "type": "tuple", - "internalType": "struct ConstantProduct.TradingParams", - "components": [ - { - "name": "minTradedToken0", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "priceOracle", - "type": "address", - "internalType": "contract IPriceOracle" - }, - { - "name": "priceOracleData", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "appData", - "type": "bytes32", - "internalType": "bytes32" - } - ] - } - ], - "outputs": [ - { - "name": "order", - "type": "tuple", - "internalType": "struct GPv2Order.Data", - "components": [ - { - "name": "sellToken", - "type": "address", - "internalType": "contract IERC20" - }, - { - "name": "buyToken", - "type": "address", - "internalType": "contract IERC20" - }, - { - "name": "receiver", - "type": "address", - "internalType": "address" - }, - { - "name": "sellAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "buyAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "validTo", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "appData", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "feeAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "kind", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "partiallyFillable", - "type": "bool", - "internalType": "bool" - }, - { - "name": "sellTokenBalance", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "buyTokenBalance", - "type": "bytes32", - "internalType": "bytes32" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "solutionSettler", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "contract ISettlement" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "solutionSettlerDomainSeparator", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "tradingParamsHash", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - } - ] -} diff --git a/contracts/artifacts/CowAmmConstantProductFactory.json b/contracts/artifacts/CowAmmConstantProductFactory.json deleted file mode 100644 index 66ecf78cbc..0000000000 --- a/contracts/artifacts/CowAmmConstantProductFactory.json +++ /dev/null @@ -1,1434 +0,0 @@ -{ - "abi": [ - { - "type": "constructor", - "inputs": [ - { - "name": "_settler", - "type": "address", - "internalType": "contract ISettlement" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "event", - "name": "ConditionalOrderCreated", - "inputs": [ - { - "name": "owner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "params", - "type": "tuple", - "indexed": false, - "internalType": "struct IConditionalOrder.ConditionalOrderParams", - "components": [ - { - "name": "handler", - "type": "address", - "internalType": "contract IConditionalOrder" - }, - { - "name": "salt", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "staticInput", - "type": "bytes", - "internalType": "bytes" - } - ] - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Deployed", - "inputs": [ - { - "name": "amm", - "type": "address", - "indexed": true, - "internalType": "contract ConstantProduct" - }, - { - "name": "owner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "token0", - "type": "address", - "indexed": false, - "internalType": "contract IERC20" - }, - { - "name": "token1", - "type": "address", - "indexed": false, - "internalType": "contract IERC20" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TradingDisabled", - "inputs": [ - { - "name": "amm", - "type": "address", - "indexed": true, - "internalType": "contract ConstantProduct" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "OnlyOwnerCanCall", - "inputs": [ - { - "name": "owner", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "OrderNotValid", - "inputs": [ - { - "name": "", - "type": "string", - "internalType": "string" - } - ] - }, - { - "type": "function", - "name": "ammDeterministicAddress", - "inputs": [ - { - "name": "ammOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "token0", - "type": "address", - "internalType": "contract IERC20" - }, - { - "name": "token1", - "type": "address", - "internalType": "contract IERC20" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "create", - "inputs": [ - { - "name": "token0", - "type": "address", - "internalType": "contract IERC20" - }, - { - "name": "amount0", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "token1", - "type": "address", - "internalType": "contract IERC20" - }, - { - "name": "amount1", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "minTradedToken0", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "priceOracle", - "type": "address", - "internalType": "contract IPriceOracle" - }, - { - "name": "priceOracleData", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "appData", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "amm", - "type": "address", - "internalType": "contract ConstantProduct" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "deposit", - "inputs": [ - { - "name": "amm", - "type": "address", - "internalType": "contract ConstantProduct" - }, - { - "name": "amount0", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "amount1", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "owner", - "inputs": [ - { - "name": "", - "type": "address", - "internalType": "contract ConstantProduct" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "withdraw", - "inputs": [ - { - "name": "amm", - "type": "address", - "internalType": "contract ConstantProduct" - }, - { - "name": "amount0", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "amount1", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - } - ], - "bytecode": "0x60a0604052348015600e575f80fd5b506040516141b33803806141b3833981016040819052602b91603b565b6001600160a01b03166080526066565b5f60208284031215604a575f80fd5b81516001600160a01b0381168114605f575f80fd5b9392505050565b60805161412761008c5f395f8181610189015281816102a801526108c401526141275ff3fe608060405234801561000f575f80fd5b506004361061009f575f3560e01c806337ebdf5011610072578063666e1b3911610058578063666e1b391461014f578063ab221a7614610184578063b5c5f672146101ab575f80fd5b806337ebdf50146101295780635b5d9ee61461013c575f80fd5b80630efe6a8b146100a357806322b155c6146100b857806326e0a196146100f55780632791056514610116575b5f80fd5b6100b66100b13660046111ea565b6101be565b005b6100cb6100c6366004611261565b6102a3565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101086101033660046112fb565b61045f565b6040516100ec9291906114fd565b6100b6610124366004611527565b610797565b6100cb610137366004611549565b61082f565b6100b661014a366004611591565b610a01565b6100cb61015d366004611527565b5f6020819052908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6100cb7f000000000000000000000000000000000000000000000000000000000000000081565b6100b66101b93660046111ea565b610b17565b61024f3384848673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561020d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102319190611617565b73ffffffffffffffffffffffffffffffffffffffff16929190610c46565b61029e3384838673ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561020d573d5f803e3d5ffd5b505050565b5f33807f00000000000000000000000000000000000000000000000000000000000000008c8b6040516102d5906111b9565b73ffffffffffffffffffffffffffffffffffffffff9384168152918316602083015290911660408201526060018190604051809103905ff590508015801561031f573d5f803e3d5ffd5b506040805173ffffffffffffffffffffffffffffffffffffffff8e811682528c81166020830152929450828416928516917f6707255b2c5ca81220b2f3e408a269cb83baa6aa7e5e37aa1756883a6cdf06f1910160405180910390a373ffffffffffffffffffffffffffffffffffffffff8281165f90815260208190526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169183169190911790556103d8828b8a6101be565b5f60405180608001604052808981526020018873ffffffffffffffffffffffffffffffffffffffff16815260200187878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200185905290506104508382610cdb565b50509998505050505050505050565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608101919091526060306104cf6020890189611527565b73ffffffffffffffffffffffffffffffffffffffff1614610551576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f63616e206f6e6c792068616e646c65206f776e206f726465727300000000000060448201526064015b60405180910390fd5b5f61055f6040890189611632565b81019061056c919061175c565b90508873ffffffffffffffffffffffffffffffffffffffff1663eec50b976040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105db919061185a565b6040517fb09aaaca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b169063b09aaaca9061062d9085906004016118c3565b602060405180830381865afa158015610648573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061066c919061185a565b146106d3576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f696e76616c69642074726164696e6720706172616d65746572730000000000006044820152606401610548565b6040517fe3e6f5b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a169063e3e6f5b2906107259084906004016118c3565b61018060405180830381865afa158015610741573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061076591906118f7565b9250828160405160200161077a9291906119b3565b604051602081830303815290604052915050965096945050505050565b73ffffffffffffffffffffffffffffffffffffffff8082165f9081526020819052604090205482911633146108225773ffffffffffffffffffffffffffffffffffffffff8181165f90815260208190526040908190205490517f68bafff800000000000000000000000000000000000000000000000000000000815291166004820152602401610548565b61082b82610e05565b5050565b5f807fff000000000000000000000000000000000000000000000000000000000000003073ffffffffffffffffffffffffffffffffffffffff8716604051610879602082016111b9565b8181037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09081018352601f90910116604081815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166020840152808b169183019190915288166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261093a92916020016119eb565b604051602081830303815290604052805190602001206040516020016109c294939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052805160209091012095945050505050565b73ffffffffffffffffffffffffffffffffffffffff8087165f908152602081905260409020548791163314610a8c5773ffffffffffffffffffffffffffffffffffffffff8181165f90815260208190526040908190205490517f68bafff800000000000000000000000000000000000000000000000000000000815291166004820152602401610548565b5f60405180608001604052808881526020018773ffffffffffffffffffffffffffffffffffffffff16815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020018490529050610b0388610e05565b610b0d8882610cdb565b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8084165f908152602081905260409020548491163314610ba25773ffffffffffffffffffffffffffffffffffffffff8181165f90815260208190526040908190205490517f68bafff800000000000000000000000000000000000000000000000000000000815291166004820152602401610548565b610bf18433858773ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561020d573d5f803e3d5ffd5b610c408433848773ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561020d573d5f803e3d5ffd5b50505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052610c40908590610ea3565b6040517fc5f3d25400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063c5f3d25490610d2d9084906004016118c3565b5f604051808303815f87803b158015610d44575f80fd5b505af1158015610d56573d5f803e3d5ffd5b5050604080516060810182523081525f6020808301829052835191955073ffffffffffffffffffffffffffffffffffffffff881694507f2cceac5555b0ca45a3744ced542f54b56ad2eb45e521962372eef212a2cbf36193830191610dbd918891016118c3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152915251610df891906119ff565b60405180910390a2505050565b8073ffffffffffffffffffffffffffffffffffffffff166317700f016040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610e4a575f80fd5b505af1158015610e5c573d5f803e3d5ffd5b505060405173ffffffffffffffffffffffffffffffffffffffff841692507fc75bf4f03c02fab9414a7d7a54048c0486722bc72f33ad924709a0593608ad2791505f90a250565b5f610f04826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610fb09092919063ffffffff16565b905080515f1480610f24575080806020019051810190610f249190611a43565b61029e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610548565b6060610fbe84845f85610fc6565b949350505050565b606082471015611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610548565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516110809190611a5c565b5f6040518083038185875af1925050503d805f81146110ba576040519150601f19603f3d011682016040523d82523d5f602084013e6110bf565b606091505b50915091506110d0878383876110db565b979650505050505050565b606083156111705782515f036111695773ffffffffffffffffffffffffffffffffffffffff85163b611169576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610548565b5081610fbe565b610fbe83838151156111855781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105489190611a67565b61267880611a7a83390190565b73ffffffffffffffffffffffffffffffffffffffff811681146111e7575f80fd5b50565b5f805f606084860312156111fc575f80fd5b8335611207816111c6565b95602085013595506040909401359392505050565b5f8083601f84011261122c575f80fd5b50813567ffffffffffffffff811115611243575f80fd5b60208301915083602082850101111561125a575f80fd5b9250929050565b5f805f805f805f805f6101008a8c03121561127a575f80fd5b8935611285816111c6565b985060208a0135975060408a013561129c816111c6565b965060608a0135955060808a0135945060a08a01356112ba816111c6565b935060c08a013567ffffffffffffffff8111156112d5575f80fd5b6112e18c828d0161121c565b9a9d999c50979a9699959894979660e00135949350505050565b5f805f805f8060808789031215611310575f80fd5b863561131b816111c6565b9550602087013567ffffffffffffffff80821115611337575f80fd5b908801906060828b03121561134a575f80fd5b9095506040880135908082111561135f575f80fd5b61136b8a838b0161121c565b90965094506060890135915080821115611383575f80fd5b818901915089601f830112611396575f80fd5b8135818111156113a4575f80fd5b8a60208260051b85010111156113b8575f80fd5b6020830194508093505050509295509295509295565b805173ffffffffffffffffffffffffffffffffffffffff168252602081015161140f602084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040810151611437604084018273ffffffffffffffffffffffffffffffffffffffff169052565b50606081015160608301526080810151608083015260a081015161146360a084018263ffffffff169052565b5060c081015160c083015260e081015160e0830152610100808201518184015250610120808201516114988285018215159052565b5050610140818101519083015261016090810151910152565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b5f6101a061150b83866113ce565b8061018084015261151e818401856114b1565b95945050505050565b5f60208284031215611537575f80fd5b8135611542816111c6565b9392505050565b5f805f6060848603121561155b575f80fd5b8335611566816111c6565b92506020840135611576816111c6565b91506040840135611586816111c6565b809150509250925092565b5f805f805f8060a087890312156115a6575f80fd5b86356115b1816111c6565b95506020870135945060408701356115c8816111c6565b9350606087013567ffffffffffffffff8111156115e3575f80fd5b6115ef89828a0161121c565b979a9699509497949695608090950135949350505050565b8051611612816111c6565b919050565b5f60208284031215611627575f80fd5b8151611542816111c6565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611665575f80fd5b83018035915067ffffffffffffffff82111561167f575f80fd5b60200191503681900382131561125a575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156116e3576116e3611693565b60405290565b604051610180810167ffffffffffffffff811182821017156116e3576116e3611693565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561175457611754611693565b604052919050565b5f602080838503121561176d575f80fd5b823567ffffffffffffffff80821115611784575f80fd5b9084019060808287031215611797575f80fd5b61179f6116c0565b82358152838301356117b0816111c6565b818501526040830135828111156117c5575f80fd5b8301601f810188136117d5575f80fd5b8035838111156117e7576117e7611693565b611817867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161170d565b9350808452888682840101111561182c575f80fd5b80868301878601375f8682860101525050816040820152606083013560608201528094505050505092915050565b5f6020828403121561186a575f80fd5b5051919050565b8051825273ffffffffffffffffffffffffffffffffffffffff60208201511660208301525f6040820151608060408501526118af60808501826114b1565b606093840151949093019390935250919050565b602081525f6115426020830184611871565b805163ffffffff81168114611612575f80fd5b80518015158114611612575f80fd5b5f6101808284031215611908575f80fd5b6119106116e9565b61191983611607565b815261192760208401611607565b602082015261193860408401611607565b6040820152606083015160608201526080830151608082015261195d60a084016118d5565b60a082015260c083015160c082015260e083015160e08201526101008084015181830152506101206119908185016118e8565b908201526101408381015190820152610160928301519281019290925250919050565b5f6101a06119c183866113ce565b8061018084015261151e81840185611871565b5f81518060208401855e5f93019283525090919050565b5f610fbe6119f983866119d4565b846119d4565b6020815273ffffffffffffffffffffffffffffffffffffffff8251166020820152602082015160408201525f6040830151606080840152610fbe60808401826114b1565b5f60208284031215611a53575f80fd5b611542826118e8565b5f61154282846119d4565b602081525f61154260208301846114b156fe610120604052348015610010575f80fd5b5060405161267838038061267883398101604081905261002f9161052f565b6001600160a01b03831660808190526040805163f698da2560e01b8152905163f698da259160048082019260209290919082900301815f875af1158015610078573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061009c9190610579565b610100526100aa823361015f565b6100b4813361015f565b336001600160a01b031660e0816001600160a01b0316815250505f836001600160a01b0316639b552cc26040518163ffffffff1660e01b81526004016020604051808303815f875af115801561010c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101309190610590565b905061013c838261015f565b610146828261015f565b506001600160a01b0391821660a0521660c0525061061c565b6101746001600160a01b038316825f19610178565b5050565b8015806101f05750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156101ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ee9190610579565b155b6102675760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084015b60405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526102bd9185916102c216565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201525f9061030e906001600160a01b03851690849061038d565b905080515f148061032e57508080602001905181019061032e91906105b2565b6102bd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161025e565b606061039b84845f856103a3565b949350505050565b6060824710156104045760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161025e565b5f80866001600160a01b0316858760405161041f91906105d1565b5f6040518083038185875af1925050503d805f8114610459576040519150601f19603f3d011682016040523d82523d5f602084013e61045e565b606091505b5090925090506104708783838761047b565b979650505050505050565b606083156104e95782515f036104e2576001600160a01b0385163b6104e25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161025e565b508161039b565b61039b83838151156104fe5781518083602001fd5b8060405162461bcd60e51b815260040161025e91906105e7565b6001600160a01b038116811461052c575f80fd5b50565b5f805f60608486031215610541575f80fd5b835161054c81610518565b602085015190935061055d81610518565b604085015190925061056e81610518565b809150509250925092565b5f60208284031215610589575f80fd5b5051919050565b5f602082840312156105a0575f80fd5b81516105ab81610518565b9392505050565b5f602082840312156105c2575f80fd5b815180151581146105ab575f80fd5b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051611fbd6106bb5f395f81816102db015261042b01525f8181610236015281816104d90152610bf901525f81816102b40152818161059901528181610d5c01528181610ebf01528181610f8e015261100d01525f81816101380152818161057701528181610d3b01528181610e2801528181610f6b015261103001525f818161032201526112140152611fbd5ff3fe608060405234801561000f575f80fd5b506004361061012f575f3560e01c8063b09aaaca116100ad578063e3e6f5b21161007d578063eec50b9711610063578063eec50b9714610344578063f14fcbc81461034c578063ff2dbc9814610203575f80fd5b8063e3e6f5b2146102fd578063e516715b1461031d575f80fd5b8063b09aaaca14610289578063c5f3d2541461029c578063d21220a7146102af578063d25e0cb6146102d6575f80fd5b80631c7de94111610102578063481c6a75116100e8578063481c6a7514610231578063981a160b14610258578063a029a8d414610276575f80fd5b80631c7de941146102035780633e706e321461020a575f80fd5b80630dfe1681146101335780631303a484146101845780631626ba7e146101b557806317700f01146101f9575b5f80fd5b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b7f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b5935c5b60405190815260200161017b565b6101c86101c33660046116bf565b61035f565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161017b565b6102016104d7565b005b6101a75f81565b6101a77f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b59381565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b61026161012c81565b60405163ffffffff909116815260200161017b565b6102016102843660046119ee565b610573565b6101a7610297366004611a3b565b610bc8565b6102016102aa366004611a75565b610bf7565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b6101a77f000000000000000000000000000000000000000000000000000000000000000081565b61031061030b366004611a3b565b610cb7565b60405161017b9190611aac565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b6101a75f5481565b61020161035a366004611b9a565b6111fc565b5f808061036e84860186611bb1565b915091505f5461037d82610bc8565b146103b4576040517ff1a6789000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0820180517fd5a25ba2e97094ad7d83dc28a6572da797d6b3e7fc6663bd93efb789fc17e48982526101a0822091526040517f190100000000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006002820152602281019190915260429020868114610494576040517f593fcacd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f818385611291565b6104a98284610573565b507f1626ba7e00000000000000000000000000000000000000000000000000000000925050505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610546576040517ff87d0d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080556040517fbcb8b8fbdea8aa6dc4ae41213e4da81e605a3d1a56ed851b9355182321c091909190a1565b80517f0000000000000000000000000000000000000000000000000000000000000000907f00000000000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff808416911614610677578073ffffffffffffffffffffffffffffffffffffffff16835f015173ffffffffffffffffffffffffffffffffffffffff1614610675576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c69642073656c6c20746f6b656e000000000000000000000000000060448201526064015b60405180910390fd5b905b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190611bff565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091505f9073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015610772573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107969190611bff565b90508273ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff1614610831576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f696e76616c69642062757920746f6b656e000000000000000000000000000000604482015260640161066c565b604085015173ffffffffffffffffffffffffffffffffffffffff16156108b3576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7265636569766572206d757374206265207a65726f2061646472657373000000604482015260640161066c565b6108bf61012c42611c43565b8560a0015163ffffffff161115610932576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f76616c696469747920746f6f2066617220696e20746865206675747572650000604482015260640161066c565b85606001518560c00151146109a3576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c696420617070446174610000000000000000000000000000000000604482015260640161066c565b60e085015115610a0f576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f66656520616d6f756e74206d757374206265207a65726f000000000000000000604482015260640161066c565b7f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc985610160015114610a9d576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f627579546f6b656e42616c616e6365206d757374206265206572633230000000604482015260640161066c565b7f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc985610140015114610b2b576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f73656c6c546f6b656e42616c616e6365206d7573742062652065726332300000604482015260640161066c565b6060850151610b3a9082611c56565b60808601516060870151610b4e9085611c6d565b610b589190611c56565b1015610bc0576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f726563656976656420616d6f756e7420746f6f206c6f77000000000000000000604482015260640161066c565b505050505050565b5f81604051602001610bda9190611ccc565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610c66576040517ff87d0d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610c7361029783611d27565b9050805f81905550807f510e4a4f76907c2d6158b343f7c4f2f597df385b727c26e9ef90e75093ace19a83604051610cab9190611d79565b60405180910390a25050565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608101919091525f80836020015173ffffffffffffffffffffffffffffffffffffffff1663355efdd97f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000087604001516040518463ffffffff1660e01b8152600401610d9e93929190611e3a565b6040805180830381865afa158015610db8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddc9190611e72565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291935091505f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610e6d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e919190611bff565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610f19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f3d9190611bff565b90925090505f80808080610f518888611c56565b90505f610f5e8a88611c56565b90505f8282101561100b577f000000000000000000000000000000000000000000000000000000000000000096507f00000000000000000000000000000000000000000000000000000000000000009550610fd6610fbd60028b611ec1565b610fd184610fcc8e6002611c56565b611346565b61137e565b945061100185610fe6818d611c56565b610ff09085611c43565b610ffa8c8f611c56565b60016113cb565b9350849050611098565b7f000000000000000000000000000000000000000000000000000000000000000096507f0000000000000000000000000000000000000000000000000000000000000000955061106e61105f60028a611ec1565b610fd185610fcc8f6002611c56565b94506110928561107e818e611c56565b6110889086611c43565b610ffa8b8e611c56565b93508390505b8c518110156110df576110df6040518060400160405280601781526020017f74726164656420616d6f756e7420746f6f20736d616c6c000000000000000000815250611426565b6040518061018001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200161115661012c611466565b63ffffffff1681526020018e6060015181526020015f81526020017ff3b277728b3fee749481eb3e0b3b48980dbbab78658fc419025cb16eee34677581526020016001151581526020017f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc981526020017f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc98152509b505050505050505050505050919050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461126b576040517fbf84897700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b807f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b5935d50565b7f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b5935c8381146113405780156112f2576040517fdafbdd1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6112fc84610cb7565b90506113088382611487565b61133e576040517fd9ff24c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b50505050565b5f82156113735781611359600185611c6d565b6113639190611ec1565b61136e906001611c43565b611375565b5f5b90505b92915050565b5f818310156113c5576113c56040518060400160405280601581526020017f7375627472616374696f6e20756e646572666c6f770000000000000000000000815250611426565b50900390565b5f806113d8868686611599565b905060018360028111156113ee576113ee611ed4565b14801561140a57505f848061140557611405611e94565b868809115b1561141d5761141a600182611c43565b90505b95945050505050565b611431436001611c43565b816040517f1fe8506e00000000000000000000000000000000000000000000000000000000815260040161066c929190611f01565b5f81806114738142611f19565b61147d9190611f3b565b6113789190611f63565b5f80825f015173ffffffffffffffffffffffffffffffffffffffff16845f015173ffffffffffffffffffffffffffffffffffffffff161490505f836020015173ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff161490505f846060015186606001511490505f856080015187608001511490505f8660a0015163ffffffff168860a0015163ffffffff161490505f8761010001518961010001511490505f88610120015115158a6101200151151514905086801561155e5750855b80156115675750845b80156115705750835b80156115795750825b80156115825750815b801561158b5750805b9a9950505050505050505050565b5f80807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709858702925082811083820303915050805f036115ef578382816115e5576115e5611e94565b04925050506104d0565b808411611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f770000000000000000000000604482015260640161066c565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f805f604084860312156116d1575f80fd5b83359250602084013567ffffffffffffffff808211156116ef575f80fd5b818601915086601f830112611702575f80fd5b813581811115611710575f80fd5b876020828501011115611721575f80fd5b6020830194508093505050509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff8111828210171561178457611784611734565b60405290565b604051610180810167ffffffffffffffff8111828210171561178457611784611734565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156117f5576117f5611734565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461181e575f80fd5b50565b5f60808284031215611831575f80fd5b611839611761565b90508135815260208083013561184e816117fd565b82820152604083013567ffffffffffffffff8082111561186c575f80fd5b818501915085601f83011261187f575f80fd5b81358181111561189157611891611734565b6118c1847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016117ae565b915080825286848285010111156118d6575f80fd5b80848401858401375f848284010152508060408501525050506060820135606082015292915050565b803561190a816117fd565b919050565b803563ffffffff8116811461190a575f80fd5b8035801515811461190a575f80fd5b5f6101808284031215611942575f80fd5b61194a61178a565b9050611955826118ff565b8152611963602083016118ff565b6020820152611974604083016118ff565b6040820152606082013560608201526080820135608082015261199960a0830161190f565b60a082015260c082013560c082015260e082013560e08201526101008083013581830152506101206119cc818401611922565b9082015261014082810135908201526101609182013591810191909152919050565b5f806101a08385031215611a00575f80fd5b823567ffffffffffffffff811115611a16575f80fd5b611a2285828601611821565b925050611a328460208501611931565b90509250929050565b5f60208284031215611a4b575f80fd5b813567ffffffffffffffff811115611a61575f80fd5b611a6d84828501611821565b949350505050565b5f60208284031215611a85575f80fd5b813567ffffffffffffffff811115611a9b575f80fd5b8201608081850312156104d0575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff16815261018081016020830151611af2602084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040830151611b1a604084018273ffffffffffffffffffffffffffffffffffffffff169052565b50606083015160608301526080830151608083015260a0830151611b4660a084018263ffffffff169052565b5060c083015160c083015260e083015160e083015261010080840151818401525061012080840151611b7b8285018215159052565b5050610140838101519083015261016092830151929091019190915290565b5f60208284031215611baa575f80fd5b5035919050565b5f806101a08385031215611bc3575f80fd5b611bcd8484611931565b915061018083013567ffffffffffffffff811115611be9575f80fd5b611bf585828601611821565b9150509250929050565b5f60208284031215611c0f575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561137857611378611c16565b808202811582820484141761137857611378611c16565b8181038181111561137857611378611c16565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081528151602082015273ffffffffffffffffffffffffffffffffffffffff60208301511660408201525f604083015160806060840152611d1160a0840182611c80565b9050606084015160808401528091505092915050565b5f6113783683611821565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60208152813560208201525f6020830135611d93816117fd565b73ffffffffffffffffffffffffffffffffffffffff811660408401525060408301357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611de4575f80fd5b830160208101903567ffffffffffffffff811115611e00575f80fd5b803603821315611e0e575f80fd5b60806060850152611e2360a085018284611d32565b915050606084013560808401528091505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff80861683528085166020840152506060604083015261141d6060830184611c80565b5f8060408385031215611e83575f80fd5b505080516020909101519092909150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82611ecf57611ecf611e94565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b828152604060208201525f611a6d6040830184611c80565b5f63ffffffff80841680611f2f57611f2f611e94565b92169190910492915050565b63ffffffff818116838216028082169190828114611f5b57611f5b611c16565b505092915050565b63ffffffff818116838216019080821115611f8057611f80611c16565b509291505056fea2646970667358221220e3fb228b525d90b942c7e58fe2e2034a17bd258c082fd47740e764a7be45bac664736f6c63430008190033a26469706673582212201190cf42f989cee23f12597c8c1e9daab6d8c816513349c3ce7fd229cae5b0ff64736f6c63430008190033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061009f575f3560e01c806337ebdf5011610072578063666e1b3911610058578063666e1b391461014f578063ab221a7614610184578063b5c5f672146101ab575f80fd5b806337ebdf50146101295780635b5d9ee61461013c575f80fd5b80630efe6a8b146100a357806322b155c6146100b857806326e0a196146100f55780632791056514610116575b5f80fd5b6100b66100b13660046111ea565b6101be565b005b6100cb6100c6366004611261565b6102a3565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101086101033660046112fb565b61045f565b6040516100ec9291906114fd565b6100b6610124366004611527565b610797565b6100cb610137366004611549565b61082f565b6100b661014a366004611591565b610a01565b6100cb61015d366004611527565b5f6020819052908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6100cb7f000000000000000000000000000000000000000000000000000000000000000081565b6100b66101b93660046111ea565b610b17565b61024f3384848673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561020d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102319190611617565b73ffffffffffffffffffffffffffffffffffffffff16929190610c46565b61029e3384838673ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561020d573d5f803e3d5ffd5b505050565b5f33807f00000000000000000000000000000000000000000000000000000000000000008c8b6040516102d5906111b9565b73ffffffffffffffffffffffffffffffffffffffff9384168152918316602083015290911660408201526060018190604051809103905ff590508015801561031f573d5f803e3d5ffd5b506040805173ffffffffffffffffffffffffffffffffffffffff8e811682528c81166020830152929450828416928516917f6707255b2c5ca81220b2f3e408a269cb83baa6aa7e5e37aa1756883a6cdf06f1910160405180910390a373ffffffffffffffffffffffffffffffffffffffff8281165f90815260208190526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169183169190911790556103d8828b8a6101be565b5f60405180608001604052808981526020018873ffffffffffffffffffffffffffffffffffffffff16815260200187878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200185905290506104508382610cdb565b50509998505050505050505050565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608101919091526060306104cf6020890189611527565b73ffffffffffffffffffffffffffffffffffffffff1614610551576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f63616e206f6e6c792068616e646c65206f776e206f726465727300000000000060448201526064015b60405180910390fd5b5f61055f6040890189611632565b81019061056c919061175c565b90508873ffffffffffffffffffffffffffffffffffffffff1663eec50b976040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105db919061185a565b6040517fb09aaaca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b169063b09aaaca9061062d9085906004016118c3565b602060405180830381865afa158015610648573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061066c919061185a565b146106d3576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f696e76616c69642074726164696e6720706172616d65746572730000000000006044820152606401610548565b6040517fe3e6f5b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a169063e3e6f5b2906107259084906004016118c3565b61018060405180830381865afa158015610741573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061076591906118f7565b9250828160405160200161077a9291906119b3565b604051602081830303815290604052915050965096945050505050565b73ffffffffffffffffffffffffffffffffffffffff8082165f9081526020819052604090205482911633146108225773ffffffffffffffffffffffffffffffffffffffff8181165f90815260208190526040908190205490517f68bafff800000000000000000000000000000000000000000000000000000000815291166004820152602401610548565b61082b82610e05565b5050565b5f807fff000000000000000000000000000000000000000000000000000000000000003073ffffffffffffffffffffffffffffffffffffffff8716604051610879602082016111b9565b8181037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09081018352601f90910116604081815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166020840152808b169183019190915288166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261093a92916020016119eb565b604051602081830303815290604052805190602001206040516020016109c294939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052805160209091012095945050505050565b73ffffffffffffffffffffffffffffffffffffffff8087165f908152602081905260409020548791163314610a8c5773ffffffffffffffffffffffffffffffffffffffff8181165f90815260208190526040908190205490517f68bafff800000000000000000000000000000000000000000000000000000000815291166004820152602401610548565b5f60405180608001604052808881526020018773ffffffffffffffffffffffffffffffffffffffff16815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020018490529050610b0388610e05565b610b0d8882610cdb565b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8084165f908152602081905260409020548491163314610ba25773ffffffffffffffffffffffffffffffffffffffff8181165f90815260208190526040908190205490517f68bafff800000000000000000000000000000000000000000000000000000000815291166004820152602401610548565b610bf18433858773ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561020d573d5f803e3d5ffd5b610c408433848773ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561020d573d5f803e3d5ffd5b50505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052610c40908590610ea3565b6040517fc5f3d25400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063c5f3d25490610d2d9084906004016118c3565b5f604051808303815f87803b158015610d44575f80fd5b505af1158015610d56573d5f803e3d5ffd5b5050604080516060810182523081525f6020808301829052835191955073ffffffffffffffffffffffffffffffffffffffff881694507f2cceac5555b0ca45a3744ced542f54b56ad2eb45e521962372eef212a2cbf36193830191610dbd918891016118c3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152915251610df891906119ff565b60405180910390a2505050565b8073ffffffffffffffffffffffffffffffffffffffff166317700f016040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610e4a575f80fd5b505af1158015610e5c573d5f803e3d5ffd5b505060405173ffffffffffffffffffffffffffffffffffffffff841692507fc75bf4f03c02fab9414a7d7a54048c0486722bc72f33ad924709a0593608ad2791505f90a250565b5f610f04826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610fb09092919063ffffffff16565b905080515f1480610f24575080806020019051810190610f249190611a43565b61029e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610548565b6060610fbe84845f85610fc6565b949350505050565b606082471015611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610548565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516110809190611a5c565b5f6040518083038185875af1925050503d805f81146110ba576040519150601f19603f3d011682016040523d82523d5f602084013e6110bf565b606091505b50915091506110d0878383876110db565b979650505050505050565b606083156111705782515f036111695773ffffffffffffffffffffffffffffffffffffffff85163b611169576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610548565b5081610fbe565b610fbe83838151156111855781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105489190611a67565b61267880611a7a83390190565b73ffffffffffffffffffffffffffffffffffffffff811681146111e7575f80fd5b50565b5f805f606084860312156111fc575f80fd5b8335611207816111c6565b95602085013595506040909401359392505050565b5f8083601f84011261122c575f80fd5b50813567ffffffffffffffff811115611243575f80fd5b60208301915083602082850101111561125a575f80fd5b9250929050565b5f805f805f805f805f6101008a8c03121561127a575f80fd5b8935611285816111c6565b985060208a0135975060408a013561129c816111c6565b965060608a0135955060808a0135945060a08a01356112ba816111c6565b935060c08a013567ffffffffffffffff8111156112d5575f80fd5b6112e18c828d0161121c565b9a9d999c50979a9699959894979660e00135949350505050565b5f805f805f8060808789031215611310575f80fd5b863561131b816111c6565b9550602087013567ffffffffffffffff80821115611337575f80fd5b908801906060828b03121561134a575f80fd5b9095506040880135908082111561135f575f80fd5b61136b8a838b0161121c565b90965094506060890135915080821115611383575f80fd5b818901915089601f830112611396575f80fd5b8135818111156113a4575f80fd5b8a60208260051b85010111156113b8575f80fd5b6020830194508093505050509295509295509295565b805173ffffffffffffffffffffffffffffffffffffffff168252602081015161140f602084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040810151611437604084018273ffffffffffffffffffffffffffffffffffffffff169052565b50606081015160608301526080810151608083015260a081015161146360a084018263ffffffff169052565b5060c081015160c083015260e081015160e0830152610100808201518184015250610120808201516114988285018215159052565b5050610140818101519083015261016090810151910152565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b5f6101a061150b83866113ce565b8061018084015261151e818401856114b1565b95945050505050565b5f60208284031215611537575f80fd5b8135611542816111c6565b9392505050565b5f805f6060848603121561155b575f80fd5b8335611566816111c6565b92506020840135611576816111c6565b91506040840135611586816111c6565b809150509250925092565b5f805f805f8060a087890312156115a6575f80fd5b86356115b1816111c6565b95506020870135945060408701356115c8816111c6565b9350606087013567ffffffffffffffff8111156115e3575f80fd5b6115ef89828a0161121c565b979a9699509497949695608090950135949350505050565b8051611612816111c6565b919050565b5f60208284031215611627575f80fd5b8151611542816111c6565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611665575f80fd5b83018035915067ffffffffffffffff82111561167f575f80fd5b60200191503681900382131561125a575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156116e3576116e3611693565b60405290565b604051610180810167ffffffffffffffff811182821017156116e3576116e3611693565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561175457611754611693565b604052919050565b5f602080838503121561176d575f80fd5b823567ffffffffffffffff80821115611784575f80fd5b9084019060808287031215611797575f80fd5b61179f6116c0565b82358152838301356117b0816111c6565b818501526040830135828111156117c5575f80fd5b8301601f810188136117d5575f80fd5b8035838111156117e7576117e7611693565b611817867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161170d565b9350808452888682840101111561182c575f80fd5b80868301878601375f8682860101525050816040820152606083013560608201528094505050505092915050565b5f6020828403121561186a575f80fd5b5051919050565b8051825273ffffffffffffffffffffffffffffffffffffffff60208201511660208301525f6040820151608060408501526118af60808501826114b1565b606093840151949093019390935250919050565b602081525f6115426020830184611871565b805163ffffffff81168114611612575f80fd5b80518015158114611612575f80fd5b5f6101808284031215611908575f80fd5b6119106116e9565b61191983611607565b815261192760208401611607565b602082015261193860408401611607565b6040820152606083015160608201526080830151608082015261195d60a084016118d5565b60a082015260c083015160c082015260e083015160e08201526101008084015181830152506101206119908185016118e8565b908201526101408381015190820152610160928301519281019290925250919050565b5f6101a06119c183866113ce565b8061018084015261151e81840185611871565b5f81518060208401855e5f93019283525090919050565b5f610fbe6119f983866119d4565b846119d4565b6020815273ffffffffffffffffffffffffffffffffffffffff8251166020820152602082015160408201525f6040830151606080840152610fbe60808401826114b1565b5f60208284031215611a53575f80fd5b611542826118e8565b5f61154282846119d4565b602081525f61154260208301846114b156fe610120604052348015610010575f80fd5b5060405161267838038061267883398101604081905261002f9161052f565b6001600160a01b03831660808190526040805163f698da2560e01b8152905163f698da259160048082019260209290919082900301815f875af1158015610078573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061009c9190610579565b610100526100aa823361015f565b6100b4813361015f565b336001600160a01b031660e0816001600160a01b0316815250505f836001600160a01b0316639b552cc26040518163ffffffff1660e01b81526004016020604051808303815f875af115801561010c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101309190610590565b905061013c838261015f565b610146828261015f565b506001600160a01b0391821660a0521660c0525061061c565b6101746001600160a01b038316825f19610178565b5050565b8015806101f05750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156101ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ee9190610579565b155b6102675760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084015b60405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526102bd9185916102c216565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201525f9061030e906001600160a01b03851690849061038d565b905080515f148061032e57508080602001905181019061032e91906105b2565b6102bd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161025e565b606061039b84845f856103a3565b949350505050565b6060824710156104045760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161025e565b5f80866001600160a01b0316858760405161041f91906105d1565b5f6040518083038185875af1925050503d805f8114610459576040519150601f19603f3d011682016040523d82523d5f602084013e61045e565b606091505b5090925090506104708783838761047b565b979650505050505050565b606083156104e95782515f036104e2576001600160a01b0385163b6104e25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161025e565b508161039b565b61039b83838151156104fe5781518083602001fd5b8060405162461bcd60e51b815260040161025e91906105e7565b6001600160a01b038116811461052c575f80fd5b50565b5f805f60608486031215610541575f80fd5b835161054c81610518565b602085015190935061055d81610518565b604085015190925061056e81610518565b809150509250925092565b5f60208284031215610589575f80fd5b5051919050565b5f602082840312156105a0575f80fd5b81516105ab81610518565b9392505050565b5f602082840312156105c2575f80fd5b815180151581146105ab575f80fd5b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051611fbd6106bb5f395f81816102db015261042b01525f8181610236015281816104d90152610bf901525f81816102b40152818161059901528181610d5c01528181610ebf01528181610f8e015261100d01525f81816101380152818161057701528181610d3b01528181610e2801528181610f6b015261103001525f818161032201526112140152611fbd5ff3fe608060405234801561000f575f80fd5b506004361061012f575f3560e01c8063b09aaaca116100ad578063e3e6f5b21161007d578063eec50b9711610063578063eec50b9714610344578063f14fcbc81461034c578063ff2dbc9814610203575f80fd5b8063e3e6f5b2146102fd578063e516715b1461031d575f80fd5b8063b09aaaca14610289578063c5f3d2541461029c578063d21220a7146102af578063d25e0cb6146102d6575f80fd5b80631c7de94111610102578063481c6a75116100e8578063481c6a7514610231578063981a160b14610258578063a029a8d414610276575f80fd5b80631c7de941146102035780633e706e321461020a575f80fd5b80630dfe1681146101335780631303a484146101845780631626ba7e146101b557806317700f01146101f9575b5f80fd5b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b7f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b5935c5b60405190815260200161017b565b6101c86101c33660046116bf565b61035f565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161017b565b6102016104d7565b005b6101a75f81565b6101a77f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b59381565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b61026161012c81565b60405163ffffffff909116815260200161017b565b6102016102843660046119ee565b610573565b6101a7610297366004611a3b565b610bc8565b6102016102aa366004611a75565b610bf7565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b6101a77f000000000000000000000000000000000000000000000000000000000000000081565b61031061030b366004611a3b565b610cb7565b60405161017b9190611aac565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b6101a75f5481565b61020161035a366004611b9a565b6111fc565b5f808061036e84860186611bb1565b915091505f5461037d82610bc8565b146103b4576040517ff1a6789000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0820180517fd5a25ba2e97094ad7d83dc28a6572da797d6b3e7fc6663bd93efb789fc17e48982526101a0822091526040517f190100000000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006002820152602281019190915260429020868114610494576040517f593fcacd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f818385611291565b6104a98284610573565b507f1626ba7e00000000000000000000000000000000000000000000000000000000925050505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610546576040517ff87d0d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080556040517fbcb8b8fbdea8aa6dc4ae41213e4da81e605a3d1a56ed851b9355182321c091909190a1565b80517f0000000000000000000000000000000000000000000000000000000000000000907f00000000000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff808416911614610677578073ffffffffffffffffffffffffffffffffffffffff16835f015173ffffffffffffffffffffffffffffffffffffffff1614610675576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c69642073656c6c20746f6b656e000000000000000000000000000060448201526064015b60405180910390fd5b905b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190611bff565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091505f9073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015610772573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107969190611bff565b90508273ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff1614610831576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f696e76616c69642062757920746f6b656e000000000000000000000000000000604482015260640161066c565b604085015173ffffffffffffffffffffffffffffffffffffffff16156108b3576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7265636569766572206d757374206265207a65726f2061646472657373000000604482015260640161066c565b6108bf61012c42611c43565b8560a0015163ffffffff161115610932576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f76616c696469747920746f6f2066617220696e20746865206675747572650000604482015260640161066c565b85606001518560c00151146109a3576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c696420617070446174610000000000000000000000000000000000604482015260640161066c565b60e085015115610a0f576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f66656520616d6f756e74206d757374206265207a65726f000000000000000000604482015260640161066c565b7f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc985610160015114610a9d576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f627579546f6b656e42616c616e6365206d757374206265206572633230000000604482015260640161066c565b7f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc985610140015114610b2b576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f73656c6c546f6b656e42616c616e6365206d7573742062652065726332300000604482015260640161066c565b6060850151610b3a9082611c56565b60808601516060870151610b4e9085611c6d565b610b589190611c56565b1015610bc0576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f726563656976656420616d6f756e7420746f6f206c6f77000000000000000000604482015260640161066c565b505050505050565b5f81604051602001610bda9190611ccc565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610c66576040517ff87d0d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610c7361029783611d27565b9050805f81905550807f510e4a4f76907c2d6158b343f7c4f2f597df385b727c26e9ef90e75093ace19a83604051610cab9190611d79565b60405180910390a25050565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608101919091525f80836020015173ffffffffffffffffffffffffffffffffffffffff1663355efdd97f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000087604001516040518463ffffffff1660e01b8152600401610d9e93929190611e3a565b6040805180830381865afa158015610db8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddc9190611e72565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291935091505f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610e6d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e919190611bff565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610f19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f3d9190611bff565b90925090505f80808080610f518888611c56565b90505f610f5e8a88611c56565b90505f8282101561100b577f000000000000000000000000000000000000000000000000000000000000000096507f00000000000000000000000000000000000000000000000000000000000000009550610fd6610fbd60028b611ec1565b610fd184610fcc8e6002611c56565b611346565b61137e565b945061100185610fe6818d611c56565b610ff09085611c43565b610ffa8c8f611c56565b60016113cb565b9350849050611098565b7f000000000000000000000000000000000000000000000000000000000000000096507f0000000000000000000000000000000000000000000000000000000000000000955061106e61105f60028a611ec1565b610fd185610fcc8f6002611c56565b94506110928561107e818e611c56565b6110889086611c43565b610ffa8b8e611c56565b93508390505b8c518110156110df576110df6040518060400160405280601781526020017f74726164656420616d6f756e7420746f6f20736d616c6c000000000000000000815250611426565b6040518061018001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200161115661012c611466565b63ffffffff1681526020018e6060015181526020015f81526020017ff3b277728b3fee749481eb3e0b3b48980dbbab78658fc419025cb16eee34677581526020016001151581526020017f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc981526020017f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc98152509b505050505050505050505050919050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461126b576040517fbf84897700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b807f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b5935d50565b7f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b5935c8381146113405780156112f2576040517fdafbdd1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6112fc84610cb7565b90506113088382611487565b61133e576040517fd9ff24c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b50505050565b5f82156113735781611359600185611c6d565b6113639190611ec1565b61136e906001611c43565b611375565b5f5b90505b92915050565b5f818310156113c5576113c56040518060400160405280601581526020017f7375627472616374696f6e20756e646572666c6f770000000000000000000000815250611426565b50900390565b5f806113d8868686611599565b905060018360028111156113ee576113ee611ed4565b14801561140a57505f848061140557611405611e94565b868809115b1561141d5761141a600182611c43565b90505b95945050505050565b611431436001611c43565b816040517f1fe8506e00000000000000000000000000000000000000000000000000000000815260040161066c929190611f01565b5f81806114738142611f19565b61147d9190611f3b565b6113789190611f63565b5f80825f015173ffffffffffffffffffffffffffffffffffffffff16845f015173ffffffffffffffffffffffffffffffffffffffff161490505f836020015173ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff161490505f846060015186606001511490505f856080015187608001511490505f8660a0015163ffffffff168860a0015163ffffffff161490505f8761010001518961010001511490505f88610120015115158a6101200151151514905086801561155e5750855b80156115675750845b80156115705750835b80156115795750825b80156115825750815b801561158b5750805b9a9950505050505050505050565b5f80807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709858702925082811083820303915050805f036115ef578382816115e5576115e5611e94565b04925050506104d0565b808411611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f770000000000000000000000604482015260640161066c565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f805f604084860312156116d1575f80fd5b83359250602084013567ffffffffffffffff808211156116ef575f80fd5b818601915086601f830112611702575f80fd5b813581811115611710575f80fd5b876020828501011115611721575f80fd5b6020830194508093505050509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff8111828210171561178457611784611734565b60405290565b604051610180810167ffffffffffffffff8111828210171561178457611784611734565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156117f5576117f5611734565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461181e575f80fd5b50565b5f60808284031215611831575f80fd5b611839611761565b90508135815260208083013561184e816117fd565b82820152604083013567ffffffffffffffff8082111561186c575f80fd5b818501915085601f83011261187f575f80fd5b81358181111561189157611891611734565b6118c1847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016117ae565b915080825286848285010111156118d6575f80fd5b80848401858401375f848284010152508060408501525050506060820135606082015292915050565b803561190a816117fd565b919050565b803563ffffffff8116811461190a575f80fd5b8035801515811461190a575f80fd5b5f6101808284031215611942575f80fd5b61194a61178a565b9050611955826118ff565b8152611963602083016118ff565b6020820152611974604083016118ff565b6040820152606082013560608201526080820135608082015261199960a0830161190f565b60a082015260c082013560c082015260e082013560e08201526101008083013581830152506101206119cc818401611922565b9082015261014082810135908201526101609182013591810191909152919050565b5f806101a08385031215611a00575f80fd5b823567ffffffffffffffff811115611a16575f80fd5b611a2285828601611821565b925050611a328460208501611931565b90509250929050565b5f60208284031215611a4b575f80fd5b813567ffffffffffffffff811115611a61575f80fd5b611a6d84828501611821565b949350505050565b5f60208284031215611a85575f80fd5b813567ffffffffffffffff811115611a9b575f80fd5b8201608081850312156104d0575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff16815261018081016020830151611af2602084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040830151611b1a604084018273ffffffffffffffffffffffffffffffffffffffff169052565b50606083015160608301526080830151608083015260a0830151611b4660a084018263ffffffff169052565b5060c083015160c083015260e083015160e083015261010080840151818401525061012080840151611b7b8285018215159052565b5050610140838101519083015261016092830151929091019190915290565b5f60208284031215611baa575f80fd5b5035919050565b5f806101a08385031215611bc3575f80fd5b611bcd8484611931565b915061018083013567ffffffffffffffff811115611be9575f80fd5b611bf585828601611821565b9150509250929050565b5f60208284031215611c0f575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561137857611378611c16565b808202811582820484141761137857611378611c16565b8181038181111561137857611378611c16565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081528151602082015273ffffffffffffffffffffffffffffffffffffffff60208301511660408201525f604083015160806060840152611d1160a0840182611c80565b9050606084015160808401528091505092915050565b5f6113783683611821565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60208152813560208201525f6020830135611d93816117fd565b73ffffffffffffffffffffffffffffffffffffffff811660408401525060408301357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611de4575f80fd5b830160208101903567ffffffffffffffff811115611e00575f80fd5b803603821315611e0e575f80fd5b60806060850152611e2360a085018284611d32565b915050606084013560808401528091505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff80861683528085166020840152506060604083015261141d6060830184611c80565b5f8060408385031215611e83575f80fd5b505080516020909101519092909150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82611ecf57611ecf611e94565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b828152604060208201525f611a6d6040830184611c80565b5f63ffffffff80841680611f2f57611f2f611e94565b92169190910492915050565b63ffffffff818116838216028082169190828114611f5b57611f5b611c16565b505092915050565b63ffffffff818116838216019080821115611f8057611f80611c16565b509291505056fea2646970667358221220e3fb228b525d90b942c7e58fe2e2034a17bd258c082fd47740e764a7be45bac664736f6c63430008190033a26469706673582212201190cf42f989cee23f12597c8c1e9daab6d8c816513349c3ce7fd229cae5b0ff64736f6c63430008190033", - "methodIdentifiers": { - "ammDeterministicAddress(address,address,address)": "37ebdf50", - "create(address,uint256,address,uint256,uint256,address,bytes,bytes32)": "22b155c6", - "deposit(address,uint256,uint256)": "0efe6a8b", - "disableTrading(address)": "27910565", - "getTradeableOrderWithSignature(address,(address,bytes32,bytes),bytes,bytes32[])": "26e0a196", - "owner(address)": "666e1b39", - "settler()": "ab221a76", - "updateParameters(address,uint256,address,bytes,bytes32)": "5b5d9ee6", - "withdraw(address,uint256,uint256)": "b5c5f672" - }, - "rawMetadata": "{\"compiler\":{\"version\":\"0.8.25+commit.b61c2a91\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract ISettlement\",\"name\":\"_settler\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OnlyOwnerCanCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"OrderNotValid\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"contract IConditionalOrder\",\"name\":\"handler\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"staticInput\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"struct IConditionalOrder.ConditionalOrderParams\",\"name\":\"params\",\"type\":\"tuple\"}],\"name\":\"ConditionalOrderCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract ConstantProduct\",\"name\":\"amm\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract IERC20\",\"name\":\"token0\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract IERC20\",\"name\":\"token1\",\"type\":\"address\"}],\"name\":\"Deployed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract ConstantProduct\",\"name\":\"amm\",\"type\":\"address\"}],\"name\":\"TradingDisabled\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"ammOwner\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"token0\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"token1\",\"type\":\"address\"}],\"name\":\"ammDeterministicAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token0\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount0\",\"type\":\"uint256\"},{\"internalType\":\"contract IERC20\",\"name\":\"token1\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minTradedToken0\",\"type\":\"uint256\"},{\"internalType\":\"contract IPriceOracle\",\"name\":\"priceOracle\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"priceOracleData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"appData\",\"type\":\"bytes32\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract ConstantProduct\",\"name\":\"amm\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ConstantProduct\",\"name\":\"amm\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount1\",\"type\":\"uint256\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ConstantProduct\",\"name\":\"amm\",\"type\":\"address\"}],\"name\":\"disableTrading\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ConstantProduct\",\"name\":\"amm\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"contract IConditionalOrder\",\"name\":\"handler\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"staticInput\",\"type\":\"bytes\"}],\"internalType\":\"struct IConditionalOrder.ConditionalOrderParams\",\"name\":\"params\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"name\":\"getTradeableOrderWithSignature\",\"outputs\":[{\"components\":[{\"internalType\":\"contract IERC20\",\"name\":\"sellToken\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"buyToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"sellAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"buyAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"validTo\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"appData\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"feeAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"kind\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"partiallyFillable\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"sellTokenBalance\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"buyTokenBalance\",\"type\":\"bytes32\"}],\"internalType\":\"struct GPv2Order.Data\",\"name\":\"order\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ConstantProduct\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"settler\",\"outputs\":[{\"internalType\":\"contract ISettlement\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ConstantProduct\",\"name\":\"amm\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minTradedToken0\",\"type\":\"uint256\"},{\"internalType\":\"contract IPriceOracle\",\"name\":\"priceOracle\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"priceOracleData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"appData\",\"type\":\"bytes32\"}],\"name\":\"updateParameters\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ConstantProduct\",\"name\":\"amm\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount1\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"CoW Protocol Developers\",\"details\":\"Factory contract for the CoW AMM, an automated market maker based on the concept of function-maximising AMMs. The factory deploys new AMM and is responsible for managing deposits, enabling/disabling trading and updating trade parameters.\",\"errors\":{\"OnlyOwnerCanCall(address)\":[{\"params\":{\"owner\":\"The owner of the AMM.\"}}],\"OrderNotValid(string)\":[{\"details\":\"This error is returned by the `getTradeableOrder` function if the order condition is not met. A parameter of `string` type is included to allow the caller to specify the reason for the failure.\"}]},\"events\":{\"Deployed(address,address,address,address)\":{\"params\":{\"amm\":\"The address of the AMM that can now trade on CoW Protocol.\",\"owner\":\"The owner of the AMM.\",\"token0\":\"The first token traded by the AMM.\",\"token1\":\"The second token traded by the AMM.\"}},\"TradingDisabled(address)\":{\"params\":{\"amm\":\"The address of the AMM that stops trading on CoW Protocol.\"}}},\"kind\":\"dev\",\"methods\":{\"ammDeterministicAddress(address,address,address)\":{\"params\":{\"ammOwner\":\"The (expected) owner of the AMM.\",\"token0\":\"The address of the first token traded by the AMM.\",\"token1\":\"The address of the second token traded by the AMM.\"},\"returns\":{\"_0\":\"The deterministic address at which this contract deploys a CoW AMM for the specified input parameters.\"}},\"constructor\":{\"params\":{\"_settler\":\"The address of the GPv2Settlement contract.\"}},\"create(address,uint256,address,uint256,uint256,address,bytes,bytes32)\":{\"params\":{\"amount0\":\"The initial amount of the first token in the pair.\",\"amount1\":\"The initial amount of the second token in the pair.\",\"appData\":\"The app data to pass to the AMM.\",\"minTradedToken0\":\"The minimum amount of token0 before the AMM attempts auto-rebalance.\",\"priceOracle\":\"The address of the price oracle to use for the AMM.\",\"priceOracleData\":\"The data to pass to the price oracle.\",\"token0\":\"The address of the first token in the pair.\",\"token1\":\"The address of the second token in the pair.\"},\"returns\":{\"amm\":\"The address of the newly deployed AMM.\"}},\"deposit(address,uint256,uint256)\":{\"params\":{\"amm\":\"the AMM where to send the funds\",\"amount0\":\"amount of AMM's token0 to deposit\",\"amount1\":\"amount of AMM's token1 to deposit\"}},\"disableTrading(address)\":{\"params\":{\"amm\":\"The AMM for which to disable trading.\"}},\"getTradeableOrderWithSignature(address,(address,bytes32,bytes),bytes,bytes32[])\":{\"details\":\"Some parameters are unused as they refer to features of ComposableCoW that aren't implemented in this contract. They are still needed to let the watchtower interact with this contract in the same way as ComposableCoW.\",\"params\":{\"amm\":\"owner of the order.\",\"params\":\"`ConditionalOrderParams` for the order; precisely, the handler must be this contract, the salt can be any value, and the static input must be the current trading parameters of the AMM.\"},\"returns\":{\"order\":\"discrete order for submitting to CoW Protocol API\",\"signature\":\"for submitting to CoW Protocol API\"}},\"updateParameters(address,uint256,address,bytes,bytes32)\":{\"params\":{\"amm\":\"The address of the AMM whose parameters to change.\",\"appData\":\"The app data to pass to the AMM.\",\"minTradedToken0\":\"The minimum amount of token0 before the AMM attempts auto-rebalance.\",\"priceOracle\":\"The address of the price oracle to use for the AMM.\",\"priceOracleData\":\"The data to pass to the price oracle.\"}},\"withdraw(address,uint256,uint256)\":{\"params\":{\"amm\":\"the AMM whose funds to withdraw\",\"amount0\":\"amount of AMM's token0 to withdraw\",\"amount1\":\"amount of AMM's token1 to withdraw\"}}},\"title\":\"CoW AMM Factory\",\"version\":1},\"userdoc\":{\"errors\":{\"OnlyOwnerCanCall(address)\":[{\"notice\":\"This function is permissioned and can only be called by the owner of the AMM that is involved in the transaction.\"}]},\"events\":{\"Deployed(address,address,address,address)\":{\"notice\":\"A CoW AMM has been created. The emitted AMM parameters are immutable for the new AMM.\"},\"TradingDisabled(address)\":{\"notice\":\"A CoW AMM stopped trading; no CoW Protocol orders can be settled until trading is enabled again.\"}},\"kind\":\"user\",\"methods\":{\"ammDeterministicAddress(address,address,address)\":{\"notice\":\"Computes the determinisitic address of a CoW AMM deployment.\"},\"create(address,uint256,address,uint256,uint256,address,bytes,bytes32)\":{\"notice\":\"Creates a new CoW AMM with the specified imput parameters.\"},\"deposit(address,uint256,uint256)\":{\"notice\":\"Deposit sender's funds into the the AMM contract, assuming that the sender has approved this contract to spend both tokens.\"},\"disableTrading(address)\":{\"notice\":\"Disable trading for an AMM managed by this contract.\"},\"getTradeableOrderWithSignature(address,(address,bytes32,bytes),bytes,bytes32[])\":{\"notice\":\"This function exists to let the watchtower off-chain service automatically create AMM orders and post them on the orderbook. It outputs an order for the input AMM together with a valid signature.\"},\"owner(address)\":{\"notice\":\"For each AMM created by this contract, this mapping stores its owner.\"},\"settler()\":{\"notice\":\"The settlement contract for CoW Protocol on this network.\"},\"updateParameters(address,uint256,address,bytes,bytes32)\":{\"notice\":\"Change the parameters used for trading on the specified AMM. Only a single order per AMM can be valid at a time, meaning that any previous order stops being tradeable.\"},\"withdraw(address,uint256,uint256)\":{\"notice\":\"Take funds from the AMM and sends them to the owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/ConstantProductFactory.sol\":\"ConstantProductFactory\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000},\"remappings\":[\":@openzeppelin/=lib/composable-cow/lib/@openzeppelin/\",\":@openzeppelin/contracts/=lib/composable-cow/lib/@openzeppelin/contracts/\",\":balancer/=lib/composable-cow/lib/balancer/src/\",\":canonical-weth/=lib/composable-cow/lib/canonical-weth/src/\",\":composable-cow/=lib/composable-cow/\",\":cowprotocol/=lib/composable-cow/lib/cowprotocol/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":helpers/=lib/composable-cow/lib/balancer/src/lib/helpers/\",\":math/=lib/composable-cow/lib/balancer/src/lib/math/\",\":murky/=lib/composable-cow/lib/murky/src/\",\":openzeppelin-contracts/=lib/composable-cow/lib/murky/lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin/\",\":safe/=lib/composable-cow/lib/safe/\",\":uniswap-v2-core/=lib/uniswap-v2-core/contracts/\",\"lib/composable-cow:@openzeppelin/=lib/openzeppelin/contracts/\",\"lib/composable-cow:@openzeppelin/contracts/=lib/openzeppelin/contracts/\",\"lib/composable-cow:cowprotocol/=lib/composable-cow/lib/cowprotocol/src/contracts/\",\"lib/composable-cow:safe/=lib/composable-cow/lib/safe/contracts/\"]},\"sources\":{\"lib/composable-cow/lib/cowprotocol/src/contracts/libraries/GPv2Interaction.sol\":{\"keccak256\":\"0xb950f05f76ac8044b82314ea5510941fdbc0f0e76e7f159023d435652b429528\",\"license\":\"LGPL-3.0-or-later\",\"urls\":[\"bzz-raw://c081155e1b18c060aaab781b4887744413efffdfc55ce190db45c321444f165f\",\"dweb:/ipfs/QmbK3Qu7ZgwBfx2Es5EQcvG6q2srkHjzfNK2ziQ4ojxLSF\"]},\"lib/composable-cow/lib/cowprotocol/src/contracts/libraries/GPv2Order.sol\":{\"keccak256\":\"0xffd0cc3de3209aa38045d57def570ccbde028a39a54b00c696dbe19f4f6d7f9f\",\"license\":\"LGPL-3.0-or-later\",\"urls\":[\"bzz-raw://5714a47cae551d3364bfc6a753d92822b29d277298e55942a2814ed1e2afd87d\",\"dweb:/ipfs/QmS2G8ftdhk11qoSYHX8twZK5vFArhcnVVe6gy5UGTvXmg\"]},\"lib/composable-cow/lib/safe/contracts/Safe.sol\":{\"keccak256\":\"0xbab2f7bec33283e349342e7b23f5191c678c64fe02065bac4f4f44fb3f5d2638\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://f95884e85691d49ba3efb9b2a160466fed17377bfa92fc8bf5923f3c61e99119\",\"dweb:/ipfs/QmQjhP9RnB3Cj3DNpWLzWqqvRdKBya6Efx6xzmRrwLqjm9\"]},\"lib/composable-cow/lib/safe/contracts/base/Executor.sol\":{\"keccak256\":\"0xf0be832e7529e92000544170a5529d73666a9b5e836b30c6f2ed6ef7d7d8c94a\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://710022b40c9f78a5b55b97f6ce600e4834df2ddd36bf714974d953883c82d58c\",\"dweb:/ipfs/QmbdJNKH5opevm7HxQKQAe6W7dQTgSHKa4nKvbUNGRcQQp\"]},\"lib/composable-cow/lib/safe/contracts/base/FallbackManager.sol\":{\"keccak256\":\"0x646b3088f15af8b4f71ac5eeffaa24ce0c1abed5f494f90368208b09e35d5165\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://7975be46d228510c70659b18076aecb3b0e7331b4d3a162444304145143bdc6e\",\"dweb:/ipfs/QmRRbZrWUnoky6pVo8zMUzCTsshR4sZ2FjR13s8vyAb8dV\"]},\"lib/composable-cow/lib/safe/contracts/base/GuardManager.sol\":{\"keccak256\":\"0xedfc7c830ab35e52d1208986b253f3422c2f0ca68054c10819fb348fcc6ccf5d\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://3ff8a4194d1160d2e23142937bc9d7eac7b6b553b1ee226390a0df07ebac1b64\",\"dweb:/ipfs/QmSw8Y7z4TQrUTEosdWqcug7TUv9Tg1kxqMKHd7RuTnyzx\"]},\"lib/composable-cow/lib/safe/contracts/base/ModuleManager.sol\":{\"keccak256\":\"0xd71b0d56dce386fa6f67c51061face071b2c7b03ec535d68717e2538ec47113a\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://30812896d9f57cae84a432c67fbb3007d566071ec203b2992f1c0f762722df0d\",\"dweb:/ipfs/QmRyJ3JbsUwDQxQDTrqDDX4qNtVu7XiW8cD8WP5kgNJGGz\"]},\"lib/composable-cow/lib/safe/contracts/base/OwnerManager.sol\":{\"keccak256\":\"0xec9799093eb7a73461cd5e563198751ee222f956f754ea622a03fe953e515b2c\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://5729c58b14e7b656c71dd3377e9519c0d34ef8c04851a9a21c3d62393e4fae7a\",\"dweb:/ipfs/QmRRtfFpNqvdANny9TYBr8rA3HbT1egUCpb2uXALMHkVxK\"]},\"lib/composable-cow/lib/safe/contracts/common/Enum.sol\":{\"keccak256\":\"0x4ff3008926a118e9f36e6747facc39dd13168e0d00f516888ae966ec20766453\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://385929800d1c0f92eb165fcf37a9e28b395b17d8b74f74755654d3a096a0fc34\",\"dweb:/ipfs/QmagieLuN2jrp2oJHFyZuyz65Sh1CcupnXSEKypGFS5Gvo\"]},\"lib/composable-cow/lib/safe/contracts/common/NativeCurrencyPaymentFallback.sol\":{\"keccak256\":\"0x3ddcd4130c67326033dcf773d2d87d7147e3a8386993ea3ab3f1c38da406adba\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://740a729397b6a0d903f4738a50e856d4e5039555024937b148d97529525dbfa9\",\"dweb:/ipfs/QmQJuNVvHbkeJ6jjd75D8FsZBPXH6neoGBZdQgtsA82E7g\"]},\"lib/composable-cow/lib/safe/contracts/common/SecuredTokenTransfer.sol\":{\"keccak256\":\"0x1eb8c3601538b73dd6a823ac4fca49bb8adc97d1302a936622156636c971eb05\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://c26495b1fe9229ea17f90b70f295030880d629b9ea3016ea20b634983865f7b3\",\"dweb:/ipfs/QmTc1UmKcynkKn8DeviLMuy6scxNvAVSdLoX4ndUtdEL9N\"]},\"lib/composable-cow/lib/safe/contracts/common/SelfAuthorized.sol\":{\"keccak256\":\"0xfb0e176bb208e047a234fe757e2acd13787e27879570b8544547ac787feb5f13\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://8e9a317f0c3c02ab1d6c38039bff2b3e0c97f4dc9d229d3d9149c1af1c5023b3\",\"dweb:/ipfs/QmNcZjNChsuXF34T6f3Zu7i3tnqvKN4NyWBWZ4tXLH9kMu\"]},\"lib/composable-cow/lib/safe/contracts/common/SignatureDecoder.sol\":{\"keccak256\":\"0x2a3baf0efa1585ddf2276505c6d34fa16f01cafff1288e40110d5e67fb459c7c\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://00cdded3068b9051ee0a966f40926fbc57dbe7ef8bf4285db3740f9d50468c80\",\"dweb:/ipfs/QmcP5hKmaRqBe7TpgoXtncZqsNKKdCCKxZgXoxEL4Nj5F4\"]},\"lib/composable-cow/lib/safe/contracts/common/Singleton.sol\":{\"keccak256\":\"0xcab7c6e5fb6d7295a9343f72fec26a2f632ddfe220a6f267b5c5a1eb2f9bce50\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://dd1c31d5787ef590a60f6b0dbc74d09e6fe4d3ad2f0529940d662bf315521cde\",\"dweb:/ipfs/QmSAS5DYrGksJe4cPQ4wLrveXa1CjxAuEiohcLpPG5h2bo\"]},\"lib/composable-cow/lib/safe/contracts/common/StorageAccessible.sol\":{\"keccak256\":\"0x2c5412a8f014db332322a6b24ee3cedce15dca17a721ae49fdef368568d4391e\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://e775f267d3e60ebe452d9533f46a0eb1f1dc4593d1bcb553e86cea205a5f361e\",\"dweb:/ipfs/QmQdYDHGQsiMx1AADWRhX7tduU9ycTzrT5q3zBWvphXzKZ\"]},\"lib/composable-cow/lib/safe/contracts/external/SafeMath.sol\":{\"keccak256\":\"0x5f856674d9be11344c5899deb43364e19baa75bc881cada4c159938270b2bd89\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://351c66e5fe92c0a51f79d133521545dabdd3f756312a7b1428c1fc813c512a1c\",\"dweb:/ipfs/QmdnrRmgef8SdamEU6fVEqFD5RQwXeDFTfQuZEfX2vxC4x\"]},\"lib/composable-cow/lib/safe/contracts/handler/ExtensibleFallbackHandler.sol\":{\"keccak256\":\"0x7e511290dae21c9b1710c9250320d9b98ffd71c9501af354814485b58e1b64e9\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://3e55ba23bde90d2cdd07baa7172ea41bdc1d638bc7b6eb5dce03189d86412515\",\"dweb:/ipfs/QmbxH73sqooeQL8ehsP2FDoXhLBoPs3wr3nod6ZgJwVcFV\"]},\"lib/composable-cow/lib/safe/contracts/handler/HandlerContext.sol\":{\"keccak256\":\"0x3e105ebac003af9c8d34e3eed517ff0355d5f487e17478c85df0f225b04846f5\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://657bec347d746453883c461a3d9a2275bf2b99625dcaef0960e1c0276c3d56c4\",\"dweb:/ipfs/QmUGj8Tzs1CsmUf63LbTMK81EEGtYYnWKLGdHHtoYCd9CF\"]},\"lib/composable-cow/lib/safe/contracts/handler/extensible/Base.sol\":{\"keccak256\":\"0xe5b71121b0020728158ee60756982e74809f9d77cb294a6d65930bff09d84d15\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://fd7fd2702b31fc8569a9986a476dd9fe9aa76624d0da6d832547f624426925f9\",\"dweb:/ipfs/QmWjYGtW38Fnwvm8qFvoJYhz2nTuySGkHouwRF3eksd6Nh\"]},\"lib/composable-cow/lib/safe/contracts/handler/extensible/ERC165Handler.sol\":{\"keccak256\":\"0x6e19ba1deb09a34cca28891bfefd853697b808dfb8a9cddd4051d3058d3eb718\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://0b1059e752bd142160a4fbe8ee08377a50902d31b8b909df002480d191af0cf4\",\"dweb:/ipfs/QmbuUmvgoodsZGgqR793duEWF5t7h6USAXfpr2N1VvBmeP\"]},\"lib/composable-cow/lib/safe/contracts/handler/extensible/FallbackHandler.sol\":{\"keccak256\":\"0xbe7db6cbdb034c9aee1eae12200ab2e94fa4743ae08dbba2f1a001c4b62f3e0b\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://4fbba0ea04349873b38f7c7104d0a88ffd6e7ec399a3fdd0e1297ce12eebb19e\",\"dweb:/ipfs/QmYiDukcX2y7ratxsMX6hLMKzGQTD67CKLpuiSpgm1HGue\"]},\"lib/composable-cow/lib/safe/contracts/handler/extensible/MarshalLib.sol\":{\"keccak256\":\"0x531476118b7948b06a0c7094badd6f1ae33ae2ddca815110030e87ee62c4a895\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://f21ad2619b5bcbc977c5943d2f668e8bfb9ef6968db1193415e046171a5a150a\",\"dweb:/ipfs/QmYZeu3vr6eRWjeYp8GvWSVRLm9baFbTyEGgAy2hMAqbLX\"]},\"lib/composable-cow/lib/safe/contracts/handler/extensible/SignatureVerifierMuxer.sol\":{\"keccak256\":\"0xc60a1d55ff0cf532a44bd864683719e3d6e1fa6d20d4c77812e21c33afecf304\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://298c7efe668a4ca8d3b712770973931d604c84304aececd621f0350d7d293b68\",\"dweb:/ipfs/QmVcNdQ7ZsnmDgSX8TFRLHk4HZUXH86u2akAM5q3g1PFfZ\"]},\"lib/composable-cow/lib/safe/contracts/handler/extensible/TokenCallbacks.sol\":{\"keccak256\":\"0xfb0f8f01a7191ab358f196a7e055441ede00f36805f12c579a742a5cd3c4f8d7\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://0d485ea9fc430a89953ffe2d2c7032b5a330f086bbb784e81eb6b00a692f6438\",\"dweb:/ipfs/QmNofKrkU9VTtGMN9Rc6js2jyUscSFxce8kjBz5rZL4RSJ\"]},\"lib/composable-cow/lib/safe/contracts/interfaces/ERC1155TokenReceiver.sol\":{\"keccak256\":\"0x87e62665c041cade64e753ecdccf931cb100ab6e4bcc98769c1e6474be9db493\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://59ca1157dcfe19c72b9d1244a6ae5ec70fee9793d4d8af523b70f22ae567d55c\",\"dweb:/ipfs/QmfE3kv73QuQWAWQND927LWVHVLCp19m1mLUvxVYJDEFZM\"]},\"lib/composable-cow/lib/safe/contracts/interfaces/ERC721TokenReceiver.sol\":{\"keccak256\":\"0x96c4c5457fede2d4c6012011dfda36f8e8ffdb7388468f2dddb35661538bf479\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://99a54737bc23722f79ec9cf9de63ba35b556a61df453eb332f3cac783503f26c\",\"dweb:/ipfs/QmbLW5C2RhoLbwDWEPtTKpyYE5apT9B3q4U11PZG3wSM1n\"]},\"lib/composable-cow/lib/safe/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0x779ed3893a8812e383670b755f65c7727e9343dadaa4d7a4aa7f4aa35d859fdb\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://bb2039e1459ace1e68761e873632fc339866332f9f5ecb7452a0bc3a3b847e89\",\"dweb:/ipfs/QmYXvDQXJnDkXFvsvKLyZXaAv4x42qvtbtmwHftP4RKX38\"]},\"lib/composable-cow/lib/safe/contracts/interfaces/ISignatureValidator.sol\":{\"keccak256\":\"0x2459cb3ed73ecb80e1e7a6508d09a58cc59570b049f77042f669dedfcc5f6457\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://3c4a1371948b11f78171bc4ae4fd169a1eec11e5c4b273eb2c54bc030a1aae25\",\"dweb:/ipfs/QmPuztatXZYVS65n8YbCyccJFZYPP6zQfBQ8tTY27pB978\"]},\"lib/composable-cow/src/BaseConditionalOrder.sol\":{\"keccak256\":\"0x510558386b92b1d5961d8158ae6e3288a1d520c03123d109042a5ec3290b9588\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e071465250cbc11d946f422f4ff774d757291cac00f4c69fbac1d1e34cdae402\",\"dweb:/ipfs/QmUF2qNwJhvs3GeWmsWnL6y21eL6mb3QEW7EPYY7NZc25v\"]},\"lib/composable-cow/src/ComposableCoW.sol\":{\"keccak256\":\"0x565c6fabc8a1e185acfb4539baeb7e3cabb004b54da2c777cbdbb3c98dbd6a52\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://2b876b6b4a69f69b7f9445e67a0e60dd7a65f028d54ba9c4c8c983a00ee23642\",\"dweb:/ipfs/Qmf95tsR515WFv2yBKp4NzhFc9xvfZRtS194Lq7SY2r7zC\"]},\"lib/composable-cow/src/interfaces/IConditionalOrder.sol\":{\"keccak256\":\"0x52c9a2b5d5cc7345fe4b4c039af88c5621bc7c6059534cc7c76b77833aafae7b\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://1660e1510b82216e38b669f16b69f4a37b012b00655d0fc6794e4d77d2182699\",\"dweb:/ipfs/QmNiZ7rMT74sKT9d6SUEnKXiWjaYLL8nAzSdLBXBAzYNmZ\"]},\"lib/composable-cow/src/interfaces/ISwapGuard.sol\":{\"keccak256\":\"0x60abdef709d22cb95e4b1d4680cb70d5286cfb5aa71ec65868cc44164ef8790f\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://7593245e22ffc533a073891affdbb003fa56eaa5ef7f0202a673b52968ad7ed5\",\"dweb:/ipfs/QmRhAvNzbHp8qfrw7eHZP6EDWw42tXMXSV3KuyhyxFy3Nx\"]},\"lib/composable-cow/src/interfaces/IValueFactory.sol\":{\"keccak256\":\"0x3304ef8a0a1727258ac8278bf5426daeac37ece4653eaaff87b15143814a8122\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://9934d278069dd9474065777833a81e65af227b85d350b6c1f012b812101be9de\",\"dweb:/ipfs/QmcMBdvY7wLs92FCyutDGQGtHnYryjnaykREvDNBNM8Yih\"]},\"lib/composable-cow/src/types/ConditionalOrdersUtilsLib.sol\":{\"keccak256\":\"0x38e4ce4fc58c018f510ee45d78ae49253e8aa70fdf559d83ebb6c838c6b47aae\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a38ccd5b8ce2895a77b7474b1ac36ebfccc975b3839f6d3bfef72700f8f6f777\",\"dweb:/ipfs/QmSfs5zZ4U14NkZYSqAFUBcuKGjyfMM5Dp2sbj14FmVYPf\"]},\"lib/composable-cow/src/vendored/CoWSettlement.sol\":{\"keccak256\":\"0x4e4e317b24017cd87eb11d16368b8c06ec19306d31946c330a86f9f136df38d7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://34b9b2fc2c89e60497457cd812da9c53718c15ddfbf70f6e11832d22092c1840\",\"dweb:/ipfs/QmYFzaynWZfdpmFRf2dZrQ32Ep53AtQDd5fTE3a89xVkaR\"]},\"lib/openzeppelin/contracts/interfaces/IERC1271.sol\":{\"keccak256\":\"0x0705a4b1b86d7b0bd8432118f226ba139c44b9dcaba0a6eafba2dd7d0639c544\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c45b821ef9e882e57c256697a152e108f0f2ad6997609af8904cae99c9bd422e\",\"dweb:/ipfs/QmRKCJW6jjzR5UYZcLpGnhEJ75UVbH6EHkEa49sWx2SKng\"]},\"lib/openzeppelin/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0x6ebf1944ab804b8660eb6fc52f9fe84588cee01c2566a69023e59497e7d27f45\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2900536cdadec954ced8789a9d1ed4b5e640029e1424e91fd5b88026486f4d45\",\"dweb:/ipfs/QmUMUX7CuYoiHvFkhifqtXGaciw2wnm4t9sAoPzETZ3Gbq\"]},\"lib/openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bd39944e8fc06be6dbe2dd1d8449b5336e23c6a7ba3e8e9ae5ae0f37f35283f5\",\"dweb:/ipfs/QmPV3FGYjVwvKSgAXKUN3r9T9GwniZz83CxBpM7vyj2G53\"]},\"lib/openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"keccak256\":\"0xec63854014a5b4f2b3290ab9103a21bdf902a508d0f41a8573fea49e98bf571a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bc5b5dc12fbc4002f282eaa7a5f06d8310ed62c1c77c5770f6283e058454c39a\",\"dweb:/ipfs/Qme9rE2wS3yBuyJq9GgbmzbsBQsW2M2sVFqYYLw7bosGrv\"]},\"lib/openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0xabefac93435967b4d36a4fabcbdbb918d1f0b7ae3c3d85bc30923b326c927ed1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9d213d3befca47da33f6db0310826bcdb148299805c10d77175ecfe1d06a9a68\",\"dweb:/ipfs/QmRgCn6SP1hbBkExUADFuDo8xkT4UU47yjNF5FhCeRbQmS\"]},\"lib/openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2455248c8ddd9cc6a7af76a13973cddf222072427e7b0e2a7d1aff345145e931\",\"dweb:/ipfs/QmfYjnjRbWqYpuxurqveE6HtzsY1Xx323J428AKQgtBJZm\"]},\"lib/openzeppelin/contracts/utils/cryptography/MerkleProof.sol\":{\"keccak256\":\"0xcf688741f79f4838d5301dcf72d0af9eff11bbab6ab0bb112ad144c7fb672dac\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://85d9c87a481fe99fd28a146c205da0867ef7e1b7edbe0036abc86d2e64eb1f04\",\"dweb:/ipfs/QmR7m1zWQNfZHUKTtqnjoCjCBbNFcjCxV27rxf6iMfhVtG\"]},\"lib/openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cc8841b3cd48ad125e2f46323c8bad3aa0e88e399ec62acb9e57efa7e7c8058c\",\"dweb:/ipfs/QmSqE4mXHA2BXW58deDbXE8MTcsL5JSKNDbm23sVQxRLPS\"]},\"src/ConstantProduct.sol\":{\"keccak256\":\"0x51571c926c65861736c96ca0396e4d806d7d04e32608ed8567f1deb86d85c115\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://6ac849b37d6791a1e4f52295720cb6771044c45b613f1308a438e5294ddff085\",\"dweb:/ipfs/QmeftQAdXrQcbL9oV3LaTENX65jjFnGk6zV1oPn4kGfqBf\"]},\"src/ConstantProductFactory.sol\":{\"keccak256\":\"0xab972f93d38a733f8608bbf139b4991de9a184a7f727d4e965ed1702d25682c3\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://1235406c1be8486952fec59b6b8ad3e23e3d4bd0891b32b58a87e31ae3bb5ec3\",\"dweb:/ipfs/QmbonoF2yhCqC8tiqS84oaYFkhBHQYGgqmbxexBc82VUco\"]},\"src/interfaces/IPriceOracle.sol\":{\"keccak256\":\"0xf954ab9dc44a0ce3612b65d803b59c3fe1f64803870328580c36802460c8c29e\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://7cef4a090daa870e3c8cfa5d6498efae96427d4fe4e1a2784d26c088eea920e2\",\"dweb:/ipfs/QmU56CEHqif11NaomtVBNqrBTsV6CPPvjfN88SCe7V1Uxu\"]},\"src/interfaces/ISettlement.sol\":{\"keccak256\":\"0x2d7d80f9b93937afe43cd481ed42741055110a24883f3aeda9a96009af638661\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://b4df5b8642906abbf703364abf9d494ab5009e3cd26cf984333d6ebcdec472cd\",\"dweb:/ipfs/QmWifdZWnqVYHEYR2VttRpJdya97AayMExaMmEaFVByKQq\"]},\"src/interfaces/IWatchtowerCustomErrors.sol\":{\"keccak256\":\"0x2dabcdecbfb1d6f50d7281797703afd9f30f580e9124b395f653a509b3c53611\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://8af90375b167d9a1b414c5524a0d5c06659848c6b7747ed3299861b723bce70a\",\"dweb:/ipfs/QmZxan4Ln1Yaau6nXRSXvkUiK4TYC1LUsSvhWsdCmNfnmQ\"]}},\"version\":1}", - "metadata": { - "compiler": { - "version": "0.8.25+commit.b61c2a91" - }, - "language": "Solidity", - "output": { - "abi": [ - { - "inputs": [ - { - "internalType": "contract ISettlement", - "name": "_settler", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "type": "error", - "name": "OnlyOwnerCanCall" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "type": "error", - "name": "OrderNotValid" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address", - "indexed": true - }, - { - "internalType": "struct IConditionalOrder.ConditionalOrderParams", - "name": "params", - "type": "tuple", - "components": [ - { - "internalType": "contract IConditionalOrder", - "name": "handler", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "salt", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "staticInput", - "type": "bytes" - } - ], - "indexed": false - } - ], - "type": "event", - "name": "ConditionalOrderCreated", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "contract ConstantProduct", - "name": "amm", - "type": "address", - "indexed": true - }, - { - "internalType": "address", - "name": "owner", - "type": "address", - "indexed": true - }, - { - "internalType": "contract IERC20", - "name": "token0", - "type": "address", - "indexed": false - }, - { - "internalType": "contract IERC20", - "name": "token1", - "type": "address", - "indexed": false - } - ], - "type": "event", - "name": "Deployed", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "contract ConstantProduct", - "name": "amm", - "type": "address", - "indexed": true - } - ], - "type": "event", - "name": "TradingDisabled", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "ammOwner", - "type": "address" - }, - { - "internalType": "contract IERC20", - "name": "token0", - "type": "address" - }, - { - "internalType": "contract IERC20", - "name": "token1", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function", - "name": "ammDeterministicAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ] - }, - { - "inputs": [ - { - "internalType": "contract IERC20", - "name": "token0", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount0", - "type": "uint256" - }, - { - "internalType": "contract IERC20", - "name": "token1", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount1", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "minTradedToken0", - "type": "uint256" - }, - { - "internalType": "contract IPriceOracle", - "name": "priceOracle", - "type": "address" - }, - { - "internalType": "bytes", - "name": "priceOracleData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "appData", - "type": "bytes32" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "create", - "outputs": [ - { - "internalType": "contract ConstantProduct", - "name": "amm", - "type": "address" - } - ] - }, - { - "inputs": [ - { - "internalType": "contract ConstantProduct", - "name": "amm", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount0", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amount1", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "deposit" - }, - { - "inputs": [ - { - "internalType": "contract ConstantProduct", - "name": "amm", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "disableTrading" - }, - { - "inputs": [ - { - "internalType": "contract ConstantProduct", - "name": "amm", - "type": "address" - }, - { - "internalType": "struct IConditionalOrder.ConditionalOrderParams", - "name": "params", - "type": "tuple", - "components": [ - { - "internalType": "contract IConditionalOrder", - "name": "handler", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "salt", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "staticInput", - "type": "bytes" - } - ] - }, - { - "internalType": "bytes", - "name": "", - "type": "bytes" - }, - { - "internalType": "bytes32[]", - "name": "", - "type": "bytes32[]" - } - ], - "stateMutability": "view", - "type": "function", - "name": "getTradeableOrderWithSignature", - "outputs": [ - { - "internalType": "struct GPv2Order.Data", - "name": "order", - "type": "tuple", - "components": [ - { - "internalType": "contract IERC20", - "name": "sellToken", - "type": "address" - }, - { - "internalType": "contract IERC20", - "name": "buyToken", - "type": "address" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "uint256", - "name": "sellAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "buyAmount", - "type": "uint256" - }, - { - "internalType": "uint32", - "name": "validTo", - "type": "uint32" - }, - { - "internalType": "bytes32", - "name": "appData", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "feeAmount", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "kind", - "type": "bytes32" - }, - { - "internalType": "bool", - "name": "partiallyFillable", - "type": "bool" - }, - { - "internalType": "bytes32", - "name": "sellTokenBalance", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "buyTokenBalance", - "type": "bytes32" - } - ] - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ] - }, - { - "inputs": [ - { - "internalType": "contract ConstantProduct", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function", - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "settler", - "outputs": [ - { - "internalType": "contract ISettlement", - "name": "", - "type": "address" - } - ] - }, - { - "inputs": [ - { - "internalType": "contract ConstantProduct", - "name": "amm", - "type": "address" - }, - { - "internalType": "uint256", - "name": "minTradedToken0", - "type": "uint256" - }, - { - "internalType": "contract IPriceOracle", - "name": "priceOracle", - "type": "address" - }, - { - "internalType": "bytes", - "name": "priceOracleData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "appData", - "type": "bytes32" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "updateParameters" - }, - { - "inputs": [ - { - "internalType": "contract ConstantProduct", - "name": "amm", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount0", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amount1", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "withdraw" - } - ], - "devdoc": { - "kind": "dev", - "methods": { - "ammDeterministicAddress(address,address,address)": { - "params": { - "ammOwner": "The (expected) owner of the AMM.", - "token0": "The address of the first token traded by the AMM.", - "token1": "The address of the second token traded by the AMM." - }, - "returns": { - "_0": "The deterministic address at which this contract deploys a CoW AMM for the specified input parameters." - } - }, - "constructor": { - "params": { - "_settler": "The address of the GPv2Settlement contract." - } - }, - "create(address,uint256,address,uint256,uint256,address,bytes,bytes32)": { - "params": { - "amount0": "The initial amount of the first token in the pair.", - "amount1": "The initial amount of the second token in the pair.", - "appData": "The app data to pass to the AMM.", - "minTradedToken0": "The minimum amount of token0 before the AMM attempts auto-rebalance.", - "priceOracle": "The address of the price oracle to use for the AMM.", - "priceOracleData": "The data to pass to the price oracle.", - "token0": "The address of the first token in the pair.", - "token1": "The address of the second token in the pair." - }, - "returns": { - "amm": "The address of the newly deployed AMM." - } - }, - "deposit(address,uint256,uint256)": { - "params": { - "amm": "the AMM where to send the funds", - "amount0": "amount of AMM's token0 to deposit", - "amount1": "amount of AMM's token1 to deposit" - } - }, - "disableTrading(address)": { - "params": { - "amm": "The AMM for which to disable trading." - } - }, - "getTradeableOrderWithSignature(address,(address,bytes32,bytes),bytes,bytes32[])": { - "details": "Some parameters are unused as they refer to features of ComposableCoW that aren't implemented in this contract. They are still needed to let the watchtower interact with this contract in the same way as ComposableCoW.", - "params": { - "amm": "owner of the order.", - "params": "`ConditionalOrderParams` for the order; precisely, the handler must be this contract, the salt can be any value, and the static input must be the current trading parameters of the AMM." - }, - "returns": { - "order": "discrete order for submitting to CoW Protocol API", - "signature": "for submitting to CoW Protocol API" - } - }, - "updateParameters(address,uint256,address,bytes,bytes32)": { - "params": { - "amm": "The address of the AMM whose parameters to change.", - "appData": "The app data to pass to the AMM.", - "minTradedToken0": "The minimum amount of token0 before the AMM attempts auto-rebalance.", - "priceOracle": "The address of the price oracle to use for the AMM.", - "priceOracleData": "The data to pass to the price oracle." - } - }, - "withdraw(address,uint256,uint256)": { - "params": { - "amm": "the AMM whose funds to withdraw", - "amount0": "amount of AMM's token0 to withdraw", - "amount1": "amount of AMM's token1 to withdraw" - } - } - }, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "ammDeterministicAddress(address,address,address)": { - "notice": "Computes the determinisitic address of a CoW AMM deployment." - }, - "create(address,uint256,address,uint256,uint256,address,bytes,bytes32)": { - "notice": "Creates a new CoW AMM with the specified imput parameters." - }, - "deposit(address,uint256,uint256)": { - "notice": "Deposit sender's funds into the the AMM contract, assuming that the sender has approved this contract to spend both tokens." - }, - "disableTrading(address)": { - "notice": "Disable trading for an AMM managed by this contract." - }, - "getTradeableOrderWithSignature(address,(address,bytes32,bytes),bytes,bytes32[])": { - "notice": "This function exists to let the watchtower off-chain service automatically create AMM orders and post them on the orderbook. It outputs an order for the input AMM together with a valid signature." - }, - "owner(address)": { - "notice": "For each AMM created by this contract, this mapping stores its owner." - }, - "settler()": { - "notice": "The settlement contract for CoW Protocol on this network." - }, - "updateParameters(address,uint256,address,bytes,bytes32)": { - "notice": "Change the parameters used for trading on the specified AMM. Only a single order per AMM can be valid at a time, meaning that any previous order stops being tradeable." - }, - "withdraw(address,uint256,uint256)": { - "notice": "Take funds from the AMM and sends them to the owner." - } - }, - "version": 1 - } - }, - "settings": { - "remappings": [ - "@openzeppelin/=lib/composable-cow/lib/@openzeppelin/", - "@openzeppelin/contracts/=lib/composable-cow/lib/@openzeppelin/contracts/", - "balancer/=lib/composable-cow/lib/balancer/src/", - "canonical-weth/=lib/composable-cow/lib/canonical-weth/src/", - "composable-cow/=lib/composable-cow/", - "cowprotocol/=lib/composable-cow/lib/cowprotocol/", - "ds-test/=lib/forge-std/lib/ds-test/src/", - "erc4626-tests/=lib/openzeppelin/lib/erc4626-tests/", - "forge-std/=lib/forge-std/src/", - "helpers/=lib/composable-cow/lib/balancer/src/lib/helpers/", - "math/=lib/composable-cow/lib/balancer/src/lib/math/", - "murky/=lib/composable-cow/lib/murky/src/", - "openzeppelin-contracts/=lib/composable-cow/lib/murky/lib/openzeppelin-contracts/", - "openzeppelin/=lib/openzeppelin/", - "safe/=lib/composable-cow/lib/safe/", - "uniswap-v2-core/=lib/uniswap-v2-core/contracts/", - "lib/composable-cow:@openzeppelin/=lib/openzeppelin/contracts/", - "lib/composable-cow:@openzeppelin/contracts/=lib/openzeppelin/contracts/", - "lib/composable-cow:cowprotocol/=lib/composable-cow/lib/cowprotocol/src/contracts/", - "lib/composable-cow:safe/=lib/composable-cow/lib/safe/contracts/" - ], - "optimizer": { - "enabled": true, - "runs": 100000 - }, - "metadata": { - "bytecodeHash": "ipfs" - }, - "compilationTarget": { - "src/ConstantProductFactory.sol": "ConstantProductFactory" - }, - "evmVersion": "cancun", - "libraries": {} - }, - "sources": { - "lib/composable-cow/lib/cowprotocol/src/contracts/libraries/GPv2Interaction.sol": { - "keccak256": "0xb950f05f76ac8044b82314ea5510941fdbc0f0e76e7f159023d435652b429528", - "urls": [ - "bzz-raw://c081155e1b18c060aaab781b4887744413efffdfc55ce190db45c321444f165f", - "dweb:/ipfs/QmbK3Qu7ZgwBfx2Es5EQcvG6q2srkHjzfNK2ziQ4ojxLSF" - ], - "license": "LGPL-3.0-or-later" - }, - "lib/composable-cow/lib/cowprotocol/src/contracts/libraries/GPv2Order.sol": { - "keccak256": "0xffd0cc3de3209aa38045d57def570ccbde028a39a54b00c696dbe19f4f6d7f9f", - "urls": [ - "bzz-raw://5714a47cae551d3364bfc6a753d92822b29d277298e55942a2814ed1e2afd87d", - "dweb:/ipfs/QmS2G8ftdhk11qoSYHX8twZK5vFArhcnVVe6gy5UGTvXmg" - ], - "license": "LGPL-3.0-or-later" - }, - "lib/composable-cow/lib/safe/contracts/Safe.sol": { - "keccak256": "0xbab2f7bec33283e349342e7b23f5191c678c64fe02065bac4f4f44fb3f5d2638", - "urls": [ - "bzz-raw://f95884e85691d49ba3efb9b2a160466fed17377bfa92fc8bf5923f3c61e99119", - "dweb:/ipfs/QmQjhP9RnB3Cj3DNpWLzWqqvRdKBya6Efx6xzmRrwLqjm9" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/base/Executor.sol": { - "keccak256": "0xf0be832e7529e92000544170a5529d73666a9b5e836b30c6f2ed6ef7d7d8c94a", - "urls": [ - "bzz-raw://710022b40c9f78a5b55b97f6ce600e4834df2ddd36bf714974d953883c82d58c", - "dweb:/ipfs/QmbdJNKH5opevm7HxQKQAe6W7dQTgSHKa4nKvbUNGRcQQp" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/base/FallbackManager.sol": { - "keccak256": "0x646b3088f15af8b4f71ac5eeffaa24ce0c1abed5f494f90368208b09e35d5165", - "urls": [ - "bzz-raw://7975be46d228510c70659b18076aecb3b0e7331b4d3a162444304145143bdc6e", - "dweb:/ipfs/QmRRbZrWUnoky6pVo8zMUzCTsshR4sZ2FjR13s8vyAb8dV" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/base/GuardManager.sol": { - "keccak256": "0xedfc7c830ab35e52d1208986b253f3422c2f0ca68054c10819fb348fcc6ccf5d", - "urls": [ - "bzz-raw://3ff8a4194d1160d2e23142937bc9d7eac7b6b553b1ee226390a0df07ebac1b64", - "dweb:/ipfs/QmSw8Y7z4TQrUTEosdWqcug7TUv9Tg1kxqMKHd7RuTnyzx" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/base/ModuleManager.sol": { - "keccak256": "0xd71b0d56dce386fa6f67c51061face071b2c7b03ec535d68717e2538ec47113a", - "urls": [ - "bzz-raw://30812896d9f57cae84a432c67fbb3007d566071ec203b2992f1c0f762722df0d", - "dweb:/ipfs/QmRyJ3JbsUwDQxQDTrqDDX4qNtVu7XiW8cD8WP5kgNJGGz" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/base/OwnerManager.sol": { - "keccak256": "0xec9799093eb7a73461cd5e563198751ee222f956f754ea622a03fe953e515b2c", - "urls": [ - "bzz-raw://5729c58b14e7b656c71dd3377e9519c0d34ef8c04851a9a21c3d62393e4fae7a", - "dweb:/ipfs/QmRRtfFpNqvdANny9TYBr8rA3HbT1egUCpb2uXALMHkVxK" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/common/Enum.sol": { - "keccak256": "0x4ff3008926a118e9f36e6747facc39dd13168e0d00f516888ae966ec20766453", - "urls": [ - "bzz-raw://385929800d1c0f92eb165fcf37a9e28b395b17d8b74f74755654d3a096a0fc34", - "dweb:/ipfs/QmagieLuN2jrp2oJHFyZuyz65Sh1CcupnXSEKypGFS5Gvo" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/common/NativeCurrencyPaymentFallback.sol": { - "keccak256": "0x3ddcd4130c67326033dcf773d2d87d7147e3a8386993ea3ab3f1c38da406adba", - "urls": [ - "bzz-raw://740a729397b6a0d903f4738a50e856d4e5039555024937b148d97529525dbfa9", - "dweb:/ipfs/QmQJuNVvHbkeJ6jjd75D8FsZBPXH6neoGBZdQgtsA82E7g" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/common/SecuredTokenTransfer.sol": { - "keccak256": "0x1eb8c3601538b73dd6a823ac4fca49bb8adc97d1302a936622156636c971eb05", - "urls": [ - "bzz-raw://c26495b1fe9229ea17f90b70f295030880d629b9ea3016ea20b634983865f7b3", - "dweb:/ipfs/QmTc1UmKcynkKn8DeviLMuy6scxNvAVSdLoX4ndUtdEL9N" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/common/SelfAuthorized.sol": { - "keccak256": "0xfb0e176bb208e047a234fe757e2acd13787e27879570b8544547ac787feb5f13", - "urls": [ - "bzz-raw://8e9a317f0c3c02ab1d6c38039bff2b3e0c97f4dc9d229d3d9149c1af1c5023b3", - "dweb:/ipfs/QmNcZjNChsuXF34T6f3Zu7i3tnqvKN4NyWBWZ4tXLH9kMu" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/common/SignatureDecoder.sol": { - "keccak256": "0x2a3baf0efa1585ddf2276505c6d34fa16f01cafff1288e40110d5e67fb459c7c", - "urls": [ - "bzz-raw://00cdded3068b9051ee0a966f40926fbc57dbe7ef8bf4285db3740f9d50468c80", - "dweb:/ipfs/QmcP5hKmaRqBe7TpgoXtncZqsNKKdCCKxZgXoxEL4Nj5F4" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/common/Singleton.sol": { - "keccak256": "0xcab7c6e5fb6d7295a9343f72fec26a2f632ddfe220a6f267b5c5a1eb2f9bce50", - "urls": [ - "bzz-raw://dd1c31d5787ef590a60f6b0dbc74d09e6fe4d3ad2f0529940d662bf315521cde", - "dweb:/ipfs/QmSAS5DYrGksJe4cPQ4wLrveXa1CjxAuEiohcLpPG5h2bo" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/common/StorageAccessible.sol": { - "keccak256": "0x2c5412a8f014db332322a6b24ee3cedce15dca17a721ae49fdef368568d4391e", - "urls": [ - "bzz-raw://e775f267d3e60ebe452d9533f46a0eb1f1dc4593d1bcb553e86cea205a5f361e", - "dweb:/ipfs/QmQdYDHGQsiMx1AADWRhX7tduU9ycTzrT5q3zBWvphXzKZ" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/external/SafeMath.sol": { - "keccak256": "0x5f856674d9be11344c5899deb43364e19baa75bc881cada4c159938270b2bd89", - "urls": [ - "bzz-raw://351c66e5fe92c0a51f79d133521545dabdd3f756312a7b1428c1fc813c512a1c", - "dweb:/ipfs/QmdnrRmgef8SdamEU6fVEqFD5RQwXeDFTfQuZEfX2vxC4x" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/handler/ExtensibleFallbackHandler.sol": { - "keccak256": "0x7e511290dae21c9b1710c9250320d9b98ffd71c9501af354814485b58e1b64e9", - "urls": [ - "bzz-raw://3e55ba23bde90d2cdd07baa7172ea41bdc1d638bc7b6eb5dce03189d86412515", - "dweb:/ipfs/QmbxH73sqooeQL8ehsP2FDoXhLBoPs3wr3nod6ZgJwVcFV" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/handler/HandlerContext.sol": { - "keccak256": "0x3e105ebac003af9c8d34e3eed517ff0355d5f487e17478c85df0f225b04846f5", - "urls": [ - "bzz-raw://657bec347d746453883c461a3d9a2275bf2b99625dcaef0960e1c0276c3d56c4", - "dweb:/ipfs/QmUGj8Tzs1CsmUf63LbTMK81EEGtYYnWKLGdHHtoYCd9CF" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/handler/extensible/Base.sol": { - "keccak256": "0xe5b71121b0020728158ee60756982e74809f9d77cb294a6d65930bff09d84d15", - "urls": [ - "bzz-raw://fd7fd2702b31fc8569a9986a476dd9fe9aa76624d0da6d832547f624426925f9", - "dweb:/ipfs/QmWjYGtW38Fnwvm8qFvoJYhz2nTuySGkHouwRF3eksd6Nh" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/handler/extensible/ERC165Handler.sol": { - "keccak256": "0x6e19ba1deb09a34cca28891bfefd853697b808dfb8a9cddd4051d3058d3eb718", - "urls": [ - "bzz-raw://0b1059e752bd142160a4fbe8ee08377a50902d31b8b909df002480d191af0cf4", - "dweb:/ipfs/QmbuUmvgoodsZGgqR793duEWF5t7h6USAXfpr2N1VvBmeP" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/handler/extensible/FallbackHandler.sol": { - "keccak256": "0xbe7db6cbdb034c9aee1eae12200ab2e94fa4743ae08dbba2f1a001c4b62f3e0b", - "urls": [ - "bzz-raw://4fbba0ea04349873b38f7c7104d0a88ffd6e7ec399a3fdd0e1297ce12eebb19e", - "dweb:/ipfs/QmYiDukcX2y7ratxsMX6hLMKzGQTD67CKLpuiSpgm1HGue" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/handler/extensible/MarshalLib.sol": { - "keccak256": "0x531476118b7948b06a0c7094badd6f1ae33ae2ddca815110030e87ee62c4a895", - "urls": [ - "bzz-raw://f21ad2619b5bcbc977c5943d2f668e8bfb9ef6968db1193415e046171a5a150a", - "dweb:/ipfs/QmYZeu3vr6eRWjeYp8GvWSVRLm9baFbTyEGgAy2hMAqbLX" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/handler/extensible/SignatureVerifierMuxer.sol": { - "keccak256": "0xc60a1d55ff0cf532a44bd864683719e3d6e1fa6d20d4c77812e21c33afecf304", - "urls": [ - "bzz-raw://298c7efe668a4ca8d3b712770973931d604c84304aececd621f0350d7d293b68", - "dweb:/ipfs/QmVcNdQ7ZsnmDgSX8TFRLHk4HZUXH86u2akAM5q3g1PFfZ" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/handler/extensible/TokenCallbacks.sol": { - "keccak256": "0xfb0f8f01a7191ab358f196a7e055441ede00f36805f12c579a742a5cd3c4f8d7", - "urls": [ - "bzz-raw://0d485ea9fc430a89953ffe2d2c7032b5a330f086bbb784e81eb6b00a692f6438", - "dweb:/ipfs/QmNofKrkU9VTtGMN9Rc6js2jyUscSFxce8kjBz5rZL4RSJ" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/interfaces/ERC1155TokenReceiver.sol": { - "keccak256": "0x87e62665c041cade64e753ecdccf931cb100ab6e4bcc98769c1e6474be9db493", - "urls": [ - "bzz-raw://59ca1157dcfe19c72b9d1244a6ae5ec70fee9793d4d8af523b70f22ae567d55c", - "dweb:/ipfs/QmfE3kv73QuQWAWQND927LWVHVLCp19m1mLUvxVYJDEFZM" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/interfaces/ERC721TokenReceiver.sol": { - "keccak256": "0x96c4c5457fede2d4c6012011dfda36f8e8ffdb7388468f2dddb35661538bf479", - "urls": [ - "bzz-raw://99a54737bc23722f79ec9cf9de63ba35b556a61df453eb332f3cac783503f26c", - "dweb:/ipfs/QmbLW5C2RhoLbwDWEPtTKpyYE5apT9B3q4U11PZG3wSM1n" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/interfaces/IERC165.sol": { - "keccak256": "0x779ed3893a8812e383670b755f65c7727e9343dadaa4d7a4aa7f4aa35d859fdb", - "urls": [ - "bzz-raw://bb2039e1459ace1e68761e873632fc339866332f9f5ecb7452a0bc3a3b847e89", - "dweb:/ipfs/QmYXvDQXJnDkXFvsvKLyZXaAv4x42qvtbtmwHftP4RKX38" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/interfaces/ISignatureValidator.sol": { - "keccak256": "0x2459cb3ed73ecb80e1e7a6508d09a58cc59570b049f77042f669dedfcc5f6457", - "urls": [ - "bzz-raw://3c4a1371948b11f78171bc4ae4fd169a1eec11e5c4b273eb2c54bc030a1aae25", - "dweb:/ipfs/QmPuztatXZYVS65n8YbCyccJFZYPP6zQfBQ8tTY27pB978" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/src/BaseConditionalOrder.sol": { - "keccak256": "0x510558386b92b1d5961d8158ae6e3288a1d520c03123d109042a5ec3290b9588", - "urls": [ - "bzz-raw://e071465250cbc11d946f422f4ff774d757291cac00f4c69fbac1d1e34cdae402", - "dweb:/ipfs/QmUF2qNwJhvs3GeWmsWnL6y21eL6mb3QEW7EPYY7NZc25v" - ], - "license": "MIT" - }, - "lib/composable-cow/src/ComposableCoW.sol": { - "keccak256": "0x565c6fabc8a1e185acfb4539baeb7e3cabb004b54da2c777cbdbb3c98dbd6a52", - "urls": [ - "bzz-raw://2b876b6b4a69f69b7f9445e67a0e60dd7a65f028d54ba9c4c8c983a00ee23642", - "dweb:/ipfs/Qmf95tsR515WFv2yBKp4NzhFc9xvfZRtS194Lq7SY2r7zC" - ], - "license": "GPL-3.0" - }, - "lib/composable-cow/src/interfaces/IConditionalOrder.sol": { - "keccak256": "0x52c9a2b5d5cc7345fe4b4c039af88c5621bc7c6059534cc7c76b77833aafae7b", - "urls": [ - "bzz-raw://1660e1510b82216e38b669f16b69f4a37b012b00655d0fc6794e4d77d2182699", - "dweb:/ipfs/QmNiZ7rMT74sKT9d6SUEnKXiWjaYLL8nAzSdLBXBAzYNmZ" - ], - "license": "GPL-3.0" - }, - "lib/composable-cow/src/interfaces/ISwapGuard.sol": { - "keccak256": "0x60abdef709d22cb95e4b1d4680cb70d5286cfb5aa71ec65868cc44164ef8790f", - "urls": [ - "bzz-raw://7593245e22ffc533a073891affdbb003fa56eaa5ef7f0202a673b52968ad7ed5", - "dweb:/ipfs/QmRhAvNzbHp8qfrw7eHZP6EDWw42tXMXSV3KuyhyxFy3Nx" - ], - "license": "GPL-3.0" - }, - "lib/composable-cow/src/interfaces/IValueFactory.sol": { - "keccak256": "0x3304ef8a0a1727258ac8278bf5426daeac37ece4653eaaff87b15143814a8122", - "urls": [ - "bzz-raw://9934d278069dd9474065777833a81e65af227b85d350b6c1f012b812101be9de", - "dweb:/ipfs/QmcMBdvY7wLs92FCyutDGQGtHnYryjnaykREvDNBNM8Yih" - ], - "license": "GPL-3.0" - }, - "lib/composable-cow/src/types/ConditionalOrdersUtilsLib.sol": { - "keccak256": "0x38e4ce4fc58c018f510ee45d78ae49253e8aa70fdf559d83ebb6c838c6b47aae", - "urls": [ - "bzz-raw://a38ccd5b8ce2895a77b7474b1ac36ebfccc975b3839f6d3bfef72700f8f6f777", - "dweb:/ipfs/QmSfs5zZ4U14NkZYSqAFUBcuKGjyfMM5Dp2sbj14FmVYPf" - ], - "license": "MIT" - }, - "lib/composable-cow/src/vendored/CoWSettlement.sol": { - "keccak256": "0x4e4e317b24017cd87eb11d16368b8c06ec19306d31946c330a86f9f136df38d7", - "urls": [ - "bzz-raw://34b9b2fc2c89e60497457cd812da9c53718c15ddfbf70f6e11832d22092c1840", - "dweb:/ipfs/QmYFzaynWZfdpmFRf2dZrQ32Ep53AtQDd5fTE3a89xVkaR" - ], - "license": "MIT" - }, - "lib/openzeppelin/contracts/interfaces/IERC1271.sol": { - "keccak256": "0x0705a4b1b86d7b0bd8432118f226ba139c44b9dcaba0a6eafba2dd7d0639c544", - "urls": [ - "bzz-raw://c45b821ef9e882e57c256697a152e108f0f2ad6997609af8904cae99c9bd422e", - "dweb:/ipfs/QmRKCJW6jjzR5UYZcLpGnhEJ75UVbH6EHkEa49sWx2SKng" - ], - "license": "MIT" - }, - "lib/openzeppelin/contracts/interfaces/IERC20.sol": { - "keccak256": "0x6ebf1944ab804b8660eb6fc52f9fe84588cee01c2566a69023e59497e7d27f45", - "urls": [ - "bzz-raw://2900536cdadec954ced8789a9d1ed4b5e640029e1424e91fd5b88026486f4d45", - "dweb:/ipfs/QmUMUX7CuYoiHvFkhifqtXGaciw2wnm4t9sAoPzETZ3Gbq" - ], - "license": "MIT" - }, - "lib/openzeppelin/contracts/token/ERC20/IERC20.sol": { - "keccak256": "0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305", - "urls": [ - "bzz-raw://bd39944e8fc06be6dbe2dd1d8449b5336e23c6a7ba3e8e9ae5ae0f37f35283f5", - "dweb:/ipfs/QmPV3FGYjVwvKSgAXKUN3r9T9GwniZz83CxBpM7vyj2G53" - ], - "license": "MIT" - }, - "lib/openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": { - "keccak256": "0xec63854014a5b4f2b3290ab9103a21bdf902a508d0f41a8573fea49e98bf571a", - "urls": [ - "bzz-raw://bc5b5dc12fbc4002f282eaa7a5f06d8310ed62c1c77c5770f6283e058454c39a", - "dweb:/ipfs/Qme9rE2wS3yBuyJq9GgbmzbsBQsW2M2sVFqYYLw7bosGrv" - ], - "license": "MIT" - }, - "lib/openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { - "keccak256": "0xabefac93435967b4d36a4fabcbdbb918d1f0b7ae3c3d85bc30923b326c927ed1", - "urls": [ - "bzz-raw://9d213d3befca47da33f6db0310826bcdb148299805c10d77175ecfe1d06a9a68", - "dweb:/ipfs/QmRgCn6SP1hbBkExUADFuDo8xkT4UU47yjNF5FhCeRbQmS" - ], - "license": "MIT" - }, - "lib/openzeppelin/contracts/utils/Address.sol": { - "keccak256": "0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa", - "urls": [ - "bzz-raw://2455248c8ddd9cc6a7af76a13973cddf222072427e7b0e2a7d1aff345145e931", - "dweb:/ipfs/QmfYjnjRbWqYpuxurqveE6HtzsY1Xx323J428AKQgtBJZm" - ], - "license": "MIT" - }, - "lib/openzeppelin/contracts/utils/cryptography/MerkleProof.sol": { - "keccak256": "0xcf688741f79f4838d5301dcf72d0af9eff11bbab6ab0bb112ad144c7fb672dac", - "urls": [ - "bzz-raw://85d9c87a481fe99fd28a146c205da0867ef7e1b7edbe0036abc86d2e64eb1f04", - "dweb:/ipfs/QmR7m1zWQNfZHUKTtqnjoCjCBbNFcjCxV27rxf6iMfhVtG" - ], - "license": "MIT" - }, - "lib/openzeppelin/contracts/utils/math/Math.sol": { - "keccak256": "0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3", - "urls": [ - "bzz-raw://cc8841b3cd48ad125e2f46323c8bad3aa0e88e399ec62acb9e57efa7e7c8058c", - "dweb:/ipfs/QmSqE4mXHA2BXW58deDbXE8MTcsL5JSKNDbm23sVQxRLPS" - ], - "license": "MIT" - }, - "src/ConstantProduct.sol": { - "keccak256": "0x51571c926c65861736c96ca0396e4d806d7d04e32608ed8567f1deb86d85c115", - "urls": [ - "bzz-raw://6ac849b37d6791a1e4f52295720cb6771044c45b613f1308a438e5294ddff085", - "dweb:/ipfs/QmeftQAdXrQcbL9oV3LaTENX65jjFnGk6zV1oPn4kGfqBf" - ], - "license": "GPL-3.0" - }, - "src/ConstantProductFactory.sol": { - "keccak256": "0xab972f93d38a733f8608bbf139b4991de9a184a7f727d4e965ed1702d25682c3", - "urls": [ - "bzz-raw://1235406c1be8486952fec59b6b8ad3e23e3d4bd0891b32b58a87e31ae3bb5ec3", - "dweb:/ipfs/QmbonoF2yhCqC8tiqS84oaYFkhBHQYGgqmbxexBc82VUco" - ], - "license": "GPL-3.0" - }, - "src/interfaces/IPriceOracle.sol": { - "keccak256": "0xf954ab9dc44a0ce3612b65d803b59c3fe1f64803870328580c36802460c8c29e", - "urls": [ - "bzz-raw://7cef4a090daa870e3c8cfa5d6498efae96427d4fe4e1a2784d26c088eea920e2", - "dweb:/ipfs/QmU56CEHqif11NaomtVBNqrBTsV6CPPvjfN88SCe7V1Uxu" - ], - "license": "GPL-3.0" - }, - "src/interfaces/ISettlement.sol": { - "keccak256": "0x2d7d80f9b93937afe43cd481ed42741055110a24883f3aeda9a96009af638661", - "urls": [ - "bzz-raw://b4df5b8642906abbf703364abf9d494ab5009e3cd26cf984333d6ebcdec472cd", - "dweb:/ipfs/QmWifdZWnqVYHEYR2VttRpJdya97AayMExaMmEaFVByKQq" - ], - "license": "GPL-3.0" - }, - "src/interfaces/IWatchtowerCustomErrors.sol": { - "keccak256": "0x2dabcdecbfb1d6f50d7281797703afd9f30f580e9124b395f653a509b3c53611", - "urls": [ - "bzz-raw://8af90375b167d9a1b414c5524a0d5c06659848c6b7747ed3299861b723bce70a", - "dweb:/ipfs/QmZxan4Ln1Yaau6nXRSXvkUiK4TYC1LUsSvhWsdCmNfnmQ" - ], - "license": "GPL-3.0" - } - }, - "version": 1 - }, - "id": 170, - "_disabled": [ - { - "type": "function", - "name": "disableTrading", - "inputs": [ - { - "name": "amm", - "type": "address", - "internalType": "contract ConstantProduct" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "getTradeableOrderWithSignature", - "inputs": [ - { - "name": "amm", - "type": "address", - "internalType": "contract ConstantProduct" - }, - { - "name": "params", - "type": "tuple", - "internalType": "struct IConditionalOrder.ConditionalOrderParams", - "components": [ - { - "name": "handler", - "type": "address", - "internalType": "contract IConditionalOrder" - }, - { - "name": "salt", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "staticInput", - "type": "bytes", - "internalType": "bytes" - } - ] - }, - { - "name": "", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "", - "type": "bytes32[]", - "internalType": "bytes32[]" - } - ], - "outputs": [ - { - "name": "order", - "type": "tuple", - "internalType": "struct GPv2Order.Data", - "components": [ - { - "name": "sellToken", - "type": "address", - "internalType": "contract IERC20" - }, - { - "name": "buyToken", - "type": "address", - "internalType": "contract IERC20" - }, - { - "name": "receiver", - "type": "address", - "internalType": "address" - }, - { - "name": "sellAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "buyAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "validTo", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "appData", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "feeAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "kind", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "partiallyFillable", - "type": "bool", - "internalType": "bool" - }, - { - "name": "sellTokenBalance", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "buyTokenBalance", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "name": "signature", - "type": "bytes", - "internalType": "bytes" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "settler", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "contract ISettlement" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "updateParameters", - "inputs": [ - { - "name": "amm", - "type": "address", - "internalType": "contract ConstantProduct" - }, - { - "name": "minTradedToken0", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "priceOracle", - "type": "address", - "internalType": "contract IPriceOracle" - }, - { - "name": "priceOracleData", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "appData", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - } - ] -} diff --git a/contracts/artifacts/CowAmmFactoryGetter.json b/contracts/artifacts/CowAmmFactoryGetter.json deleted file mode 100644 index ac5a71b314..0000000000 --- a/contracts/artifacts/CowAmmFactoryGetter.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "abi": [ - { - "inputs": [], - "name": "FACTORY", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ] -} diff --git a/contracts/artifacts/CowAmmLegacyHelper.json b/contracts/artifacts/CowAmmLegacyHelper.json deleted file mode 100644 index 892d1e1d16..0000000000 --- a/contracts/artifacts/CowAmmLegacyHelper.json +++ /dev/null @@ -1,1085 +0,0 @@ -{ - "abi": [ - { - "type": "constructor", - "inputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "event", - "name": "COWAMMPoolCreated", - "inputs": [ - { - "name": "amm", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "InvalidArrayLength", - "inputs": [] - }, - { - "type": "error", - "name": "MathOverflowedMulDiv", - "inputs": [] - }, - { - "type": "error", - "name": "NoOrder", - "inputs": [] - }, - { - "type": "error", - "name": "PoolDoesNotExist", - "inputs": [] - }, - { - "type": "error", - "name": "PoolIsClosed", - "inputs": [] - }, - { - "type": "error", - "name": "PoolIsPaused", - "inputs": [] - }, - { - "type": "function", - "name": "factory", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "order", - "inputs": [ - { - "name": "pool", - "type": "address", - "internalType": "address" - }, - { - "name": "prices", - "type": "uint256[]", - "internalType": "uint256[]" - } - ], - "outputs": [ - { - "name": "_order", - "type": "tuple", - "internalType": "struct GPv2Order.Data", - "components": [ - { - "name": "sellToken", - "type": "address", - "internalType": "contract IERC20" - }, - { - "name": "buyToken", - "type": "address", - "internalType": "contract IERC20" - }, - { - "name": "receiver", - "type": "address", - "internalType": "address" - }, - { - "name": "sellAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "buyAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "validTo", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "appData", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "feeAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "kind", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "partiallyFillable", - "type": "bool", - "internalType": "bool" - }, - { - "name": "sellTokenBalance", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "buyTokenBalance", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "name": "preInteractions", - "type": "tuple[]", - "internalType": "struct GPv2Interaction.Data[]", - "components": [ - { - "name": "target", - "type": "address", - "internalType": "address" - }, - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "callData", - "type": "bytes", - "internalType": "bytes" - } - ] - }, - { - "name": "postInteractions", - "type": "tuple[]", - "internalType": "struct GPv2Interaction.Data[]", - "components": [ - { - "name": "target", - "type": "address", - "internalType": "address" - }, - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "callData", - "type": "bytes", - "internalType": "bytes" - } - ] - }, - { - "name": "sig", - "type": "bytes", - "internalType": "bytes" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "tokens", - "inputs": [ - { - "name": "pool", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "_tokens", - "type": "address[]", - "internalType": "address[]" - } - ], - "stateMutability": "view" - } - ], - "bytecode": "0x608060405234801561000f575f80fd5b5061001861001d565b6102ff565b46600181900361011257610044739941fd7db2003308e7ee17b04400012278f12ac66102c9565b61006173b3bf81714f704720dcb0351ff0d42eca61b069fc6102c9565b61007e73301076c36e034948a747bb61bab9cd03f62672e36102c9565b61009b73027e1cbf2c299cba5eb8a2584910d04f1a8aa4036102c9565b6100b873beef5afe88ef73337e5070ab2855d37dbf5493a46102c9565b6100d573c6b13d5e662fa0458f03995bcb824a1934aa895f6102c9565b6100f273d7cb8cc1b56356bb7b78d02e785ead28e21586606102c9565b61010f73079c868f97aed8e0d03f11e1529c3b056ff21cea6102c9565b50565b8060640361010f5761013773bc6159fd429be18206e60b3bb01d7289f905511b6102c9565b61015473e5d1aa8565f5dbfc06cde20dfd76b4c7c6d43bd56102c9565b610171739d8570ef9a519ca81daec35212f435d9843ba5646102c9565b61018e73d97c31e53f16f495715ce71e12e11b9545eedd8b6102c9565b6101ab73ff1bd3d570e3544c183ba77f5a4d3cc742c8d2b36102c9565b6101c873209d269dfd66b9cec764de7eb6fefc24f75bdd486102c9565b6101e573c37575ad8efe530fd8a79aeb0087e5872a24dabc6102c9565b610202731c7828dadade12a848f36be8e2d3146462abff686102c9565b61021f73aba5294bba7d3635c2a3e44d0e87ea7f58898fb76102c9565b61023c736eb7be972aebb6be2d9acf437cb412c0abee912b6102c9565b61025973c4d09969aad7f252c75dd352bbbd719e34ed06ad6102c9565b61027673a25af86a5dbea45e9fd70c1879489f63d081ad446102c9565b6102937357492cb6c8ee2998e9d83ddc8c713e781ffe548e6102c9565b6102b073c33e3ec14556a8e71be3097fe2dc8c0b9119c8976102c9565b61010f7377472826875953374ed3084c31a483f827987f145b6040516001600160a01b038216907f0d03834d0d86c7f57e877af40e26f176dc31bd637535d4ba153d1ac9de88a7ea905f90a250565b6156848061030c5f395ff3fe608060405234801561000f575f80fd5b506004361061006f575f3560e01c80632aec79a01161004d5780632aec79a0146100de578063c45a0155146100f1578063e48603391461011e575f80fd5b806310029daa14610073578063215702561461009b57806327242c9b146100bb575b5f80fd5b610086610081366004612462565b61013e565b60405190151581526020015b60405180910390f35b6100ae6100a9366004612462565b61050c565b60405161009291906124c9565b6100ce6100c93660046124db565b610cc6565b60405161009294939291906126e9565b6100866100ec366004612462565b61132d565b6100f9611340565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610092565b61013161012c366004612462565b611410565b6040516100929190612734565b6040517f5624b25b0000000000000000000000000000000000000000000000000000000081527f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d56004820152600160248201525f90819073ffffffffffffffffffffffffffffffffffffffff841690635624b25b906044015f60405180830381865afa1580156101d0573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610215919081019061288a565b80602001905181019061022891906128c4565b90505f732f55e8b20d0b9fefa187aa7d00b6cbe563605bf573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161490505f73fdafc9d1902f4e0b84f65f49f244b32b31013b7473ffffffffffffffffffffffffffffffffffffffff16732f55e8b20d0b9fefa187aa7d00b6cbe563605bf573ffffffffffffffffffffffffffffffffffffffff166351cad5ee87739008d19f58aabd9ed0d60971565aa8510560ab4173ffffffffffffffffffffffffffffffffffffffff1663f698da256040518163ffffffff1660e01b8152600401602060405180830381865afa15801561032a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034e91906128df565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401602060405180830381865afa1580156103ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103de91906128c4565b73ffffffffffffffffffffffffffffffffffffffff161490505f6104018661050c565b80602001905181019061041491906128f6565b90505f73fdafc9d1902f4e0b84f65f49f244b32b31013b7473ffffffffffffffffffffffffffffffffffffffff16636108c532888460405160200161045991906129cf565b604051602081830303815290604052805190602001206040518363ffffffff1660e01b81526004016104ad92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602060405180830381865afa1580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec91906129e1565b90508380156104f85750825b80156105015750805b979650505050505050565b60604660018190036107bd5773ffffffffffffffffffffffffffffffffffffffff8316739941fd7db2003308e7ee17b04400012278f12ac60361056c57604051806101e001604052806101c0815260200161482f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673b3bf81714f704720dcb0351ff0d42eca61b069fc036105c057604051806101e001604052806101c081526020016150ef6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673301076c36e034948a747bb61bab9cd03f62672e30361061457604051806101e001604052806101c0815260200161364f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673027e1cbf2c299cba5eb8a2584910d04f1a8aa4030361066857604051806101e001604052806101c08152602001612d2f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673beef5afe88ef73337e5070ab2855d37dbf5493a4036106bc57604051806101e001604052806101c081526020016142ef6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673c6b13d5e662fa0458f03995bcb824a1934aa895f0361071057604051806101e001604052806101c0815260200161412f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673d7cb8cc1b56356bb7b78d02e785ead28e21586600361076457604051806101e001604052806101c081526020016139cf6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673079c868f97aed8e0d03f11e1529c3b056ff21cea036107b857604051806101e001604052806101c081526020016149ef6101c091399392505050565b610cb1565b80606403610cb15773ffffffffffffffffffffffffffffffffffffffff831673bc6159fd429be18206e60b3bb01d7289f905511b0361081957604051806101e001604052806101c08152602001612eef6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673e5d1aa8565f5dbfc06cde20dfd76b4c7c6d43bd50361086d57604051806101e001604052806101c0815260200161466f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff8316739d8570ef9a519ca81daec35212f435d9843ba564036108c157604051806101e001604052806101c08152602001614baf6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673d97c31e53f16f495715ce71e12e11b9545eedd8b036109155760405180610240016040528061022081526020016130af61022091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673ff1bd3d570e3544c183ba77f5a4d3cc742c8d2b30361096957604051806101e001604052806101c0815260200161548f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673209d269dfd66b9cec764de7eb6fefc24f75bdd48036109bd57604051806101e001604052806101c08152602001614f2f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673c37575ad8efe530fd8a79aeb0087e5872a24dabc03610a1157604051806101e001604052806101c0815260200161348f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff8316731c7828dadade12a848f36be8e2d3146462abff6803610a6557604051806101e001604052806101c08152602001613f6f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673aba5294bba7d3635c2a3e44d0e87ea7f58898fb703610ab957604051806101e001604052806101c08152602001614d6f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff8316736eb7be972aebb6be2d9acf437cb412c0abee912b03610b0d57604051806101e001604052806101c081526020016132cf6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673c4d09969aad7f252c75dd352bbbd719e34ed06ad03610b61576040518061024001604052806102208152602001613d4f61022091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673a25af86a5dbea45e9fd70c1879489f63d081ad4403610bb557604051806101e001604052806101c081526020016144af6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff83167357492cb6c8ee2998e9d83ddc8c713e781ffe548e03610c09576040518061020001604052806101e081526020016152af6101e091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673c33e3ec14556a8e71be3097fe2dc8c0b9119c89703610c5d57604051806101e001604052806101c0815260200161380f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff83167377472826875953374ed3084c31a483f827987f1403610cb157604051806101e001604052806101c08152602001613b8f6101c091399392505050565b505060408051602081019091525f8152919050565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608101919091526060808060028514610d64576040517f9d89020a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060610d6f8861132d565b6112e957610d7c88611696565b610de7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f506f6f6c206973206e6f74206120436f5720414d4d000000000000000000000060448201526064015b60405180910390fd5b5f8873ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e31573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e5591906128c4565b90505f8973ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ea1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec591906128c4565b90508973ffffffffffffffffffffffffffffffffffffffff16634ada218b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f3491906129e1565b15155f03610f6e576040517f21081abf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110816040518060c001604052808c73ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018b8b6001818110610fe357610fe3612a00565b9050602002013581526020018b8b5f81811061100157611001612a00565b9050602002013581526020018c73ffffffffffffffffffffffffffffffffffffffff16636dbc88136040518163ffffffff1660e01b8152600401602060405180830381865afa158015611056573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061107a91906128df565b905261174e565b9650866040516020016110949190612a2d565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815260018084528383019092529450816020015b60408051606080820183525f8083526020830152918101919091528152602001906001900390816110d157905050955060405180606001604052808b73ffffffffffffffffffffffffffffffffffffffff1681526020015f815260200161123b739008d19f58aabd9ed0d60971565aa8510560ab4173ffffffffffffffffffffffffffffffffffffffff1663f698da256040518163ffffffff1660e01b8152600401602060405180830381865afa15801561118e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111b291906128df565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08b0180517fd5a25ba2e97094ad7d83dc28a6572da797d6b3e7fc6663bd93efb789fc17e48982526101a0822091526040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b60405160240161124d91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff14fcbc8000000000000000000000000000000000000000000000000000000001790529052865187905f906112d7576112d7612a00565b602002602001018190525050506112ff565b6112f4888888611ad6565b929750909550935090505b8781604051602001611312929190612a3c565b60405160208183030381529060405291505093509350935093565b5f806113388361050c565b511192915050565b5f46600181900361136657738deed8ed7c5fcb55884f13f121654bb4bb7c843791505090565b8060640361138957732af6c59fc957d4a45ddbbd927fa30f7c5051f58391505090565b8062aa36a7036113ae5773bd18758055dbe3ed37a2471394559ae97a5da5c091505090565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e737570706f7274656420636861696e0000000000000000000000000000006044820152606401610dde565b60408051600280825260608083018452926020830190803683370190505090506114398261132d565b6115b5578173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611486573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114aa91906128c4565b815f815181106114bc576114bc612a00565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561153f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061156391906128c4565b8160018151811061157657611576612a00565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050919050565b5f6115bf8361215f565b509050805f815181106115d4576115d4612a00565b6020026020010151825f815181106115ee576115ee612a00565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508060018151811061163b5761163b612a00565b60200260200101518260018151811061165657611656612a00565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505050919050565b5f806116a0611340565b6040517f666e1b3900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152919091169063666e1b3990602401602060405180830381865afa15801561170c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061173091906128c4565b73ffffffffffffffffffffffffffffffffffffffff16141592915050565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810191909152602082015182516040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201525f92839216906370a0823190602401602060405180830381865afa158015611822573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061184691906128df565b604085810151865191517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116906370a0823190602401602060405180830381865afa1580156118b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118db91906128df565b915091505f805f805f8860800151876118f49190612aae565b90505f8960600151876119079190612aae565b90508181101561196d578960200151955089604001519450611939818b6080015160026119349190612aae565b61227b565b61194460028a612af2565b61194e9190612b05565b9350611966848861195f828c612b05565b60016122cb565b92506119b9565b8960400151955089602001519450611990828b6060015160026119349190612aae565b61199b600289612af2565b6119a59190612b05565b93506119b6848961195f828b612b05565b92505b6040518061018001604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200161012c42611a339190612b18565b63ffffffff1681526020018b60a0015181526020015f81526020017ff3b277728b3fee749481eb3e0b3b48980dbbab78658fc419025cb16eee34677581526020016001151581526020017f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc981526020017f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc981525098505050505050505050919050565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608101919091526060806060611b448761013e565b611b7a576040517fefc869b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80611b858961215f565b915091505f8160400151806020019051810190611ba29190612b3c565b9050611c836040518060c001604052808c73ffffffffffffffffffffffffffffffffffffffff168152602001855f81518110611be057611be0612a00565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16815260200185600181518110611c1657611c16612a00565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018b8b6001818110611c4c57611c4c612a00565b9050602002013581526020018b8b5f818110611c6a57611c6a612a00565b9050602002013581526020018360a0015181525061174e565b96505f739008d19f58aabd9ed0d60971565aa8510560ab4173ffffffffffffffffffffffffffffffffffffffff1663f698da256040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ce3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0791906128df565b9050807fd5a25ba2e97094ad7d83dc28a6572da797d6b3e7fc6663bd93efb789fc17e48989604051602001611d3c9190612a2d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181525f60608401818152608085018452845260208085018a9052835180820185529182528484019190915291519092611da092909101612bf4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611dde94939291602401612c9d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f5fd7e97d000000000000000000000000000000000000000000000000000000001790528151600180825281840190935292975082015b60408051606080820183525f808352602083015291810191909152815260200190600190039081611e685790505060408051606081018252855173ffffffffffffffffffffffffffffffffffffffff1681525f602082015291985081018c611f558b857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090910180517fd5a25ba2e97094ad7d83dc28a6572da797d6b3e7fc6663bd93efb789fc17e48982526101a0822091526040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b60405173ffffffffffffffffffffffffffffffffffffffff90921660248301526044820152606401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f30f73c99000000000000000000000000000000000000000000000000000000001790529052875188905f9061200757612007612a00565b602090810291909101015260408051600180825281830190925290816020015b60408051606080820183525f8083526020830152918101919091528152602001906001900390816120275790505095506040518060600160405280845f015173ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020018c5f801b6040516024016120bd92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f30f73c99000000000000000000000000000000000000000000000000000000001790529052865187905f9061214757612147612a00565b60200260200101819052505050505093509350935093565b60408051606081810183525f80835260208301529181018290526121828361050c565b80602001905181019061219591906128f6565b90505f81604001518060200190518101906121b09190612b3c565b6040805160028082526060820183529293509190602083019080368337019050509250805f0151835f815181106121e9576121e9612a00565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080602001518360018151811061223b5761223b612a00565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505050915091565b5f815f036122945761228d8284612af2565b90506122c5565b82156122c057816122a6600185612b05565b6122b09190612af2565b6122bb906001612ccd565b6122c2565b5f5b90505b92915050565b5f806122d886868661231a565b90506122e383612412565b80156122fe57505f84806122f9576122f9612ac5565b868809115b156123115761230e600182612ccd565b90505b95945050505050565b5f838302817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870982811083820303915050805f0361236d5783828161236357612363612ac5565b049250505061240b565b8084116123a6576040517f227bc15300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150505b9392505050565b5f600282600381111561242757612427612ce0565b6124319190612d0d565b60ff166001149050919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461245f575f80fd5b50565b5f60208284031215612472575f80fd5b813561240b8161243e565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6122c2602083018461247d565b5f805f604084860312156124ed575f80fd5b83356124f88161243e565b9250602084013567ffffffffffffffff80821115612514575f80fd5b818601915086601f830112612527575f80fd5b813581811115612535575f80fd5b8760208260051b8501011115612549575f80fd5b6020830194508093505050509250925092565b805173ffffffffffffffffffffffffffffffffffffffff168252602081015161259d602084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408101516125c5604084018273ffffffffffffffffffffffffffffffffffffffff169052565b50606081015160608301526080810151608083015260a08101516125f160a084018263ffffffff169052565b5060c081015160c083015260e081015160e0830152610100808201518184015250610120808201516126268285018215159052565b5050610140818101519083015261016090810151910152565b5f82825180855260208086019550808260051b8401018186015f5b848110156126dc578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00189528151805173ffffffffffffffffffffffffffffffffffffffff16845284810151858501526040908101516060918501829052906126c88186018361247d565b9a86019a945050509083019060010161265a565b5090979650505050505050565b5f6101e06126f7838861255c565b8061018084015261270a8184018761263f565b90508281036101a084015261271f818661263f565b90508281036101c0840152610501818561247d565b602080825282518282018190525f9190848201906040850190845b8181101561278157835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161274f565b50909695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405160c0810167ffffffffffffffff811182821017156127dd576127dd61278d565b60405290565b5f82601f8301126127f2575f80fd5b815167ffffffffffffffff8082111561280d5761280d61278d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156128535761285361278d565b8160405283815286602085880101111561286b575f80fd5b8360208701602083015e5f602085830101528094505050505092915050565b5f6020828403121561289a575f80fd5b815167ffffffffffffffff8111156128b0575f80fd5b6128bc848285016127e3565b949350505050565b5f602082840312156128d4575f80fd5b815161240b8161243e565b5f602082840312156128ef575f80fd5b5051919050565b5f60208284031215612906575f80fd5b815167ffffffffffffffff8082111561291d575f80fd5b9083019060608286031215612930575f80fd5b60405160608101818110838211171561294b5761294b61278d565b60405282516129598161243e565b815260208381015190820152604083015182811115612976575f80fd5b612982878286016127e3565b60408301525095945050505050565b73ffffffffffffffffffffffffffffffffffffffff8151168252602081015160208301525f6040820151606060408501526128bc606085018261247d565b602081525f6122c26020830184612991565b5f602082840312156129f1575f80fd5b8151801515811461240b575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b61018081016122c5828461255c565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008360601b1681525f82518060208501601485015e5f92016014019182525092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820281158282048414176122c5576122c5612a81565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82612b0057612b00612ac5565b500490565b818103818111156122c5576122c5612a81565b63ffffffff818116838216019080821115612b3557612b35612a81565b5092915050565b5f60208284031215612b4c575f80fd5b815167ffffffffffffffff80821115612b63575f80fd5b9083019060c08286031215612b76575f80fd5b612b7e6127ba565b8251612b898161243e565b81526020830151612b998161243e565b6020820152604083810151908201526060830151612bb68161243e565b6060820152608083015182811115612bcc575f80fd5b612bd8878286016127e3565b60808301525060a083015160a082015280935050505092915050565b602080825282516060838301528051608084018190525f9291820190839060a08601905b80831015612c385783518252928401926001929092019190840190612c18565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0925082868203016040870152612c768185612991565b93505050604085015181858403016060860152612c93838261247d565b9695505050505050565b848152836020820152608060408201525f612cbb608083018561247d565b8281036060840152610501818561247d565b808201808211156122c5576122c5612a81565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f60ff831680612d1f57612d1f612ac5565b8060ff8416069150509291505056fe000000000000000000000000000000000000000000000000000000000000002000000000000000000000000034323b933096534e43958f6c7bf44f2bb59424dac5a0e756ac88c1d3a4c41900d977fe93c2d34fc95a00ca3e84eb4c6b50faf949000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000005afe3855358e112b5647b952709e6165e1c1eeee000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000573cc0c800048f94e022463b9214d92c2d65e97b00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c8900000000000000000000000000000000000000000000000000000000000000200000000000000000000000002e7e978da0c53404a8cf66ed4ba2c7706c07b62a0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a851d85c99996d84d25387bc0d01e50e3ea814f64e7e04a3b949a571789e196c5a910000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e1000000000000000000000000e91d153e0b41518a2ce8dd3d7944fa863463a97d000000000000000000000000000000000000000000000000000affd9fdeb8e08000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000020a99fd9950b5d5dceeaf4939e221dca8ca9b938ab0001000000000000000000250000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a85178a729ee3008c7d48832d02267b72e5f34ada8f554a6731a368f01590ed71b34000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000cb444e90d8198415266c6a2724b7900fb12fc56e000000000000000000000000e91d153e0b41518a2ce8dd3d7944fa863463a97d0000000000000000000000000000000000000000000000008156197a5425c0c8000000000000000000000000bd91a72dc3d9b5d9b16ee8638da1fc65311bd90a00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000080000000000000000000000000ab70bcb260073d036d1660201e9d5405f5829b7a000000000000000000000000678df3415fc31947da4324ec63212874be5a82f8000000000000000000000000000000000000000000000000000000000001518000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a8512e31981e34960969eb549f5e826cf77f655e72b03603ad574a79fd015f4de4de0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006c76971f98945ae98dd7d4dfca8711ebea946ea6000000000000000000000000af204776c7245bf4147c2612bf6e5972ee483701000000000000000000000000000000000000000000000000000a16c95a4d2e3c000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c0ce9e05c2aee5f22f9941c4cd1f1a1d13194b109779422d5ad9a980157bd0f1640000000000000000000000000000000000000000000000000000000000000020bc2acf5e821c5c9f8667a36bb1131dad26ed64f90002000000000000000000630000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a851a2029fbb545978d05378b6df19e3754fe5ed2d0ba1e051027503934372f7beb20000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000009c58bacc331c9aa871afd802db6379a98e80cedb000000000000000000000000177127622c4a00f3d409b75571e12cb3c8973d3c0000000000000000000000000000000000000000000000000052ba9efc38441a000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c89000000000000000000000000000000000000000000000000000000000000002021d4c792ea7e38e0d0819c2011a2b1cb7252bd9900020000000000000000001e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000034323b933096534e43958f6c7bf44f2bb59424daca44b6a304baa16d11b6db07066c1276b1273ee3f94590bbd03201a61882af9a000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000098cb76000000000000000000000000573cc0c800048f94e022463b9214d92c2d65e97b00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b4e16d0168e52d35cacd2c6185b44281ec28c9dc0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a85159457ac6201da7713efecd84618c7a168e88b9cb7d1c0db128af1efe0a08bbb10000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006c76971f98945ae98dd7d4dfca8711ebea946ea6000000000000000000000000af204776c7245bf4147c2612bf6e5972ee483701000000000000000000000000000000000000000000000000000a17273fc14b64000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000020bc2acf5e821c5c9f8667a36bb1131dad26ed64f9000200000000000000000063000000000000000000000000000000000000000000000000000000000000002000000000000000000000000034323b933096534e43958f6c7bf44f2bb59424da80ba533f014ef4238ab7ad203c0aeacbf30a71c0346140db77c43ae3121afadd000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000aea46a60368a7bd060eec7df8cba43b7ef41ad85000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000336632e53c8ecf04000000000000000000000000573cc0c800048f94e022463b9214d92c2d65e97b00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c8900000000000000000000000000000000000000000000000000000000000000200000000000000000000000004042a04c54ef133ac2a3c93db69d43c6c02a330b0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a851d67c9fb87045e07da94c81de035b5c7f435cd46568fca02aa35d709bbc9e21fa0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000008e5bbbb09ed1ebde8674cda39a0c169401db4252000000000000000000000000e91d153e0b41518a2ce8dd3d7944fa863463a97d0000000000000000000000000000000000000000000000000000000000002710000000000000000000000000e089049027b95c2745d1a954bc1d245352d884e900000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c8900000000000000000000000000000000000000000000000000000000000000200000000000000000000000008db8870ca4b8ac188c4d1a014f34a381ae27e1c20000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a851209c17d9ebe3ac7352795f7f8b3d14d253d92430831d3b2c3965f9a578da7618000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e91d153e0b41518a2ce8dd3d7944fa863463a97d0000000000000000000000006c76971f98945ae98dd7d4dfca8711ebea946ea60000000000000000000000000000000000000000000000008aa3a52815262f58000000000000000000000000bd91a72dc3d9b5d9b16ee8638da1fc65311bd90a00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c8900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000064ac007ff665cf8d0d3af5e0ad1c26a3f853ea000000000000000000000000a767f745331d267c7751297d982b050c93985627000000000000000000000000000000000000000000000000000000000001518000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a85105416460deb76d57af601be17e777b93592d8d4d4a4096c57876a91c84f418080000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000009c58bacc331c9aa871afd802db6379a98e80cedb000000000000000000000000ce11e14225575945b8e6dc0d4f2dd4c570f79d9f000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000009634ca647474b6b78d3382331a77cd00a8a940da00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000034323b933096534e43958f6c7bf44f2bb59424da932542294ff270a8bbdbe1fb921de3d09c9749dc35627361fc17c44b9b026b810000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000008390a1da07e376ef7add4be859ba74fb83aa02d5000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000aec1c94998000000000000000000000000573cc0c800048f94e022463b9214d92c2d65e97b00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c89000000000000000000000000000000000000000000000000000000000000002000000000000000000000000069c66beafb06674db41b22cfc50c34a93b8d82a2000000000000000000000000000000000000000000000000000000000000002000000000000000000000000034323b933096534e43958f6c7bf44f2bb59424da0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000def1ca1fb7fbcdc777520aa7f396b4e015f497ab000000000000000000000000000000000000000000000000025bf6196bd10000000000000000000000000000ad37fe3ddedf8cdee1022da1b17412cfb649559600000000000000000000000000000000000000000000000000000000000000c0d661a16b0e85eadb705cf5158132b5dd1ebc0a49929ef68097698d15e2a4e3b40000000000000000000000000000000000000000000000000000000000000020de8c195aa41c11a0c4787372defbbddaa31306d20002000000000000000001810000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a851560d33bcc26b7f10765f8ae10b1abc4ed265ba0c7a1f9948d06de97c31044aee0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000004d18815d14fe5c3304e87b3fa18318baa5c238200000000000000000000000009c58bacc331c9aa871afd802db6379a98e80cedb0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a9b2234773cc6a4f3a34a770c52c931cba5c24b20002000000000000000000870000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a851437a72b19b25e8b62fdfb81146ec83c66462138d3d9e08998594853566fa9add000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000177127622c4a00f3d409b75571e12cb3c8973d3c0000000000000000000000006c76971f98945ae98dd7d4dfca8711ebea946ea600000000000000000000000000000000000000000000000146e114355e0f6088000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c8900000000000000000000000000000000000000000000000000000000000000204cdabe9e07ca393943acfb9286bbbd0d0a310ff600020000000000000000005c000000000000000000000000000000000000000000000000000000000000002000000000000000000000000034323b933096534e43958f6c7bf44f2bb59424da559d5fda20be80608e4d5ea1b41e6b9330efca7934beb094281dd4d8f4889374000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000079ef7f110fdfae4000000000000000000000000ad37fe3ddedf8cdee1022da1b17412cfb649559600000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000020e99481dc77691d8e2456e5f3f61c1810adfc1503000200000000000000000018000000000000000000000000000000000000000000000000000000000000002000000000000000000000000034323b933096534e43958f6c7bf44f2bb59424da56871afb17e444c418900f6db3e1ade07d49eadea1accf03fcebc0a6e7e4b653000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b2617246d0c6c0087f18703d576831899ca94f01000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000048bcb79dba2b56b90000000000000000000000000573cc0c800048f94e022463b9214d92c2d65e97b00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b36ec83d844c0579ec2493f10b2087e96bb654600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a8511ea56ac96a6369d36ef3fe56ae0ddff8d0cc89e1623095239c5ceed2505aa2810000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000009c58bacc331c9aa871afd802db6379a98e80cedb0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e1000000000000000000000000000000000000000000000000006b43c27d2e8300000000000000000000000000e089049027b95c2745d1a954bc1d245352d884e900000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c89000000000000000000000000000000000000000000000000000000000000002000000000000000000000000028dbd35fd79f48bfa9444d330d14683e7101d8170000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a851d1e868d120e326e5581caa39852bb0da9234a511ed76e6f7a9dcceb0d5f154c70000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006c76971f98945ae98dd7d4dfca8711ebea946ea6000000000000000000000000af204776c7245bf4147c2612bf6e5972ee48370100000000000000000000000000000000000000000000000000098e46995425ca000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000020bc2acf5e821c5c9f8667a36bb1131dad26ed64f90002000000000000000000630000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a851f0e8ec512b2507dae99175a0a4792d8a53e0863fbb5e735a5c993295bbd17f480000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006c76971f98945ae98dd7d4dfca8711ebea946ea60000000000000000000000009c58bacc331c9aa871afd802db6379a98e80cedb00000000000000000000000000000000000000000000000000094f8d9168e271000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c8900000000000000000000000000000000000000000000000000000000000000204683e340a8049261057d5ab1b29c8d840e75695e00020000000000000000005a000000000000000000000000000000000000000000000000000000000000002000000000000000000000000034323b933096534e43958f6c7bf44f2bb59424dad003838829115f5d9ff3ed69c8d2b4b26e10eb1a79331206c28fbb4734390a5e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000808507121b80c02388fad14726482e061b8da827000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000189b23422a9b84d8000000000000000000000000ad37fe3ddedf8cdee1022da1b17412cfb649559600000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000020fd1cf6fd41f229ca86ada0584c63c49c3d66bbc90002000000000000000004380000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a8513956efd63537b00bb3b152d3c4961207b6ca14d6f506c66fc0aef4c8e2e176b5000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000cb444e90d8198415266c6a2724b7900fb12fc56e0000000000000000000000009c58bacc331c9aa871afd802db6379a98e80cedb000000000000000000000000000000000000000000000000000000000000004500000000000000000000000015b4c67070d3748b8ec93c8a32f7efe2e8f684c900000000000000000000000000000000000000000000000000000000000000c0056e9806d953dbe2df4352a90ad2c1148c51460e941107f0909fae382b1661cf000000000000000000000000000000000000000000000000000000000000004000000000000000000000000022441d81416430a54336ab28765abd31a792ad37000000000000000000000000ab70bcb260073d036d1660201e9d5405f5829b7a0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a85133f583d55c4509d5e10ebe3c7c69bce17af4c57419d6c9c90c8f588dd3232c0d000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000af204776c7245bf4147c2612bf6e5972ee4837010000000000000000000000006c76971f98945ae98dd7d4dfca8711ebea946ea600000000000000000000000000000000000000000000000410d586a20a4c0000000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000020bc2acf5e821c5c9f8667a36bb1131dad26ed64f9000200000000000000000063a2646970667358221220c3b6b701e7d5db53232efcebe1fe1bdd40a35653449ba7cd10551b9e5bf6a94a64736f6c63430008190033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061006f575f3560e01c80632aec79a01161004d5780632aec79a0146100de578063c45a0155146100f1578063e48603391461011e575f80fd5b806310029daa14610073578063215702561461009b57806327242c9b146100bb575b5f80fd5b610086610081366004612462565b61013e565b60405190151581526020015b60405180910390f35b6100ae6100a9366004612462565b61050c565b60405161009291906124c9565b6100ce6100c93660046124db565b610cc6565b60405161009294939291906126e9565b6100866100ec366004612462565b61132d565b6100f9611340565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610092565b61013161012c366004612462565b611410565b6040516100929190612734565b6040517f5624b25b0000000000000000000000000000000000000000000000000000000081527f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d56004820152600160248201525f90819073ffffffffffffffffffffffffffffffffffffffff841690635624b25b906044015f60405180830381865afa1580156101d0573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610215919081019061288a565b80602001905181019061022891906128c4565b90505f732f55e8b20d0b9fefa187aa7d00b6cbe563605bf573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161490505f73fdafc9d1902f4e0b84f65f49f244b32b31013b7473ffffffffffffffffffffffffffffffffffffffff16732f55e8b20d0b9fefa187aa7d00b6cbe563605bf573ffffffffffffffffffffffffffffffffffffffff166351cad5ee87739008d19f58aabd9ed0d60971565aa8510560ab4173ffffffffffffffffffffffffffffffffffffffff1663f698da256040518163ffffffff1660e01b8152600401602060405180830381865afa15801561032a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034e91906128df565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401602060405180830381865afa1580156103ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103de91906128c4565b73ffffffffffffffffffffffffffffffffffffffff161490505f6104018661050c565b80602001905181019061041491906128f6565b90505f73fdafc9d1902f4e0b84f65f49f244b32b31013b7473ffffffffffffffffffffffffffffffffffffffff16636108c532888460405160200161045991906129cf565b604051602081830303815290604052805190602001206040518363ffffffff1660e01b81526004016104ad92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602060405180830381865afa1580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec91906129e1565b90508380156104f85750825b80156105015750805b979650505050505050565b60604660018190036107bd5773ffffffffffffffffffffffffffffffffffffffff8316739941fd7db2003308e7ee17b04400012278f12ac60361056c57604051806101e001604052806101c0815260200161482f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673b3bf81714f704720dcb0351ff0d42eca61b069fc036105c057604051806101e001604052806101c081526020016150ef6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673301076c36e034948a747bb61bab9cd03f62672e30361061457604051806101e001604052806101c0815260200161364f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673027e1cbf2c299cba5eb8a2584910d04f1a8aa4030361066857604051806101e001604052806101c08152602001612d2f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673beef5afe88ef73337e5070ab2855d37dbf5493a4036106bc57604051806101e001604052806101c081526020016142ef6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673c6b13d5e662fa0458f03995bcb824a1934aa895f0361071057604051806101e001604052806101c0815260200161412f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673d7cb8cc1b56356bb7b78d02e785ead28e21586600361076457604051806101e001604052806101c081526020016139cf6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673079c868f97aed8e0d03f11e1529c3b056ff21cea036107b857604051806101e001604052806101c081526020016149ef6101c091399392505050565b610cb1565b80606403610cb15773ffffffffffffffffffffffffffffffffffffffff831673bc6159fd429be18206e60b3bb01d7289f905511b0361081957604051806101e001604052806101c08152602001612eef6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673e5d1aa8565f5dbfc06cde20dfd76b4c7c6d43bd50361086d57604051806101e001604052806101c0815260200161466f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff8316739d8570ef9a519ca81daec35212f435d9843ba564036108c157604051806101e001604052806101c08152602001614baf6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673d97c31e53f16f495715ce71e12e11b9545eedd8b036109155760405180610240016040528061022081526020016130af61022091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673ff1bd3d570e3544c183ba77f5a4d3cc742c8d2b30361096957604051806101e001604052806101c0815260200161548f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673209d269dfd66b9cec764de7eb6fefc24f75bdd48036109bd57604051806101e001604052806101c08152602001614f2f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673c37575ad8efe530fd8a79aeb0087e5872a24dabc03610a1157604051806101e001604052806101c0815260200161348f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff8316731c7828dadade12a848f36be8e2d3146462abff6803610a6557604051806101e001604052806101c08152602001613f6f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673aba5294bba7d3635c2a3e44d0e87ea7f58898fb703610ab957604051806101e001604052806101c08152602001614d6f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff8316736eb7be972aebb6be2d9acf437cb412c0abee912b03610b0d57604051806101e001604052806101c081526020016132cf6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673c4d09969aad7f252c75dd352bbbd719e34ed06ad03610b61576040518061024001604052806102208152602001613d4f61022091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673a25af86a5dbea45e9fd70c1879489f63d081ad4403610bb557604051806101e001604052806101c081526020016144af6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff83167357492cb6c8ee2998e9d83ddc8c713e781ffe548e03610c09576040518061020001604052806101e081526020016152af6101e091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673c33e3ec14556a8e71be3097fe2dc8c0b9119c89703610c5d57604051806101e001604052806101c0815260200161380f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff83167377472826875953374ed3084c31a483f827987f1403610cb157604051806101e001604052806101c08152602001613b8f6101c091399392505050565b505060408051602081019091525f8152919050565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608101919091526060808060028514610d64576040517f9d89020a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060610d6f8861132d565b6112e957610d7c88611696565b610de7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f506f6f6c206973206e6f74206120436f5720414d4d000000000000000000000060448201526064015b60405180910390fd5b5f8873ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e31573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e5591906128c4565b90505f8973ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ea1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec591906128c4565b90508973ffffffffffffffffffffffffffffffffffffffff16634ada218b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f3491906129e1565b15155f03610f6e576040517f21081abf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110816040518060c001604052808c73ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018b8b6001818110610fe357610fe3612a00565b9050602002013581526020018b8b5f81811061100157611001612a00565b9050602002013581526020018c73ffffffffffffffffffffffffffffffffffffffff16636dbc88136040518163ffffffff1660e01b8152600401602060405180830381865afa158015611056573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061107a91906128df565b905261174e565b9650866040516020016110949190612a2d565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815260018084528383019092529450816020015b60408051606080820183525f8083526020830152918101919091528152602001906001900390816110d157905050955060405180606001604052808b73ffffffffffffffffffffffffffffffffffffffff1681526020015f815260200161123b739008d19f58aabd9ed0d60971565aa8510560ab4173ffffffffffffffffffffffffffffffffffffffff1663f698da256040518163ffffffff1660e01b8152600401602060405180830381865afa15801561118e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111b291906128df565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08b0180517fd5a25ba2e97094ad7d83dc28a6572da797d6b3e7fc6663bd93efb789fc17e48982526101a0822091526040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b60405160240161124d91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff14fcbc8000000000000000000000000000000000000000000000000000000001790529052865187905f906112d7576112d7612a00565b602002602001018190525050506112ff565b6112f4888888611ad6565b929750909550935090505b8781604051602001611312929190612a3c565b60405160208183030381529060405291505093509350935093565b5f806113388361050c565b511192915050565b5f46600181900361136657738deed8ed7c5fcb55884f13f121654bb4bb7c843791505090565b8060640361138957732af6c59fc957d4a45ddbbd927fa30f7c5051f58391505090565b8062aa36a7036113ae5773bd18758055dbe3ed37a2471394559ae97a5da5c091505090565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e737570706f7274656420636861696e0000000000000000000000000000006044820152606401610dde565b60408051600280825260608083018452926020830190803683370190505090506114398261132d565b6115b5578173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611486573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114aa91906128c4565b815f815181106114bc576114bc612a00565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561153f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061156391906128c4565b8160018151811061157657611576612a00565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050919050565b5f6115bf8361215f565b509050805f815181106115d4576115d4612a00565b6020026020010151825f815181106115ee576115ee612a00565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508060018151811061163b5761163b612a00565b60200260200101518260018151811061165657611656612a00565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505050919050565b5f806116a0611340565b6040517f666e1b3900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152919091169063666e1b3990602401602060405180830381865afa15801561170c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061173091906128c4565b73ffffffffffffffffffffffffffffffffffffffff16141592915050565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810191909152602082015182516040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201525f92839216906370a0823190602401602060405180830381865afa158015611822573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061184691906128df565b604085810151865191517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116906370a0823190602401602060405180830381865afa1580156118b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118db91906128df565b915091505f805f805f8860800151876118f49190612aae565b90505f8960600151876119079190612aae565b90508181101561196d578960200151955089604001519450611939818b6080015160026119349190612aae565b61227b565b61194460028a612af2565b61194e9190612b05565b9350611966848861195f828c612b05565b60016122cb565b92506119b9565b8960400151955089602001519450611990828b6060015160026119349190612aae565b61199b600289612af2565b6119a59190612b05565b93506119b6848961195f828b612b05565b92505b6040518061018001604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200161012c42611a339190612b18565b63ffffffff1681526020018b60a0015181526020015f81526020017ff3b277728b3fee749481eb3e0b3b48980dbbab78658fc419025cb16eee34677581526020016001151581526020017f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc981526020017f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc981525098505050505050505050919050565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608101919091526060806060611b448761013e565b611b7a576040517fefc869b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80611b858961215f565b915091505f8160400151806020019051810190611ba29190612b3c565b9050611c836040518060c001604052808c73ffffffffffffffffffffffffffffffffffffffff168152602001855f81518110611be057611be0612a00565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16815260200185600181518110611c1657611c16612a00565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018b8b6001818110611c4c57611c4c612a00565b9050602002013581526020018b8b5f818110611c6a57611c6a612a00565b9050602002013581526020018360a0015181525061174e565b96505f739008d19f58aabd9ed0d60971565aa8510560ab4173ffffffffffffffffffffffffffffffffffffffff1663f698da256040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ce3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0791906128df565b9050807fd5a25ba2e97094ad7d83dc28a6572da797d6b3e7fc6663bd93efb789fc17e48989604051602001611d3c9190612a2d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181525f60608401818152608085018452845260208085018a9052835180820185529182528484019190915291519092611da092909101612bf4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611dde94939291602401612c9d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f5fd7e97d000000000000000000000000000000000000000000000000000000001790528151600180825281840190935292975082015b60408051606080820183525f808352602083015291810191909152815260200190600190039081611e685790505060408051606081018252855173ffffffffffffffffffffffffffffffffffffffff1681525f602082015291985081018c611f558b857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090910180517fd5a25ba2e97094ad7d83dc28a6572da797d6b3e7fc6663bd93efb789fc17e48982526101a0822091526040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b60405173ffffffffffffffffffffffffffffffffffffffff90921660248301526044820152606401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f30f73c99000000000000000000000000000000000000000000000000000000001790529052875188905f9061200757612007612a00565b602090810291909101015260408051600180825281830190925290816020015b60408051606080820183525f8083526020830152918101919091528152602001906001900390816120275790505095506040518060600160405280845f015173ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020018c5f801b6040516024016120bd92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f30f73c99000000000000000000000000000000000000000000000000000000001790529052865187905f9061214757612147612a00565b60200260200101819052505050505093509350935093565b60408051606081810183525f80835260208301529181018290526121828361050c565b80602001905181019061219591906128f6565b90505f81604001518060200190518101906121b09190612b3c565b6040805160028082526060820183529293509190602083019080368337019050509250805f0151835f815181106121e9576121e9612a00565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080602001518360018151811061223b5761223b612a00565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505050915091565b5f815f036122945761228d8284612af2565b90506122c5565b82156122c057816122a6600185612b05565b6122b09190612af2565b6122bb906001612ccd565b6122c2565b5f5b90505b92915050565b5f806122d886868661231a565b90506122e383612412565b80156122fe57505f84806122f9576122f9612ac5565b868809115b156123115761230e600182612ccd565b90505b95945050505050565b5f838302817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870982811083820303915050805f0361236d5783828161236357612363612ac5565b049250505061240b565b8084116123a6576040517f227bc15300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150505b9392505050565b5f600282600381111561242757612427612ce0565b6124319190612d0d565b60ff166001149050919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461245f575f80fd5b50565b5f60208284031215612472575f80fd5b813561240b8161243e565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6122c2602083018461247d565b5f805f604084860312156124ed575f80fd5b83356124f88161243e565b9250602084013567ffffffffffffffff80821115612514575f80fd5b818601915086601f830112612527575f80fd5b813581811115612535575f80fd5b8760208260051b8501011115612549575f80fd5b6020830194508093505050509250925092565b805173ffffffffffffffffffffffffffffffffffffffff168252602081015161259d602084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408101516125c5604084018273ffffffffffffffffffffffffffffffffffffffff169052565b50606081015160608301526080810151608083015260a08101516125f160a084018263ffffffff169052565b5060c081015160c083015260e081015160e0830152610100808201518184015250610120808201516126268285018215159052565b5050610140818101519083015261016090810151910152565b5f82825180855260208086019550808260051b8401018186015f5b848110156126dc578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00189528151805173ffffffffffffffffffffffffffffffffffffffff16845284810151858501526040908101516060918501829052906126c88186018361247d565b9a86019a945050509083019060010161265a565b5090979650505050505050565b5f6101e06126f7838861255c565b8061018084015261270a8184018761263f565b90508281036101a084015261271f818661263f565b90508281036101c0840152610501818561247d565b602080825282518282018190525f9190848201906040850190845b8181101561278157835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161274f565b50909695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405160c0810167ffffffffffffffff811182821017156127dd576127dd61278d565b60405290565b5f82601f8301126127f2575f80fd5b815167ffffffffffffffff8082111561280d5761280d61278d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156128535761285361278d565b8160405283815286602085880101111561286b575f80fd5b8360208701602083015e5f602085830101528094505050505092915050565b5f6020828403121561289a575f80fd5b815167ffffffffffffffff8111156128b0575f80fd5b6128bc848285016127e3565b949350505050565b5f602082840312156128d4575f80fd5b815161240b8161243e565b5f602082840312156128ef575f80fd5b5051919050565b5f60208284031215612906575f80fd5b815167ffffffffffffffff8082111561291d575f80fd5b9083019060608286031215612930575f80fd5b60405160608101818110838211171561294b5761294b61278d565b60405282516129598161243e565b815260208381015190820152604083015182811115612976575f80fd5b612982878286016127e3565b60408301525095945050505050565b73ffffffffffffffffffffffffffffffffffffffff8151168252602081015160208301525f6040820151606060408501526128bc606085018261247d565b602081525f6122c26020830184612991565b5f602082840312156129f1575f80fd5b8151801515811461240b575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b61018081016122c5828461255c565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008360601b1681525f82518060208501601485015e5f92016014019182525092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820281158282048414176122c5576122c5612a81565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82612b0057612b00612ac5565b500490565b818103818111156122c5576122c5612a81565b63ffffffff818116838216019080821115612b3557612b35612a81565b5092915050565b5f60208284031215612b4c575f80fd5b815167ffffffffffffffff80821115612b63575f80fd5b9083019060c08286031215612b76575f80fd5b612b7e6127ba565b8251612b898161243e565b81526020830151612b998161243e565b6020820152604083810151908201526060830151612bb68161243e565b6060820152608083015182811115612bcc575f80fd5b612bd8878286016127e3565b60808301525060a083015160a082015280935050505092915050565b602080825282516060838301528051608084018190525f9291820190839060a08601905b80831015612c385783518252928401926001929092019190840190612c18565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0925082868203016040870152612c768185612991565b93505050604085015181858403016060860152612c93838261247d565b9695505050505050565b848152836020820152608060408201525f612cbb608083018561247d565b8281036060840152610501818561247d565b808201808211156122c5576122c5612a81565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f60ff831680612d1f57612d1f612ac5565b8060ff8416069150509291505056fe000000000000000000000000000000000000000000000000000000000000002000000000000000000000000034323b933096534e43958f6c7bf44f2bb59424dac5a0e756ac88c1d3a4c41900d977fe93c2d34fc95a00ca3e84eb4c6b50faf949000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000005afe3855358e112b5647b952709e6165e1c1eeee000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000573cc0c800048f94e022463b9214d92c2d65e97b00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c8900000000000000000000000000000000000000000000000000000000000000200000000000000000000000002e7e978da0c53404a8cf66ed4ba2c7706c07b62a0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a851d85c99996d84d25387bc0d01e50e3ea814f64e7e04a3b949a571789e196c5a910000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e1000000000000000000000000e91d153e0b41518a2ce8dd3d7944fa863463a97d000000000000000000000000000000000000000000000000000affd9fdeb8e08000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000020a99fd9950b5d5dceeaf4939e221dca8ca9b938ab0001000000000000000000250000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a85178a729ee3008c7d48832d02267b72e5f34ada8f554a6731a368f01590ed71b34000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000cb444e90d8198415266c6a2724b7900fb12fc56e000000000000000000000000e91d153e0b41518a2ce8dd3d7944fa863463a97d0000000000000000000000000000000000000000000000008156197a5425c0c8000000000000000000000000bd91a72dc3d9b5d9b16ee8638da1fc65311bd90a00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000080000000000000000000000000ab70bcb260073d036d1660201e9d5405f5829b7a000000000000000000000000678df3415fc31947da4324ec63212874be5a82f8000000000000000000000000000000000000000000000000000000000001518000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a8512e31981e34960969eb549f5e826cf77f655e72b03603ad574a79fd015f4de4de0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006c76971f98945ae98dd7d4dfca8711ebea946ea6000000000000000000000000af204776c7245bf4147c2612bf6e5972ee483701000000000000000000000000000000000000000000000000000a16c95a4d2e3c000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c0ce9e05c2aee5f22f9941c4cd1f1a1d13194b109779422d5ad9a980157bd0f1640000000000000000000000000000000000000000000000000000000000000020bc2acf5e821c5c9f8667a36bb1131dad26ed64f90002000000000000000000630000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a851a2029fbb545978d05378b6df19e3754fe5ed2d0ba1e051027503934372f7beb20000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000009c58bacc331c9aa871afd802db6379a98e80cedb000000000000000000000000177127622c4a00f3d409b75571e12cb3c8973d3c0000000000000000000000000000000000000000000000000052ba9efc38441a000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c89000000000000000000000000000000000000000000000000000000000000002021d4c792ea7e38e0d0819c2011a2b1cb7252bd9900020000000000000000001e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000034323b933096534e43958f6c7bf44f2bb59424daca44b6a304baa16d11b6db07066c1276b1273ee3f94590bbd03201a61882af9a000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000098cb76000000000000000000000000573cc0c800048f94e022463b9214d92c2d65e97b00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b4e16d0168e52d35cacd2c6185b44281ec28c9dc0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a85159457ac6201da7713efecd84618c7a168e88b9cb7d1c0db128af1efe0a08bbb10000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006c76971f98945ae98dd7d4dfca8711ebea946ea6000000000000000000000000af204776c7245bf4147c2612bf6e5972ee483701000000000000000000000000000000000000000000000000000a17273fc14b64000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000020bc2acf5e821c5c9f8667a36bb1131dad26ed64f9000200000000000000000063000000000000000000000000000000000000000000000000000000000000002000000000000000000000000034323b933096534e43958f6c7bf44f2bb59424da80ba533f014ef4238ab7ad203c0aeacbf30a71c0346140db77c43ae3121afadd000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000aea46a60368a7bd060eec7df8cba43b7ef41ad85000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000336632e53c8ecf04000000000000000000000000573cc0c800048f94e022463b9214d92c2d65e97b00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c8900000000000000000000000000000000000000000000000000000000000000200000000000000000000000004042a04c54ef133ac2a3c93db69d43c6c02a330b0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a851d67c9fb87045e07da94c81de035b5c7f435cd46568fca02aa35d709bbc9e21fa0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000008e5bbbb09ed1ebde8674cda39a0c169401db4252000000000000000000000000e91d153e0b41518a2ce8dd3d7944fa863463a97d0000000000000000000000000000000000000000000000000000000000002710000000000000000000000000e089049027b95c2745d1a954bc1d245352d884e900000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c8900000000000000000000000000000000000000000000000000000000000000200000000000000000000000008db8870ca4b8ac188c4d1a014f34a381ae27e1c20000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a851209c17d9ebe3ac7352795f7f8b3d14d253d92430831d3b2c3965f9a578da7618000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e91d153e0b41518a2ce8dd3d7944fa863463a97d0000000000000000000000006c76971f98945ae98dd7d4dfca8711ebea946ea60000000000000000000000000000000000000000000000008aa3a52815262f58000000000000000000000000bd91a72dc3d9b5d9b16ee8638da1fc65311bd90a00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c8900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000064ac007ff665cf8d0d3af5e0ad1c26a3f853ea000000000000000000000000a767f745331d267c7751297d982b050c93985627000000000000000000000000000000000000000000000000000000000001518000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a85105416460deb76d57af601be17e777b93592d8d4d4a4096c57876a91c84f418080000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000009c58bacc331c9aa871afd802db6379a98e80cedb000000000000000000000000ce11e14225575945b8e6dc0d4f2dd4c570f79d9f000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000009634ca647474b6b78d3382331a77cd00a8a940da00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000034323b933096534e43958f6c7bf44f2bb59424da932542294ff270a8bbdbe1fb921de3d09c9749dc35627361fc17c44b9b026b810000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000008390a1da07e376ef7add4be859ba74fb83aa02d5000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000aec1c94998000000000000000000000000573cc0c800048f94e022463b9214d92c2d65e97b00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c89000000000000000000000000000000000000000000000000000000000000002000000000000000000000000069c66beafb06674db41b22cfc50c34a93b8d82a2000000000000000000000000000000000000000000000000000000000000002000000000000000000000000034323b933096534e43958f6c7bf44f2bb59424da0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000def1ca1fb7fbcdc777520aa7f396b4e015f497ab000000000000000000000000000000000000000000000000025bf6196bd10000000000000000000000000000ad37fe3ddedf8cdee1022da1b17412cfb649559600000000000000000000000000000000000000000000000000000000000000c0d661a16b0e85eadb705cf5158132b5dd1ebc0a49929ef68097698d15e2a4e3b40000000000000000000000000000000000000000000000000000000000000020de8c195aa41c11a0c4787372defbbddaa31306d20002000000000000000001810000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a851560d33bcc26b7f10765f8ae10b1abc4ed265ba0c7a1f9948d06de97c31044aee0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000004d18815d14fe5c3304e87b3fa18318baa5c238200000000000000000000000009c58bacc331c9aa871afd802db6379a98e80cedb0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a9b2234773cc6a4f3a34a770c52c931cba5c24b20002000000000000000000870000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a851437a72b19b25e8b62fdfb81146ec83c66462138d3d9e08998594853566fa9add000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000177127622c4a00f3d409b75571e12cb3c8973d3c0000000000000000000000006c76971f98945ae98dd7d4dfca8711ebea946ea600000000000000000000000000000000000000000000000146e114355e0f6088000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c8900000000000000000000000000000000000000000000000000000000000000204cdabe9e07ca393943acfb9286bbbd0d0a310ff600020000000000000000005c000000000000000000000000000000000000000000000000000000000000002000000000000000000000000034323b933096534e43958f6c7bf44f2bb59424da559d5fda20be80608e4d5ea1b41e6b9330efca7934beb094281dd4d8f4889374000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000079ef7f110fdfae4000000000000000000000000ad37fe3ddedf8cdee1022da1b17412cfb649559600000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000020e99481dc77691d8e2456e5f3f61c1810adfc1503000200000000000000000018000000000000000000000000000000000000000000000000000000000000002000000000000000000000000034323b933096534e43958f6c7bf44f2bb59424da56871afb17e444c418900f6db3e1ade07d49eadea1accf03fcebc0a6e7e4b653000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b2617246d0c6c0087f18703d576831899ca94f01000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000048bcb79dba2b56b90000000000000000000000000573cc0c800048f94e022463b9214d92c2d65e97b00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b36ec83d844c0579ec2493f10b2087e96bb654600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a8511ea56ac96a6369d36ef3fe56ae0ddff8d0cc89e1623095239c5ceed2505aa2810000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000009c58bacc331c9aa871afd802db6379a98e80cedb0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e1000000000000000000000000000000000000000000000000006b43c27d2e8300000000000000000000000000e089049027b95c2745d1a954bc1d245352d884e900000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c89000000000000000000000000000000000000000000000000000000000000002000000000000000000000000028dbd35fd79f48bfa9444d330d14683e7101d8170000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a851d1e868d120e326e5581caa39852bb0da9234a511ed76e6f7a9dcceb0d5f154c70000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006c76971f98945ae98dd7d4dfca8711ebea946ea6000000000000000000000000af204776c7245bf4147c2612bf6e5972ee48370100000000000000000000000000000000000000000000000000098e46995425ca000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000020bc2acf5e821c5c9f8667a36bb1131dad26ed64f90002000000000000000000630000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a851f0e8ec512b2507dae99175a0a4792d8a53e0863fbb5e735a5c993295bbd17f480000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006c76971f98945ae98dd7d4dfca8711ebea946ea60000000000000000000000009c58bacc331c9aa871afd802db6379a98e80cedb00000000000000000000000000000000000000000000000000094f8d9168e271000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c8900000000000000000000000000000000000000000000000000000000000000204683e340a8049261057d5ab1b29c8d840e75695e00020000000000000000005a000000000000000000000000000000000000000000000000000000000000002000000000000000000000000034323b933096534e43958f6c7bf44f2bb59424dad003838829115f5d9ff3ed69c8d2b4b26e10eb1a79331206c28fbb4734390a5e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000808507121b80c02388fad14726482e061b8da827000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000189b23422a9b84d8000000000000000000000000ad37fe3ddedf8cdee1022da1b17412cfb649559600000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000020fd1cf6fd41f229ca86ada0584c63c49c3d66bbc90002000000000000000004380000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a8513956efd63537b00bb3b152d3c4961207b6ca14d6f506c66fc0aef4c8e2e176b5000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000cb444e90d8198415266c6a2724b7900fb12fc56e0000000000000000000000009c58bacc331c9aa871afd802db6379a98e80cedb000000000000000000000000000000000000000000000000000000000000004500000000000000000000000015b4c67070d3748b8ec93c8a32f7efe2e8f684c900000000000000000000000000000000000000000000000000000000000000c0056e9806d953dbe2df4352a90ad2c1148c51460e941107f0909fae382b1661cf000000000000000000000000000000000000000000000000000000000000004000000000000000000000000022441d81416430a54336ab28765abd31a792ad37000000000000000000000000ab70bcb260073d036d1660201e9d5405f5829b7a0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a85133f583d55c4509d5e10ebe3c7c69bce17af4c57419d6c9c90c8f588dd3232c0d000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000af204776c7245bf4147c2612bf6e5972ee4837010000000000000000000000006c76971f98945ae98dd7d4dfca8711ebea946ea600000000000000000000000000000000000000000000000410d586a20a4c0000000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000020bc2acf5e821c5c9f8667a36bb1131dad26ed64f9000200000000000000000063a2646970667358221220c3b6b701e7d5db53232efcebe1fe1bdd40a35653449ba7cd10551b9e5bf6a94a64736f6c63430008190033", - "methodIdentifiers": { - "factory()": "c45a0155", - "getSnapshot(address)": "21570256", - "isLegacy(address)": "2aec79a0", - "isLegacyEnabled(address)": "10029daa", - "order(address,uint256[])": "27242c9b", - "tokens(address)": "e4860339" - }, - "rawMetadata": "{\"compiler\":{\"version\":\"0.8.25+commit.b61c2a91\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidArrayLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MathOverflowedMulDiv\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoOrder\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PoolDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PoolIsClosed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PoolIsPaused\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"amm\",\"type\":\"address\"}],\"name\":\"COWAMMPoolCreated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"factory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"amm\",\"type\":\"address\"}],\"name\":\"getSnapshot\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"amm\",\"type\":\"address\"}],\"name\":\"isLegacy\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"amm\",\"type\":\"address\"}],\"name\":\"isLegacyEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"prices\",\"type\":\"uint256[]\"}],\"name\":\"order\",\"outputs\":[{\"components\":[{\"internalType\":\"contract IERC20\",\"name\":\"sellToken\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"buyToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"sellAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"buyAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"validTo\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"appData\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"feeAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"kind\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"partiallyFillable\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"sellTokenBalance\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"buyTokenBalance\",\"type\":\"bytes32\"}],\"internalType\":\"struct GPv2Order.Data\",\"name\":\"_order\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"struct GPv2Interaction.Data[]\",\"name\":\"preInteractions\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"struct GPv2Interaction.Data[]\",\"name\":\"postInteractions\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"sig\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"tokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"_tokens\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"MathOverflowedMulDiv()\":[{\"details\":\"Muldiv operation overflow.\"}],\"PoolDoesNotExist()\":[{\"details\":\"Indexers monitoring CoW AMM pools MAY use this as a signal to purge the pool from their index.\"}],\"PoolIsClosed()\":[{\"details\":\"Indexers monitoring CoW AMM pools MAY use this as a signal to purge the pool from their index.\"}],\"PoolIsPaused()\":[{\"details\":\"Indexers monitoring CoW AMM pools SHOULD use this as a signal to retain the pool in the index with back-off on polling for orders.\"}]},\"events\":{\"COWAMMPoolCreated(address)\":{\"params\":{\"amm\":\"The address of the newly tradeable CoW AMM Pool\"}}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"This is a specific hack to broadcast legacy data in a forward-compatible\"},\"getSnapshot(address)\":{\"details\":\"Returns the IConditionalOrder.ConditionalOrderParams for a legacy CoW AMM. Returns bytes(0) if the pool isn't found in the snapshot data.\"},\"isLegacy(address)\":{\"details\":\"Given an `amm`, check if it is in the hardcoded list of legacy CoW AMMs.\"},\"isLegacyEnabled(address)\":{\"details\":\"Given an `amm` that is is known to be legacy, check if it is still valid.\"},\"order(address,uint256[])\":{\"details\":\"Reverts with `NoOrder` if the `pool` has no canonical order matching the given price vector.\",\"params\":{\"pool\":\"to calculate the order / signature for\",\"prices\":\"supplied for determining the order, assumed to be in the same order as returned from `tokens(pool)`. Tokens prices are expressed relative to each other: for example, if tokens[0] is WETH, tokens[2] is DAI, and the price is 1 WETH per 3000 DAI, then a valid price vector is [3000, *, 1, ...]. If tokens[1] is another stablecoin with 18 decimals, then a valid price vector could be [3000, 3000, 1, ...]. This price vector is compatible with the price vector used in a call to `settle`, assuming the traded token array is in the same order as in `tokens(pool)`.\"},\"returns\":{\"_order\":\"The CoW Protocol JIT order\",\"postInteractions\":\"The array array for any **POST** interactions (empty if none)\",\"preInteractions\":\"The array array for any **PRE** interactions (empty if none)\",\"sig\":\"A valid CoW-Protocol signature for the resulting order using the ERC-1271 signature scheme.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"NoOrder()\":[{\"notice\":\"Returned by the `order` function if there is no order matching the supplied parameters.\"}],\"PoolDoesNotExist()\":[{\"notice\":\"All functions that take `pool` as an argument MUST revert with this error if the `pool` does not exist.\"}],\"PoolIsClosed()\":[{\"notice\":\"All functions that take `pool` as an argument MUST revert with this error in the event that the pool is closed (ONLY applicable if the pool can be closed).\"}],\"PoolIsPaused()\":[{\"notice\":\"All functions that take `pool` as an argument MUST revert with this error in the event that the pool is paused (ONLY applicable if the pool is pausable).\"}]},\"events\":{\"COWAMMPoolCreated(address)\":{\"notice\":\"AMM protocols capable of operating as a CoW AMM MUST emit an event on pool creation.\"}},\"kind\":\"user\",\"methods\":{\"factory()\":{\"notice\":\"AMM Pool helpers MUST return the factory target for indexing of CoW AMM pools.\"},\"order(address,uint256[])\":{\"notice\":\"AMM Pool helpers MUST provide a method for returning the canonical order required to satisfy the pool's invariants, given a pricing vector.\"},\"tokens(address)\":{\"notice\":\"AMM Pool helpers MUST return all tokens that may be traded on this pool. The order of the tokens is expected to be consistent and must be the same as that used for the input price vector in the `order` function.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/ConstantProductHelper.sol\":\"ConstantProductHelper\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000},\"remappings\":[\":@openzeppelin/=lib/composable-cow/lib/@openzeppelin/\",\":@openzeppelin/contracts/=lib/openzeppelin/contracts/\",\":composable-cow/=lib/composable-cow/\",\":cowprotocol/=lib/composable-cow/lib/cowprotocol/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/composable-cow/lib/murky/src/\",\":openzeppelin-contracts/=lib/composable-cow/lib/murky/lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin/\",\":safe/=lib/composable-cow/lib/safe/\",\":uniswap-v2-core/=lib/uniswap-v2-core/contracts/\",\"lib/composable-cow:@openzeppelin/=lib/openzeppelin/contracts/\",\"lib/composable-cow:@openzeppelin/contracts/=lib/openzeppelin/contracts/\",\"lib/composable-cow:cowprotocol/=lib/composable-cow/lib/cowprotocol/src/\",\"lib/composable-cow:safe/=lib/composable-cow/lib/safe/contracts/\"]},\"sources\":{\"lib/composable-cow/lib/cowprotocol/src/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0x2db02cc0e23db99d10cd21590425b714060a556bcfb934cb5ab3b80aef1610ba\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c05f8a21a244e6566a3e555028cebeebd1c38902f0cea2e9b014cc7becaf3140\",\"dweb:/ipfs/QmTBY1GphjwAnY2nC9qKMwj5HeAUJMgFdo5YZcVxsVyqFb\"]},\"lib/composable-cow/lib/cowprotocol/src/contracts/libraries/GPv2Interaction.sol\":{\"keccak256\":\"0x7b69b3d536c995e84a5fe4ec3dc63ddf01a3538f72ece83828e87aa90df33a7d\",\"license\":\"LGPL-3.0-or-later\",\"urls\":[\"bzz-raw://7ba34b22f5b25cd6fecfd0d5e9b6077b36130a2cb4539b1311de0f328c226958\",\"dweb:/ipfs/QmUURWvPbrZ6Z4iDv8Sa8soQCZyKZCsCcdMzgY9Jy5RNV2\"]},\"lib/composable-cow/lib/cowprotocol/src/contracts/libraries/GPv2Order.sol\":{\"keccak256\":\"0xb96efb76433446cf0ccb9f5bc926301a9c8bcbfd17dcd6a36a1e6207f5b436b2\",\"license\":\"LGPL-3.0-or-later\",\"urls\":[\"bzz-raw://5ec097e17d3e47e16808a5246a99af7ef618bb58ccb61d7331bfca1929cbbd82\",\"dweb:/ipfs/QmbH7rg5s5gdpa5KENMUXHyGBWJyQn6XEwv9JakRSCcv8n\"]},\"lib/composable-cow/lib/safe/contracts/Safe.sol\":{\"keccak256\":\"0xbab2f7bec33283e349342e7b23f5191c678c64fe02065bac4f4f44fb3f5d2638\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://f95884e85691d49ba3efb9b2a160466fed17377bfa92fc8bf5923f3c61e99119\",\"dweb:/ipfs/QmQjhP9RnB3Cj3DNpWLzWqqvRdKBya6Efx6xzmRrwLqjm9\"]},\"lib/composable-cow/lib/safe/contracts/base/Executor.sol\":{\"keccak256\":\"0xf0be832e7529e92000544170a5529d73666a9b5e836b30c6f2ed6ef7d7d8c94a\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://710022b40c9f78a5b55b97f6ce600e4834df2ddd36bf714974d953883c82d58c\",\"dweb:/ipfs/QmbdJNKH5opevm7HxQKQAe6W7dQTgSHKa4nKvbUNGRcQQp\"]},\"lib/composable-cow/lib/safe/contracts/base/FallbackManager.sol\":{\"keccak256\":\"0x646b3088f15af8b4f71ac5eeffaa24ce0c1abed5f494f90368208b09e35d5165\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://7975be46d228510c70659b18076aecb3b0e7331b4d3a162444304145143bdc6e\",\"dweb:/ipfs/QmRRbZrWUnoky6pVo8zMUzCTsshR4sZ2FjR13s8vyAb8dV\"]},\"lib/composable-cow/lib/safe/contracts/base/GuardManager.sol\":{\"keccak256\":\"0xedfc7c830ab35e52d1208986b253f3422c2f0ca68054c10819fb348fcc6ccf5d\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://3ff8a4194d1160d2e23142937bc9d7eac7b6b553b1ee226390a0df07ebac1b64\",\"dweb:/ipfs/QmSw8Y7z4TQrUTEosdWqcug7TUv9Tg1kxqMKHd7RuTnyzx\"]},\"lib/composable-cow/lib/safe/contracts/base/ModuleManager.sol\":{\"keccak256\":\"0xd71b0d56dce386fa6f67c51061face071b2c7b03ec535d68717e2538ec47113a\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://30812896d9f57cae84a432c67fbb3007d566071ec203b2992f1c0f762722df0d\",\"dweb:/ipfs/QmRyJ3JbsUwDQxQDTrqDDX4qNtVu7XiW8cD8WP5kgNJGGz\"]},\"lib/composable-cow/lib/safe/contracts/base/OwnerManager.sol\":{\"keccak256\":\"0xec9799093eb7a73461cd5e563198751ee222f956f754ea622a03fe953e515b2c\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://5729c58b14e7b656c71dd3377e9519c0d34ef8c04851a9a21c3d62393e4fae7a\",\"dweb:/ipfs/QmRRtfFpNqvdANny9TYBr8rA3HbT1egUCpb2uXALMHkVxK\"]},\"lib/composable-cow/lib/safe/contracts/common/Enum.sol\":{\"keccak256\":\"0x4ff3008926a118e9f36e6747facc39dd13168e0d00f516888ae966ec20766453\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://385929800d1c0f92eb165fcf37a9e28b395b17d8b74f74755654d3a096a0fc34\",\"dweb:/ipfs/QmagieLuN2jrp2oJHFyZuyz65Sh1CcupnXSEKypGFS5Gvo\"]},\"lib/composable-cow/lib/safe/contracts/common/NativeCurrencyPaymentFallback.sol\":{\"keccak256\":\"0x3ddcd4130c67326033dcf773d2d87d7147e3a8386993ea3ab3f1c38da406adba\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://740a729397b6a0d903f4738a50e856d4e5039555024937b148d97529525dbfa9\",\"dweb:/ipfs/QmQJuNVvHbkeJ6jjd75D8FsZBPXH6neoGBZdQgtsA82E7g\"]},\"lib/composable-cow/lib/safe/contracts/common/SecuredTokenTransfer.sol\":{\"keccak256\":\"0x1eb8c3601538b73dd6a823ac4fca49bb8adc97d1302a936622156636c971eb05\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://c26495b1fe9229ea17f90b70f295030880d629b9ea3016ea20b634983865f7b3\",\"dweb:/ipfs/QmTc1UmKcynkKn8DeviLMuy6scxNvAVSdLoX4ndUtdEL9N\"]},\"lib/composable-cow/lib/safe/contracts/common/SelfAuthorized.sol\":{\"keccak256\":\"0xfb0e176bb208e047a234fe757e2acd13787e27879570b8544547ac787feb5f13\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://8e9a317f0c3c02ab1d6c38039bff2b3e0c97f4dc9d229d3d9149c1af1c5023b3\",\"dweb:/ipfs/QmNcZjNChsuXF34T6f3Zu7i3tnqvKN4NyWBWZ4tXLH9kMu\"]},\"lib/composable-cow/lib/safe/contracts/common/SignatureDecoder.sol\":{\"keccak256\":\"0x2a3baf0efa1585ddf2276505c6d34fa16f01cafff1288e40110d5e67fb459c7c\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://00cdded3068b9051ee0a966f40926fbc57dbe7ef8bf4285db3740f9d50468c80\",\"dweb:/ipfs/QmcP5hKmaRqBe7TpgoXtncZqsNKKdCCKxZgXoxEL4Nj5F4\"]},\"lib/composable-cow/lib/safe/contracts/common/Singleton.sol\":{\"keccak256\":\"0xcab7c6e5fb6d7295a9343f72fec26a2f632ddfe220a6f267b5c5a1eb2f9bce50\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://dd1c31d5787ef590a60f6b0dbc74d09e6fe4d3ad2f0529940d662bf315521cde\",\"dweb:/ipfs/QmSAS5DYrGksJe4cPQ4wLrveXa1CjxAuEiohcLpPG5h2bo\"]},\"lib/composable-cow/lib/safe/contracts/common/StorageAccessible.sol\":{\"keccak256\":\"0x2c5412a8f014db332322a6b24ee3cedce15dca17a721ae49fdef368568d4391e\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://e775f267d3e60ebe452d9533f46a0eb1f1dc4593d1bcb553e86cea205a5f361e\",\"dweb:/ipfs/QmQdYDHGQsiMx1AADWRhX7tduU9ycTzrT5q3zBWvphXzKZ\"]},\"lib/composable-cow/lib/safe/contracts/external/SafeMath.sol\":{\"keccak256\":\"0x5f856674d9be11344c5899deb43364e19baa75bc881cada4c159938270b2bd89\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://351c66e5fe92c0a51f79d133521545dabdd3f756312a7b1428c1fc813c512a1c\",\"dweb:/ipfs/QmdnrRmgef8SdamEU6fVEqFD5RQwXeDFTfQuZEfX2vxC4x\"]},\"lib/composable-cow/lib/safe/contracts/handler/ExtensibleFallbackHandler.sol\":{\"keccak256\":\"0x7e511290dae21c9b1710c9250320d9b98ffd71c9501af354814485b58e1b64e9\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://3e55ba23bde90d2cdd07baa7172ea41bdc1d638bc7b6eb5dce03189d86412515\",\"dweb:/ipfs/QmbxH73sqooeQL8ehsP2FDoXhLBoPs3wr3nod6ZgJwVcFV\"]},\"lib/composable-cow/lib/safe/contracts/handler/HandlerContext.sol\":{\"keccak256\":\"0x3e105ebac003af9c8d34e3eed517ff0355d5f487e17478c85df0f225b04846f5\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://657bec347d746453883c461a3d9a2275bf2b99625dcaef0960e1c0276c3d56c4\",\"dweb:/ipfs/QmUGj8Tzs1CsmUf63LbTMK81EEGtYYnWKLGdHHtoYCd9CF\"]},\"lib/composable-cow/lib/safe/contracts/handler/extensible/ERC165Handler.sol\":{\"keccak256\":\"0x4d562221e6645b6e79da99d2b322331617051fa90e06ec7ce3f9a6a87bae116c\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://5a574dd50b9e9a594afda4a96701295e18a0054fcaf5083573ee80033b2da060\",\"dweb:/ipfs/QmNQf5rfHqMCGKBcqZowz89JEZe8rjjoYEkySBy7oxwh4Y\"]},\"lib/composable-cow/lib/safe/contracts/handler/extensible/ExtensibleBase.sol\":{\"keccak256\":\"0xe5b71121b0020728158ee60756982e74809f9d77cb294a6d65930bff09d84d15\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://fd7fd2702b31fc8569a9986a476dd9fe9aa76624d0da6d832547f624426925f9\",\"dweb:/ipfs/QmWjYGtW38Fnwvm8qFvoJYhz2nTuySGkHouwRF3eksd6Nh\"]},\"lib/composable-cow/lib/safe/contracts/handler/extensible/FallbackHandler.sol\":{\"keccak256\":\"0x3020c96c812548a2bf6413168ee21033638a36736b695909f7cf54277beefd76\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://6ffdf49fb516791f4cad239fc780bb5d9934bb06744b99b0fbc067f31ad13591\",\"dweb:/ipfs/QmPXwVoDhnhnQFSxEiHDZYRQJ5ozAECSFrUHMTjwAJ1LuM\"]},\"lib/composable-cow/lib/safe/contracts/handler/extensible/MarshalLib.sol\":{\"keccak256\":\"0x36eacc47b1ce7697e679c1b5c0d3a86d8f46a0436b666f86e88df04765cde5c1\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://7097bfb174ea424ef55f9a5b55f4a9857f7368cdd3061888f5ffb3e29503f071\",\"dweb:/ipfs/QmRPvAvMdGRuh8AjePtamBGUU55p1tSP8ZHUUMfxWgi1ew\"]},\"lib/composable-cow/lib/safe/contracts/handler/extensible/SignatureVerifierMuxer.sol\":{\"keccak256\":\"0x51e8dad81059527f9b6b6827d742a0fbc0960c66e364dd1e67c8f151970c6ee4\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://b368a4eb15d50487986db1543a5c786324a4d0de680a421d131e21c25459f666\",\"dweb:/ipfs/QmVca3J2JBEZtxW3uNMvYc9ugQH24CqantLnVzKcZwG71W\"]},\"lib/composable-cow/lib/safe/contracts/handler/extensible/TokenCallbacks.sol\":{\"keccak256\":\"0x549d737c3eef66cec2a858b34dce4db42e56d8f053635742230873e6049e81ed\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://f03f130c36be396895acfa7891ccca36725c6a6496085d88fc33071e00093073\",\"dweb:/ipfs/QmfLfenjQ1gWnotx5Vdda1kJBqjnCi53bGNqyZ5cN6wxXV\"]},\"lib/composable-cow/lib/safe/contracts/interfaces/ERC1155TokenReceiver.sol\":{\"keccak256\":\"0x87e62665c041cade64e753ecdccf931cb100ab6e4bcc98769c1e6474be9db493\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://59ca1157dcfe19c72b9d1244a6ae5ec70fee9793d4d8af523b70f22ae567d55c\",\"dweb:/ipfs/QmfE3kv73QuQWAWQND927LWVHVLCp19m1mLUvxVYJDEFZM\"]},\"lib/composable-cow/lib/safe/contracts/interfaces/ERC721TokenReceiver.sol\":{\"keccak256\":\"0x96c4c5457fede2d4c6012011dfda36f8e8ffdb7388468f2dddb35661538bf479\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://99a54737bc23722f79ec9cf9de63ba35b556a61df453eb332f3cac783503f26c\",\"dweb:/ipfs/QmbLW5C2RhoLbwDWEPtTKpyYE5apT9B3q4U11PZG3wSM1n\"]},\"lib/composable-cow/lib/safe/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0x779ed3893a8812e383670b755f65c7727e9343dadaa4d7a4aa7f4aa35d859fdb\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://bb2039e1459ace1e68761e873632fc339866332f9f5ecb7452a0bc3a3b847e89\",\"dweb:/ipfs/QmYXvDQXJnDkXFvsvKLyZXaAv4x42qvtbtmwHftP4RKX38\"]},\"lib/composable-cow/lib/safe/contracts/interfaces/ISignatureValidator.sol\":{\"keccak256\":\"0x2459cb3ed73ecb80e1e7a6508d09a58cc59570b049f77042f669dedfcc5f6457\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://3c4a1371948b11f78171bc4ae4fd169a1eec11e5c4b273eb2c54bc030a1aae25\",\"dweb:/ipfs/QmPuztatXZYVS65n8YbCyccJFZYPP6zQfBQ8tTY27pB978\"]},\"lib/composable-cow/src/BaseConditionalOrder.sol\":{\"keccak256\":\"0x8b429a011579b3d84df3bb3135b3299054790018220666befa9ab5af24f49e8f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a30f0535cf7fc4fabc42b83a04bd687b8e989ae8d0c3f6db63b69504c15a7a34\",\"dweb:/ipfs/QmSeKTQWEx74SV6hrdX3sGLV6L9MF8fPPqoyyvdB4Kt3bo\"]},\"lib/composable-cow/src/ComposableCoW.sol\":{\"keccak256\":\"0xcf1583fd0565c921f108e81d516591c9ff123f840dbdd349e9e98d793de4409f\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://112df8eb50205574a22bbb8db9f7d064ec4c753052f798668db88fd222724883\",\"dweb:/ipfs/QmSV7gBaWDn4PhJGCYayuFqvRortZHnzUjsZNGrm2NriEu\"]},\"lib/composable-cow/src/interfaces/IConditionalOrder.sol\":{\"keccak256\":\"0xe9e47811223793dfa9a5fc3098cf874385f547e536ef47da634b505659aeedc7\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://40c3daf74830a4394052b916ca920fce07761a2b66e8af8c877b72d2efaa49eb\",\"dweb:/ipfs/QmZ9adA6R1hCHnvg6DwnTn7zqta6zU1Ctb564zb8aiqRFD\"]},\"lib/composable-cow/src/interfaces/ISwapGuard.sol\":{\"keccak256\":\"0xac211fb24463a9c04a05bb58fe42d9bea10e58fe9ca35e7f544868eeb5972339\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://3ce2a180c5368c6807aecafb242675476bbc653ac72b3bd727db3467efe8b900\",\"dweb:/ipfs/QmWzTqMQCuvX5Zpn2sjxYUS9o3upsip4yNvwCMQGbXAk6Y\"]},\"lib/composable-cow/src/interfaces/IValueFactory.sol\":{\"keccak256\":\"0x3304ef8a0a1727258ac8278bf5426daeac37ece4653eaaff87b15143814a8122\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://9934d278069dd9474065777833a81e65af227b85d350b6c1f012b812101be9de\",\"dweb:/ipfs/QmcMBdvY7wLs92FCyutDGQGtHnYryjnaykREvDNBNM8Yih\"]},\"lib/composable-cow/src/types/ConditionalOrdersUtilsLib.sol\":{\"keccak256\":\"0x38e4ce4fc58c018f510ee45d78ae49253e8aa70fdf559d83ebb6c838c6b47aae\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a38ccd5b8ce2895a77b7474b1ac36ebfccc975b3839f6d3bfef72700f8f6f777\",\"dweb:/ipfs/QmSfs5zZ4U14NkZYSqAFUBcuKGjyfMM5Dp2sbj14FmVYPf\"]},\"lib/composable-cow/src/vendored/CoWSettlement.sol\":{\"keccak256\":\"0x4e4e317b24017cd87eb11d16368b8c06ec19306d31946c330a86f9f136df38d7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://34b9b2fc2c89e60497457cd812da9c53718c15ddfbf70f6e11832d22092c1840\",\"dweb:/ipfs/QmYFzaynWZfdpmFRf2dZrQ32Ep53AtQDd5fTE3a89xVkaR\"]},\"lib/openzeppelin/contracts/interfaces/IERC1271.sol\":{\"keccak256\":\"0x85a45f3f10014a0f8be41157a32b6a5f905753ea64a4b64e29fc12b7deeecf39\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c3c74009ce36136b36c77c23935b8e4a7b4f253be2da2be4fb4a916b1ce43743\",\"dweb:/ipfs/QmcH36v3iN7SJJuF73AunLR2LtNxhVJ1wm63ph4dPZ4pcL\"]},\"lib/openzeppelin/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0xce41876e78d1badc0512229b4d14e4daf83bc1003d7f83978d18e0e56f965b9c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a2608291cb038b388d80b79a06b6118a42f7894ff67b7da10ec0dbbf5b2973ba\",\"dweb:/ipfs/QmWohqcBLbcxmA4eGPhZDXe5RYMMEEpFq22nfkaUMvTfw1\"]},\"lib/openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c\",\"dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq\"]},\"lib/openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"keccak256\":\"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d\",\"dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi\"]},\"lib/openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0\",\"dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3\"]},\"lib/openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/openzeppelin/contracts/utils/cryptography/MerkleProof.sol\":{\"keccak256\":\"0x6400c4bee15052e043e5d10315135972529bd1c8012f43da494dc6b4f4661058\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://da5d3d47d35af4373743a559ea4b9b7ecfe4bab6f0703f410c1e59959b7966ac\",\"dweb:/ipfs/QmTHdoghh4WLu4yURjGEgRk162pcwwdsG52MPGa12GqnGR\"]},\"lib/openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875\",\"dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L\"]},\"src/ConstantProduct.sol\":{\"keccak256\":\"0x4883252f066b38972e5466f54d7cbf6e1a5b7c55823f012837f254ccd7aaa707\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://5bcfdb33677ad8f14d939cb1570fbcdd0c5d25843d93f35e70c41a58f278345c\",\"dweb:/ipfs/QmRN1eRCJoGj3RygAbaRaGQ85DJjApEZv1qLUqGYbh1frT\"]},\"src/ConstantProductFactory.sol\":{\"keccak256\":\"0xd9e2a5d4cc9cde16d1d8469194eff6e32b97758413574fc866067a392d3d9255\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://1745aea9ad3571a9edf950a8fd9d745042b2c697fa1bd0c46982fddc21dc7fc8\",\"dweb:/ipfs/QmVQMyM3uSRzvL61Fnb9rH5mYaLBQrkh69iB9Gx3Lk6QWD\"]},\"src/ConstantProductHelper.sol\":{\"keccak256\":\"0xb184c91352617489a5f22ce8bb29f9840a00f8055ac283e6d1d85984e786b677\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://9413468585f4d8faac44b2c1f7c02cd4f21f5df570c6573c7ccab584a420d366\",\"dweb:/ipfs/QmSE5dkMEjbt1pEv5Y1Ao7EeudNWET7TwtAP6FPUVXiGbR\"]},\"src/interfaces/ICOWAMMPoolFactory.sol\":{\"keccak256\":\"0x2b65e467fa06b6149a7f2eee4879973fc5845ab12f86e718f1c2708e0bf98829\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://2ea7e105fc8953eb819f64a1e426881d834afbe990fbcda08c30c18a2d1a332a\",\"dweb:/ipfs/QmSUpommi6khq2EgLSTNSEorHjKtoztqa9D5BfTZ83LBqX\"]},\"src/interfaces/ICOWAMMPoolHelper.sol\":{\"keccak256\":\"0xa5b11fe7aefe1d3ab091d5f381c15381a3dc7c5a4e0a597c33cbb0deecd3d704\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://6525ad30ec83975097671ec389ed20772dcbd0de07ea0e92b6b9bdf0a12c0163\",\"dweb:/ipfs/QmcYnz4FmMWLqdWpjEGHDXCWAWbKu98vDzUcHpkLJ5Cfg6\"]},\"src/interfaces/IPriceOracle.sol\":{\"keccak256\":\"0xf954ab9dc44a0ce3612b65d803b59c3fe1f64803870328580c36802460c8c29e\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://7cef4a090daa870e3c8cfa5d6498efae96427d4fe4e1a2784d26c088eea920e2\",\"dweb:/ipfs/QmU56CEHqif11NaomtVBNqrBTsV6CPPvjfN88SCe7V1Uxu\"]},\"src/interfaces/ISettlement.sol\":{\"keccak256\":\"0x51833975e3c96a6bfc9b255d122e145fc28a968b920fda5744ea0d9bf022e84a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://3b2228e777904811715e693f6fe577be18b128db72219a6f3ca528fb9c119bc6\",\"dweb:/ipfs/QmXnNgdMLJBhztH5US1EnxGV8PB4yvLZqhN1sTkvrdvSZ2\"]},\"src/legacy/Helper.sol\":{\"keccak256\":\"0xf0494ad9f71fdf2602dbd30f885ffd0b1a88beedcd7459ec75f759efb11dc1c4\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://e6b3916e22daa8fd8deae7b85b270972ea652ff696301852644f077dc8f82b2d\",\"dweb:/ipfs/QmcWJX9WoiBVsCjZVuv6SDYAQYDWDctXD8nkZVMqSbxZzK\"]},\"src/legacy/Snapshot.sol\":{\"keccak256\":\"0x2a0c3ff6bf1b8a86161f982589aed2012dd462aa8a1cdc06a73b9c2ca636ff4f\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://db6d85afd2b2711ebc9282c351c9a5e491d8d20f0646ae8ab45f548e426ab1eb\",\"dweb:/ipfs/QmNzZCc2CWBerhW2Eu44QRowFokYnCMcWaNiPJoRMsLKxV\"]},\"src/libraries/GetTradeableOrder.sol\":{\"keccak256\":\"0x095d47c2d45ff22440ddf8f76bb6b9cbfd7250d35849e79ccb89c8eeb126b645\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://787103261569a4b07b762f6a106178e5ec384b3b89bd24bfc079bc27ccde4b72\",\"dweb:/ipfs/QmTYN4jPyPecNWwqKpqqFbvZtBPwWvf4Z8MCPTSmZy85wM\"]}},\"version\":1}", - "metadata": { - "compiler": { - "version": "0.8.25+commit.b61c2a91" - }, - "language": "Solidity", - "output": { - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "type": "error", - "name": "InvalidArrayLength" - }, - { - "inputs": [], - "type": "error", - "name": "MathOverflowedMulDiv" - }, - { - "inputs": [], - "type": "error", - "name": "NoOrder" - }, - { - "inputs": [], - "type": "error", - "name": "PoolDoesNotExist" - }, - { - "inputs": [], - "type": "error", - "name": "PoolIsClosed" - }, - { - "inputs": [], - "type": "error", - "name": "PoolIsPaused" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "amm", - "type": "address", - "indexed": true - } - ], - "type": "event", - "name": "COWAMMPoolCreated", - "anonymous": false - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "factory", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "amm", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function", - "name": "getSnapshot", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "amm", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function", - "name": "isLegacy", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "amm", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function", - "name": "isLegacyEnabled", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "pool", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "prices", - "type": "uint256[]" - } - ], - "stateMutability": "view", - "type": "function", - "name": "order", - "outputs": [ - { - "internalType": "struct GPv2Order.Data", - "name": "_order", - "type": "tuple", - "components": [ - { - "internalType": "contract IERC20", - "name": "sellToken", - "type": "address" - }, - { - "internalType": "contract IERC20", - "name": "buyToken", - "type": "address" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "uint256", - "name": "sellAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "buyAmount", - "type": "uint256" - }, - { - "internalType": "uint32", - "name": "validTo", - "type": "uint32" - }, - { - "internalType": "bytes32", - "name": "appData", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "feeAmount", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "kind", - "type": "bytes32" - }, - { - "internalType": "bool", - "name": "partiallyFillable", - "type": "bool" - }, - { - "internalType": "bytes32", - "name": "sellTokenBalance", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "buyTokenBalance", - "type": "bytes32" - } - ] - }, - { - "internalType": "struct GPv2Interaction.Data[]", - "name": "preInteractions", - "type": "tuple[]", - "components": [ - { - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "callData", - "type": "bytes" - } - ] - }, - { - "internalType": "struct GPv2Interaction.Data[]", - "name": "postInteractions", - "type": "tuple[]", - "components": [ - { - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "callData", - "type": "bytes" - } - ] - }, - { - "internalType": "bytes", - "name": "sig", - "type": "bytes" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "pool", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function", - "name": "tokens", - "outputs": [ - { - "internalType": "address[]", - "name": "_tokens", - "type": "address[]" - } - ] - } - ], - "devdoc": { - "kind": "dev", - "methods": { - "constructor": { - "details": "This is a specific hack to broadcast legacy data in a forward-compatible" - }, - "getSnapshot(address)": { - "details": "Returns the IConditionalOrder.ConditionalOrderParams for a legacy CoW AMM. Returns bytes(0) if the pool isn't found in the snapshot data." - }, - "isLegacy(address)": { - "details": "Given an `amm`, check if it is in the hardcoded list of legacy CoW AMMs." - }, - "isLegacyEnabled(address)": { - "details": "Given an `amm` that is is known to be legacy, check if it is still valid." - }, - "order(address,uint256[])": { - "details": "Reverts with `NoOrder` if the `pool` has no canonical order matching the given price vector.", - "params": { - "pool": "to calculate the order / signature for", - "prices": "supplied for determining the order, assumed to be in the same order as returned from `tokens(pool)`. Tokens prices are expressed relative to each other: for example, if tokens[0] is WETH, tokens[2] is DAI, and the price is 1 WETH per 3000 DAI, then a valid price vector is [3000, *, 1, ...]. If tokens[1] is another stablecoin with 18 decimals, then a valid price vector could be [3000, 3000, 1, ...]. This price vector is compatible with the price vector used in a call to `settle`, assuming the traded token array is in the same order as in `tokens(pool)`." - }, - "returns": { - "_order": "The CoW Protocol JIT order", - "postInteractions": "The array array for any **POST** interactions (empty if none)", - "preInteractions": "The array array for any **PRE** interactions (empty if none)", - "sig": "A valid CoW-Protocol signature for the resulting order using the ERC-1271 signature scheme." - } - } - }, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "factory()": { - "notice": "AMM Pool helpers MUST return the factory target for indexing of CoW AMM pools." - }, - "order(address,uint256[])": { - "notice": "AMM Pool helpers MUST provide a method for returning the canonical order required to satisfy the pool's invariants, given a pricing vector." - }, - "tokens(address)": { - "notice": "AMM Pool helpers MUST return all tokens that may be traded on this pool. The order of the tokens is expected to be consistent and must be the same as that used for the input price vector in the `order` function." - } - }, - "version": 1 - } - }, - "settings": { - "remappings": [ - "@openzeppelin/=lib/composable-cow/lib/@openzeppelin/", - "@openzeppelin/contracts/=lib/openzeppelin/contracts/", - "composable-cow/=lib/composable-cow/", - "cowprotocol/=lib/composable-cow/lib/cowprotocol/src/", - "ds-test/=lib/forge-std/lib/ds-test/src/", - "erc4626-tests/=lib/openzeppelin/lib/erc4626-tests/", - "forge-std/=lib/forge-std/src/", - "murky/=lib/composable-cow/lib/murky/src/", - "openzeppelin-contracts/=lib/composable-cow/lib/murky/lib/openzeppelin-contracts/", - "openzeppelin/=lib/openzeppelin/", - "safe/=lib/composable-cow/lib/safe/", - "uniswap-v2-core/=lib/uniswap-v2-core/contracts/", - "lib/composable-cow:@openzeppelin/=lib/openzeppelin/contracts/", - "lib/composable-cow:@openzeppelin/contracts/=lib/openzeppelin/contracts/", - "lib/composable-cow:cowprotocol/=lib/composable-cow/lib/cowprotocol/src/", - "lib/composable-cow:safe/=lib/composable-cow/lib/safe/contracts/" - ], - "optimizer": { - "enabled": true, - "runs": 100000 - }, - "metadata": { - "bytecodeHash": "ipfs" - }, - "compilationTarget": { - "src/ConstantProductHelper.sol": "ConstantProductHelper" - }, - "evmVersion": "cancun", - "libraries": {} - }, - "sources": { - "lib/composable-cow/lib/cowprotocol/src/contracts/interfaces/IERC20.sol": { - "keccak256": "0x2db02cc0e23db99d10cd21590425b714060a556bcfb934cb5ab3b80aef1610ba", - "urls": [ - "bzz-raw://c05f8a21a244e6566a3e555028cebeebd1c38902f0cea2e9b014cc7becaf3140", - "dweb:/ipfs/QmTBY1GphjwAnY2nC9qKMwj5HeAUJMgFdo5YZcVxsVyqFb" - ], - "license": "MIT" - }, - "lib/composable-cow/lib/cowprotocol/src/contracts/libraries/GPv2Interaction.sol": { - "keccak256": "0x7b69b3d536c995e84a5fe4ec3dc63ddf01a3538f72ece83828e87aa90df33a7d", - "urls": [ - "bzz-raw://7ba34b22f5b25cd6fecfd0d5e9b6077b36130a2cb4539b1311de0f328c226958", - "dweb:/ipfs/QmUURWvPbrZ6Z4iDv8Sa8soQCZyKZCsCcdMzgY9Jy5RNV2" - ], - "license": "LGPL-3.0-or-later" - }, - "lib/composable-cow/lib/cowprotocol/src/contracts/libraries/GPv2Order.sol": { - "keccak256": "0xb96efb76433446cf0ccb9f5bc926301a9c8bcbfd17dcd6a36a1e6207f5b436b2", - "urls": [ - "bzz-raw://5ec097e17d3e47e16808a5246a99af7ef618bb58ccb61d7331bfca1929cbbd82", - "dweb:/ipfs/QmbH7rg5s5gdpa5KENMUXHyGBWJyQn6XEwv9JakRSCcv8n" - ], - "license": "LGPL-3.0-or-later" - }, - "lib/composable-cow/lib/safe/contracts/Safe.sol": { - "keccak256": "0xbab2f7bec33283e349342e7b23f5191c678c64fe02065bac4f4f44fb3f5d2638", - "urls": [ - "bzz-raw://f95884e85691d49ba3efb9b2a160466fed17377bfa92fc8bf5923f3c61e99119", - "dweb:/ipfs/QmQjhP9RnB3Cj3DNpWLzWqqvRdKBya6Efx6xzmRrwLqjm9" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/base/Executor.sol": { - "keccak256": "0xf0be832e7529e92000544170a5529d73666a9b5e836b30c6f2ed6ef7d7d8c94a", - "urls": [ - "bzz-raw://710022b40c9f78a5b55b97f6ce600e4834df2ddd36bf714974d953883c82d58c", - "dweb:/ipfs/QmbdJNKH5opevm7HxQKQAe6W7dQTgSHKa4nKvbUNGRcQQp" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/base/FallbackManager.sol": { - "keccak256": "0x646b3088f15af8b4f71ac5eeffaa24ce0c1abed5f494f90368208b09e35d5165", - "urls": [ - "bzz-raw://7975be46d228510c70659b18076aecb3b0e7331b4d3a162444304145143bdc6e", - "dweb:/ipfs/QmRRbZrWUnoky6pVo8zMUzCTsshR4sZ2FjR13s8vyAb8dV" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/base/GuardManager.sol": { - "keccak256": "0xedfc7c830ab35e52d1208986b253f3422c2f0ca68054c10819fb348fcc6ccf5d", - "urls": [ - "bzz-raw://3ff8a4194d1160d2e23142937bc9d7eac7b6b553b1ee226390a0df07ebac1b64", - "dweb:/ipfs/QmSw8Y7z4TQrUTEosdWqcug7TUv9Tg1kxqMKHd7RuTnyzx" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/base/ModuleManager.sol": { - "keccak256": "0xd71b0d56dce386fa6f67c51061face071b2c7b03ec535d68717e2538ec47113a", - "urls": [ - "bzz-raw://30812896d9f57cae84a432c67fbb3007d566071ec203b2992f1c0f762722df0d", - "dweb:/ipfs/QmRyJ3JbsUwDQxQDTrqDDX4qNtVu7XiW8cD8WP5kgNJGGz" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/base/OwnerManager.sol": { - "keccak256": "0xec9799093eb7a73461cd5e563198751ee222f956f754ea622a03fe953e515b2c", - "urls": [ - "bzz-raw://5729c58b14e7b656c71dd3377e9519c0d34ef8c04851a9a21c3d62393e4fae7a", - "dweb:/ipfs/QmRRtfFpNqvdANny9TYBr8rA3HbT1egUCpb2uXALMHkVxK" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/common/Enum.sol": { - "keccak256": "0x4ff3008926a118e9f36e6747facc39dd13168e0d00f516888ae966ec20766453", - "urls": [ - "bzz-raw://385929800d1c0f92eb165fcf37a9e28b395b17d8b74f74755654d3a096a0fc34", - "dweb:/ipfs/QmagieLuN2jrp2oJHFyZuyz65Sh1CcupnXSEKypGFS5Gvo" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/common/NativeCurrencyPaymentFallback.sol": { - "keccak256": "0x3ddcd4130c67326033dcf773d2d87d7147e3a8386993ea3ab3f1c38da406adba", - "urls": [ - "bzz-raw://740a729397b6a0d903f4738a50e856d4e5039555024937b148d97529525dbfa9", - "dweb:/ipfs/QmQJuNVvHbkeJ6jjd75D8FsZBPXH6neoGBZdQgtsA82E7g" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/common/SecuredTokenTransfer.sol": { - "keccak256": "0x1eb8c3601538b73dd6a823ac4fca49bb8adc97d1302a936622156636c971eb05", - "urls": [ - "bzz-raw://c26495b1fe9229ea17f90b70f295030880d629b9ea3016ea20b634983865f7b3", - "dweb:/ipfs/QmTc1UmKcynkKn8DeviLMuy6scxNvAVSdLoX4ndUtdEL9N" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/common/SelfAuthorized.sol": { - "keccak256": "0xfb0e176bb208e047a234fe757e2acd13787e27879570b8544547ac787feb5f13", - "urls": [ - "bzz-raw://8e9a317f0c3c02ab1d6c38039bff2b3e0c97f4dc9d229d3d9149c1af1c5023b3", - "dweb:/ipfs/QmNcZjNChsuXF34T6f3Zu7i3tnqvKN4NyWBWZ4tXLH9kMu" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/common/SignatureDecoder.sol": { - "keccak256": "0x2a3baf0efa1585ddf2276505c6d34fa16f01cafff1288e40110d5e67fb459c7c", - "urls": [ - "bzz-raw://00cdded3068b9051ee0a966f40926fbc57dbe7ef8bf4285db3740f9d50468c80", - "dweb:/ipfs/QmcP5hKmaRqBe7TpgoXtncZqsNKKdCCKxZgXoxEL4Nj5F4" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/common/Singleton.sol": { - "keccak256": "0xcab7c6e5fb6d7295a9343f72fec26a2f632ddfe220a6f267b5c5a1eb2f9bce50", - "urls": [ - "bzz-raw://dd1c31d5787ef590a60f6b0dbc74d09e6fe4d3ad2f0529940d662bf315521cde", - "dweb:/ipfs/QmSAS5DYrGksJe4cPQ4wLrveXa1CjxAuEiohcLpPG5h2bo" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/common/StorageAccessible.sol": { - "keccak256": "0x2c5412a8f014db332322a6b24ee3cedce15dca17a721ae49fdef368568d4391e", - "urls": [ - "bzz-raw://e775f267d3e60ebe452d9533f46a0eb1f1dc4593d1bcb553e86cea205a5f361e", - "dweb:/ipfs/QmQdYDHGQsiMx1AADWRhX7tduU9ycTzrT5q3zBWvphXzKZ" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/external/SafeMath.sol": { - "keccak256": "0x5f856674d9be11344c5899deb43364e19baa75bc881cada4c159938270b2bd89", - "urls": [ - "bzz-raw://351c66e5fe92c0a51f79d133521545dabdd3f756312a7b1428c1fc813c512a1c", - "dweb:/ipfs/QmdnrRmgef8SdamEU6fVEqFD5RQwXeDFTfQuZEfX2vxC4x" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/handler/ExtensibleFallbackHandler.sol": { - "keccak256": "0x7e511290dae21c9b1710c9250320d9b98ffd71c9501af354814485b58e1b64e9", - "urls": [ - "bzz-raw://3e55ba23bde90d2cdd07baa7172ea41bdc1d638bc7b6eb5dce03189d86412515", - "dweb:/ipfs/QmbxH73sqooeQL8ehsP2FDoXhLBoPs3wr3nod6ZgJwVcFV" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/handler/HandlerContext.sol": { - "keccak256": "0x3e105ebac003af9c8d34e3eed517ff0355d5f487e17478c85df0f225b04846f5", - "urls": [ - "bzz-raw://657bec347d746453883c461a3d9a2275bf2b99625dcaef0960e1c0276c3d56c4", - "dweb:/ipfs/QmUGj8Tzs1CsmUf63LbTMK81EEGtYYnWKLGdHHtoYCd9CF" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/handler/extensible/ERC165Handler.sol": { - "keccak256": "0x4d562221e6645b6e79da99d2b322331617051fa90e06ec7ce3f9a6a87bae116c", - "urls": [ - "bzz-raw://5a574dd50b9e9a594afda4a96701295e18a0054fcaf5083573ee80033b2da060", - "dweb:/ipfs/QmNQf5rfHqMCGKBcqZowz89JEZe8rjjoYEkySBy7oxwh4Y" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/handler/extensible/ExtensibleBase.sol": { - "keccak256": "0xe5b71121b0020728158ee60756982e74809f9d77cb294a6d65930bff09d84d15", - "urls": [ - "bzz-raw://fd7fd2702b31fc8569a9986a476dd9fe9aa76624d0da6d832547f624426925f9", - "dweb:/ipfs/QmWjYGtW38Fnwvm8qFvoJYhz2nTuySGkHouwRF3eksd6Nh" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/handler/extensible/FallbackHandler.sol": { - "keccak256": "0x3020c96c812548a2bf6413168ee21033638a36736b695909f7cf54277beefd76", - "urls": [ - "bzz-raw://6ffdf49fb516791f4cad239fc780bb5d9934bb06744b99b0fbc067f31ad13591", - "dweb:/ipfs/QmPXwVoDhnhnQFSxEiHDZYRQJ5ozAECSFrUHMTjwAJ1LuM" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/handler/extensible/MarshalLib.sol": { - "keccak256": "0x36eacc47b1ce7697e679c1b5c0d3a86d8f46a0436b666f86e88df04765cde5c1", - "urls": [ - "bzz-raw://7097bfb174ea424ef55f9a5b55f4a9857f7368cdd3061888f5ffb3e29503f071", - "dweb:/ipfs/QmRPvAvMdGRuh8AjePtamBGUU55p1tSP8ZHUUMfxWgi1ew" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/handler/extensible/SignatureVerifierMuxer.sol": { - "keccak256": "0x51e8dad81059527f9b6b6827d742a0fbc0960c66e364dd1e67c8f151970c6ee4", - "urls": [ - "bzz-raw://b368a4eb15d50487986db1543a5c786324a4d0de680a421d131e21c25459f666", - "dweb:/ipfs/QmVca3J2JBEZtxW3uNMvYc9ugQH24CqantLnVzKcZwG71W" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/handler/extensible/TokenCallbacks.sol": { - "keccak256": "0x549d737c3eef66cec2a858b34dce4db42e56d8f053635742230873e6049e81ed", - "urls": [ - "bzz-raw://f03f130c36be396895acfa7891ccca36725c6a6496085d88fc33071e00093073", - "dweb:/ipfs/QmfLfenjQ1gWnotx5Vdda1kJBqjnCi53bGNqyZ5cN6wxXV" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/interfaces/ERC1155TokenReceiver.sol": { - "keccak256": "0x87e62665c041cade64e753ecdccf931cb100ab6e4bcc98769c1e6474be9db493", - "urls": [ - "bzz-raw://59ca1157dcfe19c72b9d1244a6ae5ec70fee9793d4d8af523b70f22ae567d55c", - "dweb:/ipfs/QmfE3kv73QuQWAWQND927LWVHVLCp19m1mLUvxVYJDEFZM" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/interfaces/ERC721TokenReceiver.sol": { - "keccak256": "0x96c4c5457fede2d4c6012011dfda36f8e8ffdb7388468f2dddb35661538bf479", - "urls": [ - "bzz-raw://99a54737bc23722f79ec9cf9de63ba35b556a61df453eb332f3cac783503f26c", - "dweb:/ipfs/QmbLW5C2RhoLbwDWEPtTKpyYE5apT9B3q4U11PZG3wSM1n" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/interfaces/IERC165.sol": { - "keccak256": "0x779ed3893a8812e383670b755f65c7727e9343dadaa4d7a4aa7f4aa35d859fdb", - "urls": [ - "bzz-raw://bb2039e1459ace1e68761e873632fc339866332f9f5ecb7452a0bc3a3b847e89", - "dweb:/ipfs/QmYXvDQXJnDkXFvsvKLyZXaAv4x42qvtbtmwHftP4RKX38" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/lib/safe/contracts/interfaces/ISignatureValidator.sol": { - "keccak256": "0x2459cb3ed73ecb80e1e7a6508d09a58cc59570b049f77042f669dedfcc5f6457", - "urls": [ - "bzz-raw://3c4a1371948b11f78171bc4ae4fd169a1eec11e5c4b273eb2c54bc030a1aae25", - "dweb:/ipfs/QmPuztatXZYVS65n8YbCyccJFZYPP6zQfBQ8tTY27pB978" - ], - "license": "LGPL-3.0-only" - }, - "lib/composable-cow/src/BaseConditionalOrder.sol": { - "keccak256": "0x8b429a011579b3d84df3bb3135b3299054790018220666befa9ab5af24f49e8f", - "urls": [ - "bzz-raw://a30f0535cf7fc4fabc42b83a04bd687b8e989ae8d0c3f6db63b69504c15a7a34", - "dweb:/ipfs/QmSeKTQWEx74SV6hrdX3sGLV6L9MF8fPPqoyyvdB4Kt3bo" - ], - "license": "MIT" - }, - "lib/composable-cow/src/ComposableCoW.sol": { - "keccak256": "0xcf1583fd0565c921f108e81d516591c9ff123f840dbdd349e9e98d793de4409f", - "urls": [ - "bzz-raw://112df8eb50205574a22bbb8db9f7d064ec4c753052f798668db88fd222724883", - "dweb:/ipfs/QmSV7gBaWDn4PhJGCYayuFqvRortZHnzUjsZNGrm2NriEu" - ], - "license": "GPL-3.0" - }, - "lib/composable-cow/src/interfaces/IConditionalOrder.sol": { - "keccak256": "0xe9e47811223793dfa9a5fc3098cf874385f547e536ef47da634b505659aeedc7", - "urls": [ - "bzz-raw://40c3daf74830a4394052b916ca920fce07761a2b66e8af8c877b72d2efaa49eb", - "dweb:/ipfs/QmZ9adA6R1hCHnvg6DwnTn7zqta6zU1Ctb564zb8aiqRFD" - ], - "license": "GPL-3.0" - }, - "lib/composable-cow/src/interfaces/ISwapGuard.sol": { - "keccak256": "0xac211fb24463a9c04a05bb58fe42d9bea10e58fe9ca35e7f544868eeb5972339", - "urls": [ - "bzz-raw://3ce2a180c5368c6807aecafb242675476bbc653ac72b3bd727db3467efe8b900", - "dweb:/ipfs/QmWzTqMQCuvX5Zpn2sjxYUS9o3upsip4yNvwCMQGbXAk6Y" - ], - "license": "GPL-3.0" - }, - "lib/composable-cow/src/interfaces/IValueFactory.sol": { - "keccak256": "0x3304ef8a0a1727258ac8278bf5426daeac37ece4653eaaff87b15143814a8122", - "urls": [ - "bzz-raw://9934d278069dd9474065777833a81e65af227b85d350b6c1f012b812101be9de", - "dweb:/ipfs/QmcMBdvY7wLs92FCyutDGQGtHnYryjnaykREvDNBNM8Yih" - ], - "license": "GPL-3.0" - }, - "lib/composable-cow/src/types/ConditionalOrdersUtilsLib.sol": { - "keccak256": "0x38e4ce4fc58c018f510ee45d78ae49253e8aa70fdf559d83ebb6c838c6b47aae", - "urls": [ - "bzz-raw://a38ccd5b8ce2895a77b7474b1ac36ebfccc975b3839f6d3bfef72700f8f6f777", - "dweb:/ipfs/QmSfs5zZ4U14NkZYSqAFUBcuKGjyfMM5Dp2sbj14FmVYPf" - ], - "license": "MIT" - }, - "lib/composable-cow/src/vendored/CoWSettlement.sol": { - "keccak256": "0x4e4e317b24017cd87eb11d16368b8c06ec19306d31946c330a86f9f136df38d7", - "urls": [ - "bzz-raw://34b9b2fc2c89e60497457cd812da9c53718c15ddfbf70f6e11832d22092c1840", - "dweb:/ipfs/QmYFzaynWZfdpmFRf2dZrQ32Ep53AtQDd5fTE3a89xVkaR" - ], - "license": "MIT" - }, - "lib/openzeppelin/contracts/interfaces/IERC1271.sol": { - "keccak256": "0x85a45f3f10014a0f8be41157a32b6a5f905753ea64a4b64e29fc12b7deeecf39", - "urls": [ - "bzz-raw://c3c74009ce36136b36c77c23935b8e4a7b4f253be2da2be4fb4a916b1ce43743", - "dweb:/ipfs/QmcH36v3iN7SJJuF73AunLR2LtNxhVJ1wm63ph4dPZ4pcL" - ], - "license": "MIT" - }, - "lib/openzeppelin/contracts/interfaces/IERC20.sol": { - "keccak256": "0xce41876e78d1badc0512229b4d14e4daf83bc1003d7f83978d18e0e56f965b9c", - "urls": [ - "bzz-raw://a2608291cb038b388d80b79a06b6118a42f7894ff67b7da10ec0dbbf5b2973ba", - "dweb:/ipfs/QmWohqcBLbcxmA4eGPhZDXe5RYMMEEpFq22nfkaUMvTfw1" - ], - "license": "MIT" - }, - "lib/openzeppelin/contracts/token/ERC20/IERC20.sol": { - "keccak256": "0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70", - "urls": [ - "bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c", - "dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq" - ], - "license": "MIT" - }, - "lib/openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": { - "keccak256": "0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff", - "urls": [ - "bzz-raw://f5196ec75139918c6c7bb4251b36395e668f1fa6d206beba7e7520e74913940d", - "dweb:/ipfs/QmSyqjksXxmm2mCG6qRd1yuwLykypkSVBbnBnGqJRcuJMi" - ], - "license": "MIT" - }, - "lib/openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { - "keccak256": "0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386", - "urls": [ - "bzz-raw://b3036b3a83b7c48f96641f2a9002b9f2dcb6a5958dd670894ada21ae8229b3d0", - "dweb:/ipfs/QmUNfSBdoVtjhETaUJCYcaC7pTMgbhht926tJ2uXJbiVd3" - ], - "license": "MIT" - }, - "lib/openzeppelin/contracts/utils/Address.sol": { - "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", - "urls": [ - "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", - "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" - ], - "license": "MIT" - }, - "lib/openzeppelin/contracts/utils/cryptography/MerkleProof.sol": { - "keccak256": "0x6400c4bee15052e043e5d10315135972529bd1c8012f43da494dc6b4f4661058", - "urls": [ - "bzz-raw://da5d3d47d35af4373743a559ea4b9b7ecfe4bab6f0703f410c1e59959b7966ac", - "dweb:/ipfs/QmTHdoghh4WLu4yURjGEgRk162pcwwdsG52MPGa12GqnGR" - ], - "license": "MIT" - }, - "lib/openzeppelin/contracts/utils/math/Math.sol": { - "keccak256": "0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d", - "urls": [ - "bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875", - "dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L" - ], - "license": "MIT" - }, - "src/ConstantProduct.sol": { - "keccak256": "0x4883252f066b38972e5466f54d7cbf6e1a5b7c55823f012837f254ccd7aaa707", - "urls": [ - "bzz-raw://5bcfdb33677ad8f14d939cb1570fbcdd0c5d25843d93f35e70c41a58f278345c", - "dweb:/ipfs/QmRN1eRCJoGj3RygAbaRaGQ85DJjApEZv1qLUqGYbh1frT" - ], - "license": "GPL-3.0" - }, - "src/ConstantProductFactory.sol": { - "keccak256": "0xd9e2a5d4cc9cde16d1d8469194eff6e32b97758413574fc866067a392d3d9255", - "urls": [ - "bzz-raw://1745aea9ad3571a9edf950a8fd9d745042b2c697fa1bd0c46982fddc21dc7fc8", - "dweb:/ipfs/QmVQMyM3uSRzvL61Fnb9rH5mYaLBQrkh69iB9Gx3Lk6QWD" - ], - "license": "GPL-3.0" - }, - "src/ConstantProductHelper.sol": { - "keccak256": "0xb184c91352617489a5f22ce8bb29f9840a00f8055ac283e6d1d85984e786b677", - "urls": [ - "bzz-raw://9413468585f4d8faac44b2c1f7c02cd4f21f5df570c6573c7ccab584a420d366", - "dweb:/ipfs/QmSE5dkMEjbt1pEv5Y1Ao7EeudNWET7TwtAP6FPUVXiGbR" - ], - "license": "LGPL-3.0-only" - }, - "src/interfaces/ICOWAMMPoolFactory.sol": { - "keccak256": "0x2b65e467fa06b6149a7f2eee4879973fc5845ab12f86e718f1c2708e0bf98829", - "urls": [ - "bzz-raw://2ea7e105fc8953eb819f64a1e426881d834afbe990fbcda08c30c18a2d1a332a", - "dweb:/ipfs/QmSUpommi6khq2EgLSTNSEorHjKtoztqa9D5BfTZ83LBqX" - ], - "license": "GPL-3.0" - }, - "src/interfaces/ICOWAMMPoolHelper.sol": { - "keccak256": "0xa5b11fe7aefe1d3ab091d5f381c15381a3dc7c5a4e0a597c33cbb0deecd3d704", - "urls": [ - "bzz-raw://6525ad30ec83975097671ec389ed20772dcbd0de07ea0e92b6b9bdf0a12c0163", - "dweb:/ipfs/QmcYnz4FmMWLqdWpjEGHDXCWAWbKu98vDzUcHpkLJ5Cfg6" - ], - "license": "LGPL-3.0-only" - }, - "src/interfaces/IPriceOracle.sol": { - "keccak256": "0xf954ab9dc44a0ce3612b65d803b59c3fe1f64803870328580c36802460c8c29e", - "urls": [ - "bzz-raw://7cef4a090daa870e3c8cfa5d6498efae96427d4fe4e1a2784d26c088eea920e2", - "dweb:/ipfs/QmU56CEHqif11NaomtVBNqrBTsV6CPPvjfN88SCe7V1Uxu" - ], - "license": "GPL-3.0" - }, - "src/interfaces/ISettlement.sol": { - "keccak256": "0x51833975e3c96a6bfc9b255d122e145fc28a968b920fda5744ea0d9bf022e84a", - "urls": [ - "bzz-raw://3b2228e777904811715e693f6fe577be18b128db72219a6f3ca528fb9c119bc6", - "dweb:/ipfs/QmXnNgdMLJBhztH5US1EnxGV8PB4yvLZqhN1sTkvrdvSZ2" - ], - "license": "GPL-3.0" - }, - "src/legacy/Helper.sol": { - "keccak256": "0xf0494ad9f71fdf2602dbd30f885ffd0b1a88beedcd7459ec75f759efb11dc1c4", - "urls": [ - "bzz-raw://e6b3916e22daa8fd8deae7b85b270972ea652ff696301852644f077dc8f82b2d", - "dweb:/ipfs/QmcWJX9WoiBVsCjZVuv6SDYAQYDWDctXD8nkZVMqSbxZzK" - ], - "license": "LGPL-3.0-only" - }, - "src/legacy/Snapshot.sol": { - "keccak256": "0x2a0c3ff6bf1b8a86161f982589aed2012dd462aa8a1cdc06a73b9c2ca636ff4f", - "urls": [ - "bzz-raw://db6d85afd2b2711ebc9282c351c9a5e491d8d20f0646ae8ab45f548e426ab1eb", - "dweb:/ipfs/QmNzZCc2CWBerhW2Eu44QRowFokYnCMcWaNiPJoRMsLKxV" - ], - "license": "LGPL-3.0-only" - }, - "src/libraries/GetTradeableOrder.sol": { - "keccak256": "0x095d47c2d45ff22440ddf8f76bb6b9cbfd7250d35849e79ccb89c8eeb126b645", - "urls": [ - "bzz-raw://787103261569a4b07b762f6a106178e5ec384b3b89bd24bfc079bc27ccde4b72", - "dweb:/ipfs/QmTYN4jPyPecNWwqKpqqFbvZtBPwWvf4Z8MCPTSmZy85wM" - ], - "license": "LGPL-3.0-only" - } - }, - "version": 1 - }, - "id": 126, - "_disabled": [ - { - "type": "function", - "name": "getSnapshot", - "inputs": [ - { - "name": "amm", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes", - "internalType": "bytes" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "isLegacy", - "inputs": [ - { - "name": "amm", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "isLegacyEnabled", - "inputs": [ - { - "name": "amm", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "success", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - } - ] -} diff --git a/contracts/artifacts/CowAmmUniswapV2PriceOracle.json b/contracts/artifacts/CowAmmUniswapV2PriceOracle.json deleted file mode 100644 index 0016f79051..0000000000 --- a/contracts/artifacts/CowAmmUniswapV2PriceOracle.json +++ /dev/null @@ -1,176 +0,0 @@ -{ - "abi": [], - "bytecode": "0x6080604052348015600e575f80fd5b506105468061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063355efdd91461002d575b5f80fd5b61004061003b366004610386565b610059565b6040805192835260208301919091520160405180910390f35b5f808061006884860186610411565b9050805f015173ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156100b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100da91906104a2565b826dffffffffffffffffffffffffffff169250816dffffffffffffffffffffffffffff1691505080935081945050505f815f015173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610156573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061017a91906104ee565b90505f825f015173ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ed91906104ee565b90508073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff160361022757929392905b8173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16146102c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f7261636c653a20696e76616c696420746f6b656e300000000000000000000060448201526064015b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614610356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f7261636c653a20696e76616c696420746f6b656e310000000000000000000060448201526064016102b8565b50505094509492505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610383575f80fd5b50565b5f805f8060608587031215610399575f80fd5b84356103a481610362565b935060208501356103b481610362565b9250604085013567ffffffffffffffff808211156103d0575f80fd5b818701915087601f8301126103e3575f80fd5b8135818111156103f1575f80fd5b886020828501011115610402575f80fd5b95989497505060200194505050565b5f60208284031215610421575f80fd5b6040516020810181811067ffffffffffffffff82111715610469577f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604052823561047781610362565b81529392505050565b80516dffffffffffffffffffffffffffff8116811461049d575f80fd5b919050565b5f805f606084860312156104b4575f80fd5b6104bd84610480565b92506104cb60208501610480565b9150604084015163ffffffff811681146104e3575f80fd5b809150509250925092565b5f602082840312156104fe575f80fd5b815161050981610362565b939250505056fea26469706673582212201fe6ad4d6b89d204db5394bdedef23d10ed8c7e4f83be4c5fe14dcc09470223464736f6c63430008190033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063355efdd91461002d575b5f80fd5b61004061003b366004610386565b610059565b6040805192835260208301919091520160405180910390f35b5f808061006884860186610411565b9050805f015173ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156100b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100da91906104a2565b826dffffffffffffffffffffffffffff169250816dffffffffffffffffffffffffffff1691505080935081945050505f815f015173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610156573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061017a91906104ee565b90505f825f015173ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ed91906104ee565b90508073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff160361022757929392905b8173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16146102c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f7261636c653a20696e76616c696420746f6b656e300000000000000000000060448201526064015b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614610356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f7261636c653a20696e76616c696420746f6b656e310000000000000000000060448201526064016102b8565b50505094509492505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610383575f80fd5b50565b5f805f8060608587031215610399575f80fd5b84356103a481610362565b935060208501356103b481610362565b9250604085013567ffffffffffffffff808211156103d0575f80fd5b818701915087601f8301126103e3575f80fd5b8135818111156103f1575f80fd5b886020828501011115610402575f80fd5b95989497505060200194505050565b5f60208284031215610421575f80fd5b6040516020810181811067ffffffffffffffff82111715610469577f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604052823561047781610362565b81529392505050565b80516dffffffffffffffffffffffffffff8116811461049d575f80fd5b919050565b5f805f606084860312156104b4575f80fd5b6104bd84610480565b92506104cb60208501610480565b9150604084015163ffffffff811681146104e3575f80fd5b809150509250925092565b5f602082840312156104fe575f80fd5b815161050981610362565b939250505056fea26469706673582212201fe6ad4d6b89d204db5394bdedef23d10ed8c7e4f83be4c5fe14dcc09470223464736f6c63430008190033", - "methodIdentifiers": { - "getPrice(address,address,bytes)": "355efdd9" - }, - "rawMetadata": "{\"compiler\":{\"version\":\"0.8.25+commit.b61c2a91\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token0\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token1\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"getPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"priceNumerator\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"priceDenominator\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"CoW Protocol Developers\",\"details\":\"This contract creates an oracle that is compatible with the IPriceOracle interface and can be used by a CoW AMM to determine the current price of the traded tokens on specific Uniswap v2 pools.\",\"kind\":\"dev\",\"methods\":{\"getPrice(address,address,bytes)\":{\"details\":\"Calling this function returns the price of token1 in terms of token0 as a fraction (numerator, denominator). For example, in a pool where token0 is DAI, token1 is ETH, and ETH is worth 2000 DAI, valid output tuples would be (2000, 1), (20000, 10), ...To keep the risk of multiplication overflow to a minimum, we recommend to use return values that fit the size of a uint128.\",\"params\":{\"data\":\"Any additional data that may be required by the specific oracle implementation. For example, it could be a specific pool id for balancer, or the address of a specific price feed for Chainlink. We recommend this data be implemented as the abi-encoding of a dedicated data struct for ease of type-checking and decoding the input.\",\"token0\":\"The first token, whose price is determined based on the second token.\",\"token1\":\"The second token; the price of the first token is determined relative to this token.\"},\"returns\":{\"priceDenominator\":\"The denominator of the price, expressed in amount of token1 per amount of token0.\",\"priceNumerator\":\"The numerator of the price, expressed in amount of token1 per amount of token0.\"}}},\"title\":\"CoW AMM UniswapV2 Price Oracle\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/oracles/UniswapV2PriceOracle.sol\":\"UniswapV2PriceOracle\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000},\"remappings\":[\":@openzeppelin/=lib/composable-cow/lib/@openzeppelin/\",\":@openzeppelin/contracts/=lib/composable-cow/lib/@openzeppelin/contracts/\",\":balancer/=lib/composable-cow/lib/balancer/src/\",\":canonical-weth/=lib/composable-cow/lib/canonical-weth/src/\",\":composable-cow/=lib/composable-cow/\",\":cowprotocol/=lib/composable-cow/lib/cowprotocol/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":helpers/=lib/composable-cow/lib/balancer/src/lib/helpers/\",\":math/=lib/composable-cow/lib/balancer/src/lib/math/\",\":murky/=lib/composable-cow/lib/murky/src/\",\":openzeppelin-contracts/=lib/composable-cow/lib/murky/lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin/\",\":safe/=lib/composable-cow/lib/safe/\",\":uniswap-v2-core/=lib/uniswap-v2-core/contracts/\",\"lib/composable-cow:@openzeppelin/=lib/openzeppelin/contracts/\",\"lib/composable-cow:@openzeppelin/contracts/=lib/openzeppelin/contracts/\",\"lib/composable-cow:cowprotocol/=lib/composable-cow/lib/cowprotocol/src/contracts/\",\"lib/composable-cow:safe/=lib/composable-cow/lib/safe/contracts/\"]},\"sources\":{\"lib/uniswap-v2-core/contracts/interfaces/IUniswapV2Pair.sol\":{\"keccak256\":\"0x7c9bc70e5996c763e02ff38905282bc24fb242b0ef2519a003b36824fc524a4b\",\"urls\":[\"bzz-raw://85d5ad2dd23ee127f40907a12865a1e8cb5828814f6f2480285e1827dd72dedf\",\"dweb:/ipfs/QmayKQWJgWmr46DqWseADyUanmqxh662hPNdAkdHRjiQQH\"]},\"src/interfaces/IPriceOracle.sol\":{\"keccak256\":\"0xf954ab9dc44a0ce3612b65d803b59c3fe1f64803870328580c36802460c8c29e\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://7cef4a090daa870e3c8cfa5d6498efae96427d4fe4e1a2784d26c088eea920e2\",\"dweb:/ipfs/QmU56CEHqif11NaomtVBNqrBTsV6CPPvjfN88SCe7V1Uxu\"]},\"src/oracles/UniswapV2PriceOracle.sol\":{\"keccak256\":\"0xd609e84287558861dd13aaea60b49f06261f6e098b10fe1b1dbb29441b655bf2\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://6cc7fc5cea18e21d3807a9691318e398f83192aefc33b96f8085444788d8471a\",\"dweb:/ipfs/QmfQA5CZoqqkeghrztAs8C6rVSSCiCdaDhHQPJqG83UjRs\"]}},\"version\":1}", - "metadata": { - "compiler": { - "version": "0.8.25+commit.b61c2a91" - }, - "language": "Solidity", - "output": { - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "token0", - "type": "address" - }, - { - "internalType": "address", - "name": "token1", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function", - "name": "getPrice", - "outputs": [ - { - "internalType": "uint256", - "name": "priceNumerator", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "priceDenominator", - "type": "uint256" - } - ] - } - ], - "devdoc": { - "kind": "dev", - "methods": { - "getPrice(address,address,bytes)": { - "details": "Calling this function returns the price of token1 in terms of token0 as a fraction (numerator, denominator). For example, in a pool where token0 is DAI, token1 is ETH, and ETH is worth 2000 DAI, valid output tuples would be (2000, 1), (20000, 10), ...To keep the risk of multiplication overflow to a minimum, we recommend to use return values that fit the size of a uint128.", - "params": { - "data": "Any additional data that may be required by the specific oracle implementation. For example, it could be a specific pool id for balancer, or the address of a specific price feed for Chainlink. We recommend this data be implemented as the abi-encoding of a dedicated data struct for ease of type-checking and decoding the input.", - "token0": "The first token, whose price is determined based on the second token.", - "token1": "The second token; the price of the first token is determined relative to this token." - }, - "returns": { - "priceDenominator": "The denominator of the price, expressed in amount of token1 per amount of token0.", - "priceNumerator": "The numerator of the price, expressed in amount of token1 per amount of token0." - } - } - }, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - } - }, - "settings": { - "remappings": [ - "@openzeppelin/=lib/composable-cow/lib/@openzeppelin/", - "@openzeppelin/contracts/=lib/composable-cow/lib/@openzeppelin/contracts/", - "balancer/=lib/composable-cow/lib/balancer/src/", - "canonical-weth/=lib/composable-cow/lib/canonical-weth/src/", - "composable-cow/=lib/composable-cow/", - "cowprotocol/=lib/composable-cow/lib/cowprotocol/", - "ds-test/=lib/forge-std/lib/ds-test/src/", - "erc4626-tests/=lib/openzeppelin/lib/erc4626-tests/", - "forge-std/=lib/forge-std/src/", - "helpers/=lib/composable-cow/lib/balancer/src/lib/helpers/", - "math/=lib/composable-cow/lib/balancer/src/lib/math/", - "murky/=lib/composable-cow/lib/murky/src/", - "openzeppelin-contracts/=lib/composable-cow/lib/murky/lib/openzeppelin-contracts/", - "openzeppelin/=lib/openzeppelin/", - "safe/=lib/composable-cow/lib/safe/", - "uniswap-v2-core/=lib/uniswap-v2-core/contracts/", - "lib/composable-cow:@openzeppelin/=lib/openzeppelin/contracts/", - "lib/composable-cow:@openzeppelin/contracts/=lib/openzeppelin/contracts/", - "lib/composable-cow:cowprotocol/=lib/composable-cow/lib/cowprotocol/src/contracts/", - "lib/composable-cow:safe/=lib/composable-cow/lib/safe/contracts/" - ], - "optimizer": { - "enabled": true, - "runs": 100000 - }, - "metadata": { - "bytecodeHash": "ipfs" - }, - "compilationTarget": { - "src/oracles/UniswapV2PriceOracle.sol": "UniswapV2PriceOracle" - }, - "evmVersion": "cancun", - "libraries": {} - }, - "sources": { - "lib/uniswap-v2-core/contracts/interfaces/IUniswapV2Pair.sol": { - "keccak256": "0x7c9bc70e5996c763e02ff38905282bc24fb242b0ef2519a003b36824fc524a4b", - "urls": [ - "bzz-raw://85d5ad2dd23ee127f40907a12865a1e8cb5828814f6f2480285e1827dd72dedf", - "dweb:/ipfs/QmayKQWJgWmr46DqWseADyUanmqxh662hPNdAkdHRjiQQH" - ], - "license": null - }, - "src/interfaces/IPriceOracle.sol": { - "keccak256": "0xf954ab9dc44a0ce3612b65d803b59c3fe1f64803870328580c36802460c8c29e", - "urls": [ - "bzz-raw://7cef4a090daa870e3c8cfa5d6498efae96427d4fe4e1a2784d26c088eea920e2", - "dweb:/ipfs/QmU56CEHqif11NaomtVBNqrBTsV6CPPvjfN88SCe7V1Uxu" - ], - "license": "GPL-3.0" - }, - "src/oracles/UniswapV2PriceOracle.sol": { - "keccak256": "0xd609e84287558861dd13aaea60b49f06261f6e098b10fe1b1dbb29441b655bf2", - "urls": [ - "bzz-raw://6cc7fc5cea18e21d3807a9691318e398f83192aefc33b96f8085444788d8471a", - "dweb:/ipfs/QmfQA5CZoqqkeghrztAs8C6rVSSCiCdaDhHQPJqG83UjRs" - ], - "license": "GPL-3.0" - } - }, - "version": 1 - }, - "id": 178, - "_disabled": [ - { - "type": "function", - "name": "getPrice", - "inputs": [ - { - "name": "token0", - "type": "address", - "internalType": "address" - }, - { - "name": "token1", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [ - { - "name": "priceNumerator", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "priceDenominator", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - } - ] -} diff --git a/contracts/generated/contracts-facade/Cargo.toml b/contracts/generated/contracts-facade/Cargo.toml index 55c0ed9a08..3e91c6a1cf 100644 --- a/contracts/generated/contracts-facade/Cargo.toml +++ b/contracts/generated/contracts-facade/Cargo.toml @@ -54,11 +54,6 @@ cow-contract-balances = { path = "../contracts-generated/balances" } cow-contract-baoswaprouter = { path = "../contracts-generated/baoswaprouter" } cow-contract-chainalysisoracle = { path = "../contracts-generated/chainalysisoracle" } cow-contract-counter = { path = "../contracts-generated/counter" } -cow-contract-cowamm = { path = "../contracts-generated/cowamm" } -cow-contract-cowammconstantproductfactory = { path = "../contracts-generated/cowammconstantproductfactory" } -cow-contract-cowammfactorygetter = { path = "../contracts-generated/cowammfactorygetter" } -cow-contract-cowammlegacyhelper = { path = "../contracts-generated/cowammlegacyhelper" } -cow-contract-cowammuniswapv2priceoracle = { path = "../contracts-generated/cowammuniswapv2priceoracle" } cow-contract-cowprotocoltoken = { path = "../contracts-generated/cowprotocoltoken" } cow-contract-cowswapethflow = { path = "../contracts-generated/cowswapethflow" } cow-contract-cowswaponchainorders = { path = "../contracts-generated/cowswaponchainorders" } diff --git a/contracts/generated/contracts-facade/src/lib.rs b/contracts/generated/contracts-facade/src/lib.rs index 1117260f9e..c55b201ae5 100644 --- a/contracts/generated/contracts-facade/src/lib.rs +++ b/contracts/generated/contracts-facade/src/lib.rs @@ -87,12 +87,3 @@ pub mod test { cow_contract_remoteerc20balances as RemoteERC20Balances, }; } -pub mod cow_amm { - pub use { - cow_contract_cowamm as CowAmm, - cow_contract_cowammconstantproductfactory as CowAmmConstantProductFactory, - cow_contract_cowammfactorygetter as CowAmmFactoryGetter, - cow_contract_cowammlegacyhelper as CowAmmLegacyHelper, - cow_contract_cowammuniswapv2priceoracle as CowAmmUniswapV2PriceOracle, - }; -} diff --git a/contracts/generated/contracts-generated/cowamm/Cargo.toml b/contracts/generated/contracts-generated/cowamm/Cargo.toml deleted file mode 100644 index 5d4ed709e9..0000000000 --- a/contracts/generated/contracts-generated/cowamm/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -# Auto-generated by contracts-generate. Do not edit. -[package] -name = "cow-contract-cowamm" -version = "0.1.0" -edition = "2024" -publish = false - -[lib] -doctest = false - -[dependencies] -alloy-contract = { workspace = true } -alloy-primitives = { workspace = true } -alloy-provider = { workspace = true } -alloy-sol-types = { workspace = true } -anyhow = { workspace = true } - -[lints] -workspace = true diff --git a/contracts/generated/contracts-generated/cowamm/src/lib.rs b/contracts/generated/contracts-generated/cowamm/src/lib.rs deleted file mode 100644 index 455d577e4b..0000000000 --- a/contracts/generated/contracts-generated/cowamm/src/lib.rs +++ /dev/null @@ -1,4430 +0,0 @@ -#![allow( - unused_imports, - unused_attributes, - clippy::all, - rustdoc::all, - non_snake_case -)] -//! Auto-generated contract bindings. Do not edit. -///Module containing a contract's types and functions. -/** - -```solidity -library ConstantProduct { - struct TradingParams { uint256 minTradedToken0; address priceOracle; bytes priceOracleData; bytes32 appData; } -} -```*/ -#[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style, - clippy::empty_structs_with_brackets -)] -pub mod ConstantProduct { - use {super::*, alloy_sol_types}; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**```solidity - struct TradingParams { uint256 minTradedToken0; address priceOracle; bytes priceOracleData; bytes32 appData; } - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct TradingParams { - #[allow(missing_docs)] - pub minTradedToken0: alloy_sol_types::private::primitives::aliases::U256, - #[allow(missing_docs)] - pub priceOracle: alloy_sol_types::private::Address, - #[allow(missing_docs)] - pub priceOracleData: alloy_sol_types::private::Bytes, - #[allow(missing_docs)] - pub appData: alloy_sol_types::private::FixedBytes<32>, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = ( - alloy_sol_types::sol_data::Uint<256>, - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Bytes, - alloy_sol_types::sol_data::FixedBytes<32>, - ); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy_sol_types::private::primitives::aliases::U256, - alloy_sol_types::private::Address, - alloy_sol_types::private::Bytes, - alloy_sol_types::private::FixedBytes<32>, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: TradingParams) -> Self { - ( - value.minTradedToken0, - value.priceOracle, - value.priceOracleData, - value.appData, - ) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for TradingParams { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - minTradedToken0: tuple.0, - priceOracle: tuple.1, - priceOracleData: tuple.2, - appData: tuple.3, - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolValue for TradingParams { - type SolType = Self; - } - #[automatically_derived] - impl alloy_sol_types::private::SolTypeValue for TradingParams { - #[inline] - fn stv_to_tokens(&self) -> ::Token<'_> { - ( - as alloy_sol_types::SolType>::tokenize(&self.minTradedToken0), - ::tokenize( - &self.priceOracle, - ), - ::tokenize( - &self.priceOracleData, - ), - as alloy_sol_types::SolType>::tokenize(&self.appData), - ) - } - - #[inline] - fn stv_abi_encoded_size(&self) -> usize { - if let Some(size) = ::ENCODED_SIZE { - return size; - } - let tuple = - as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_encoded_size(&tuple) - } - - #[inline] - fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { - ::eip712_hash_struct(self) - } - - #[inline] - fn stv_abi_encode_packed_to(&self, out: &mut alloy_sol_types::private::Vec) { - let tuple = - as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_encode_packed_to( - &tuple, out, - ) - } - - #[inline] - fn stv_abi_packed_encoded_size(&self) -> usize { - if let Some(size) = ::PACKED_ENCODED_SIZE { - return size; - } - let tuple = - as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_packed_encoded_size( - &tuple, - ) - } - } - #[automatically_derived] - impl alloy_sol_types::SolType for TradingParams { - type RustType = Self; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const ENCODED_SIZE: Option = - as alloy_sol_types::SolType>::ENCODED_SIZE; - const PACKED_ENCODED_SIZE: Option = - as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; - const SOL_NAME: &'static str = ::NAME; - - #[inline] - fn valid_token(token: &Self::Token<'_>) -> bool { - as alloy_sol_types::SolType>::valid_token(token) - } - - #[inline] - fn detokenize(token: Self::Token<'_>) -> Self::RustType { - let tuple = as alloy_sol_types::SolType>::detokenize(token); - >>::from(tuple) - } - } - #[automatically_derived] - impl alloy_sol_types::SolStruct for TradingParams { - const NAME: &'static str = "TradingParams"; - - #[inline] - fn eip712_root_type() -> alloy_sol_types::private::Cow<'static, str> { - alloy_sol_types::private::Cow::Borrowed( - "TradingParams(uint256 minTradedToken0,address priceOracle,bytes \ - priceOracleData,bytes32 appData)", - ) - } - - #[inline] - fn eip712_components() - -> alloy_sol_types::private::Vec> - { - alloy_sol_types::private::Vec::new() - } - - #[inline] - fn eip712_encode_type() -> alloy_sol_types::private::Cow<'static, str> { - ::eip712_root_type() - } - - #[inline] - fn eip712_encode_data(&self) -> alloy_sol_types::private::Vec { - [ - as alloy_sol_types::SolType>::eip712_data_word( - &self.minTradedToken0, - ) - .0, - ::eip712_data_word( - &self.priceOracle, - ) - .0, - ::eip712_data_word( - &self.priceOracleData, - ) - .0, - as alloy_sol_types::SolType>::eip712_data_word(&self.appData) - .0, - ] - .concat() - } - } - #[automatically_derived] - impl alloy_sol_types::EventTopic for TradingParams { - #[inline] - fn topic_preimage_length(rust: &Self::RustType) -> usize { - 0usize - + as alloy_sol_types::EventTopic>::topic_preimage_length( - &rust.minTradedToken0, - ) - + ::topic_preimage_length( - &rust.priceOracle, - ) - + ::topic_preimage_length( - &rust.priceOracleData, - ) - + as alloy_sol_types::EventTopic>::topic_preimage_length( - &rust.appData, - ) - } - - #[inline] - fn encode_topic_preimage( - rust: &Self::RustType, - out: &mut alloy_sol_types::private::Vec, - ) { - out.reserve(::topic_preimage_length(rust)); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.minTradedToken0, - out, - ); - ::encode_topic_preimage( - &rust.priceOracle, - out, - ); - ::encode_topic_preimage( - &rust.priceOracleData, - out, - ); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.appData, - out, - ); - } - - #[inline] - fn encode_topic(rust: &Self::RustType) -> alloy_sol_types::abi::token::WordToken { - let mut out = alloy_sol_types::private::Vec::new(); - ::encode_topic_preimage(rust, &mut out); - alloy_sol_types::abi::token::WordToken(alloy_sol_types::private::keccak256(out)) - } - } - }; - use alloy_contract; - /**Creates a new wrapper around an on-chain [`ConstantProduct`](self) contract instance. - - See the [wrapper's documentation](`ConstantProductInstance`) for more details.*/ - #[inline] - pub const fn new< - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - >( - address: alloy_sol_types::private::Address, - __provider: P, - ) -> ConstantProductInstance { - ConstantProductInstance::::new(address, __provider) - } - /**A [`ConstantProduct`](self) instance. - - Contains type-safe methods for interacting with an on-chain instance of the - [`ConstantProduct`](self) contract located at a given `address`, using a given - provider `P`. - - If the contract bytecode is available (see the [`sol!`](alloy_sol_types::sol!) - documentation on how to provide it), the `deploy` and `deploy_builder` methods can - be used to deploy a new instance of the contract. - - See the [module-level documentation](self) for all the available methods.*/ - #[derive(Clone)] - pub struct ConstantProductInstance { - address: alloy_sol_types::private::Address, - provider: P, - _network: ::core::marker::PhantomData, - } - #[automatically_derived] - impl ::core::fmt::Debug for ConstantProductInstance { - #[inline] - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple("ConstantProductInstance") - .field(&self.address) - .finish() - } - } - /// Instantiation and getters/setters. - impl, N: alloy_contract::private::Network> - ConstantProductInstance - { - /**Creates a new wrapper around an on-chain [`ConstantProduct`](self) contract instance. - - See the [wrapper's documentation](`ConstantProductInstance`) for more details.*/ - #[inline] - pub const fn new(address: alloy_sol_types::private::Address, __provider: P) -> Self { - Self { - address, - provider: __provider, - _network: ::core::marker::PhantomData, - } - } - - /// Returns a reference to the address. - #[inline] - pub const fn address(&self) -> &alloy_sol_types::private::Address { - &self.address - } - - /// Sets the address. - #[inline] - pub fn set_address(&mut self, address: alloy_sol_types::private::Address) { - self.address = address; - } - - /// Sets the address and returns `self`. - pub fn at(mut self, address: alloy_sol_types::private::Address) -> Self { - self.set_address(address); - self - } - - /// Returns a reference to the provider. - #[inline] - pub const fn provider(&self) -> &P { - &self.provider - } - } - impl ConstantProductInstance<&P, N> { - /// Clones the provider and returns a new instance with the cloned - /// provider. - #[inline] - pub fn with_cloned_provider(self) -> ConstantProductInstance { - ConstantProductInstance { - address: self.address, - provider: ::core::clone::Clone::clone(&self.provider), - _network: ::core::marker::PhantomData, - } - } - } - /// Function calls. - impl, N: alloy_contract::private::Network> - ConstantProductInstance - { - /// Creates a new call builder using this contract instance's provider - /// and address. - /// - /// Note that the call can be any function call, not just those defined - /// in this contract. Prefer using the other methods for - /// building type-safe contract calls. - pub fn call_builder( - &self, - call: &C, - ) -> alloy_contract::SolCallBuilder<&P, C, N> { - alloy_contract::SolCallBuilder::new_sol(&self.provider, &self.address, call) - } - } - /// Event filters. - impl, N: alloy_contract::private::Network> - ConstantProductInstance - { - /// Creates a new event filter using this contract instance's provider - /// and address. - /// - /// Note that the type can be any event, not just those defined in this - /// contract. Prefer using the other methods for building - /// type-safe event filters. - pub fn event_filter( - &self, - ) -> alloy_contract::Event<&P, E, N> { - alloy_contract::Event::new_sol(&self.provider, &self.address) - } - } -} -///Module containing a contract's types and functions. -/** - -```solidity -library GPv2Order { - struct Data { address sellToken; address buyToken; address receiver; uint256 sellAmount; uint256 buyAmount; uint32 validTo; bytes32 appData; uint256 feeAmount; bytes32 kind; bool partiallyFillable; bytes32 sellTokenBalance; bytes32 buyTokenBalance; } -} -```*/ -#[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style, - clippy::empty_structs_with_brackets -)] -pub mod GPv2Order { - use {super::*, alloy_sol_types}; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**```solidity - struct Data { address sellToken; address buyToken; address receiver; uint256 sellAmount; uint256 buyAmount; uint32 validTo; bytes32 appData; uint256 feeAmount; bytes32 kind; bool partiallyFillable; bytes32 sellTokenBalance; bytes32 buyTokenBalance; } - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct Data { - #[allow(missing_docs)] - pub sellToken: alloy_sol_types::private::Address, - #[allow(missing_docs)] - pub buyToken: alloy_sol_types::private::Address, - #[allow(missing_docs)] - pub receiver: alloy_sol_types::private::Address, - #[allow(missing_docs)] - pub sellAmount: alloy_sol_types::private::primitives::aliases::U256, - #[allow(missing_docs)] - pub buyAmount: alloy_sol_types::private::primitives::aliases::U256, - #[allow(missing_docs)] - pub validTo: u32, - #[allow(missing_docs)] - pub appData: alloy_sol_types::private::FixedBytes<32>, - #[allow(missing_docs)] - pub feeAmount: alloy_sol_types::private::primitives::aliases::U256, - #[allow(missing_docs)] - pub kind: alloy_sol_types::private::FixedBytes<32>, - #[allow(missing_docs)] - pub partiallyFillable: bool, - #[allow(missing_docs)] - pub sellTokenBalance: alloy_sol_types::private::FixedBytes<32>, - #[allow(missing_docs)] - pub buyTokenBalance: alloy_sol_types::private::FixedBytes<32>, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = ( - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Uint<256>, - alloy_sol_types::sol_data::Uint<256>, - alloy_sol_types::sol_data::Uint<32>, - alloy_sol_types::sol_data::FixedBytes<32>, - alloy_sol_types::sol_data::Uint<256>, - alloy_sol_types::sol_data::FixedBytes<32>, - alloy_sol_types::sol_data::Bool, - alloy_sol_types::sol_data::FixedBytes<32>, - alloy_sol_types::sol_data::FixedBytes<32>, - ); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy_sol_types::private::Address, - alloy_sol_types::private::Address, - alloy_sol_types::private::Address, - alloy_sol_types::private::primitives::aliases::U256, - alloy_sol_types::private::primitives::aliases::U256, - u32, - alloy_sol_types::private::FixedBytes<32>, - alloy_sol_types::private::primitives::aliases::U256, - alloy_sol_types::private::FixedBytes<32>, - bool, - alloy_sol_types::private::FixedBytes<32>, - alloy_sol_types::private::FixedBytes<32>, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: Data) -> Self { - ( - value.sellToken, - value.buyToken, - value.receiver, - value.sellAmount, - value.buyAmount, - value.validTo, - value.appData, - value.feeAmount, - value.kind, - value.partiallyFillable, - value.sellTokenBalance, - value.buyTokenBalance, - ) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for Data { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - sellToken: tuple.0, - buyToken: tuple.1, - receiver: tuple.2, - sellAmount: tuple.3, - buyAmount: tuple.4, - validTo: tuple.5, - appData: tuple.6, - feeAmount: tuple.7, - kind: tuple.8, - partiallyFillable: tuple.9, - sellTokenBalance: tuple.10, - buyTokenBalance: tuple.11, - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolValue for Data { - type SolType = Self; - } - #[automatically_derived] - impl alloy_sol_types::private::SolTypeValue for Data { - #[inline] - fn stv_to_tokens(&self) -> ::Token<'_> { - ( - ::tokenize( - &self.sellToken, - ), - ::tokenize( - &self.buyToken, - ), - ::tokenize( - &self.receiver, - ), - as alloy_sol_types::SolType>::tokenize(&self.sellAmount), - as alloy_sol_types::SolType>::tokenize(&self.buyAmount), - as alloy_sol_types::SolType>::tokenize(&self.validTo), - as alloy_sol_types::SolType>::tokenize(&self.appData), - as alloy_sol_types::SolType>::tokenize(&self.feeAmount), - as alloy_sol_types::SolType>::tokenize(&self.kind), - ::tokenize( - &self.partiallyFillable, - ), - as alloy_sol_types::SolType>::tokenize(&self.sellTokenBalance), - as alloy_sol_types::SolType>::tokenize(&self.buyTokenBalance), - ) - } - - #[inline] - fn stv_abi_encoded_size(&self) -> usize { - if let Some(size) = ::ENCODED_SIZE { - return size; - } - let tuple = - as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_encoded_size(&tuple) - } - - #[inline] - fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { - ::eip712_hash_struct(self) - } - - #[inline] - fn stv_abi_encode_packed_to(&self, out: &mut alloy_sol_types::private::Vec) { - let tuple = - as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_encode_packed_to( - &tuple, out, - ) - } - - #[inline] - fn stv_abi_packed_encoded_size(&self) -> usize { - if let Some(size) = ::PACKED_ENCODED_SIZE { - return size; - } - let tuple = - as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_packed_encoded_size( - &tuple, - ) - } - } - #[automatically_derived] - impl alloy_sol_types::SolType for Data { - type RustType = Self; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const ENCODED_SIZE: Option = - as alloy_sol_types::SolType>::ENCODED_SIZE; - const PACKED_ENCODED_SIZE: Option = - as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; - const SOL_NAME: &'static str = ::NAME; - - #[inline] - fn valid_token(token: &Self::Token<'_>) -> bool { - as alloy_sol_types::SolType>::valid_token(token) - } - - #[inline] - fn detokenize(token: Self::Token<'_>) -> Self::RustType { - let tuple = as alloy_sol_types::SolType>::detokenize(token); - >>::from(tuple) - } - } - #[automatically_derived] - impl alloy_sol_types::SolStruct for Data { - const NAME: &'static str = "Data"; - - #[inline] - fn eip712_root_type() -> alloy_sol_types::private::Cow<'static, str> { - alloy_sol_types::private::Cow::Borrowed( - "Data(address sellToken,address buyToken,address receiver,uint256 \ - sellAmount,uint256 buyAmount,uint32 validTo,bytes32 appData,uint256 \ - feeAmount,bytes32 kind,bool partiallyFillable,bytes32 \ - sellTokenBalance,bytes32 buyTokenBalance)", - ) - } - - #[inline] - fn eip712_components() - -> alloy_sol_types::private::Vec> - { - alloy_sol_types::private::Vec::new() - } - - #[inline] - fn eip712_encode_type() -> alloy_sol_types::private::Cow<'static, str> { - ::eip712_root_type() - } - - #[inline] - fn eip712_encode_data(&self) -> alloy_sol_types::private::Vec { - [ - ::eip712_data_word( - &self.sellToken, - ) - .0, - ::eip712_data_word( - &self.buyToken, - ) - .0, - ::eip712_data_word( - &self.receiver, - ) - .0, - as alloy_sol_types::SolType>::eip712_data_word(&self.sellAmount) - .0, - as alloy_sol_types::SolType>::eip712_data_word(&self.buyAmount) - .0, - as alloy_sol_types::SolType>::eip712_data_word(&self.validTo) - .0, - as alloy_sol_types::SolType>::eip712_data_word(&self.appData) - .0, - as alloy_sol_types::SolType>::eip712_data_word(&self.feeAmount) - .0, - as alloy_sol_types::SolType>::eip712_data_word(&self.kind) - .0, - ::eip712_data_word( - &self.partiallyFillable, - ) - .0, - as alloy_sol_types::SolType>::eip712_data_word( - &self.sellTokenBalance, - ) - .0, - as alloy_sol_types::SolType>::eip712_data_word( - &self.buyTokenBalance, - ) - .0, - ] - .concat() - } - } - #[automatically_derived] - impl alloy_sol_types::EventTopic for Data { - #[inline] - fn topic_preimage_length(rust: &Self::RustType) -> usize { - 0usize - + ::topic_preimage_length( - &rust.sellToken, - ) - + ::topic_preimage_length( - &rust.buyToken, - ) - + ::topic_preimage_length( - &rust.receiver, - ) - + as alloy_sol_types::EventTopic>::topic_preimage_length( - &rust.sellAmount, - ) - + as alloy_sol_types::EventTopic>::topic_preimage_length( - &rust.buyAmount, - ) - + as alloy_sol_types::EventTopic>::topic_preimage_length( - &rust.validTo, - ) - + as alloy_sol_types::EventTopic>::topic_preimage_length( - &rust.appData, - ) - + as alloy_sol_types::EventTopic>::topic_preimage_length( - &rust.feeAmount, - ) - + as alloy_sol_types::EventTopic>::topic_preimage_length(&rust.kind) - + ::topic_preimage_length( - &rust.partiallyFillable, - ) - + as alloy_sol_types::EventTopic>::topic_preimage_length( - &rust.sellTokenBalance, - ) - + as alloy_sol_types::EventTopic>::topic_preimage_length( - &rust.buyTokenBalance, - ) - } - - #[inline] - fn encode_topic_preimage( - rust: &Self::RustType, - out: &mut alloy_sol_types::private::Vec, - ) { - out.reserve(::topic_preimage_length(rust)); - ::encode_topic_preimage( - &rust.sellToken, - out, - ); - ::encode_topic_preimage( - &rust.buyToken, - out, - ); - ::encode_topic_preimage( - &rust.receiver, - out, - ); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.sellAmount, - out, - ); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.buyAmount, - out, - ); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.validTo, - out, - ); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.appData, - out, - ); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.feeAmount, - out, - ); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.kind, - out, - ); - ::encode_topic_preimage( - &rust.partiallyFillable, - out, - ); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.sellTokenBalance, - out, - ); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.buyTokenBalance, - out, - ); - } - - #[inline] - fn encode_topic(rust: &Self::RustType) -> alloy_sol_types::abi::token::WordToken { - let mut out = alloy_sol_types::private::Vec::new(); - ::encode_topic_preimage(rust, &mut out); - alloy_sol_types::abi::token::WordToken(alloy_sol_types::private::keccak256(out)) - } - } - }; - use alloy_contract; - /**Creates a new wrapper around an on-chain [`GPv2Order`](self) contract instance. - - See the [wrapper's documentation](`GPv2OrderInstance`) for more details.*/ - #[inline] - pub const fn new< - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - >( - address: alloy_sol_types::private::Address, - __provider: P, - ) -> GPv2OrderInstance { - GPv2OrderInstance::::new(address, __provider) - } - /**A [`GPv2Order`](self) instance. - - Contains type-safe methods for interacting with an on-chain instance of the - [`GPv2Order`](self) contract located at a given `address`, using a given - provider `P`. - - If the contract bytecode is available (see the [`sol!`](alloy_sol_types::sol!) - documentation on how to provide it), the `deploy` and `deploy_builder` methods can - be used to deploy a new instance of the contract. - - See the [module-level documentation](self) for all the available methods.*/ - #[derive(Clone)] - pub struct GPv2OrderInstance { - address: alloy_sol_types::private::Address, - provider: P, - _network: ::core::marker::PhantomData, - } - #[automatically_derived] - impl ::core::fmt::Debug for GPv2OrderInstance { - #[inline] - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple("GPv2OrderInstance") - .field(&self.address) - .finish() - } - } - /// Instantiation and getters/setters. - impl, N: alloy_contract::private::Network> - GPv2OrderInstance - { - /**Creates a new wrapper around an on-chain [`GPv2Order`](self) contract instance. - - See the [wrapper's documentation](`GPv2OrderInstance`) for more details.*/ - #[inline] - pub const fn new(address: alloy_sol_types::private::Address, __provider: P) -> Self { - Self { - address, - provider: __provider, - _network: ::core::marker::PhantomData, - } - } - - /// Returns a reference to the address. - #[inline] - pub const fn address(&self) -> &alloy_sol_types::private::Address { - &self.address - } - - /// Sets the address. - #[inline] - pub fn set_address(&mut self, address: alloy_sol_types::private::Address) { - self.address = address; - } - - /// Sets the address and returns `self`. - pub fn at(mut self, address: alloy_sol_types::private::Address) -> Self { - self.set_address(address); - self - } - - /// Returns a reference to the provider. - #[inline] - pub const fn provider(&self) -> &P { - &self.provider - } - } - impl GPv2OrderInstance<&P, N> { - /// Clones the provider and returns a new instance with the cloned - /// provider. - #[inline] - pub fn with_cloned_provider(self) -> GPv2OrderInstance { - GPv2OrderInstance { - address: self.address, - provider: ::core::clone::Clone::clone(&self.provider), - _network: ::core::marker::PhantomData, - } - } - } - /// Function calls. - impl, N: alloy_contract::private::Network> - GPv2OrderInstance - { - /// Creates a new call builder using this contract instance's provider - /// and address. - /// - /// Note that the call can be any function call, not just those defined - /// in this contract. Prefer using the other methods for - /// building type-safe contract calls. - pub fn call_builder( - &self, - call: &C, - ) -> alloy_contract::SolCallBuilder<&P, C, N> { - alloy_contract::SolCallBuilder::new_sol(&self.provider, &self.address, call) - } - } - /// Event filters. - impl, N: alloy_contract::private::Network> - GPv2OrderInstance - { - /// Creates a new event filter using this contract instance's provider - /// and address. - /// - /// Note that the type can be any event, not just those defined in this - /// contract. Prefer using the other methods for building - /// type-safe event filters. - pub fn event_filter( - &self, - ) -> alloy_contract::Event<&P, E, N> { - alloy_contract::Event::new_sol(&self.provider, &self.address) - } - } -} -/** - -Generated by the following Solidity interface... -```solidity -library ConstantProduct { - struct TradingParams { - uint256 minTradedToken0; - address priceOracle; - bytes priceOracleData; - bytes32 appData; - } -} - -library GPv2Order { - struct Data { - address sellToken; - address buyToken; - address receiver; - uint256 sellAmount; - uint256 buyAmount; - uint32 validTo; - bytes32 appData; - uint256 feeAmount; - bytes32 kind; - bool partiallyFillable; - bytes32 sellTokenBalance; - bytes32 buyTokenBalance; - } -} - -interface CowAmm { - error CommitOutsideOfSettlement(); - error OnlyManagerCanCall(); - error OrderDoesNotMatchCommitmentHash(); - error OrderDoesNotMatchDefaultTradeableOrder(); - error OrderDoesNotMatchMessageHash(); - error OrderNotValid(string); - error PollTryAtBlock(uint256 blockNumber, string message); - error TradingParamsDoNotMatchHash(); - - event TradingDisabled(); - event TradingEnabled(bytes32 indexed hash, ConstantProduct.TradingParams params); - - constructor(address _solutionSettler, address _token0, address _token1); - - function commit(bytes32 orderHash) external; - function hash(ConstantProduct.TradingParams memory tradingParams) external pure returns (bytes32); - function isValidSignature(bytes32 _hash, bytes memory signature) external view returns (bytes4); - function manager() external view returns (address); - function token0() external view returns (address); - function token1() external view returns (address); - function verify(ConstantProduct.TradingParams memory tradingParams, GPv2Order.Data memory order) external view; -} -``` - -...which was generated by the following JSON ABI: -```json -[ - { - "type": "constructor", - "inputs": [ - { - "name": "_solutionSettler", - "type": "address", - "internalType": "contract ISettlement" - }, - { - "name": "_token0", - "type": "address", - "internalType": "contract IERC20" - }, - { - "name": "_token1", - "type": "address", - "internalType": "contract IERC20" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "commit", - "inputs": [ - { - "name": "orderHash", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "hash", - "inputs": [ - { - "name": "tradingParams", - "type": "tuple", - "internalType": "struct ConstantProduct.TradingParams", - "components": [ - { - "name": "minTradedToken0", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "priceOracle", - "type": "address", - "internalType": "contract IPriceOracle" - }, - { - "name": "priceOracleData", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "appData", - "type": "bytes32", - "internalType": "bytes32" - } - ] - } - ], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "isValidSignature", - "inputs": [ - { - "name": "_hash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "signature", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes4", - "internalType": "bytes4" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "manager", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "token0", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "contract IERC20" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "token1", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "contract IERC20" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "verify", - "inputs": [ - { - "name": "tradingParams", - "type": "tuple", - "internalType": "struct ConstantProduct.TradingParams", - "components": [ - { - "name": "minTradedToken0", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "priceOracle", - "type": "address", - "internalType": "contract IPriceOracle" - }, - { - "name": "priceOracleData", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "appData", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "name": "order", - "type": "tuple", - "internalType": "struct GPv2Order.Data", - "components": [ - { - "name": "sellToken", - "type": "address", - "internalType": "contract IERC20" - }, - { - "name": "buyToken", - "type": "address", - "internalType": "contract IERC20" - }, - { - "name": "receiver", - "type": "address", - "internalType": "address" - }, - { - "name": "sellAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "buyAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "validTo", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "appData", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "feeAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "kind", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "partiallyFillable", - "type": "bool", - "internalType": "bool" - }, - { - "name": "sellTokenBalance", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "buyTokenBalance", - "type": "bytes32", - "internalType": "bytes32" - } - ] - } - ], - "outputs": [], - "stateMutability": "view" - }, - { - "type": "event", - "name": "TradingDisabled", - "inputs": [], - "anonymous": false - }, - { - "type": "event", - "name": "TradingEnabled", - "inputs": [ - { - "name": "hash", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "params", - "type": "tuple", - "indexed": false, - "internalType": "struct ConstantProduct.TradingParams", - "components": [ - { - "name": "minTradedToken0", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "priceOracle", - "type": "address", - "internalType": "contract IPriceOracle" - }, - { - "name": "priceOracleData", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "appData", - "type": "bytes32", - "internalType": "bytes32" - } - ] - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "CommitOutsideOfSettlement", - "inputs": [] - }, - { - "type": "error", - "name": "OnlyManagerCanCall", - "inputs": [] - }, - { - "type": "error", - "name": "OrderDoesNotMatchCommitmentHash", - "inputs": [] - }, - { - "type": "error", - "name": "OrderDoesNotMatchDefaultTradeableOrder", - "inputs": [] - }, - { - "type": "error", - "name": "OrderDoesNotMatchMessageHash", - "inputs": [] - }, - { - "type": "error", - "name": "OrderNotValid", - "inputs": [ - { - "name": "", - "type": "string", - "internalType": "string" - } - ] - }, - { - "type": "error", - "name": "PollTryAtBlock", - "inputs": [ - { - "name": "blockNumber", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "message", - "type": "string", - "internalType": "string" - } - ] - }, - { - "type": "error", - "name": "TradingParamsDoNotMatchHash", - "inputs": [] - } -] -```*/ -#[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style, - clippy::empty_structs_with_brackets -)] -pub mod CowAmm { - use {super::*, alloy_sol_types}; - /// The creation / init bytecode of the contract. - /// - /// ```text - ///0x610120604052348015610010575f80fd5b5060405161267838038061267883398101604081905261002f9161052f565b6001600160a01b03831660808190526040805163f698da2560e01b8152905163f698da259160048082019260209290919082900301815f875af1158015610078573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061009c9190610579565b610100526100aa823361015f565b6100b4813361015f565b336001600160a01b031660e0816001600160a01b0316815250505f836001600160a01b0316639b552cc26040518163ffffffff1660e01b81526004016020604051808303815f875af115801561010c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101309190610590565b905061013c838261015f565b610146828261015f565b506001600160a01b0391821660a0521660c0525061061c565b6101746001600160a01b038316825f19610178565b5050565b8015806101f05750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156101ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ee9190610579565b155b6102675760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084015b60405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526102bd9185916102c216565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201525f9061030e906001600160a01b03851690849061038d565b905080515f148061032e57508080602001905181019061032e91906105b2565b6102bd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161025e565b606061039b84845f856103a3565b949350505050565b6060824710156104045760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161025e565b5f80866001600160a01b0316858760405161041f91906105d1565b5f6040518083038185875af1925050503d805f8114610459576040519150601f19603f3d011682016040523d82523d5f602084013e61045e565b606091505b5090925090506104708783838761047b565b979650505050505050565b606083156104e95782515f036104e2576001600160a01b0385163b6104e25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161025e565b508161039b565b61039b83838151156104fe5781518083602001fd5b8060405162461bcd60e51b815260040161025e91906105e7565b6001600160a01b038116811461052c575f80fd5b50565b5f805f60608486031215610541575f80fd5b835161054c81610518565b602085015190935061055d81610518565b604085015190925061056e81610518565b809150509250925092565b5f60208284031215610589575f80fd5b5051919050565b5f602082840312156105a0575f80fd5b81516105ab81610518565b9392505050565b5f602082840312156105c2575f80fd5b815180151581146105ab575f80fd5b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051611fbd6106bb5f395f81816102db015261042b01525f8181610236015281816104d90152610bf901525f81816102b40152818161059901528181610d5c01528181610ebf01528181610f8e015261100d01525f81816101380152818161057701528181610d3b01528181610e2801528181610f6b015261103001525f818161032201526112140152611fbd5ff3fe608060405234801561000f575f80fd5b506004361061012f575f3560e01c8063b09aaaca116100ad578063e3e6f5b21161007d578063eec50b9711610063578063eec50b9714610344578063f14fcbc81461034c578063ff2dbc9814610203575f80fd5b8063e3e6f5b2146102fd578063e516715b1461031d575f80fd5b8063b09aaaca14610289578063c5f3d2541461029c578063d21220a7146102af578063d25e0cb6146102d6575f80fd5b80631c7de94111610102578063481c6a75116100e8578063481c6a7514610231578063981a160b14610258578063a029a8d414610276575f80fd5b80631c7de941146102035780633e706e321461020a575f80fd5b80630dfe1681146101335780631303a484146101845780631626ba7e146101b557806317700f01146101f9575b5f80fd5b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b7f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b5935c5b60405190815260200161017b565b6101c86101c33660046116bf565b61035f565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161017b565b6102016104d7565b005b6101a75f81565b6101a77f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b59381565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b61026161012c81565b60405163ffffffff909116815260200161017b565b6102016102843660046119ee565b610573565b6101a7610297366004611a3b565b610bc8565b6102016102aa366004611a75565b610bf7565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b6101a77f000000000000000000000000000000000000000000000000000000000000000081565b61031061030b366004611a3b565b610cb7565b60405161017b9190611aac565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b6101a75f5481565b61020161035a366004611b9a565b6111fc565b5f808061036e84860186611bb1565b915091505f5461037d82610bc8565b146103b4576040517ff1a6789000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0820180517fd5a25ba2e97094ad7d83dc28a6572da797d6b3e7fc6663bd93efb789fc17e48982526101a0822091526040517f190100000000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006002820152602281019190915260429020868114610494576040517f593fcacd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f818385611291565b6104a98284610573565b507f1626ba7e00000000000000000000000000000000000000000000000000000000925050505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610546576040517ff87d0d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080556040517fbcb8b8fbdea8aa6dc4ae41213e4da81e605a3d1a56ed851b9355182321c091909190a1565b80517f0000000000000000000000000000000000000000000000000000000000000000907f00000000000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff808416911614610677578073ffffffffffffffffffffffffffffffffffffffff16835f015173ffffffffffffffffffffffffffffffffffffffff1614610675576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c69642073656c6c20746f6b656e000000000000000000000000000060448201526064015b60405180910390fd5b905b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190611bff565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091505f9073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015610772573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107969190611bff565b90508273ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff1614610831576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f696e76616c69642062757920746f6b656e000000000000000000000000000000604482015260640161066c565b604085015173ffffffffffffffffffffffffffffffffffffffff16156108b3576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7265636569766572206d757374206265207a65726f2061646472657373000000604482015260640161066c565b6108bf61012c42611c43565b8560a0015163ffffffff161115610932576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f76616c696469747920746f6f2066617220696e20746865206675747572650000604482015260640161066c565b85606001518560c00151146109a3576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c696420617070446174610000000000000000000000000000000000604482015260640161066c565b60e085015115610a0f576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f66656520616d6f756e74206d757374206265207a65726f000000000000000000604482015260640161066c565b7f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc985610160015114610a9d576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f627579546f6b656e42616c616e6365206d757374206265206572633230000000604482015260640161066c565b7f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc985610140015114610b2b576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f73656c6c546f6b656e42616c616e6365206d7573742062652065726332300000604482015260640161066c565b6060850151610b3a9082611c56565b60808601516060870151610b4e9085611c6d565b610b589190611c56565b1015610bc0576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f726563656976656420616d6f756e7420746f6f206c6f77000000000000000000604482015260640161066c565b505050505050565b5f81604051602001610bda9190611ccc565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610c66576040517ff87d0d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610c7361029783611d27565b9050805f81905550807f510e4a4f76907c2d6158b343f7c4f2f597df385b727c26e9ef90e75093ace19a83604051610cab9190611d79565b60405180910390a25050565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608101919091525f80836020015173ffffffffffffffffffffffffffffffffffffffff1663355efdd97f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000087604001516040518463ffffffff1660e01b8152600401610d9e93929190611e3a565b6040805180830381865afa158015610db8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddc9190611e72565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291935091505f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610e6d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e919190611bff565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610f19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f3d9190611bff565b90925090505f80808080610f518888611c56565b90505f610f5e8a88611c56565b90505f8282101561100b577f000000000000000000000000000000000000000000000000000000000000000096507f00000000000000000000000000000000000000000000000000000000000000009550610fd6610fbd60028b611ec1565b610fd184610fcc8e6002611c56565b611346565b61137e565b945061100185610fe6818d611c56565b610ff09085611c43565b610ffa8c8f611c56565b60016113cb565b9350849050611098565b7f000000000000000000000000000000000000000000000000000000000000000096507f0000000000000000000000000000000000000000000000000000000000000000955061106e61105f60028a611ec1565b610fd185610fcc8f6002611c56565b94506110928561107e818e611c56565b6110889086611c43565b610ffa8b8e611c56565b93508390505b8c518110156110df576110df6040518060400160405280601781526020017f74726164656420616d6f756e7420746f6f20736d616c6c000000000000000000815250611426565b6040518061018001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200161115661012c611466565b63ffffffff1681526020018e6060015181526020015f81526020017ff3b277728b3fee749481eb3e0b3b48980dbbab78658fc419025cb16eee34677581526020016001151581526020017f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc981526020017f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc98152509b505050505050505050505050919050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461126b576040517fbf84897700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b807f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b5935d50565b7f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b5935c8381146113405780156112f2576040517fdafbdd1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6112fc84610cb7565b90506113088382611487565b61133e576040517fd9ff24c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b50505050565b5f82156113735781611359600185611c6d565b6113639190611ec1565b61136e906001611c43565b611375565b5f5b90505b92915050565b5f818310156113c5576113c56040518060400160405280601581526020017f7375627472616374696f6e20756e646572666c6f770000000000000000000000815250611426565b50900390565b5f806113d8868686611599565b905060018360028111156113ee576113ee611ed4565b14801561140a57505f848061140557611405611e94565b868809115b1561141d5761141a600182611c43565b90505b95945050505050565b611431436001611c43565b816040517f1fe8506e00000000000000000000000000000000000000000000000000000000815260040161066c929190611f01565b5f81806114738142611f19565b61147d9190611f3b565b6113789190611f63565b5f80825f015173ffffffffffffffffffffffffffffffffffffffff16845f015173ffffffffffffffffffffffffffffffffffffffff161490505f836020015173ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff161490505f846060015186606001511490505f856080015187608001511490505f8660a0015163ffffffff168860a0015163ffffffff161490505f8761010001518961010001511490505f88610120015115158a6101200151151514905086801561155e5750855b80156115675750845b80156115705750835b80156115795750825b80156115825750815b801561158b5750805b9a9950505050505050505050565b5f80807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709858702925082811083820303915050805f036115ef578382816115e5576115e5611e94565b04925050506104d0565b808411611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f770000000000000000000000604482015260640161066c565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f805f604084860312156116d1575f80fd5b83359250602084013567ffffffffffffffff808211156116ef575f80fd5b818601915086601f830112611702575f80fd5b813581811115611710575f80fd5b876020828501011115611721575f80fd5b6020830194508093505050509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff8111828210171561178457611784611734565b60405290565b604051610180810167ffffffffffffffff8111828210171561178457611784611734565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156117f5576117f5611734565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461181e575f80fd5b50565b5f60808284031215611831575f80fd5b611839611761565b90508135815260208083013561184e816117fd565b82820152604083013567ffffffffffffffff8082111561186c575f80fd5b818501915085601f83011261187f575f80fd5b81358181111561189157611891611734565b6118c1847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016117ae565b915080825286848285010111156118d6575f80fd5b80848401858401375f848284010152508060408501525050506060820135606082015292915050565b803561190a816117fd565b919050565b803563ffffffff8116811461190a575f80fd5b8035801515811461190a575f80fd5b5f6101808284031215611942575f80fd5b61194a61178a565b9050611955826118ff565b8152611963602083016118ff565b6020820152611974604083016118ff565b6040820152606082013560608201526080820135608082015261199960a0830161190f565b60a082015260c082013560c082015260e082013560e08201526101008083013581830152506101206119cc818401611922565b9082015261014082810135908201526101609182013591810191909152919050565b5f806101a08385031215611a00575f80fd5b823567ffffffffffffffff811115611a16575f80fd5b611a2285828601611821565b925050611a328460208501611931565b90509250929050565b5f60208284031215611a4b575f80fd5b813567ffffffffffffffff811115611a61575f80fd5b611a6d84828501611821565b949350505050565b5f60208284031215611a85575f80fd5b813567ffffffffffffffff811115611a9b575f80fd5b8201608081850312156104d0575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff16815261018081016020830151611af2602084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040830151611b1a604084018273ffffffffffffffffffffffffffffffffffffffff169052565b50606083015160608301526080830151608083015260a0830151611b4660a084018263ffffffff169052565b5060c083015160c083015260e083015160e083015261010080840151818401525061012080840151611b7b8285018215159052565b5050610140838101519083015261016092830151929091019190915290565b5f60208284031215611baa575f80fd5b5035919050565b5f806101a08385031215611bc3575f80fd5b611bcd8484611931565b915061018083013567ffffffffffffffff811115611be9575f80fd5b611bf585828601611821565b9150509250929050565b5f60208284031215611c0f575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561137857611378611c16565b808202811582820484141761137857611378611c16565b8181038181111561137857611378611c16565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081528151602082015273ffffffffffffffffffffffffffffffffffffffff60208301511660408201525f604083015160806060840152611d1160a0840182611c80565b9050606084015160808401528091505092915050565b5f6113783683611821565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60208152813560208201525f6020830135611d93816117fd565b73ffffffffffffffffffffffffffffffffffffffff811660408401525060408301357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611de4575f80fd5b830160208101903567ffffffffffffffff811115611e00575f80fd5b803603821315611e0e575f80fd5b60806060850152611e2360a085018284611d32565b915050606084013560808401528091505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff80861683528085166020840152506060604083015261141d6060830184611c80565b5f8060408385031215611e83575f80fd5b505080516020909101519092909150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82611ecf57611ecf611e94565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b828152604060208201525f611a6d6040830184611c80565b5f63ffffffff80841680611f2f57611f2f611e94565b92169190910492915050565b63ffffffff818116838216028082169190828114611f5b57611f5b611c16565b505092915050565b63ffffffff818116838216019080821115611f8057611f80611c16565b509291505056fea2646970667358221220e3fb228b525d90b942c7e58fe2e2034a17bd258c082fd47740e764a7be45bac664736f6c63430008190033 - /// ``` - #[rustfmt::skip] - #[allow(clippy::all)] - pub static BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"a\x01 `@R4\x80\x15a\0\x10W_\x80\xFD[P`@Qa&x8\x03\x80a&x\x839\x81\x01`@\x81\x90Ra\0/\x91a\x05/V[`\x01`\x01`\xA0\x1B\x03\x83\x16`\x80\x81\x90R`@\x80Qc\xF6\x98\xDA%`\xE0\x1B\x81R\x90Qc\xF6\x98\xDA%\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81_\x87Z\xF1\x15\x80\x15a\0xW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\0\x9C\x91\x90a\x05yV[a\x01\0Ra\0\xAA\x823a\x01_V[a\0\xB4\x813a\x01_V[3`\x01`\x01`\xA0\x1B\x03\x16`\xE0\x81`\x01`\x01`\xA0\x1B\x03\x16\x81RPP_\x83`\x01`\x01`\xA0\x1B\x03\x16c\x9BU,\xC2`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81_\x87Z\xF1\x15\x80\x15a\x01\x0CW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x010\x91\x90a\x05\x90V[\x90Pa\x01<\x83\x82a\x01_V[a\x01F\x82\x82a\x01_V[P`\x01`\x01`\xA0\x1B\x03\x91\x82\x16`\xA0R\x16`\xC0RPa\x06\x1CV[a\x01t`\x01`\x01`\xA0\x1B\x03\x83\x16\x82_\x19a\x01xV[PPV[\x80\x15\x80a\x01\xF0WP`@Qcn\xB1v\x9F`\xE1\x1B\x81R0`\x04\x82\x01R`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`$\x83\x01R\x84\x16\x90c\xDDb\xED>\x90`D\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x01\xCAW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x01\xEE\x91\x90a\x05yV[\x15[a\x02gW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`6`$\x82\x01R\x7FSafeERC20: approve from non-zero`D\x82\x01R\x7F to non-zero allowance\0\0\0\0\0\0\0\0\0\0`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[`@\x80Q`\x01`\x01`\xA0\x1B\x03\x84\x16`$\x82\x01R`D\x80\x82\x01\x84\x90R\x82Q\x80\x83\x03\x90\x91\x01\x81R`d\x90\x91\x01\x90\x91R` \x81\x01\x80Q`\x01`\x01`\xE0\x1B\x03\x90\x81\x16c\t^\xA7\xB3`\xE0\x1B\x17\x90\x91Ra\x02\xBD\x91\x85\x91a\x02\xC2\x16V[PPPV[`@\x80Q\x80\x82\x01\x90\x91R` \x80\x82R\x7FSafeERC20: low-level call failed\x90\x82\x01R_\x90a\x03\x0E\x90`\x01`\x01`\xA0\x1B\x03\x85\x16\x90\x84\x90a\x03\x8DV[\x90P\x80Q_\x14\x80a\x03.WP\x80\x80` \x01\x90Q\x81\x01\x90a\x03.\x91\x90a\x05\xB2V[a\x02\xBDW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`*`$\x82\x01R\x7FSafeERC20: ERC20 operation did n`D\x82\x01Ri\x1B\xDD\x08\x1C\xDDX\xD8\xD9YY`\xB2\x1B`d\x82\x01R`\x84\x01a\x02^V[``a\x03\x9B\x84\x84_\x85a\x03\xA3V[\x94\x93PPPPV[``\x82G\x10\x15a\x04\x04W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`&`$\x82\x01R\x7FAddress: insufficient balance fo`D\x82\x01Re\x1C\x88\x18\xD8[\x1B`\xD2\x1B`d\x82\x01R`\x84\x01a\x02^V[_\x80\x86`\x01`\x01`\xA0\x1B\x03\x16\x85\x87`@Qa\x04\x1F\x91\x90a\x05\xD1V[_`@Q\x80\x83\x03\x81\x85\x87Z\xF1\x92PPP=\x80_\x81\x14a\x04YW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a\x04^V[``\x91P[P\x90\x92P\x90Pa\x04p\x87\x83\x83\x87a\x04{V[\x97\x96PPPPPPPV[``\x83\x15a\x04\xE9W\x82Q_\x03a\x04\xE2W`\x01`\x01`\xA0\x1B\x03\x85\x16;a\x04\xE2W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FAddress: call to non-contract\0\0\0`D\x82\x01R`d\x01a\x02^V[P\x81a\x03\x9BV[a\x03\x9B\x83\x83\x81Q\x15a\x04\xFEW\x81Q\x80\x83` \x01\xFD[\x80`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x02^\x91\x90a\x05\xE7V[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x05,W_\x80\xFD[PV[_\x80_``\x84\x86\x03\x12\x15a\x05AW_\x80\xFD[\x83Qa\x05L\x81a\x05\x18V[` \x85\x01Q\x90\x93Pa\x05]\x81a\x05\x18V[`@\x85\x01Q\x90\x92Pa\x05n\x81a\x05\x18V[\x80\x91PP\x92P\x92P\x92V[_` \x82\x84\x03\x12\x15a\x05\x89W_\x80\xFD[PQ\x91\x90PV[_` \x82\x84\x03\x12\x15a\x05\xA0W_\x80\xFD[\x81Qa\x05\xAB\x81a\x05\x18V[\x93\x92PPPV[_` \x82\x84\x03\x12\x15a\x05\xC2W_\x80\xFD[\x81Q\x80\x15\x15\x81\x14a\x05\xABW_\x80\xFD[_\x82Q\x80` \x85\x01\x84^_\x92\x01\x91\x82RP\x91\x90PV[` \x81R_\x82Q\x80` \x84\x01R\x80` \x85\x01`@\x85\x01^_`@\x82\x85\x01\x01R`@`\x1F\x19`\x1F\x83\x01\x16\x84\x01\x01\x91PP\x92\x91PPV[`\x80Q`\xA0Q`\xC0Q`\xE0Qa\x01\0Qa\x1F\xBDa\x06\xBB_9_\x81\x81a\x02\xDB\x01Ra\x04+\x01R_\x81\x81a\x026\x01R\x81\x81a\x04\xD9\x01Ra\x0B\xF9\x01R_\x81\x81a\x02\xB4\x01R\x81\x81a\x05\x99\x01R\x81\x81a\r\\\x01R\x81\x81a\x0E\xBF\x01R\x81\x81a\x0F\x8E\x01Ra\x10\r\x01R_\x81\x81a\x018\x01R\x81\x81a\x05w\x01R\x81\x81a\r;\x01R\x81\x81a\x0E(\x01R\x81\x81a\x0Fk\x01Ra\x100\x01R_\x81\x81a\x03\"\x01Ra\x12\x14\x01Ra\x1F\xBD_\xF3\xFE`\x80`@R4\x80\x15a\0\x0FW_\x80\xFD[P`\x046\x10a\x01/W_5`\xE0\x1C\x80c\xB0\x9A\xAA\xCA\x11a\0\xADW\x80c\xE3\xE6\xF5\xB2\x11a\0}W\x80c\xEE\xC5\x0B\x97\x11a\0cW\x80c\xEE\xC5\x0B\x97\x14a\x03DW\x80c\xF1O\xCB\xC8\x14a\x03LW\x80c\xFF-\xBC\x98\x14a\x02\x03W_\x80\xFD[\x80c\xE3\xE6\xF5\xB2\x14a\x02\xFDW\x80c\xE5\x16q[\x14a\x03\x1DW_\x80\xFD[\x80c\xB0\x9A\xAA\xCA\x14a\x02\x89W\x80c\xC5\xF3\xD2T\x14a\x02\x9CW\x80c\xD2\x12 \xA7\x14a\x02\xAFW\x80c\xD2^\x0C\xB6\x14a\x02\xD6W_\x80\xFD[\x80c\x1C}\xE9A\x11a\x01\x02W\x80cH\x1Cju\x11a\0\xE8W\x80cH\x1Cju\x14a\x021W\x80c\x98\x1A\x16\x0B\x14a\x02XW\x80c\xA0)\xA8\xD4\x14a\x02vW_\x80\xFD[\x80c\x1C}\xE9A\x14a\x02\x03W\x80c>pn2\x14a\x02\nW_\x80\xFD[\x80c\r\xFE\x16\x81\x14a\x013W\x80c\x13\x03\xA4\x84\x14a\x01\x84W\x80c\x16&\xBA~\x14a\x01\xB5W\x80c\x17p\x0F\x01\x14a\x01\xF9W[_\x80\xFD[a\x01Z\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[`@Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[\x7Fl<\x90$TW\x06\x0Fe\x17x{,K\x8C\xF5\0\xCA\x88\x9D#\x04\xAF\x02\x04;\xD5\xB5\x13\xE3\xB5\x93\\[`@Q\x90\x81R` \x01a\x01{V[a\x01\xC8a\x01\xC36`\x04a\x16\xBFV[a\x03_V[`@Q\x7F\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x91\x16\x81R` \x01a\x01{V[a\x02\x01a\x04\xD7V[\0[a\x01\xA7_\x81V[a\x01\xA7\x7Fl<\x90$TW\x06\x0Fe\x17x{,K\x8C\xF5\0\xCA\x88\x9D#\x04\xAF\x02\x04;\xD5\xB5\x13\xE3\xB5\x93\x81V[a\x01Z\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[a\x02aa\x01,\x81V[`@Qc\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\x01{V[a\x02\x01a\x02\x846`\x04a\x19\xEEV[a\x05sV[a\x01\xA7a\x02\x976`\x04a\x1A;V[a\x0B\xC8V[a\x02\x01a\x02\xAA6`\x04a\x1AuV[a\x0B\xF7V[a\x01Z\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[a\x01\xA7\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[a\x03\x10a\x03\x0B6`\x04a\x1A;V[a\x0C\xB7V[`@Qa\x01{\x91\x90a\x1A\xACV[a\x01Z\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[a\x01\xA7_T\x81V[a\x02\x01a\x03Z6`\x04a\x1B\x9AV[a\x11\xFCV[_\x80\x80a\x03n\x84\x86\x01\x86a\x1B\xB1V[\x91P\x91P_Ta\x03}\x82a\x0B\xC8V[\x14a\x03\xB4W`@Q\x7F\xF1\xA6x\x90\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x82\x01\x80Q\x7F\xD5\xA2[\xA2\xE9p\x94\xAD}\x83\xDC(\xA6W-\xA7\x97\xD6\xB3\xE7\xFCfc\xBD\x93\xEF\xB7\x89\xFC\x17\xE4\x89\x82Ra\x01\xA0\x82 \x91R`@Q\x7F\x19\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\x02\x82\x01R`\"\x81\x01\x91\x90\x91R`B\x90 \x86\x81\x14a\x04\x94W`@Q\x7FY?\xCA\xCD\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x04\x9F\x81\x83\x85a\x12\x91V[a\x04\xA9\x82\x84a\x05sV[P\x7F\x16&\xBA~\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x92PPP[\x93\x92PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163\x14a\x05FW`@Q\x7F\xF8}\r\x16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_\x80\x80U`@Q\x7F\xBC\xB8\xB8\xFB\xDE\xA8\xAAm\xC4\xAEA!>M\xA8\x1E`Z=\x1AV\xED\x85\x1B\x93U\x18#!\xC0\x91\x90\x91\x90\xA1V[\x80Q\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x84\x16\x91\x16\x14a\x06wW\x80s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x83_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x06uW`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x12`$\x82\x01R\x7Finvalid sell token\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[\x90[`@Q\x7Fp\xA0\x821\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R0`\x04\x82\x01R_\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x84\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x06\xE1W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\x05\x91\x90a\x1B\xFFV[`@Q\x7Fp\xA0\x821\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R0`\x04\x82\x01R\x90\x91P_\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x84\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07rW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\x96\x91\x90a\x1B\xFFV[\x90P\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x85` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x081W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x11`$\x82\x01R\x7Finvalid buy token\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06lV[`@\x85\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x15a\x08\xB3W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7Freceiver must be zero address\0\0\0`D\x82\x01R`d\x01a\x06lV[a\x08\xBFa\x01,Ba\x1CCV[\x85`\xA0\x01Qc\xFF\xFF\xFF\xFF\x16\x11\x15a\t2W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x1E`$\x82\x01R\x7Fvalidity too far in the future\0\0`D\x82\x01R`d\x01a\x06lV[\x85``\x01Q\x85`\xC0\x01Q\x14a\t\xA3W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0F`$\x82\x01R\x7Finvalid appData\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06lV[`\xE0\x85\x01Q\x15a\n\x0FW`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7Ffee amount must be zero\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06lV[\x7FZ(\xE96;\xB9B\xB69'\0b\xAAk\xB2\x95\xF44\xBC\xDF\xC4,\x97&{\xF0\x03\xF2r\x06\r\xC9\x85a\x01`\x01Q\x14a\n\x9DW`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FbuyTokenBalance must be erc20\0\0\0`D\x82\x01R`d\x01a\x06lV[\x7FZ(\xE96;\xB9B\xB69'\0b\xAAk\xB2\x95\xF44\xBC\xDF\xC4,\x97&{\xF0\x03\xF2r\x06\r\xC9\x85a\x01@\x01Q\x14a\x0B+W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x1E`$\x82\x01R\x7FsellTokenBalance must be erc20\0\0`D\x82\x01R`d\x01a\x06lV[``\x85\x01Qa\x0B:\x90\x82a\x1CVV[`\x80\x86\x01Q``\x87\x01Qa\x0BN\x90\x85a\x1CmV[a\x0BX\x91\x90a\x1CVV[\x10\x15a\x0B\xC0W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7Freceived amount too low\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06lV[PPPPPPV[_\x81`@Q` \x01a\x0B\xDA\x91\x90a\x1C\xCCV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163\x14a\x0CfW`@Q\x7F\xF8}\r\x16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_a\x0Csa\x02\x97\x83a\x1D'V[\x90P\x80_\x81\x90UP\x80\x7FQ\x0EJOv\x90|-aX\xB3C\xF7\xC4\xF2\xF5\x97\xDF8[r|&\xE9\xEF\x90\xE7P\x93\xAC\xE1\x9A\x83`@Qa\x0C\xAB\x91\x90a\x1DyV[`@Q\x80\x91\x03\x90\xA2PPV[`@\x80Qa\x01\x80\x81\x01\x82R_\x80\x82R` \x82\x01\x81\x90R\x91\x81\x01\x82\x90R``\x81\x01\x82\x90R`\x80\x81\x01\x82\x90R`\xA0\x81\x01\x82\x90R`\xC0\x81\x01\x82\x90R`\xE0\x81\x01\x82\x90Ra\x01\0\x81\x01\x82\x90Ra\x01 \x81\x01\x82\x90Ra\x01@\x81\x01\x82\x90Ra\x01`\x81\x01\x91\x90\x91R_\x80\x83` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c5^\xFD\xD9\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x87`@\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\r\x9E\x93\x92\x91\x90a\x1E:V[`@\x80Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\r\xB8W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\r\xDC\x91\x90a\x1ErV[`@Q\x7Fp\xA0\x821\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R0`\x04\x82\x01R\x91\x93P\x91P_\x90\x81\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0EmW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0E\x91\x91\x90a\x1B\xFFV[`@Q\x7Fp\xA0\x821\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R0`\x04\x82\x01R\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0F\x19W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0F=\x91\x90a\x1B\xFFV[\x90\x92P\x90P_\x80\x80\x80\x80a\x0FQ\x88\x88a\x1CVV[\x90P_a\x0F^\x8A\x88a\x1CVV[\x90P_\x82\x82\x10\x15a\x10\x0BW\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x96P\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x95Pa\x0F\xD6a\x0F\xBD`\x02\x8Ba\x1E\xC1V[a\x0F\xD1\x84a\x0F\xCC\x8E`\x02a\x1CVV[a\x13FV[a\x13~V[\x94Pa\x10\x01\x85a\x0F\xE6\x81\x8Da\x1CVV[a\x0F\xF0\x90\x85a\x1CCV[a\x0F\xFA\x8C\x8Fa\x1CVV[`\x01a\x13\xCBV[\x93P\x84\x90Pa\x10\x98V[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x96P\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x95Pa\x10na\x10_`\x02\x8Aa\x1E\xC1V[a\x0F\xD1\x85a\x0F\xCC\x8F`\x02a\x1CVV[\x94Pa\x10\x92\x85a\x10~\x81\x8Ea\x1CVV[a\x10\x88\x90\x86a\x1CCV[a\x0F\xFA\x8B\x8Ea\x1CVV[\x93P\x83\x90P[\x8CQ\x81\x10\x15a\x10\xDFWa\x10\xDF`@Q\x80`@\x01`@R\x80`\x17\x81R` \x01\x7Ftraded amount too small\0\0\0\0\0\0\0\0\0\x81RPa\x14&V[`@Q\x80a\x01\x80\x01`@R\x80\x88s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x87s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x86\x81R` \x01\x85\x81R` \x01a\x11Va\x01,a\x14fV[c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x8E``\x01Q\x81R` \x01_\x81R` \x01\x7F\xF3\xB2wr\x8B?\xEEt\x94\x81\xEB>\x0B;H\x98\r\xBB\xABxe\x8F\xC4\x19\x02\\\xB1n\xEE4gu\x81R` \x01`\x01\x15\x15\x81R` \x01\x7FZ(\xE96;\xB9B\xB69'\0b\xAAk\xB2\x95\xF44\xBC\xDF\xC4,\x97&{\xF0\x03\xF2r\x06\r\xC9\x81R` \x01\x7FZ(\xE96;\xB9B\xB69'\0b\xAAk\xB2\x95\xF44\xBC\xDF\xC4,\x97&{\xF0\x03\xF2r\x06\r\xC9\x81RP\x9BPPPPPPPPPPPP\x91\x90PV[3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x12kW`@Q\x7F\xBF\x84\x89w\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80\x7Fl<\x90$TW\x06\x0Fe\x17x{,K\x8C\xF5\0\xCA\x88\x9D#\x04\xAF\x02\x04;\xD5\xB5\x13\xE3\xB5\x93]PV[\x7Fl<\x90$TW\x06\x0Fe\x17x{,K\x8C\xF5\0\xCA\x88\x9D#\x04\xAF\x02\x04;\xD5\xB5\x13\xE3\xB5\x93\\\x83\x81\x14a\x13@W\x80\x15a\x12\xF2W`@Q\x7F\xDA\xFB\xDD\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_a\x12\xFC\x84a\x0C\xB7V[\x90Pa\x13\x08\x83\x82a\x14\x87V[a\x13>W`@Q\x7F\xD9\xFF$\xC7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P[PPPPV[_\x82\x15a\x13sW\x81a\x13Y`\x01\x85a\x1CmV[a\x13c\x91\x90a\x1E\xC1V[a\x13n\x90`\x01a\x1CCV[a\x13uV[_[\x90P[\x92\x91PPV[_\x81\x83\x10\x15a\x13\xC5Wa\x13\xC5`@Q\x80`@\x01`@R\x80`\x15\x81R` \x01\x7Fsubtraction underflow\0\0\0\0\0\0\0\0\0\0\0\x81RPa\x14&V[P\x90\x03\x90V[_\x80a\x13\xD8\x86\x86\x86a\x15\x99V[\x90P`\x01\x83`\x02\x81\x11\x15a\x13\xEEWa\x13\xEEa\x1E\xD4V[\x14\x80\x15a\x14\nWP_\x84\x80a\x14\x05Wa\x14\x05a\x1E\x94V[\x86\x88\t\x11[\x15a\x14\x1DWa\x14\x1A`\x01\x82a\x1CCV[\x90P[\x95\x94PPPPPV[a\x141C`\x01a\x1CCV[\x81`@Q\x7F\x1F\xE8Pn\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x06l\x92\x91\x90a\x1F\x01V[_\x81\x80a\x14s\x81Ba\x1F\x19V[a\x14}\x91\x90a\x1F;V[a\x13x\x91\x90a\x1FcV[_\x80\x82_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x90P_\x83` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x85` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x90P_\x84``\x01Q\x86``\x01Q\x14\x90P_\x85`\x80\x01Q\x87`\x80\x01Q\x14\x90P_\x86`\xA0\x01Qc\xFF\xFF\xFF\xFF\x16\x88`\xA0\x01Qc\xFF\xFF\xFF\xFF\x16\x14\x90P_\x87a\x01\0\x01Q\x89a\x01\0\x01Q\x14\x90P_\x88a\x01 \x01Q\x15\x15\x8Aa\x01 \x01Q\x15\x15\x14\x90P\x86\x80\x15a\x15^WP\x85[\x80\x15a\x15gWP\x84[\x80\x15a\x15pWP\x83[\x80\x15a\x15yWP\x82[\x80\x15a\x15\x82WP\x81[\x80\x15a\x15\x8BWP\x80[\x9A\x99PPPPPPPPPPV[_\x80\x80\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x85\x87\t\x85\x87\x02\x92P\x82\x81\x10\x83\x82\x03\x03\x91PP\x80_\x03a\x15\xEFW\x83\x82\x81a\x15\xE5Wa\x15\xE5a\x1E\x94V[\x04\x92PPPa\x04\xD0V[\x80\x84\x11a\x16XW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x15`$\x82\x01R\x7FMath: mulDiv overflow\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06lV[_\x84\x86\x88\t`\x02`\x01\x87\x19\x81\x01\x88\x16\x97\x88\x90\x04`\x03\x81\x02\x83\x18\x80\x82\x02\x84\x03\x02\x80\x82\x02\x84\x03\x02\x80\x82\x02\x84\x03\x02\x80\x82\x02\x84\x03\x02\x80\x82\x02\x84\x03\x02\x90\x81\x02\x90\x92\x03\x90\x91\x02_\x88\x90\x03\x88\x90\x04\x90\x91\x01\x85\x83\x11\x90\x94\x03\x93\x90\x93\x02\x93\x03\x94\x90\x94\x04\x91\x90\x91\x17\x02\x94\x93PPPPV[_\x80_`@\x84\x86\x03\x12\x15a\x16\xD1W_\x80\xFD[\x835\x92P` \x84\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x16\xEFW_\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12a\x17\x02W_\x80\xFD[\x815\x81\x81\x11\x15a\x17\x10W_\x80\xFD[\x87` \x82\x85\x01\x01\x11\x15a\x17!W_\x80\xFD[` \x83\x01\x94P\x80\x93PPPP\x92P\x92P\x92V[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[`@Q`\x80\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x17\x84Wa\x17\x84a\x174V[`@R\x90V[`@Qa\x01\x80\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x17\x84Wa\x17\x84a\x174V[`@Q`\x1F\x82\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x17\xF5Wa\x17\xF5a\x174V[`@R\x91\x90PV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x18\x1EW_\x80\xFD[PV[_`\x80\x82\x84\x03\x12\x15a\x181W_\x80\xFD[a\x189a\x17aV[\x90P\x815\x81R` \x80\x83\x015a\x18N\x81a\x17\xFDV[\x82\x82\x01R`@\x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x18lW_\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x18\x7FW_\x80\xFD[\x815\x81\x81\x11\x15a\x18\x91Wa\x18\x91a\x174V[a\x18\xC1\x84\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x84\x01\x16\x01a\x17\xAEV[\x91P\x80\x82R\x86\x84\x82\x85\x01\x01\x11\x15a\x18\xD6W_\x80\xFD[\x80\x84\x84\x01\x85\x84\x017_\x84\x82\x84\x01\x01RP\x80`@\x85\x01RPPP``\x82\x015``\x82\x01R\x92\x91PPV[\x805a\x19\n\x81a\x17\xFDV[\x91\x90PV[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x19\nW_\x80\xFD[\x805\x80\x15\x15\x81\x14a\x19\nW_\x80\xFD[_a\x01\x80\x82\x84\x03\x12\x15a\x19BW_\x80\xFD[a\x19Ja\x17\x8AV[\x90Pa\x19U\x82a\x18\xFFV[\x81Ra\x19c` \x83\x01a\x18\xFFV[` \x82\x01Ra\x19t`@\x83\x01a\x18\xFFV[`@\x82\x01R``\x82\x015``\x82\x01R`\x80\x82\x015`\x80\x82\x01Ra\x19\x99`\xA0\x83\x01a\x19\x0FV[`\xA0\x82\x01R`\xC0\x82\x015`\xC0\x82\x01R`\xE0\x82\x015`\xE0\x82\x01Ra\x01\0\x80\x83\x015\x81\x83\x01RPa\x01 a\x19\xCC\x81\x84\x01a\x19\"V[\x90\x82\x01Ra\x01@\x82\x81\x015\x90\x82\x01Ra\x01`\x91\x82\x015\x91\x81\x01\x91\x90\x91R\x91\x90PV[_\x80a\x01\xA0\x83\x85\x03\x12\x15a\x1A\0W_\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1A\x16W_\x80\xFD[a\x1A\"\x85\x82\x86\x01a\x18!V[\x92PPa\x1A2\x84` \x85\x01a\x191V[\x90P\x92P\x92\x90PV[_` \x82\x84\x03\x12\x15a\x1AKW_\x80\xFD[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1AaW_\x80\xFD[a\x1Am\x84\x82\x85\x01a\x18!V[\x94\x93PPPPV[_` \x82\x84\x03\x12\x15a\x1A\x85W_\x80\xFD[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1A\x9BW_\x80\xFD[\x82\x01`\x80\x81\x85\x03\x12\x15a\x04\xD0W_\x80\xFD[\x81Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81Ra\x01\x80\x81\x01` \x83\x01Qa\x1A\xF2` \x84\x01\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90RV[P`@\x83\x01Qa\x1B\x1A`@\x84\x01\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90RV[P``\x83\x01Q``\x83\x01R`\x80\x83\x01Q`\x80\x83\x01R`\xA0\x83\x01Qa\x1BF`\xA0\x84\x01\x82c\xFF\xFF\xFF\xFF\x16\x90RV[P`\xC0\x83\x01Q`\xC0\x83\x01R`\xE0\x83\x01Q`\xE0\x83\x01Ra\x01\0\x80\x84\x01Q\x81\x84\x01RPa\x01 \x80\x84\x01Qa\x1B{\x82\x85\x01\x82\x15\x15\x90RV[PPa\x01@\x83\x81\x01Q\x90\x83\x01Ra\x01`\x92\x83\x01Q\x92\x90\x91\x01\x91\x90\x91R\x90V[_` \x82\x84\x03\x12\x15a\x1B\xAAW_\x80\xFD[P5\x91\x90PV[_\x80a\x01\xA0\x83\x85\x03\x12\x15a\x1B\xC3W_\x80\xFD[a\x1B\xCD\x84\x84a\x191V[\x91Pa\x01\x80\x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1B\xE9W_\x80\xFD[a\x1B\xF5\x85\x82\x86\x01a\x18!V[\x91PP\x92P\x92\x90PV[_` \x82\x84\x03\x12\x15a\x1C\x0FW_\x80\xFD[PQ\x91\x90PV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x11`\x04R`$_\xFD[\x80\x82\x01\x80\x82\x11\x15a\x13xWa\x13xa\x1C\x16V[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x13xWa\x13xa\x1C\x16V[\x81\x81\x03\x81\x81\x11\x15a\x13xWa\x13xa\x1C\x16V[_\x81Q\x80\x84R\x80` \x84\x01` \x86\x01^_` \x82\x86\x01\x01R` \x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x83\x01\x16\x85\x01\x01\x91PP\x92\x91PPV[` \x81R\x81Q` \x82\x01Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF` \x83\x01Q\x16`@\x82\x01R_`@\x83\x01Q`\x80``\x84\x01Ra\x1D\x11`\xA0\x84\x01\x82a\x1C\x80V[\x90P``\x84\x01Q`\x80\x84\x01R\x80\x91PP\x92\x91PPV[_a\x13x6\x83a\x18!V[\x81\x83R\x81\x81` \x85\x017P_` \x82\x84\x01\x01R_` \x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x84\x01\x16\x84\x01\x01\x90P\x92\x91PPV[` \x81R\x815` \x82\x01R_` \x83\x015a\x1D\x93\x81a\x17\xFDV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16`@\x84\x01RP`@\x83\x015\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE1\x846\x03\x01\x81\x12a\x1D\xE4W_\x80\xFD[\x83\x01` \x81\x01\x905g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1E\0W_\x80\xFD[\x806\x03\x82\x13\x15a\x1E\x0EW_\x80\xFD[`\x80``\x85\x01Ra\x1E#`\xA0\x85\x01\x82\x84a\x1D2V[\x91PP``\x84\x015`\x80\x84\x01R\x80\x91PP\x92\x91PPV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x86\x16\x83R\x80\x85\x16` \x84\x01RP```@\x83\x01Ra\x14\x1D``\x83\x01\x84a\x1C\x80V[_\x80`@\x83\x85\x03\x12\x15a\x1E\x83W_\x80\xFD[PP\x80Q` \x90\x91\x01Q\x90\x92\x90\x91PV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x12`\x04R`$_\xFD[_\x82a\x1E\xCFWa\x1E\xCFa\x1E\x94V[P\x04\x90V[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`!`\x04R`$_\xFD[\x82\x81R`@` \x82\x01R_a\x1Am`@\x83\x01\x84a\x1C\x80V[_c\xFF\xFF\xFF\xFF\x80\x84\x16\x80a\x1F/Wa\x1F/a\x1E\x94V[\x92\x16\x91\x90\x91\x04\x92\x91PPV[c\xFF\xFF\xFF\xFF\x81\x81\x16\x83\x82\x16\x02\x80\x82\x16\x91\x90\x82\x81\x14a\x1F[Wa\x1F[a\x1C\x16V[PP\x92\x91PPV[c\xFF\xFF\xFF\xFF\x81\x81\x16\x83\x82\x16\x01\x90\x80\x82\x11\x15a\x1F\x80Wa\x1F\x80a\x1C\x16V[P\x92\x91PPV\xFE\xA2dipfsX\"\x12 \xE3\xFB\"\x8BR]\x90\xB9B\xC7\xE5\x8F\xE2\xE2\x03J\x17\xBD%\x8C\x08/\xD4w@\xE7d\xA7\xBEE\xBA\xC6dsolcC\0\x08\x19\x003", - ); - /// The runtime bytecode of the contract, as deployed on the network. - /// - /// ```text - ///0x608060405234801561000f575f80fd5b506004361061012f575f3560e01c8063b09aaaca116100ad578063e3e6f5b21161007d578063eec50b9711610063578063eec50b9714610344578063f14fcbc81461034c578063ff2dbc9814610203575f80fd5b8063e3e6f5b2146102fd578063e516715b1461031d575f80fd5b8063b09aaaca14610289578063c5f3d2541461029c578063d21220a7146102af578063d25e0cb6146102d6575f80fd5b80631c7de94111610102578063481c6a75116100e8578063481c6a7514610231578063981a160b14610258578063a029a8d414610276575f80fd5b80631c7de941146102035780633e706e321461020a575f80fd5b80630dfe1681146101335780631303a484146101845780631626ba7e146101b557806317700f01146101f9575b5f80fd5b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b7f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b5935c5b60405190815260200161017b565b6101c86101c33660046116bf565b61035f565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161017b565b6102016104d7565b005b6101a75f81565b6101a77f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b59381565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b61026161012c81565b60405163ffffffff909116815260200161017b565b6102016102843660046119ee565b610573565b6101a7610297366004611a3b565b610bc8565b6102016102aa366004611a75565b610bf7565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b6101a77f000000000000000000000000000000000000000000000000000000000000000081565b61031061030b366004611a3b565b610cb7565b60405161017b9190611aac565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b6101a75f5481565b61020161035a366004611b9a565b6111fc565b5f808061036e84860186611bb1565b915091505f5461037d82610bc8565b146103b4576040517ff1a6789000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0820180517fd5a25ba2e97094ad7d83dc28a6572da797d6b3e7fc6663bd93efb789fc17e48982526101a0822091526040517f190100000000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006002820152602281019190915260429020868114610494576040517f593fcacd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f818385611291565b6104a98284610573565b507f1626ba7e00000000000000000000000000000000000000000000000000000000925050505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610546576040517ff87d0d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080556040517fbcb8b8fbdea8aa6dc4ae41213e4da81e605a3d1a56ed851b9355182321c091909190a1565b80517f0000000000000000000000000000000000000000000000000000000000000000907f00000000000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff808416911614610677578073ffffffffffffffffffffffffffffffffffffffff16835f015173ffffffffffffffffffffffffffffffffffffffff1614610675576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c69642073656c6c20746f6b656e000000000000000000000000000060448201526064015b60405180910390fd5b905b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190611bff565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091505f9073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015610772573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107969190611bff565b90508273ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff1614610831576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f696e76616c69642062757920746f6b656e000000000000000000000000000000604482015260640161066c565b604085015173ffffffffffffffffffffffffffffffffffffffff16156108b3576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7265636569766572206d757374206265207a65726f2061646472657373000000604482015260640161066c565b6108bf61012c42611c43565b8560a0015163ffffffff161115610932576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f76616c696469747920746f6f2066617220696e20746865206675747572650000604482015260640161066c565b85606001518560c00151146109a3576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c696420617070446174610000000000000000000000000000000000604482015260640161066c565b60e085015115610a0f576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f66656520616d6f756e74206d757374206265207a65726f000000000000000000604482015260640161066c565b7f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc985610160015114610a9d576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f627579546f6b656e42616c616e6365206d757374206265206572633230000000604482015260640161066c565b7f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc985610140015114610b2b576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f73656c6c546f6b656e42616c616e6365206d7573742062652065726332300000604482015260640161066c565b6060850151610b3a9082611c56565b60808601516060870151610b4e9085611c6d565b610b589190611c56565b1015610bc0576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f726563656976656420616d6f756e7420746f6f206c6f77000000000000000000604482015260640161066c565b505050505050565b5f81604051602001610bda9190611ccc565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610c66576040517ff87d0d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610c7361029783611d27565b9050805f81905550807f510e4a4f76907c2d6158b343f7c4f2f597df385b727c26e9ef90e75093ace19a83604051610cab9190611d79565b60405180910390a25050565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608101919091525f80836020015173ffffffffffffffffffffffffffffffffffffffff1663355efdd97f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000087604001516040518463ffffffff1660e01b8152600401610d9e93929190611e3a565b6040805180830381865afa158015610db8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddc9190611e72565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291935091505f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610e6d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e919190611bff565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610f19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f3d9190611bff565b90925090505f80808080610f518888611c56565b90505f610f5e8a88611c56565b90505f8282101561100b577f000000000000000000000000000000000000000000000000000000000000000096507f00000000000000000000000000000000000000000000000000000000000000009550610fd6610fbd60028b611ec1565b610fd184610fcc8e6002611c56565b611346565b61137e565b945061100185610fe6818d611c56565b610ff09085611c43565b610ffa8c8f611c56565b60016113cb565b9350849050611098565b7f000000000000000000000000000000000000000000000000000000000000000096507f0000000000000000000000000000000000000000000000000000000000000000955061106e61105f60028a611ec1565b610fd185610fcc8f6002611c56565b94506110928561107e818e611c56565b6110889086611c43565b610ffa8b8e611c56565b93508390505b8c518110156110df576110df6040518060400160405280601781526020017f74726164656420616d6f756e7420746f6f20736d616c6c000000000000000000815250611426565b6040518061018001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200161115661012c611466565b63ffffffff1681526020018e6060015181526020015f81526020017ff3b277728b3fee749481eb3e0b3b48980dbbab78658fc419025cb16eee34677581526020016001151581526020017f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc981526020017f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc98152509b505050505050505050505050919050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461126b576040517fbf84897700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b807f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b5935d50565b7f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b5935c8381146113405780156112f2576040517fdafbdd1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6112fc84610cb7565b90506113088382611487565b61133e576040517fd9ff24c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b50505050565b5f82156113735781611359600185611c6d565b6113639190611ec1565b61136e906001611c43565b611375565b5f5b90505b92915050565b5f818310156113c5576113c56040518060400160405280601581526020017f7375627472616374696f6e20756e646572666c6f770000000000000000000000815250611426565b50900390565b5f806113d8868686611599565b905060018360028111156113ee576113ee611ed4565b14801561140a57505f848061140557611405611e94565b868809115b1561141d5761141a600182611c43565b90505b95945050505050565b611431436001611c43565b816040517f1fe8506e00000000000000000000000000000000000000000000000000000000815260040161066c929190611f01565b5f81806114738142611f19565b61147d9190611f3b565b6113789190611f63565b5f80825f015173ffffffffffffffffffffffffffffffffffffffff16845f015173ffffffffffffffffffffffffffffffffffffffff161490505f836020015173ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff161490505f846060015186606001511490505f856080015187608001511490505f8660a0015163ffffffff168860a0015163ffffffff161490505f8761010001518961010001511490505f88610120015115158a6101200151151514905086801561155e5750855b80156115675750845b80156115705750835b80156115795750825b80156115825750815b801561158b5750805b9a9950505050505050505050565b5f80807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709858702925082811083820303915050805f036115ef578382816115e5576115e5611e94565b04925050506104d0565b808411611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f770000000000000000000000604482015260640161066c565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f805f604084860312156116d1575f80fd5b83359250602084013567ffffffffffffffff808211156116ef575f80fd5b818601915086601f830112611702575f80fd5b813581811115611710575f80fd5b876020828501011115611721575f80fd5b6020830194508093505050509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff8111828210171561178457611784611734565b60405290565b604051610180810167ffffffffffffffff8111828210171561178457611784611734565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156117f5576117f5611734565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461181e575f80fd5b50565b5f60808284031215611831575f80fd5b611839611761565b90508135815260208083013561184e816117fd565b82820152604083013567ffffffffffffffff8082111561186c575f80fd5b818501915085601f83011261187f575f80fd5b81358181111561189157611891611734565b6118c1847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016117ae565b915080825286848285010111156118d6575f80fd5b80848401858401375f848284010152508060408501525050506060820135606082015292915050565b803561190a816117fd565b919050565b803563ffffffff8116811461190a575f80fd5b8035801515811461190a575f80fd5b5f6101808284031215611942575f80fd5b61194a61178a565b9050611955826118ff565b8152611963602083016118ff565b6020820152611974604083016118ff565b6040820152606082013560608201526080820135608082015261199960a0830161190f565b60a082015260c082013560c082015260e082013560e08201526101008083013581830152506101206119cc818401611922565b9082015261014082810135908201526101609182013591810191909152919050565b5f806101a08385031215611a00575f80fd5b823567ffffffffffffffff811115611a16575f80fd5b611a2285828601611821565b925050611a328460208501611931565b90509250929050565b5f60208284031215611a4b575f80fd5b813567ffffffffffffffff811115611a61575f80fd5b611a6d84828501611821565b949350505050565b5f60208284031215611a85575f80fd5b813567ffffffffffffffff811115611a9b575f80fd5b8201608081850312156104d0575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff16815261018081016020830151611af2602084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040830151611b1a604084018273ffffffffffffffffffffffffffffffffffffffff169052565b50606083015160608301526080830151608083015260a0830151611b4660a084018263ffffffff169052565b5060c083015160c083015260e083015160e083015261010080840151818401525061012080840151611b7b8285018215159052565b5050610140838101519083015261016092830151929091019190915290565b5f60208284031215611baa575f80fd5b5035919050565b5f806101a08385031215611bc3575f80fd5b611bcd8484611931565b915061018083013567ffffffffffffffff811115611be9575f80fd5b611bf585828601611821565b9150509250929050565b5f60208284031215611c0f575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561137857611378611c16565b808202811582820484141761137857611378611c16565b8181038181111561137857611378611c16565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081528151602082015273ffffffffffffffffffffffffffffffffffffffff60208301511660408201525f604083015160806060840152611d1160a0840182611c80565b9050606084015160808401528091505092915050565b5f6113783683611821565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60208152813560208201525f6020830135611d93816117fd565b73ffffffffffffffffffffffffffffffffffffffff811660408401525060408301357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611de4575f80fd5b830160208101903567ffffffffffffffff811115611e00575f80fd5b803603821315611e0e575f80fd5b60806060850152611e2360a085018284611d32565b915050606084013560808401528091505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff80861683528085166020840152506060604083015261141d6060830184611c80565b5f8060408385031215611e83575f80fd5b505080516020909101519092909150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82611ecf57611ecf611e94565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b828152604060208201525f611a6d6040830184611c80565b5f63ffffffff80841680611f2f57611f2f611e94565b92169190910492915050565b63ffffffff818116838216028082169190828114611f5b57611f5b611c16565b505092915050565b63ffffffff818116838216019080821115611f8057611f80611c16565b509291505056fea2646970667358221220e3fb228b525d90b942c7e58fe2e2034a17bd258c082fd47740e764a7be45bac664736f6c63430008190033 - /// ``` - #[rustfmt::skip] - #[allow(clippy::all)] - pub static DEPLOYED_BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"`\x80`@R4\x80\x15a\0\x0FW_\x80\xFD[P`\x046\x10a\x01/W_5`\xE0\x1C\x80c\xB0\x9A\xAA\xCA\x11a\0\xADW\x80c\xE3\xE6\xF5\xB2\x11a\0}W\x80c\xEE\xC5\x0B\x97\x11a\0cW\x80c\xEE\xC5\x0B\x97\x14a\x03DW\x80c\xF1O\xCB\xC8\x14a\x03LW\x80c\xFF-\xBC\x98\x14a\x02\x03W_\x80\xFD[\x80c\xE3\xE6\xF5\xB2\x14a\x02\xFDW\x80c\xE5\x16q[\x14a\x03\x1DW_\x80\xFD[\x80c\xB0\x9A\xAA\xCA\x14a\x02\x89W\x80c\xC5\xF3\xD2T\x14a\x02\x9CW\x80c\xD2\x12 \xA7\x14a\x02\xAFW\x80c\xD2^\x0C\xB6\x14a\x02\xD6W_\x80\xFD[\x80c\x1C}\xE9A\x11a\x01\x02W\x80cH\x1Cju\x11a\0\xE8W\x80cH\x1Cju\x14a\x021W\x80c\x98\x1A\x16\x0B\x14a\x02XW\x80c\xA0)\xA8\xD4\x14a\x02vW_\x80\xFD[\x80c\x1C}\xE9A\x14a\x02\x03W\x80c>pn2\x14a\x02\nW_\x80\xFD[\x80c\r\xFE\x16\x81\x14a\x013W\x80c\x13\x03\xA4\x84\x14a\x01\x84W\x80c\x16&\xBA~\x14a\x01\xB5W\x80c\x17p\x0F\x01\x14a\x01\xF9W[_\x80\xFD[a\x01Z\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[`@Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[\x7Fl<\x90$TW\x06\x0Fe\x17x{,K\x8C\xF5\0\xCA\x88\x9D#\x04\xAF\x02\x04;\xD5\xB5\x13\xE3\xB5\x93\\[`@Q\x90\x81R` \x01a\x01{V[a\x01\xC8a\x01\xC36`\x04a\x16\xBFV[a\x03_V[`@Q\x7F\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x91\x16\x81R` \x01a\x01{V[a\x02\x01a\x04\xD7V[\0[a\x01\xA7_\x81V[a\x01\xA7\x7Fl<\x90$TW\x06\x0Fe\x17x{,K\x8C\xF5\0\xCA\x88\x9D#\x04\xAF\x02\x04;\xD5\xB5\x13\xE3\xB5\x93\x81V[a\x01Z\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[a\x02aa\x01,\x81V[`@Qc\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\x01{V[a\x02\x01a\x02\x846`\x04a\x19\xEEV[a\x05sV[a\x01\xA7a\x02\x976`\x04a\x1A;V[a\x0B\xC8V[a\x02\x01a\x02\xAA6`\x04a\x1AuV[a\x0B\xF7V[a\x01Z\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[a\x01\xA7\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[a\x03\x10a\x03\x0B6`\x04a\x1A;V[a\x0C\xB7V[`@Qa\x01{\x91\x90a\x1A\xACV[a\x01Z\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[a\x01\xA7_T\x81V[a\x02\x01a\x03Z6`\x04a\x1B\x9AV[a\x11\xFCV[_\x80\x80a\x03n\x84\x86\x01\x86a\x1B\xB1V[\x91P\x91P_Ta\x03}\x82a\x0B\xC8V[\x14a\x03\xB4W`@Q\x7F\xF1\xA6x\x90\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x82\x01\x80Q\x7F\xD5\xA2[\xA2\xE9p\x94\xAD}\x83\xDC(\xA6W-\xA7\x97\xD6\xB3\xE7\xFCfc\xBD\x93\xEF\xB7\x89\xFC\x17\xE4\x89\x82Ra\x01\xA0\x82 \x91R`@Q\x7F\x19\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\x02\x82\x01R`\"\x81\x01\x91\x90\x91R`B\x90 \x86\x81\x14a\x04\x94W`@Q\x7FY?\xCA\xCD\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x04\x9F\x81\x83\x85a\x12\x91V[a\x04\xA9\x82\x84a\x05sV[P\x7F\x16&\xBA~\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x92PPP[\x93\x92PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163\x14a\x05FW`@Q\x7F\xF8}\r\x16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_\x80\x80U`@Q\x7F\xBC\xB8\xB8\xFB\xDE\xA8\xAAm\xC4\xAEA!>M\xA8\x1E`Z=\x1AV\xED\x85\x1B\x93U\x18#!\xC0\x91\x90\x91\x90\xA1V[\x80Q\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x84\x16\x91\x16\x14a\x06wW\x80s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x83_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x06uW`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x12`$\x82\x01R\x7Finvalid sell token\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[\x90[`@Q\x7Fp\xA0\x821\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R0`\x04\x82\x01R_\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x84\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x06\xE1W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\x05\x91\x90a\x1B\xFFV[`@Q\x7Fp\xA0\x821\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R0`\x04\x82\x01R\x90\x91P_\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x84\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07rW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\x96\x91\x90a\x1B\xFFV[\x90P\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x85` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x081W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x11`$\x82\x01R\x7Finvalid buy token\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06lV[`@\x85\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x15a\x08\xB3W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7Freceiver must be zero address\0\0\0`D\x82\x01R`d\x01a\x06lV[a\x08\xBFa\x01,Ba\x1CCV[\x85`\xA0\x01Qc\xFF\xFF\xFF\xFF\x16\x11\x15a\t2W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x1E`$\x82\x01R\x7Fvalidity too far in the future\0\0`D\x82\x01R`d\x01a\x06lV[\x85``\x01Q\x85`\xC0\x01Q\x14a\t\xA3W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0F`$\x82\x01R\x7Finvalid appData\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06lV[`\xE0\x85\x01Q\x15a\n\x0FW`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7Ffee amount must be zero\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06lV[\x7FZ(\xE96;\xB9B\xB69'\0b\xAAk\xB2\x95\xF44\xBC\xDF\xC4,\x97&{\xF0\x03\xF2r\x06\r\xC9\x85a\x01`\x01Q\x14a\n\x9DW`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FbuyTokenBalance must be erc20\0\0\0`D\x82\x01R`d\x01a\x06lV[\x7FZ(\xE96;\xB9B\xB69'\0b\xAAk\xB2\x95\xF44\xBC\xDF\xC4,\x97&{\xF0\x03\xF2r\x06\r\xC9\x85a\x01@\x01Q\x14a\x0B+W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x1E`$\x82\x01R\x7FsellTokenBalance must be erc20\0\0`D\x82\x01R`d\x01a\x06lV[``\x85\x01Qa\x0B:\x90\x82a\x1CVV[`\x80\x86\x01Q``\x87\x01Qa\x0BN\x90\x85a\x1CmV[a\x0BX\x91\x90a\x1CVV[\x10\x15a\x0B\xC0W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7Freceived amount too low\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06lV[PPPPPPV[_\x81`@Q` \x01a\x0B\xDA\x91\x90a\x1C\xCCV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163\x14a\x0CfW`@Q\x7F\xF8}\r\x16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_a\x0Csa\x02\x97\x83a\x1D'V[\x90P\x80_\x81\x90UP\x80\x7FQ\x0EJOv\x90|-aX\xB3C\xF7\xC4\xF2\xF5\x97\xDF8[r|&\xE9\xEF\x90\xE7P\x93\xAC\xE1\x9A\x83`@Qa\x0C\xAB\x91\x90a\x1DyV[`@Q\x80\x91\x03\x90\xA2PPV[`@\x80Qa\x01\x80\x81\x01\x82R_\x80\x82R` \x82\x01\x81\x90R\x91\x81\x01\x82\x90R``\x81\x01\x82\x90R`\x80\x81\x01\x82\x90R`\xA0\x81\x01\x82\x90R`\xC0\x81\x01\x82\x90R`\xE0\x81\x01\x82\x90Ra\x01\0\x81\x01\x82\x90Ra\x01 \x81\x01\x82\x90Ra\x01@\x81\x01\x82\x90Ra\x01`\x81\x01\x91\x90\x91R_\x80\x83` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c5^\xFD\xD9\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x87`@\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\r\x9E\x93\x92\x91\x90a\x1E:V[`@\x80Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\r\xB8W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\r\xDC\x91\x90a\x1ErV[`@Q\x7Fp\xA0\x821\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R0`\x04\x82\x01R\x91\x93P\x91P_\x90\x81\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0EmW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0E\x91\x91\x90a\x1B\xFFV[`@Q\x7Fp\xA0\x821\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R0`\x04\x82\x01R\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0F\x19W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0F=\x91\x90a\x1B\xFFV[\x90\x92P\x90P_\x80\x80\x80\x80a\x0FQ\x88\x88a\x1CVV[\x90P_a\x0F^\x8A\x88a\x1CVV[\x90P_\x82\x82\x10\x15a\x10\x0BW\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x96P\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x95Pa\x0F\xD6a\x0F\xBD`\x02\x8Ba\x1E\xC1V[a\x0F\xD1\x84a\x0F\xCC\x8E`\x02a\x1CVV[a\x13FV[a\x13~V[\x94Pa\x10\x01\x85a\x0F\xE6\x81\x8Da\x1CVV[a\x0F\xF0\x90\x85a\x1CCV[a\x0F\xFA\x8C\x8Fa\x1CVV[`\x01a\x13\xCBV[\x93P\x84\x90Pa\x10\x98V[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x96P\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x95Pa\x10na\x10_`\x02\x8Aa\x1E\xC1V[a\x0F\xD1\x85a\x0F\xCC\x8F`\x02a\x1CVV[\x94Pa\x10\x92\x85a\x10~\x81\x8Ea\x1CVV[a\x10\x88\x90\x86a\x1CCV[a\x0F\xFA\x8B\x8Ea\x1CVV[\x93P\x83\x90P[\x8CQ\x81\x10\x15a\x10\xDFWa\x10\xDF`@Q\x80`@\x01`@R\x80`\x17\x81R` \x01\x7Ftraded amount too small\0\0\0\0\0\0\0\0\0\x81RPa\x14&V[`@Q\x80a\x01\x80\x01`@R\x80\x88s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x87s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x86\x81R` \x01\x85\x81R` \x01a\x11Va\x01,a\x14fV[c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x8E``\x01Q\x81R` \x01_\x81R` \x01\x7F\xF3\xB2wr\x8B?\xEEt\x94\x81\xEB>\x0B;H\x98\r\xBB\xABxe\x8F\xC4\x19\x02\\\xB1n\xEE4gu\x81R` \x01`\x01\x15\x15\x81R` \x01\x7FZ(\xE96;\xB9B\xB69'\0b\xAAk\xB2\x95\xF44\xBC\xDF\xC4,\x97&{\xF0\x03\xF2r\x06\r\xC9\x81R` \x01\x7FZ(\xE96;\xB9B\xB69'\0b\xAAk\xB2\x95\xF44\xBC\xDF\xC4,\x97&{\xF0\x03\xF2r\x06\r\xC9\x81RP\x9BPPPPPPPPPPPP\x91\x90PV[3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x12kW`@Q\x7F\xBF\x84\x89w\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80\x7Fl<\x90$TW\x06\x0Fe\x17x{,K\x8C\xF5\0\xCA\x88\x9D#\x04\xAF\x02\x04;\xD5\xB5\x13\xE3\xB5\x93]PV[\x7Fl<\x90$TW\x06\x0Fe\x17x{,K\x8C\xF5\0\xCA\x88\x9D#\x04\xAF\x02\x04;\xD5\xB5\x13\xE3\xB5\x93\\\x83\x81\x14a\x13@W\x80\x15a\x12\xF2W`@Q\x7F\xDA\xFB\xDD\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_a\x12\xFC\x84a\x0C\xB7V[\x90Pa\x13\x08\x83\x82a\x14\x87V[a\x13>W`@Q\x7F\xD9\xFF$\xC7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P[PPPPV[_\x82\x15a\x13sW\x81a\x13Y`\x01\x85a\x1CmV[a\x13c\x91\x90a\x1E\xC1V[a\x13n\x90`\x01a\x1CCV[a\x13uV[_[\x90P[\x92\x91PPV[_\x81\x83\x10\x15a\x13\xC5Wa\x13\xC5`@Q\x80`@\x01`@R\x80`\x15\x81R` \x01\x7Fsubtraction underflow\0\0\0\0\0\0\0\0\0\0\0\x81RPa\x14&V[P\x90\x03\x90V[_\x80a\x13\xD8\x86\x86\x86a\x15\x99V[\x90P`\x01\x83`\x02\x81\x11\x15a\x13\xEEWa\x13\xEEa\x1E\xD4V[\x14\x80\x15a\x14\nWP_\x84\x80a\x14\x05Wa\x14\x05a\x1E\x94V[\x86\x88\t\x11[\x15a\x14\x1DWa\x14\x1A`\x01\x82a\x1CCV[\x90P[\x95\x94PPPPPV[a\x141C`\x01a\x1CCV[\x81`@Q\x7F\x1F\xE8Pn\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x06l\x92\x91\x90a\x1F\x01V[_\x81\x80a\x14s\x81Ba\x1F\x19V[a\x14}\x91\x90a\x1F;V[a\x13x\x91\x90a\x1FcV[_\x80\x82_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x90P_\x83` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x85` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x90P_\x84``\x01Q\x86``\x01Q\x14\x90P_\x85`\x80\x01Q\x87`\x80\x01Q\x14\x90P_\x86`\xA0\x01Qc\xFF\xFF\xFF\xFF\x16\x88`\xA0\x01Qc\xFF\xFF\xFF\xFF\x16\x14\x90P_\x87a\x01\0\x01Q\x89a\x01\0\x01Q\x14\x90P_\x88a\x01 \x01Q\x15\x15\x8Aa\x01 \x01Q\x15\x15\x14\x90P\x86\x80\x15a\x15^WP\x85[\x80\x15a\x15gWP\x84[\x80\x15a\x15pWP\x83[\x80\x15a\x15yWP\x82[\x80\x15a\x15\x82WP\x81[\x80\x15a\x15\x8BWP\x80[\x9A\x99PPPPPPPPPPV[_\x80\x80\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x85\x87\t\x85\x87\x02\x92P\x82\x81\x10\x83\x82\x03\x03\x91PP\x80_\x03a\x15\xEFW\x83\x82\x81a\x15\xE5Wa\x15\xE5a\x1E\x94V[\x04\x92PPPa\x04\xD0V[\x80\x84\x11a\x16XW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x15`$\x82\x01R\x7FMath: mulDiv overflow\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06lV[_\x84\x86\x88\t`\x02`\x01\x87\x19\x81\x01\x88\x16\x97\x88\x90\x04`\x03\x81\x02\x83\x18\x80\x82\x02\x84\x03\x02\x80\x82\x02\x84\x03\x02\x80\x82\x02\x84\x03\x02\x80\x82\x02\x84\x03\x02\x80\x82\x02\x84\x03\x02\x90\x81\x02\x90\x92\x03\x90\x91\x02_\x88\x90\x03\x88\x90\x04\x90\x91\x01\x85\x83\x11\x90\x94\x03\x93\x90\x93\x02\x93\x03\x94\x90\x94\x04\x91\x90\x91\x17\x02\x94\x93PPPPV[_\x80_`@\x84\x86\x03\x12\x15a\x16\xD1W_\x80\xFD[\x835\x92P` \x84\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x16\xEFW_\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12a\x17\x02W_\x80\xFD[\x815\x81\x81\x11\x15a\x17\x10W_\x80\xFD[\x87` \x82\x85\x01\x01\x11\x15a\x17!W_\x80\xFD[` \x83\x01\x94P\x80\x93PPPP\x92P\x92P\x92V[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[`@Q`\x80\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x17\x84Wa\x17\x84a\x174V[`@R\x90V[`@Qa\x01\x80\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x17\x84Wa\x17\x84a\x174V[`@Q`\x1F\x82\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x17\xF5Wa\x17\xF5a\x174V[`@R\x91\x90PV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x18\x1EW_\x80\xFD[PV[_`\x80\x82\x84\x03\x12\x15a\x181W_\x80\xFD[a\x189a\x17aV[\x90P\x815\x81R` \x80\x83\x015a\x18N\x81a\x17\xFDV[\x82\x82\x01R`@\x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x18lW_\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x18\x7FW_\x80\xFD[\x815\x81\x81\x11\x15a\x18\x91Wa\x18\x91a\x174V[a\x18\xC1\x84\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x84\x01\x16\x01a\x17\xAEV[\x91P\x80\x82R\x86\x84\x82\x85\x01\x01\x11\x15a\x18\xD6W_\x80\xFD[\x80\x84\x84\x01\x85\x84\x017_\x84\x82\x84\x01\x01RP\x80`@\x85\x01RPPP``\x82\x015``\x82\x01R\x92\x91PPV[\x805a\x19\n\x81a\x17\xFDV[\x91\x90PV[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x19\nW_\x80\xFD[\x805\x80\x15\x15\x81\x14a\x19\nW_\x80\xFD[_a\x01\x80\x82\x84\x03\x12\x15a\x19BW_\x80\xFD[a\x19Ja\x17\x8AV[\x90Pa\x19U\x82a\x18\xFFV[\x81Ra\x19c` \x83\x01a\x18\xFFV[` \x82\x01Ra\x19t`@\x83\x01a\x18\xFFV[`@\x82\x01R``\x82\x015``\x82\x01R`\x80\x82\x015`\x80\x82\x01Ra\x19\x99`\xA0\x83\x01a\x19\x0FV[`\xA0\x82\x01R`\xC0\x82\x015`\xC0\x82\x01R`\xE0\x82\x015`\xE0\x82\x01Ra\x01\0\x80\x83\x015\x81\x83\x01RPa\x01 a\x19\xCC\x81\x84\x01a\x19\"V[\x90\x82\x01Ra\x01@\x82\x81\x015\x90\x82\x01Ra\x01`\x91\x82\x015\x91\x81\x01\x91\x90\x91R\x91\x90PV[_\x80a\x01\xA0\x83\x85\x03\x12\x15a\x1A\0W_\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1A\x16W_\x80\xFD[a\x1A\"\x85\x82\x86\x01a\x18!V[\x92PPa\x1A2\x84` \x85\x01a\x191V[\x90P\x92P\x92\x90PV[_` \x82\x84\x03\x12\x15a\x1AKW_\x80\xFD[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1AaW_\x80\xFD[a\x1Am\x84\x82\x85\x01a\x18!V[\x94\x93PPPPV[_` \x82\x84\x03\x12\x15a\x1A\x85W_\x80\xFD[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1A\x9BW_\x80\xFD[\x82\x01`\x80\x81\x85\x03\x12\x15a\x04\xD0W_\x80\xFD[\x81Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81Ra\x01\x80\x81\x01` \x83\x01Qa\x1A\xF2` \x84\x01\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90RV[P`@\x83\x01Qa\x1B\x1A`@\x84\x01\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90RV[P``\x83\x01Q``\x83\x01R`\x80\x83\x01Q`\x80\x83\x01R`\xA0\x83\x01Qa\x1BF`\xA0\x84\x01\x82c\xFF\xFF\xFF\xFF\x16\x90RV[P`\xC0\x83\x01Q`\xC0\x83\x01R`\xE0\x83\x01Q`\xE0\x83\x01Ra\x01\0\x80\x84\x01Q\x81\x84\x01RPa\x01 \x80\x84\x01Qa\x1B{\x82\x85\x01\x82\x15\x15\x90RV[PPa\x01@\x83\x81\x01Q\x90\x83\x01Ra\x01`\x92\x83\x01Q\x92\x90\x91\x01\x91\x90\x91R\x90V[_` \x82\x84\x03\x12\x15a\x1B\xAAW_\x80\xFD[P5\x91\x90PV[_\x80a\x01\xA0\x83\x85\x03\x12\x15a\x1B\xC3W_\x80\xFD[a\x1B\xCD\x84\x84a\x191V[\x91Pa\x01\x80\x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1B\xE9W_\x80\xFD[a\x1B\xF5\x85\x82\x86\x01a\x18!V[\x91PP\x92P\x92\x90PV[_` \x82\x84\x03\x12\x15a\x1C\x0FW_\x80\xFD[PQ\x91\x90PV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x11`\x04R`$_\xFD[\x80\x82\x01\x80\x82\x11\x15a\x13xWa\x13xa\x1C\x16V[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x13xWa\x13xa\x1C\x16V[\x81\x81\x03\x81\x81\x11\x15a\x13xWa\x13xa\x1C\x16V[_\x81Q\x80\x84R\x80` \x84\x01` \x86\x01^_` \x82\x86\x01\x01R` \x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x83\x01\x16\x85\x01\x01\x91PP\x92\x91PPV[` \x81R\x81Q` \x82\x01Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF` \x83\x01Q\x16`@\x82\x01R_`@\x83\x01Q`\x80``\x84\x01Ra\x1D\x11`\xA0\x84\x01\x82a\x1C\x80V[\x90P``\x84\x01Q`\x80\x84\x01R\x80\x91PP\x92\x91PPV[_a\x13x6\x83a\x18!V[\x81\x83R\x81\x81` \x85\x017P_` \x82\x84\x01\x01R_` \x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x84\x01\x16\x84\x01\x01\x90P\x92\x91PPV[` \x81R\x815` \x82\x01R_` \x83\x015a\x1D\x93\x81a\x17\xFDV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16`@\x84\x01RP`@\x83\x015\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE1\x846\x03\x01\x81\x12a\x1D\xE4W_\x80\xFD[\x83\x01` \x81\x01\x905g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1E\0W_\x80\xFD[\x806\x03\x82\x13\x15a\x1E\x0EW_\x80\xFD[`\x80``\x85\x01Ra\x1E#`\xA0\x85\x01\x82\x84a\x1D2V[\x91PP``\x84\x015`\x80\x84\x01R\x80\x91PP\x92\x91PPV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x86\x16\x83R\x80\x85\x16` \x84\x01RP```@\x83\x01Ra\x14\x1D``\x83\x01\x84a\x1C\x80V[_\x80`@\x83\x85\x03\x12\x15a\x1E\x83W_\x80\xFD[PP\x80Q` \x90\x91\x01Q\x90\x92\x90\x91PV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x12`\x04R`$_\xFD[_\x82a\x1E\xCFWa\x1E\xCFa\x1E\x94V[P\x04\x90V[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`!`\x04R`$_\xFD[\x82\x81R`@` \x82\x01R_a\x1Am`@\x83\x01\x84a\x1C\x80V[_c\xFF\xFF\xFF\xFF\x80\x84\x16\x80a\x1F/Wa\x1F/a\x1E\x94V[\x92\x16\x91\x90\x91\x04\x92\x91PPV[c\xFF\xFF\xFF\xFF\x81\x81\x16\x83\x82\x16\x02\x80\x82\x16\x91\x90\x82\x81\x14a\x1F[Wa\x1F[a\x1C\x16V[PP\x92\x91PPV[c\xFF\xFF\xFF\xFF\x81\x81\x16\x83\x82\x16\x01\x90\x80\x82\x11\x15a\x1F\x80Wa\x1F\x80a\x1C\x16V[P\x92\x91PPV\xFE\xA2dipfsX\"\x12 \xE3\xFB\"\x8BR]\x90\xB9B\xC7\xE5\x8F\xE2\xE2\x03J\x17\xBD%\x8C\x08/\xD4w@\xE7d\xA7\xBEE\xBA\xC6dsolcC\0\x08\x19\x003", - ); - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `CommitOutsideOfSettlement()` and selector `0xbf848977`. - ```solidity - error CommitOutsideOfSettlement(); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct CommitOutsideOfSettlement; - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: CommitOutsideOfSettlement) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for CommitOutsideOfSettlement { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for CommitOutsideOfSettlement { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [191u8, 132u8, 137u8, 119u8]; - const SIGNATURE: &'static str = "CommitOutsideOfSettlement()"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(Self::new) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `OnlyManagerCanCall()` and selector `0xf87d0d16`. - ```solidity - error OnlyManagerCanCall(); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct OnlyManagerCanCall; - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: OnlyManagerCanCall) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for OnlyManagerCanCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for OnlyManagerCanCall { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [248u8, 125u8, 13u8, 22u8]; - const SIGNATURE: &'static str = "OnlyManagerCanCall()"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(Self::new) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `OrderDoesNotMatchCommitmentHash()` and selector `0xdafbdd1f`. - ```solidity - error OrderDoesNotMatchCommitmentHash(); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct OrderDoesNotMatchCommitmentHash; - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: OrderDoesNotMatchCommitmentHash) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for OrderDoesNotMatchCommitmentHash { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for OrderDoesNotMatchCommitmentHash { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [218u8, 251u8, 221u8, 31u8]; - const SIGNATURE: &'static str = "OrderDoesNotMatchCommitmentHash()"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(Self::new) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `OrderDoesNotMatchDefaultTradeableOrder()` and selector `0xd9ff24c7`. - ```solidity - error OrderDoesNotMatchDefaultTradeableOrder(); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct OrderDoesNotMatchDefaultTradeableOrder; - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: OrderDoesNotMatchDefaultTradeableOrder) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for OrderDoesNotMatchDefaultTradeableOrder { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for OrderDoesNotMatchDefaultTradeableOrder { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [217u8, 255u8, 36u8, 199u8]; - const SIGNATURE: &'static str = "OrderDoesNotMatchDefaultTradeableOrder()"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(Self::new) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `OrderDoesNotMatchMessageHash()` and selector `0x593fcacd`. - ```solidity - error OrderDoesNotMatchMessageHash(); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct OrderDoesNotMatchMessageHash; - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: OrderDoesNotMatchMessageHash) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for OrderDoesNotMatchMessageHash { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for OrderDoesNotMatchMessageHash { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [89u8, 63u8, 202u8, 205u8]; - const SIGNATURE: &'static str = "OrderDoesNotMatchMessageHash()"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(Self::new) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `OrderNotValid(string)` and selector `0xc8fc2725`. - ```solidity - error OrderNotValid(string); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct OrderNotValid(pub alloy_sol_types::private::String); - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (alloy_sol_types::sol_data::String,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy_sol_types::private::String,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: OrderNotValid) -> Self { - (value.0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for OrderNotValid { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self(tuple.0) - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for OrderNotValid { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [200u8, 252u8, 39u8, 37u8]; - const SIGNATURE: &'static str = "OrderNotValid(string)"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.0, - ), - ) - } - - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(Self::new) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `PollTryAtBlock(uint256,string)` and selector `0x1fe8506e`. - ```solidity - error PollTryAtBlock(uint256 blockNumber, string message); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct PollTryAtBlock { - #[allow(missing_docs)] - pub blockNumber: alloy_sol_types::private::primitives::aliases::U256, - #[allow(missing_docs)] - pub message: alloy_sol_types::private::String, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = ( - alloy_sol_types::sol_data::Uint<256>, - alloy_sol_types::sol_data::String, - ); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy_sol_types::private::primitives::aliases::U256, - alloy_sol_types::private::String, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: PollTryAtBlock) -> Self { - (value.blockNumber, value.message) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for PollTryAtBlock { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - blockNumber: tuple.0, - message: tuple.1, - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for PollTryAtBlock { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [31u8, 232u8, 80u8, 110u8]; - const SIGNATURE: &'static str = "PollTryAtBlock(uint256,string)"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - as alloy_sol_types::SolType>::tokenize( - &self.blockNumber, - ), - ::tokenize( - &self.message, - ), - ) - } - - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(Self::new) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `TradingParamsDoNotMatchHash()` and selector `0xf1a67890`. - ```solidity - error TradingParamsDoNotMatchHash(); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct TradingParamsDoNotMatchHash; - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: TradingParamsDoNotMatchHash) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for TradingParamsDoNotMatchHash { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for TradingParamsDoNotMatchHash { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [241u8, 166u8, 120u8, 144u8]; - const SIGNATURE: &'static str = "TradingParamsDoNotMatchHash()"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(Self::new) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Event with signature `TradingDisabled()` and selector `0xbcb8b8fbdea8aa6dc4ae41213e4da81e605a3d1a56ed851b9355182321c09190`. - ```solidity - event TradingDisabled(); - ```*/ - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - #[derive(Clone)] - pub struct TradingDisabled; - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[automatically_derived] - impl alloy_sol_types::SolEvent for TradingDisabled { - type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type DataTuple<'a> = (); - type TopicList = (alloy_sol_types::sol_data::FixedBytes<32>,); - - const ANONYMOUS: bool = false; - const SIGNATURE: &'static str = "TradingDisabled()"; - const SIGNATURE_HASH: alloy_sol_types::private::B256 = - alloy_sol_types::private::B256::new([ - 188u8, 184u8, 184u8, 251u8, 222u8, 168u8, 170u8, 109u8, 196u8, 174u8, 65u8, - 33u8, 62u8, 77u8, 168u8, 30u8, 96u8, 90u8, 61u8, 26u8, 86u8, 237u8, 133u8, - 27u8, 147u8, 85u8, 24u8, 35u8, 33u8, 192u8, 145u8, 144u8, - ]); - - #[allow(unused_variables)] - #[inline] - fn new( - topics: ::RustType, - data: as alloy_sol_types::SolType>::RustType, - ) -> Self { - Self {} - } - - #[inline] - fn check_signature( - topics: &::RustType, - ) -> alloy_sol_types::Result<()> { - if topics.0 != Self::SIGNATURE_HASH { - return Err(alloy_sol_types::Error::invalid_event_signature_hash( - Self::SIGNATURE, - topics.0, - Self::SIGNATURE_HASH, - )); - } - Ok(()) - } - - #[inline] - fn tokenize_body(&self) -> Self::DataToken<'_> { - () - } - - #[inline] - fn topics(&self) -> ::RustType { - (Self::SIGNATURE_HASH.into(),) - } - - #[inline] - fn encode_topics_raw( - &self, - out: &mut [alloy_sol_types::abi::token::WordToken], - ) -> alloy_sol_types::Result<()> { - if out.len() < ::COUNT { - return Err(alloy_sol_types::Error::Overrun); - } - out[0usize] = alloy_sol_types::abi::token::WordToken(Self::SIGNATURE_HASH); - Ok(()) - } - } - #[automatically_derived] - impl alloy_sol_types::private::IntoLogData for TradingDisabled { - fn to_log_data(&self) -> alloy_sol_types::private::LogData { - From::from(self) - } - - fn into_log_data(self) -> alloy_sol_types::private::LogData { - From::from(&self) - } - } - #[automatically_derived] - impl From<&TradingDisabled> for alloy_sol_types::private::LogData { - #[inline] - fn from(this: &TradingDisabled) -> alloy_sol_types::private::LogData { - alloy_sol_types::SolEvent::encode_log_data(this) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Event with signature `TradingEnabled(bytes32,(uint256,address,bytes,bytes32))` and selector `0x510e4a4f76907c2d6158b343f7c4f2f597df385b727c26e9ef90e75093ace19a`. - ```solidity - event TradingEnabled(bytes32 indexed hash, ConstantProduct.TradingParams params); - ```*/ - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - #[derive(Clone)] - pub struct TradingEnabled { - #[allow(missing_docs)] - pub hash: alloy_sol_types::private::FixedBytes<32>, - #[allow(missing_docs)] - pub params: ::RustType, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[automatically_derived] - impl alloy_sol_types::SolEvent for TradingEnabled { - type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type DataTuple<'a> = (ConstantProduct::TradingParams,); - type TopicList = ( - alloy_sol_types::sol_data::FixedBytes<32>, - alloy_sol_types::sol_data::FixedBytes<32>, - ); - - const ANONYMOUS: bool = false; - const SIGNATURE: &'static str = - "TradingEnabled(bytes32,(uint256,address,bytes,bytes32))"; - const SIGNATURE_HASH: alloy_sol_types::private::B256 = - alloy_sol_types::private::B256::new([ - 81u8, 14u8, 74u8, 79u8, 118u8, 144u8, 124u8, 45u8, 97u8, 88u8, 179u8, 67u8, - 247u8, 196u8, 242u8, 245u8, 151u8, 223u8, 56u8, 91u8, 114u8, 124u8, 38u8, - 233u8, 239u8, 144u8, 231u8, 80u8, 147u8, 172u8, 225u8, 154u8, - ]); - - #[allow(unused_variables)] - #[inline] - fn new( - topics: ::RustType, - data: as alloy_sol_types::SolType>::RustType, - ) -> Self { - Self { - hash: topics.1, - params: data.0, - } - } - - #[inline] - fn check_signature( - topics: &::RustType, - ) -> alloy_sol_types::Result<()> { - if topics.0 != Self::SIGNATURE_HASH { - return Err(alloy_sol_types::Error::invalid_event_signature_hash( - Self::SIGNATURE, - topics.0, - Self::SIGNATURE_HASH, - )); - } - Ok(()) - } - - #[inline] - fn tokenize_body(&self) -> Self::DataToken<'_> { - ( - ::tokenize( - &self.params, - ), - ) - } - - #[inline] - fn topics(&self) -> ::RustType { - (Self::SIGNATURE_HASH.into(), self.hash.clone()) - } - - #[inline] - fn encode_topics_raw( - &self, - out: &mut [alloy_sol_types::abi::token::WordToken], - ) -> alloy_sol_types::Result<()> { - if out.len() < ::COUNT { - return Err(alloy_sol_types::Error::Overrun); - } - out[0usize] = alloy_sol_types::abi::token::WordToken(Self::SIGNATURE_HASH); - out[1usize] = as alloy_sol_types::EventTopic>::encode_topic(&self.hash); - Ok(()) - } - } - #[automatically_derived] - impl alloy_sol_types::private::IntoLogData for TradingEnabled { - fn to_log_data(&self) -> alloy_sol_types::private::LogData { - From::from(self) - } - - fn into_log_data(self) -> alloy_sol_types::private::LogData { - From::from(&self) - } - } - #[automatically_derived] - impl From<&TradingEnabled> for alloy_sol_types::private::LogData { - #[inline] - fn from(this: &TradingEnabled) -> alloy_sol_types::private::LogData { - alloy_sol_types::SolEvent::encode_log_data(this) - } - } - }; - /**Constructor`. - ```solidity - constructor(address _solutionSettler, address _token0, address _token1); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct constructorCall { - #[allow(missing_docs)] - pub _solutionSettler: alloy_sol_types::private::Address, - #[allow(missing_docs)] - pub _token0: alloy_sol_types::private::Address, - #[allow(missing_docs)] - pub _token1: alloy_sol_types::private::Address, - } - const _: () = { - use alloy_sol_types; - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = ( - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Address, - ); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy_sol_types::private::Address, - alloy_sol_types::private::Address, - alloy_sol_types::private::Address, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: constructorCall) -> Self { - (value._solutionSettler, value._token0, value._token1) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for constructorCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - _solutionSettler: tuple.0, - _token0: tuple.1, - _token1: tuple.2, - } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolConstructor for constructorCall { - type Parameters<'a> = ( - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Address, - ); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self._solutionSettler, - ), - ::tokenize( - &self._token0, - ), - ::tokenize( - &self._token1, - ), - ) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `commit(bytes32)` and selector `0xf14fcbc8`. - ```solidity - function commit(bytes32 orderHash) external; - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct commitCall { - #[allow(missing_docs)] - pub orderHash: alloy_sol_types::private::FixedBytes<32>, - } - ///Container type for the return parameters of the - /// [`commit(bytes32)`](commitCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct commitReturn {} - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (alloy_sol_types::sol_data::FixedBytes<32>,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy_sol_types::private::FixedBytes<32>,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: commitCall) -> Self { - (value.orderHash,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for commitCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { orderHash: tuple.0 } - } - } - } - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: commitReturn) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for commitReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self {} - } - } - } - impl commitReturn { - fn _tokenize(&self) -> ::ReturnToken<'_> { - () - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for commitCall { - type Parameters<'a> = (alloy_sol_types::sol_data::FixedBytes<32>,); - type Return = commitReturn; - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type ReturnTuple<'a> = (); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [241u8, 79u8, 203u8, 200u8]; - const SIGNATURE: &'static str = "commit(bytes32)"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - as alloy_sol_types::SolType>::tokenize(&self.orderHash), - ) - } - - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - commitReturn::_tokenize(ret) - } - - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data) - .map(Into::into) - } - - #[inline] - fn abi_decode_returns_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(Into::into) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `hash((uint256,address,bytes,bytes32))` and selector `0xb09aaaca`. - ```solidity - function hash(ConstantProduct.TradingParams memory tradingParams) external pure returns (bytes32); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct hashCall { - #[allow(missing_docs)] - pub tradingParams: ::RustType, - } - #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the - /// [`hash((uint256,address,bytes,bytes32))`](hashCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct hashReturn { - #[allow(missing_docs)] - pub _0: alloy_sol_types::private::FixedBytes<32>, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (ConstantProduct::TradingParams,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = - (::RustType,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: hashCall) -> Self { - (value.tradingParams,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for hashCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - tradingParams: tuple.0, - } - } - } - } - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (alloy_sol_types::sol_data::FixedBytes<32>,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy_sol_types::private::FixedBytes<32>,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: hashReturn) -> Self { - (value._0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for hashReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for hashCall { - type Parameters<'a> = (ConstantProduct::TradingParams,); - type Return = alloy_sol_types::private::FixedBytes<32>; - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type ReturnTuple<'a> = (alloy_sol_types::sol_data::FixedBytes<32>,); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [176u8, 154u8, 170u8, 202u8]; - const SIGNATURE: &'static str = "hash((uint256,address,bytes,bytes32))"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.tradingParams, - ), - ) - } - - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - ( - as alloy_sol_types::SolType>::tokenize(ret), - ) - } - - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data).map( - |r| { - let r: hashReturn = r.into(); - r._0 - }, - ) - } - - #[inline] - fn abi_decode_returns_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(|r| { - let r: hashReturn = r.into(); - r._0 - }) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `isValidSignature(bytes32,bytes)` and selector `0x1626ba7e`. - ```solidity - function isValidSignature(bytes32 _hash, bytes memory signature) external view returns (bytes4); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct isValidSignatureCall { - #[allow(missing_docs)] - pub _hash: alloy_sol_types::private::FixedBytes<32>, - #[allow(missing_docs)] - pub signature: alloy_sol_types::private::Bytes, - } - #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the - /// [`isValidSignature(bytes32,bytes)`](isValidSignatureCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct isValidSignatureReturn { - #[allow(missing_docs)] - pub _0: alloy_sol_types::private::FixedBytes<4>, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = ( - alloy_sol_types::sol_data::FixedBytes<32>, - alloy_sol_types::sol_data::Bytes, - ); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy_sol_types::private::FixedBytes<32>, - alloy_sol_types::private::Bytes, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: isValidSignatureCall) -> Self { - (value._hash, value.signature) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for isValidSignatureCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - _hash: tuple.0, - signature: tuple.1, - } - } - } - } - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (alloy_sol_types::sol_data::FixedBytes<4>,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy_sol_types::private::FixedBytes<4>,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: isValidSignatureReturn) -> Self { - (value._0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for isValidSignatureReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for isValidSignatureCall { - type Parameters<'a> = ( - alloy_sol_types::sol_data::FixedBytes<32>, - alloy_sol_types::sol_data::Bytes, - ); - type Return = alloy_sol_types::private::FixedBytes<4>; - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type ReturnTuple<'a> = (alloy_sol_types::sol_data::FixedBytes<4>,); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [22u8, 38u8, 186u8, 126u8]; - const SIGNATURE: &'static str = "isValidSignature(bytes32,bytes)"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - as alloy_sol_types::SolType>::tokenize(&self._hash), - ::tokenize( - &self.signature, - ), - ) - } - - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - ( - as alloy_sol_types::SolType>::tokenize(ret), - ) - } - - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data).map( - |r| { - let r: isValidSignatureReturn = r.into(); - r._0 - }, - ) - } - - #[inline] - fn abi_decode_returns_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(|r| { - let r: isValidSignatureReturn = r.into(); - r._0 - }) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `manager()` and selector `0x481c6a75`. - ```solidity - function manager() external view returns (address); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct managerCall; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the - /// [`manager()`](managerCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct managerReturn { - #[allow(missing_docs)] - pub _0: alloy_sol_types::private::Address, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: managerCall) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for managerCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - } - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (alloy_sol_types::sol_data::Address,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy_sol_types::private::Address,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: managerReturn) -> Self { - (value._0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for managerReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for managerCall { - type Parameters<'a> = (); - type Return = alloy_sol_types::private::Address; - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type ReturnTuple<'a> = (alloy_sol_types::sol_data::Address,); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [72u8, 28u8, 106u8, 117u8]; - const SIGNATURE: &'static str = "manager()"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - (::tokenize(ret),) - } - - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data).map( - |r| { - let r: managerReturn = r.into(); - r._0 - }, - ) - } - - #[inline] - fn abi_decode_returns_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(|r| { - let r: managerReturn = r.into(); - r._0 - }) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `token0()` and selector `0x0dfe1681`. - ```solidity - function token0() external view returns (address); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct token0Call; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`token0()`](token0Call) - /// function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct token0Return { - #[allow(missing_docs)] - pub _0: alloy_sol_types::private::Address, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: token0Call) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for token0Call { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - } - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (alloy_sol_types::sol_data::Address,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy_sol_types::private::Address,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: token0Return) -> Self { - (value._0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for token0Return { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for token0Call { - type Parameters<'a> = (); - type Return = alloy_sol_types::private::Address; - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type ReturnTuple<'a> = (alloy_sol_types::sol_data::Address,); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [13u8, 254u8, 22u8, 129u8]; - const SIGNATURE: &'static str = "token0()"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - (::tokenize(ret),) - } - - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data).map( - |r| { - let r: token0Return = r.into(); - r._0 - }, - ) - } - - #[inline] - fn abi_decode_returns_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(|r| { - let r: token0Return = r.into(); - r._0 - }) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `token1()` and selector `0xd21220a7`. - ```solidity - function token1() external view returns (address); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct token1Call; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the [`token1()`](token1Call) - /// function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct token1Return { - #[allow(missing_docs)] - pub _0: alloy_sol_types::private::Address, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: token1Call) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for token1Call { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - } - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (alloy_sol_types::sol_data::Address,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy_sol_types::private::Address,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: token1Return) -> Self { - (value._0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for token1Return { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for token1Call { - type Parameters<'a> = (); - type Return = alloy_sol_types::private::Address; - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type ReturnTuple<'a> = (alloy_sol_types::sol_data::Address,); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [210u8, 18u8, 32u8, 167u8]; - const SIGNATURE: &'static str = "token1()"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - (::tokenize(ret),) - } - - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data).map( - |r| { - let r: token1Return = r.into(); - r._0 - }, - ) - } - - #[inline] - fn abi_decode_returns_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(|r| { - let r: token1Return = r.into(); - r._0 - }) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `verify((uint256,address,bytes,bytes32),(address,address,address,uint256,uint256,uint32,bytes32,uint256,bytes32,bool,bytes32,bytes32))` and selector `0xa029a8d4`. - ```solidity - function verify(ConstantProduct.TradingParams memory tradingParams, GPv2Order.Data memory order) external view; - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct verifyCall { - #[allow(missing_docs)] - pub tradingParams: ::RustType, - #[allow(missing_docs)] - pub order: ::RustType, - } - ///Container type for the return parameters of the - /// [`verify((uint256,address,bytes,bytes32),(address,address,address, - /// uint256,uint256,uint32,bytes32,uint256,bytes32,bool,bytes32, - /// bytes32))`](verifyCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct verifyReturn {} - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (ConstantProduct::TradingParams, GPv2Order::Data); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - ::RustType, - ::RustType, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: verifyCall) -> Self { - (value.tradingParams, value.order) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for verifyCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - tradingParams: tuple.0, - order: tuple.1, - } - } - } - } - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: verifyReturn) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for verifyReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self {} - } - } - } - impl verifyReturn { - fn _tokenize(&self) -> ::ReturnToken<'_> { - () - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for verifyCall { - type Parameters<'a> = (ConstantProduct::TradingParams, GPv2Order::Data); - type Return = verifyReturn; - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type ReturnTuple<'a> = (); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [160u8, 41u8, 168u8, 212u8]; - const SIGNATURE: &'static str = "verify((uint256,address,bytes,bytes32),(address,\ - address,address,uint256,uint256,uint32,bytes32,\ - uint256,bytes32,bool,bytes32,bytes32))"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.tradingParams, - ), - ::tokenize(&self.order), - ) - } - - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - verifyReturn::_tokenize(ret) - } - - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data) - .map(Into::into) - } - - #[inline] - fn abi_decode_returns_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(Into::into) - } - } - }; - ///Container for all the [`CowAmm`](self) function calls. - #[derive(Clone)] - pub enum CowAmmCalls { - #[allow(missing_docs)] - commit(commitCall), - #[allow(missing_docs)] - hash(hashCall), - #[allow(missing_docs)] - isValidSignature(isValidSignatureCall), - #[allow(missing_docs)] - manager(managerCall), - #[allow(missing_docs)] - token0(token0Call), - #[allow(missing_docs)] - token1(token1Call), - #[allow(missing_docs)] - verify(verifyCall), - } - impl CowAmmCalls { - /// All the selectors of this enum. - /// - /// Note that the selectors might not be in the same order as the - /// variants. No guarantees are made about the order of the - /// selectors. - /// - /// Prefer using `SolInterface` methods instead. - pub const SELECTORS: &'static [[u8; 4usize]] = &[ - [13u8, 254u8, 22u8, 129u8], - [22u8, 38u8, 186u8, 126u8], - [72u8, 28u8, 106u8, 117u8], - [160u8, 41u8, 168u8, 212u8], - [176u8, 154u8, 170u8, 202u8], - [210u8, 18u8, 32u8, 167u8], - [241u8, 79u8, 203u8, 200u8], - ]; - /// The signatures in the same order as `SELECTORS`. - pub const SIGNATURES: &'static [&'static str] = &[ - ::SIGNATURE, - ::SIGNATURE, - ::SIGNATURE, - ::SIGNATURE, - ::SIGNATURE, - ::SIGNATURE, - ::SIGNATURE, - ]; - /// The names of the variants in the same order as `SELECTORS`. - pub const VARIANT_NAMES: &'static [&'static str] = &[ - ::core::stringify!(token0), - ::core::stringify!(isValidSignature), - ::core::stringify!(manager), - ::core::stringify!(verify), - ::core::stringify!(hash), - ::core::stringify!(token1), - ::core::stringify!(commit), - ]; - - /// Returns the signature for the given selector, if known. - #[inline] - pub fn signature_by_selector( - selector: [u8; 4usize], - ) -> ::core::option::Option<&'static str> { - match Self::SELECTORS.binary_search(&selector) { - ::core::result::Result::Ok(idx) => { - ::core::option::Option::Some(Self::SIGNATURES[idx]) - } - ::core::result::Result::Err(_) => ::core::option::Option::None, - } - } - - /// Returns the enum variant name for the given selector, if known. - #[inline] - pub fn name_by_selector(selector: [u8; 4usize]) -> ::core::option::Option<&'static str> { - let sig = Self::signature_by_selector(selector)?; - sig.split_once('(').map(|(name, _)| name) - } - } - #[automatically_derived] - impl alloy_sol_types::SolInterface for CowAmmCalls { - const COUNT: usize = 7usize; - const MIN_DATA_LENGTH: usize = 0usize; - const NAME: &'static str = "CowAmmCalls"; - - #[inline] - fn selector(&self) -> [u8; 4] { - match self { - Self::commit(_) => ::SELECTOR, - Self::hash(_) => ::SELECTOR, - Self::isValidSignature(_) => { - ::SELECTOR - } - Self::manager(_) => ::SELECTOR, - Self::token0(_) => ::SELECTOR, - Self::token1(_) => ::SELECTOR, - Self::verify(_) => ::SELECTOR, - } - } - - #[inline] - fn selector_at(i: usize) -> ::core::option::Option<[u8; 4]> { - Self::SELECTORS.get(i).copied() - } - - #[inline] - fn valid_selector(selector: [u8; 4]) -> bool { - Self::SELECTORS.binary_search(&selector).is_ok() - } - - #[inline] - #[allow(non_snake_case)] - fn abi_decode_raw(selector: [u8; 4], data: &[u8]) -> alloy_sol_types::Result { - static DECODE_SHIMS: &[fn(&[u8]) -> alloy_sol_types::Result] = &[ - { - fn token0(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw(data) - .map(CowAmmCalls::token0) - } - token0 - }, - { - fn isValidSignature(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw(data) - .map(CowAmmCalls::isValidSignature) - } - isValidSignature - }, - { - fn manager(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw(data) - .map(CowAmmCalls::manager) - } - manager - }, - { - fn verify(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw(data) - .map(CowAmmCalls::verify) - } - verify - }, - { - fn hash(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw(data) - .map(CowAmmCalls::hash) - } - hash - }, - { - fn token1(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw(data) - .map(CowAmmCalls::token1) - } - token1 - }, - { - fn commit(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw(data) - .map(CowAmmCalls::commit) - } - commit - }, - ]; - let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { - return Err(alloy_sol_types::Error::unknown_selector( - ::NAME, - selector, - )); - }; - DECODE_SHIMS[idx](data) - } - - #[inline] - #[allow(non_snake_case)] - fn abi_decode_raw_validate( - selector: [u8; 4], - data: &[u8], - ) -> alloy_sol_types::Result { - static DECODE_VALIDATE_SHIMS: &[fn(&[u8]) -> alloy_sol_types::Result] = &[ - { - fn token0(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw_validate(data) - .map(CowAmmCalls::token0) - } - token0 - }, - { - fn isValidSignature(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(CowAmmCalls::isValidSignature) - } - isValidSignature - }, - { - fn manager(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw_validate(data) - .map(CowAmmCalls::manager) - } - manager - }, - { - fn verify(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw_validate(data) - .map(CowAmmCalls::verify) - } - verify - }, - { - fn hash(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw_validate(data) - .map(CowAmmCalls::hash) - } - hash - }, - { - fn token1(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw_validate(data) - .map(CowAmmCalls::token1) - } - token1 - }, - { - fn commit(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw_validate(data) - .map(CowAmmCalls::commit) - } - commit - }, - ]; - let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { - return Err(alloy_sol_types::Error::unknown_selector( - ::NAME, - selector, - )); - }; - DECODE_VALIDATE_SHIMS[idx](data) - } - - #[inline] - fn abi_encoded_size(&self) -> usize { - match self { - Self::commit(inner) => { - ::abi_encoded_size(inner) - } - Self::hash(inner) => { - ::abi_encoded_size(inner) - } - Self::isValidSignature(inner) => { - ::abi_encoded_size(inner) - } - Self::manager(inner) => { - ::abi_encoded_size(inner) - } - Self::token0(inner) => { - ::abi_encoded_size(inner) - } - Self::token1(inner) => { - ::abi_encoded_size(inner) - } - Self::verify(inner) => { - ::abi_encoded_size(inner) - } - } - } - - #[inline] - fn abi_encode_raw(&self, out: &mut alloy_sol_types::private::Vec) { - match self { - Self::commit(inner) => { - ::abi_encode_raw(inner, out) - } - Self::hash(inner) => { - ::abi_encode_raw(inner, out) - } - Self::isValidSignature(inner) => { - ::abi_encode_raw(inner, out) - } - Self::manager(inner) => { - ::abi_encode_raw(inner, out) - } - Self::token0(inner) => { - ::abi_encode_raw(inner, out) - } - Self::token1(inner) => { - ::abi_encode_raw(inner, out) - } - Self::verify(inner) => { - ::abi_encode_raw(inner, out) - } - } - } - } - ///Container for all the [`CowAmm`](self) custom errors. - #[derive(Clone, Debug, PartialEq, Eq, Hash)] - pub enum CowAmmErrors { - #[allow(missing_docs)] - CommitOutsideOfSettlement(CommitOutsideOfSettlement), - #[allow(missing_docs)] - OnlyManagerCanCall(OnlyManagerCanCall), - #[allow(missing_docs)] - OrderDoesNotMatchCommitmentHash(OrderDoesNotMatchCommitmentHash), - #[allow(missing_docs)] - OrderDoesNotMatchDefaultTradeableOrder(OrderDoesNotMatchDefaultTradeableOrder), - #[allow(missing_docs)] - OrderDoesNotMatchMessageHash(OrderDoesNotMatchMessageHash), - #[allow(missing_docs)] - OrderNotValid(OrderNotValid), - #[allow(missing_docs)] - PollTryAtBlock(PollTryAtBlock), - #[allow(missing_docs)] - TradingParamsDoNotMatchHash(TradingParamsDoNotMatchHash), - } - impl CowAmmErrors { - /// All the selectors of this enum. - /// - /// Note that the selectors might not be in the same order as the - /// variants. No guarantees are made about the order of the - /// selectors. - /// - /// Prefer using `SolInterface` methods instead. - pub const SELECTORS: &'static [[u8; 4usize]] = &[ - [31u8, 232u8, 80u8, 110u8], - [89u8, 63u8, 202u8, 205u8], - [191u8, 132u8, 137u8, 119u8], - [200u8, 252u8, 39u8, 37u8], - [217u8, 255u8, 36u8, 199u8], - [218u8, 251u8, 221u8, 31u8], - [241u8, 166u8, 120u8, 144u8], - [248u8, 125u8, 13u8, 22u8], - ]; - /// The signatures in the same order as `SELECTORS`. - pub const SIGNATURES: &'static [&'static str] = &[ - ::SIGNATURE, - ::SIGNATURE, - ::SIGNATURE, - ::SIGNATURE, - ::SIGNATURE, - ::SIGNATURE, - ::SIGNATURE, - ::SIGNATURE, - ]; - /// The names of the variants in the same order as `SELECTORS`. - pub const VARIANT_NAMES: &'static [&'static str] = &[ - ::core::stringify!(PollTryAtBlock), - ::core::stringify!(OrderDoesNotMatchMessageHash), - ::core::stringify!(CommitOutsideOfSettlement), - ::core::stringify!(OrderNotValid), - ::core::stringify!(OrderDoesNotMatchDefaultTradeableOrder), - ::core::stringify!(OrderDoesNotMatchCommitmentHash), - ::core::stringify!(TradingParamsDoNotMatchHash), - ::core::stringify!(OnlyManagerCanCall), - ]; - - /// Returns the signature for the given selector, if known. - #[inline] - pub fn signature_by_selector( - selector: [u8; 4usize], - ) -> ::core::option::Option<&'static str> { - match Self::SELECTORS.binary_search(&selector) { - ::core::result::Result::Ok(idx) => { - ::core::option::Option::Some(Self::SIGNATURES[idx]) - } - ::core::result::Result::Err(_) => ::core::option::Option::None, - } - } - - /// Returns the enum variant name for the given selector, if known. - #[inline] - pub fn name_by_selector(selector: [u8; 4usize]) -> ::core::option::Option<&'static str> { - let sig = Self::signature_by_selector(selector)?; - sig.split_once('(').map(|(name, _)| name) - } - } - #[automatically_derived] - impl alloy_sol_types::SolInterface for CowAmmErrors { - const COUNT: usize = 8usize; - const MIN_DATA_LENGTH: usize = 0usize; - const NAME: &'static str = "CowAmmErrors"; - - #[inline] - fn selector(&self) -> [u8; 4] { - match self { - Self::CommitOutsideOfSettlement(_) => { - ::SELECTOR - } - Self::OnlyManagerCanCall(_) => { - ::SELECTOR - } - Self::OrderDoesNotMatchCommitmentHash(_) => { - ::SELECTOR - } - Self::OrderDoesNotMatchDefaultTradeableOrder(_) => { - ::SELECTOR - } - Self::OrderDoesNotMatchMessageHash(_) => { - ::SELECTOR - } - Self::OrderNotValid(_) => ::SELECTOR, - Self::PollTryAtBlock(_) => ::SELECTOR, - Self::TradingParamsDoNotMatchHash(_) => { - ::SELECTOR - } - } - } - - #[inline] - fn selector_at(i: usize) -> ::core::option::Option<[u8; 4]> { - Self::SELECTORS.get(i).copied() - } - - #[inline] - fn valid_selector(selector: [u8; 4]) -> bool { - Self::SELECTORS.binary_search(&selector).is_ok() - } - - #[inline] - #[allow(non_snake_case)] - fn abi_decode_raw(selector: [u8; 4], data: &[u8]) -> alloy_sol_types::Result { - static DECODE_SHIMS: &[fn(&[u8]) -> alloy_sol_types::Result] = &[ - { - fn PollTryAtBlock(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw(data) - .map(CowAmmErrors::PollTryAtBlock) - } - PollTryAtBlock - }, - { - fn OrderDoesNotMatchMessageHash( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(CowAmmErrors::OrderDoesNotMatchMessageHash) - } - OrderDoesNotMatchMessageHash - }, - { - fn CommitOutsideOfSettlement( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(CowAmmErrors::CommitOutsideOfSettlement) - } - CommitOutsideOfSettlement - }, - { - fn OrderNotValid(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw(data) - .map(CowAmmErrors::OrderNotValid) - } - OrderNotValid - }, - { - fn OrderDoesNotMatchDefaultTradeableOrder( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(CowAmmErrors::OrderDoesNotMatchDefaultTradeableOrder) - } - OrderDoesNotMatchDefaultTradeableOrder - }, - { - fn OrderDoesNotMatchCommitmentHash( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(CowAmmErrors::OrderDoesNotMatchCommitmentHash) - } - OrderDoesNotMatchCommitmentHash - }, - { - fn TradingParamsDoNotMatchHash( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(CowAmmErrors::TradingParamsDoNotMatchHash) - } - TradingParamsDoNotMatchHash - }, - { - fn OnlyManagerCanCall(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw(data) - .map(CowAmmErrors::OnlyManagerCanCall) - } - OnlyManagerCanCall - }, - ]; - let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { - return Err(alloy_sol_types::Error::unknown_selector( - ::NAME, - selector, - )); - }; - DECODE_SHIMS[idx](data) - } - - #[inline] - #[allow(non_snake_case)] - fn abi_decode_raw_validate( - selector: [u8; 4], - data: &[u8], - ) -> alloy_sol_types::Result { - static DECODE_VALIDATE_SHIMS: &[fn(&[u8]) -> alloy_sol_types::Result] = &[ - { - fn PollTryAtBlock(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw_validate(data) - .map(CowAmmErrors::PollTryAtBlock) - } - PollTryAtBlock - }, - { - fn OrderDoesNotMatchMessageHash( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(CowAmmErrors::OrderDoesNotMatchMessageHash) - } - OrderDoesNotMatchMessageHash - }, - { - fn CommitOutsideOfSettlement( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(CowAmmErrors::CommitOutsideOfSettlement) - } - CommitOutsideOfSettlement - }, - { - fn OrderNotValid(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw_validate(data) - .map(CowAmmErrors::OrderNotValid) - } - OrderNotValid - }, - { - fn OrderDoesNotMatchDefaultTradeableOrder( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(CowAmmErrors::OrderDoesNotMatchDefaultTradeableOrder) - } - OrderDoesNotMatchDefaultTradeableOrder - }, - { - fn OrderDoesNotMatchCommitmentHash( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(CowAmmErrors::OrderDoesNotMatchCommitmentHash) - } - OrderDoesNotMatchCommitmentHash - }, - { - fn TradingParamsDoNotMatchHash( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(CowAmmErrors::TradingParamsDoNotMatchHash) - } - TradingParamsDoNotMatchHash - }, - { - fn OnlyManagerCanCall(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(CowAmmErrors::OnlyManagerCanCall) - } - OnlyManagerCanCall - }, - ]; - let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { - return Err(alloy_sol_types::Error::unknown_selector( - ::NAME, - selector, - )); - }; - DECODE_VALIDATE_SHIMS[idx](data) - } - - #[inline] - fn abi_encoded_size(&self) -> usize { - match self { - Self::CommitOutsideOfSettlement(inner) => { - ::abi_encoded_size( - inner, - ) - } - Self::OnlyManagerCanCall(inner) => { - ::abi_encoded_size( - inner, - ) - } - Self::OrderDoesNotMatchCommitmentHash(inner) => { - ::abi_encoded_size( - inner, - ) - } - Self::OrderDoesNotMatchDefaultTradeableOrder(inner) => { - ::abi_encoded_size( - inner, - ) - } - Self::OrderDoesNotMatchMessageHash(inner) => { - ::abi_encoded_size( - inner, - ) - } - Self::OrderNotValid(inner) => { - ::abi_encoded_size(inner) - } - Self::PollTryAtBlock(inner) => { - ::abi_encoded_size( - inner, - ) - } - Self::TradingParamsDoNotMatchHash(inner) => { - ::abi_encoded_size( - inner, - ) - } - } - } - - #[inline] - fn abi_encode_raw(&self, out: &mut alloy_sol_types::private::Vec) { - match self { - Self::CommitOutsideOfSettlement(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } - Self::OnlyManagerCanCall(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } - Self::OrderDoesNotMatchCommitmentHash(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } - Self::OrderDoesNotMatchDefaultTradeableOrder(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } - Self::OrderDoesNotMatchMessageHash(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } - Self::OrderNotValid(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } - Self::PollTryAtBlock(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } - Self::TradingParamsDoNotMatchHash(inner) => { - ::abi_encode_raw( - inner, - out, - ) - } - } - } - } - ///Container for all the [`CowAmm`](self) events. - #[derive(Clone, Debug, PartialEq, Eq, Hash)] - pub enum CowAmmEvents { - #[allow(missing_docs)] - TradingDisabled(TradingDisabled), - #[allow(missing_docs)] - TradingEnabled(TradingEnabled), - } - impl CowAmmEvents { - /// All the selectors of this enum. - /// - /// Note that the selectors might not be in the same order as the - /// variants. No guarantees are made about the order of the - /// selectors. - /// - /// Prefer using `SolInterface` methods instead. - pub const SELECTORS: &'static [[u8; 32usize]] = &[ - [ - 81u8, 14u8, 74u8, 79u8, 118u8, 144u8, 124u8, 45u8, 97u8, 88u8, 179u8, 67u8, 247u8, - 196u8, 242u8, 245u8, 151u8, 223u8, 56u8, 91u8, 114u8, 124u8, 38u8, 233u8, 239u8, - 144u8, 231u8, 80u8, 147u8, 172u8, 225u8, 154u8, - ], - [ - 188u8, 184u8, 184u8, 251u8, 222u8, 168u8, 170u8, 109u8, 196u8, 174u8, 65u8, 33u8, - 62u8, 77u8, 168u8, 30u8, 96u8, 90u8, 61u8, 26u8, 86u8, 237u8, 133u8, 27u8, 147u8, - 85u8, 24u8, 35u8, 33u8, 192u8, 145u8, 144u8, - ], - ]; - /// The signatures in the same order as `SELECTORS`. - pub const SIGNATURES: &'static [&'static str] = &[ - ::SIGNATURE, - ::SIGNATURE, - ]; - /// The names of the variants in the same order as `SELECTORS`. - pub const VARIANT_NAMES: &'static [&'static str] = &[ - ::core::stringify!(TradingEnabled), - ::core::stringify!(TradingDisabled), - ]; - - /// Returns the signature for the given selector, if known. - #[inline] - pub fn signature_by_selector( - selector: [u8; 32usize], - ) -> ::core::option::Option<&'static str> { - match Self::SELECTORS.binary_search(&selector) { - ::core::result::Result::Ok(idx) => { - ::core::option::Option::Some(Self::SIGNATURES[idx]) - } - ::core::result::Result::Err(_) => ::core::option::Option::None, - } - } - - /// Returns the enum variant name for the given selector, if known. - #[inline] - pub fn name_by_selector(selector: [u8; 32usize]) -> ::core::option::Option<&'static str> { - let sig = Self::signature_by_selector(selector)?; - sig.split_once('(').map(|(name, _)| name) - } - } - #[automatically_derived] - impl alloy_sol_types::SolEventInterface for CowAmmEvents { - const COUNT: usize = 2usize; - const NAME: &'static str = "CowAmmEvents"; - - fn decode_raw_log( - topics: &[alloy_sol_types::Word], - data: &[u8], - ) -> alloy_sol_types::Result { - match topics.first().copied() { - Some(::SIGNATURE_HASH) => { - ::decode_raw_log(topics, data) - .map(Self::TradingDisabled) - } - Some(::SIGNATURE_HASH) => { - ::decode_raw_log(topics, data) - .map(Self::TradingEnabled) - } - _ => alloy_sol_types::private::Err(alloy_sol_types::Error::InvalidLog { - name: ::NAME, - log: alloy_sol_types::private::Box::new( - alloy_sol_types::private::LogData::new_unchecked( - topics.to_vec(), - data.to_vec().into(), - ), - ), - }), - } - } - } - #[automatically_derived] - impl alloy_sol_types::private::IntoLogData for CowAmmEvents { - fn to_log_data(&self) -> alloy_sol_types::private::LogData { - match self { - Self::TradingDisabled(inner) => { - alloy_sol_types::private::IntoLogData::to_log_data(inner) - } - Self::TradingEnabled(inner) => { - alloy_sol_types::private::IntoLogData::to_log_data(inner) - } - } - } - - fn into_log_data(self) -> alloy_sol_types::private::LogData { - match self { - Self::TradingDisabled(inner) => { - alloy_sol_types::private::IntoLogData::into_log_data(inner) - } - Self::TradingEnabled(inner) => { - alloy_sol_types::private::IntoLogData::into_log_data(inner) - } - } - } - } - use alloy_contract; - /**Creates a new wrapper around an on-chain [`CowAmm`](self) contract instance. - - See the [wrapper's documentation](`CowAmmInstance`) for more details.*/ - #[inline] - pub const fn new< - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - >( - address: alloy_sol_types::private::Address, - __provider: P, - ) -> CowAmmInstance { - CowAmmInstance::::new(address, __provider) - } - /**Deploys this contract using the given `provider` and constructor arguments, if any. - - Returns a new instance of the contract, if the deployment was successful. - - For more fine-grained control over the deployment process, use [`deploy_builder`] instead.*/ - #[inline] - pub fn deploy, N: alloy_contract::private::Network>( - __provider: P, - _solutionSettler: alloy_sol_types::private::Address, - _token0: alloy_sol_types::private::Address, - _token1: alloy_sol_types::private::Address, - ) -> impl ::core::future::Future>> { - CowAmmInstance::::deploy(__provider, _solutionSettler, _token0, _token1) - } - /**Creates a `RawCallBuilder` for deploying this contract using the given `provider` - and constructor arguments, if any. - - This is a simple wrapper around creating a `RawCallBuilder` with the data set to - the bytecode concatenated with the constructor's ABI-encoded arguments.*/ - #[inline] - pub fn deploy_builder< - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - >( - __provider: P, - _solutionSettler: alloy_sol_types::private::Address, - _token0: alloy_sol_types::private::Address, - _token1: alloy_sol_types::private::Address, - ) -> alloy_contract::RawCallBuilder { - CowAmmInstance::::deploy_builder(__provider, _solutionSettler, _token0, _token1) - } - /**A [`CowAmm`](self) instance. - - Contains type-safe methods for interacting with an on-chain instance of the - [`CowAmm`](self) contract located at a given `address`, using a given - provider `P`. - - If the contract bytecode is available (see the [`sol!`](alloy_sol_types::sol!) - documentation on how to provide it), the `deploy` and `deploy_builder` methods can - be used to deploy a new instance of the contract. - - See the [module-level documentation](self) for all the available methods.*/ - #[derive(Clone)] - pub struct CowAmmInstance { - address: alloy_sol_types::private::Address, - provider: P, - _network: ::core::marker::PhantomData, - } - #[automatically_derived] - impl ::core::fmt::Debug for CowAmmInstance { - #[inline] - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple("CowAmmInstance") - .field(&self.address) - .finish() - } - } - /// Instantiation and getters/setters. - impl, N: alloy_contract::private::Network> - CowAmmInstance - { - /**Creates a new wrapper around an on-chain [`CowAmm`](self) contract instance. - - See the [wrapper's documentation](`CowAmmInstance`) for more details.*/ - #[inline] - pub const fn new(address: alloy_sol_types::private::Address, __provider: P) -> Self { - Self { - address, - provider: __provider, - _network: ::core::marker::PhantomData, - } - } - - /**Deploys this contract using the given `provider` and constructor arguments, if any. - - Returns a new instance of the contract, if the deployment was successful. - - For more fine-grained control over the deployment process, use [`deploy_builder`] instead.*/ - #[inline] - pub async fn deploy( - __provider: P, - _solutionSettler: alloy_sol_types::private::Address, - _token0: alloy_sol_types::private::Address, - _token1: alloy_sol_types::private::Address, - ) -> alloy_contract::Result> { - let call_builder = Self::deploy_builder(__provider, _solutionSettler, _token0, _token1); - let contract_address = call_builder.deploy().await?; - Ok(Self::new(contract_address, call_builder.provider)) - } - - /**Creates a `RawCallBuilder` for deploying this contract using the given `provider` - and constructor arguments, if any. - - This is a simple wrapper around creating a `RawCallBuilder` with the data set to - the bytecode concatenated with the constructor's ABI-encoded arguments.*/ - #[inline] - pub fn deploy_builder( - __provider: P, - _solutionSettler: alloy_sol_types::private::Address, - _token0: alloy_sol_types::private::Address, - _token1: alloy_sol_types::private::Address, - ) -> alloy_contract::RawCallBuilder { - alloy_contract::RawCallBuilder::new_raw_deploy( - __provider, - [ - &BYTECODE[..], - &alloy_sol_types::SolConstructor::abi_encode(&constructorCall { - _solutionSettler, - _token0, - _token1, - })[..], - ] - .concat() - .into(), - ) - } - - /// Returns a reference to the address. - #[inline] - pub const fn address(&self) -> &alloy_sol_types::private::Address { - &self.address - } - - /// Sets the address. - #[inline] - pub fn set_address(&mut self, address: alloy_sol_types::private::Address) { - self.address = address; - } - - /// Sets the address and returns `self`. - pub fn at(mut self, address: alloy_sol_types::private::Address) -> Self { - self.set_address(address); - self - } - - /// Returns a reference to the provider. - #[inline] - pub const fn provider(&self) -> &P { - &self.provider - } - } - impl CowAmmInstance<&P, N> { - /// Clones the provider and returns a new instance with the cloned - /// provider. - #[inline] - pub fn with_cloned_provider(self) -> CowAmmInstance { - CowAmmInstance { - address: self.address, - provider: ::core::clone::Clone::clone(&self.provider), - _network: ::core::marker::PhantomData, - } - } - } - /// Function calls. - impl, N: alloy_contract::private::Network> - CowAmmInstance - { - /// Creates a new call builder using this contract instance's provider - /// and address. - /// - /// Note that the call can be any function call, not just those defined - /// in this contract. Prefer using the other methods for - /// building type-safe contract calls. - pub fn call_builder( - &self, - call: &C, - ) -> alloy_contract::SolCallBuilder<&P, C, N> { - alloy_contract::SolCallBuilder::new_sol(&self.provider, &self.address, call) - } - - ///Creates a new call builder for the [`commit`] function. - pub fn commit( - &self, - orderHash: alloy_sol_types::private::FixedBytes<32>, - ) -> alloy_contract::SolCallBuilder<&P, commitCall, N> { - self.call_builder(&commitCall { orderHash }) - } - - ///Creates a new call builder for the [`hash`] function. - pub fn hash( - &self, - tradingParams: ::RustType, - ) -> alloy_contract::SolCallBuilder<&P, hashCall, N> { - self.call_builder(&hashCall { tradingParams }) - } - - ///Creates a new call builder for the [`isValidSignature`] function. - pub fn isValidSignature( - &self, - _hash: alloy_sol_types::private::FixedBytes<32>, - signature: alloy_sol_types::private::Bytes, - ) -> alloy_contract::SolCallBuilder<&P, isValidSignatureCall, N> { - self.call_builder(&isValidSignatureCall { _hash, signature }) - } - - ///Creates a new call builder for the [`manager`] function. - pub fn manager(&self) -> alloy_contract::SolCallBuilder<&P, managerCall, N> { - self.call_builder(&managerCall) - } - - ///Creates a new call builder for the [`token0`] function. - pub fn token0(&self) -> alloy_contract::SolCallBuilder<&P, token0Call, N> { - self.call_builder(&token0Call) - } - - ///Creates a new call builder for the [`token1`] function. - pub fn token1(&self) -> alloy_contract::SolCallBuilder<&P, token1Call, N> { - self.call_builder(&token1Call) - } - - ///Creates a new call builder for the [`verify`] function. - pub fn verify( - &self, - tradingParams: ::RustType, - order: ::RustType, - ) -> alloy_contract::SolCallBuilder<&P, verifyCall, N> { - self.call_builder(&verifyCall { - tradingParams, - order, - }) - } - } - /// Event filters. - impl, N: alloy_contract::private::Network> - CowAmmInstance - { - /// Creates a new event filter using this contract instance's provider - /// and address. - /// - /// Note that the type can be any event, not just those defined in this - /// contract. Prefer using the other methods for building - /// type-safe event filters. - pub fn event_filter( - &self, - ) -> alloy_contract::Event<&P, E, N> { - alloy_contract::Event::new_sol(&self.provider, &self.address) - } - - ///Creates a new event filter for the [`TradingDisabled`] event. - pub fn TradingDisabled_filter(&self) -> alloy_contract::Event<&P, TradingDisabled, N> { - self.event_filter::() - } - - ///Creates a new event filter for the [`TradingEnabled`] event. - pub fn TradingEnabled_filter(&self) -> alloy_contract::Event<&P, TradingEnabled, N> { - self.event_filter::() - } - } -} -pub type Instance = CowAmm::CowAmmInstance<::alloy_provider::DynProvider>; diff --git a/contracts/generated/contracts-generated/cowammconstantproductfactory/Cargo.toml b/contracts/generated/contracts-generated/cowammconstantproductfactory/Cargo.toml deleted file mode 100644 index f5e1521cc8..0000000000 --- a/contracts/generated/contracts-generated/cowammconstantproductfactory/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -# Auto-generated by contracts-generate. Do not edit. -[package] -name = "cow-contract-cowammconstantproductfactory" -version = "0.1.0" -edition = "2024" -publish = false - -[lib] -doctest = false - -[dependencies] -alloy-contract = { workspace = true } -alloy-primitives = { workspace = true } -alloy-provider = { workspace = true } -alloy-sol-types = { workspace = true } -anyhow = { workspace = true } - -[lints] -workspace = true diff --git a/contracts/generated/contracts-generated/cowammconstantproductfactory/src/lib.rs b/contracts/generated/contracts-generated/cowammconstantproductfactory/src/lib.rs deleted file mode 100644 index ea4a654388..0000000000 --- a/contracts/generated/contracts-generated/cowammconstantproductfactory/src/lib.rs +++ /dev/null @@ -1,3081 +0,0 @@ -#![allow( - unused_imports, - unused_attributes, - clippy::all, - rustdoc::all, - non_snake_case -)] -//! Auto-generated contract bindings. Do not edit. -///Module containing a contract's types and functions. -/** - -```solidity -library IConditionalOrder { - struct ConditionalOrderParams { address handler; bytes32 salt; bytes staticInput; } -} -```*/ -#[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style, - clippy::empty_structs_with_brackets -)] -pub mod IConditionalOrder { - use {super::*, alloy_sol_types}; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**```solidity - struct ConditionalOrderParams { address handler; bytes32 salt; bytes staticInput; } - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct ConditionalOrderParams { - #[allow(missing_docs)] - pub handler: alloy_sol_types::private::Address, - #[allow(missing_docs)] - pub salt: alloy_sol_types::private::FixedBytes<32>, - #[allow(missing_docs)] - pub staticInput: alloy_sol_types::private::Bytes, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = ( - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::FixedBytes<32>, - alloy_sol_types::sol_data::Bytes, - ); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy_sol_types::private::Address, - alloy_sol_types::private::FixedBytes<32>, - alloy_sol_types::private::Bytes, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: ConditionalOrderParams) -> Self { - (value.handler, value.salt, value.staticInput) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for ConditionalOrderParams { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - handler: tuple.0, - salt: tuple.1, - staticInput: tuple.2, - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolValue for ConditionalOrderParams { - type SolType = Self; - } - #[automatically_derived] - impl alloy_sol_types::private::SolTypeValue for ConditionalOrderParams { - #[inline] - fn stv_to_tokens(&self) -> ::Token<'_> { - ( - ::tokenize( - &self.handler, - ), - as alloy_sol_types::SolType>::tokenize(&self.salt), - ::tokenize( - &self.staticInput, - ), - ) - } - - #[inline] - fn stv_abi_encoded_size(&self) -> usize { - if let Some(size) = ::ENCODED_SIZE { - return size; - } - let tuple = - as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_encoded_size(&tuple) - } - - #[inline] - fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { - ::eip712_hash_struct(self) - } - - #[inline] - fn stv_abi_encode_packed_to(&self, out: &mut alloy_sol_types::private::Vec) { - let tuple = - as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_encode_packed_to( - &tuple, out, - ) - } - - #[inline] - fn stv_abi_packed_encoded_size(&self) -> usize { - if let Some(size) = ::PACKED_ENCODED_SIZE { - return size; - } - let tuple = - as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_packed_encoded_size( - &tuple, - ) - } - } - #[automatically_derived] - impl alloy_sol_types::SolType for ConditionalOrderParams { - type RustType = Self; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const ENCODED_SIZE: Option = - as alloy_sol_types::SolType>::ENCODED_SIZE; - const PACKED_ENCODED_SIZE: Option = - as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; - const SOL_NAME: &'static str = ::NAME; - - #[inline] - fn valid_token(token: &Self::Token<'_>) -> bool { - as alloy_sol_types::SolType>::valid_token(token) - } - - #[inline] - fn detokenize(token: Self::Token<'_>) -> Self::RustType { - let tuple = as alloy_sol_types::SolType>::detokenize(token); - >>::from(tuple) - } - } - #[automatically_derived] - impl alloy_sol_types::SolStruct for ConditionalOrderParams { - const NAME: &'static str = "ConditionalOrderParams"; - - #[inline] - fn eip712_root_type() -> alloy_sol_types::private::Cow<'static, str> { - alloy_sol_types::private::Cow::Borrowed( - "ConditionalOrderParams(address handler,bytes32 salt,bytes staticInput)", - ) - } - - #[inline] - fn eip712_components() - -> alloy_sol_types::private::Vec> - { - alloy_sol_types::private::Vec::new() - } - - #[inline] - fn eip712_encode_type() -> alloy_sol_types::private::Cow<'static, str> { - ::eip712_root_type() - } - - #[inline] - fn eip712_encode_data(&self) -> alloy_sol_types::private::Vec { - [ - ::eip712_data_word( - &self.handler, - ) - .0, - as alloy_sol_types::SolType>::eip712_data_word(&self.salt) - .0, - ::eip712_data_word( - &self.staticInput, - ) - .0, - ] - .concat() - } - } - #[automatically_derived] - impl alloy_sol_types::EventTopic for ConditionalOrderParams { - #[inline] - fn topic_preimage_length(rust: &Self::RustType) -> usize { - 0usize - + ::topic_preimage_length( - &rust.handler, - ) - + as alloy_sol_types::EventTopic>::topic_preimage_length(&rust.salt) - + ::topic_preimage_length( - &rust.staticInput, - ) - } - - #[inline] - fn encode_topic_preimage( - rust: &Self::RustType, - out: &mut alloy_sol_types::private::Vec, - ) { - out.reserve(::topic_preimage_length(rust)); - ::encode_topic_preimage( - &rust.handler, - out, - ); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.salt, - out, - ); - ::encode_topic_preimage( - &rust.staticInput, - out, - ); - } - - #[inline] - fn encode_topic(rust: &Self::RustType) -> alloy_sol_types::abi::token::WordToken { - let mut out = alloy_sol_types::private::Vec::new(); - ::encode_topic_preimage(rust, &mut out); - alloy_sol_types::abi::token::WordToken(alloy_sol_types::private::keccak256(out)) - } - } - }; - use alloy_contract; - /**Creates a new wrapper around an on-chain [`IConditionalOrder`](self) contract instance. - - See the [wrapper's documentation](`IConditionalOrderInstance`) for more details.*/ - #[inline] - pub const fn new< - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - >( - address: alloy_sol_types::private::Address, - __provider: P, - ) -> IConditionalOrderInstance { - IConditionalOrderInstance::::new(address, __provider) - } - /**A [`IConditionalOrder`](self) instance. - - Contains type-safe methods for interacting with an on-chain instance of the - [`IConditionalOrder`](self) contract located at a given `address`, using a given - provider `P`. - - If the contract bytecode is available (see the [`sol!`](alloy_sol_types::sol!) - documentation on how to provide it), the `deploy` and `deploy_builder` methods can - be used to deploy a new instance of the contract. - - See the [module-level documentation](self) for all the available methods.*/ - #[derive(Clone)] - pub struct IConditionalOrderInstance { - address: alloy_sol_types::private::Address, - provider: P, - _network: ::core::marker::PhantomData, - } - #[automatically_derived] - impl ::core::fmt::Debug for IConditionalOrderInstance { - #[inline] - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple("IConditionalOrderInstance") - .field(&self.address) - .finish() - } - } - /// Instantiation and getters/setters. - impl, N: alloy_contract::private::Network> - IConditionalOrderInstance - { - /**Creates a new wrapper around an on-chain [`IConditionalOrder`](self) contract instance. - - See the [wrapper's documentation](`IConditionalOrderInstance`) for more details.*/ - #[inline] - pub const fn new(address: alloy_sol_types::private::Address, __provider: P) -> Self { - Self { - address, - provider: __provider, - _network: ::core::marker::PhantomData, - } - } - - /// Returns a reference to the address. - #[inline] - pub const fn address(&self) -> &alloy_sol_types::private::Address { - &self.address - } - - /// Sets the address. - #[inline] - pub fn set_address(&mut self, address: alloy_sol_types::private::Address) { - self.address = address; - } - - /// Sets the address and returns `self`. - pub fn at(mut self, address: alloy_sol_types::private::Address) -> Self { - self.set_address(address); - self - } - - /// Returns a reference to the provider. - #[inline] - pub const fn provider(&self) -> &P { - &self.provider - } - } - impl IConditionalOrderInstance<&P, N> { - /// Clones the provider and returns a new instance with the cloned - /// provider. - #[inline] - pub fn with_cloned_provider(self) -> IConditionalOrderInstance { - IConditionalOrderInstance { - address: self.address, - provider: ::core::clone::Clone::clone(&self.provider), - _network: ::core::marker::PhantomData, - } - } - } - /// Function calls. - impl, N: alloy_contract::private::Network> - IConditionalOrderInstance - { - /// Creates a new call builder using this contract instance's provider - /// and address. - /// - /// Note that the call can be any function call, not just those defined - /// in this contract. Prefer using the other methods for - /// building type-safe contract calls. - pub fn call_builder( - &self, - call: &C, - ) -> alloy_contract::SolCallBuilder<&P, C, N> { - alloy_contract::SolCallBuilder::new_sol(&self.provider, &self.address, call) - } - } - /// Event filters. - impl, N: alloy_contract::private::Network> - IConditionalOrderInstance - { - /// Creates a new event filter using this contract instance's provider - /// and address. - /// - /// Note that the type can be any event, not just those defined in this - /// contract. Prefer using the other methods for building - /// type-safe event filters. - pub fn event_filter( - &self, - ) -> alloy_contract::Event<&P, E, N> { - alloy_contract::Event::new_sol(&self.provider, &self.address) - } - } -} -/** - -Generated by the following Solidity interface... -```solidity -library IConditionalOrder { - struct ConditionalOrderParams { - address handler; - bytes32 salt; - bytes staticInput; - } -} - -interface CowAmmConstantProductFactory { - error OnlyOwnerCanCall(address owner); - error OrderNotValid(string); - - event ConditionalOrderCreated(address indexed owner, IConditionalOrder.ConditionalOrderParams params); - event Deployed(address indexed amm, address indexed owner, address token0, address token1); - event TradingDisabled(address indexed amm); - - constructor(address _settler); - - function ammDeterministicAddress(address ammOwner, address token0, address token1) external view returns (address); - function create(address token0, uint256 amount0, address token1, uint256 amount1, uint256 minTradedToken0, address priceOracle, bytes memory priceOracleData, bytes32 appData) external returns (address amm); - function deposit(address amm, uint256 amount0, uint256 amount1) external; - function owner(address) external view returns (address); - function withdraw(address amm, uint256 amount0, uint256 amount1) external; -} -``` - -...which was generated by the following JSON ABI: -```json -[ - { - "type": "constructor", - "inputs": [ - { - "name": "_settler", - "type": "address", - "internalType": "contract ISettlement" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "ammDeterministicAddress", - "inputs": [ - { - "name": "ammOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "token0", - "type": "address", - "internalType": "contract IERC20" - }, - { - "name": "token1", - "type": "address", - "internalType": "contract IERC20" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "create", - "inputs": [ - { - "name": "token0", - "type": "address", - "internalType": "contract IERC20" - }, - { - "name": "amount0", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "token1", - "type": "address", - "internalType": "contract IERC20" - }, - { - "name": "amount1", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "minTradedToken0", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "priceOracle", - "type": "address", - "internalType": "contract IPriceOracle" - }, - { - "name": "priceOracleData", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "appData", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "amm", - "type": "address", - "internalType": "contract ConstantProduct" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "deposit", - "inputs": [ - { - "name": "amm", - "type": "address", - "internalType": "contract ConstantProduct" - }, - { - "name": "amount0", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "amount1", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "owner", - "inputs": [ - { - "name": "", - "type": "address", - "internalType": "contract ConstantProduct" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "withdraw", - "inputs": [ - { - "name": "amm", - "type": "address", - "internalType": "contract ConstantProduct" - }, - { - "name": "amount0", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "amount1", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "event", - "name": "ConditionalOrderCreated", - "inputs": [ - { - "name": "owner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "params", - "type": "tuple", - "indexed": false, - "internalType": "struct IConditionalOrder.ConditionalOrderParams", - "components": [ - { - "name": "handler", - "type": "address", - "internalType": "contract IConditionalOrder" - }, - { - "name": "salt", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "staticInput", - "type": "bytes", - "internalType": "bytes" - } - ] - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Deployed", - "inputs": [ - { - "name": "amm", - "type": "address", - "indexed": true, - "internalType": "contract ConstantProduct" - }, - { - "name": "owner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "token0", - "type": "address", - "indexed": false, - "internalType": "contract IERC20" - }, - { - "name": "token1", - "type": "address", - "indexed": false, - "internalType": "contract IERC20" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TradingDisabled", - "inputs": [ - { - "name": "amm", - "type": "address", - "indexed": true, - "internalType": "contract ConstantProduct" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "OnlyOwnerCanCall", - "inputs": [ - { - "name": "owner", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "OrderNotValid", - "inputs": [ - { - "name": "", - "type": "string", - "internalType": "string" - } - ] - } -] -```*/ -#[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style, - clippy::empty_structs_with_brackets -)] -pub mod CowAmmConstantProductFactory { - use {super::*, alloy_sol_types}; - /// The creation / init bytecode of the contract. - /// - /// ```text - ///0x60a0604052348015600e575f80fd5b506040516141b33803806141b3833981016040819052602b91603b565b6001600160a01b03166080526066565b5f60208284031215604a575f80fd5b81516001600160a01b0381168114605f575f80fd5b9392505050565b60805161412761008c5f395f8181610189015281816102a801526108c401526141275ff3fe608060405234801561000f575f80fd5b506004361061009f575f3560e01c806337ebdf5011610072578063666e1b3911610058578063666e1b391461014f578063ab221a7614610184578063b5c5f672146101ab575f80fd5b806337ebdf50146101295780635b5d9ee61461013c575f80fd5b80630efe6a8b146100a357806322b155c6146100b857806326e0a196146100f55780632791056514610116575b5f80fd5b6100b66100b13660046111ea565b6101be565b005b6100cb6100c6366004611261565b6102a3565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101086101033660046112fb565b61045f565b6040516100ec9291906114fd565b6100b6610124366004611527565b610797565b6100cb610137366004611549565b61082f565b6100b661014a366004611591565b610a01565b6100cb61015d366004611527565b5f6020819052908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6100cb7f000000000000000000000000000000000000000000000000000000000000000081565b6100b66101b93660046111ea565b610b17565b61024f3384848673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561020d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102319190611617565b73ffffffffffffffffffffffffffffffffffffffff16929190610c46565b61029e3384838673ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561020d573d5f803e3d5ffd5b505050565b5f33807f00000000000000000000000000000000000000000000000000000000000000008c8b6040516102d5906111b9565b73ffffffffffffffffffffffffffffffffffffffff9384168152918316602083015290911660408201526060018190604051809103905ff590508015801561031f573d5f803e3d5ffd5b506040805173ffffffffffffffffffffffffffffffffffffffff8e811682528c81166020830152929450828416928516917f6707255b2c5ca81220b2f3e408a269cb83baa6aa7e5e37aa1756883a6cdf06f1910160405180910390a373ffffffffffffffffffffffffffffffffffffffff8281165f90815260208190526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169183169190911790556103d8828b8a6101be565b5f60405180608001604052808981526020018873ffffffffffffffffffffffffffffffffffffffff16815260200187878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200185905290506104508382610cdb565b50509998505050505050505050565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608101919091526060306104cf6020890189611527565b73ffffffffffffffffffffffffffffffffffffffff1614610551576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f63616e206f6e6c792068616e646c65206f776e206f726465727300000000000060448201526064015b60405180910390fd5b5f61055f6040890189611632565b81019061056c919061175c565b90508873ffffffffffffffffffffffffffffffffffffffff1663eec50b976040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105db919061185a565b6040517fb09aaaca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b169063b09aaaca9061062d9085906004016118c3565b602060405180830381865afa158015610648573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061066c919061185a565b146106d3576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f696e76616c69642074726164696e6720706172616d65746572730000000000006044820152606401610548565b6040517fe3e6f5b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a169063e3e6f5b2906107259084906004016118c3565b61018060405180830381865afa158015610741573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061076591906118f7565b9250828160405160200161077a9291906119b3565b604051602081830303815290604052915050965096945050505050565b73ffffffffffffffffffffffffffffffffffffffff8082165f9081526020819052604090205482911633146108225773ffffffffffffffffffffffffffffffffffffffff8181165f90815260208190526040908190205490517f68bafff800000000000000000000000000000000000000000000000000000000815291166004820152602401610548565b61082b82610e05565b5050565b5f807fff000000000000000000000000000000000000000000000000000000000000003073ffffffffffffffffffffffffffffffffffffffff8716604051610879602082016111b9565b8181037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09081018352601f90910116604081815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166020840152808b169183019190915288166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261093a92916020016119eb565b604051602081830303815290604052805190602001206040516020016109c294939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052805160209091012095945050505050565b73ffffffffffffffffffffffffffffffffffffffff8087165f908152602081905260409020548791163314610a8c5773ffffffffffffffffffffffffffffffffffffffff8181165f90815260208190526040908190205490517f68bafff800000000000000000000000000000000000000000000000000000000815291166004820152602401610548565b5f60405180608001604052808881526020018773ffffffffffffffffffffffffffffffffffffffff16815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020018490529050610b0388610e05565b610b0d8882610cdb565b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8084165f908152602081905260409020548491163314610ba25773ffffffffffffffffffffffffffffffffffffffff8181165f90815260208190526040908190205490517f68bafff800000000000000000000000000000000000000000000000000000000815291166004820152602401610548565b610bf18433858773ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561020d573d5f803e3d5ffd5b610c408433848773ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561020d573d5f803e3d5ffd5b50505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052610c40908590610ea3565b6040517fc5f3d25400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063c5f3d25490610d2d9084906004016118c3565b5f604051808303815f87803b158015610d44575f80fd5b505af1158015610d56573d5f803e3d5ffd5b5050604080516060810182523081525f6020808301829052835191955073ffffffffffffffffffffffffffffffffffffffff881694507f2cceac5555b0ca45a3744ced542f54b56ad2eb45e521962372eef212a2cbf36193830191610dbd918891016118c3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152915251610df891906119ff565b60405180910390a2505050565b8073ffffffffffffffffffffffffffffffffffffffff166317700f016040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610e4a575f80fd5b505af1158015610e5c573d5f803e3d5ffd5b505060405173ffffffffffffffffffffffffffffffffffffffff841692507fc75bf4f03c02fab9414a7d7a54048c0486722bc72f33ad924709a0593608ad2791505f90a250565b5f610f04826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610fb09092919063ffffffff16565b905080515f1480610f24575080806020019051810190610f249190611a43565b61029e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610548565b6060610fbe84845f85610fc6565b949350505050565b606082471015611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610548565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516110809190611a5c565b5f6040518083038185875af1925050503d805f81146110ba576040519150601f19603f3d011682016040523d82523d5f602084013e6110bf565b606091505b50915091506110d0878383876110db565b979650505050505050565b606083156111705782515f036111695773ffffffffffffffffffffffffffffffffffffffff85163b611169576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610548565b5081610fbe565b610fbe83838151156111855781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105489190611a67565b61267880611a7a83390190565b73ffffffffffffffffffffffffffffffffffffffff811681146111e7575f80fd5b50565b5f805f606084860312156111fc575f80fd5b8335611207816111c6565b95602085013595506040909401359392505050565b5f8083601f84011261122c575f80fd5b50813567ffffffffffffffff811115611243575f80fd5b60208301915083602082850101111561125a575f80fd5b9250929050565b5f805f805f805f805f6101008a8c03121561127a575f80fd5b8935611285816111c6565b985060208a0135975060408a013561129c816111c6565b965060608a0135955060808a0135945060a08a01356112ba816111c6565b935060c08a013567ffffffffffffffff8111156112d5575f80fd5b6112e18c828d0161121c565b9a9d999c50979a9699959894979660e00135949350505050565b5f805f805f8060808789031215611310575f80fd5b863561131b816111c6565b9550602087013567ffffffffffffffff80821115611337575f80fd5b908801906060828b03121561134a575f80fd5b9095506040880135908082111561135f575f80fd5b61136b8a838b0161121c565b90965094506060890135915080821115611383575f80fd5b818901915089601f830112611396575f80fd5b8135818111156113a4575f80fd5b8a60208260051b85010111156113b8575f80fd5b6020830194508093505050509295509295509295565b805173ffffffffffffffffffffffffffffffffffffffff168252602081015161140f602084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040810151611437604084018273ffffffffffffffffffffffffffffffffffffffff169052565b50606081015160608301526080810151608083015260a081015161146360a084018263ffffffff169052565b5060c081015160c083015260e081015160e0830152610100808201518184015250610120808201516114988285018215159052565b5050610140818101519083015261016090810151910152565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b5f6101a061150b83866113ce565b8061018084015261151e818401856114b1565b95945050505050565b5f60208284031215611537575f80fd5b8135611542816111c6565b9392505050565b5f805f6060848603121561155b575f80fd5b8335611566816111c6565b92506020840135611576816111c6565b91506040840135611586816111c6565b809150509250925092565b5f805f805f8060a087890312156115a6575f80fd5b86356115b1816111c6565b95506020870135945060408701356115c8816111c6565b9350606087013567ffffffffffffffff8111156115e3575f80fd5b6115ef89828a0161121c565b979a9699509497949695608090950135949350505050565b8051611612816111c6565b919050565b5f60208284031215611627575f80fd5b8151611542816111c6565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611665575f80fd5b83018035915067ffffffffffffffff82111561167f575f80fd5b60200191503681900382131561125a575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156116e3576116e3611693565b60405290565b604051610180810167ffffffffffffffff811182821017156116e3576116e3611693565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561175457611754611693565b604052919050565b5f602080838503121561176d575f80fd5b823567ffffffffffffffff80821115611784575f80fd5b9084019060808287031215611797575f80fd5b61179f6116c0565b82358152838301356117b0816111c6565b818501526040830135828111156117c5575f80fd5b8301601f810188136117d5575f80fd5b8035838111156117e7576117e7611693565b611817867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161170d565b9350808452888682840101111561182c575f80fd5b80868301878601375f8682860101525050816040820152606083013560608201528094505050505092915050565b5f6020828403121561186a575f80fd5b5051919050565b8051825273ffffffffffffffffffffffffffffffffffffffff60208201511660208301525f6040820151608060408501526118af60808501826114b1565b606093840151949093019390935250919050565b602081525f6115426020830184611871565b805163ffffffff81168114611612575f80fd5b80518015158114611612575f80fd5b5f6101808284031215611908575f80fd5b6119106116e9565b61191983611607565b815261192760208401611607565b602082015261193860408401611607565b6040820152606083015160608201526080830151608082015261195d60a084016118d5565b60a082015260c083015160c082015260e083015160e08201526101008084015181830152506101206119908185016118e8565b908201526101408381015190820152610160928301519281019290925250919050565b5f6101a06119c183866113ce565b8061018084015261151e81840185611871565b5f81518060208401855e5f93019283525090919050565b5f610fbe6119f983866119d4565b846119d4565b6020815273ffffffffffffffffffffffffffffffffffffffff8251166020820152602082015160408201525f6040830151606080840152610fbe60808401826114b1565b5f60208284031215611a53575f80fd5b611542826118e8565b5f61154282846119d4565b602081525f61154260208301846114b156fe610120604052348015610010575f80fd5b5060405161267838038061267883398101604081905261002f9161052f565b6001600160a01b03831660808190526040805163f698da2560e01b8152905163f698da259160048082019260209290919082900301815f875af1158015610078573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061009c9190610579565b610100526100aa823361015f565b6100b4813361015f565b336001600160a01b031660e0816001600160a01b0316815250505f836001600160a01b0316639b552cc26040518163ffffffff1660e01b81526004016020604051808303815f875af115801561010c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101309190610590565b905061013c838261015f565b610146828261015f565b506001600160a01b0391821660a0521660c0525061061c565b6101746001600160a01b038316825f19610178565b5050565b8015806101f05750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156101ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ee9190610579565b155b6102675760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084015b60405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526102bd9185916102c216565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201525f9061030e906001600160a01b03851690849061038d565b905080515f148061032e57508080602001905181019061032e91906105b2565b6102bd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161025e565b606061039b84845f856103a3565b949350505050565b6060824710156104045760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161025e565b5f80866001600160a01b0316858760405161041f91906105d1565b5f6040518083038185875af1925050503d805f8114610459576040519150601f19603f3d011682016040523d82523d5f602084013e61045e565b606091505b5090925090506104708783838761047b565b979650505050505050565b606083156104e95782515f036104e2576001600160a01b0385163b6104e25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161025e565b508161039b565b61039b83838151156104fe5781518083602001fd5b8060405162461bcd60e51b815260040161025e91906105e7565b6001600160a01b038116811461052c575f80fd5b50565b5f805f60608486031215610541575f80fd5b835161054c81610518565b602085015190935061055d81610518565b604085015190925061056e81610518565b809150509250925092565b5f60208284031215610589575f80fd5b5051919050565b5f602082840312156105a0575f80fd5b81516105ab81610518565b9392505050565b5f602082840312156105c2575f80fd5b815180151581146105ab575f80fd5b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051611fbd6106bb5f395f81816102db015261042b01525f8181610236015281816104d90152610bf901525f81816102b40152818161059901528181610d5c01528181610ebf01528181610f8e015261100d01525f81816101380152818161057701528181610d3b01528181610e2801528181610f6b015261103001525f818161032201526112140152611fbd5ff3fe608060405234801561000f575f80fd5b506004361061012f575f3560e01c8063b09aaaca116100ad578063e3e6f5b21161007d578063eec50b9711610063578063eec50b9714610344578063f14fcbc81461034c578063ff2dbc9814610203575f80fd5b8063e3e6f5b2146102fd578063e516715b1461031d575f80fd5b8063b09aaaca14610289578063c5f3d2541461029c578063d21220a7146102af578063d25e0cb6146102d6575f80fd5b80631c7de94111610102578063481c6a75116100e8578063481c6a7514610231578063981a160b14610258578063a029a8d414610276575f80fd5b80631c7de941146102035780633e706e321461020a575f80fd5b80630dfe1681146101335780631303a484146101845780631626ba7e146101b557806317700f01146101f9575b5f80fd5b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b7f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b5935c5b60405190815260200161017b565b6101c86101c33660046116bf565b61035f565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161017b565b6102016104d7565b005b6101a75f81565b6101a77f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b59381565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b61026161012c81565b60405163ffffffff909116815260200161017b565b6102016102843660046119ee565b610573565b6101a7610297366004611a3b565b610bc8565b6102016102aa366004611a75565b610bf7565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b6101a77f000000000000000000000000000000000000000000000000000000000000000081565b61031061030b366004611a3b565b610cb7565b60405161017b9190611aac565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b6101a75f5481565b61020161035a366004611b9a565b6111fc565b5f808061036e84860186611bb1565b915091505f5461037d82610bc8565b146103b4576040517ff1a6789000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0820180517fd5a25ba2e97094ad7d83dc28a6572da797d6b3e7fc6663bd93efb789fc17e48982526101a0822091526040517f190100000000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006002820152602281019190915260429020868114610494576040517f593fcacd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f818385611291565b6104a98284610573565b507f1626ba7e00000000000000000000000000000000000000000000000000000000925050505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610546576040517ff87d0d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080556040517fbcb8b8fbdea8aa6dc4ae41213e4da81e605a3d1a56ed851b9355182321c091909190a1565b80517f0000000000000000000000000000000000000000000000000000000000000000907f00000000000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff808416911614610677578073ffffffffffffffffffffffffffffffffffffffff16835f015173ffffffffffffffffffffffffffffffffffffffff1614610675576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c69642073656c6c20746f6b656e000000000000000000000000000060448201526064015b60405180910390fd5b905b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190611bff565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091505f9073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015610772573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107969190611bff565b90508273ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff1614610831576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f696e76616c69642062757920746f6b656e000000000000000000000000000000604482015260640161066c565b604085015173ffffffffffffffffffffffffffffffffffffffff16156108b3576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7265636569766572206d757374206265207a65726f2061646472657373000000604482015260640161066c565b6108bf61012c42611c43565b8560a0015163ffffffff161115610932576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f76616c696469747920746f6f2066617220696e20746865206675747572650000604482015260640161066c565b85606001518560c00151146109a3576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c696420617070446174610000000000000000000000000000000000604482015260640161066c565b60e085015115610a0f576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f66656520616d6f756e74206d757374206265207a65726f000000000000000000604482015260640161066c565b7f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc985610160015114610a9d576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f627579546f6b656e42616c616e6365206d757374206265206572633230000000604482015260640161066c565b7f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc985610140015114610b2b576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f73656c6c546f6b656e42616c616e6365206d7573742062652065726332300000604482015260640161066c565b6060850151610b3a9082611c56565b60808601516060870151610b4e9085611c6d565b610b589190611c56565b1015610bc0576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f726563656976656420616d6f756e7420746f6f206c6f77000000000000000000604482015260640161066c565b505050505050565b5f81604051602001610bda9190611ccc565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610c66576040517ff87d0d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610c7361029783611d27565b9050805f81905550807f510e4a4f76907c2d6158b343f7c4f2f597df385b727c26e9ef90e75093ace19a83604051610cab9190611d79565b60405180910390a25050565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608101919091525f80836020015173ffffffffffffffffffffffffffffffffffffffff1663355efdd97f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000087604001516040518463ffffffff1660e01b8152600401610d9e93929190611e3a565b6040805180830381865afa158015610db8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddc9190611e72565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291935091505f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610e6d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e919190611bff565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610f19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f3d9190611bff565b90925090505f80808080610f518888611c56565b90505f610f5e8a88611c56565b90505f8282101561100b577f000000000000000000000000000000000000000000000000000000000000000096507f00000000000000000000000000000000000000000000000000000000000000009550610fd6610fbd60028b611ec1565b610fd184610fcc8e6002611c56565b611346565b61137e565b945061100185610fe6818d611c56565b610ff09085611c43565b610ffa8c8f611c56565b60016113cb565b9350849050611098565b7f000000000000000000000000000000000000000000000000000000000000000096507f0000000000000000000000000000000000000000000000000000000000000000955061106e61105f60028a611ec1565b610fd185610fcc8f6002611c56565b94506110928561107e818e611c56565b6110889086611c43565b610ffa8b8e611c56565b93508390505b8c518110156110df576110df6040518060400160405280601781526020017f74726164656420616d6f756e7420746f6f20736d616c6c000000000000000000815250611426565b6040518061018001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200161115661012c611466565b63ffffffff1681526020018e6060015181526020015f81526020017ff3b277728b3fee749481eb3e0b3b48980dbbab78658fc419025cb16eee34677581526020016001151581526020017f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc981526020017f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc98152509b505050505050505050505050919050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461126b576040517fbf84897700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b807f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b5935d50565b7f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b5935c8381146113405780156112f2576040517fdafbdd1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6112fc84610cb7565b90506113088382611487565b61133e576040517fd9ff24c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b50505050565b5f82156113735781611359600185611c6d565b6113639190611ec1565b61136e906001611c43565b611375565b5f5b90505b92915050565b5f818310156113c5576113c56040518060400160405280601581526020017f7375627472616374696f6e20756e646572666c6f770000000000000000000000815250611426565b50900390565b5f806113d8868686611599565b905060018360028111156113ee576113ee611ed4565b14801561140a57505f848061140557611405611e94565b868809115b1561141d5761141a600182611c43565b90505b95945050505050565b611431436001611c43565b816040517f1fe8506e00000000000000000000000000000000000000000000000000000000815260040161066c929190611f01565b5f81806114738142611f19565b61147d9190611f3b565b6113789190611f63565b5f80825f015173ffffffffffffffffffffffffffffffffffffffff16845f015173ffffffffffffffffffffffffffffffffffffffff161490505f836020015173ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff161490505f846060015186606001511490505f856080015187608001511490505f8660a0015163ffffffff168860a0015163ffffffff161490505f8761010001518961010001511490505f88610120015115158a6101200151151514905086801561155e5750855b80156115675750845b80156115705750835b80156115795750825b80156115825750815b801561158b5750805b9a9950505050505050505050565b5f80807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709858702925082811083820303915050805f036115ef578382816115e5576115e5611e94565b04925050506104d0565b808411611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f770000000000000000000000604482015260640161066c565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f805f604084860312156116d1575f80fd5b83359250602084013567ffffffffffffffff808211156116ef575f80fd5b818601915086601f830112611702575f80fd5b813581811115611710575f80fd5b876020828501011115611721575f80fd5b6020830194508093505050509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff8111828210171561178457611784611734565b60405290565b604051610180810167ffffffffffffffff8111828210171561178457611784611734565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156117f5576117f5611734565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461181e575f80fd5b50565b5f60808284031215611831575f80fd5b611839611761565b90508135815260208083013561184e816117fd565b82820152604083013567ffffffffffffffff8082111561186c575f80fd5b818501915085601f83011261187f575f80fd5b81358181111561189157611891611734565b6118c1847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016117ae565b915080825286848285010111156118d6575f80fd5b80848401858401375f848284010152508060408501525050506060820135606082015292915050565b803561190a816117fd565b919050565b803563ffffffff8116811461190a575f80fd5b8035801515811461190a575f80fd5b5f6101808284031215611942575f80fd5b61194a61178a565b9050611955826118ff565b8152611963602083016118ff565b6020820152611974604083016118ff565b6040820152606082013560608201526080820135608082015261199960a0830161190f565b60a082015260c082013560c082015260e082013560e08201526101008083013581830152506101206119cc818401611922565b9082015261014082810135908201526101609182013591810191909152919050565b5f806101a08385031215611a00575f80fd5b823567ffffffffffffffff811115611a16575f80fd5b611a2285828601611821565b925050611a328460208501611931565b90509250929050565b5f60208284031215611a4b575f80fd5b813567ffffffffffffffff811115611a61575f80fd5b611a6d84828501611821565b949350505050565b5f60208284031215611a85575f80fd5b813567ffffffffffffffff811115611a9b575f80fd5b8201608081850312156104d0575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff16815261018081016020830151611af2602084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040830151611b1a604084018273ffffffffffffffffffffffffffffffffffffffff169052565b50606083015160608301526080830151608083015260a0830151611b4660a084018263ffffffff169052565b5060c083015160c083015260e083015160e083015261010080840151818401525061012080840151611b7b8285018215159052565b5050610140838101519083015261016092830151929091019190915290565b5f60208284031215611baa575f80fd5b5035919050565b5f806101a08385031215611bc3575f80fd5b611bcd8484611931565b915061018083013567ffffffffffffffff811115611be9575f80fd5b611bf585828601611821565b9150509250929050565b5f60208284031215611c0f575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561137857611378611c16565b808202811582820484141761137857611378611c16565b8181038181111561137857611378611c16565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081528151602082015273ffffffffffffffffffffffffffffffffffffffff60208301511660408201525f604083015160806060840152611d1160a0840182611c80565b9050606084015160808401528091505092915050565b5f6113783683611821565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60208152813560208201525f6020830135611d93816117fd565b73ffffffffffffffffffffffffffffffffffffffff811660408401525060408301357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611de4575f80fd5b830160208101903567ffffffffffffffff811115611e00575f80fd5b803603821315611e0e575f80fd5b60806060850152611e2360a085018284611d32565b915050606084013560808401528091505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff80861683528085166020840152506060604083015261141d6060830184611c80565b5f8060408385031215611e83575f80fd5b505080516020909101519092909150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82611ecf57611ecf611e94565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b828152604060208201525f611a6d6040830184611c80565b5f63ffffffff80841680611f2f57611f2f611e94565b92169190910492915050565b63ffffffff818116838216028082169190828114611f5b57611f5b611c16565b505092915050565b63ffffffff818116838216019080821115611f8057611f80611c16565b509291505056fea2646970667358221220e3fb228b525d90b942c7e58fe2e2034a17bd258c082fd47740e764a7be45bac664736f6c63430008190033a26469706673582212201190cf42f989cee23f12597c8c1e9daab6d8c816513349c3ce7fd229cae5b0ff64736f6c63430008190033 - /// ``` - #[rustfmt::skip] - #[allow(clippy::all)] - pub static BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"`\xA0`@R4\x80\x15`\x0EW_\x80\xFD[P`@QaA\xB38\x03\x80aA\xB3\x839\x81\x01`@\x81\x90R`+\x91`;V[`\x01`\x01`\xA0\x1B\x03\x16`\x80R`fV[_` \x82\x84\x03\x12\x15`JW_\x80\xFD[\x81Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14`_W_\x80\xFD[\x93\x92PPPV[`\x80QaA'a\0\x8C_9_\x81\x81a\x01\x89\x01R\x81\x81a\x02\xA8\x01Ra\x08\xC4\x01RaA'_\xF3\xFE`\x80`@R4\x80\x15a\0\x0FW_\x80\xFD[P`\x046\x10a\0\x9FW_5`\xE0\x1C\x80c7\xEB\xDFP\x11a\0rW\x80cfn\x1B9\x11a\0XW\x80cfn\x1B9\x14a\x01OW\x80c\xAB\"\x1Av\x14a\x01\x84W\x80c\xB5\xC5\xF6r\x14a\x01\xABW_\x80\xFD[\x80c7\xEB\xDFP\x14a\x01)W\x80c[]\x9E\xE6\x14a\x01=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x021\x91\x90a\x16\x17V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x92\x91\x90a\x0CFV[a\x02\x9E3\x84\x83\x86s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xD2\x12 \xA7`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x02\rW=_\x80>=_\xFD[PPPV[_3\x80\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x8C\x8B`@Qa\x02\xD5\x90a\x11\xB9V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x93\x84\x16\x81R\x91\x83\x16` \x83\x01R\x90\x91\x16`@\x82\x01R``\x01\x81\x90`@Q\x80\x91\x03\x90_\xF5\x90P\x80\x15\x80\x15a\x03\x1FW=_\x80>=_\xFD[P`@\x80Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x8E\x81\x16\x82R\x8C\x81\x16` \x83\x01R\x92\x94P\x82\x84\x16\x92\x85\x16\x91\x7Fg\x07%[,\\\xA8\x12 \xB2\xF3\xE4\x08\xA2i\xCB\x83\xBA\xA6\xAA~^7\xAA\x17V\x88:l\xDF\x06\xF1\x91\x01`@Q\x80\x91\x03\x90\xA3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x81\x16_\x90\x81R` \x81\x90R`@\x90 \x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x91\x83\x16\x91\x90\x91\x17\x90Ua\x03\xD8\x82\x8B\x8Aa\x01\xBEV[_`@Q\x80`\x80\x01`@R\x80\x89\x81R` \x01\x88s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x87\x87\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x92\x01\x91\x90\x91RPPP\x90\x82RP` \x01\x85\x90R\x90Pa\x04P\x83\x82a\x0C\xDBV[PP\x99\x98PPPPPPPPPV[`@\x80Qa\x01\x80\x81\x01\x82R_\x80\x82R` \x82\x01\x81\x90R\x91\x81\x01\x82\x90R``\x81\x01\x82\x90R`\x80\x81\x01\x82\x90R`\xA0\x81\x01\x82\x90R`\xC0\x81\x01\x82\x90R`\xE0\x81\x01\x82\x90Ra\x01\0\x81\x01\x82\x90Ra\x01 \x81\x01\x82\x90Ra\x01@\x81\x01\x82\x90Ra\x01`\x81\x01\x91\x90\x91R``0a\x04\xCF` \x89\x01\x89a\x15'V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x05QW`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x1A`$\x82\x01R\x7Fcan only handle own orders\0\0\0\0\0\0`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[_a\x05_`@\x89\x01\x89a\x162V[\x81\x01\x90a\x05l\x91\x90a\x17\\V[\x90P\x88s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xEE\xC5\x0B\x97`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x05\xB7W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\xDB\x91\x90a\x18ZV[`@Q\x7F\xB0\x9A\xAA\xCA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x8B\x16\x90c\xB0\x9A\xAA\xCA\x90a\x06-\x90\x85\x90`\x04\x01a\x18\xC3V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x06HW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x06l\x91\x90a\x18ZV[\x14a\x06\xD3W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x1A`$\x82\x01R\x7Finvalid trading parameters\0\0\0\0\0\0`D\x82\x01R`d\x01a\x05HV[`@Q\x7F\xE3\xE6\xF5\xB2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x8A\x16\x90c\xE3\xE6\xF5\xB2\x90a\x07%\x90\x84\x90`\x04\x01a\x18\xC3V[a\x01\x80`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07AW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07e\x91\x90a\x18\xF7V[\x92P\x82\x81`@Q` \x01a\x07z\x92\x91\x90a\x19\xB3V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91PP\x96P\x96\x94PPPPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x16_\x90\x81R` \x81\x90R`@\x90 T\x82\x91\x163\x14a\x08\"Ws\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x81\x16_\x90\x81R` \x81\x90R`@\x90\x81\x90 T\x90Q\x7Fh\xBA\xFF\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R\x91\x16`\x04\x82\x01R`$\x01a\x05HV[a\x08+\x82a\x0E\x05V[PPV[_\x80\x7F\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x87\x16`@Qa\x08y` \x82\x01a\x11\xB9V[\x81\x81\x03\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x90\x81\x01\x83R`\x1F\x90\x91\x01\x16`@\x81\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81\x16` \x84\x01R\x80\x8B\x16\x91\x83\x01\x91\x90\x91R\x88\x16``\x82\x01R`\x80\x01`@\x80Q\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x81\x84\x03\x01\x81R\x90\x82\x90Ra\t:\x92\x91` \x01a\x19\xEBV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 `@Q` \x01a\t\xC2\x94\x93\x92\x91\x90\x7F\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x94\x90\x94\x16\x84R``\x92\x90\x92\x1B\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\x16`\x01\x84\x01R`\x15\x83\x01R`5\x82\x01R`U\x01\x90V[`@\x80Q\x80\x83\x03\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x01\x81R\x91\x90R\x80Q` \x90\x91\x01 \x95\x94PPPPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x87\x16_\x90\x81R` \x81\x90R`@\x90 T\x87\x91\x163\x14a\n\x8CWs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x81\x16_\x90\x81R` \x81\x90R`@\x90\x81\x90 T\x90Q\x7Fh\xBA\xFF\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R\x91\x16`\x04\x82\x01R`$\x01a\x05HV[_`@Q\x80`\x80\x01`@R\x80\x88\x81R` \x01\x87s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x86\x86\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x92\x01\x91\x90\x91RPPP\x90\x82RP` \x01\x84\x90R\x90Pa\x0B\x03\x88a\x0E\x05V[a\x0B\r\x88\x82a\x0C\xDBV[PPPPPPPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x84\x16_\x90\x81R` \x81\x90R`@\x90 T\x84\x91\x163\x14a\x0B\xA2Ws\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x81\x16_\x90\x81R` \x81\x90R`@\x90\x81\x90 T\x90Q\x7Fh\xBA\xFF\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R\x91\x16`\x04\x82\x01R`$\x01a\x05HV[a\x0B\xF1\x843\x85\x87s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\r\xFE\x16\x81`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x02\rW=_\x80>=_\xFD[a\x0C@\x843\x84\x87s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xD2\x12 \xA7`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x02\rW=_\x80>=_\xFD[PPPPV[`@\x80Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x85\x81\x16`$\x83\x01R\x84\x16`D\x82\x01R`d\x80\x82\x01\x84\x90R\x82Q\x80\x83\x03\x90\x91\x01\x81R`\x84\x90\x91\x01\x90\x91R` \x81\x01\x80Q{\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F#\xB8r\xDD\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x17\x90Ra\x0C@\x90\x85\x90a\x0E\xA3V[`@Q\x7F\xC5\xF3\xD2T\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16\x90c\xC5\xF3\xD2T\x90a\r-\x90\x84\x90`\x04\x01a\x18\xC3V[_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\rDW_\x80\xFD[PZ\xF1\x15\x80\x15a\rVW=_\x80>=_\xFD[PP`@\x80Q``\x81\x01\x82R0\x81R_` \x80\x83\x01\x82\x90R\x83Q\x91\x95Ps\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x88\x16\x94P\x7F,\xCE\xACUU\xB0\xCAE\xA3tL\xEDT/T\xB5j\xD2\xEBE\xE5!\x96#r\xEE\xF2\x12\xA2\xCB\xF3a\x93\x83\x01\x91a\r\xBD\x91\x88\x91\x01a\x18\xC3V[`@\x80Q\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x81\x84\x03\x01\x81R\x91\x81R\x91RQa\r\xF8\x91\x90a\x19\xFFV[`@Q\x80\x91\x03\x90\xA2PPPV[\x80s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x17p\x0F\x01`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\x0EJW_\x80\xFD[PZ\xF1\x15\x80\x15a\x0E\\W=_\x80>=_\xFD[PP`@Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x84\x16\x92P\x7F\xC7[\xF4\xF0<\x02\xFA\xB9AJ}zT\x04\x8C\x04\x86r+\xC7/3\xAD\x92G\t\xA0Y6\x08\xAD'\x91P_\x90\xA2PV[_a\x0F\x04\x82`@Q\x80`@\x01`@R\x80` \x81R` \x01\x7FSafeERC20: low-level call failed\x81RP\x85s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a\x0F\xB0\x90\x92\x91\x90c\xFF\xFF\xFF\xFF\x16V[\x90P\x80Q_\x14\x80a\x0F$WP\x80\x80` \x01\x90Q\x81\x01\x90a\x0F$\x91\x90a\x1ACV[a\x02\x9EW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`*`$\x82\x01R\x7FSafeERC20: ERC20 operation did n`D\x82\x01R\x7Fot succeed\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`d\x82\x01R`\x84\x01a\x05HV[``a\x0F\xBE\x84\x84_\x85a\x0F\xC6V[\x94\x93PPPPV[``\x82G\x10\x15a\x10XW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`&`$\x82\x01R\x7FAddress: insufficient balance fo`D\x82\x01R\x7Fr call\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`d\x82\x01R`\x84\x01a\x05HV[_\x80\x86s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x85\x87`@Qa\x10\x80\x91\x90a\x1A\\V[_`@Q\x80\x83\x03\x81\x85\x87Z\xF1\x92PPP=\x80_\x81\x14a\x10\xBAW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a\x10\xBFV[``\x91P[P\x91P\x91Pa\x10\xD0\x87\x83\x83\x87a\x10\xDBV[\x97\x96PPPPPPPV[``\x83\x15a\x11pW\x82Q_\x03a\x11iWs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x85\x16;a\x11iW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FAddress: call to non-contract\0\0\0`D\x82\x01R`d\x01a\x05HV[P\x81a\x0F\xBEV[a\x0F\xBE\x83\x83\x81Q\x15a\x11\x85W\x81Q\x80\x83` \x01\xFD[\x80`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x05H\x91\x90a\x1AgV[a&x\x80a\x1Az\x839\x01\x90V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x11\xE7W_\x80\xFD[PV[_\x80_``\x84\x86\x03\x12\x15a\x11\xFCW_\x80\xFD[\x835a\x12\x07\x81a\x11\xC6V[\x95` \x85\x015\x95P`@\x90\x94\x015\x93\x92PPPV[_\x80\x83`\x1F\x84\x01\x12a\x12,W_\x80\xFD[P\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x12CW_\x80\xFD[` \x83\x01\x91P\x83` \x82\x85\x01\x01\x11\x15a\x12ZW_\x80\xFD[\x92P\x92\x90PV[_\x80_\x80_\x80_\x80_a\x01\0\x8A\x8C\x03\x12\x15a\x12zW_\x80\xFD[\x895a\x12\x85\x81a\x11\xC6V[\x98P` \x8A\x015\x97P`@\x8A\x015a\x12\x9C\x81a\x11\xC6V[\x96P``\x8A\x015\x95P`\x80\x8A\x015\x94P`\xA0\x8A\x015a\x12\xBA\x81a\x11\xC6V[\x93P`\xC0\x8A\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x12\xD5W_\x80\xFD[a\x12\xE1\x8C\x82\x8D\x01a\x12\x1CV[\x9A\x9D\x99\x9CP\x97\x9A\x96\x99\x95\x98\x94\x97\x96`\xE0\x015\x94\x93PPPPV[_\x80_\x80_\x80`\x80\x87\x89\x03\x12\x15a\x13\x10W_\x80\xFD[\x865a\x13\x1B\x81a\x11\xC6V[\x95P` \x87\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x137W_\x80\xFD[\x90\x88\x01\x90``\x82\x8B\x03\x12\x15a\x13JW_\x80\xFD[\x90\x95P`@\x88\x015\x90\x80\x82\x11\x15a\x13_W_\x80\xFD[a\x13k\x8A\x83\x8B\x01a\x12\x1CV[\x90\x96P\x94P``\x89\x015\x91P\x80\x82\x11\x15a\x13\x83W_\x80\xFD[\x81\x89\x01\x91P\x89`\x1F\x83\x01\x12a\x13\x96W_\x80\xFD[\x815\x81\x81\x11\x15a\x13\xA4W_\x80\xFD[\x8A` \x82`\x05\x1B\x85\x01\x01\x11\x15a\x13\xB8W_\x80\xFD[` \x83\x01\x94P\x80\x93PPPP\x92\x95P\x92\x95P\x92\x95V[\x80Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x82R` \x81\x01Qa\x14\x0F` \x84\x01\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90RV[P`@\x81\x01Qa\x147`@\x84\x01\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90RV[P``\x81\x01Q``\x83\x01R`\x80\x81\x01Q`\x80\x83\x01R`\xA0\x81\x01Qa\x14c`\xA0\x84\x01\x82c\xFF\xFF\xFF\xFF\x16\x90RV[P`\xC0\x81\x01Q`\xC0\x83\x01R`\xE0\x81\x01Q`\xE0\x83\x01Ra\x01\0\x80\x82\x01Q\x81\x84\x01RPa\x01 \x80\x82\x01Qa\x14\x98\x82\x85\x01\x82\x15\x15\x90RV[PPa\x01@\x81\x81\x01Q\x90\x83\x01Ra\x01`\x90\x81\x01Q\x91\x01RV[_\x81Q\x80\x84R\x80` \x84\x01` \x86\x01^_` \x82\x86\x01\x01R` \x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x83\x01\x16\x85\x01\x01\x91PP\x92\x91PPV[_a\x01\xA0a\x15\x0B\x83\x86a\x13\xCEV[\x80a\x01\x80\x84\x01Ra\x15\x1E\x81\x84\x01\x85a\x14\xB1V[\x95\x94PPPPPV[_` \x82\x84\x03\x12\x15a\x157W_\x80\xFD[\x815a\x15B\x81a\x11\xC6V[\x93\x92PPPV[_\x80_``\x84\x86\x03\x12\x15a\x15[W_\x80\xFD[\x835a\x15f\x81a\x11\xC6V[\x92P` \x84\x015a\x15v\x81a\x11\xC6V[\x91P`@\x84\x015a\x15\x86\x81a\x11\xC6V[\x80\x91PP\x92P\x92P\x92V[_\x80_\x80_\x80`\xA0\x87\x89\x03\x12\x15a\x15\xA6W_\x80\xFD[\x865a\x15\xB1\x81a\x11\xC6V[\x95P` \x87\x015\x94P`@\x87\x015a\x15\xC8\x81a\x11\xC6V[\x93P``\x87\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x15\xE3W_\x80\xFD[a\x15\xEF\x89\x82\x8A\x01a\x12\x1CV[\x97\x9A\x96\x99P\x94\x97\x94\x96\x95`\x80\x90\x95\x015\x94\x93PPPPV[\x80Qa\x16\x12\x81a\x11\xC6V[\x91\x90PV[_` \x82\x84\x03\x12\x15a\x16'W_\x80\xFD[\x81Qa\x15B\x81a\x11\xC6V[_\x80\x835\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE1\x846\x03\x01\x81\x12a\x16eW_\x80\xFD[\x83\x01\x805\x91Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a\x16\x7FW_\x80\xFD[` \x01\x91P6\x81\x90\x03\x82\x13\x15a\x12ZW_\x80\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[`@Q`\x80\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x16\xE3Wa\x16\xE3a\x16\x93V[`@R\x90V[`@Qa\x01\x80\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x16\xE3Wa\x16\xE3a\x16\x93V[`@Q`\x1F\x82\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x17TWa\x17Ta\x16\x93V[`@R\x91\x90PV[_` \x80\x83\x85\x03\x12\x15a\x17mW_\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x17\x84W_\x80\xFD[\x90\x84\x01\x90`\x80\x82\x87\x03\x12\x15a\x17\x97W_\x80\xFD[a\x17\x9Fa\x16\xC0V[\x825\x81R\x83\x83\x015a\x17\xB0\x81a\x11\xC6V[\x81\x85\x01R`@\x83\x015\x82\x81\x11\x15a\x17\xC5W_\x80\xFD[\x83\x01`\x1F\x81\x01\x88\x13a\x17\xD5W_\x80\xFD[\x805\x83\x81\x11\x15a\x17\xE7Wa\x17\xE7a\x16\x93V[a\x18\x17\x86\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x84\x01\x16\x01a\x17\rV[\x93P\x80\x84R\x88\x86\x82\x84\x01\x01\x11\x15a\x18,W_\x80\xFD[\x80\x86\x83\x01\x87\x86\x017_\x86\x82\x86\x01\x01RPP\x81`@\x82\x01R``\x83\x015``\x82\x01R\x80\x94PPPPP\x92\x91PPV[_` \x82\x84\x03\x12\x15a\x18jW_\x80\xFD[PQ\x91\x90PV[\x80Q\x82Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF` \x82\x01Q\x16` \x83\x01R_`@\x82\x01Q`\x80`@\x85\x01Ra\x18\xAF`\x80\x85\x01\x82a\x14\xB1V[``\x93\x84\x01Q\x94\x90\x93\x01\x93\x90\x93RP\x91\x90PV[` \x81R_a\x15B` \x83\x01\x84a\x18qV[\x80Qc\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x16\x12W_\x80\xFD[\x80Q\x80\x15\x15\x81\x14a\x16\x12W_\x80\xFD[_a\x01\x80\x82\x84\x03\x12\x15a\x19\x08W_\x80\xFD[a\x19\x10a\x16\xE9V[a\x19\x19\x83a\x16\x07V[\x81Ra\x19'` \x84\x01a\x16\x07V[` \x82\x01Ra\x198`@\x84\x01a\x16\x07V[`@\x82\x01R``\x83\x01Q``\x82\x01R`\x80\x83\x01Q`\x80\x82\x01Ra\x19]`\xA0\x84\x01a\x18\xD5V[`\xA0\x82\x01R`\xC0\x83\x01Q`\xC0\x82\x01R`\xE0\x83\x01Q`\xE0\x82\x01Ra\x01\0\x80\x84\x01Q\x81\x83\x01RPa\x01 a\x19\x90\x81\x85\x01a\x18\xE8V[\x90\x82\x01Ra\x01@\x83\x81\x01Q\x90\x82\x01Ra\x01`\x92\x83\x01Q\x92\x81\x01\x92\x90\x92RP\x91\x90PV[_a\x01\xA0a\x19\xC1\x83\x86a\x13\xCEV[\x80a\x01\x80\x84\x01Ra\x15\x1E\x81\x84\x01\x85a\x18qV[_\x81Q\x80` \x84\x01\x85^_\x93\x01\x92\x83RP\x90\x91\x90PV[_a\x0F\xBEa\x19\xF9\x83\x86a\x19\xD4V[\x84a\x19\xD4V[` \x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82Q\x16` \x82\x01R` \x82\x01Q`@\x82\x01R_`@\x83\x01Q``\x80\x84\x01Ra\x0F\xBE`\x80\x84\x01\x82a\x14\xB1V[_` \x82\x84\x03\x12\x15a\x1ASW_\x80\xFD[a\x15B\x82a\x18\xE8V[_a\x15B\x82\x84a\x19\xD4V[` \x81R_a\x15B` \x83\x01\x84a\x14\xB1V\xFEa\x01 `@R4\x80\x15a\0\x10W_\x80\xFD[P`@Qa&x8\x03\x80a&x\x839\x81\x01`@\x81\x90Ra\0/\x91a\x05/V[`\x01`\x01`\xA0\x1B\x03\x83\x16`\x80\x81\x90R`@\x80Qc\xF6\x98\xDA%`\xE0\x1B\x81R\x90Qc\xF6\x98\xDA%\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81_\x87Z\xF1\x15\x80\x15a\0xW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\0\x9C\x91\x90a\x05yV[a\x01\0Ra\0\xAA\x823a\x01_V[a\0\xB4\x813a\x01_V[3`\x01`\x01`\xA0\x1B\x03\x16`\xE0\x81`\x01`\x01`\xA0\x1B\x03\x16\x81RPP_\x83`\x01`\x01`\xA0\x1B\x03\x16c\x9BU,\xC2`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81_\x87Z\xF1\x15\x80\x15a\x01\x0CW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x010\x91\x90a\x05\x90V[\x90Pa\x01<\x83\x82a\x01_V[a\x01F\x82\x82a\x01_V[P`\x01`\x01`\xA0\x1B\x03\x91\x82\x16`\xA0R\x16`\xC0RPa\x06\x1CV[a\x01t`\x01`\x01`\xA0\x1B\x03\x83\x16\x82_\x19a\x01xV[PPV[\x80\x15\x80a\x01\xF0WP`@Qcn\xB1v\x9F`\xE1\x1B\x81R0`\x04\x82\x01R`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`$\x83\x01R\x84\x16\x90c\xDDb\xED>\x90`D\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x01\xCAW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x01\xEE\x91\x90a\x05yV[\x15[a\x02gW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`6`$\x82\x01R\x7FSafeERC20: approve from non-zero`D\x82\x01R\x7F to non-zero allowance\0\0\0\0\0\0\0\0\0\0`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[`@\x80Q`\x01`\x01`\xA0\x1B\x03\x84\x16`$\x82\x01R`D\x80\x82\x01\x84\x90R\x82Q\x80\x83\x03\x90\x91\x01\x81R`d\x90\x91\x01\x90\x91R` \x81\x01\x80Q`\x01`\x01`\xE0\x1B\x03\x90\x81\x16c\t^\xA7\xB3`\xE0\x1B\x17\x90\x91Ra\x02\xBD\x91\x85\x91a\x02\xC2\x16V[PPPV[`@\x80Q\x80\x82\x01\x90\x91R` \x80\x82R\x7FSafeERC20: low-level call failed\x90\x82\x01R_\x90a\x03\x0E\x90`\x01`\x01`\xA0\x1B\x03\x85\x16\x90\x84\x90a\x03\x8DV[\x90P\x80Q_\x14\x80a\x03.WP\x80\x80` \x01\x90Q\x81\x01\x90a\x03.\x91\x90a\x05\xB2V[a\x02\xBDW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`*`$\x82\x01R\x7FSafeERC20: ERC20 operation did n`D\x82\x01Ri\x1B\xDD\x08\x1C\xDDX\xD8\xD9YY`\xB2\x1B`d\x82\x01R`\x84\x01a\x02^V[``a\x03\x9B\x84\x84_\x85a\x03\xA3V[\x94\x93PPPPV[``\x82G\x10\x15a\x04\x04W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`&`$\x82\x01R\x7FAddress: insufficient balance fo`D\x82\x01Re\x1C\x88\x18\xD8[\x1B`\xD2\x1B`d\x82\x01R`\x84\x01a\x02^V[_\x80\x86`\x01`\x01`\xA0\x1B\x03\x16\x85\x87`@Qa\x04\x1F\x91\x90a\x05\xD1V[_`@Q\x80\x83\x03\x81\x85\x87Z\xF1\x92PPP=\x80_\x81\x14a\x04YW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a\x04^V[``\x91P[P\x90\x92P\x90Pa\x04p\x87\x83\x83\x87a\x04{V[\x97\x96PPPPPPPV[``\x83\x15a\x04\xE9W\x82Q_\x03a\x04\xE2W`\x01`\x01`\xA0\x1B\x03\x85\x16;a\x04\xE2W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FAddress: call to non-contract\0\0\0`D\x82\x01R`d\x01a\x02^V[P\x81a\x03\x9BV[a\x03\x9B\x83\x83\x81Q\x15a\x04\xFEW\x81Q\x80\x83` \x01\xFD[\x80`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x02^\x91\x90a\x05\xE7V[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x05,W_\x80\xFD[PV[_\x80_``\x84\x86\x03\x12\x15a\x05AW_\x80\xFD[\x83Qa\x05L\x81a\x05\x18V[` \x85\x01Q\x90\x93Pa\x05]\x81a\x05\x18V[`@\x85\x01Q\x90\x92Pa\x05n\x81a\x05\x18V[\x80\x91PP\x92P\x92P\x92V[_` \x82\x84\x03\x12\x15a\x05\x89W_\x80\xFD[PQ\x91\x90PV[_` \x82\x84\x03\x12\x15a\x05\xA0W_\x80\xFD[\x81Qa\x05\xAB\x81a\x05\x18V[\x93\x92PPPV[_` \x82\x84\x03\x12\x15a\x05\xC2W_\x80\xFD[\x81Q\x80\x15\x15\x81\x14a\x05\xABW_\x80\xFD[_\x82Q\x80` \x85\x01\x84^_\x92\x01\x91\x82RP\x91\x90PV[` \x81R_\x82Q\x80` \x84\x01R\x80` \x85\x01`@\x85\x01^_`@\x82\x85\x01\x01R`@`\x1F\x19`\x1F\x83\x01\x16\x84\x01\x01\x91PP\x92\x91PPV[`\x80Q`\xA0Q`\xC0Q`\xE0Qa\x01\0Qa\x1F\xBDa\x06\xBB_9_\x81\x81a\x02\xDB\x01Ra\x04+\x01R_\x81\x81a\x026\x01R\x81\x81a\x04\xD9\x01Ra\x0B\xF9\x01R_\x81\x81a\x02\xB4\x01R\x81\x81a\x05\x99\x01R\x81\x81a\r\\\x01R\x81\x81a\x0E\xBF\x01R\x81\x81a\x0F\x8E\x01Ra\x10\r\x01R_\x81\x81a\x018\x01R\x81\x81a\x05w\x01R\x81\x81a\r;\x01R\x81\x81a\x0E(\x01R\x81\x81a\x0Fk\x01Ra\x100\x01R_\x81\x81a\x03\"\x01Ra\x12\x14\x01Ra\x1F\xBD_\xF3\xFE`\x80`@R4\x80\x15a\0\x0FW_\x80\xFD[P`\x046\x10a\x01/W_5`\xE0\x1C\x80c\xB0\x9A\xAA\xCA\x11a\0\xADW\x80c\xE3\xE6\xF5\xB2\x11a\0}W\x80c\xEE\xC5\x0B\x97\x11a\0cW\x80c\xEE\xC5\x0B\x97\x14a\x03DW\x80c\xF1O\xCB\xC8\x14a\x03LW\x80c\xFF-\xBC\x98\x14a\x02\x03W_\x80\xFD[\x80c\xE3\xE6\xF5\xB2\x14a\x02\xFDW\x80c\xE5\x16q[\x14a\x03\x1DW_\x80\xFD[\x80c\xB0\x9A\xAA\xCA\x14a\x02\x89W\x80c\xC5\xF3\xD2T\x14a\x02\x9CW\x80c\xD2\x12 \xA7\x14a\x02\xAFW\x80c\xD2^\x0C\xB6\x14a\x02\xD6W_\x80\xFD[\x80c\x1C}\xE9A\x11a\x01\x02W\x80cH\x1Cju\x11a\0\xE8W\x80cH\x1Cju\x14a\x021W\x80c\x98\x1A\x16\x0B\x14a\x02XW\x80c\xA0)\xA8\xD4\x14a\x02vW_\x80\xFD[\x80c\x1C}\xE9A\x14a\x02\x03W\x80c>pn2\x14a\x02\nW_\x80\xFD[\x80c\r\xFE\x16\x81\x14a\x013W\x80c\x13\x03\xA4\x84\x14a\x01\x84W\x80c\x16&\xBA~\x14a\x01\xB5W\x80c\x17p\x0F\x01\x14a\x01\xF9W[_\x80\xFD[a\x01Z\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[`@Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[\x7Fl<\x90$TW\x06\x0Fe\x17x{,K\x8C\xF5\0\xCA\x88\x9D#\x04\xAF\x02\x04;\xD5\xB5\x13\xE3\xB5\x93\\[`@Q\x90\x81R` \x01a\x01{V[a\x01\xC8a\x01\xC36`\x04a\x16\xBFV[a\x03_V[`@Q\x7F\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x91\x16\x81R` \x01a\x01{V[a\x02\x01a\x04\xD7V[\0[a\x01\xA7_\x81V[a\x01\xA7\x7Fl<\x90$TW\x06\x0Fe\x17x{,K\x8C\xF5\0\xCA\x88\x9D#\x04\xAF\x02\x04;\xD5\xB5\x13\xE3\xB5\x93\x81V[a\x01Z\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[a\x02aa\x01,\x81V[`@Qc\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\x01{V[a\x02\x01a\x02\x846`\x04a\x19\xEEV[a\x05sV[a\x01\xA7a\x02\x976`\x04a\x1A;V[a\x0B\xC8V[a\x02\x01a\x02\xAA6`\x04a\x1AuV[a\x0B\xF7V[a\x01Z\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[a\x01\xA7\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[a\x03\x10a\x03\x0B6`\x04a\x1A;V[a\x0C\xB7V[`@Qa\x01{\x91\x90a\x1A\xACV[a\x01Z\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[a\x01\xA7_T\x81V[a\x02\x01a\x03Z6`\x04a\x1B\x9AV[a\x11\xFCV[_\x80\x80a\x03n\x84\x86\x01\x86a\x1B\xB1V[\x91P\x91P_Ta\x03}\x82a\x0B\xC8V[\x14a\x03\xB4W`@Q\x7F\xF1\xA6x\x90\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x82\x01\x80Q\x7F\xD5\xA2[\xA2\xE9p\x94\xAD}\x83\xDC(\xA6W-\xA7\x97\xD6\xB3\xE7\xFCfc\xBD\x93\xEF\xB7\x89\xFC\x17\xE4\x89\x82Ra\x01\xA0\x82 \x91R`@Q\x7F\x19\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\x02\x82\x01R`\"\x81\x01\x91\x90\x91R`B\x90 \x86\x81\x14a\x04\x94W`@Q\x7FY?\xCA\xCD\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x04\x9F\x81\x83\x85a\x12\x91V[a\x04\xA9\x82\x84a\x05sV[P\x7F\x16&\xBA~\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x92PPP[\x93\x92PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163\x14a\x05FW`@Q\x7F\xF8}\r\x16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_\x80\x80U`@Q\x7F\xBC\xB8\xB8\xFB\xDE\xA8\xAAm\xC4\xAEA!>M\xA8\x1E`Z=\x1AV\xED\x85\x1B\x93U\x18#!\xC0\x91\x90\x91\x90\xA1V[\x80Q\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x84\x16\x91\x16\x14a\x06wW\x80s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x83_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x06uW`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x12`$\x82\x01R\x7Finvalid sell token\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[\x90[`@Q\x7Fp\xA0\x821\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R0`\x04\x82\x01R_\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x84\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x06\xE1W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\x05\x91\x90a\x1B\xFFV[`@Q\x7Fp\xA0\x821\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R0`\x04\x82\x01R\x90\x91P_\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x84\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07rW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\x96\x91\x90a\x1B\xFFV[\x90P\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x85` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x081W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x11`$\x82\x01R\x7Finvalid buy token\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06lV[`@\x85\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x15a\x08\xB3W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7Freceiver must be zero address\0\0\0`D\x82\x01R`d\x01a\x06lV[a\x08\xBFa\x01,Ba\x1CCV[\x85`\xA0\x01Qc\xFF\xFF\xFF\xFF\x16\x11\x15a\t2W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x1E`$\x82\x01R\x7Fvalidity too far in the future\0\0`D\x82\x01R`d\x01a\x06lV[\x85``\x01Q\x85`\xC0\x01Q\x14a\t\xA3W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0F`$\x82\x01R\x7Finvalid appData\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06lV[`\xE0\x85\x01Q\x15a\n\x0FW`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7Ffee amount must be zero\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06lV[\x7FZ(\xE96;\xB9B\xB69'\0b\xAAk\xB2\x95\xF44\xBC\xDF\xC4,\x97&{\xF0\x03\xF2r\x06\r\xC9\x85a\x01`\x01Q\x14a\n\x9DW`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FbuyTokenBalance must be erc20\0\0\0`D\x82\x01R`d\x01a\x06lV[\x7FZ(\xE96;\xB9B\xB69'\0b\xAAk\xB2\x95\xF44\xBC\xDF\xC4,\x97&{\xF0\x03\xF2r\x06\r\xC9\x85a\x01@\x01Q\x14a\x0B+W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x1E`$\x82\x01R\x7FsellTokenBalance must be erc20\0\0`D\x82\x01R`d\x01a\x06lV[``\x85\x01Qa\x0B:\x90\x82a\x1CVV[`\x80\x86\x01Q``\x87\x01Qa\x0BN\x90\x85a\x1CmV[a\x0BX\x91\x90a\x1CVV[\x10\x15a\x0B\xC0W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7Freceived amount too low\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06lV[PPPPPPV[_\x81`@Q` \x01a\x0B\xDA\x91\x90a\x1C\xCCV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163\x14a\x0CfW`@Q\x7F\xF8}\r\x16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_a\x0Csa\x02\x97\x83a\x1D'V[\x90P\x80_\x81\x90UP\x80\x7FQ\x0EJOv\x90|-aX\xB3C\xF7\xC4\xF2\xF5\x97\xDF8[r|&\xE9\xEF\x90\xE7P\x93\xAC\xE1\x9A\x83`@Qa\x0C\xAB\x91\x90a\x1DyV[`@Q\x80\x91\x03\x90\xA2PPV[`@\x80Qa\x01\x80\x81\x01\x82R_\x80\x82R` \x82\x01\x81\x90R\x91\x81\x01\x82\x90R``\x81\x01\x82\x90R`\x80\x81\x01\x82\x90R`\xA0\x81\x01\x82\x90R`\xC0\x81\x01\x82\x90R`\xE0\x81\x01\x82\x90Ra\x01\0\x81\x01\x82\x90Ra\x01 \x81\x01\x82\x90Ra\x01@\x81\x01\x82\x90Ra\x01`\x81\x01\x91\x90\x91R_\x80\x83` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c5^\xFD\xD9\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x87`@\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\r\x9E\x93\x92\x91\x90a\x1E:V[`@\x80Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\r\xB8W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\r\xDC\x91\x90a\x1ErV[`@Q\x7Fp\xA0\x821\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R0`\x04\x82\x01R\x91\x93P\x91P_\x90\x81\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0EmW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0E\x91\x91\x90a\x1B\xFFV[`@Q\x7Fp\xA0\x821\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R0`\x04\x82\x01R\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0F\x19W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0F=\x91\x90a\x1B\xFFV[\x90\x92P\x90P_\x80\x80\x80\x80a\x0FQ\x88\x88a\x1CVV[\x90P_a\x0F^\x8A\x88a\x1CVV[\x90P_\x82\x82\x10\x15a\x10\x0BW\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x96P\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x95Pa\x0F\xD6a\x0F\xBD`\x02\x8Ba\x1E\xC1V[a\x0F\xD1\x84a\x0F\xCC\x8E`\x02a\x1CVV[a\x13FV[a\x13~V[\x94Pa\x10\x01\x85a\x0F\xE6\x81\x8Da\x1CVV[a\x0F\xF0\x90\x85a\x1CCV[a\x0F\xFA\x8C\x8Fa\x1CVV[`\x01a\x13\xCBV[\x93P\x84\x90Pa\x10\x98V[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x96P\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x95Pa\x10na\x10_`\x02\x8Aa\x1E\xC1V[a\x0F\xD1\x85a\x0F\xCC\x8F`\x02a\x1CVV[\x94Pa\x10\x92\x85a\x10~\x81\x8Ea\x1CVV[a\x10\x88\x90\x86a\x1CCV[a\x0F\xFA\x8B\x8Ea\x1CVV[\x93P\x83\x90P[\x8CQ\x81\x10\x15a\x10\xDFWa\x10\xDF`@Q\x80`@\x01`@R\x80`\x17\x81R` \x01\x7Ftraded amount too small\0\0\0\0\0\0\0\0\0\x81RPa\x14&V[`@Q\x80a\x01\x80\x01`@R\x80\x88s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x87s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x86\x81R` \x01\x85\x81R` \x01a\x11Va\x01,a\x14fV[c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x8E``\x01Q\x81R` \x01_\x81R` \x01\x7F\xF3\xB2wr\x8B?\xEEt\x94\x81\xEB>\x0B;H\x98\r\xBB\xABxe\x8F\xC4\x19\x02\\\xB1n\xEE4gu\x81R` \x01`\x01\x15\x15\x81R` \x01\x7FZ(\xE96;\xB9B\xB69'\0b\xAAk\xB2\x95\xF44\xBC\xDF\xC4,\x97&{\xF0\x03\xF2r\x06\r\xC9\x81R` \x01\x7FZ(\xE96;\xB9B\xB69'\0b\xAAk\xB2\x95\xF44\xBC\xDF\xC4,\x97&{\xF0\x03\xF2r\x06\r\xC9\x81RP\x9BPPPPPPPPPPPP\x91\x90PV[3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x12kW`@Q\x7F\xBF\x84\x89w\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80\x7Fl<\x90$TW\x06\x0Fe\x17x{,K\x8C\xF5\0\xCA\x88\x9D#\x04\xAF\x02\x04;\xD5\xB5\x13\xE3\xB5\x93]PV[\x7Fl<\x90$TW\x06\x0Fe\x17x{,K\x8C\xF5\0\xCA\x88\x9D#\x04\xAF\x02\x04;\xD5\xB5\x13\xE3\xB5\x93\\\x83\x81\x14a\x13@W\x80\x15a\x12\xF2W`@Q\x7F\xDA\xFB\xDD\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_a\x12\xFC\x84a\x0C\xB7V[\x90Pa\x13\x08\x83\x82a\x14\x87V[a\x13>W`@Q\x7F\xD9\xFF$\xC7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P[PPPPV[_\x82\x15a\x13sW\x81a\x13Y`\x01\x85a\x1CmV[a\x13c\x91\x90a\x1E\xC1V[a\x13n\x90`\x01a\x1CCV[a\x13uV[_[\x90P[\x92\x91PPV[_\x81\x83\x10\x15a\x13\xC5Wa\x13\xC5`@Q\x80`@\x01`@R\x80`\x15\x81R` \x01\x7Fsubtraction underflow\0\0\0\0\0\0\0\0\0\0\0\x81RPa\x14&V[P\x90\x03\x90V[_\x80a\x13\xD8\x86\x86\x86a\x15\x99V[\x90P`\x01\x83`\x02\x81\x11\x15a\x13\xEEWa\x13\xEEa\x1E\xD4V[\x14\x80\x15a\x14\nWP_\x84\x80a\x14\x05Wa\x14\x05a\x1E\x94V[\x86\x88\t\x11[\x15a\x14\x1DWa\x14\x1A`\x01\x82a\x1CCV[\x90P[\x95\x94PPPPPV[a\x141C`\x01a\x1CCV[\x81`@Q\x7F\x1F\xE8Pn\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x06l\x92\x91\x90a\x1F\x01V[_\x81\x80a\x14s\x81Ba\x1F\x19V[a\x14}\x91\x90a\x1F;V[a\x13x\x91\x90a\x1FcV[_\x80\x82_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x90P_\x83` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x85` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x90P_\x84``\x01Q\x86``\x01Q\x14\x90P_\x85`\x80\x01Q\x87`\x80\x01Q\x14\x90P_\x86`\xA0\x01Qc\xFF\xFF\xFF\xFF\x16\x88`\xA0\x01Qc\xFF\xFF\xFF\xFF\x16\x14\x90P_\x87a\x01\0\x01Q\x89a\x01\0\x01Q\x14\x90P_\x88a\x01 \x01Q\x15\x15\x8Aa\x01 \x01Q\x15\x15\x14\x90P\x86\x80\x15a\x15^WP\x85[\x80\x15a\x15gWP\x84[\x80\x15a\x15pWP\x83[\x80\x15a\x15yWP\x82[\x80\x15a\x15\x82WP\x81[\x80\x15a\x15\x8BWP\x80[\x9A\x99PPPPPPPPPPV[_\x80\x80\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x85\x87\t\x85\x87\x02\x92P\x82\x81\x10\x83\x82\x03\x03\x91PP\x80_\x03a\x15\xEFW\x83\x82\x81a\x15\xE5Wa\x15\xE5a\x1E\x94V[\x04\x92PPPa\x04\xD0V[\x80\x84\x11a\x16XW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x15`$\x82\x01R\x7FMath: mulDiv overflow\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06lV[_\x84\x86\x88\t`\x02`\x01\x87\x19\x81\x01\x88\x16\x97\x88\x90\x04`\x03\x81\x02\x83\x18\x80\x82\x02\x84\x03\x02\x80\x82\x02\x84\x03\x02\x80\x82\x02\x84\x03\x02\x80\x82\x02\x84\x03\x02\x80\x82\x02\x84\x03\x02\x90\x81\x02\x90\x92\x03\x90\x91\x02_\x88\x90\x03\x88\x90\x04\x90\x91\x01\x85\x83\x11\x90\x94\x03\x93\x90\x93\x02\x93\x03\x94\x90\x94\x04\x91\x90\x91\x17\x02\x94\x93PPPPV[_\x80_`@\x84\x86\x03\x12\x15a\x16\xD1W_\x80\xFD[\x835\x92P` \x84\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x16\xEFW_\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12a\x17\x02W_\x80\xFD[\x815\x81\x81\x11\x15a\x17\x10W_\x80\xFD[\x87` \x82\x85\x01\x01\x11\x15a\x17!W_\x80\xFD[` \x83\x01\x94P\x80\x93PPPP\x92P\x92P\x92V[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[`@Q`\x80\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x17\x84Wa\x17\x84a\x174V[`@R\x90V[`@Qa\x01\x80\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x17\x84Wa\x17\x84a\x174V[`@Q`\x1F\x82\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x17\xF5Wa\x17\xF5a\x174V[`@R\x91\x90PV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x18\x1EW_\x80\xFD[PV[_`\x80\x82\x84\x03\x12\x15a\x181W_\x80\xFD[a\x189a\x17aV[\x90P\x815\x81R` \x80\x83\x015a\x18N\x81a\x17\xFDV[\x82\x82\x01R`@\x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x18lW_\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x18\x7FW_\x80\xFD[\x815\x81\x81\x11\x15a\x18\x91Wa\x18\x91a\x174V[a\x18\xC1\x84\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x84\x01\x16\x01a\x17\xAEV[\x91P\x80\x82R\x86\x84\x82\x85\x01\x01\x11\x15a\x18\xD6W_\x80\xFD[\x80\x84\x84\x01\x85\x84\x017_\x84\x82\x84\x01\x01RP\x80`@\x85\x01RPPP``\x82\x015``\x82\x01R\x92\x91PPV[\x805a\x19\n\x81a\x17\xFDV[\x91\x90PV[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x19\nW_\x80\xFD[\x805\x80\x15\x15\x81\x14a\x19\nW_\x80\xFD[_a\x01\x80\x82\x84\x03\x12\x15a\x19BW_\x80\xFD[a\x19Ja\x17\x8AV[\x90Pa\x19U\x82a\x18\xFFV[\x81Ra\x19c` \x83\x01a\x18\xFFV[` \x82\x01Ra\x19t`@\x83\x01a\x18\xFFV[`@\x82\x01R``\x82\x015``\x82\x01R`\x80\x82\x015`\x80\x82\x01Ra\x19\x99`\xA0\x83\x01a\x19\x0FV[`\xA0\x82\x01R`\xC0\x82\x015`\xC0\x82\x01R`\xE0\x82\x015`\xE0\x82\x01Ra\x01\0\x80\x83\x015\x81\x83\x01RPa\x01 a\x19\xCC\x81\x84\x01a\x19\"V[\x90\x82\x01Ra\x01@\x82\x81\x015\x90\x82\x01Ra\x01`\x91\x82\x015\x91\x81\x01\x91\x90\x91R\x91\x90PV[_\x80a\x01\xA0\x83\x85\x03\x12\x15a\x1A\0W_\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1A\x16W_\x80\xFD[a\x1A\"\x85\x82\x86\x01a\x18!V[\x92PPa\x1A2\x84` \x85\x01a\x191V[\x90P\x92P\x92\x90PV[_` \x82\x84\x03\x12\x15a\x1AKW_\x80\xFD[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1AaW_\x80\xFD[a\x1Am\x84\x82\x85\x01a\x18!V[\x94\x93PPPPV[_` \x82\x84\x03\x12\x15a\x1A\x85W_\x80\xFD[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1A\x9BW_\x80\xFD[\x82\x01`\x80\x81\x85\x03\x12\x15a\x04\xD0W_\x80\xFD[\x81Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81Ra\x01\x80\x81\x01` \x83\x01Qa\x1A\xF2` \x84\x01\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90RV[P`@\x83\x01Qa\x1B\x1A`@\x84\x01\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90RV[P``\x83\x01Q``\x83\x01R`\x80\x83\x01Q`\x80\x83\x01R`\xA0\x83\x01Qa\x1BF`\xA0\x84\x01\x82c\xFF\xFF\xFF\xFF\x16\x90RV[P`\xC0\x83\x01Q`\xC0\x83\x01R`\xE0\x83\x01Q`\xE0\x83\x01Ra\x01\0\x80\x84\x01Q\x81\x84\x01RPa\x01 \x80\x84\x01Qa\x1B{\x82\x85\x01\x82\x15\x15\x90RV[PPa\x01@\x83\x81\x01Q\x90\x83\x01Ra\x01`\x92\x83\x01Q\x92\x90\x91\x01\x91\x90\x91R\x90V[_` \x82\x84\x03\x12\x15a\x1B\xAAW_\x80\xFD[P5\x91\x90PV[_\x80a\x01\xA0\x83\x85\x03\x12\x15a\x1B\xC3W_\x80\xFD[a\x1B\xCD\x84\x84a\x191V[\x91Pa\x01\x80\x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1B\xE9W_\x80\xFD[a\x1B\xF5\x85\x82\x86\x01a\x18!V[\x91PP\x92P\x92\x90PV[_` \x82\x84\x03\x12\x15a\x1C\x0FW_\x80\xFD[PQ\x91\x90PV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x11`\x04R`$_\xFD[\x80\x82\x01\x80\x82\x11\x15a\x13xWa\x13xa\x1C\x16V[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x13xWa\x13xa\x1C\x16V[\x81\x81\x03\x81\x81\x11\x15a\x13xWa\x13xa\x1C\x16V[_\x81Q\x80\x84R\x80` \x84\x01` \x86\x01^_` \x82\x86\x01\x01R` \x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x83\x01\x16\x85\x01\x01\x91PP\x92\x91PPV[` \x81R\x81Q` \x82\x01Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF` \x83\x01Q\x16`@\x82\x01R_`@\x83\x01Q`\x80``\x84\x01Ra\x1D\x11`\xA0\x84\x01\x82a\x1C\x80V[\x90P``\x84\x01Q`\x80\x84\x01R\x80\x91PP\x92\x91PPV[_a\x13x6\x83a\x18!V[\x81\x83R\x81\x81` \x85\x017P_` \x82\x84\x01\x01R_` \x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x84\x01\x16\x84\x01\x01\x90P\x92\x91PPV[` \x81R\x815` \x82\x01R_` \x83\x015a\x1D\x93\x81a\x17\xFDV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16`@\x84\x01RP`@\x83\x015\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE1\x846\x03\x01\x81\x12a\x1D\xE4W_\x80\xFD[\x83\x01` \x81\x01\x905g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1E\0W_\x80\xFD[\x806\x03\x82\x13\x15a\x1E\x0EW_\x80\xFD[`\x80``\x85\x01Ra\x1E#`\xA0\x85\x01\x82\x84a\x1D2V[\x91PP``\x84\x015`\x80\x84\x01R\x80\x91PP\x92\x91PPV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x86\x16\x83R\x80\x85\x16` \x84\x01RP```@\x83\x01Ra\x14\x1D``\x83\x01\x84a\x1C\x80V[_\x80`@\x83\x85\x03\x12\x15a\x1E\x83W_\x80\xFD[PP\x80Q` \x90\x91\x01Q\x90\x92\x90\x91PV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x12`\x04R`$_\xFD[_\x82a\x1E\xCFWa\x1E\xCFa\x1E\x94V[P\x04\x90V[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`!`\x04R`$_\xFD[\x82\x81R`@` \x82\x01R_a\x1Am`@\x83\x01\x84a\x1C\x80V[_c\xFF\xFF\xFF\xFF\x80\x84\x16\x80a\x1F/Wa\x1F/a\x1E\x94V[\x92\x16\x91\x90\x91\x04\x92\x91PPV[c\xFF\xFF\xFF\xFF\x81\x81\x16\x83\x82\x16\x02\x80\x82\x16\x91\x90\x82\x81\x14a\x1F[Wa\x1F[a\x1C\x16V[PP\x92\x91PPV[c\xFF\xFF\xFF\xFF\x81\x81\x16\x83\x82\x16\x01\x90\x80\x82\x11\x15a\x1F\x80Wa\x1F\x80a\x1C\x16V[P\x92\x91PPV\xFE\xA2dipfsX\"\x12 \xE3\xFB\"\x8BR]\x90\xB9B\xC7\xE5\x8F\xE2\xE2\x03J\x17\xBD%\x8C\x08/\xD4w@\xE7d\xA7\xBEE\xBA\xC6dsolcC\0\x08\x19\x003\xA2dipfsX\"\x12 \x11\x90\xCFB\xF9\x89\xCE\xE2?\x12Y|\x8C\x1E\x9D\xAA\xB6\xD8\xC8\x16Q3I\xC3\xCE\x7F\xD2)\xCA\xE5\xB0\xFFdsolcC\0\x08\x19\x003", - ); - /// The runtime bytecode of the contract, as deployed on the network. - /// - /// ```text - ///0x608060405234801561000f575f80fd5b506004361061009f575f3560e01c806337ebdf5011610072578063666e1b3911610058578063666e1b391461014f578063ab221a7614610184578063b5c5f672146101ab575f80fd5b806337ebdf50146101295780635b5d9ee61461013c575f80fd5b80630efe6a8b146100a357806322b155c6146100b857806326e0a196146100f55780632791056514610116575b5f80fd5b6100b66100b13660046111ea565b6101be565b005b6100cb6100c6366004611261565b6102a3565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101086101033660046112fb565b61045f565b6040516100ec9291906114fd565b6100b6610124366004611527565b610797565b6100cb610137366004611549565b61082f565b6100b661014a366004611591565b610a01565b6100cb61015d366004611527565b5f6020819052908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6100cb7f000000000000000000000000000000000000000000000000000000000000000081565b6100b66101b93660046111ea565b610b17565b61024f3384848673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561020d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102319190611617565b73ffffffffffffffffffffffffffffffffffffffff16929190610c46565b61029e3384838673ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561020d573d5f803e3d5ffd5b505050565b5f33807f00000000000000000000000000000000000000000000000000000000000000008c8b6040516102d5906111b9565b73ffffffffffffffffffffffffffffffffffffffff9384168152918316602083015290911660408201526060018190604051809103905ff590508015801561031f573d5f803e3d5ffd5b506040805173ffffffffffffffffffffffffffffffffffffffff8e811682528c81166020830152929450828416928516917f6707255b2c5ca81220b2f3e408a269cb83baa6aa7e5e37aa1756883a6cdf06f1910160405180910390a373ffffffffffffffffffffffffffffffffffffffff8281165f90815260208190526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169183169190911790556103d8828b8a6101be565b5f60405180608001604052808981526020018873ffffffffffffffffffffffffffffffffffffffff16815260200187878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200185905290506104508382610cdb565b50509998505050505050505050565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608101919091526060306104cf6020890189611527565b73ffffffffffffffffffffffffffffffffffffffff1614610551576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f63616e206f6e6c792068616e646c65206f776e206f726465727300000000000060448201526064015b60405180910390fd5b5f61055f6040890189611632565b81019061056c919061175c565b90508873ffffffffffffffffffffffffffffffffffffffff1663eec50b976040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105db919061185a565b6040517fb09aaaca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b169063b09aaaca9061062d9085906004016118c3565b602060405180830381865afa158015610648573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061066c919061185a565b146106d3576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f696e76616c69642074726164696e6720706172616d65746572730000000000006044820152606401610548565b6040517fe3e6f5b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a169063e3e6f5b2906107259084906004016118c3565b61018060405180830381865afa158015610741573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061076591906118f7565b9250828160405160200161077a9291906119b3565b604051602081830303815290604052915050965096945050505050565b73ffffffffffffffffffffffffffffffffffffffff8082165f9081526020819052604090205482911633146108225773ffffffffffffffffffffffffffffffffffffffff8181165f90815260208190526040908190205490517f68bafff800000000000000000000000000000000000000000000000000000000815291166004820152602401610548565b61082b82610e05565b5050565b5f807fff000000000000000000000000000000000000000000000000000000000000003073ffffffffffffffffffffffffffffffffffffffff8716604051610879602082016111b9565b8181037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09081018352601f90910116604081815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166020840152808b169183019190915288166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261093a92916020016119eb565b604051602081830303815290604052805190602001206040516020016109c294939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052805160209091012095945050505050565b73ffffffffffffffffffffffffffffffffffffffff8087165f908152602081905260409020548791163314610a8c5773ffffffffffffffffffffffffffffffffffffffff8181165f90815260208190526040908190205490517f68bafff800000000000000000000000000000000000000000000000000000000815291166004820152602401610548565b5f60405180608001604052808881526020018773ffffffffffffffffffffffffffffffffffffffff16815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020018490529050610b0388610e05565b610b0d8882610cdb565b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8084165f908152602081905260409020548491163314610ba25773ffffffffffffffffffffffffffffffffffffffff8181165f90815260208190526040908190205490517f68bafff800000000000000000000000000000000000000000000000000000000815291166004820152602401610548565b610bf18433858773ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561020d573d5f803e3d5ffd5b610c408433848773ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561020d573d5f803e3d5ffd5b50505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052610c40908590610ea3565b6040517fc5f3d25400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063c5f3d25490610d2d9084906004016118c3565b5f604051808303815f87803b158015610d44575f80fd5b505af1158015610d56573d5f803e3d5ffd5b5050604080516060810182523081525f6020808301829052835191955073ffffffffffffffffffffffffffffffffffffffff881694507f2cceac5555b0ca45a3744ced542f54b56ad2eb45e521962372eef212a2cbf36193830191610dbd918891016118c3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152915251610df891906119ff565b60405180910390a2505050565b8073ffffffffffffffffffffffffffffffffffffffff166317700f016040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610e4a575f80fd5b505af1158015610e5c573d5f803e3d5ffd5b505060405173ffffffffffffffffffffffffffffffffffffffff841692507fc75bf4f03c02fab9414a7d7a54048c0486722bc72f33ad924709a0593608ad2791505f90a250565b5f610f04826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610fb09092919063ffffffff16565b905080515f1480610f24575080806020019051810190610f249190611a43565b61029e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610548565b6060610fbe84845f85610fc6565b949350505050565b606082471015611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610548565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516110809190611a5c565b5f6040518083038185875af1925050503d805f81146110ba576040519150601f19603f3d011682016040523d82523d5f602084013e6110bf565b606091505b50915091506110d0878383876110db565b979650505050505050565b606083156111705782515f036111695773ffffffffffffffffffffffffffffffffffffffff85163b611169576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610548565b5081610fbe565b610fbe83838151156111855781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105489190611a67565b61267880611a7a83390190565b73ffffffffffffffffffffffffffffffffffffffff811681146111e7575f80fd5b50565b5f805f606084860312156111fc575f80fd5b8335611207816111c6565b95602085013595506040909401359392505050565b5f8083601f84011261122c575f80fd5b50813567ffffffffffffffff811115611243575f80fd5b60208301915083602082850101111561125a575f80fd5b9250929050565b5f805f805f805f805f6101008a8c03121561127a575f80fd5b8935611285816111c6565b985060208a0135975060408a013561129c816111c6565b965060608a0135955060808a0135945060a08a01356112ba816111c6565b935060c08a013567ffffffffffffffff8111156112d5575f80fd5b6112e18c828d0161121c565b9a9d999c50979a9699959894979660e00135949350505050565b5f805f805f8060808789031215611310575f80fd5b863561131b816111c6565b9550602087013567ffffffffffffffff80821115611337575f80fd5b908801906060828b03121561134a575f80fd5b9095506040880135908082111561135f575f80fd5b61136b8a838b0161121c565b90965094506060890135915080821115611383575f80fd5b818901915089601f830112611396575f80fd5b8135818111156113a4575f80fd5b8a60208260051b85010111156113b8575f80fd5b6020830194508093505050509295509295509295565b805173ffffffffffffffffffffffffffffffffffffffff168252602081015161140f602084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040810151611437604084018273ffffffffffffffffffffffffffffffffffffffff169052565b50606081015160608301526080810151608083015260a081015161146360a084018263ffffffff169052565b5060c081015160c083015260e081015160e0830152610100808201518184015250610120808201516114988285018215159052565b5050610140818101519083015261016090810151910152565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b5f6101a061150b83866113ce565b8061018084015261151e818401856114b1565b95945050505050565b5f60208284031215611537575f80fd5b8135611542816111c6565b9392505050565b5f805f6060848603121561155b575f80fd5b8335611566816111c6565b92506020840135611576816111c6565b91506040840135611586816111c6565b809150509250925092565b5f805f805f8060a087890312156115a6575f80fd5b86356115b1816111c6565b95506020870135945060408701356115c8816111c6565b9350606087013567ffffffffffffffff8111156115e3575f80fd5b6115ef89828a0161121c565b979a9699509497949695608090950135949350505050565b8051611612816111c6565b919050565b5f60208284031215611627575f80fd5b8151611542816111c6565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611665575f80fd5b83018035915067ffffffffffffffff82111561167f575f80fd5b60200191503681900382131561125a575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156116e3576116e3611693565b60405290565b604051610180810167ffffffffffffffff811182821017156116e3576116e3611693565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561175457611754611693565b604052919050565b5f602080838503121561176d575f80fd5b823567ffffffffffffffff80821115611784575f80fd5b9084019060808287031215611797575f80fd5b61179f6116c0565b82358152838301356117b0816111c6565b818501526040830135828111156117c5575f80fd5b8301601f810188136117d5575f80fd5b8035838111156117e7576117e7611693565b611817867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161170d565b9350808452888682840101111561182c575f80fd5b80868301878601375f8682860101525050816040820152606083013560608201528094505050505092915050565b5f6020828403121561186a575f80fd5b5051919050565b8051825273ffffffffffffffffffffffffffffffffffffffff60208201511660208301525f6040820151608060408501526118af60808501826114b1565b606093840151949093019390935250919050565b602081525f6115426020830184611871565b805163ffffffff81168114611612575f80fd5b80518015158114611612575f80fd5b5f6101808284031215611908575f80fd5b6119106116e9565b61191983611607565b815261192760208401611607565b602082015261193860408401611607565b6040820152606083015160608201526080830151608082015261195d60a084016118d5565b60a082015260c083015160c082015260e083015160e08201526101008084015181830152506101206119908185016118e8565b908201526101408381015190820152610160928301519281019290925250919050565b5f6101a06119c183866113ce565b8061018084015261151e81840185611871565b5f81518060208401855e5f93019283525090919050565b5f610fbe6119f983866119d4565b846119d4565b6020815273ffffffffffffffffffffffffffffffffffffffff8251166020820152602082015160408201525f6040830151606080840152610fbe60808401826114b1565b5f60208284031215611a53575f80fd5b611542826118e8565b5f61154282846119d4565b602081525f61154260208301846114b156fe610120604052348015610010575f80fd5b5060405161267838038061267883398101604081905261002f9161052f565b6001600160a01b03831660808190526040805163f698da2560e01b8152905163f698da259160048082019260209290919082900301815f875af1158015610078573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061009c9190610579565b610100526100aa823361015f565b6100b4813361015f565b336001600160a01b031660e0816001600160a01b0316815250505f836001600160a01b0316639b552cc26040518163ffffffff1660e01b81526004016020604051808303815f875af115801561010c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101309190610590565b905061013c838261015f565b610146828261015f565b506001600160a01b0391821660a0521660c0525061061c565b6101746001600160a01b038316825f19610178565b5050565b8015806101f05750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156101ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ee9190610579565b155b6102675760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084015b60405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526102bd9185916102c216565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201525f9061030e906001600160a01b03851690849061038d565b905080515f148061032e57508080602001905181019061032e91906105b2565b6102bd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161025e565b606061039b84845f856103a3565b949350505050565b6060824710156104045760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161025e565b5f80866001600160a01b0316858760405161041f91906105d1565b5f6040518083038185875af1925050503d805f8114610459576040519150601f19603f3d011682016040523d82523d5f602084013e61045e565b606091505b5090925090506104708783838761047b565b979650505050505050565b606083156104e95782515f036104e2576001600160a01b0385163b6104e25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161025e565b508161039b565b61039b83838151156104fe5781518083602001fd5b8060405162461bcd60e51b815260040161025e91906105e7565b6001600160a01b038116811461052c575f80fd5b50565b5f805f60608486031215610541575f80fd5b835161054c81610518565b602085015190935061055d81610518565b604085015190925061056e81610518565b809150509250925092565b5f60208284031215610589575f80fd5b5051919050565b5f602082840312156105a0575f80fd5b81516105ab81610518565b9392505050565b5f602082840312156105c2575f80fd5b815180151581146105ab575f80fd5b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051611fbd6106bb5f395f81816102db015261042b01525f8181610236015281816104d90152610bf901525f81816102b40152818161059901528181610d5c01528181610ebf01528181610f8e015261100d01525f81816101380152818161057701528181610d3b01528181610e2801528181610f6b015261103001525f818161032201526112140152611fbd5ff3fe608060405234801561000f575f80fd5b506004361061012f575f3560e01c8063b09aaaca116100ad578063e3e6f5b21161007d578063eec50b9711610063578063eec50b9714610344578063f14fcbc81461034c578063ff2dbc9814610203575f80fd5b8063e3e6f5b2146102fd578063e516715b1461031d575f80fd5b8063b09aaaca14610289578063c5f3d2541461029c578063d21220a7146102af578063d25e0cb6146102d6575f80fd5b80631c7de94111610102578063481c6a75116100e8578063481c6a7514610231578063981a160b14610258578063a029a8d414610276575f80fd5b80631c7de941146102035780633e706e321461020a575f80fd5b80630dfe1681146101335780631303a484146101845780631626ba7e146101b557806317700f01146101f9575b5f80fd5b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b7f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b5935c5b60405190815260200161017b565b6101c86101c33660046116bf565b61035f565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161017b565b6102016104d7565b005b6101a75f81565b6101a77f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b59381565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b61026161012c81565b60405163ffffffff909116815260200161017b565b6102016102843660046119ee565b610573565b6101a7610297366004611a3b565b610bc8565b6102016102aa366004611a75565b610bf7565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b6101a77f000000000000000000000000000000000000000000000000000000000000000081565b61031061030b366004611a3b565b610cb7565b60405161017b9190611aac565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b6101a75f5481565b61020161035a366004611b9a565b6111fc565b5f808061036e84860186611bb1565b915091505f5461037d82610bc8565b146103b4576040517ff1a6789000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0820180517fd5a25ba2e97094ad7d83dc28a6572da797d6b3e7fc6663bd93efb789fc17e48982526101a0822091526040517f190100000000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006002820152602281019190915260429020868114610494576040517f593fcacd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f818385611291565b6104a98284610573565b507f1626ba7e00000000000000000000000000000000000000000000000000000000925050505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610546576040517ff87d0d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080556040517fbcb8b8fbdea8aa6dc4ae41213e4da81e605a3d1a56ed851b9355182321c091909190a1565b80517f0000000000000000000000000000000000000000000000000000000000000000907f00000000000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff808416911614610677578073ffffffffffffffffffffffffffffffffffffffff16835f015173ffffffffffffffffffffffffffffffffffffffff1614610675576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c69642073656c6c20746f6b656e000000000000000000000000000060448201526064015b60405180910390fd5b905b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190611bff565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091505f9073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015610772573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107969190611bff565b90508273ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff1614610831576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f696e76616c69642062757920746f6b656e000000000000000000000000000000604482015260640161066c565b604085015173ffffffffffffffffffffffffffffffffffffffff16156108b3576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7265636569766572206d757374206265207a65726f2061646472657373000000604482015260640161066c565b6108bf61012c42611c43565b8560a0015163ffffffff161115610932576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f76616c696469747920746f6f2066617220696e20746865206675747572650000604482015260640161066c565b85606001518560c00151146109a3576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c696420617070446174610000000000000000000000000000000000604482015260640161066c565b60e085015115610a0f576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f66656520616d6f756e74206d757374206265207a65726f000000000000000000604482015260640161066c565b7f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc985610160015114610a9d576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f627579546f6b656e42616c616e6365206d757374206265206572633230000000604482015260640161066c565b7f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc985610140015114610b2b576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f73656c6c546f6b656e42616c616e6365206d7573742062652065726332300000604482015260640161066c565b6060850151610b3a9082611c56565b60808601516060870151610b4e9085611c6d565b610b589190611c56565b1015610bc0576040517fc8fc272500000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f726563656976656420616d6f756e7420746f6f206c6f77000000000000000000604482015260640161066c565b505050505050565b5f81604051602001610bda9190611ccc565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610c66576040517ff87d0d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610c7361029783611d27565b9050805f81905550807f510e4a4f76907c2d6158b343f7c4f2f597df385b727c26e9ef90e75093ace19a83604051610cab9190611d79565b60405180910390a25050565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608101919091525f80836020015173ffffffffffffffffffffffffffffffffffffffff1663355efdd97f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000087604001516040518463ffffffff1660e01b8152600401610d9e93929190611e3a565b6040805180830381865afa158015610db8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddc9190611e72565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291935091505f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610e6d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e919190611bff565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610f19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f3d9190611bff565b90925090505f80808080610f518888611c56565b90505f610f5e8a88611c56565b90505f8282101561100b577f000000000000000000000000000000000000000000000000000000000000000096507f00000000000000000000000000000000000000000000000000000000000000009550610fd6610fbd60028b611ec1565b610fd184610fcc8e6002611c56565b611346565b61137e565b945061100185610fe6818d611c56565b610ff09085611c43565b610ffa8c8f611c56565b60016113cb565b9350849050611098565b7f000000000000000000000000000000000000000000000000000000000000000096507f0000000000000000000000000000000000000000000000000000000000000000955061106e61105f60028a611ec1565b610fd185610fcc8f6002611c56565b94506110928561107e818e611c56565b6110889086611c43565b610ffa8b8e611c56565b93508390505b8c518110156110df576110df6040518060400160405280601781526020017f74726164656420616d6f756e7420746f6f20736d616c6c000000000000000000815250611426565b6040518061018001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200161115661012c611466565b63ffffffff1681526020018e6060015181526020015f81526020017ff3b277728b3fee749481eb3e0b3b48980dbbab78658fc419025cb16eee34677581526020016001151581526020017f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc981526020017f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc98152509b505050505050505050505050919050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461126b576040517fbf84897700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b807f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b5935d50565b7f6c3c90245457060f6517787b2c4b8cf500ca889d2304af02043bd5b513e3b5935c8381146113405780156112f2576040517fdafbdd1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6112fc84610cb7565b90506113088382611487565b61133e576040517fd9ff24c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b50505050565b5f82156113735781611359600185611c6d565b6113639190611ec1565b61136e906001611c43565b611375565b5f5b90505b92915050565b5f818310156113c5576113c56040518060400160405280601581526020017f7375627472616374696f6e20756e646572666c6f770000000000000000000000815250611426565b50900390565b5f806113d8868686611599565b905060018360028111156113ee576113ee611ed4565b14801561140a57505f848061140557611405611e94565b868809115b1561141d5761141a600182611c43565b90505b95945050505050565b611431436001611c43565b816040517f1fe8506e00000000000000000000000000000000000000000000000000000000815260040161066c929190611f01565b5f81806114738142611f19565b61147d9190611f3b565b6113789190611f63565b5f80825f015173ffffffffffffffffffffffffffffffffffffffff16845f015173ffffffffffffffffffffffffffffffffffffffff161490505f836020015173ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff161490505f846060015186606001511490505f856080015187608001511490505f8660a0015163ffffffff168860a0015163ffffffff161490505f8761010001518961010001511490505f88610120015115158a6101200151151514905086801561155e5750855b80156115675750845b80156115705750835b80156115795750825b80156115825750815b801561158b5750805b9a9950505050505050505050565b5f80807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709858702925082811083820303915050805f036115ef578382816115e5576115e5611e94565b04925050506104d0565b808411611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f770000000000000000000000604482015260640161066c565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f805f604084860312156116d1575f80fd5b83359250602084013567ffffffffffffffff808211156116ef575f80fd5b818601915086601f830112611702575f80fd5b813581811115611710575f80fd5b876020828501011115611721575f80fd5b6020830194508093505050509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff8111828210171561178457611784611734565b60405290565b604051610180810167ffffffffffffffff8111828210171561178457611784611734565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156117f5576117f5611734565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461181e575f80fd5b50565b5f60808284031215611831575f80fd5b611839611761565b90508135815260208083013561184e816117fd565b82820152604083013567ffffffffffffffff8082111561186c575f80fd5b818501915085601f83011261187f575f80fd5b81358181111561189157611891611734565b6118c1847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016117ae565b915080825286848285010111156118d6575f80fd5b80848401858401375f848284010152508060408501525050506060820135606082015292915050565b803561190a816117fd565b919050565b803563ffffffff8116811461190a575f80fd5b8035801515811461190a575f80fd5b5f6101808284031215611942575f80fd5b61194a61178a565b9050611955826118ff565b8152611963602083016118ff565b6020820152611974604083016118ff565b6040820152606082013560608201526080820135608082015261199960a0830161190f565b60a082015260c082013560c082015260e082013560e08201526101008083013581830152506101206119cc818401611922565b9082015261014082810135908201526101609182013591810191909152919050565b5f806101a08385031215611a00575f80fd5b823567ffffffffffffffff811115611a16575f80fd5b611a2285828601611821565b925050611a328460208501611931565b90509250929050565b5f60208284031215611a4b575f80fd5b813567ffffffffffffffff811115611a61575f80fd5b611a6d84828501611821565b949350505050565b5f60208284031215611a85575f80fd5b813567ffffffffffffffff811115611a9b575f80fd5b8201608081850312156104d0575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff16815261018081016020830151611af2602084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040830151611b1a604084018273ffffffffffffffffffffffffffffffffffffffff169052565b50606083015160608301526080830151608083015260a0830151611b4660a084018263ffffffff169052565b5060c083015160c083015260e083015160e083015261010080840151818401525061012080840151611b7b8285018215159052565b5050610140838101519083015261016092830151929091019190915290565b5f60208284031215611baa575f80fd5b5035919050565b5f806101a08385031215611bc3575f80fd5b611bcd8484611931565b915061018083013567ffffffffffffffff811115611be9575f80fd5b611bf585828601611821565b9150509250929050565b5f60208284031215611c0f575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561137857611378611c16565b808202811582820484141761137857611378611c16565b8181038181111561137857611378611c16565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081528151602082015273ffffffffffffffffffffffffffffffffffffffff60208301511660408201525f604083015160806060840152611d1160a0840182611c80565b9050606084015160808401528091505092915050565b5f6113783683611821565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60208152813560208201525f6020830135611d93816117fd565b73ffffffffffffffffffffffffffffffffffffffff811660408401525060408301357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611de4575f80fd5b830160208101903567ffffffffffffffff811115611e00575f80fd5b803603821315611e0e575f80fd5b60806060850152611e2360a085018284611d32565b915050606084013560808401528091505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff80861683528085166020840152506060604083015261141d6060830184611c80565b5f8060408385031215611e83575f80fd5b505080516020909101519092909150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82611ecf57611ecf611e94565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b828152604060208201525f611a6d6040830184611c80565b5f63ffffffff80841680611f2f57611f2f611e94565b92169190910492915050565b63ffffffff818116838216028082169190828114611f5b57611f5b611c16565b505092915050565b63ffffffff818116838216019080821115611f8057611f80611c16565b509291505056fea2646970667358221220e3fb228b525d90b942c7e58fe2e2034a17bd258c082fd47740e764a7be45bac664736f6c63430008190033a26469706673582212201190cf42f989cee23f12597c8c1e9daab6d8c816513349c3ce7fd229cae5b0ff64736f6c63430008190033 - /// ``` - #[rustfmt::skip] - #[allow(clippy::all)] - pub static DEPLOYED_BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"`\x80`@R4\x80\x15a\0\x0FW_\x80\xFD[P`\x046\x10a\0\x9FW_5`\xE0\x1C\x80c7\xEB\xDFP\x11a\0rW\x80cfn\x1B9\x11a\0XW\x80cfn\x1B9\x14a\x01OW\x80c\xAB\"\x1Av\x14a\x01\x84W\x80c\xB5\xC5\xF6r\x14a\x01\xABW_\x80\xFD[\x80c7\xEB\xDFP\x14a\x01)W\x80c[]\x9E\xE6\x14a\x01=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x021\x91\x90a\x16\x17V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x92\x91\x90a\x0CFV[a\x02\x9E3\x84\x83\x86s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xD2\x12 \xA7`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x02\rW=_\x80>=_\xFD[PPPV[_3\x80\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x8C\x8B`@Qa\x02\xD5\x90a\x11\xB9V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x93\x84\x16\x81R\x91\x83\x16` \x83\x01R\x90\x91\x16`@\x82\x01R``\x01\x81\x90`@Q\x80\x91\x03\x90_\xF5\x90P\x80\x15\x80\x15a\x03\x1FW=_\x80>=_\xFD[P`@\x80Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x8E\x81\x16\x82R\x8C\x81\x16` \x83\x01R\x92\x94P\x82\x84\x16\x92\x85\x16\x91\x7Fg\x07%[,\\\xA8\x12 \xB2\xF3\xE4\x08\xA2i\xCB\x83\xBA\xA6\xAA~^7\xAA\x17V\x88:l\xDF\x06\xF1\x91\x01`@Q\x80\x91\x03\x90\xA3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x81\x16_\x90\x81R` \x81\x90R`@\x90 \x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x91\x83\x16\x91\x90\x91\x17\x90Ua\x03\xD8\x82\x8B\x8Aa\x01\xBEV[_`@Q\x80`\x80\x01`@R\x80\x89\x81R` \x01\x88s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x87\x87\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x92\x01\x91\x90\x91RPPP\x90\x82RP` \x01\x85\x90R\x90Pa\x04P\x83\x82a\x0C\xDBV[PP\x99\x98PPPPPPPPPV[`@\x80Qa\x01\x80\x81\x01\x82R_\x80\x82R` \x82\x01\x81\x90R\x91\x81\x01\x82\x90R``\x81\x01\x82\x90R`\x80\x81\x01\x82\x90R`\xA0\x81\x01\x82\x90R`\xC0\x81\x01\x82\x90R`\xE0\x81\x01\x82\x90Ra\x01\0\x81\x01\x82\x90Ra\x01 \x81\x01\x82\x90Ra\x01@\x81\x01\x82\x90Ra\x01`\x81\x01\x91\x90\x91R``0a\x04\xCF` \x89\x01\x89a\x15'V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x05QW`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x1A`$\x82\x01R\x7Fcan only handle own orders\0\0\0\0\0\0`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[_a\x05_`@\x89\x01\x89a\x162V[\x81\x01\x90a\x05l\x91\x90a\x17\\V[\x90P\x88s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xEE\xC5\x0B\x97`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x05\xB7W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\xDB\x91\x90a\x18ZV[`@Q\x7F\xB0\x9A\xAA\xCA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x8B\x16\x90c\xB0\x9A\xAA\xCA\x90a\x06-\x90\x85\x90`\x04\x01a\x18\xC3V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x06HW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x06l\x91\x90a\x18ZV[\x14a\x06\xD3W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x1A`$\x82\x01R\x7Finvalid trading parameters\0\0\0\0\0\0`D\x82\x01R`d\x01a\x05HV[`@Q\x7F\xE3\xE6\xF5\xB2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x8A\x16\x90c\xE3\xE6\xF5\xB2\x90a\x07%\x90\x84\x90`\x04\x01a\x18\xC3V[a\x01\x80`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07AW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07e\x91\x90a\x18\xF7V[\x92P\x82\x81`@Q` \x01a\x07z\x92\x91\x90a\x19\xB3V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91PP\x96P\x96\x94PPPPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x16_\x90\x81R` \x81\x90R`@\x90 T\x82\x91\x163\x14a\x08\"Ws\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x81\x16_\x90\x81R` \x81\x90R`@\x90\x81\x90 T\x90Q\x7Fh\xBA\xFF\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R\x91\x16`\x04\x82\x01R`$\x01a\x05HV[a\x08+\x82a\x0E\x05V[PPV[_\x80\x7F\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x87\x16`@Qa\x08y` \x82\x01a\x11\xB9V[\x81\x81\x03\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x90\x81\x01\x83R`\x1F\x90\x91\x01\x16`@\x81\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81\x16` \x84\x01R\x80\x8B\x16\x91\x83\x01\x91\x90\x91R\x88\x16``\x82\x01R`\x80\x01`@\x80Q\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x81\x84\x03\x01\x81R\x90\x82\x90Ra\t:\x92\x91` \x01a\x19\xEBV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 `@Q` \x01a\t\xC2\x94\x93\x92\x91\x90\x7F\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x94\x90\x94\x16\x84R``\x92\x90\x92\x1B\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\x16`\x01\x84\x01R`\x15\x83\x01R`5\x82\x01R`U\x01\x90V[`@\x80Q\x80\x83\x03\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x01\x81R\x91\x90R\x80Q` \x90\x91\x01 \x95\x94PPPPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x87\x16_\x90\x81R` \x81\x90R`@\x90 T\x87\x91\x163\x14a\n\x8CWs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x81\x16_\x90\x81R` \x81\x90R`@\x90\x81\x90 T\x90Q\x7Fh\xBA\xFF\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R\x91\x16`\x04\x82\x01R`$\x01a\x05HV[_`@Q\x80`\x80\x01`@R\x80\x88\x81R` \x01\x87s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x86\x86\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847_\x92\x01\x91\x90\x91RPPP\x90\x82RP` \x01\x84\x90R\x90Pa\x0B\x03\x88a\x0E\x05V[a\x0B\r\x88\x82a\x0C\xDBV[PPPPPPPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x84\x16_\x90\x81R` \x81\x90R`@\x90 T\x84\x91\x163\x14a\x0B\xA2Ws\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x81\x16_\x90\x81R` \x81\x90R`@\x90\x81\x90 T\x90Q\x7Fh\xBA\xFF\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R\x91\x16`\x04\x82\x01R`$\x01a\x05HV[a\x0B\xF1\x843\x85\x87s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\r\xFE\x16\x81`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x02\rW=_\x80>=_\xFD[a\x0C@\x843\x84\x87s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xD2\x12 \xA7`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x02\rW=_\x80>=_\xFD[PPPPV[`@\x80Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x85\x81\x16`$\x83\x01R\x84\x16`D\x82\x01R`d\x80\x82\x01\x84\x90R\x82Q\x80\x83\x03\x90\x91\x01\x81R`\x84\x90\x91\x01\x90\x91R` \x81\x01\x80Q{\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F#\xB8r\xDD\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x17\x90Ra\x0C@\x90\x85\x90a\x0E\xA3V[`@Q\x7F\xC5\xF3\xD2T\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16\x90c\xC5\xF3\xD2T\x90a\r-\x90\x84\x90`\x04\x01a\x18\xC3V[_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\rDW_\x80\xFD[PZ\xF1\x15\x80\x15a\rVW=_\x80>=_\xFD[PP`@\x80Q``\x81\x01\x82R0\x81R_` \x80\x83\x01\x82\x90R\x83Q\x91\x95Ps\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x88\x16\x94P\x7F,\xCE\xACUU\xB0\xCAE\xA3tL\xEDT/T\xB5j\xD2\xEBE\xE5!\x96#r\xEE\xF2\x12\xA2\xCB\xF3a\x93\x83\x01\x91a\r\xBD\x91\x88\x91\x01a\x18\xC3V[`@\x80Q\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x81\x84\x03\x01\x81R\x91\x81R\x91RQa\r\xF8\x91\x90a\x19\xFFV[`@Q\x80\x91\x03\x90\xA2PPPV[\x80s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x17p\x0F\x01`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\x0EJW_\x80\xFD[PZ\xF1\x15\x80\x15a\x0E\\W=_\x80>=_\xFD[PP`@Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x84\x16\x92P\x7F\xC7[\xF4\xF0<\x02\xFA\xB9AJ}zT\x04\x8C\x04\x86r+\xC7/3\xAD\x92G\t\xA0Y6\x08\xAD'\x91P_\x90\xA2PV[_a\x0F\x04\x82`@Q\x80`@\x01`@R\x80` \x81R` \x01\x7FSafeERC20: low-level call failed\x81RP\x85s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a\x0F\xB0\x90\x92\x91\x90c\xFF\xFF\xFF\xFF\x16V[\x90P\x80Q_\x14\x80a\x0F$WP\x80\x80` \x01\x90Q\x81\x01\x90a\x0F$\x91\x90a\x1ACV[a\x02\x9EW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`*`$\x82\x01R\x7FSafeERC20: ERC20 operation did n`D\x82\x01R\x7Fot succeed\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`d\x82\x01R`\x84\x01a\x05HV[``a\x0F\xBE\x84\x84_\x85a\x0F\xC6V[\x94\x93PPPPV[``\x82G\x10\x15a\x10XW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`&`$\x82\x01R\x7FAddress: insufficient balance fo`D\x82\x01R\x7Fr call\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`d\x82\x01R`\x84\x01a\x05HV[_\x80\x86s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x85\x87`@Qa\x10\x80\x91\x90a\x1A\\V[_`@Q\x80\x83\x03\x81\x85\x87Z\xF1\x92PPP=\x80_\x81\x14a\x10\xBAW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a\x10\xBFV[``\x91P[P\x91P\x91Pa\x10\xD0\x87\x83\x83\x87a\x10\xDBV[\x97\x96PPPPPPPV[``\x83\x15a\x11pW\x82Q_\x03a\x11iWs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x85\x16;a\x11iW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FAddress: call to non-contract\0\0\0`D\x82\x01R`d\x01a\x05HV[P\x81a\x0F\xBEV[a\x0F\xBE\x83\x83\x81Q\x15a\x11\x85W\x81Q\x80\x83` \x01\xFD[\x80`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x05H\x91\x90a\x1AgV[a&x\x80a\x1Az\x839\x01\x90V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x11\xE7W_\x80\xFD[PV[_\x80_``\x84\x86\x03\x12\x15a\x11\xFCW_\x80\xFD[\x835a\x12\x07\x81a\x11\xC6V[\x95` \x85\x015\x95P`@\x90\x94\x015\x93\x92PPPV[_\x80\x83`\x1F\x84\x01\x12a\x12,W_\x80\xFD[P\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x12CW_\x80\xFD[` \x83\x01\x91P\x83` \x82\x85\x01\x01\x11\x15a\x12ZW_\x80\xFD[\x92P\x92\x90PV[_\x80_\x80_\x80_\x80_a\x01\0\x8A\x8C\x03\x12\x15a\x12zW_\x80\xFD[\x895a\x12\x85\x81a\x11\xC6V[\x98P` \x8A\x015\x97P`@\x8A\x015a\x12\x9C\x81a\x11\xC6V[\x96P``\x8A\x015\x95P`\x80\x8A\x015\x94P`\xA0\x8A\x015a\x12\xBA\x81a\x11\xC6V[\x93P`\xC0\x8A\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x12\xD5W_\x80\xFD[a\x12\xE1\x8C\x82\x8D\x01a\x12\x1CV[\x9A\x9D\x99\x9CP\x97\x9A\x96\x99\x95\x98\x94\x97\x96`\xE0\x015\x94\x93PPPPV[_\x80_\x80_\x80`\x80\x87\x89\x03\x12\x15a\x13\x10W_\x80\xFD[\x865a\x13\x1B\x81a\x11\xC6V[\x95P` \x87\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x137W_\x80\xFD[\x90\x88\x01\x90``\x82\x8B\x03\x12\x15a\x13JW_\x80\xFD[\x90\x95P`@\x88\x015\x90\x80\x82\x11\x15a\x13_W_\x80\xFD[a\x13k\x8A\x83\x8B\x01a\x12\x1CV[\x90\x96P\x94P``\x89\x015\x91P\x80\x82\x11\x15a\x13\x83W_\x80\xFD[\x81\x89\x01\x91P\x89`\x1F\x83\x01\x12a\x13\x96W_\x80\xFD[\x815\x81\x81\x11\x15a\x13\xA4W_\x80\xFD[\x8A` \x82`\x05\x1B\x85\x01\x01\x11\x15a\x13\xB8W_\x80\xFD[` \x83\x01\x94P\x80\x93PPPP\x92\x95P\x92\x95P\x92\x95V[\x80Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x82R` \x81\x01Qa\x14\x0F` \x84\x01\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90RV[P`@\x81\x01Qa\x147`@\x84\x01\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90RV[P``\x81\x01Q``\x83\x01R`\x80\x81\x01Q`\x80\x83\x01R`\xA0\x81\x01Qa\x14c`\xA0\x84\x01\x82c\xFF\xFF\xFF\xFF\x16\x90RV[P`\xC0\x81\x01Q`\xC0\x83\x01R`\xE0\x81\x01Q`\xE0\x83\x01Ra\x01\0\x80\x82\x01Q\x81\x84\x01RPa\x01 \x80\x82\x01Qa\x14\x98\x82\x85\x01\x82\x15\x15\x90RV[PPa\x01@\x81\x81\x01Q\x90\x83\x01Ra\x01`\x90\x81\x01Q\x91\x01RV[_\x81Q\x80\x84R\x80` \x84\x01` \x86\x01^_` \x82\x86\x01\x01R` \x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x83\x01\x16\x85\x01\x01\x91PP\x92\x91PPV[_a\x01\xA0a\x15\x0B\x83\x86a\x13\xCEV[\x80a\x01\x80\x84\x01Ra\x15\x1E\x81\x84\x01\x85a\x14\xB1V[\x95\x94PPPPPV[_` \x82\x84\x03\x12\x15a\x157W_\x80\xFD[\x815a\x15B\x81a\x11\xC6V[\x93\x92PPPV[_\x80_``\x84\x86\x03\x12\x15a\x15[W_\x80\xFD[\x835a\x15f\x81a\x11\xC6V[\x92P` \x84\x015a\x15v\x81a\x11\xC6V[\x91P`@\x84\x015a\x15\x86\x81a\x11\xC6V[\x80\x91PP\x92P\x92P\x92V[_\x80_\x80_\x80`\xA0\x87\x89\x03\x12\x15a\x15\xA6W_\x80\xFD[\x865a\x15\xB1\x81a\x11\xC6V[\x95P` \x87\x015\x94P`@\x87\x015a\x15\xC8\x81a\x11\xC6V[\x93P``\x87\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x15\xE3W_\x80\xFD[a\x15\xEF\x89\x82\x8A\x01a\x12\x1CV[\x97\x9A\x96\x99P\x94\x97\x94\x96\x95`\x80\x90\x95\x015\x94\x93PPPPV[\x80Qa\x16\x12\x81a\x11\xC6V[\x91\x90PV[_` \x82\x84\x03\x12\x15a\x16'W_\x80\xFD[\x81Qa\x15B\x81a\x11\xC6V[_\x80\x835\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE1\x846\x03\x01\x81\x12a\x16eW_\x80\xFD[\x83\x01\x805\x91Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a\x16\x7FW_\x80\xFD[` \x01\x91P6\x81\x90\x03\x82\x13\x15a\x12ZW_\x80\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[`@Q`\x80\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x16\xE3Wa\x16\xE3a\x16\x93V[`@R\x90V[`@Qa\x01\x80\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x16\xE3Wa\x16\xE3a\x16\x93V[`@Q`\x1F\x82\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x17TWa\x17Ta\x16\x93V[`@R\x91\x90PV[_` \x80\x83\x85\x03\x12\x15a\x17mW_\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x17\x84W_\x80\xFD[\x90\x84\x01\x90`\x80\x82\x87\x03\x12\x15a\x17\x97W_\x80\xFD[a\x17\x9Fa\x16\xC0V[\x825\x81R\x83\x83\x015a\x17\xB0\x81a\x11\xC6V[\x81\x85\x01R`@\x83\x015\x82\x81\x11\x15a\x17\xC5W_\x80\xFD[\x83\x01`\x1F\x81\x01\x88\x13a\x17\xD5W_\x80\xFD[\x805\x83\x81\x11\x15a\x17\xE7Wa\x17\xE7a\x16\x93V[a\x18\x17\x86\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x84\x01\x16\x01a\x17\rV[\x93P\x80\x84R\x88\x86\x82\x84\x01\x01\x11\x15a\x18,W_\x80\xFD[\x80\x86\x83\x01\x87\x86\x017_\x86\x82\x86\x01\x01RPP\x81`@\x82\x01R``\x83\x015``\x82\x01R\x80\x94PPPPP\x92\x91PPV[_` \x82\x84\x03\x12\x15a\x18jW_\x80\xFD[PQ\x91\x90PV[\x80Q\x82Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF` \x82\x01Q\x16` \x83\x01R_`@\x82\x01Q`\x80`@\x85\x01Ra\x18\xAF`\x80\x85\x01\x82a\x14\xB1V[``\x93\x84\x01Q\x94\x90\x93\x01\x93\x90\x93RP\x91\x90PV[` \x81R_a\x15B` \x83\x01\x84a\x18qV[\x80Qc\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x16\x12W_\x80\xFD[\x80Q\x80\x15\x15\x81\x14a\x16\x12W_\x80\xFD[_a\x01\x80\x82\x84\x03\x12\x15a\x19\x08W_\x80\xFD[a\x19\x10a\x16\xE9V[a\x19\x19\x83a\x16\x07V[\x81Ra\x19'` \x84\x01a\x16\x07V[` \x82\x01Ra\x198`@\x84\x01a\x16\x07V[`@\x82\x01R``\x83\x01Q``\x82\x01R`\x80\x83\x01Q`\x80\x82\x01Ra\x19]`\xA0\x84\x01a\x18\xD5V[`\xA0\x82\x01R`\xC0\x83\x01Q`\xC0\x82\x01R`\xE0\x83\x01Q`\xE0\x82\x01Ra\x01\0\x80\x84\x01Q\x81\x83\x01RPa\x01 a\x19\x90\x81\x85\x01a\x18\xE8V[\x90\x82\x01Ra\x01@\x83\x81\x01Q\x90\x82\x01Ra\x01`\x92\x83\x01Q\x92\x81\x01\x92\x90\x92RP\x91\x90PV[_a\x01\xA0a\x19\xC1\x83\x86a\x13\xCEV[\x80a\x01\x80\x84\x01Ra\x15\x1E\x81\x84\x01\x85a\x18qV[_\x81Q\x80` \x84\x01\x85^_\x93\x01\x92\x83RP\x90\x91\x90PV[_a\x0F\xBEa\x19\xF9\x83\x86a\x19\xD4V[\x84a\x19\xD4V[` \x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82Q\x16` \x82\x01R` \x82\x01Q`@\x82\x01R_`@\x83\x01Q``\x80\x84\x01Ra\x0F\xBE`\x80\x84\x01\x82a\x14\xB1V[_` \x82\x84\x03\x12\x15a\x1ASW_\x80\xFD[a\x15B\x82a\x18\xE8V[_a\x15B\x82\x84a\x19\xD4V[` \x81R_a\x15B` \x83\x01\x84a\x14\xB1V\xFEa\x01 `@R4\x80\x15a\0\x10W_\x80\xFD[P`@Qa&x8\x03\x80a&x\x839\x81\x01`@\x81\x90Ra\0/\x91a\x05/V[`\x01`\x01`\xA0\x1B\x03\x83\x16`\x80\x81\x90R`@\x80Qc\xF6\x98\xDA%`\xE0\x1B\x81R\x90Qc\xF6\x98\xDA%\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81_\x87Z\xF1\x15\x80\x15a\0xW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\0\x9C\x91\x90a\x05yV[a\x01\0Ra\0\xAA\x823a\x01_V[a\0\xB4\x813a\x01_V[3`\x01`\x01`\xA0\x1B\x03\x16`\xE0\x81`\x01`\x01`\xA0\x1B\x03\x16\x81RPP_\x83`\x01`\x01`\xA0\x1B\x03\x16c\x9BU,\xC2`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81_\x87Z\xF1\x15\x80\x15a\x01\x0CW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x010\x91\x90a\x05\x90V[\x90Pa\x01<\x83\x82a\x01_V[a\x01F\x82\x82a\x01_V[P`\x01`\x01`\xA0\x1B\x03\x91\x82\x16`\xA0R\x16`\xC0RPa\x06\x1CV[a\x01t`\x01`\x01`\xA0\x1B\x03\x83\x16\x82_\x19a\x01xV[PPV[\x80\x15\x80a\x01\xF0WP`@Qcn\xB1v\x9F`\xE1\x1B\x81R0`\x04\x82\x01R`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`$\x83\x01R\x84\x16\x90c\xDDb\xED>\x90`D\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x01\xCAW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x01\xEE\x91\x90a\x05yV[\x15[a\x02gW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`6`$\x82\x01R\x7FSafeERC20: approve from non-zero`D\x82\x01R\x7F to non-zero allowance\0\0\0\0\0\0\0\0\0\0`d\x82\x01R`\x84\x01[`@Q\x80\x91\x03\x90\xFD[`@\x80Q`\x01`\x01`\xA0\x1B\x03\x84\x16`$\x82\x01R`D\x80\x82\x01\x84\x90R\x82Q\x80\x83\x03\x90\x91\x01\x81R`d\x90\x91\x01\x90\x91R` \x81\x01\x80Q`\x01`\x01`\xE0\x1B\x03\x90\x81\x16c\t^\xA7\xB3`\xE0\x1B\x17\x90\x91Ra\x02\xBD\x91\x85\x91a\x02\xC2\x16V[PPPV[`@\x80Q\x80\x82\x01\x90\x91R` \x80\x82R\x7FSafeERC20: low-level call failed\x90\x82\x01R_\x90a\x03\x0E\x90`\x01`\x01`\xA0\x1B\x03\x85\x16\x90\x84\x90a\x03\x8DV[\x90P\x80Q_\x14\x80a\x03.WP\x80\x80` \x01\x90Q\x81\x01\x90a\x03.\x91\x90a\x05\xB2V[a\x02\xBDW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`*`$\x82\x01R\x7FSafeERC20: ERC20 operation did n`D\x82\x01Ri\x1B\xDD\x08\x1C\xDDX\xD8\xD9YY`\xB2\x1B`d\x82\x01R`\x84\x01a\x02^V[``a\x03\x9B\x84\x84_\x85a\x03\xA3V[\x94\x93PPPPV[``\x82G\x10\x15a\x04\x04W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`&`$\x82\x01R\x7FAddress: insufficient balance fo`D\x82\x01Re\x1C\x88\x18\xD8[\x1B`\xD2\x1B`d\x82\x01R`\x84\x01a\x02^V[_\x80\x86`\x01`\x01`\xA0\x1B\x03\x16\x85\x87`@Qa\x04\x1F\x91\x90a\x05\xD1V[_`@Q\x80\x83\x03\x81\x85\x87Z\xF1\x92PPP=\x80_\x81\x14a\x04YW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a\x04^V[``\x91P[P\x90\x92P\x90Pa\x04p\x87\x83\x83\x87a\x04{V[\x97\x96PPPPPPPV[``\x83\x15a\x04\xE9W\x82Q_\x03a\x04\xE2W`\x01`\x01`\xA0\x1B\x03\x85\x16;a\x04\xE2W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FAddress: call to non-contract\0\0\0`D\x82\x01R`d\x01a\x02^V[P\x81a\x03\x9BV[a\x03\x9B\x83\x83\x81Q\x15a\x04\xFEW\x81Q\x80\x83` \x01\xFD[\x80`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01a\x02^\x91\x90a\x05\xE7V[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x05,W_\x80\xFD[PV[_\x80_``\x84\x86\x03\x12\x15a\x05AW_\x80\xFD[\x83Qa\x05L\x81a\x05\x18V[` \x85\x01Q\x90\x93Pa\x05]\x81a\x05\x18V[`@\x85\x01Q\x90\x92Pa\x05n\x81a\x05\x18V[\x80\x91PP\x92P\x92P\x92V[_` \x82\x84\x03\x12\x15a\x05\x89W_\x80\xFD[PQ\x91\x90PV[_` \x82\x84\x03\x12\x15a\x05\xA0W_\x80\xFD[\x81Qa\x05\xAB\x81a\x05\x18V[\x93\x92PPPV[_` \x82\x84\x03\x12\x15a\x05\xC2W_\x80\xFD[\x81Q\x80\x15\x15\x81\x14a\x05\xABW_\x80\xFD[_\x82Q\x80` \x85\x01\x84^_\x92\x01\x91\x82RP\x91\x90PV[` \x81R_\x82Q\x80` \x84\x01R\x80` \x85\x01`@\x85\x01^_`@\x82\x85\x01\x01R`@`\x1F\x19`\x1F\x83\x01\x16\x84\x01\x01\x91PP\x92\x91PPV[`\x80Q`\xA0Q`\xC0Q`\xE0Qa\x01\0Qa\x1F\xBDa\x06\xBB_9_\x81\x81a\x02\xDB\x01Ra\x04+\x01R_\x81\x81a\x026\x01R\x81\x81a\x04\xD9\x01Ra\x0B\xF9\x01R_\x81\x81a\x02\xB4\x01R\x81\x81a\x05\x99\x01R\x81\x81a\r\\\x01R\x81\x81a\x0E\xBF\x01R\x81\x81a\x0F\x8E\x01Ra\x10\r\x01R_\x81\x81a\x018\x01R\x81\x81a\x05w\x01R\x81\x81a\r;\x01R\x81\x81a\x0E(\x01R\x81\x81a\x0Fk\x01Ra\x100\x01R_\x81\x81a\x03\"\x01Ra\x12\x14\x01Ra\x1F\xBD_\xF3\xFE`\x80`@R4\x80\x15a\0\x0FW_\x80\xFD[P`\x046\x10a\x01/W_5`\xE0\x1C\x80c\xB0\x9A\xAA\xCA\x11a\0\xADW\x80c\xE3\xE6\xF5\xB2\x11a\0}W\x80c\xEE\xC5\x0B\x97\x11a\0cW\x80c\xEE\xC5\x0B\x97\x14a\x03DW\x80c\xF1O\xCB\xC8\x14a\x03LW\x80c\xFF-\xBC\x98\x14a\x02\x03W_\x80\xFD[\x80c\xE3\xE6\xF5\xB2\x14a\x02\xFDW\x80c\xE5\x16q[\x14a\x03\x1DW_\x80\xFD[\x80c\xB0\x9A\xAA\xCA\x14a\x02\x89W\x80c\xC5\xF3\xD2T\x14a\x02\x9CW\x80c\xD2\x12 \xA7\x14a\x02\xAFW\x80c\xD2^\x0C\xB6\x14a\x02\xD6W_\x80\xFD[\x80c\x1C}\xE9A\x11a\x01\x02W\x80cH\x1Cju\x11a\0\xE8W\x80cH\x1Cju\x14a\x021W\x80c\x98\x1A\x16\x0B\x14a\x02XW\x80c\xA0)\xA8\xD4\x14a\x02vW_\x80\xFD[\x80c\x1C}\xE9A\x14a\x02\x03W\x80c>pn2\x14a\x02\nW_\x80\xFD[\x80c\r\xFE\x16\x81\x14a\x013W\x80c\x13\x03\xA4\x84\x14a\x01\x84W\x80c\x16&\xBA~\x14a\x01\xB5W\x80c\x17p\x0F\x01\x14a\x01\xF9W[_\x80\xFD[a\x01Z\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[`@Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[\x7Fl<\x90$TW\x06\x0Fe\x17x{,K\x8C\xF5\0\xCA\x88\x9D#\x04\xAF\x02\x04;\xD5\xB5\x13\xE3\xB5\x93\\[`@Q\x90\x81R` \x01a\x01{V[a\x01\xC8a\x01\xC36`\x04a\x16\xBFV[a\x03_V[`@Q\x7F\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x91\x16\x81R` \x01a\x01{V[a\x02\x01a\x04\xD7V[\0[a\x01\xA7_\x81V[a\x01\xA7\x7Fl<\x90$TW\x06\x0Fe\x17x{,K\x8C\xF5\0\xCA\x88\x9D#\x04\xAF\x02\x04;\xD5\xB5\x13\xE3\xB5\x93\x81V[a\x01Z\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[a\x02aa\x01,\x81V[`@Qc\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\x01{V[a\x02\x01a\x02\x846`\x04a\x19\xEEV[a\x05sV[a\x01\xA7a\x02\x976`\x04a\x1A;V[a\x0B\xC8V[a\x02\x01a\x02\xAA6`\x04a\x1AuV[a\x0B\xF7V[a\x01Z\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[a\x01\xA7\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[a\x03\x10a\x03\x0B6`\x04a\x1A;V[a\x0C\xB7V[`@Qa\x01{\x91\x90a\x1A\xACV[a\x01Z\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[a\x01\xA7_T\x81V[a\x02\x01a\x03Z6`\x04a\x1B\x9AV[a\x11\xFCV[_\x80\x80a\x03n\x84\x86\x01\x86a\x1B\xB1V[\x91P\x91P_Ta\x03}\x82a\x0B\xC8V[\x14a\x03\xB4W`@Q\x7F\xF1\xA6x\x90\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x82\x01\x80Q\x7F\xD5\xA2[\xA2\xE9p\x94\xAD}\x83\xDC(\xA6W-\xA7\x97\xD6\xB3\xE7\xFCfc\xBD\x93\xEF\xB7\x89\xFC\x17\xE4\x89\x82Ra\x01\xA0\x82 \x91R`@Q\x7F\x19\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\x02\x82\x01R`\"\x81\x01\x91\x90\x91R`B\x90 \x86\x81\x14a\x04\x94W`@Q\x7FY?\xCA\xCD\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x04\x9F\x81\x83\x85a\x12\x91V[a\x04\xA9\x82\x84a\x05sV[P\x7F\x16&\xBA~\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x92PPP[\x93\x92PPPV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163\x14a\x05FW`@Q\x7F\xF8}\r\x16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_\x80\x80U`@Q\x7F\xBC\xB8\xB8\xFB\xDE\xA8\xAAm\xC4\xAEA!>M\xA8\x1E`Z=\x1AV\xED\x85\x1B\x93U\x18#!\xC0\x91\x90\x91\x90\xA1V[\x80Q\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x84\x16\x91\x16\x14a\x06wW\x80s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x83_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x06uW`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x12`$\x82\x01R\x7Finvalid sell token\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[\x90[`@Q\x7Fp\xA0\x821\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R0`\x04\x82\x01R_\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x84\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x06\xE1W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\x05\x91\x90a\x1B\xFFV[`@Q\x7Fp\xA0\x821\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R0`\x04\x82\x01R\x90\x91P_\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x84\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07rW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\x96\x91\x90a\x1B\xFFV[\x90P\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x85` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x081W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x11`$\x82\x01R\x7Finvalid buy token\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06lV[`@\x85\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x15a\x08\xB3W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7Freceiver must be zero address\0\0\0`D\x82\x01R`d\x01a\x06lV[a\x08\xBFa\x01,Ba\x1CCV[\x85`\xA0\x01Qc\xFF\xFF\xFF\xFF\x16\x11\x15a\t2W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x1E`$\x82\x01R\x7Fvalidity too far in the future\0\0`D\x82\x01R`d\x01a\x06lV[\x85``\x01Q\x85`\xC0\x01Q\x14a\t\xA3W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0F`$\x82\x01R\x7Finvalid appData\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06lV[`\xE0\x85\x01Q\x15a\n\x0FW`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7Ffee amount must be zero\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06lV[\x7FZ(\xE96;\xB9B\xB69'\0b\xAAk\xB2\x95\xF44\xBC\xDF\xC4,\x97&{\xF0\x03\xF2r\x06\r\xC9\x85a\x01`\x01Q\x14a\n\x9DW`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FbuyTokenBalance must be erc20\0\0\0`D\x82\x01R`d\x01a\x06lV[\x7FZ(\xE96;\xB9B\xB69'\0b\xAAk\xB2\x95\xF44\xBC\xDF\xC4,\x97&{\xF0\x03\xF2r\x06\r\xC9\x85a\x01@\x01Q\x14a\x0B+W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x1E`$\x82\x01R\x7FsellTokenBalance must be erc20\0\0`D\x82\x01R`d\x01a\x06lV[``\x85\x01Qa\x0B:\x90\x82a\x1CVV[`\x80\x86\x01Q``\x87\x01Qa\x0BN\x90\x85a\x1CmV[a\x0BX\x91\x90a\x1CVV[\x10\x15a\x0B\xC0W`@Q\x7F\xC8\xFC'%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7Freceived amount too low\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06lV[PPPPPPV[_\x81`@Q` \x01a\x0B\xDA\x91\x90a\x1C\xCCV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163\x14a\x0CfW`@Q\x7F\xF8}\r\x16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_a\x0Csa\x02\x97\x83a\x1D'V[\x90P\x80_\x81\x90UP\x80\x7FQ\x0EJOv\x90|-aX\xB3C\xF7\xC4\xF2\xF5\x97\xDF8[r|&\xE9\xEF\x90\xE7P\x93\xAC\xE1\x9A\x83`@Qa\x0C\xAB\x91\x90a\x1DyV[`@Q\x80\x91\x03\x90\xA2PPV[`@\x80Qa\x01\x80\x81\x01\x82R_\x80\x82R` \x82\x01\x81\x90R\x91\x81\x01\x82\x90R``\x81\x01\x82\x90R`\x80\x81\x01\x82\x90R`\xA0\x81\x01\x82\x90R`\xC0\x81\x01\x82\x90R`\xE0\x81\x01\x82\x90Ra\x01\0\x81\x01\x82\x90Ra\x01 \x81\x01\x82\x90Ra\x01@\x81\x01\x82\x90Ra\x01`\x81\x01\x91\x90\x91R_\x80\x83` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c5^\xFD\xD9\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x87`@\x01Q`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\r\x9E\x93\x92\x91\x90a\x1E:V[`@\x80Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\r\xB8W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\r\xDC\x91\x90a\x1ErV[`@Q\x7Fp\xA0\x821\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R0`\x04\x82\x01R\x91\x93P\x91P_\x90\x81\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0EmW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0E\x91\x91\x90a\x1B\xFFV[`@Q\x7Fp\xA0\x821\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R0`\x04\x82\x01R\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0F\x19W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0F=\x91\x90a\x1B\xFFV[\x90\x92P\x90P_\x80\x80\x80\x80a\x0FQ\x88\x88a\x1CVV[\x90P_a\x0F^\x8A\x88a\x1CVV[\x90P_\x82\x82\x10\x15a\x10\x0BW\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x96P\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x95Pa\x0F\xD6a\x0F\xBD`\x02\x8Ba\x1E\xC1V[a\x0F\xD1\x84a\x0F\xCC\x8E`\x02a\x1CVV[a\x13FV[a\x13~V[\x94Pa\x10\x01\x85a\x0F\xE6\x81\x8Da\x1CVV[a\x0F\xF0\x90\x85a\x1CCV[a\x0F\xFA\x8C\x8Fa\x1CVV[`\x01a\x13\xCBV[\x93P\x84\x90Pa\x10\x98V[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x96P\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x95Pa\x10na\x10_`\x02\x8Aa\x1E\xC1V[a\x0F\xD1\x85a\x0F\xCC\x8F`\x02a\x1CVV[\x94Pa\x10\x92\x85a\x10~\x81\x8Ea\x1CVV[a\x10\x88\x90\x86a\x1CCV[a\x0F\xFA\x8B\x8Ea\x1CVV[\x93P\x83\x90P[\x8CQ\x81\x10\x15a\x10\xDFWa\x10\xDF`@Q\x80`@\x01`@R\x80`\x17\x81R` \x01\x7Ftraded amount too small\0\0\0\0\0\0\0\0\0\x81RPa\x14&V[`@Q\x80a\x01\x80\x01`@R\x80\x88s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x87s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x86\x81R` \x01\x85\x81R` \x01a\x11Va\x01,a\x14fV[c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x8E``\x01Q\x81R` \x01_\x81R` \x01\x7F\xF3\xB2wr\x8B?\xEEt\x94\x81\xEB>\x0B;H\x98\r\xBB\xABxe\x8F\xC4\x19\x02\\\xB1n\xEE4gu\x81R` \x01`\x01\x15\x15\x81R` \x01\x7FZ(\xE96;\xB9B\xB69'\0b\xAAk\xB2\x95\xF44\xBC\xDF\xC4,\x97&{\xF0\x03\xF2r\x06\r\xC9\x81R` \x01\x7FZ(\xE96;\xB9B\xB69'\0b\xAAk\xB2\x95\xF44\xBC\xDF\xC4,\x97&{\xF0\x03\xF2r\x06\r\xC9\x81RP\x9BPPPPPPPPPPPP\x91\x90PV[3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x12kW`@Q\x7F\xBF\x84\x89w\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80\x7Fl<\x90$TW\x06\x0Fe\x17x{,K\x8C\xF5\0\xCA\x88\x9D#\x04\xAF\x02\x04;\xD5\xB5\x13\xE3\xB5\x93]PV[\x7Fl<\x90$TW\x06\x0Fe\x17x{,K\x8C\xF5\0\xCA\x88\x9D#\x04\xAF\x02\x04;\xD5\xB5\x13\xE3\xB5\x93\\\x83\x81\x14a\x13@W\x80\x15a\x12\xF2W`@Q\x7F\xDA\xFB\xDD\x1F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_a\x12\xFC\x84a\x0C\xB7V[\x90Pa\x13\x08\x83\x82a\x14\x87V[a\x13>W`@Q\x7F\xD9\xFF$\xC7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P[PPPPV[_\x82\x15a\x13sW\x81a\x13Y`\x01\x85a\x1CmV[a\x13c\x91\x90a\x1E\xC1V[a\x13n\x90`\x01a\x1CCV[a\x13uV[_[\x90P[\x92\x91PPV[_\x81\x83\x10\x15a\x13\xC5Wa\x13\xC5`@Q\x80`@\x01`@R\x80`\x15\x81R` \x01\x7Fsubtraction underflow\0\0\0\0\0\0\0\0\0\0\0\x81RPa\x14&V[P\x90\x03\x90V[_\x80a\x13\xD8\x86\x86\x86a\x15\x99V[\x90P`\x01\x83`\x02\x81\x11\x15a\x13\xEEWa\x13\xEEa\x1E\xD4V[\x14\x80\x15a\x14\nWP_\x84\x80a\x14\x05Wa\x14\x05a\x1E\x94V[\x86\x88\t\x11[\x15a\x14\x1DWa\x14\x1A`\x01\x82a\x1CCV[\x90P[\x95\x94PPPPPV[a\x141C`\x01a\x1CCV[\x81`@Q\x7F\x1F\xE8Pn\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x06l\x92\x91\x90a\x1F\x01V[_\x81\x80a\x14s\x81Ba\x1F\x19V[a\x14}\x91\x90a\x1F;V[a\x13x\x91\x90a\x1FcV[_\x80\x82_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x90P_\x83` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x85` \x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x90P_\x84``\x01Q\x86``\x01Q\x14\x90P_\x85`\x80\x01Q\x87`\x80\x01Q\x14\x90P_\x86`\xA0\x01Qc\xFF\xFF\xFF\xFF\x16\x88`\xA0\x01Qc\xFF\xFF\xFF\xFF\x16\x14\x90P_\x87a\x01\0\x01Q\x89a\x01\0\x01Q\x14\x90P_\x88a\x01 \x01Q\x15\x15\x8Aa\x01 \x01Q\x15\x15\x14\x90P\x86\x80\x15a\x15^WP\x85[\x80\x15a\x15gWP\x84[\x80\x15a\x15pWP\x83[\x80\x15a\x15yWP\x82[\x80\x15a\x15\x82WP\x81[\x80\x15a\x15\x8BWP\x80[\x9A\x99PPPPPPPPPPV[_\x80\x80\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x85\x87\t\x85\x87\x02\x92P\x82\x81\x10\x83\x82\x03\x03\x91PP\x80_\x03a\x15\xEFW\x83\x82\x81a\x15\xE5Wa\x15\xE5a\x1E\x94V[\x04\x92PPPa\x04\xD0V[\x80\x84\x11a\x16XW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x15`$\x82\x01R\x7FMath: mulDiv overflow\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06lV[_\x84\x86\x88\t`\x02`\x01\x87\x19\x81\x01\x88\x16\x97\x88\x90\x04`\x03\x81\x02\x83\x18\x80\x82\x02\x84\x03\x02\x80\x82\x02\x84\x03\x02\x80\x82\x02\x84\x03\x02\x80\x82\x02\x84\x03\x02\x80\x82\x02\x84\x03\x02\x90\x81\x02\x90\x92\x03\x90\x91\x02_\x88\x90\x03\x88\x90\x04\x90\x91\x01\x85\x83\x11\x90\x94\x03\x93\x90\x93\x02\x93\x03\x94\x90\x94\x04\x91\x90\x91\x17\x02\x94\x93PPPPV[_\x80_`@\x84\x86\x03\x12\x15a\x16\xD1W_\x80\xFD[\x835\x92P` \x84\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x16\xEFW_\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12a\x17\x02W_\x80\xFD[\x815\x81\x81\x11\x15a\x17\x10W_\x80\xFD[\x87` \x82\x85\x01\x01\x11\x15a\x17!W_\x80\xFD[` \x83\x01\x94P\x80\x93PPPP\x92P\x92P\x92V[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[`@Q`\x80\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x17\x84Wa\x17\x84a\x174V[`@R\x90V[`@Qa\x01\x80\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x17\x84Wa\x17\x84a\x174V[`@Q`\x1F\x82\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x17\xF5Wa\x17\xF5a\x174V[`@R\x91\x90PV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x18\x1EW_\x80\xFD[PV[_`\x80\x82\x84\x03\x12\x15a\x181W_\x80\xFD[a\x189a\x17aV[\x90P\x815\x81R` \x80\x83\x015a\x18N\x81a\x17\xFDV[\x82\x82\x01R`@\x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x18lW_\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x18\x7FW_\x80\xFD[\x815\x81\x81\x11\x15a\x18\x91Wa\x18\x91a\x174V[a\x18\xC1\x84\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x84\x01\x16\x01a\x17\xAEV[\x91P\x80\x82R\x86\x84\x82\x85\x01\x01\x11\x15a\x18\xD6W_\x80\xFD[\x80\x84\x84\x01\x85\x84\x017_\x84\x82\x84\x01\x01RP\x80`@\x85\x01RPPP``\x82\x015``\x82\x01R\x92\x91PPV[\x805a\x19\n\x81a\x17\xFDV[\x91\x90PV[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x19\nW_\x80\xFD[\x805\x80\x15\x15\x81\x14a\x19\nW_\x80\xFD[_a\x01\x80\x82\x84\x03\x12\x15a\x19BW_\x80\xFD[a\x19Ja\x17\x8AV[\x90Pa\x19U\x82a\x18\xFFV[\x81Ra\x19c` \x83\x01a\x18\xFFV[` \x82\x01Ra\x19t`@\x83\x01a\x18\xFFV[`@\x82\x01R``\x82\x015``\x82\x01R`\x80\x82\x015`\x80\x82\x01Ra\x19\x99`\xA0\x83\x01a\x19\x0FV[`\xA0\x82\x01R`\xC0\x82\x015`\xC0\x82\x01R`\xE0\x82\x015`\xE0\x82\x01Ra\x01\0\x80\x83\x015\x81\x83\x01RPa\x01 a\x19\xCC\x81\x84\x01a\x19\"V[\x90\x82\x01Ra\x01@\x82\x81\x015\x90\x82\x01Ra\x01`\x91\x82\x015\x91\x81\x01\x91\x90\x91R\x91\x90PV[_\x80a\x01\xA0\x83\x85\x03\x12\x15a\x1A\0W_\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1A\x16W_\x80\xFD[a\x1A\"\x85\x82\x86\x01a\x18!V[\x92PPa\x1A2\x84` \x85\x01a\x191V[\x90P\x92P\x92\x90PV[_` \x82\x84\x03\x12\x15a\x1AKW_\x80\xFD[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1AaW_\x80\xFD[a\x1Am\x84\x82\x85\x01a\x18!V[\x94\x93PPPPV[_` \x82\x84\x03\x12\x15a\x1A\x85W_\x80\xFD[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1A\x9BW_\x80\xFD[\x82\x01`\x80\x81\x85\x03\x12\x15a\x04\xD0W_\x80\xFD[\x81Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81Ra\x01\x80\x81\x01` \x83\x01Qa\x1A\xF2` \x84\x01\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90RV[P`@\x83\x01Qa\x1B\x1A`@\x84\x01\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90RV[P``\x83\x01Q``\x83\x01R`\x80\x83\x01Q`\x80\x83\x01R`\xA0\x83\x01Qa\x1BF`\xA0\x84\x01\x82c\xFF\xFF\xFF\xFF\x16\x90RV[P`\xC0\x83\x01Q`\xC0\x83\x01R`\xE0\x83\x01Q`\xE0\x83\x01Ra\x01\0\x80\x84\x01Q\x81\x84\x01RPa\x01 \x80\x84\x01Qa\x1B{\x82\x85\x01\x82\x15\x15\x90RV[PPa\x01@\x83\x81\x01Q\x90\x83\x01Ra\x01`\x92\x83\x01Q\x92\x90\x91\x01\x91\x90\x91R\x90V[_` \x82\x84\x03\x12\x15a\x1B\xAAW_\x80\xFD[P5\x91\x90PV[_\x80a\x01\xA0\x83\x85\x03\x12\x15a\x1B\xC3W_\x80\xFD[a\x1B\xCD\x84\x84a\x191V[\x91Pa\x01\x80\x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1B\xE9W_\x80\xFD[a\x1B\xF5\x85\x82\x86\x01a\x18!V[\x91PP\x92P\x92\x90PV[_` \x82\x84\x03\x12\x15a\x1C\x0FW_\x80\xFD[PQ\x91\x90PV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x11`\x04R`$_\xFD[\x80\x82\x01\x80\x82\x11\x15a\x13xWa\x13xa\x1C\x16V[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x13xWa\x13xa\x1C\x16V[\x81\x81\x03\x81\x81\x11\x15a\x13xWa\x13xa\x1C\x16V[_\x81Q\x80\x84R\x80` \x84\x01` \x86\x01^_` \x82\x86\x01\x01R` \x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x83\x01\x16\x85\x01\x01\x91PP\x92\x91PPV[` \x81R\x81Q` \x82\x01Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF` \x83\x01Q\x16`@\x82\x01R_`@\x83\x01Q`\x80``\x84\x01Ra\x1D\x11`\xA0\x84\x01\x82a\x1C\x80V[\x90P``\x84\x01Q`\x80\x84\x01R\x80\x91PP\x92\x91PPV[_a\x13x6\x83a\x18!V[\x81\x83R\x81\x81` \x85\x017P_` \x82\x84\x01\x01R_` \x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x84\x01\x16\x84\x01\x01\x90P\x92\x91PPV[` \x81R\x815` \x82\x01R_` \x83\x015a\x1D\x93\x81a\x17\xFDV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16`@\x84\x01RP`@\x83\x015\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE1\x846\x03\x01\x81\x12a\x1D\xE4W_\x80\xFD[\x83\x01` \x81\x01\x905g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x1E\0W_\x80\xFD[\x806\x03\x82\x13\x15a\x1E\x0EW_\x80\xFD[`\x80``\x85\x01Ra\x1E#`\xA0\x85\x01\x82\x84a\x1D2V[\x91PP``\x84\x015`\x80\x84\x01R\x80\x91PP\x92\x91PPV[_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x86\x16\x83R\x80\x85\x16` \x84\x01RP```@\x83\x01Ra\x14\x1D``\x83\x01\x84a\x1C\x80V[_\x80`@\x83\x85\x03\x12\x15a\x1E\x83W_\x80\xFD[PP\x80Q` \x90\x91\x01Q\x90\x92\x90\x91PV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x12`\x04R`$_\xFD[_\x82a\x1E\xCFWa\x1E\xCFa\x1E\x94V[P\x04\x90V[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`!`\x04R`$_\xFD[\x82\x81R`@` \x82\x01R_a\x1Am`@\x83\x01\x84a\x1C\x80V[_c\xFF\xFF\xFF\xFF\x80\x84\x16\x80a\x1F/Wa\x1F/a\x1E\x94V[\x92\x16\x91\x90\x91\x04\x92\x91PPV[c\xFF\xFF\xFF\xFF\x81\x81\x16\x83\x82\x16\x02\x80\x82\x16\x91\x90\x82\x81\x14a\x1F[Wa\x1F[a\x1C\x16V[PP\x92\x91PPV[c\xFF\xFF\xFF\xFF\x81\x81\x16\x83\x82\x16\x01\x90\x80\x82\x11\x15a\x1F\x80Wa\x1F\x80a\x1C\x16V[P\x92\x91PPV\xFE\xA2dipfsX\"\x12 \xE3\xFB\"\x8BR]\x90\xB9B\xC7\xE5\x8F\xE2\xE2\x03J\x17\xBD%\x8C\x08/\xD4w@\xE7d\xA7\xBEE\xBA\xC6dsolcC\0\x08\x19\x003\xA2dipfsX\"\x12 \x11\x90\xCFB\xF9\x89\xCE\xE2?\x12Y|\x8C\x1E\x9D\xAA\xB6\xD8\xC8\x16Q3I\xC3\xCE\x7F\xD2)\xCA\xE5\xB0\xFFdsolcC\0\x08\x19\x003", - ); - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `OnlyOwnerCanCall(address)` and selector `0x68bafff8`. - ```solidity - error OnlyOwnerCanCall(address owner); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct OnlyOwnerCanCall { - #[allow(missing_docs)] - pub owner: alloy_sol_types::private::Address, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (alloy_sol_types::sol_data::Address,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy_sol_types::private::Address,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: OnlyOwnerCanCall) -> Self { - (value.owner,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for OnlyOwnerCanCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { owner: tuple.0 } - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for OnlyOwnerCanCall { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [104u8, 186u8, 255u8, 248u8]; - const SIGNATURE: &'static str = "OnlyOwnerCanCall(address)"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.owner, - ), - ) - } - - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(Self::new) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `OrderNotValid(string)` and selector `0xc8fc2725`. - ```solidity - error OrderNotValid(string); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct OrderNotValid(pub alloy_sol_types::private::String); - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (alloy_sol_types::sol_data::String,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy_sol_types::private::String,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: OrderNotValid) -> Self { - (value.0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for OrderNotValid { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self(tuple.0) - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for OrderNotValid { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [200u8, 252u8, 39u8, 37u8]; - const SIGNATURE: &'static str = "OrderNotValid(string)"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.0, - ), - ) - } - - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(Self::new) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Event with signature `ConditionalOrderCreated(address,(address,bytes32,bytes))` and selector `0x2cceac5555b0ca45a3744ced542f54b56ad2eb45e521962372eef212a2cbf361`. - ```solidity - event ConditionalOrderCreated(address indexed owner, IConditionalOrder.ConditionalOrderParams params); - ```*/ - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - #[derive(Clone)] - pub struct ConditionalOrderCreated { - #[allow(missing_docs)] - pub owner: alloy_sol_types::private::Address, - #[allow(missing_docs)] - pub params: - ::RustType, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[automatically_derived] - impl alloy_sol_types::SolEvent for ConditionalOrderCreated { - type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type DataTuple<'a> = (IConditionalOrder::ConditionalOrderParams,); - type TopicList = ( - alloy_sol_types::sol_data::FixedBytes<32>, - alloy_sol_types::sol_data::Address, - ); - - const ANONYMOUS: bool = false; - const SIGNATURE: &'static str = - "ConditionalOrderCreated(address,(address,bytes32,bytes))"; - const SIGNATURE_HASH: alloy_sol_types::private::B256 = - alloy_sol_types::private::B256::new([ - 44u8, 206u8, 172u8, 85u8, 85u8, 176u8, 202u8, 69u8, 163u8, 116u8, 76u8, 237u8, - 84u8, 47u8, 84u8, 181u8, 106u8, 210u8, 235u8, 69u8, 229u8, 33u8, 150u8, 35u8, - 114u8, 238u8, 242u8, 18u8, 162u8, 203u8, 243u8, 97u8, - ]); - - #[allow(unused_variables)] - #[inline] - fn new( - topics: ::RustType, - data: as alloy_sol_types::SolType>::RustType, - ) -> Self { - Self { - owner: topics.1, - params: data.0, - } - } - - #[inline] - fn check_signature( - topics: &::RustType, - ) -> alloy_sol_types::Result<()> { - if topics.0 != Self::SIGNATURE_HASH { - return Err(alloy_sol_types::Error::invalid_event_signature_hash( - Self::SIGNATURE, - topics.0, - Self::SIGNATURE_HASH, - )); - } - Ok(()) - } - - #[inline] - fn tokenize_body(&self) -> Self::DataToken<'_> { - ( - ::tokenize( - &self.params, - ), - ) - } - - #[inline] - fn topics(&self) -> ::RustType { - (Self::SIGNATURE_HASH.into(), self.owner.clone()) - } - - #[inline] - fn encode_topics_raw( - &self, - out: &mut [alloy_sol_types::abi::token::WordToken], - ) -> alloy_sol_types::Result<()> { - if out.len() < ::COUNT { - return Err(alloy_sol_types::Error::Overrun); - } - out[0usize] = alloy_sol_types::abi::token::WordToken(Self::SIGNATURE_HASH); - out[1usize] = ::encode_topic( - &self.owner, - ); - Ok(()) - } - } - #[automatically_derived] - impl alloy_sol_types::private::IntoLogData for ConditionalOrderCreated { - fn to_log_data(&self) -> alloy_sol_types::private::LogData { - From::from(self) - } - - fn into_log_data(self) -> alloy_sol_types::private::LogData { - From::from(&self) - } - } - #[automatically_derived] - impl From<&ConditionalOrderCreated> for alloy_sol_types::private::LogData { - #[inline] - fn from(this: &ConditionalOrderCreated) -> alloy_sol_types::private::LogData { - alloy_sol_types::SolEvent::encode_log_data(this) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Event with signature `Deployed(address,address,address,address)` and selector `0x6707255b2c5ca81220b2f3e408a269cb83baa6aa7e5e37aa1756883a6cdf06f1`. - ```solidity - event Deployed(address indexed amm, address indexed owner, address token0, address token1); - ```*/ - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - #[derive(Clone)] - pub struct Deployed { - #[allow(missing_docs)] - pub amm: alloy_sol_types::private::Address, - #[allow(missing_docs)] - pub owner: alloy_sol_types::private::Address, - #[allow(missing_docs)] - pub token0: alloy_sol_types::private::Address, - #[allow(missing_docs)] - pub token1: alloy_sol_types::private::Address, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[automatically_derived] - impl alloy_sol_types::SolEvent for Deployed { - type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type DataTuple<'a> = ( - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Address, - ); - type TopicList = ( - alloy_sol_types::sol_data::FixedBytes<32>, - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Address, - ); - - const ANONYMOUS: bool = false; - const SIGNATURE: &'static str = "Deployed(address,address,address,address)"; - const SIGNATURE_HASH: alloy_sol_types::private::B256 = - alloy_sol_types::private::B256::new([ - 103u8, 7u8, 37u8, 91u8, 44u8, 92u8, 168u8, 18u8, 32u8, 178u8, 243u8, 228u8, - 8u8, 162u8, 105u8, 203u8, 131u8, 186u8, 166u8, 170u8, 126u8, 94u8, 55u8, 170u8, - 23u8, 86u8, 136u8, 58u8, 108u8, 223u8, 6u8, 241u8, - ]); - - #[allow(unused_variables)] - #[inline] - fn new( - topics: ::RustType, - data: as alloy_sol_types::SolType>::RustType, - ) -> Self { - Self { - amm: topics.1, - owner: topics.2, - token0: data.0, - token1: data.1, - } - } - - #[inline] - fn check_signature( - topics: &::RustType, - ) -> alloy_sol_types::Result<()> { - if topics.0 != Self::SIGNATURE_HASH { - return Err(alloy_sol_types::Error::invalid_event_signature_hash( - Self::SIGNATURE, - topics.0, - Self::SIGNATURE_HASH, - )); - } - Ok(()) - } - - #[inline] - fn tokenize_body(&self) -> Self::DataToken<'_> { - ( - ::tokenize( - &self.token0, - ), - ::tokenize( - &self.token1, - ), - ) - } - - #[inline] - fn topics(&self) -> ::RustType { - ( - Self::SIGNATURE_HASH.into(), - self.amm.clone(), - self.owner.clone(), - ) - } - - #[inline] - fn encode_topics_raw( - &self, - out: &mut [alloy_sol_types::abi::token::WordToken], - ) -> alloy_sol_types::Result<()> { - if out.len() < ::COUNT { - return Err(alloy_sol_types::Error::Overrun); - } - out[0usize] = alloy_sol_types::abi::token::WordToken(Self::SIGNATURE_HASH); - out[1usize] = ::encode_topic( - &self.amm, - ); - out[2usize] = ::encode_topic( - &self.owner, - ); - Ok(()) - } - } - #[automatically_derived] - impl alloy_sol_types::private::IntoLogData for Deployed { - fn to_log_data(&self) -> alloy_sol_types::private::LogData { - From::from(self) - } - - fn into_log_data(self) -> alloy_sol_types::private::LogData { - From::from(&self) - } - } - #[automatically_derived] - impl From<&Deployed> for alloy_sol_types::private::LogData { - #[inline] - fn from(this: &Deployed) -> alloy_sol_types::private::LogData { - alloy_sol_types::SolEvent::encode_log_data(this) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Event with signature `TradingDisabled(address)` and selector `0xc75bf4f03c02fab9414a7d7a54048c0486722bc72f33ad924709a0593608ad27`. - ```solidity - event TradingDisabled(address indexed amm); - ```*/ - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - #[derive(Clone)] - pub struct TradingDisabled { - #[allow(missing_docs)] - pub amm: alloy_sol_types::private::Address, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[automatically_derived] - impl alloy_sol_types::SolEvent for TradingDisabled { - type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type DataTuple<'a> = (); - type TopicList = ( - alloy_sol_types::sol_data::FixedBytes<32>, - alloy_sol_types::sol_data::Address, - ); - - const ANONYMOUS: bool = false; - const SIGNATURE: &'static str = "TradingDisabled(address)"; - const SIGNATURE_HASH: alloy_sol_types::private::B256 = - alloy_sol_types::private::B256::new([ - 199u8, 91u8, 244u8, 240u8, 60u8, 2u8, 250u8, 185u8, 65u8, 74u8, 125u8, 122u8, - 84u8, 4u8, 140u8, 4u8, 134u8, 114u8, 43u8, 199u8, 47u8, 51u8, 173u8, 146u8, - 71u8, 9u8, 160u8, 89u8, 54u8, 8u8, 173u8, 39u8, - ]); - - #[allow(unused_variables)] - #[inline] - fn new( - topics: ::RustType, - data: as alloy_sol_types::SolType>::RustType, - ) -> Self { - Self { amm: topics.1 } - } - - #[inline] - fn check_signature( - topics: &::RustType, - ) -> alloy_sol_types::Result<()> { - if topics.0 != Self::SIGNATURE_HASH { - return Err(alloy_sol_types::Error::invalid_event_signature_hash( - Self::SIGNATURE, - topics.0, - Self::SIGNATURE_HASH, - )); - } - Ok(()) - } - - #[inline] - fn tokenize_body(&self) -> Self::DataToken<'_> { - () - } - - #[inline] - fn topics(&self) -> ::RustType { - (Self::SIGNATURE_HASH.into(), self.amm.clone()) - } - - #[inline] - fn encode_topics_raw( - &self, - out: &mut [alloy_sol_types::abi::token::WordToken], - ) -> alloy_sol_types::Result<()> { - if out.len() < ::COUNT { - return Err(alloy_sol_types::Error::Overrun); - } - out[0usize] = alloy_sol_types::abi::token::WordToken(Self::SIGNATURE_HASH); - out[1usize] = ::encode_topic( - &self.amm, - ); - Ok(()) - } - } - #[automatically_derived] - impl alloy_sol_types::private::IntoLogData for TradingDisabled { - fn to_log_data(&self) -> alloy_sol_types::private::LogData { - From::from(self) - } - - fn into_log_data(self) -> alloy_sol_types::private::LogData { - From::from(&self) - } - } - #[automatically_derived] - impl From<&TradingDisabled> for alloy_sol_types::private::LogData { - #[inline] - fn from(this: &TradingDisabled) -> alloy_sol_types::private::LogData { - alloy_sol_types::SolEvent::encode_log_data(this) - } - } - }; - /**Constructor`. - ```solidity - constructor(address _settler); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct constructorCall { - #[allow(missing_docs)] - pub _settler: alloy_sol_types::private::Address, - } - const _: () = { - use alloy_sol_types; - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (alloy_sol_types::sol_data::Address,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy_sol_types::private::Address,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: constructorCall) -> Self { - (value._settler,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for constructorCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _settler: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolConstructor for constructorCall { - type Parameters<'a> = (alloy_sol_types::sol_data::Address,); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self._settler, - ), - ) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `ammDeterministicAddress(address,address,address)` and selector `0x37ebdf50`. - ```solidity - function ammDeterministicAddress(address ammOwner, address token0, address token1) external view returns (address); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct ammDeterministicAddressCall { - #[allow(missing_docs)] - pub ammOwner: alloy_sol_types::private::Address, - #[allow(missing_docs)] - pub token0: alloy_sol_types::private::Address, - #[allow(missing_docs)] - pub token1: alloy_sol_types::private::Address, - } - #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the - /// [`ammDeterministicAddress(address,address, - /// address)`](ammDeterministicAddressCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct ammDeterministicAddressReturn { - #[allow(missing_docs)] - pub _0: alloy_sol_types::private::Address, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = ( - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Address, - ); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy_sol_types::private::Address, - alloy_sol_types::private::Address, - alloy_sol_types::private::Address, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: ammDeterministicAddressCall) -> Self { - (value.ammOwner, value.token0, value.token1) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for ammDeterministicAddressCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - ammOwner: tuple.0, - token0: tuple.1, - token1: tuple.2, - } - } - } - } - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (alloy_sol_types::sol_data::Address,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy_sol_types::private::Address,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: ammDeterministicAddressReturn) -> Self { - (value._0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for ammDeterministicAddressReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for ammDeterministicAddressCall { - type Parameters<'a> = ( - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Address, - ); - type Return = alloy_sol_types::private::Address; - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type ReturnTuple<'a> = (alloy_sol_types::sol_data::Address,); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [55u8, 235u8, 223u8, 80u8]; - const SIGNATURE: &'static str = "ammDeterministicAddress(address,address,address)"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.ammOwner, - ), - ::tokenize( - &self.token0, - ), - ::tokenize( - &self.token1, - ), - ) - } - - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - (::tokenize(ret),) - } - - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data).map( - |r| { - let r: ammDeterministicAddressReturn = r.into(); - r._0 - }, - ) - } - - #[inline] - fn abi_decode_returns_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(|r| { - let r: ammDeterministicAddressReturn = r.into(); - r._0 - }) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `create(address,uint256,address,uint256,uint256,address,bytes,bytes32)` and selector `0x22b155c6`. - ```solidity - function create(address token0, uint256 amount0, address token1, uint256 amount1, uint256 minTradedToken0, address priceOracle, bytes memory priceOracleData, bytes32 appData) external returns (address amm); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct createCall { - #[allow(missing_docs)] - pub token0: alloy_sol_types::private::Address, - #[allow(missing_docs)] - pub amount0: alloy_sol_types::private::primitives::aliases::U256, - #[allow(missing_docs)] - pub token1: alloy_sol_types::private::Address, - #[allow(missing_docs)] - pub amount1: alloy_sol_types::private::primitives::aliases::U256, - #[allow(missing_docs)] - pub minTradedToken0: alloy_sol_types::private::primitives::aliases::U256, - #[allow(missing_docs)] - pub priceOracle: alloy_sol_types::private::Address, - #[allow(missing_docs)] - pub priceOracleData: alloy_sol_types::private::Bytes, - #[allow(missing_docs)] - pub appData: alloy_sol_types::private::FixedBytes<32>, - } - #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the - /// [`create(address,uint256,address,uint256,uint256,address,bytes, - /// bytes32)`](createCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct createReturn { - #[allow(missing_docs)] - pub amm: alloy_sol_types::private::Address, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = ( - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Uint<256>, - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Uint<256>, - alloy_sol_types::sol_data::Uint<256>, - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Bytes, - alloy_sol_types::sol_data::FixedBytes<32>, - ); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy_sol_types::private::Address, - alloy_sol_types::private::primitives::aliases::U256, - alloy_sol_types::private::Address, - alloy_sol_types::private::primitives::aliases::U256, - alloy_sol_types::private::primitives::aliases::U256, - alloy_sol_types::private::Address, - alloy_sol_types::private::Bytes, - alloy_sol_types::private::FixedBytes<32>, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: createCall) -> Self { - ( - value.token0, - value.amount0, - value.token1, - value.amount1, - value.minTradedToken0, - value.priceOracle, - value.priceOracleData, - value.appData, - ) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for createCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - token0: tuple.0, - amount0: tuple.1, - token1: tuple.2, - amount1: tuple.3, - minTradedToken0: tuple.4, - priceOracle: tuple.5, - priceOracleData: tuple.6, - appData: tuple.7, - } - } - } - } - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (alloy_sol_types::sol_data::Address,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy_sol_types::private::Address,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: createReturn) -> Self { - (value.amm,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for createReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { amm: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for createCall { - type Parameters<'a> = ( - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Uint<256>, - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Uint<256>, - alloy_sol_types::sol_data::Uint<256>, - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Bytes, - alloy_sol_types::sol_data::FixedBytes<32>, - ); - type Return = alloy_sol_types::private::Address; - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type ReturnTuple<'a> = (alloy_sol_types::sol_data::Address,); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [34u8, 177u8, 85u8, 198u8]; - const SIGNATURE: &'static str = - "create(address,uint256,address,uint256,uint256,address,bytes,bytes32)"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.token0, - ), - as alloy_sol_types::SolType>::tokenize(&self.amount0), - ::tokenize( - &self.token1, - ), - as alloy_sol_types::SolType>::tokenize(&self.amount1), - as alloy_sol_types::SolType>::tokenize(&self.minTradedToken0), - ::tokenize( - &self.priceOracle, - ), - ::tokenize( - &self.priceOracleData, - ), - as alloy_sol_types::SolType>::tokenize(&self.appData), - ) - } - - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - (::tokenize(ret),) - } - - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data).map( - |r| { - let r: createReturn = r.into(); - r.amm - }, - ) - } - - #[inline] - fn abi_decode_returns_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(|r| { - let r: createReturn = r.into(); - r.amm - }) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `deposit(address,uint256,uint256)` and selector `0x0efe6a8b`. - ```solidity - function deposit(address amm, uint256 amount0, uint256 amount1) external; - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct depositCall { - #[allow(missing_docs)] - pub amm: alloy_sol_types::private::Address, - #[allow(missing_docs)] - pub amount0: alloy_sol_types::private::primitives::aliases::U256, - #[allow(missing_docs)] - pub amount1: alloy_sol_types::private::primitives::aliases::U256, - } - ///Container type for the return parameters of the - /// [`deposit(address,uint256,uint256)`](depositCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct depositReturn {} - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = ( - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Uint<256>, - alloy_sol_types::sol_data::Uint<256>, - ); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy_sol_types::private::Address, - alloy_sol_types::private::primitives::aliases::U256, - alloy_sol_types::private::primitives::aliases::U256, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: depositCall) -> Self { - (value.amm, value.amount0, value.amount1) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for depositCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - amm: tuple.0, - amount0: tuple.1, - amount1: tuple.2, - } - } - } - } - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: depositReturn) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for depositReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self {} - } - } - } - impl depositReturn { - fn _tokenize(&self) -> ::ReturnToken<'_> { - () - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for depositCall { - type Parameters<'a> = ( - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Uint<256>, - alloy_sol_types::sol_data::Uint<256>, - ); - type Return = depositReturn; - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type ReturnTuple<'a> = (); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [14u8, 254u8, 106u8, 139u8]; - const SIGNATURE: &'static str = "deposit(address,uint256,uint256)"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.amm, - ), - as alloy_sol_types::SolType>::tokenize( - &self.amount0, - ), - as alloy_sol_types::SolType>::tokenize( - &self.amount1, - ), - ) - } - - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - depositReturn::_tokenize(ret) - } - - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data) - .map(Into::into) - } - - #[inline] - fn abi_decode_returns_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(Into::into) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `owner(address)` and selector `0x666e1b39`. - ```solidity - function owner(address) external view returns (address); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct ownerCall(pub alloy_sol_types::private::Address); - #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the - /// [`owner(address)`](ownerCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct ownerReturn { - #[allow(missing_docs)] - pub _0: alloy_sol_types::private::Address, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (alloy_sol_types::sol_data::Address,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy_sol_types::private::Address,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: ownerCall) -> Self { - (value.0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for ownerCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self(tuple.0) - } - } - } - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (alloy_sol_types::sol_data::Address,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy_sol_types::private::Address,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: ownerReturn) -> Self { - (value._0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for ownerReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for ownerCall { - type Parameters<'a> = (alloy_sol_types::sol_data::Address,); - type Return = alloy_sol_types::private::Address; - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type ReturnTuple<'a> = (alloy_sol_types::sol_data::Address,); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [102u8, 110u8, 27u8, 57u8]; - const SIGNATURE: &'static str = "owner(address)"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.0, - ), - ) - } - - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - (::tokenize(ret),) - } - - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data).map( - |r| { - let r: ownerReturn = r.into(); - r._0 - }, - ) - } - - #[inline] - fn abi_decode_returns_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(|r| { - let r: ownerReturn = r.into(); - r._0 - }) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `withdraw(address,uint256,uint256)` and selector `0xb5c5f672`. - ```solidity - function withdraw(address amm, uint256 amount0, uint256 amount1) external; - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct withdrawCall { - #[allow(missing_docs)] - pub amm: alloy_sol_types::private::Address, - #[allow(missing_docs)] - pub amount0: alloy_sol_types::private::primitives::aliases::U256, - #[allow(missing_docs)] - pub amount1: alloy_sol_types::private::primitives::aliases::U256, - } - ///Container type for the return parameters of the - /// [`withdraw(address,uint256,uint256)`](withdrawCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct withdrawReturn {} - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = ( - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Uint<256>, - alloy_sol_types::sol_data::Uint<256>, - ); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy_sol_types::private::Address, - alloy_sol_types::private::primitives::aliases::U256, - alloy_sol_types::private::primitives::aliases::U256, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: withdrawCall) -> Self { - (value.amm, value.amount0, value.amount1) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for withdrawCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - amm: tuple.0, - amount0: tuple.1, - amount1: tuple.2, - } - } - } - } - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: withdrawReturn) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for withdrawReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self {} - } - } - } - impl withdrawReturn { - fn _tokenize(&self) -> ::ReturnToken<'_> { - () - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for withdrawCall { - type Parameters<'a> = ( - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Uint<256>, - alloy_sol_types::sol_data::Uint<256>, - ); - type Return = withdrawReturn; - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type ReturnTuple<'a> = (); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [181u8, 197u8, 246u8, 114u8]; - const SIGNATURE: &'static str = "withdraw(address,uint256,uint256)"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.amm, - ), - as alloy_sol_types::SolType>::tokenize( - &self.amount0, - ), - as alloy_sol_types::SolType>::tokenize( - &self.amount1, - ), - ) - } - - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - withdrawReturn::_tokenize(ret) - } - - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data) - .map(Into::into) - } - - #[inline] - fn abi_decode_returns_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(Into::into) - } - } - }; - ///Container for all the [`CowAmmConstantProductFactory`](self) function - /// calls. - #[derive(Clone)] - pub enum CowAmmConstantProductFactoryCalls { - #[allow(missing_docs)] - ammDeterministicAddress(ammDeterministicAddressCall), - #[allow(missing_docs)] - create(createCall), - #[allow(missing_docs)] - deposit(depositCall), - #[allow(missing_docs)] - owner(ownerCall), - #[allow(missing_docs)] - withdraw(withdrawCall), - } - impl CowAmmConstantProductFactoryCalls { - /// All the selectors of this enum. - /// - /// Note that the selectors might not be in the same order as the - /// variants. No guarantees are made about the order of the - /// selectors. - /// - /// Prefer using `SolInterface` methods instead. - pub const SELECTORS: &'static [[u8; 4usize]] = &[ - [14u8, 254u8, 106u8, 139u8], - [34u8, 177u8, 85u8, 198u8], - [55u8, 235u8, 223u8, 80u8], - [102u8, 110u8, 27u8, 57u8], - [181u8, 197u8, 246u8, 114u8], - ]; - /// The signatures in the same order as `SELECTORS`. - pub const SIGNATURES: &'static [&'static str] = &[ - ::SIGNATURE, - ::SIGNATURE, - ::SIGNATURE, - ::SIGNATURE, - ::SIGNATURE, - ]; - /// The names of the variants in the same order as `SELECTORS`. - pub const VARIANT_NAMES: &'static [&'static str] = &[ - ::core::stringify!(deposit), - ::core::stringify!(create), - ::core::stringify!(ammDeterministicAddress), - ::core::stringify!(owner), - ::core::stringify!(withdraw), - ]; - - /// Returns the signature for the given selector, if known. - #[inline] - pub fn signature_by_selector( - selector: [u8; 4usize], - ) -> ::core::option::Option<&'static str> { - match Self::SELECTORS.binary_search(&selector) { - ::core::result::Result::Ok(idx) => { - ::core::option::Option::Some(Self::SIGNATURES[idx]) - } - ::core::result::Result::Err(_) => ::core::option::Option::None, - } - } - - /// Returns the enum variant name for the given selector, if known. - #[inline] - pub fn name_by_selector(selector: [u8; 4usize]) -> ::core::option::Option<&'static str> { - let sig = Self::signature_by_selector(selector)?; - sig.split_once('(').map(|(name, _)| name) - } - } - #[automatically_derived] - impl alloy_sol_types::SolInterface for CowAmmConstantProductFactoryCalls { - const COUNT: usize = 5usize; - const MIN_DATA_LENGTH: usize = 32usize; - const NAME: &'static str = "CowAmmConstantProductFactoryCalls"; - - #[inline] - fn selector(&self) -> [u8; 4] { - match self { - Self::ammDeterministicAddress(_) => { - ::SELECTOR - } - Self::create(_) => ::SELECTOR, - Self::deposit(_) => ::SELECTOR, - Self::owner(_) => ::SELECTOR, - Self::withdraw(_) => ::SELECTOR, - } - } - - #[inline] - fn selector_at(i: usize) -> ::core::option::Option<[u8; 4]> { - Self::SELECTORS.get(i).copied() - } - - #[inline] - fn valid_selector(selector: [u8; 4]) -> bool { - Self::SELECTORS.binary_search(&selector).is_ok() - } - - #[inline] - #[allow(non_snake_case)] - fn abi_decode_raw(selector: [u8; 4], data: &[u8]) -> alloy_sol_types::Result { - static DECODE_SHIMS: &[fn( - &[u8], - ) -> alloy_sol_types::Result< - CowAmmConstantProductFactoryCalls, - >] = &[ - { - fn deposit( - data: &[u8], - ) -> alloy_sol_types::Result - { - ::abi_decode_raw(data) - .map(CowAmmConstantProductFactoryCalls::deposit) - } - deposit - }, - { - fn create( - data: &[u8], - ) -> alloy_sol_types::Result - { - ::abi_decode_raw(data) - .map(CowAmmConstantProductFactoryCalls::create) - } - create - }, - { - fn ammDeterministicAddress( - data: &[u8], - ) -> alloy_sol_types::Result - { - ::abi_decode_raw( - data, - ) - .map(CowAmmConstantProductFactoryCalls::ammDeterministicAddress) - } - ammDeterministicAddress - }, - { - fn owner( - data: &[u8], - ) -> alloy_sol_types::Result - { - ::abi_decode_raw(data) - .map(CowAmmConstantProductFactoryCalls::owner) - } - owner - }, - { - fn withdraw( - data: &[u8], - ) -> alloy_sol_types::Result - { - ::abi_decode_raw(data) - .map(CowAmmConstantProductFactoryCalls::withdraw) - } - withdraw - }, - ]; - let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { - return Err(alloy_sol_types::Error::unknown_selector( - ::NAME, - selector, - )); - }; - DECODE_SHIMS[idx](data) - } - - #[inline] - #[allow(non_snake_case)] - fn abi_decode_raw_validate( - selector: [u8; 4], - data: &[u8], - ) -> alloy_sol_types::Result { - static DECODE_VALIDATE_SHIMS: &[fn( - &[u8], - ) -> alloy_sol_types::Result< - CowAmmConstantProductFactoryCalls, - >] = &[ - { - fn deposit( - data: &[u8], - ) -> alloy_sol_types::Result - { - ::abi_decode_raw_validate(data) - .map(CowAmmConstantProductFactoryCalls::deposit) - } - deposit - }, - { - fn create( - data: &[u8], - ) -> alloy_sol_types::Result - { - ::abi_decode_raw_validate(data) - .map(CowAmmConstantProductFactoryCalls::create) - } - create - }, - { - fn ammDeterministicAddress( - data: &[u8], - ) -> alloy_sol_types::Result - { - ::abi_decode_raw_validate( - data, - ) - .map( - CowAmmConstantProductFactoryCalls::ammDeterministicAddress, - ) - } - ammDeterministicAddress - }, - { - fn owner( - data: &[u8], - ) -> alloy_sol_types::Result - { - ::abi_decode_raw_validate(data) - .map(CowAmmConstantProductFactoryCalls::owner) - } - owner - }, - { - fn withdraw( - data: &[u8], - ) -> alloy_sol_types::Result - { - ::abi_decode_raw_validate(data) - .map(CowAmmConstantProductFactoryCalls::withdraw) - } - withdraw - }, - ]; - let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { - return Err(alloy_sol_types::Error::unknown_selector( - ::NAME, - selector, - )); - }; - DECODE_VALIDATE_SHIMS[idx](data) - } - - #[inline] - fn abi_encoded_size(&self) -> usize { - match self { - Self::ammDeterministicAddress(inner) => { - ::abi_encoded_size( - inner, - ) - } - Self::create(inner) => { - ::abi_encoded_size(inner) - } - Self::deposit(inner) => { - ::abi_encoded_size(inner) - } - Self::owner(inner) => { - ::abi_encoded_size(inner) - } - Self::withdraw(inner) => { - ::abi_encoded_size(inner) - } - } - } - - #[inline] - fn abi_encode_raw(&self, out: &mut alloy_sol_types::private::Vec) { - match self { - Self::ammDeterministicAddress(inner) => { - ::abi_encode_raw( - inner, out, - ) - } - Self::create(inner) => { - ::abi_encode_raw(inner, out) - } - Self::deposit(inner) => { - ::abi_encode_raw(inner, out) - } - Self::owner(inner) => { - ::abi_encode_raw(inner, out) - } - Self::withdraw(inner) => { - ::abi_encode_raw(inner, out) - } - } - } - } - ///Container for all the [`CowAmmConstantProductFactory`](self) custom - /// errors. - #[derive(Clone, Debug, PartialEq, Eq, Hash)] - pub enum CowAmmConstantProductFactoryErrors { - #[allow(missing_docs)] - OnlyOwnerCanCall(OnlyOwnerCanCall), - #[allow(missing_docs)] - OrderNotValid(OrderNotValid), - } - impl CowAmmConstantProductFactoryErrors { - /// All the selectors of this enum. - /// - /// Note that the selectors might not be in the same order as the - /// variants. No guarantees are made about the order of the - /// selectors. - /// - /// Prefer using `SolInterface` methods instead. - pub const SELECTORS: &'static [[u8; 4usize]] = - &[[104u8, 186u8, 255u8, 248u8], [200u8, 252u8, 39u8, 37u8]]; - /// The signatures in the same order as `SELECTORS`. - pub const SIGNATURES: &'static [&'static str] = &[ - ::SIGNATURE, - ::SIGNATURE, - ]; - /// The names of the variants in the same order as `SELECTORS`. - pub const VARIANT_NAMES: &'static [&'static str] = &[ - ::core::stringify!(OnlyOwnerCanCall), - ::core::stringify!(OrderNotValid), - ]; - - /// Returns the signature for the given selector, if known. - #[inline] - pub fn signature_by_selector( - selector: [u8; 4usize], - ) -> ::core::option::Option<&'static str> { - match Self::SELECTORS.binary_search(&selector) { - ::core::result::Result::Ok(idx) => { - ::core::option::Option::Some(Self::SIGNATURES[idx]) - } - ::core::result::Result::Err(_) => ::core::option::Option::None, - } - } - - /// Returns the enum variant name for the given selector, if known. - #[inline] - pub fn name_by_selector(selector: [u8; 4usize]) -> ::core::option::Option<&'static str> { - let sig = Self::signature_by_selector(selector)?; - sig.split_once('(').map(|(name, _)| name) - } - } - #[automatically_derived] - impl alloy_sol_types::SolInterface for CowAmmConstantProductFactoryErrors { - const COUNT: usize = 2usize; - const MIN_DATA_LENGTH: usize = 32usize; - const NAME: &'static str = "CowAmmConstantProductFactoryErrors"; - - #[inline] - fn selector(&self) -> [u8; 4] { - match self { - Self::OnlyOwnerCanCall(_) => { - ::SELECTOR - } - Self::OrderNotValid(_) => ::SELECTOR, - } - } - - #[inline] - fn selector_at(i: usize) -> ::core::option::Option<[u8; 4]> { - Self::SELECTORS.get(i).copied() - } - - #[inline] - fn valid_selector(selector: [u8; 4]) -> bool { - Self::SELECTORS.binary_search(&selector).is_ok() - } - - #[inline] - #[allow(non_snake_case)] - fn abi_decode_raw(selector: [u8; 4], data: &[u8]) -> alloy_sol_types::Result { - static DECODE_SHIMS: &[fn( - &[u8], - ) -> alloy_sol_types::Result< - CowAmmConstantProductFactoryErrors, - >] = &[ - { - fn OnlyOwnerCanCall( - data: &[u8], - ) -> alloy_sol_types::Result - { - ::abi_decode_raw(data) - .map(CowAmmConstantProductFactoryErrors::OnlyOwnerCanCall) - } - OnlyOwnerCanCall - }, - { - fn OrderNotValid( - data: &[u8], - ) -> alloy_sol_types::Result - { - ::abi_decode_raw(data) - .map(CowAmmConstantProductFactoryErrors::OrderNotValid) - } - OrderNotValid - }, - ]; - let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { - return Err(alloy_sol_types::Error::unknown_selector( - ::NAME, - selector, - )); - }; - DECODE_SHIMS[idx](data) - } - - #[inline] - #[allow(non_snake_case)] - fn abi_decode_raw_validate( - selector: [u8; 4], - data: &[u8], - ) -> alloy_sol_types::Result { - static DECODE_VALIDATE_SHIMS: &[fn( - &[u8], - ) -> alloy_sol_types::Result< - CowAmmConstantProductFactoryErrors, - >] = &[ - { - fn OnlyOwnerCanCall( - data: &[u8], - ) -> alloy_sol_types::Result - { - ::abi_decode_raw_validate( - data, - ) - .map(CowAmmConstantProductFactoryErrors::OnlyOwnerCanCall) - } - OnlyOwnerCanCall - }, - { - fn OrderNotValid( - data: &[u8], - ) -> alloy_sol_types::Result - { - ::abi_decode_raw_validate(data) - .map(CowAmmConstantProductFactoryErrors::OrderNotValid) - } - OrderNotValid - }, - ]; - let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { - return Err(alloy_sol_types::Error::unknown_selector( - ::NAME, - selector, - )); - }; - DECODE_VALIDATE_SHIMS[idx](data) - } - - #[inline] - fn abi_encoded_size(&self) -> usize { - match self { - Self::OnlyOwnerCanCall(inner) => { - ::abi_encoded_size(inner) - } - Self::OrderNotValid(inner) => { - ::abi_encoded_size(inner) - } - } - } - - #[inline] - fn abi_encode_raw(&self, out: &mut alloy_sol_types::private::Vec) { - match self { - Self::OnlyOwnerCanCall(inner) => { - ::abi_encode_raw(inner, out) - } - Self::OrderNotValid(inner) => { - ::abi_encode_raw(inner, out) - } - } - } - } - ///Container for all the [`CowAmmConstantProductFactory`](self) events. - #[derive(Clone, Debug, PartialEq, Eq, Hash)] - pub enum CowAmmConstantProductFactoryEvents { - #[allow(missing_docs)] - ConditionalOrderCreated(ConditionalOrderCreated), - #[allow(missing_docs)] - Deployed(Deployed), - #[allow(missing_docs)] - TradingDisabled(TradingDisabled), - } - impl CowAmmConstantProductFactoryEvents { - /// All the selectors of this enum. - /// - /// Note that the selectors might not be in the same order as the - /// variants. No guarantees are made about the order of the - /// selectors. - /// - /// Prefer using `SolInterface` methods instead. - pub const SELECTORS: &'static [[u8; 32usize]] = &[ - [ - 44u8, 206u8, 172u8, 85u8, 85u8, 176u8, 202u8, 69u8, 163u8, 116u8, 76u8, 237u8, - 84u8, 47u8, 84u8, 181u8, 106u8, 210u8, 235u8, 69u8, 229u8, 33u8, 150u8, 35u8, - 114u8, 238u8, 242u8, 18u8, 162u8, 203u8, 243u8, 97u8, - ], - [ - 103u8, 7u8, 37u8, 91u8, 44u8, 92u8, 168u8, 18u8, 32u8, 178u8, 243u8, 228u8, 8u8, - 162u8, 105u8, 203u8, 131u8, 186u8, 166u8, 170u8, 126u8, 94u8, 55u8, 170u8, 23u8, - 86u8, 136u8, 58u8, 108u8, 223u8, 6u8, 241u8, - ], - [ - 199u8, 91u8, 244u8, 240u8, 60u8, 2u8, 250u8, 185u8, 65u8, 74u8, 125u8, 122u8, 84u8, - 4u8, 140u8, 4u8, 134u8, 114u8, 43u8, 199u8, 47u8, 51u8, 173u8, 146u8, 71u8, 9u8, - 160u8, 89u8, 54u8, 8u8, 173u8, 39u8, - ], - ]; - /// The signatures in the same order as `SELECTORS`. - pub const SIGNATURES: &'static [&'static str] = &[ - ::SIGNATURE, - ::SIGNATURE, - ::SIGNATURE, - ]; - /// The names of the variants in the same order as `SELECTORS`. - pub const VARIANT_NAMES: &'static [&'static str] = &[ - ::core::stringify!(ConditionalOrderCreated), - ::core::stringify!(Deployed), - ::core::stringify!(TradingDisabled), - ]; - - /// Returns the signature for the given selector, if known. - #[inline] - pub fn signature_by_selector( - selector: [u8; 32usize], - ) -> ::core::option::Option<&'static str> { - match Self::SELECTORS.binary_search(&selector) { - ::core::result::Result::Ok(idx) => { - ::core::option::Option::Some(Self::SIGNATURES[idx]) - } - ::core::result::Result::Err(_) => ::core::option::Option::None, - } - } - - /// Returns the enum variant name for the given selector, if known. - #[inline] - pub fn name_by_selector(selector: [u8; 32usize]) -> ::core::option::Option<&'static str> { - let sig = Self::signature_by_selector(selector)?; - sig.split_once('(').map(|(name, _)| name) - } - } - #[automatically_derived] - impl alloy_sol_types::SolEventInterface for CowAmmConstantProductFactoryEvents { - const COUNT: usize = 3usize; - const NAME: &'static str = "CowAmmConstantProductFactoryEvents"; - - fn decode_raw_log( - topics: &[alloy_sol_types::Word], - data: &[u8], - ) -> alloy_sol_types::Result { - match topics.first().copied() { - Some(::SIGNATURE_HASH) => { - ::decode_raw_log( - topics, data, - ) - .map(Self::ConditionalOrderCreated) - } - Some(::SIGNATURE_HASH) => { - ::decode_raw_log(topics, data) - .map(Self::Deployed) - } - Some(::SIGNATURE_HASH) => { - ::decode_raw_log(topics, data) - .map(Self::TradingDisabled) - } - _ => alloy_sol_types::private::Err(alloy_sol_types::Error::InvalidLog { - name: ::NAME, - log: alloy_sol_types::private::Box::new( - alloy_sol_types::private::LogData::new_unchecked( - topics.to_vec(), - data.to_vec().into(), - ), - ), - }), - } - } - } - #[automatically_derived] - impl alloy_sol_types::private::IntoLogData for CowAmmConstantProductFactoryEvents { - fn to_log_data(&self) -> alloy_sol_types::private::LogData { - match self { - Self::ConditionalOrderCreated(inner) => { - alloy_sol_types::private::IntoLogData::to_log_data(inner) - } - Self::Deployed(inner) => alloy_sol_types::private::IntoLogData::to_log_data(inner), - Self::TradingDisabled(inner) => { - alloy_sol_types::private::IntoLogData::to_log_data(inner) - } - } - } - - fn into_log_data(self) -> alloy_sol_types::private::LogData { - match self { - Self::ConditionalOrderCreated(inner) => { - alloy_sol_types::private::IntoLogData::into_log_data(inner) - } - Self::Deployed(inner) => { - alloy_sol_types::private::IntoLogData::into_log_data(inner) - } - Self::TradingDisabled(inner) => { - alloy_sol_types::private::IntoLogData::into_log_data(inner) - } - } - } - } - use alloy_contract; - /**Creates a new wrapper around an on-chain [`CowAmmConstantProductFactory`](self) contract instance. - - See the [wrapper's documentation](`CowAmmConstantProductFactoryInstance`) for more details.*/ - #[inline] - pub const fn new< - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - >( - address: alloy_sol_types::private::Address, - __provider: P, - ) -> CowAmmConstantProductFactoryInstance { - CowAmmConstantProductFactoryInstance::::new(address, __provider) - } - /**Deploys this contract using the given `provider` and constructor arguments, if any. - - Returns a new instance of the contract, if the deployment was successful. - - For more fine-grained control over the deployment process, use [`deploy_builder`] instead.*/ - #[inline] - pub fn deploy, N: alloy_contract::private::Network>( - __provider: P, - _settler: alloy_sol_types::private::Address, - ) -> impl ::core::future::Future< - Output = alloy_contract::Result>, - > { - CowAmmConstantProductFactoryInstance::::deploy(__provider, _settler) - } - /**Creates a `RawCallBuilder` for deploying this contract using the given `provider` - and constructor arguments, if any. - - This is a simple wrapper around creating a `RawCallBuilder` with the data set to - the bytecode concatenated with the constructor's ABI-encoded arguments.*/ - #[inline] - pub fn deploy_builder< - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - >( - __provider: P, - _settler: alloy_sol_types::private::Address, - ) -> alloy_contract::RawCallBuilder { - CowAmmConstantProductFactoryInstance::::deploy_builder(__provider, _settler) - } - /**A [`CowAmmConstantProductFactory`](self) instance. - - Contains type-safe methods for interacting with an on-chain instance of the - [`CowAmmConstantProductFactory`](self) contract located at a given `address`, using a given - provider `P`. - - If the contract bytecode is available (see the [`sol!`](alloy_sol_types::sol!) - documentation on how to provide it), the `deploy` and `deploy_builder` methods can - be used to deploy a new instance of the contract. - - See the [module-level documentation](self) for all the available methods.*/ - #[derive(Clone)] - pub struct CowAmmConstantProductFactoryInstance { - address: alloy_sol_types::private::Address, - provider: P, - _network: ::core::marker::PhantomData, - } - #[automatically_derived] - impl ::core::fmt::Debug for CowAmmConstantProductFactoryInstance { - #[inline] - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple("CowAmmConstantProductFactoryInstance") - .field(&self.address) - .finish() - } - } - /// Instantiation and getters/setters. - impl, N: alloy_contract::private::Network> - CowAmmConstantProductFactoryInstance - { - /**Creates a new wrapper around an on-chain [`CowAmmConstantProductFactory`](self) contract instance. - - See the [wrapper's documentation](`CowAmmConstantProductFactoryInstance`) for more details.*/ - #[inline] - pub const fn new(address: alloy_sol_types::private::Address, __provider: P) -> Self { - Self { - address, - provider: __provider, - _network: ::core::marker::PhantomData, - } - } - - /**Deploys this contract using the given `provider` and constructor arguments, if any. - - Returns a new instance of the contract, if the deployment was successful. - - For more fine-grained control over the deployment process, use [`deploy_builder`] instead.*/ - #[inline] - pub async fn deploy( - __provider: P, - _settler: alloy_sol_types::private::Address, - ) -> alloy_contract::Result> { - let call_builder = Self::deploy_builder(__provider, _settler); - let contract_address = call_builder.deploy().await?; - Ok(Self::new(contract_address, call_builder.provider)) - } - - /**Creates a `RawCallBuilder` for deploying this contract using the given `provider` - and constructor arguments, if any. - - This is a simple wrapper around creating a `RawCallBuilder` with the data set to - the bytecode concatenated with the constructor's ABI-encoded arguments.*/ - #[inline] - pub fn deploy_builder( - __provider: P, - _settler: alloy_sol_types::private::Address, - ) -> alloy_contract::RawCallBuilder { - alloy_contract::RawCallBuilder::new_raw_deploy( - __provider, - [ - &BYTECODE[..], - &alloy_sol_types::SolConstructor::abi_encode(&constructorCall { _settler })[..], - ] - .concat() - .into(), - ) - } - - /// Returns a reference to the address. - #[inline] - pub const fn address(&self) -> &alloy_sol_types::private::Address { - &self.address - } - - /// Sets the address. - #[inline] - pub fn set_address(&mut self, address: alloy_sol_types::private::Address) { - self.address = address; - } - - /// Sets the address and returns `self`. - pub fn at(mut self, address: alloy_sol_types::private::Address) -> Self { - self.set_address(address); - self - } - - /// Returns a reference to the provider. - #[inline] - pub const fn provider(&self) -> &P { - &self.provider - } - } - impl CowAmmConstantProductFactoryInstance<&P, N> { - /// Clones the provider and returns a new instance with the cloned - /// provider. - #[inline] - pub fn with_cloned_provider(self) -> CowAmmConstantProductFactoryInstance { - CowAmmConstantProductFactoryInstance { - address: self.address, - provider: ::core::clone::Clone::clone(&self.provider), - _network: ::core::marker::PhantomData, - } - } - } - /// Function calls. - impl, N: alloy_contract::private::Network> - CowAmmConstantProductFactoryInstance - { - /// Creates a new call builder using this contract instance's provider - /// and address. - /// - /// Note that the call can be any function call, not just those defined - /// in this contract. Prefer using the other methods for - /// building type-safe contract calls. - pub fn call_builder( - &self, - call: &C, - ) -> alloy_contract::SolCallBuilder<&P, C, N> { - alloy_contract::SolCallBuilder::new_sol(&self.provider, &self.address, call) - } - - ///Creates a new call builder for the [`ammDeterministicAddress`] - /// function. - pub fn ammDeterministicAddress( - &self, - ammOwner: alloy_sol_types::private::Address, - token0: alloy_sol_types::private::Address, - token1: alloy_sol_types::private::Address, - ) -> alloy_contract::SolCallBuilder<&P, ammDeterministicAddressCall, N> { - self.call_builder(&ammDeterministicAddressCall { - ammOwner, - token0, - token1, - }) - } - - ///Creates a new call builder for the [`create`] function. - pub fn create( - &self, - token0: alloy_sol_types::private::Address, - amount0: alloy_sol_types::private::primitives::aliases::U256, - token1: alloy_sol_types::private::Address, - amount1: alloy_sol_types::private::primitives::aliases::U256, - minTradedToken0: alloy_sol_types::private::primitives::aliases::U256, - priceOracle: alloy_sol_types::private::Address, - priceOracleData: alloy_sol_types::private::Bytes, - appData: alloy_sol_types::private::FixedBytes<32>, - ) -> alloy_contract::SolCallBuilder<&P, createCall, N> { - self.call_builder(&createCall { - token0, - amount0, - token1, - amount1, - minTradedToken0, - priceOracle, - priceOracleData, - appData, - }) - } - - ///Creates a new call builder for the [`deposit`] function. - pub fn deposit( - &self, - amm: alloy_sol_types::private::Address, - amount0: alloy_sol_types::private::primitives::aliases::U256, - amount1: alloy_sol_types::private::primitives::aliases::U256, - ) -> alloy_contract::SolCallBuilder<&P, depositCall, N> { - self.call_builder(&depositCall { - amm, - amount0, - amount1, - }) - } - - ///Creates a new call builder for the [`owner`] function. - pub fn owner( - &self, - _0: alloy_sol_types::private::Address, - ) -> alloy_contract::SolCallBuilder<&P, ownerCall, N> { - self.call_builder(&ownerCall(_0)) - } - - ///Creates a new call builder for the [`withdraw`] function. - pub fn withdraw( - &self, - amm: alloy_sol_types::private::Address, - amount0: alloy_sol_types::private::primitives::aliases::U256, - amount1: alloy_sol_types::private::primitives::aliases::U256, - ) -> alloy_contract::SolCallBuilder<&P, withdrawCall, N> { - self.call_builder(&withdrawCall { - amm, - amount0, - amount1, - }) - } - } - /// Event filters. - impl, N: alloy_contract::private::Network> - CowAmmConstantProductFactoryInstance - { - /// Creates a new event filter using this contract instance's provider - /// and address. - /// - /// Note that the type can be any event, not just those defined in this - /// contract. Prefer using the other methods for building - /// type-safe event filters. - pub fn event_filter( - &self, - ) -> alloy_contract::Event<&P, E, N> { - alloy_contract::Event::new_sol(&self.provider, &self.address) - } - - ///Creates a new event filter for the [`ConditionalOrderCreated`] - /// event. - pub fn ConditionalOrderCreated_filter( - &self, - ) -> alloy_contract::Event<&P, ConditionalOrderCreated, N> { - self.event_filter::() - } - - ///Creates a new event filter for the [`Deployed`] event. - pub fn Deployed_filter(&self) -> alloy_contract::Event<&P, Deployed, N> { - self.event_filter::() - } - - ///Creates a new event filter for the [`TradingDisabled`] event. - pub fn TradingDisabled_filter(&self) -> alloy_contract::Event<&P, TradingDisabled, N> { - self.event_filter::() - } - } -} -pub type Instance = CowAmmConstantProductFactory::CowAmmConstantProductFactoryInstance< - ::alloy_provider::DynProvider, ->; -use { - alloy_primitives::{Address, address}, - alloy_provider::{DynProvider, Provider}, - anyhow::{Context, Result}, - std::{collections::HashMap, sync::LazyLock}, -}; -pub const fn deployment_info(chain_id: u64) -> Option<(Address, Option)> { - match chain_id { - 1u64 => Some(( - ::alloy_primitives::address!("0x40664207e3375FB4b733d4743CE9b159331fd034"), - Some(19861952u64), - )), - 100u64 => Some(( - ::alloy_primitives::address!("0xdb1cba3a87f2db53b6e1e6af48e28ed877592ec0"), - Some(33874317u64), - )), - 11155111u64 => Some(( - ::alloy_primitives::address!("0xb808e8183e3a72d196457d127c7fd4befa0d7fd3"), - Some(5874562u64), - )), - _ => None, - } -} -pub const fn deployment_address(chain_id: &u64) -> Option<::alloy_primitives::Address> { - match deployment_info(*chain_id) { - Some((address, _)) => Some(address), - None => None, - } -} -pub const fn deployment_block(chain_id: &u64) -> Option { - match deployment_info(*chain_id) { - Some((_, block)) => block, - None => None, - } -} -impl Instance { - pub fn deployed(provider: &DynProvider) -> impl Future> + Send { - async move { - let chain_id = provider - .get_chain_id() - .await - .context("could not fetch current chain id")?; - let (address, _deployed_block) = deployment_info(chain_id) - .with_context(|| format!("no deployment info for chain {chain_id:?}"))?; - Ok(Instance::new(address, provider.clone())) - } - } -} diff --git a/contracts/generated/contracts-generated/cowammfactorygetter/Cargo.toml b/contracts/generated/contracts-generated/cowammfactorygetter/Cargo.toml deleted file mode 100644 index f70f9f2106..0000000000 --- a/contracts/generated/contracts-generated/cowammfactorygetter/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -# Auto-generated by contracts-generate. Do not edit. -[package] -name = "cow-contract-cowammfactorygetter" -version = "0.1.0" -edition = "2024" -publish = false - -[lib] -doctest = false - -[dependencies] -alloy-contract = { workspace = true } -alloy-primitives = { workspace = true } -alloy-provider = { workspace = true } -alloy-sol-types = { workspace = true } -anyhow = { workspace = true } - -[lints] -workspace = true diff --git a/contracts/generated/contracts-generated/cowammfactorygetter/src/lib.rs b/contracts/generated/contracts-generated/cowammfactorygetter/src/lib.rs deleted file mode 100644 index c3dbb5b91f..0000000000 --- a/contracts/generated/contracts-generated/cowammfactorygetter/src/lib.rs +++ /dev/null @@ -1,441 +0,0 @@ -#![allow( - unused_imports, - unused_attributes, - clippy::all, - rustdoc::all, - non_snake_case -)] -//! Auto-generated contract bindings. Do not edit. -/** - -Generated by the following Solidity interface... -```solidity -interface CowAmmFactoryGetter { - function FACTORY() external view returns (address); -} -``` - -...which was generated by the following JSON ABI: -```json -[ - { - "type": "function", - "name": "FACTORY", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - } -] -```*/ -#[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style, - clippy::empty_structs_with_brackets -)] -pub mod CowAmmFactoryGetter { - use {super::*, alloy_sol_types}; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `FACTORY()` and selector `0x2dd31000`. - ```solidity - function FACTORY() external view returns (address); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct FACTORYCall; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the - /// [`FACTORY()`](FACTORYCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct FACTORYReturn { - #[allow(missing_docs)] - pub _0: alloy_sol_types::private::Address, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: FACTORYCall) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for FACTORYCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - } - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (alloy_sol_types::sol_data::Address,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy_sol_types::private::Address,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: FACTORYReturn) -> Self { - (value._0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for FACTORYReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for FACTORYCall { - type Parameters<'a> = (); - type Return = alloy_sol_types::private::Address; - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type ReturnTuple<'a> = (alloy_sol_types::sol_data::Address,); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [45u8, 211u8, 16u8, 0u8]; - const SIGNATURE: &'static str = "FACTORY()"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - (::tokenize(ret),) - } - - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data).map( - |r| { - let r: FACTORYReturn = r.into(); - r._0 - }, - ) - } - - #[inline] - fn abi_decode_returns_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(|r| { - let r: FACTORYReturn = r.into(); - r._0 - }) - } - } - }; - ///Container for all the [`CowAmmFactoryGetter`](self) function calls. - #[derive(Clone)] - pub enum CowAmmFactoryGetterCalls { - #[allow(missing_docs)] - FACTORY(FACTORYCall), - } - impl CowAmmFactoryGetterCalls { - /// All the selectors of this enum. - /// - /// Note that the selectors might not be in the same order as the - /// variants. No guarantees are made about the order of the - /// selectors. - /// - /// Prefer using `SolInterface` methods instead. - pub const SELECTORS: &'static [[u8; 4usize]] = &[[45u8, 211u8, 16u8, 0u8]]; - /// The signatures in the same order as `SELECTORS`. - pub const SIGNATURES: &'static [&'static str] = - &[::SIGNATURE]; - /// The names of the variants in the same order as `SELECTORS`. - pub const VARIANT_NAMES: &'static [&'static str] = &[::core::stringify!(FACTORY)]; - - /// Returns the signature for the given selector, if known. - #[inline] - pub fn signature_by_selector( - selector: [u8; 4usize], - ) -> ::core::option::Option<&'static str> { - match Self::SELECTORS.binary_search(&selector) { - ::core::result::Result::Ok(idx) => { - ::core::option::Option::Some(Self::SIGNATURES[idx]) - } - ::core::result::Result::Err(_) => ::core::option::Option::None, - } - } - - /// Returns the enum variant name for the given selector, if known. - #[inline] - pub fn name_by_selector(selector: [u8; 4usize]) -> ::core::option::Option<&'static str> { - let sig = Self::signature_by_selector(selector)?; - sig.split_once('(').map(|(name, _)| name) - } - } - #[automatically_derived] - impl alloy_sol_types::SolInterface for CowAmmFactoryGetterCalls { - const COUNT: usize = 1usize; - const MIN_DATA_LENGTH: usize = 0usize; - const NAME: &'static str = "CowAmmFactoryGetterCalls"; - - #[inline] - fn selector(&self) -> [u8; 4] { - match self { - Self::FACTORY(_) => ::SELECTOR, - } - } - - #[inline] - fn selector_at(i: usize) -> ::core::option::Option<[u8; 4]> { - Self::SELECTORS.get(i).copied() - } - - #[inline] - fn valid_selector(selector: [u8; 4]) -> bool { - Self::SELECTORS.binary_search(&selector).is_ok() - } - - #[inline] - #[allow(non_snake_case)] - fn abi_decode_raw(selector: [u8; 4], data: &[u8]) -> alloy_sol_types::Result { - static DECODE_SHIMS: &[fn( - &[u8], - ) - -> alloy_sol_types::Result] = &[{ - fn FACTORY(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw(data) - .map(CowAmmFactoryGetterCalls::FACTORY) - } - FACTORY - }]; - let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { - return Err(alloy_sol_types::Error::unknown_selector( - ::NAME, - selector, - )); - }; - DECODE_SHIMS[idx](data) - } - - #[inline] - #[allow(non_snake_case)] - fn abi_decode_raw_validate( - selector: [u8; 4], - data: &[u8], - ) -> alloy_sol_types::Result { - static DECODE_VALIDATE_SHIMS: &[fn( - &[u8], - ) -> alloy_sol_types::Result< - CowAmmFactoryGetterCalls, - >] = &[{ - fn FACTORY(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw_validate(data) - .map(CowAmmFactoryGetterCalls::FACTORY) - } - FACTORY - }]; - let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { - return Err(alloy_sol_types::Error::unknown_selector( - ::NAME, - selector, - )); - }; - DECODE_VALIDATE_SHIMS[idx](data) - } - - #[inline] - fn abi_encoded_size(&self) -> usize { - match self { - Self::FACTORY(inner) => { - ::abi_encoded_size(inner) - } - } - } - - #[inline] - fn abi_encode_raw(&self, out: &mut alloy_sol_types::private::Vec) { - match self { - Self::FACTORY(inner) => { - ::abi_encode_raw(inner, out) - } - } - } - } - use alloy_contract; - /**Creates a new wrapper around an on-chain [`CowAmmFactoryGetter`](self) contract instance. - - See the [wrapper's documentation](`CowAmmFactoryGetterInstance`) for more details.*/ - #[inline] - pub const fn new< - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - >( - address: alloy_sol_types::private::Address, - __provider: P, - ) -> CowAmmFactoryGetterInstance { - CowAmmFactoryGetterInstance::::new(address, __provider) - } - /**A [`CowAmmFactoryGetter`](self) instance. - - Contains type-safe methods for interacting with an on-chain instance of the - [`CowAmmFactoryGetter`](self) contract located at a given `address`, using a given - provider `P`. - - If the contract bytecode is available (see the [`sol!`](alloy_sol_types::sol!) - documentation on how to provide it), the `deploy` and `deploy_builder` methods can - be used to deploy a new instance of the contract. - - See the [module-level documentation](self) for all the available methods.*/ - #[derive(Clone)] - pub struct CowAmmFactoryGetterInstance { - address: alloy_sol_types::private::Address, - provider: P, - _network: ::core::marker::PhantomData, - } - #[automatically_derived] - impl ::core::fmt::Debug for CowAmmFactoryGetterInstance { - #[inline] - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple("CowAmmFactoryGetterInstance") - .field(&self.address) - .finish() - } - } - /// Instantiation and getters/setters. - impl, N: alloy_contract::private::Network> - CowAmmFactoryGetterInstance - { - /**Creates a new wrapper around an on-chain [`CowAmmFactoryGetter`](self) contract instance. - - See the [wrapper's documentation](`CowAmmFactoryGetterInstance`) for more details.*/ - #[inline] - pub const fn new(address: alloy_sol_types::private::Address, __provider: P) -> Self { - Self { - address, - provider: __provider, - _network: ::core::marker::PhantomData, - } - } - - /// Returns a reference to the address. - #[inline] - pub const fn address(&self) -> &alloy_sol_types::private::Address { - &self.address - } - - /// Sets the address. - #[inline] - pub fn set_address(&mut self, address: alloy_sol_types::private::Address) { - self.address = address; - } - - /// Sets the address and returns `self`. - pub fn at(mut self, address: alloy_sol_types::private::Address) -> Self { - self.set_address(address); - self - } - - /// Returns a reference to the provider. - #[inline] - pub const fn provider(&self) -> &P { - &self.provider - } - } - impl CowAmmFactoryGetterInstance<&P, N> { - /// Clones the provider and returns a new instance with the cloned - /// provider. - #[inline] - pub fn with_cloned_provider(self) -> CowAmmFactoryGetterInstance { - CowAmmFactoryGetterInstance { - address: self.address, - provider: ::core::clone::Clone::clone(&self.provider), - _network: ::core::marker::PhantomData, - } - } - } - /// Function calls. - impl, N: alloy_contract::private::Network> - CowAmmFactoryGetterInstance - { - /// Creates a new call builder using this contract instance's provider - /// and address. - /// - /// Note that the call can be any function call, not just those defined - /// in this contract. Prefer using the other methods for - /// building type-safe contract calls. - pub fn call_builder( - &self, - call: &C, - ) -> alloy_contract::SolCallBuilder<&P, C, N> { - alloy_contract::SolCallBuilder::new_sol(&self.provider, &self.address, call) - } - - ///Creates a new call builder for the [`FACTORY`] function. - pub fn FACTORY(&self) -> alloy_contract::SolCallBuilder<&P, FACTORYCall, N> { - self.call_builder(&FACTORYCall) - } - } - /// Event filters. - impl, N: alloy_contract::private::Network> - CowAmmFactoryGetterInstance - { - /// Creates a new event filter using this contract instance's provider - /// and address. - /// - /// Note that the type can be any event, not just those defined in this - /// contract. Prefer using the other methods for building - /// type-safe event filters. - pub fn event_filter( - &self, - ) -> alloy_contract::Event<&P, E, N> { - alloy_contract::Event::new_sol(&self.provider, &self.address) - } - } -} -pub type Instance = CowAmmFactoryGetter::CowAmmFactoryGetterInstance<::alloy_provider::DynProvider>; diff --git a/contracts/generated/contracts-generated/cowammlegacyhelper/Cargo.toml b/contracts/generated/contracts-generated/cowammlegacyhelper/Cargo.toml deleted file mode 100644 index 39331d874d..0000000000 --- a/contracts/generated/contracts-generated/cowammlegacyhelper/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -# Auto-generated by contracts-generate. Do not edit. -[package] -name = "cow-contract-cowammlegacyhelper" -version = "0.1.0" -edition = "2024" -publish = false - -[lib] -doctest = false - -[dependencies] -alloy-contract = { workspace = true } -alloy-primitives = { workspace = true } -alloy-provider = { workspace = true } -alloy-sol-types = { workspace = true } -anyhow = { workspace = true } - -[lints] -workspace = true diff --git a/contracts/generated/contracts-generated/cowammlegacyhelper/src/lib.rs b/contracts/generated/contracts-generated/cowammlegacyhelper/src/lib.rs deleted file mode 100644 index e0d8676626..0000000000 --- a/contracts/generated/contracts-generated/cowammlegacyhelper/src/lib.rs +++ /dev/null @@ -1,3196 +0,0 @@ -#![allow( - unused_imports, - unused_attributes, - clippy::all, - rustdoc::all, - non_snake_case -)] -//! Auto-generated contract bindings. Do not edit. -///Module containing a contract's types and functions. -/** - -```solidity -library GPv2Interaction { - struct Data { address target; uint256 value; bytes callData; } -} -```*/ -#[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style, - clippy::empty_structs_with_brackets -)] -pub mod GPv2Interaction { - use {super::*, alloy_sol_types}; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**```solidity - struct Data { address target; uint256 value; bytes callData; } - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct Data { - #[allow(missing_docs)] - pub target: alloy_sol_types::private::Address, - #[allow(missing_docs)] - pub value: alloy_sol_types::private::primitives::aliases::U256, - #[allow(missing_docs)] - pub callData: alloy_sol_types::private::Bytes, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = ( - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Uint<256>, - alloy_sol_types::sol_data::Bytes, - ); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy_sol_types::private::Address, - alloy_sol_types::private::primitives::aliases::U256, - alloy_sol_types::private::Bytes, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: Data) -> Self { - (value.target, value.value, value.callData) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for Data { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - target: tuple.0, - value: tuple.1, - callData: tuple.2, - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolValue for Data { - type SolType = Self; - } - #[automatically_derived] - impl alloy_sol_types::private::SolTypeValue for Data { - #[inline] - fn stv_to_tokens(&self) -> ::Token<'_> { - ( - ::tokenize( - &self.target, - ), - as alloy_sol_types::SolType>::tokenize( - &self.value, - ), - ::tokenize( - &self.callData, - ), - ) - } - - #[inline] - fn stv_abi_encoded_size(&self) -> usize { - if let Some(size) = ::ENCODED_SIZE { - return size; - } - let tuple = - as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_encoded_size(&tuple) - } - - #[inline] - fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { - ::eip712_hash_struct(self) - } - - #[inline] - fn stv_abi_encode_packed_to(&self, out: &mut alloy_sol_types::private::Vec) { - let tuple = - as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_encode_packed_to( - &tuple, out, - ) - } - - #[inline] - fn stv_abi_packed_encoded_size(&self) -> usize { - if let Some(size) = ::PACKED_ENCODED_SIZE { - return size; - } - let tuple = - as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_packed_encoded_size( - &tuple, - ) - } - } - #[automatically_derived] - impl alloy_sol_types::SolType for Data { - type RustType = Self; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const ENCODED_SIZE: Option = - as alloy_sol_types::SolType>::ENCODED_SIZE; - const PACKED_ENCODED_SIZE: Option = - as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; - const SOL_NAME: &'static str = ::NAME; - - #[inline] - fn valid_token(token: &Self::Token<'_>) -> bool { - as alloy_sol_types::SolType>::valid_token(token) - } - - #[inline] - fn detokenize(token: Self::Token<'_>) -> Self::RustType { - let tuple = as alloy_sol_types::SolType>::detokenize(token); - >>::from(tuple) - } - } - #[automatically_derived] - impl alloy_sol_types::SolStruct for Data { - const NAME: &'static str = "Data"; - - #[inline] - fn eip712_root_type() -> alloy_sol_types::private::Cow<'static, str> { - alloy_sol_types::private::Cow::Borrowed( - "Data(address target,uint256 value,bytes callData)", - ) - } - - #[inline] - fn eip712_components() - -> alloy_sol_types::private::Vec> - { - alloy_sol_types::private::Vec::new() - } - - #[inline] - fn eip712_encode_type() -> alloy_sol_types::private::Cow<'static, str> { - ::eip712_root_type() - } - - #[inline] - fn eip712_encode_data(&self) -> alloy_sol_types::private::Vec { - [ - ::eip712_data_word( - &self.target, - ) - .0, - as alloy_sol_types::SolType>::eip712_data_word(&self.value) - .0, - ::eip712_data_word( - &self.callData, - ) - .0, - ] - .concat() - } - } - #[automatically_derived] - impl alloy_sol_types::EventTopic for Data { - #[inline] - fn topic_preimage_length(rust: &Self::RustType) -> usize { - 0usize - + ::topic_preimage_length( - &rust.target, - ) - + as alloy_sol_types::EventTopic>::topic_preimage_length(&rust.value) - + ::topic_preimage_length( - &rust.callData, - ) - } - - #[inline] - fn encode_topic_preimage( - rust: &Self::RustType, - out: &mut alloy_sol_types::private::Vec, - ) { - out.reserve(::topic_preimage_length(rust)); - ::encode_topic_preimage( - &rust.target, - out, - ); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.value, - out, - ); - ::encode_topic_preimage( - &rust.callData, - out, - ); - } - - #[inline] - fn encode_topic(rust: &Self::RustType) -> alloy_sol_types::abi::token::WordToken { - let mut out = alloy_sol_types::private::Vec::new(); - ::encode_topic_preimage(rust, &mut out); - alloy_sol_types::abi::token::WordToken(alloy_sol_types::private::keccak256(out)) - } - } - }; - use alloy_contract; - /**Creates a new wrapper around an on-chain [`GPv2Interaction`](self) contract instance. - - See the [wrapper's documentation](`GPv2InteractionInstance`) for more details.*/ - #[inline] - pub const fn new< - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - >( - address: alloy_sol_types::private::Address, - __provider: P, - ) -> GPv2InteractionInstance { - GPv2InteractionInstance::::new(address, __provider) - } - /**A [`GPv2Interaction`](self) instance. - - Contains type-safe methods for interacting with an on-chain instance of the - [`GPv2Interaction`](self) contract located at a given `address`, using a given - provider `P`. - - If the contract bytecode is available (see the [`sol!`](alloy_sol_types::sol!) - documentation on how to provide it), the `deploy` and `deploy_builder` methods can - be used to deploy a new instance of the contract. - - See the [module-level documentation](self) for all the available methods.*/ - #[derive(Clone)] - pub struct GPv2InteractionInstance { - address: alloy_sol_types::private::Address, - provider: P, - _network: ::core::marker::PhantomData, - } - #[automatically_derived] - impl ::core::fmt::Debug for GPv2InteractionInstance { - #[inline] - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple("GPv2InteractionInstance") - .field(&self.address) - .finish() - } - } - /// Instantiation and getters/setters. - impl, N: alloy_contract::private::Network> - GPv2InteractionInstance - { - /**Creates a new wrapper around an on-chain [`GPv2Interaction`](self) contract instance. - - See the [wrapper's documentation](`GPv2InteractionInstance`) for more details.*/ - #[inline] - pub const fn new(address: alloy_sol_types::private::Address, __provider: P) -> Self { - Self { - address, - provider: __provider, - _network: ::core::marker::PhantomData, - } - } - - /// Returns a reference to the address. - #[inline] - pub const fn address(&self) -> &alloy_sol_types::private::Address { - &self.address - } - - /// Sets the address. - #[inline] - pub fn set_address(&mut self, address: alloy_sol_types::private::Address) { - self.address = address; - } - - /// Sets the address and returns `self`. - pub fn at(mut self, address: alloy_sol_types::private::Address) -> Self { - self.set_address(address); - self - } - - /// Returns a reference to the provider. - #[inline] - pub const fn provider(&self) -> &P { - &self.provider - } - } - impl GPv2InteractionInstance<&P, N> { - /// Clones the provider and returns a new instance with the cloned - /// provider. - #[inline] - pub fn with_cloned_provider(self) -> GPv2InteractionInstance { - GPv2InteractionInstance { - address: self.address, - provider: ::core::clone::Clone::clone(&self.provider), - _network: ::core::marker::PhantomData, - } - } - } - /// Function calls. - impl, N: alloy_contract::private::Network> - GPv2InteractionInstance - { - /// Creates a new call builder using this contract instance's provider - /// and address. - /// - /// Note that the call can be any function call, not just those defined - /// in this contract. Prefer using the other methods for - /// building type-safe contract calls. - pub fn call_builder( - &self, - call: &C, - ) -> alloy_contract::SolCallBuilder<&P, C, N> { - alloy_contract::SolCallBuilder::new_sol(&self.provider, &self.address, call) - } - } - /// Event filters. - impl, N: alloy_contract::private::Network> - GPv2InteractionInstance - { - /// Creates a new event filter using this contract instance's provider - /// and address. - /// - /// Note that the type can be any event, not just those defined in this - /// contract. Prefer using the other methods for building - /// type-safe event filters. - pub fn event_filter( - &self, - ) -> alloy_contract::Event<&P, E, N> { - alloy_contract::Event::new_sol(&self.provider, &self.address) - } - } -} -///Module containing a contract's types and functions. -/** - -```solidity -library GPv2Order { - struct Data { address sellToken; address buyToken; address receiver; uint256 sellAmount; uint256 buyAmount; uint32 validTo; bytes32 appData; uint256 feeAmount; bytes32 kind; bool partiallyFillable; bytes32 sellTokenBalance; bytes32 buyTokenBalance; } -} -```*/ -#[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style, - clippy::empty_structs_with_brackets -)] -pub mod GPv2Order { - use {super::*, alloy_sol_types}; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**```solidity - struct Data { address sellToken; address buyToken; address receiver; uint256 sellAmount; uint256 buyAmount; uint32 validTo; bytes32 appData; uint256 feeAmount; bytes32 kind; bool partiallyFillable; bytes32 sellTokenBalance; bytes32 buyTokenBalance; } - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct Data { - #[allow(missing_docs)] - pub sellToken: alloy_sol_types::private::Address, - #[allow(missing_docs)] - pub buyToken: alloy_sol_types::private::Address, - #[allow(missing_docs)] - pub receiver: alloy_sol_types::private::Address, - #[allow(missing_docs)] - pub sellAmount: alloy_sol_types::private::primitives::aliases::U256, - #[allow(missing_docs)] - pub buyAmount: alloy_sol_types::private::primitives::aliases::U256, - #[allow(missing_docs)] - pub validTo: u32, - #[allow(missing_docs)] - pub appData: alloy_sol_types::private::FixedBytes<32>, - #[allow(missing_docs)] - pub feeAmount: alloy_sol_types::private::primitives::aliases::U256, - #[allow(missing_docs)] - pub kind: alloy_sol_types::private::FixedBytes<32>, - #[allow(missing_docs)] - pub partiallyFillable: bool, - #[allow(missing_docs)] - pub sellTokenBalance: alloy_sol_types::private::FixedBytes<32>, - #[allow(missing_docs)] - pub buyTokenBalance: alloy_sol_types::private::FixedBytes<32>, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = ( - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Uint<256>, - alloy_sol_types::sol_data::Uint<256>, - alloy_sol_types::sol_data::Uint<32>, - alloy_sol_types::sol_data::FixedBytes<32>, - alloy_sol_types::sol_data::Uint<256>, - alloy_sol_types::sol_data::FixedBytes<32>, - alloy_sol_types::sol_data::Bool, - alloy_sol_types::sol_data::FixedBytes<32>, - alloy_sol_types::sol_data::FixedBytes<32>, - ); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy_sol_types::private::Address, - alloy_sol_types::private::Address, - alloy_sol_types::private::Address, - alloy_sol_types::private::primitives::aliases::U256, - alloy_sol_types::private::primitives::aliases::U256, - u32, - alloy_sol_types::private::FixedBytes<32>, - alloy_sol_types::private::primitives::aliases::U256, - alloy_sol_types::private::FixedBytes<32>, - bool, - alloy_sol_types::private::FixedBytes<32>, - alloy_sol_types::private::FixedBytes<32>, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: Data) -> Self { - ( - value.sellToken, - value.buyToken, - value.receiver, - value.sellAmount, - value.buyAmount, - value.validTo, - value.appData, - value.feeAmount, - value.kind, - value.partiallyFillable, - value.sellTokenBalance, - value.buyTokenBalance, - ) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for Data { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - sellToken: tuple.0, - buyToken: tuple.1, - receiver: tuple.2, - sellAmount: tuple.3, - buyAmount: tuple.4, - validTo: tuple.5, - appData: tuple.6, - feeAmount: tuple.7, - kind: tuple.8, - partiallyFillable: tuple.9, - sellTokenBalance: tuple.10, - buyTokenBalance: tuple.11, - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolValue for Data { - type SolType = Self; - } - #[automatically_derived] - impl alloy_sol_types::private::SolTypeValue for Data { - #[inline] - fn stv_to_tokens(&self) -> ::Token<'_> { - ( - ::tokenize( - &self.sellToken, - ), - ::tokenize( - &self.buyToken, - ), - ::tokenize( - &self.receiver, - ), - as alloy_sol_types::SolType>::tokenize(&self.sellAmount), - as alloy_sol_types::SolType>::tokenize(&self.buyAmount), - as alloy_sol_types::SolType>::tokenize(&self.validTo), - as alloy_sol_types::SolType>::tokenize(&self.appData), - as alloy_sol_types::SolType>::tokenize(&self.feeAmount), - as alloy_sol_types::SolType>::tokenize(&self.kind), - ::tokenize( - &self.partiallyFillable, - ), - as alloy_sol_types::SolType>::tokenize(&self.sellTokenBalance), - as alloy_sol_types::SolType>::tokenize(&self.buyTokenBalance), - ) - } - - #[inline] - fn stv_abi_encoded_size(&self) -> usize { - if let Some(size) = ::ENCODED_SIZE { - return size; - } - let tuple = - as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_encoded_size(&tuple) - } - - #[inline] - fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { - ::eip712_hash_struct(self) - } - - #[inline] - fn stv_abi_encode_packed_to(&self, out: &mut alloy_sol_types::private::Vec) { - let tuple = - as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_encode_packed_to( - &tuple, out, - ) - } - - #[inline] - fn stv_abi_packed_encoded_size(&self) -> usize { - if let Some(size) = ::PACKED_ENCODED_SIZE { - return size; - } - let tuple = - as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_packed_encoded_size( - &tuple, - ) - } - } - #[automatically_derived] - impl alloy_sol_types::SolType for Data { - type RustType = Self; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const ENCODED_SIZE: Option = - as alloy_sol_types::SolType>::ENCODED_SIZE; - const PACKED_ENCODED_SIZE: Option = - as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; - const SOL_NAME: &'static str = ::NAME; - - #[inline] - fn valid_token(token: &Self::Token<'_>) -> bool { - as alloy_sol_types::SolType>::valid_token(token) - } - - #[inline] - fn detokenize(token: Self::Token<'_>) -> Self::RustType { - let tuple = as alloy_sol_types::SolType>::detokenize(token); - >>::from(tuple) - } - } - #[automatically_derived] - impl alloy_sol_types::SolStruct for Data { - const NAME: &'static str = "Data"; - - #[inline] - fn eip712_root_type() -> alloy_sol_types::private::Cow<'static, str> { - alloy_sol_types::private::Cow::Borrowed( - "Data(address sellToken,address buyToken,address receiver,uint256 \ - sellAmount,uint256 buyAmount,uint32 validTo,bytes32 appData,uint256 \ - feeAmount,bytes32 kind,bool partiallyFillable,bytes32 \ - sellTokenBalance,bytes32 buyTokenBalance)", - ) - } - - #[inline] - fn eip712_components() - -> alloy_sol_types::private::Vec> - { - alloy_sol_types::private::Vec::new() - } - - #[inline] - fn eip712_encode_type() -> alloy_sol_types::private::Cow<'static, str> { - ::eip712_root_type() - } - - #[inline] - fn eip712_encode_data(&self) -> alloy_sol_types::private::Vec { - [ - ::eip712_data_word( - &self.sellToken, - ) - .0, - ::eip712_data_word( - &self.buyToken, - ) - .0, - ::eip712_data_word( - &self.receiver, - ) - .0, - as alloy_sol_types::SolType>::eip712_data_word(&self.sellAmount) - .0, - as alloy_sol_types::SolType>::eip712_data_word(&self.buyAmount) - .0, - as alloy_sol_types::SolType>::eip712_data_word(&self.validTo) - .0, - as alloy_sol_types::SolType>::eip712_data_word(&self.appData) - .0, - as alloy_sol_types::SolType>::eip712_data_word(&self.feeAmount) - .0, - as alloy_sol_types::SolType>::eip712_data_word(&self.kind) - .0, - ::eip712_data_word( - &self.partiallyFillable, - ) - .0, - as alloy_sol_types::SolType>::eip712_data_word( - &self.sellTokenBalance, - ) - .0, - as alloy_sol_types::SolType>::eip712_data_word( - &self.buyTokenBalance, - ) - .0, - ] - .concat() - } - } - #[automatically_derived] - impl alloy_sol_types::EventTopic for Data { - #[inline] - fn topic_preimage_length(rust: &Self::RustType) -> usize { - 0usize - + ::topic_preimage_length( - &rust.sellToken, - ) - + ::topic_preimage_length( - &rust.buyToken, - ) - + ::topic_preimage_length( - &rust.receiver, - ) - + as alloy_sol_types::EventTopic>::topic_preimage_length( - &rust.sellAmount, - ) - + as alloy_sol_types::EventTopic>::topic_preimage_length( - &rust.buyAmount, - ) - + as alloy_sol_types::EventTopic>::topic_preimage_length( - &rust.validTo, - ) - + as alloy_sol_types::EventTopic>::topic_preimage_length( - &rust.appData, - ) - + as alloy_sol_types::EventTopic>::topic_preimage_length( - &rust.feeAmount, - ) - + as alloy_sol_types::EventTopic>::topic_preimage_length(&rust.kind) - + ::topic_preimage_length( - &rust.partiallyFillable, - ) - + as alloy_sol_types::EventTopic>::topic_preimage_length( - &rust.sellTokenBalance, - ) - + as alloy_sol_types::EventTopic>::topic_preimage_length( - &rust.buyTokenBalance, - ) - } - - #[inline] - fn encode_topic_preimage( - rust: &Self::RustType, - out: &mut alloy_sol_types::private::Vec, - ) { - out.reserve(::topic_preimage_length(rust)); - ::encode_topic_preimage( - &rust.sellToken, - out, - ); - ::encode_topic_preimage( - &rust.buyToken, - out, - ); - ::encode_topic_preimage( - &rust.receiver, - out, - ); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.sellAmount, - out, - ); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.buyAmount, - out, - ); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.validTo, - out, - ); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.appData, - out, - ); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.feeAmount, - out, - ); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.kind, - out, - ); - ::encode_topic_preimage( - &rust.partiallyFillable, - out, - ); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.sellTokenBalance, - out, - ); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.buyTokenBalance, - out, - ); - } - - #[inline] - fn encode_topic(rust: &Self::RustType) -> alloy_sol_types::abi::token::WordToken { - let mut out = alloy_sol_types::private::Vec::new(); - ::encode_topic_preimage(rust, &mut out); - alloy_sol_types::abi::token::WordToken(alloy_sol_types::private::keccak256(out)) - } - } - }; - use alloy_contract; - /**Creates a new wrapper around an on-chain [`GPv2Order`](self) contract instance. - - See the [wrapper's documentation](`GPv2OrderInstance`) for more details.*/ - #[inline] - pub const fn new< - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - >( - address: alloy_sol_types::private::Address, - __provider: P, - ) -> GPv2OrderInstance { - GPv2OrderInstance::::new(address, __provider) - } - /**A [`GPv2Order`](self) instance. - - Contains type-safe methods for interacting with an on-chain instance of the - [`GPv2Order`](self) contract located at a given `address`, using a given - provider `P`. - - If the contract bytecode is available (see the [`sol!`](alloy_sol_types::sol!) - documentation on how to provide it), the `deploy` and `deploy_builder` methods can - be used to deploy a new instance of the contract. - - See the [module-level documentation](self) for all the available methods.*/ - #[derive(Clone)] - pub struct GPv2OrderInstance { - address: alloy_sol_types::private::Address, - provider: P, - _network: ::core::marker::PhantomData, - } - #[automatically_derived] - impl ::core::fmt::Debug for GPv2OrderInstance { - #[inline] - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple("GPv2OrderInstance") - .field(&self.address) - .finish() - } - } - /// Instantiation and getters/setters. - impl, N: alloy_contract::private::Network> - GPv2OrderInstance - { - /**Creates a new wrapper around an on-chain [`GPv2Order`](self) contract instance. - - See the [wrapper's documentation](`GPv2OrderInstance`) for more details.*/ - #[inline] - pub const fn new(address: alloy_sol_types::private::Address, __provider: P) -> Self { - Self { - address, - provider: __provider, - _network: ::core::marker::PhantomData, - } - } - - /// Returns a reference to the address. - #[inline] - pub const fn address(&self) -> &alloy_sol_types::private::Address { - &self.address - } - - /// Sets the address. - #[inline] - pub fn set_address(&mut self, address: alloy_sol_types::private::Address) { - self.address = address; - } - - /// Sets the address and returns `self`. - pub fn at(mut self, address: alloy_sol_types::private::Address) -> Self { - self.set_address(address); - self - } - - /// Returns a reference to the provider. - #[inline] - pub const fn provider(&self) -> &P { - &self.provider - } - } - impl GPv2OrderInstance<&P, N> { - /// Clones the provider and returns a new instance with the cloned - /// provider. - #[inline] - pub fn with_cloned_provider(self) -> GPv2OrderInstance { - GPv2OrderInstance { - address: self.address, - provider: ::core::clone::Clone::clone(&self.provider), - _network: ::core::marker::PhantomData, - } - } - } - /// Function calls. - impl, N: alloy_contract::private::Network> - GPv2OrderInstance - { - /// Creates a new call builder using this contract instance's provider - /// and address. - /// - /// Note that the call can be any function call, not just those defined - /// in this contract. Prefer using the other methods for - /// building type-safe contract calls. - pub fn call_builder( - &self, - call: &C, - ) -> alloy_contract::SolCallBuilder<&P, C, N> { - alloy_contract::SolCallBuilder::new_sol(&self.provider, &self.address, call) - } - } - /// Event filters. - impl, N: alloy_contract::private::Network> - GPv2OrderInstance - { - /// Creates a new event filter using this contract instance's provider - /// and address. - /// - /// Note that the type can be any event, not just those defined in this - /// contract. Prefer using the other methods for building - /// type-safe event filters. - pub fn event_filter( - &self, - ) -> alloy_contract::Event<&P, E, N> { - alloy_contract::Event::new_sol(&self.provider, &self.address) - } - } -} -/** - -Generated by the following Solidity interface... -```solidity -library GPv2Interaction { - struct Data { - address target; - uint256 value; - bytes callData; - } -} - -library GPv2Order { - struct Data { - address sellToken; - address buyToken; - address receiver; - uint256 sellAmount; - uint256 buyAmount; - uint32 validTo; - bytes32 appData; - uint256 feeAmount; - bytes32 kind; - bool partiallyFillable; - bytes32 sellTokenBalance; - bytes32 buyTokenBalance; - } -} - -interface CowAmmLegacyHelper { - error InvalidArrayLength(); - error MathOverflowedMulDiv(); - error NoOrder(); - error PoolDoesNotExist(); - error PoolIsClosed(); - error PoolIsPaused(); - - event COWAMMPoolCreated(address indexed amm); - - constructor(); - - function factory() external view returns (address); - function order(address pool, uint256[] memory prices) external view returns (GPv2Order.Data memory _order, GPv2Interaction.Data[] memory preInteractions, GPv2Interaction.Data[] memory postInteractions, bytes memory sig); - function tokens(address pool) external view returns (address[] memory _tokens); -} -``` - -...which was generated by the following JSON ABI: -```json -[ - { - "type": "constructor", - "inputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "factory", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "order", - "inputs": [ - { - "name": "pool", - "type": "address", - "internalType": "address" - }, - { - "name": "prices", - "type": "uint256[]", - "internalType": "uint256[]" - } - ], - "outputs": [ - { - "name": "_order", - "type": "tuple", - "internalType": "struct GPv2Order.Data", - "components": [ - { - "name": "sellToken", - "type": "address", - "internalType": "contract IERC20" - }, - { - "name": "buyToken", - "type": "address", - "internalType": "contract IERC20" - }, - { - "name": "receiver", - "type": "address", - "internalType": "address" - }, - { - "name": "sellAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "buyAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "validTo", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "appData", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "feeAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "kind", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "partiallyFillable", - "type": "bool", - "internalType": "bool" - }, - { - "name": "sellTokenBalance", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "buyTokenBalance", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "name": "preInteractions", - "type": "tuple[]", - "internalType": "struct GPv2Interaction.Data[]", - "components": [ - { - "name": "target", - "type": "address", - "internalType": "address" - }, - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "callData", - "type": "bytes", - "internalType": "bytes" - } - ] - }, - { - "name": "postInteractions", - "type": "tuple[]", - "internalType": "struct GPv2Interaction.Data[]", - "components": [ - { - "name": "target", - "type": "address", - "internalType": "address" - }, - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "callData", - "type": "bytes", - "internalType": "bytes" - } - ] - }, - { - "name": "sig", - "type": "bytes", - "internalType": "bytes" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "tokens", - "inputs": [ - { - "name": "pool", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "_tokens", - "type": "address[]", - "internalType": "address[]" - } - ], - "stateMutability": "view" - }, - { - "type": "event", - "name": "COWAMMPoolCreated", - "inputs": [ - { - "name": "amm", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "InvalidArrayLength", - "inputs": [] - }, - { - "type": "error", - "name": "MathOverflowedMulDiv", - "inputs": [] - }, - { - "type": "error", - "name": "NoOrder", - "inputs": [] - }, - { - "type": "error", - "name": "PoolDoesNotExist", - "inputs": [] - }, - { - "type": "error", - "name": "PoolIsClosed", - "inputs": [] - }, - { - "type": "error", - "name": "PoolIsPaused", - "inputs": [] - } -] -```*/ -#[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style, - clippy::empty_structs_with_brackets -)] -pub mod CowAmmLegacyHelper { - use {super::*, alloy_sol_types}; - /// The creation / init bytecode of the contract. - /// - /// ```text - ///0x608060405234801561000f575f80fd5b5061001861001d565b6102ff565b46600181900361011257610044739941fd7db2003308e7ee17b04400012278f12ac66102c9565b61006173b3bf81714f704720dcb0351ff0d42eca61b069fc6102c9565b61007e73301076c36e034948a747bb61bab9cd03f62672e36102c9565b61009b73027e1cbf2c299cba5eb8a2584910d04f1a8aa4036102c9565b6100b873beef5afe88ef73337e5070ab2855d37dbf5493a46102c9565b6100d573c6b13d5e662fa0458f03995bcb824a1934aa895f6102c9565b6100f273d7cb8cc1b56356bb7b78d02e785ead28e21586606102c9565b61010f73079c868f97aed8e0d03f11e1529c3b056ff21cea6102c9565b50565b8060640361010f5761013773bc6159fd429be18206e60b3bb01d7289f905511b6102c9565b61015473e5d1aa8565f5dbfc06cde20dfd76b4c7c6d43bd56102c9565b610171739d8570ef9a519ca81daec35212f435d9843ba5646102c9565b61018e73d97c31e53f16f495715ce71e12e11b9545eedd8b6102c9565b6101ab73ff1bd3d570e3544c183ba77f5a4d3cc742c8d2b36102c9565b6101c873209d269dfd66b9cec764de7eb6fefc24f75bdd486102c9565b6101e573c37575ad8efe530fd8a79aeb0087e5872a24dabc6102c9565b610202731c7828dadade12a848f36be8e2d3146462abff686102c9565b61021f73aba5294bba7d3635c2a3e44d0e87ea7f58898fb76102c9565b61023c736eb7be972aebb6be2d9acf437cb412c0abee912b6102c9565b61025973c4d09969aad7f252c75dd352bbbd719e34ed06ad6102c9565b61027673a25af86a5dbea45e9fd70c1879489f63d081ad446102c9565b6102937357492cb6c8ee2998e9d83ddc8c713e781ffe548e6102c9565b6102b073c33e3ec14556a8e71be3097fe2dc8c0b9119c8976102c9565b61010f7377472826875953374ed3084c31a483f827987f145b6040516001600160a01b038216907f0d03834d0d86c7f57e877af40e26f176dc31bd637535d4ba153d1ac9de88a7ea905f90a250565b6156848061030c5f395ff3fe608060405234801561000f575f80fd5b506004361061006f575f3560e01c80632aec79a01161004d5780632aec79a0146100de578063c45a0155146100f1578063e48603391461011e575f80fd5b806310029daa14610073578063215702561461009b57806327242c9b146100bb575b5f80fd5b610086610081366004612462565b61013e565b60405190151581526020015b60405180910390f35b6100ae6100a9366004612462565b61050c565b60405161009291906124c9565b6100ce6100c93660046124db565b610cc6565b60405161009294939291906126e9565b6100866100ec366004612462565b61132d565b6100f9611340565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610092565b61013161012c366004612462565b611410565b6040516100929190612734565b6040517f5624b25b0000000000000000000000000000000000000000000000000000000081527f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d56004820152600160248201525f90819073ffffffffffffffffffffffffffffffffffffffff841690635624b25b906044015f60405180830381865afa1580156101d0573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610215919081019061288a565b80602001905181019061022891906128c4565b90505f732f55e8b20d0b9fefa187aa7d00b6cbe563605bf573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161490505f73fdafc9d1902f4e0b84f65f49f244b32b31013b7473ffffffffffffffffffffffffffffffffffffffff16732f55e8b20d0b9fefa187aa7d00b6cbe563605bf573ffffffffffffffffffffffffffffffffffffffff166351cad5ee87739008d19f58aabd9ed0d60971565aa8510560ab4173ffffffffffffffffffffffffffffffffffffffff1663f698da256040518163ffffffff1660e01b8152600401602060405180830381865afa15801561032a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034e91906128df565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401602060405180830381865afa1580156103ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103de91906128c4565b73ffffffffffffffffffffffffffffffffffffffff161490505f6104018661050c565b80602001905181019061041491906128f6565b90505f73fdafc9d1902f4e0b84f65f49f244b32b31013b7473ffffffffffffffffffffffffffffffffffffffff16636108c532888460405160200161045991906129cf565b604051602081830303815290604052805190602001206040518363ffffffff1660e01b81526004016104ad92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602060405180830381865afa1580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec91906129e1565b90508380156104f85750825b80156105015750805b979650505050505050565b60604660018190036107bd5773ffffffffffffffffffffffffffffffffffffffff8316739941fd7db2003308e7ee17b04400012278f12ac60361056c57604051806101e001604052806101c0815260200161482f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673b3bf81714f704720dcb0351ff0d42eca61b069fc036105c057604051806101e001604052806101c081526020016150ef6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673301076c36e034948a747bb61bab9cd03f62672e30361061457604051806101e001604052806101c0815260200161364f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673027e1cbf2c299cba5eb8a2584910d04f1a8aa4030361066857604051806101e001604052806101c08152602001612d2f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673beef5afe88ef73337e5070ab2855d37dbf5493a4036106bc57604051806101e001604052806101c081526020016142ef6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673c6b13d5e662fa0458f03995bcb824a1934aa895f0361071057604051806101e001604052806101c0815260200161412f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673d7cb8cc1b56356bb7b78d02e785ead28e21586600361076457604051806101e001604052806101c081526020016139cf6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673079c868f97aed8e0d03f11e1529c3b056ff21cea036107b857604051806101e001604052806101c081526020016149ef6101c091399392505050565b610cb1565b80606403610cb15773ffffffffffffffffffffffffffffffffffffffff831673bc6159fd429be18206e60b3bb01d7289f905511b0361081957604051806101e001604052806101c08152602001612eef6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673e5d1aa8565f5dbfc06cde20dfd76b4c7c6d43bd50361086d57604051806101e001604052806101c0815260200161466f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff8316739d8570ef9a519ca81daec35212f435d9843ba564036108c157604051806101e001604052806101c08152602001614baf6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673d97c31e53f16f495715ce71e12e11b9545eedd8b036109155760405180610240016040528061022081526020016130af61022091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673ff1bd3d570e3544c183ba77f5a4d3cc742c8d2b30361096957604051806101e001604052806101c0815260200161548f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673209d269dfd66b9cec764de7eb6fefc24f75bdd48036109bd57604051806101e001604052806101c08152602001614f2f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673c37575ad8efe530fd8a79aeb0087e5872a24dabc03610a1157604051806101e001604052806101c0815260200161348f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff8316731c7828dadade12a848f36be8e2d3146462abff6803610a6557604051806101e001604052806101c08152602001613f6f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673aba5294bba7d3635c2a3e44d0e87ea7f58898fb703610ab957604051806101e001604052806101c08152602001614d6f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff8316736eb7be972aebb6be2d9acf437cb412c0abee912b03610b0d57604051806101e001604052806101c081526020016132cf6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673c4d09969aad7f252c75dd352bbbd719e34ed06ad03610b61576040518061024001604052806102208152602001613d4f61022091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673a25af86a5dbea45e9fd70c1879489f63d081ad4403610bb557604051806101e001604052806101c081526020016144af6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff83167357492cb6c8ee2998e9d83ddc8c713e781ffe548e03610c09576040518061020001604052806101e081526020016152af6101e091399392505050565b73ffffffffffffffffffffffffffffffffffffffff831673c33e3ec14556a8e71be3097fe2dc8c0b9119c89703610c5d57604051806101e001604052806101c0815260200161380f6101c091399392505050565b73ffffffffffffffffffffffffffffffffffffffff83167377472826875953374ed3084c31a483f827987f1403610cb157604051806101e001604052806101c08152602001613b8f6101c091399392505050565b505060408051602081019091525f8152919050565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608101919091526060808060028514610d64576040517f9d89020a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060610d6f8861132d565b6112e957610d7c88611696565b610de7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f506f6f6c206973206e6f74206120436f5720414d4d000000000000000000000060448201526064015b60405180910390fd5b5f8873ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e31573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e5591906128c4565b90505f8973ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ea1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec591906128c4565b90508973ffffffffffffffffffffffffffffffffffffffff16634ada218b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f3491906129e1565b15155f03610f6e576040517f21081abf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110816040518060c001604052808c73ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018b8b6001818110610fe357610fe3612a00565b9050602002013581526020018b8b5f81811061100157611001612a00565b9050602002013581526020018c73ffffffffffffffffffffffffffffffffffffffff16636dbc88136040518163ffffffff1660e01b8152600401602060405180830381865afa158015611056573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061107a91906128df565b905261174e565b9650866040516020016110949190612a2d565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815260018084528383019092529450816020015b60408051606080820183525f8083526020830152918101919091528152602001906001900390816110d157905050955060405180606001604052808b73ffffffffffffffffffffffffffffffffffffffff1681526020015f815260200161123b739008d19f58aabd9ed0d60971565aa8510560ab4173ffffffffffffffffffffffffffffffffffffffff1663f698da256040518163ffffffff1660e01b8152600401602060405180830381865afa15801561118e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111b291906128df565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08b0180517fd5a25ba2e97094ad7d83dc28a6572da797d6b3e7fc6663bd93efb789fc17e48982526101a0822091526040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b60405160240161124d91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff14fcbc8000000000000000000000000000000000000000000000000000000001790529052865187905f906112d7576112d7612a00565b602002602001018190525050506112ff565b6112f4888888611ad6565b929750909550935090505b8781604051602001611312929190612a3c565b60405160208183030381529060405291505093509350935093565b5f806113388361050c565b511192915050565b5f46600181900361136657738deed8ed7c5fcb55884f13f121654bb4bb7c843791505090565b8060640361138957732af6c59fc957d4a45ddbbd927fa30f7c5051f58391505090565b8062aa36a7036113ae5773bd18758055dbe3ed37a2471394559ae97a5da5c091505090565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e737570706f7274656420636861696e0000000000000000000000000000006044820152606401610dde565b60408051600280825260608083018452926020830190803683370190505090506114398261132d565b6115b5578173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611486573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114aa91906128c4565b815f815181106114bc576114bc612a00565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561153f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061156391906128c4565b8160018151811061157657611576612a00565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050919050565b5f6115bf8361215f565b509050805f815181106115d4576115d4612a00565b6020026020010151825f815181106115ee576115ee612a00565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508060018151811061163b5761163b612a00565b60200260200101518260018151811061165657611656612a00565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505050919050565b5f806116a0611340565b6040517f666e1b3900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152919091169063666e1b3990602401602060405180830381865afa15801561170c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061173091906128c4565b73ffffffffffffffffffffffffffffffffffffffff16141592915050565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810191909152602082015182516040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201525f92839216906370a0823190602401602060405180830381865afa158015611822573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061184691906128df565b604085810151865191517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116906370a0823190602401602060405180830381865afa1580156118b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118db91906128df565b915091505f805f805f8860800151876118f49190612aae565b90505f8960600151876119079190612aae565b90508181101561196d578960200151955089604001519450611939818b6080015160026119349190612aae565b61227b565b61194460028a612af2565b61194e9190612b05565b9350611966848861195f828c612b05565b60016122cb565b92506119b9565b8960400151955089602001519450611990828b6060015160026119349190612aae565b61199b600289612af2565b6119a59190612b05565b93506119b6848961195f828b612b05565b92505b6040518061018001604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200161012c42611a339190612b18565b63ffffffff1681526020018b60a0015181526020015f81526020017ff3b277728b3fee749481eb3e0b3b48980dbbab78658fc419025cb16eee34677581526020016001151581526020017f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc981526020017f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc981525098505050505050505050919050565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608101919091526060806060611b448761013e565b611b7a576040517fefc869b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80611b858961215f565b915091505f8160400151806020019051810190611ba29190612b3c565b9050611c836040518060c001604052808c73ffffffffffffffffffffffffffffffffffffffff168152602001855f81518110611be057611be0612a00565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16815260200185600181518110611c1657611c16612a00565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018b8b6001818110611c4c57611c4c612a00565b9050602002013581526020018b8b5f818110611c6a57611c6a612a00565b9050602002013581526020018360a0015181525061174e565b96505f739008d19f58aabd9ed0d60971565aa8510560ab4173ffffffffffffffffffffffffffffffffffffffff1663f698da256040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ce3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0791906128df565b9050807fd5a25ba2e97094ad7d83dc28a6572da797d6b3e7fc6663bd93efb789fc17e48989604051602001611d3c9190612a2d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181525f60608401818152608085018452845260208085018a9052835180820185529182528484019190915291519092611da092909101612bf4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611dde94939291602401612c9d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f5fd7e97d000000000000000000000000000000000000000000000000000000001790528151600180825281840190935292975082015b60408051606080820183525f808352602083015291810191909152815260200190600190039081611e685790505060408051606081018252855173ffffffffffffffffffffffffffffffffffffffff1681525f602082015291985081018c611f558b857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090910180517fd5a25ba2e97094ad7d83dc28a6572da797d6b3e7fc6663bd93efb789fc17e48982526101a0822091526040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b60405173ffffffffffffffffffffffffffffffffffffffff90921660248301526044820152606401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f30f73c99000000000000000000000000000000000000000000000000000000001790529052875188905f9061200757612007612a00565b602090810291909101015260408051600180825281830190925290816020015b60408051606080820183525f8083526020830152918101919091528152602001906001900390816120275790505095506040518060600160405280845f015173ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020018c5f801b6040516024016120bd92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f30f73c99000000000000000000000000000000000000000000000000000000001790529052865187905f9061214757612147612a00565b60200260200101819052505050505093509350935093565b60408051606081810183525f80835260208301529181018290526121828361050c565b80602001905181019061219591906128f6565b90505f81604001518060200190518101906121b09190612b3c565b6040805160028082526060820183529293509190602083019080368337019050509250805f0151835f815181106121e9576121e9612a00565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080602001518360018151811061223b5761223b612a00565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505050915091565b5f815f036122945761228d8284612af2565b90506122c5565b82156122c057816122a6600185612b05565b6122b09190612af2565b6122bb906001612ccd565b6122c2565b5f5b90505b92915050565b5f806122d886868661231a565b90506122e383612412565b80156122fe57505f84806122f9576122f9612ac5565b868809115b156123115761230e600182612ccd565b90505b95945050505050565b5f838302817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870982811083820303915050805f0361236d5783828161236357612363612ac5565b049250505061240b565b8084116123a6576040517f227bc15300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150505b9392505050565b5f600282600381111561242757612427612ce0565b6124319190612d0d565b60ff166001149050919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461245f575f80fd5b50565b5f60208284031215612472575f80fd5b813561240b8161243e565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6122c2602083018461247d565b5f805f604084860312156124ed575f80fd5b83356124f88161243e565b9250602084013567ffffffffffffffff80821115612514575f80fd5b818601915086601f830112612527575f80fd5b813581811115612535575f80fd5b8760208260051b8501011115612549575f80fd5b6020830194508093505050509250925092565b805173ffffffffffffffffffffffffffffffffffffffff168252602081015161259d602084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408101516125c5604084018273ffffffffffffffffffffffffffffffffffffffff169052565b50606081015160608301526080810151608083015260a08101516125f160a084018263ffffffff169052565b5060c081015160c083015260e081015160e0830152610100808201518184015250610120808201516126268285018215159052565b5050610140818101519083015261016090810151910152565b5f82825180855260208086019550808260051b8401018186015f5b848110156126dc578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00189528151805173ffffffffffffffffffffffffffffffffffffffff16845284810151858501526040908101516060918501829052906126c88186018361247d565b9a86019a945050509083019060010161265a565b5090979650505050505050565b5f6101e06126f7838861255c565b8061018084015261270a8184018761263f565b90508281036101a084015261271f818661263f565b90508281036101c0840152610501818561247d565b602080825282518282018190525f9190848201906040850190845b8181101561278157835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161274f565b50909695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405160c0810167ffffffffffffffff811182821017156127dd576127dd61278d565b60405290565b5f82601f8301126127f2575f80fd5b815167ffffffffffffffff8082111561280d5761280d61278d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156128535761285361278d565b8160405283815286602085880101111561286b575f80fd5b8360208701602083015e5f602085830101528094505050505092915050565b5f6020828403121561289a575f80fd5b815167ffffffffffffffff8111156128b0575f80fd5b6128bc848285016127e3565b949350505050565b5f602082840312156128d4575f80fd5b815161240b8161243e565b5f602082840312156128ef575f80fd5b5051919050565b5f60208284031215612906575f80fd5b815167ffffffffffffffff8082111561291d575f80fd5b9083019060608286031215612930575f80fd5b60405160608101818110838211171561294b5761294b61278d565b60405282516129598161243e565b815260208381015190820152604083015182811115612976575f80fd5b612982878286016127e3565b60408301525095945050505050565b73ffffffffffffffffffffffffffffffffffffffff8151168252602081015160208301525f6040820151606060408501526128bc606085018261247d565b602081525f6122c26020830184612991565b5f602082840312156129f1575f80fd5b8151801515811461240b575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b61018081016122c5828461255c565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008360601b1681525f82518060208501601485015e5f92016014019182525092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820281158282048414176122c5576122c5612a81565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82612b0057612b00612ac5565b500490565b818103818111156122c5576122c5612a81565b63ffffffff818116838216019080821115612b3557612b35612a81565b5092915050565b5f60208284031215612b4c575f80fd5b815167ffffffffffffffff80821115612b63575f80fd5b9083019060c08286031215612b76575f80fd5b612b7e6127ba565b8251612b898161243e565b81526020830151612b998161243e565b6020820152604083810151908201526060830151612bb68161243e565b6060820152608083015182811115612bcc575f80fd5b612bd8878286016127e3565b60808301525060a083015160a082015280935050505092915050565b602080825282516060838301528051608084018190525f9291820190839060a08601905b80831015612c385783518252928401926001929092019190840190612c18565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0925082868203016040870152612c768185612991565b93505050604085015181858403016060860152612c93838261247d565b9695505050505050565b848152836020820152608060408201525f612cbb608083018561247d565b8281036060840152610501818561247d565b808201808211156122c5576122c5612a81565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f60ff831680612d1f57612d1f612ac5565b8060ff8416069150509291505056fe000000000000000000000000000000000000000000000000000000000000002000000000000000000000000034323b933096534e43958f6c7bf44f2bb59424dac5a0e756ac88c1d3a4c41900d977fe93c2d34fc95a00ca3e84eb4c6b50faf949000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000005afe3855358e112b5647b952709e6165e1c1eeee000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000573cc0c800048f94e022463b9214d92c2d65e97b00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c8900000000000000000000000000000000000000000000000000000000000000200000000000000000000000002e7e978da0c53404a8cf66ed4ba2c7706c07b62a0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a851d85c99996d84d25387bc0d01e50e3ea814f64e7e04a3b949a571789e196c5a910000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e1000000000000000000000000e91d153e0b41518a2ce8dd3d7944fa863463a97d000000000000000000000000000000000000000000000000000affd9fdeb8e08000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000020a99fd9950b5d5dceeaf4939e221dca8ca9b938ab0001000000000000000000250000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a85178a729ee3008c7d48832d02267b72e5f34ada8f554a6731a368f01590ed71b34000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000cb444e90d8198415266c6a2724b7900fb12fc56e000000000000000000000000e91d153e0b41518a2ce8dd3d7944fa863463a97d0000000000000000000000000000000000000000000000008156197a5425c0c8000000000000000000000000bd91a72dc3d9b5d9b16ee8638da1fc65311bd90a00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000080000000000000000000000000ab70bcb260073d036d1660201e9d5405f5829b7a000000000000000000000000678df3415fc31947da4324ec63212874be5a82f8000000000000000000000000000000000000000000000000000000000001518000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a8512e31981e34960969eb549f5e826cf77f655e72b03603ad574a79fd015f4de4de0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006c76971f98945ae98dd7d4dfca8711ebea946ea6000000000000000000000000af204776c7245bf4147c2612bf6e5972ee483701000000000000000000000000000000000000000000000000000a16c95a4d2e3c000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c0ce9e05c2aee5f22f9941c4cd1f1a1d13194b109779422d5ad9a980157bd0f1640000000000000000000000000000000000000000000000000000000000000020bc2acf5e821c5c9f8667a36bb1131dad26ed64f90002000000000000000000630000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a851a2029fbb545978d05378b6df19e3754fe5ed2d0ba1e051027503934372f7beb20000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000009c58bacc331c9aa871afd802db6379a98e80cedb000000000000000000000000177127622c4a00f3d409b75571e12cb3c8973d3c0000000000000000000000000000000000000000000000000052ba9efc38441a000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c89000000000000000000000000000000000000000000000000000000000000002021d4c792ea7e38e0d0819c2011a2b1cb7252bd9900020000000000000000001e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000034323b933096534e43958f6c7bf44f2bb59424daca44b6a304baa16d11b6db07066c1276b1273ee3f94590bbd03201a61882af9a000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000098cb76000000000000000000000000573cc0c800048f94e022463b9214d92c2d65e97b00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b4e16d0168e52d35cacd2c6185b44281ec28c9dc0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a85159457ac6201da7713efecd84618c7a168e88b9cb7d1c0db128af1efe0a08bbb10000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006c76971f98945ae98dd7d4dfca8711ebea946ea6000000000000000000000000af204776c7245bf4147c2612bf6e5972ee483701000000000000000000000000000000000000000000000000000a17273fc14b64000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000020bc2acf5e821c5c9f8667a36bb1131dad26ed64f9000200000000000000000063000000000000000000000000000000000000000000000000000000000000002000000000000000000000000034323b933096534e43958f6c7bf44f2bb59424da80ba533f014ef4238ab7ad203c0aeacbf30a71c0346140db77c43ae3121afadd000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000aea46a60368a7bd060eec7df8cba43b7ef41ad85000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000336632e53c8ecf04000000000000000000000000573cc0c800048f94e022463b9214d92c2d65e97b00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c8900000000000000000000000000000000000000000000000000000000000000200000000000000000000000004042a04c54ef133ac2a3c93db69d43c6c02a330b0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a851d67c9fb87045e07da94c81de035b5c7f435cd46568fca02aa35d709bbc9e21fa0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000008e5bbbb09ed1ebde8674cda39a0c169401db4252000000000000000000000000e91d153e0b41518a2ce8dd3d7944fa863463a97d0000000000000000000000000000000000000000000000000000000000002710000000000000000000000000e089049027b95c2745d1a954bc1d245352d884e900000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c8900000000000000000000000000000000000000000000000000000000000000200000000000000000000000008db8870ca4b8ac188c4d1a014f34a381ae27e1c20000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a851209c17d9ebe3ac7352795f7f8b3d14d253d92430831d3b2c3965f9a578da7618000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e91d153e0b41518a2ce8dd3d7944fa863463a97d0000000000000000000000006c76971f98945ae98dd7d4dfca8711ebea946ea60000000000000000000000000000000000000000000000008aa3a52815262f58000000000000000000000000bd91a72dc3d9b5d9b16ee8638da1fc65311bd90a00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c8900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000064ac007ff665cf8d0d3af5e0ad1c26a3f853ea000000000000000000000000a767f745331d267c7751297d982b050c93985627000000000000000000000000000000000000000000000000000000000001518000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a85105416460deb76d57af601be17e777b93592d8d4d4a4096c57876a91c84f418080000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000009c58bacc331c9aa871afd802db6379a98e80cedb000000000000000000000000ce11e14225575945b8e6dc0d4f2dd4c570f79d9f000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000009634ca647474b6b78d3382331a77cd00a8a940da00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000034323b933096534e43958f6c7bf44f2bb59424da932542294ff270a8bbdbe1fb921de3d09c9749dc35627361fc17c44b9b026b810000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000008390a1da07e376ef7add4be859ba74fb83aa02d5000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000aec1c94998000000000000000000000000573cc0c800048f94e022463b9214d92c2d65e97b00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c89000000000000000000000000000000000000000000000000000000000000002000000000000000000000000069c66beafb06674db41b22cfc50c34a93b8d82a2000000000000000000000000000000000000000000000000000000000000002000000000000000000000000034323b933096534e43958f6c7bf44f2bb59424da0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000def1ca1fb7fbcdc777520aa7f396b4e015f497ab000000000000000000000000000000000000000000000000025bf6196bd10000000000000000000000000000ad37fe3ddedf8cdee1022da1b17412cfb649559600000000000000000000000000000000000000000000000000000000000000c0d661a16b0e85eadb705cf5158132b5dd1ebc0a49929ef68097698d15e2a4e3b40000000000000000000000000000000000000000000000000000000000000020de8c195aa41c11a0c4787372defbbddaa31306d20002000000000000000001810000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a851560d33bcc26b7f10765f8ae10b1abc4ed265ba0c7a1f9948d06de97c31044aee0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000004d18815d14fe5c3304e87b3fa18318baa5c238200000000000000000000000009c58bacc331c9aa871afd802db6379a98e80cedb0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a9b2234773cc6a4f3a34a770c52c931cba5c24b20002000000000000000000870000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a851437a72b19b25e8b62fdfb81146ec83c66462138d3d9e08998594853566fa9add000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000177127622c4a00f3d409b75571e12cb3c8973d3c0000000000000000000000006c76971f98945ae98dd7d4dfca8711ebea946ea600000000000000000000000000000000000000000000000146e114355e0f6088000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c8900000000000000000000000000000000000000000000000000000000000000204cdabe9e07ca393943acfb9286bbbd0d0a310ff600020000000000000000005c000000000000000000000000000000000000000000000000000000000000002000000000000000000000000034323b933096534e43958f6c7bf44f2bb59424da559d5fda20be80608e4d5ea1b41e6b9330efca7934beb094281dd4d8f4889374000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000079ef7f110fdfae4000000000000000000000000ad37fe3ddedf8cdee1022da1b17412cfb649559600000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000020e99481dc77691d8e2456e5f3f61c1810adfc1503000200000000000000000018000000000000000000000000000000000000000000000000000000000000002000000000000000000000000034323b933096534e43958f6c7bf44f2bb59424da56871afb17e444c418900f6db3e1ade07d49eadea1accf03fcebc0a6e7e4b653000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b2617246d0c6c0087f18703d576831899ca94f01000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000048bcb79dba2b56b90000000000000000000000000573cc0c800048f94e022463b9214d92c2d65e97b00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b36ec83d844c0579ec2493f10b2087e96bb654600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a8511ea56ac96a6369d36ef3fe56ae0ddff8d0cc89e1623095239c5ceed2505aa2810000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000009c58bacc331c9aa871afd802db6379a98e80cedb0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e1000000000000000000000000000000000000000000000000006b43c27d2e8300000000000000000000000000e089049027b95c2745d1a954bc1d245352d884e900000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c89000000000000000000000000000000000000000000000000000000000000002000000000000000000000000028dbd35fd79f48bfa9444d330d14683e7101d8170000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a851d1e868d120e326e5581caa39852bb0da9234a511ed76e6f7a9dcceb0d5f154c70000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006c76971f98945ae98dd7d4dfca8711ebea946ea6000000000000000000000000af204776c7245bf4147c2612bf6e5972ee48370100000000000000000000000000000000000000000000000000098e46995425ca000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000020bc2acf5e821c5c9f8667a36bb1131dad26ed64f90002000000000000000000630000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a851f0e8ec512b2507dae99175a0a4792d8a53e0863fbb5e735a5c993295bbd17f480000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006c76971f98945ae98dd7d4dfca8711ebea946ea60000000000000000000000009c58bacc331c9aa871afd802db6379a98e80cedb00000000000000000000000000000000000000000000000000094f8d9168e271000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c8900000000000000000000000000000000000000000000000000000000000000204683e340a8049261057d5ab1b29c8d840e75695e00020000000000000000005a000000000000000000000000000000000000000000000000000000000000002000000000000000000000000034323b933096534e43958f6c7bf44f2bb59424dad003838829115f5d9ff3ed69c8d2b4b26e10eb1a79331206c28fbb4734390a5e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000808507121b80c02388fad14726482e061b8da827000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000189b23422a9b84d8000000000000000000000000ad37fe3ddedf8cdee1022da1b17412cfb649559600000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000020fd1cf6fd41f229ca86ada0584c63c49c3d66bbc90002000000000000000004380000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a8513956efd63537b00bb3b152d3c4961207b6ca14d6f506c66fc0aef4c8e2e176b5000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000cb444e90d8198415266c6a2724b7900fb12fc56e0000000000000000000000009c58bacc331c9aa871afd802db6379a98e80cedb000000000000000000000000000000000000000000000000000000000000004500000000000000000000000015b4c67070d3748b8ec93c8a32f7efe2e8f684c900000000000000000000000000000000000000000000000000000000000000c0056e9806d953dbe2df4352a90ad2c1148c51460e941107f0909fae382b1661cf000000000000000000000000000000000000000000000000000000000000004000000000000000000000000022441d81416430a54336ab28765abd31a792ad37000000000000000000000000ab70bcb260073d036d1660201e9d5405f5829b7a0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b148f40fff05b5ce6b22752cf8e454b556f7a85133f583d55c4509d5e10ebe3c7c69bce17af4c57419d6c9c90c8f588dd3232c0d000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000af204776c7245bf4147c2612bf6e5972ee4837010000000000000000000000006c76971f98945ae98dd7d4dfca8711ebea946ea600000000000000000000000000000000000000000000000410d586a20a4c0000000000000000000000000000d3a84895080609e1163c80b2bd65736db1b86bec00000000000000000000000000000000000000000000000000000000000000c04d821ddc9d656177dad4d5c2f76a4bff2ed514ff69fa4aa4fd869d6e98d55c890000000000000000000000000000000000000000000000000000000000000020bc2acf5e821c5c9f8667a36bb1131dad26ed64f9000200000000000000000063a2646970667358221220c3b6b701e7d5db53232efcebe1fe1bdd40a35653449ba7cd10551b9e5bf6a94a64736f6c63430008190033 - /// ``` - #[rustfmt::skip] - #[allow(clippy::all)] - pub static BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"`\x80`@R4\x80\x15a\0\x0FW_\x80\xFD[Pa\0\x18a\0\x1DV[a\x02\xFFV[F`\x01\x81\x90\x03a\x01\x12Wa\0Ds\x99A\xFD}\xB2\x003\x08\xE7\xEE\x17\xB0D\0\x01\"x\xF1*\xC6a\x02\xC9V[a\0as\xB3\xBF\x81qOpG \xDC\xB05\x1F\xF0\xD4.\xCAa\xB0i\xFCa\x02\xC9V[a\0~s0\x10v\xC3n\x03IH\xA7G\xBBa\xBA\xB9\xCD\x03\xF6&r\xE3a\x02\xC9V[a\0\x9Bs\x02~\x1C\xBF,)\x9C\xBA^\xB8\xA2XI\x10\xD0O\x1A\x8A\xA4\x03a\x02\xC9V[a\0\xB8s\xBE\xEFZ\xFE\x88\xEFs3~Pp\xAB(U\xD3}\xBFT\x93\xA4a\x02\xC9V[a\0\xD5s\xC6\xB1=^f/\xA0E\x8F\x03\x99[\xCB\x82J\x194\xAA\x89_a\x02\xC9V[a\0\xF2s\xD7\xCB\x8C\xC1\xB5cV\xBB{x\xD0.x^\xAD(\xE2\x15\x86`a\x02\xC9V[a\x01\x0Fs\x07\x9C\x86\x8F\x97\xAE\xD8\xE0\xD0?\x11\xE1R\x9C;\x05o\xF2\x1C\xEAa\x02\xC9V[PV[\x80`d\x03a\x01\x0FWa\x017s\xBCaY\xFDB\x9B\xE1\x82\x06\xE6\x0B;\xB0\x1Dr\x89\xF9\x05Q\x1Ba\x02\xC9V[a\x01Ts\xE5\xD1\xAA\x85e\xF5\xDB\xFC\x06\xCD\xE2\r\xFDv\xB4\xC7\xC6\xD4;\xD5a\x02\xC9V[a\x01qs\x9D\x85p\xEF\x9AQ\x9C\xA8\x1D\xAE\xC3R\x12\xF45\xD9\x84;\xA5da\x02\xC9V[a\x01\x8Es\xD9|1\xE5?\x16\xF4\x95q\\\xE7\x1E\x12\xE1\x1B\x95E\xEE\xDD\x8Ba\x02\xC9V[a\x01\xABs\xFF\x1B\xD3\xD5p\xE3TL\x18;\xA7\x7FZM<\xC7B\xC8\xD2\xB3a\x02\xC9V[a\x01\xC8s \x9D&\x9D\xFDf\xB9\xCE\xC7d\xDE~\xB6\xFE\xFC$\xF7[\xDDHa\x02\xC9V[a\x01\xE5s\xC3uu\xAD\x8E\xFES\x0F\xD8\xA7\x9A\xEB\0\x87\xE5\x87*$\xDA\xBCa\x02\xC9V[a\x02\x02s\x1Cx(\xDA\xDA\xDE\x12\xA8H\xF3k\xE8\xE2\xD3\x14db\xAB\xFFha\x02\xC9V[a\x02\x1Fs\xAB\xA5)K\xBA}65\xC2\xA3\xE4M\x0E\x87\xEA\x7FX\x89\x8F\xB7a\x02\xC9V[a\x02x\x1F\xFET\x8Ea\x02\xC9V[a\x02\xB0s\xC3>>\xC1EV\xA8\xE7\x1B\xE3\t\x7F\xE2\xDC\x8C\x0B\x91\x19\xC8\x97a\x02\xC9V[a\x01\x0FswG(&\x87YS7N\xD3\x08L1\xA4\x83\xF8'\x98\x7F\x14[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x90\x7F\r\x03\x83M\r\x86\xC7\xF5~\x87z\xF4\x0E&\xF1v\xDC1\xBDcu5\xD4\xBA\x15=\x1A\xC9\xDE\x88\xA7\xEA\x90_\x90\xA2PV[aV\x84\x80a\x03\x0C_9_\xF3\xFE`\x80`@R4\x80\x15a\0\x0FW_\x80\xFD[P`\x046\x10a\0oW_5`\xE0\x1C\x80c*\xECy\xA0\x11a\0MW\x80c*\xECy\xA0\x14a\0\xDEW\x80c\xC4Z\x01U\x14a\0\xF1W\x80c\xE4\x86\x039\x14a\x01\x1EW_\x80\xFD[\x80c\x10\x02\x9D\xAA\x14a\0sW\x80c!W\x02V\x14a\0\x9BW\x80c'$,\x9B\x14a\0\xBBW[_\x80\xFD[a\0\x86a\0\x816`\x04a$bV[a\x01>V[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\xAEa\0\xA96`\x04a$bV[a\x05\x0CV[`@Qa\0\x92\x91\x90a$\xC9V[a\0\xCEa\0\xC96`\x04a$\xDBV[a\x0C\xC6V[`@Qa\0\x92\x94\x93\x92\x91\x90a&\xE9V[a\0\x86a\0\xEC6`\x04a$bV[a\x13-V[a\0\xF9a\x13@V[`@Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\0\x92V[a\x011a\x01,6`\x04a$bV[a\x14\x10V[`@Qa\0\x92\x91\x90a'4V[`@Q\x7FV$\xB2[\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R\x7Fl\x9AlJ9(N7\xED\x1C\xF5=3uw\xD1B\x12\xA4\x87\x0F\xB9v\xA46li;\x93\x99\x18\xD5`\x04\x82\x01R`\x01`$\x82\x01R_\x90\x81\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x84\x16\x90cV$\xB2[\x90`D\x01_`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x01\xD0W=_\x80>=_\xFD[PPPP`@Q=_\x82>`\x1F=\x90\x81\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x82\x01`@Ra\x02\x15\x91\x90\x81\x01\x90a(\x8AV[\x80` \x01\x90Q\x81\x01\x90a\x02(\x91\x90a(\xC4V[\x90P_s/U\xE8\xB2\r\x0B\x9F\xEF\xA1\x87\xAA}\0\xB6\xCB\xE5c`[\xF5s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x90P_s\xFD\xAF\xC9\xD1\x90/N\x0B\x84\xF6_I\xF2D\xB3+1\x01;ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s/U\xE8\xB2\r\x0B\x9F\xEF\xA1\x87\xAA}\0\xB6\xCB\xE5c`[\xF5s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cQ\xCA\xD5\xEE\x87s\x90\x08\xD1\x9FX\xAA\xBD\x9E\xD0\xD6\tqVZ\xA8Q\x05`\xABAs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xF6\x98\xDA%`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x03*W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x03N\x91\x90a(\xDFV[`@Q\x7F\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\xE0\x85\x90\x1B\x16\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x92\x16`\x04\x83\x01R`$\x82\x01R`D\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x03\xBAW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x03\xDE\x91\x90a(\xC4V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x90P_a\x04\x01\x86a\x05\x0CV[\x80` \x01\x90Q\x81\x01\x90a\x04\x14\x91\x90a(\xF6V[\x90P_s\xFD\xAF\xC9\xD1\x90/N\x0B\x84\xF6_I\xF2D\xB3+1\x01;ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16ca\x08\xC52\x88\x84`@Q` \x01a\x04Y\x91\x90a)\xCFV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 `@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x04\xAD\x92\x91\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x92\x90\x92\x16\x82R` \x82\x01R`@\x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04\xC8W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04\xEC\x91\x90a)\xE1V[\x90P\x83\x80\x15a\x04\xF8WP\x82[\x80\x15a\x05\x01WP\x80[\x97\x96PPPPPPPV[``F`\x01\x81\x90\x03a\x07\xBDWs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\x99A\xFD}\xB2\x003\x08\xE7\xEE\x17\xB0D\0\x01\"x\xF1*\xC6\x03a\x05lW`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01aH/a\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xB3\xBF\x81qOpG \xDC\xB05\x1F\xF0\xD4.\xCAa\xB0i\xFC\x03a\x05\xC0W`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01aP\xEFa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s0\x10v\xC3n\x03IH\xA7G\xBBa\xBA\xB9\xCD\x03\xF6&r\xE3\x03a\x06\x14W`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01a6Oa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\x02~\x1C\xBF,)\x9C\xBA^\xB8\xA2XI\x10\xD0O\x1A\x8A\xA4\x03\x03a\x06hW`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01a-/a\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xBE\xEFZ\xFE\x88\xEFs3~Pp\xAB(U\xD3}\xBFT\x93\xA4\x03a\x06\xBCW`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01aB\xEFa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xC6\xB1=^f/\xA0E\x8F\x03\x99[\xCB\x82J\x194\xAA\x89_\x03a\x07\x10W`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01aA/a\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xD7\xCB\x8C\xC1\xB5cV\xBB{x\xD0.x^\xAD(\xE2\x15\x86`\x03a\x07dW`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01a9\xCFa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\x07\x9C\x86\x8F\x97\xAE\xD8\xE0\xD0?\x11\xE1R\x9C;\x05o\xF2\x1C\xEA\x03a\x07\xB8W`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01aI\xEFa\x01\xC0\x919\x93\x92PPPV[a\x0C\xB1V[\x80`d\x03a\x0C\xB1Ws\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xBCaY\xFDB\x9B\xE1\x82\x06\xE6\x0B;\xB0\x1Dr\x89\xF9\x05Q\x1B\x03a\x08\x19W`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01a.\xEFa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xE5\xD1\xAA\x85e\xF5\xDB\xFC\x06\xCD\xE2\r\xFDv\xB4\xC7\xC6\xD4;\xD5\x03a\x08mW`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01aFoa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\x9D\x85p\xEF\x9AQ\x9C\xA8\x1D\xAE\xC3R\x12\xF45\xD9\x84;\xA5d\x03a\x08\xC1W`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01aK\xAFa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xD9|1\xE5?\x16\xF4\x95q\\\xE7\x1E\x12\xE1\x1B\x95E\xEE\xDD\x8B\x03a\t\x15W`@Q\x80a\x02@\x01`@R\x80a\x02 \x81R` \x01a0\xAFa\x02 \x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xFF\x1B\xD3\xD5p\xE3TL\x18;\xA7\x7FZM<\xC7B\xC8\xD2\xB3\x03a\tiW`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01aT\x8Fa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s \x9D&\x9D\xFDf\xB9\xCE\xC7d\xDE~\xB6\xFE\xFC$\xF7[\xDDH\x03a\t\xBDW`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01aO/a\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xC3uu\xAD\x8E\xFES\x0F\xD8\xA7\x9A\xEB\0\x87\xE5\x87*$\xDA\xBC\x03a\n\x11W`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01a4\x8Fa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\x1Cx(\xDA\xDA\xDE\x12\xA8H\xF3k\xE8\xE2\xD3\x14db\xAB\xFFh\x03a\neW`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01a?oa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xAB\xA5)K\xBA}65\xC2\xA3\xE4M\x0E\x87\xEA\x7FX\x89\x8F\xB7\x03a\n\xB9W`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01aMoa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16sn\xB7\xBE\x97*\xEB\xB6\xBE-\x9A\xCFC|\xB4\x12\xC0\xAB\xEE\x91+\x03a\x0B\rW`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01a2\xCFa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xC4\xD0\x99i\xAA\xD7\xF2R\xC7]\xD3R\xBB\xBDq\x9E4\xED\x06\xAD\x03a\x0BaW`@Q\x80a\x02@\x01`@R\x80a\x02 \x81R` \x01a=Oa\x02 \x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xA2Z\xF8j]\xBE\xA4^\x9F\xD7\x0C\x18yH\x9Fc\xD0\x81\xADD\x03a\x0B\xB5W`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01aD\xAFa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16sWI,\xB6\xC8\xEE)\x98\xE9\xD8=\xDC\x8Cq>x\x1F\xFET\x8E\x03a\x0C\tW`@Q\x80a\x02\0\x01`@R\x80a\x01\xE0\x81R` \x01aR\xAFa\x01\xE0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xC3>>\xC1EV\xA8\xE7\x1B\xE3\t\x7F\xE2\xDC\x8C\x0B\x91\x19\xC8\x97\x03a\x0C]W`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01a8\x0Fa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16swG(&\x87YS7N\xD3\x08L1\xA4\x83\xF8'\x98\x7F\x14\x03a\x0C\xB1W`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01a;\x8Fa\x01\xC0\x919\x93\x92PPPV[PP`@\x80Q` \x81\x01\x90\x91R_\x81R\x91\x90PV[`@\x80Qa\x01\x80\x81\x01\x82R_\x80\x82R` \x82\x01\x81\x90R\x91\x81\x01\x82\x90R``\x81\x01\x82\x90R`\x80\x81\x01\x82\x90R`\xA0\x81\x01\x82\x90R`\xC0\x81\x01\x82\x90R`\xE0\x81\x01\x82\x90Ra\x01\0\x81\x01\x82\x90Ra\x01 \x81\x01\x82\x90Ra\x01@\x81\x01\x82\x90Ra\x01`\x81\x01\x91\x90\x91R``\x80\x80`\x02\x85\x14a\rdW`@Q\x7F\x9D\x89\x02\n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``a\ro\x88a\x13-V[a\x12\xE9Wa\r|\x88a\x16\x96V[a\r\xE7W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x15`$\x82\x01R\x7FPool is not a CoW AMM\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[_\x88s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\r\xFE\x16\x81`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0E1W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0EU\x91\x90a(\xC4V[\x90P_\x89s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xD2\x12 \xA7`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0E\xA1W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0E\xC5\x91\x90a(\xC4V[\x90P\x89s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cJ\xDA!\x8B`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0F\x10W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0F4\x91\x90a)\xE1V[\x15\x15_\x03a\x0FnW`@Q\x7F!\x08\x1A\xBF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x10\x81`@Q\x80`\xC0\x01`@R\x80\x8Cs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x8B\x8B`\x01\x81\x81\x10a\x0F\xE3Wa\x0F\xE3a*\0V[\x90P` \x02\x015\x81R` \x01\x8B\x8B_\x81\x81\x10a\x10\x01Wa\x10\x01a*\0V[\x90P` \x02\x015\x81R` \x01\x8Cs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cm\xBC\x88\x13`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x10VW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x10z\x91\x90a(\xDFV[\x90Ra\x17NV[\x96P\x86`@Q` \x01a\x10\x94\x91\x90a*-V[`@\x80Q\x80\x83\x03\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x01\x81R`\x01\x80\x84R\x83\x83\x01\x90\x92R\x94P\x81` \x01[`@\x80Q``\x80\x82\x01\x83R_\x80\x83R` \x83\x01R\x91\x81\x01\x91\x90\x91R\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x10\xD1W\x90PP\x95P`@Q\x80``\x01`@R\x80\x8Bs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01_\x81R` \x01a\x12;s\x90\x08\xD1\x9FX\xAA\xBD\x9E\xD0\xD6\tqVZ\xA8Q\x05`\xABAs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xF6\x98\xDA%`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x11\x8EW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x11\xB2\x91\x90a(\xDFV[\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x8B\x01\x80Q\x7F\xD5\xA2[\xA2\xE9p\x94\xAD}\x83\xDC(\xA6W-\xA7\x97\xD6\xB3\xE7\xFCfc\xBD\x93\xEF\xB7\x89\xFC\x17\xE4\x89\x82Ra\x01\xA0\x82 \x91R`@Q\x7F\x19\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x02\x81\x01\x92\x90\x92R`\"\x82\x01R`B\x90 \x90V[`@Q`$\x01a\x12M\x91\x81R` \x01\x90V[`@\x80Q\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x81\x84\x03\x01\x81R\x91\x90R` \x81\x01\x80Q{\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\xF1O\xCB\xC8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x17\x90R\x90R\x86Q\x87\x90_\x90a\x12\xD7Wa\x12\xD7a*\0V[` \x02` \x01\x01\x81\x90RPPPa\x12\xFFV[a\x12\xF4\x88\x88\x88a\x1A\xD6V[\x92\x97P\x90\x95P\x93P\x90P[\x87\x81`@Q` \x01a\x13\x12\x92\x91\x90a*=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x14\xAA\x91\x90a(\xC4V[\x81_\x81Q\x81\x10a\x14\xBCWa\x14\xBCa*\0V[` \x02` \x01\x01\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RPP\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xD2\x12 \xA7`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x15?W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x15c\x91\x90a(\xC4V[\x81`\x01\x81Q\x81\x10a\x15vWa\x15va*\0V[` \x02` \x01\x01\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RPP\x91\x90PV[_a\x15\xBF\x83a!_V[P\x90P\x80_\x81Q\x81\x10a\x15\xD4Wa\x15\xD4a*\0V[` \x02` \x01\x01Q\x82_\x81Q\x81\x10a\x15\xEEWa\x15\xEEa*\0V[` \x02` \x01\x01\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RPP\x80`\x01\x81Q\x81\x10a\x16;Wa\x16;a*\0V[` \x02` \x01\x01Q\x82`\x01\x81Q\x81\x10a\x16VWa\x16Va*\0V[` \x02` \x01\x01\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RPPP\x91\x90PV[_\x80a\x16\xA0a\x13@V[`@Q\x7Ffn\x1B9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x85\x81\x16`\x04\x83\x01R\x91\x90\x91\x16\x90cfn\x1B9\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x17\x0CW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x170\x91\x90a(\xC4V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15\x92\x91PPV[`@\x80Qa\x01\x80\x81\x01\x82R_\x80\x82R` \x82\x01\x81\x90R\x91\x81\x01\x82\x90R``\x81\x01\x82\x90R`\x80\x81\x01\x82\x90R`\xA0\x81\x01\x82\x90R`\xC0\x81\x01\x82\x90R`\xE0\x81\x01\x82\x90Ra\x01\0\x81\x01\x82\x90Ra\x01 \x81\x01\x82\x90Ra\x01@\x81\x01\x82\x90Ra\x01`\x81\x01\x91\x90\x91R` \x82\x01Q\x82Q`@Q\x7Fp\xA0\x821\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x91\x82\x16`\x04\x82\x01R_\x92\x83\x92\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x18\"W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x18F\x91\x90a(\xDFV[`@\x85\x81\x01Q\x86Q\x91Q\x7Fp\xA0\x821\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x92\x83\x16`\x04\x82\x01R\x91\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x18\xB7W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x18\xDB\x91\x90a(\xDFV[\x91P\x91P_\x80_\x80_\x88`\x80\x01Q\x87a\x18\xF4\x91\x90a*\xAEV[\x90P_\x89``\x01Q\x87a\x19\x07\x91\x90a*\xAEV[\x90P\x81\x81\x10\x15a\x19mW\x89` \x01Q\x95P\x89`@\x01Q\x94Pa\x199\x81\x8B`\x80\x01Q`\x02a\x194\x91\x90a*\xAEV[a\"{V[a\x19D`\x02\x8Aa*\xF2V[a\x19N\x91\x90a+\x05V[\x93Pa\x19f\x84\x88a\x19_\x82\x8Ca+\x05V[`\x01a\"\xCBV[\x92Pa\x19\xB9V[\x89`@\x01Q\x95P\x89` \x01Q\x94Pa\x19\x90\x82\x8B``\x01Q`\x02a\x194\x91\x90a*\xAEV[a\x19\x9B`\x02\x89a*\xF2V[a\x19\xA5\x91\x90a+\x05V[\x93Pa\x19\xB6\x84\x89a\x19_\x82\x8Ba+\x05V[\x92P[`@Q\x80a\x01\x80\x01`@R\x80\x87s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x86s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x85\x81R` \x01\x84\x81R` \x01a\x01,Ba\x1A3\x91\x90a+\x18V[c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x8B`\xA0\x01Q\x81R` \x01_\x81R` \x01\x7F\xF3\xB2wr\x8B?\xEEt\x94\x81\xEB>\x0B;H\x98\r\xBB\xABxe\x8F\xC4\x19\x02\\\xB1n\xEE4gu\x81R` \x01`\x01\x15\x15\x81R` \x01\x7FZ(\xE96;\xB9B\xB69'\0b\xAAk\xB2\x95\xF44\xBC\xDF\xC4,\x97&{\xF0\x03\xF2r\x06\r\xC9\x81R` \x01\x7FZ(\xE96;\xB9B\xB69'\0b\xAAk\xB2\x95\xF44\xBC\xDF\xC4,\x97&{\xF0\x03\xF2r\x06\r\xC9\x81RP\x98PPPPPPPPP\x91\x90PV[`@\x80Qa\x01\x80\x81\x01\x82R_\x80\x82R` \x82\x01\x81\x90R\x91\x81\x01\x82\x90R``\x81\x01\x82\x90R`\x80\x81\x01\x82\x90R`\xA0\x81\x01\x82\x90R`\xC0\x81\x01\x82\x90R`\xE0\x81\x01\x82\x90Ra\x01\0\x81\x01\x82\x90Ra\x01 \x81\x01\x82\x90Ra\x01@\x81\x01\x82\x90Ra\x01`\x81\x01\x91\x90\x91R``\x80``a\x1BD\x87a\x01>V[a\x1BzW`@Q\x7F\xEF\xC8i\xB4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_\x80a\x1B\x85\x89a!_V[\x91P\x91P_\x81`@\x01Q\x80` \x01\x90Q\x81\x01\x90a\x1B\xA2\x91\x90a+=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1D\x07\x91\x90a(\xDFV[\x90P\x80\x7F\xD5\xA2[\xA2\xE9p\x94\xAD}\x83\xDC(\xA6W-\xA7\x97\xD6\xB3\xE7\xFCfc\xBD\x93\xEF\xB7\x89\xFC\x17\xE4\x89\x89`@Q` \x01a\x1D<\x91\x90a*-V[`@\x80Q\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x81\x84\x03\x01\x81R_``\x84\x01\x81\x81R`\x80\x85\x01\x84R\x84R` \x80\x85\x01\x8A\x90R\x83Q\x80\x82\x01\x85R\x91\x82R\x84\x84\x01\x91\x90\x91R\x91Q\x90\x92a\x1D\xA0\x92\x90\x91\x01a+\xF4V[`@\x80Q\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x81\x84\x03\x01\x81R\x90\x82\x90Ra\x1D\xDE\x94\x93\x92\x91`$\x01a,\x9DV[`@\x80Q\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x81\x84\x03\x01\x81R\x91\x81R` \x80\x83\x01\x80Q{\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F_\xD7\xE9}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x17\x90R\x81Q`\x01\x80\x82R\x81\x84\x01\x90\x93R\x92\x97P\x82\x01[`@\x80Q``\x80\x82\x01\x83R_\x80\x83R` \x83\x01R\x91\x81\x01\x91\x90\x91R\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x1EhW\x90PP`@\x80Q``\x81\x01\x82R\x85Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R_` \x82\x01R\x91\x98P\x81\x01\x8Ca\x1FU\x8B\x85\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x90\x91\x01\x80Q\x7F\xD5\xA2[\xA2\xE9p\x94\xAD}\x83\xDC(\xA6W-\xA7\x97\xD6\xB3\xE7\xFCfc\xBD\x93\xEF\xB7\x89\xFC\x17\xE4\x89\x82Ra\x01\xA0\x82 \x91R`@Q\x7F\x19\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x02\x81\x01\x92\x90\x92R`\"\x82\x01R`B\x90 \x90V[`@Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x92\x16`$\x83\x01R`D\x82\x01R`d\x01`@\x80Q\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x81\x84\x03\x01\x81R\x91\x90R` \x81\x01\x80Q{\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F0\xF7<\x99\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x17\x90R\x90R\x87Q\x88\x90_\x90a \x07Wa \x07a*\0V[` \x90\x81\x02\x91\x90\x91\x01\x01R`@\x80Q`\x01\x80\x82R\x81\x83\x01\x90\x92R\x90\x81` \x01[`@\x80Q``\x80\x82\x01\x83R_\x80\x83R` \x83\x01R\x91\x81\x01\x91\x90\x91R\x81R` \x01\x90`\x01\x90\x03\x90\x81a 'W\x90PP\x95P`@Q\x80``\x01`@R\x80\x84_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01_\x81R` \x01\x8C_\x80\x1B`@Q`$\x01a \xBD\x92\x91\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x92\x90\x92\x16\x82R` \x82\x01R`@\x01\x90V[`@\x80Q\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x81\x84\x03\x01\x81R\x91\x90R` \x81\x01\x80Q{\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F0\xF7<\x99\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x17\x90R\x90R\x86Q\x87\x90_\x90a!GWa!Ga*\0V[` \x02` \x01\x01\x81\x90RPPPPP\x93P\x93P\x93P\x93V[`@\x80Q``\x81\x81\x01\x83R_\x80\x83R` \x83\x01R\x91\x81\x01\x82\x90Ra!\x82\x83a\x05\x0CV[\x80` \x01\x90Q\x81\x01\x90a!\x95\x91\x90a(\xF6V[\x90P_\x81`@\x01Q\x80` \x01\x90Q\x81\x01\x90a!\xB0\x91\x90a+V[_\x81Q\x80\x84R\x80` \x84\x01` \x86\x01^_` \x82\x86\x01\x01R` \x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x83\x01\x16\x85\x01\x01\x91PP\x92\x91PPV[` \x81R_a\"\xC2` \x83\x01\x84a$}V[_\x80_`@\x84\x86\x03\x12\x15a$\xEDW_\x80\xFD[\x835a$\xF8\x81a$>V[\x92P` \x84\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a%\x14W_\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12a%'W_\x80\xFD[\x815\x81\x81\x11\x15a%5W_\x80\xFD[\x87` \x82`\x05\x1B\x85\x01\x01\x11\x15a%IW_\x80\xFD[` \x83\x01\x94P\x80\x93PPPP\x92P\x92P\x92V[\x80Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x82R` \x81\x01Qa%\x9D` \x84\x01\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90RV[P`@\x81\x01Qa%\xC5`@\x84\x01\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90RV[P``\x81\x01Q``\x83\x01R`\x80\x81\x01Q`\x80\x83\x01R`\xA0\x81\x01Qa%\xF1`\xA0\x84\x01\x82c\xFF\xFF\xFF\xFF\x16\x90RV[P`\xC0\x81\x01Q`\xC0\x83\x01R`\xE0\x81\x01Q`\xE0\x83\x01Ra\x01\0\x80\x82\x01Q\x81\x84\x01RPa\x01 \x80\x82\x01Qa&&\x82\x85\x01\x82\x15\x15\x90RV[PPa\x01@\x81\x81\x01Q\x90\x83\x01Ra\x01`\x90\x81\x01Q\x91\x01RV[_\x82\x82Q\x80\x85R` \x80\x86\x01\x95P\x80\x82`\x05\x1B\x84\x01\x01\x81\x86\x01_[\x84\x81\x10\x15a&\xDCW\x85\x83\x03\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x01\x89R\x81Q\x80Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84R\x84\x81\x01Q\x85\x85\x01R`@\x90\x81\x01Q``\x91\x85\x01\x82\x90R\x90a&\xC8\x81\x86\x01\x83a$}V[\x9A\x86\x01\x9A\x94PPP\x90\x83\x01\x90`\x01\x01a&ZV[P\x90\x97\x96PPPPPPPV[_a\x01\xE0a&\xF7\x83\x88a%\\V[\x80a\x01\x80\x84\x01Ra'\n\x81\x84\x01\x87a&?V[\x90P\x82\x81\x03a\x01\xA0\x84\x01Ra'\x1F\x81\x86a&?V[\x90P\x82\x81\x03a\x01\xC0\x84\x01Ra\x05\x01\x81\x85a$}V[` \x80\x82R\x82Q\x82\x82\x01\x81\x90R_\x91\x90\x84\x82\x01\x90`@\x85\x01\x90\x84[\x81\x81\x10\x15a'\x81W\x83Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x83R\x92\x84\x01\x92\x91\x84\x01\x91`\x01\x01a'OV[P\x90\x96\x95PPPPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[`@Q`\xC0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a'\xDDWa'\xDDa'\x8DV[`@R\x90V[_\x82`\x1F\x83\x01\x12a'\xF2W_\x80\xFD[\x81Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a(\rWa(\ra'\x8DV[`@Q`\x1F\x83\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x90\x81\x16`?\x01\x16\x81\x01\x90\x82\x82\x11\x81\x83\x10\x17\x15a(SWa(Sa'\x8DV[\x81`@R\x83\x81R\x86` \x85\x88\x01\x01\x11\x15a(kW_\x80\xFD[\x83` \x87\x01` \x83\x01^_` \x85\x83\x01\x01R\x80\x94PPPPP\x92\x91PPV[_` \x82\x84\x03\x12\x15a(\x9AW_\x80\xFD[\x81Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a(\xB0W_\x80\xFD[a(\xBC\x84\x82\x85\x01a'\xE3V[\x94\x93PPPPV[_` \x82\x84\x03\x12\x15a(\xD4W_\x80\xFD[\x81Qa$\x0B\x81a$>V[_` \x82\x84\x03\x12\x15a(\xEFW_\x80\xFD[PQ\x91\x90PV[_` \x82\x84\x03\x12\x15a)\x06W_\x80\xFD[\x81Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a)\x1DW_\x80\xFD[\x90\x83\x01\x90``\x82\x86\x03\x12\x15a)0W_\x80\xFD[`@Q``\x81\x01\x81\x81\x10\x83\x82\x11\x17\x15a)KWa)Ka'\x8DV[`@R\x82Qa)Y\x81a$>V[\x81R` \x83\x81\x01Q\x90\x82\x01R`@\x83\x01Q\x82\x81\x11\x15a)vW_\x80\xFD[a)\x82\x87\x82\x86\x01a'\xE3V[`@\x83\x01RP\x95\x94PPPPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81Q\x16\x82R` \x81\x01Q` \x83\x01R_`@\x82\x01Q```@\x85\x01Ra(\xBC``\x85\x01\x82a$}V[` \x81R_a\"\xC2` \x83\x01\x84a)\x91V[_` \x82\x84\x03\x12\x15a)\xF1W_\x80\xFD[\x81Q\x80\x15\x15\x81\x14a$\x0BW_\x80\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`2`\x04R`$_\xFD[a\x01\x80\x81\x01a\"\xC5\x82\x84a%\\V[\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\x83``\x1B\x16\x81R_\x82Q\x80` \x85\x01`\x14\x85\x01^_\x92\x01`\x14\x01\x91\x82RP\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x11`\x04R`$_\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\"\xC5Wa\"\xC5a*\x81V[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x12`\x04R`$_\xFD[_\x82a+\0Wa+\0a*\xC5V[P\x04\x90V[\x81\x81\x03\x81\x81\x11\x15a\"\xC5Wa\"\xC5a*\x81V[c\xFF\xFF\xFF\xFF\x81\x81\x16\x83\x82\x16\x01\x90\x80\x82\x11\x15a+5Wa+5a*\x81V[P\x92\x91PPV[_` \x82\x84\x03\x12\x15a+LW_\x80\xFD[\x81Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a+cW_\x80\xFD[\x90\x83\x01\x90`\xC0\x82\x86\x03\x12\x15a+vW_\x80\xFD[a+~a'\xBAV[\x82Qa+\x89\x81a$>V[\x81R` \x83\x01Qa+\x99\x81a$>V[` \x82\x01R`@\x83\x81\x01Q\x90\x82\x01R``\x83\x01Qa+\xB6\x81a$>V[``\x82\x01R`\x80\x83\x01Q\x82\x81\x11\x15a+\xCCW_\x80\xFD[a+\xD8\x87\x82\x86\x01a'\xE3V[`\x80\x83\x01RP`\xA0\x83\x01Q`\xA0\x82\x01R\x80\x93PPPP\x92\x91PPV[` \x80\x82R\x82Q``\x83\x83\x01R\x80Q`\x80\x84\x01\x81\x90R_\x92\x91\x82\x01\x90\x83\x90`\xA0\x86\x01\x90[\x80\x83\x10\x15a,8W\x83Q\x82R\x92\x84\x01\x92`\x01\x92\x90\x92\x01\x91\x90\x84\x01\x90a,\x18V[P\x83\x87\x01Q\x93P\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x92P\x82\x86\x82\x03\x01`@\x87\x01Ra,v\x81\x85a)\x91V[\x93PPP`@\x85\x01Q\x81\x85\x84\x03\x01``\x86\x01Ra,\x93\x83\x82a$}V[\x96\x95PPPPPPV[\x84\x81R\x83` \x82\x01R`\x80`@\x82\x01R_a,\xBB`\x80\x83\x01\x85a$}V[\x82\x81\x03``\x84\x01Ra\x05\x01\x81\x85a$}V[\x80\x82\x01\x80\x82\x11\x15a\"\xC5Wa\"\xC5a*\x81V[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`!`\x04R`$_\xFD[_`\xFF\x83\x16\x80a-\x1FWa-\x1Fa*\xC5V[\x80`\xFF\x84\x16\x06\x91PP\x92\x91PPV\xFE\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\x0042;\x930\x96SNC\x95\x8Fl{\xF4O+\xB5\x94$\xDA\xC5\xA0\xE7V\xAC\x88\xC1\xD3\xA4\xC4\x19\0\xD9w\xFE\x93\xC2\xD3O\xC9Z\0\xCA>\x84\xEBLkP\xFA\xF9I\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\xC0*\xAA9\xB2#\xFE\x8D\n\x0E\\O'\xEA\xD9\x08\xA8\x14\xF6N~\x04\xA3\xB9I\xA5qx\x9E\x19lZ\x91\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0j\x02<\xCD\x1F\xF6\xF2\x04\\3\tv\x8E\xAD\x9Eh\xF9x\xF6\xE1\0\0\0\0\0\0\0\0\0\0\0\0\xE9\x1D\x15>\x0BAQ\x8A,\xE8\xDD=yD\xFA\x864c\xA9}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\n\xFF\xD9\xFD\xEB\x8E\x08\0\0\0\0\0\0\0\0\0\0\0\0\xD3\xA8H\x95\x08\x06\t\xE1\x16<\x80\xB2\xBDesm\xB1\xB8k\xEC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC0M\x82\x1D\xDC\x9Deaw\xDA\xD4\xD5\xC2\xF7jK\xFF.\xD5\x14\xFFi\xFAJ\xA4\xFD\x86\x9Dn\x98\xD5\\\x89\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \xA9\x9F\xD9\x95\x0B]]\xCE\xEA\xF4\x93\x9E\"\x1D\xCA\x8C\xA9\xB98\xAB\0\x01\0\0\0\0\0\0\0\0\0%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\xB1H\xF4\x0F\xFF\x05\xB5\xCEk\"u,\xF8\xE4T\xB5V\xF7\xA8Qx\xA7)\xEE0\x08\xC7\xD4\x882\xD0\"g\xB7._4\xAD\xA8\xF5T\xA6s\x1A6\x8F\x01Y\x0E\xD7\x1B4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\x80\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\xCBDN\x90\xD8\x19\x84\x15&lj'$\xB7\x90\x0F\xB1/\xC5n\0\0\0\0\0\0\0\0\0\0\0\0\xE9\x1D\x15>\x0BAQ\x8A,\xE8\xDD=yD\xFA\x864c\xA9}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V\x19zT%\xC0\xC8\0\0\0\0\0\0\0\0\0\0\0\0\xBD\x91\xA7-\xC3\xD9\xB5\xD9\xB1n\xE8c\x8D\xA1\xFCe1\x1B\xD9\n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC0M\x82\x1D\xDC\x9Deaw\xDA\xD4\xD5\xC2\xF7jK\xFF.\xD5\x14\xFFi\xFAJ\xA4\xFD\x86\x9Dn\x98\xD5\\\x89\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x80\0\0\0\0\0\0\0\0\0\0\0\0\xABp\xBC\xB2`\x07=\x03m\x16` \x1E\x9DT\x05\xF5\x82\x9Bz\0\0\0\0\0\0\0\0\0\0\0\0g\x8D\xF3A_\xC3\x19G\xDAC$\xECc!(t\xBEZ\x82\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01Q\x80\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\xB1H\xF4\x0F\xFF\x05\xB5\xCEk\"u,\xF8\xE4T\xB5V\xF7\xA8Q.1\x98\x1E4\x96\ti\xEBT\x9F^\x82l\xF7\x7Fe^r\xB06\x03\xADWJy\xFD\x01_M\xE4\xDE\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0lv\x97\x1F\x98\x94Z\xE9\x8D\xD7\xD4\xDF\xCA\x87\x11\xEB\xEA\x94n\xA6\0\0\0\0\0\0\0\0\0\0\0\0\xAF Gv\xC7$[\xF4\x14|&\x12\xBFnYr\xEEH7\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\n\x16\xC9ZM.<\0\0\0\0\0\0\0\0\0\0\0\0\xD3\xA8H\x95\x08\x06\t\xE1\x16<\x80\xB2\xBDesm\xB1\xB8k\xEC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC0\xCE\x9E\x05\xC2\xAE\xE5\xF2/\x99A\xC4\xCD\x1F\x1A\x1D\x13\x19K\x10\x97yB-Z\xD9\xA9\x80\x15{\xD0\xF1d\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \xBC*\xCF^\x82\x1C\\\x9F\x86g\xA3k\xB1\x13\x1D\xAD&\xEDd\xF9\0\x02\0\0\0\0\0\0\0\0\0c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\xB1H\xF4\x0F\xFF\x05\xB5\xCEk\"u,\xF8\xE4T\xB5V\xF7\xA8Q\xA2\x02\x9F\xBBTYx\xD0Sx\xB6\xDF\x19\xE3uO\xE5\xED-\x0B\xA1\xE0Q\x02u\x03\x93Cr\xF7\xBE\xB2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\x9CX\xBA\xCC3\x1C\x9A\xA8q\xAF\xD8\x02\xDBcy\xA9\x8E\x80\xCE\xDB\0\0\0\0\0\0\0\0\0\0\0\0\x17q'b,J\0\xF3\xD4\t\xB7Uq\xE1,\xB3\xC8\x97=<\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0R\xBA\x9E\xFC8D\x1A\0\0\0\0\0\0\0\0\0\0\0\0\xD3\xA8H\x95\x08\x06\t\xE1\x16<\x80\xB2\xBDesm\xB1\xB8k\xEC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC0M\x82\x1D\xDC\x9Deaw\xDA\xD4\xD5\xC2\xF7jK\xFF.\xD5\x14\xFFi\xFAJ\xA4\xFD\x86\x9Dn\x98\xD5\\\x89\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 !\xD4\xC7\x92\xEA~8\xE0\xD0\x81\x9C \x11\xA2\xB1\xCBrR\xBD\x99\0\x02\0\0\0\0\0\0\0\0\0\x1E\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\x0042;\x930\x96SNC\x95\x8Fl{\xF4O+\xB5\x94$\xDA\xCAD\xB6\xA3\x04\xBA\xA1m\x11\xB6\xDB\x07\x06l\x12v\xB1'>\xE3\xF9E\x90\xBB\xD02\x01\xA6\x18\x82\xAF\x9A\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\xA0\xB8i\x91\xC6!\x8B6\xC1\xD1\x9DJ.\x9E\xB0\xCE6\x06\xEBH\0\0\0\0\0\0\0\0\0\0\0\0\xC0*\xAA9\xB2#\xFE\x8D\n\x0E\\O'\xEA\xD9\x08\xFE\xCD\x84a\x8Cz\x16\x8E\x88\xB9\xCB}\x1C\r\xB1(\xAF\x1E\xFE\n\x08\xBB\xB1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0lv\x97\x1F\x98\x94Z\xE9\x8D\xD7\xD4\xDF\xCA\x87\x11\xEB\xEA\x94n\xA6\0\0\0\0\0\0\0\0\0\0\0\0\xAF Gv\xC7$[\xF4\x14|&\x12\xBFnYr\xEEH7\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\n\x17'?\xC1Kd\0\0\0\0\0\0\0\0\0\0\0\0\xD3\xA8H\x95\x08\x06\t\xE1\x16<\x80\xB2\xBDesm\xB1\xB8k\xEC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC0M\x82\x1D\xDC\x9Deaw\xDA\xD4\xD5\xC2\xF7jK\xFF.\xD5\x14\xFFi\xFAJ\xA4\xFD\x86\x9Dn\x98\xD5\\\x89\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \xBC*\xCF^\x82\x1C\\\x9F\x86g\xA3k\xB1\x13\x1D\xAD&\xEDd\xF9\0\x02\0\0\0\0\0\0\0\0\0c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\x0042;\x930\x96SNC\x95\x8Fl{\xF4O+\xB5\x94$\xDA\x80\xBAS?\x01N\xF4#\x8A\xB7\xAD <\n\xEA\xCB\xF3\nq\xC04a@\xDBw\xC4:\xE3\x12\x1A\xFA\xDD\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\xAE\xA4j`6\x8A{\xD0`\xEE\xC7\xDF\x8C\xBAC\xB7\xEFA\xAD\x85\0\0\0\0\0\0\0\0\0\0\0\0\xC0*\xAA9\xB2#\xFE\x8D\n\x0E\\O'\xEA\xD9\x08\x0BAQ\x8A,\xE8\xDD=yD\xFA\x864c\xA9}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0'\x10\0\0\0\0\0\0\0\0\0\0\0\0\xE0\x89\x04\x90'\xB9\\'E\xD1\xA9T\xBC\x1D$SR\xD8\x84\xE9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC0M\x82\x1D\xDC\x9Deaw\xDA\xD4\xD5\xC2\xF7jK\xFF.\xD5\x14\xFFi\xFAJ\xA4\xFD\x86\x9Dn\x98\xD5\\\x89\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\x8D\xB8\x87\x0C\xA4\xB8\xAC\x18\x8CM\x1A\x01O4\xA3\x81\xAE'\xE1\xC2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\xB1H\xF4\x0F\xFF\x05\xB5\xCEk\"u,\xF8\xE4T\xB5V\xF7\xA8Q \x9C\x17\xD9\xEB\xE3\xACsRy_\x7F\x8B=\x14\xD2S\xD9$0\x83\x1D;,9e\xF9\xA5x\xDAv\x18\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\x80\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\xE9\x1D\x15>\x0BAQ\x8A,\xE8\xDD=yD\xFA\x864c\xA9}\0\0\0\0\0\0\0\0\0\0\0\0lv\x97\x1F\x98\x94Z\xE9\x8D\xD7\xD4\xDF\xCA\x87\x11\xEB\xEA\x94n\xA6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x8A\xA3\xA5(\x15&/X\0\0\0\0\0\0\0\0\0\0\0\0\xBD\x91\xA7-\xC3\xD9\xB5\xD9\xB1n\xE8c\x8D\xA1\xFCe1\x1B\xD9\n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC0M\x82\x1D\xDC\x9Deaw\xDA\xD4\xD5\xC2\xF7jK\xFF.\xD5\x14\xFFi\xFAJ\xA4\xFD\x86\x9Dn\x98\xD5\\\x89\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x80\0\0\0\0\0\0\0\0\0\0\0\0\0d\xAC\0\x7F\xF6e\xCF\x8D\r:\xF5\xE0\xAD\x1C&\xA3\xF8S\xEA\0\0\0\0\0\0\0\0\0\0\0\0\xA7g\xF7E3\x1D&|wQ)}\x98+\x05\x0C\x93\x98V'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01Q\x80\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\xB1H\xF4\x0F\xFF\x05\xB5\xCEk\"u,\xF8\xE4T\xB5V\xF7\xA8Q\x05Ad`\xDE\xB7mW\xAF`\x1B\xE1~w{\x93Y-\x8DMJ@\x96\xC5xv\xA9\x1C\x84\xF4\x18\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\x9CX\xBA\xCC3\x1C\x9A\xA8q\xAF\xD8\x02\xDBcy\xA9\x8E\x80\xCE\xDB\0\0\0\0\0\0\0\0\0\0\0\0\xCE\x11\xE1B%WYE\xB8\xE6\xDC\rO-\xD4\xC5p\xF7\x9D\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0#\x86\xF2o\xC1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x964\xCAdtt\xB6\xB7\x8D3\x823\x1Aw\xCD\0\xA8\xA9@\xDA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\x0042;\x930\x96SNC\x95\x8Fl{\xF4O+\xB5\x94$\xDA\x93%B)O\xF2p\xA8\xBB\xDB\xE1\xFB\x92\x1D\xE3\xD0\x9C\x97I\xDC5bsa\xFC\x17\xC4K\x9B\x02k\x81\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\x83\x90\xA1\xDA\x07\xE3v\xEFz\xDDK\xE8Y\xBAt\xFB\x83\xAA\x02\xD5\0\0\0\0\0\0\0\0\0\0\0\0\xC0*\xAA9\xB2#\xFE\x8D\n\x0E\\O'\xEA\xD9\x08\x82d\xEC\xF9\x86\xCA\0\0\0\0\0\0\0\0\0\0\0\0\xC0*\xAA9\xB2#\xFE\x8D\n\x0E\\O'\xEA\xD9\x08q\x01\xD8\x17\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\xB1H\xF4\x0F\xFF\x05\xB5\xCEk\"u,\xF8\xE4T\xB5V\xF7\xA8Q\xD1\xE8h\xD1 \xE3&\xE5X\x1C\xAA9\x85+\xB0\xDA\x924\xA5\x11\xEDv\xE6\xF7\xA9\xDC\xCE\xB0\xD5\xF1T\xC7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0lv\x97\x1F\x98\x94Z\xE9\x8D\xD7\xD4\xDF\xCA\x87\x11\xEB\xEA\x94n\xA6\0\0\0\0\0\0\0\0\0\0\0\0\xAF Gv\xC7$[\xF4\x14|&\x12\xBFnYr\xEEH7\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\t\x8EF\x99T%\xCA\0\0\0\0\0\0\0\0\0\0\0\0\xD3\xA8H\x95\x08\x06\t\xE1\x16<\x80\xB2\xBDesm\xB1\xB8k\xEC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC0M\x82\x1D\xDC\x9Deaw\xDA\xD4\xD5\xC2\xF7jK\xFF.\xD5\x14\xFFi\xFAJ\xA4\xFD\x86\x9Dn\x98\xD5\\\x89\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \xBC*\xCF^\x82\x1C\\\x9F\x86g\xA3k\xB1\x13\x1D\xAD&\xEDd\xF9\0\x02\0\0\0\0\0\0\0\0\0c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\xB1H\xF4\x0F\xFF\x05\xB5\xCEk\"u,\xF8\xE4T\xB5V\xF7\xA8Q\xF0\xE8\xECQ+%\x07\xDA\xE9\x91u\xA0\xA4y-\x8AS\xE0\x86?\xBB^sZ\\\x992\x95\xBB\xD1\x7FH\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0lv\x97\x1F\x98\x94Z\xE9\x8D\xD7\xD4\xDF\xCA\x87\x11\xEB\xEA\x94n\xA6\0\0\0\0\0\0\0\0\0\0\0\0\x9CX\xBA\xCC3\x1C\x9A\xA8q\xAF\xD8\x02\xDBcy\xA9\x8E\x80\xCE\xDB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\tO\x8D\x91h\xE2q\0\0\0\0\0\0\0\0\0\0\0\0\xD3\xA8H\x95\x08\x06\t\xE1\x16<\x80\xB2\xBDesm\xB1\xB8k\xEC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC0M\x82\x1D\xDC\x9Deaw\xDA\xD4\xD5\xC2\xF7jK\xFF.\xD5\x14\xFFi\xFAJ\xA4\xFD\x86\x9Dn\x98\xD5\\\x89\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 F\x83\xE3@\xA8\x04\x92a\x05}Z\xB1\xB2\x9C\x8D\x84\x0Eui^\0\x02\0\0\0\0\0\0\0\0\0Z\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\x0042;\x930\x96SNC\x95\x8Fl{\xF4O+\xB5\x94$\xDA\xD0\x03\x83\x88)\x11_]\x9F\xF3\xEDi\xC8\xD2\xB4\xB2n\x10\xEB\x1Ay3\x12\x06\xC2\x8F\xBBG49\n^\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\x80\x85\x07\x12\x1B\x80\xC0#\x88\xFA\xD1G&H.\x06\x1B\x8D\xA8'\0\0\0\0\0\0\0\0\0\0\0\0\xC0*\xAA9\xB2#\xFE\x8D\n\x0E\\O'\xEA\xD9\x08V[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\xAEa\0\xA96`\x04a$bV[a\x05\x0CV[`@Qa\0\x92\x91\x90a$\xC9V[a\0\xCEa\0\xC96`\x04a$\xDBV[a\x0C\xC6V[`@Qa\0\x92\x94\x93\x92\x91\x90a&\xE9V[a\0\x86a\0\xEC6`\x04a$bV[a\x13-V[a\0\xF9a\x13@V[`@Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\0\x92V[a\x011a\x01,6`\x04a$bV[a\x14\x10V[`@Qa\0\x92\x91\x90a'4V[`@Q\x7FV$\xB2[\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R\x7Fl\x9AlJ9(N7\xED\x1C\xF5=3uw\xD1B\x12\xA4\x87\x0F\xB9v\xA46li;\x93\x99\x18\xD5`\x04\x82\x01R`\x01`$\x82\x01R_\x90\x81\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x84\x16\x90cV$\xB2[\x90`D\x01_`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x01\xD0W=_\x80>=_\xFD[PPPP`@Q=_\x82>`\x1F=\x90\x81\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x82\x01`@Ra\x02\x15\x91\x90\x81\x01\x90a(\x8AV[\x80` \x01\x90Q\x81\x01\x90a\x02(\x91\x90a(\xC4V[\x90P_s/U\xE8\xB2\r\x0B\x9F\xEF\xA1\x87\xAA}\0\xB6\xCB\xE5c`[\xF5s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x90P_s\xFD\xAF\xC9\xD1\x90/N\x0B\x84\xF6_I\xF2D\xB3+1\x01;ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16s/U\xE8\xB2\r\x0B\x9F\xEF\xA1\x87\xAA}\0\xB6\xCB\xE5c`[\xF5s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cQ\xCA\xD5\xEE\x87s\x90\x08\xD1\x9FX\xAA\xBD\x9E\xD0\xD6\tqVZ\xA8Q\x05`\xABAs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xF6\x98\xDA%`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x03*W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x03N\x91\x90a(\xDFV[`@Q\x7F\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\xE0\x85\x90\x1B\x16\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x92\x16`\x04\x83\x01R`$\x82\x01R`D\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x03\xBAW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x03\xDE\x91\x90a(\xC4V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x90P_a\x04\x01\x86a\x05\x0CV[\x80` \x01\x90Q\x81\x01\x90a\x04\x14\x91\x90a(\xF6V[\x90P_s\xFD\xAF\xC9\xD1\x90/N\x0B\x84\xF6_I\xF2D\xB3+1\x01;ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16ca\x08\xC52\x88\x84`@Q` \x01a\x04Y\x91\x90a)\xCFV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 `@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x04\xAD\x92\x91\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x92\x90\x92\x16\x82R` \x82\x01R`@\x01\x90V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04\xC8W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04\xEC\x91\x90a)\xE1V[\x90P\x83\x80\x15a\x04\xF8WP\x82[\x80\x15a\x05\x01WP\x80[\x97\x96PPPPPPPV[``F`\x01\x81\x90\x03a\x07\xBDWs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\x99A\xFD}\xB2\x003\x08\xE7\xEE\x17\xB0D\0\x01\"x\xF1*\xC6\x03a\x05lW`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01aH/a\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xB3\xBF\x81qOpG \xDC\xB05\x1F\xF0\xD4.\xCAa\xB0i\xFC\x03a\x05\xC0W`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01aP\xEFa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s0\x10v\xC3n\x03IH\xA7G\xBBa\xBA\xB9\xCD\x03\xF6&r\xE3\x03a\x06\x14W`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01a6Oa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\x02~\x1C\xBF,)\x9C\xBA^\xB8\xA2XI\x10\xD0O\x1A\x8A\xA4\x03\x03a\x06hW`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01a-/a\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xBE\xEFZ\xFE\x88\xEFs3~Pp\xAB(U\xD3}\xBFT\x93\xA4\x03a\x06\xBCW`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01aB\xEFa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xC6\xB1=^f/\xA0E\x8F\x03\x99[\xCB\x82J\x194\xAA\x89_\x03a\x07\x10W`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01aA/a\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xD7\xCB\x8C\xC1\xB5cV\xBB{x\xD0.x^\xAD(\xE2\x15\x86`\x03a\x07dW`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01a9\xCFa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\x07\x9C\x86\x8F\x97\xAE\xD8\xE0\xD0?\x11\xE1R\x9C;\x05o\xF2\x1C\xEA\x03a\x07\xB8W`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01aI\xEFa\x01\xC0\x919\x93\x92PPPV[a\x0C\xB1V[\x80`d\x03a\x0C\xB1Ws\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xBCaY\xFDB\x9B\xE1\x82\x06\xE6\x0B;\xB0\x1Dr\x89\xF9\x05Q\x1B\x03a\x08\x19W`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01a.\xEFa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xE5\xD1\xAA\x85e\xF5\xDB\xFC\x06\xCD\xE2\r\xFDv\xB4\xC7\xC6\xD4;\xD5\x03a\x08mW`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01aFoa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\x9D\x85p\xEF\x9AQ\x9C\xA8\x1D\xAE\xC3R\x12\xF45\xD9\x84;\xA5d\x03a\x08\xC1W`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01aK\xAFa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xD9|1\xE5?\x16\xF4\x95q\\\xE7\x1E\x12\xE1\x1B\x95E\xEE\xDD\x8B\x03a\t\x15W`@Q\x80a\x02@\x01`@R\x80a\x02 \x81R` \x01a0\xAFa\x02 \x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xFF\x1B\xD3\xD5p\xE3TL\x18;\xA7\x7FZM<\xC7B\xC8\xD2\xB3\x03a\tiW`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01aT\x8Fa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s \x9D&\x9D\xFDf\xB9\xCE\xC7d\xDE~\xB6\xFE\xFC$\xF7[\xDDH\x03a\t\xBDW`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01aO/a\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xC3uu\xAD\x8E\xFES\x0F\xD8\xA7\x9A\xEB\0\x87\xE5\x87*$\xDA\xBC\x03a\n\x11W`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01a4\x8Fa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\x1Cx(\xDA\xDA\xDE\x12\xA8H\xF3k\xE8\xE2\xD3\x14db\xAB\xFFh\x03a\neW`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01a?oa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xAB\xA5)K\xBA}65\xC2\xA3\xE4M\x0E\x87\xEA\x7FX\x89\x8F\xB7\x03a\n\xB9W`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01aMoa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16sn\xB7\xBE\x97*\xEB\xB6\xBE-\x9A\xCFC|\xB4\x12\xC0\xAB\xEE\x91+\x03a\x0B\rW`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01a2\xCFa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xC4\xD0\x99i\xAA\xD7\xF2R\xC7]\xD3R\xBB\xBDq\x9E4\xED\x06\xAD\x03a\x0BaW`@Q\x80a\x02@\x01`@R\x80a\x02 \x81R` \x01a=Oa\x02 \x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xA2Z\xF8j]\xBE\xA4^\x9F\xD7\x0C\x18yH\x9Fc\xD0\x81\xADD\x03a\x0B\xB5W`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01aD\xAFa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16sWI,\xB6\xC8\xEE)\x98\xE9\xD8=\xDC\x8Cq>x\x1F\xFET\x8E\x03a\x0C\tW`@Q\x80a\x02\0\x01`@R\x80a\x01\xE0\x81R` \x01aR\xAFa\x01\xE0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16s\xC3>>\xC1EV\xA8\xE7\x1B\xE3\t\x7F\xE2\xDC\x8C\x0B\x91\x19\xC8\x97\x03a\x0C]W`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01a8\x0Fa\x01\xC0\x919\x93\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16swG(&\x87YS7N\xD3\x08L1\xA4\x83\xF8'\x98\x7F\x14\x03a\x0C\xB1W`@Q\x80a\x01\xE0\x01`@R\x80a\x01\xC0\x81R` \x01a;\x8Fa\x01\xC0\x919\x93\x92PPPV[PP`@\x80Q` \x81\x01\x90\x91R_\x81R\x91\x90PV[`@\x80Qa\x01\x80\x81\x01\x82R_\x80\x82R` \x82\x01\x81\x90R\x91\x81\x01\x82\x90R``\x81\x01\x82\x90R`\x80\x81\x01\x82\x90R`\xA0\x81\x01\x82\x90R`\xC0\x81\x01\x82\x90R`\xE0\x81\x01\x82\x90Ra\x01\0\x81\x01\x82\x90Ra\x01 \x81\x01\x82\x90Ra\x01@\x81\x01\x82\x90Ra\x01`\x81\x01\x91\x90\x91R``\x80\x80`\x02\x85\x14a\rdW`@Q\x7F\x9D\x89\x02\n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``a\ro\x88a\x13-V[a\x12\xE9Wa\r|\x88a\x16\x96V[a\r\xE7W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x15`$\x82\x01R\x7FPool is not a CoW AMM\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[_\x88s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\r\xFE\x16\x81`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0E1W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0EU\x91\x90a(\xC4V[\x90P_\x89s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xD2\x12 \xA7`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0E\xA1W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0E\xC5\x91\x90a(\xC4V[\x90P\x89s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cJ\xDA!\x8B`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0F\x10W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0F4\x91\x90a)\xE1V[\x15\x15_\x03a\x0FnW`@Q\x7F!\x08\x1A\xBF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x10\x81`@Q\x80`\xC0\x01`@R\x80\x8Cs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x83s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x8B\x8B`\x01\x81\x81\x10a\x0F\xE3Wa\x0F\xE3a*\0V[\x90P` \x02\x015\x81R` \x01\x8B\x8B_\x81\x81\x10a\x10\x01Wa\x10\x01a*\0V[\x90P` \x02\x015\x81R` \x01\x8Cs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cm\xBC\x88\x13`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x10VW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x10z\x91\x90a(\xDFV[\x90Ra\x17NV[\x96P\x86`@Q` \x01a\x10\x94\x91\x90a*-V[`@\x80Q\x80\x83\x03\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x01\x81R`\x01\x80\x84R\x83\x83\x01\x90\x92R\x94P\x81` \x01[`@\x80Q``\x80\x82\x01\x83R_\x80\x83R` \x83\x01R\x91\x81\x01\x91\x90\x91R\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x10\xD1W\x90PP\x95P`@Q\x80``\x01`@R\x80\x8Bs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01_\x81R` \x01a\x12;s\x90\x08\xD1\x9FX\xAA\xBD\x9E\xD0\xD6\tqVZ\xA8Q\x05`\xABAs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xF6\x98\xDA%`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x11\x8EW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x11\xB2\x91\x90a(\xDFV[\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x8B\x01\x80Q\x7F\xD5\xA2[\xA2\xE9p\x94\xAD}\x83\xDC(\xA6W-\xA7\x97\xD6\xB3\xE7\xFCfc\xBD\x93\xEF\xB7\x89\xFC\x17\xE4\x89\x82Ra\x01\xA0\x82 \x91R`@Q\x7F\x19\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x02\x81\x01\x92\x90\x92R`\"\x82\x01R`B\x90 \x90V[`@Q`$\x01a\x12M\x91\x81R` \x01\x90V[`@\x80Q\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x81\x84\x03\x01\x81R\x91\x90R` \x81\x01\x80Q{\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F\xF1O\xCB\xC8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x17\x90R\x90R\x86Q\x87\x90_\x90a\x12\xD7Wa\x12\xD7a*\0V[` \x02` \x01\x01\x81\x90RPPPa\x12\xFFV[a\x12\xF4\x88\x88\x88a\x1A\xD6V[\x92\x97P\x90\x95P\x93P\x90P[\x87\x81`@Q` \x01a\x13\x12\x92\x91\x90a*=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x14\xAA\x91\x90a(\xC4V[\x81_\x81Q\x81\x10a\x14\xBCWa\x14\xBCa*\0V[` \x02` \x01\x01\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RPP\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xD2\x12 \xA7`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x15?W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x15c\x91\x90a(\xC4V[\x81`\x01\x81Q\x81\x10a\x15vWa\x15va*\0V[` \x02` \x01\x01\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RPP\x91\x90PV[_a\x15\xBF\x83a!_V[P\x90P\x80_\x81Q\x81\x10a\x15\xD4Wa\x15\xD4a*\0V[` \x02` \x01\x01Q\x82_\x81Q\x81\x10a\x15\xEEWa\x15\xEEa*\0V[` \x02` \x01\x01\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RPP\x80`\x01\x81Q\x81\x10a\x16;Wa\x16;a*\0V[` \x02` \x01\x01Q\x82`\x01\x81Q\x81\x10a\x16VWa\x16Va*\0V[` \x02` \x01\x01\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81RPPP\x91\x90PV[_\x80a\x16\xA0a\x13@V[`@Q\x7Ffn\x1B9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x85\x81\x16`\x04\x83\x01R\x91\x90\x91\x16\x90cfn\x1B9\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x17\x0CW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x170\x91\x90a(\xC4V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15\x92\x91PPV[`@\x80Qa\x01\x80\x81\x01\x82R_\x80\x82R` \x82\x01\x81\x90R\x91\x81\x01\x82\x90R``\x81\x01\x82\x90R`\x80\x81\x01\x82\x90R`\xA0\x81\x01\x82\x90R`\xC0\x81\x01\x82\x90R`\xE0\x81\x01\x82\x90Ra\x01\0\x81\x01\x82\x90Ra\x01 \x81\x01\x82\x90Ra\x01@\x81\x01\x82\x90Ra\x01`\x81\x01\x91\x90\x91R` \x82\x01Q\x82Q`@Q\x7Fp\xA0\x821\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x91\x82\x16`\x04\x82\x01R_\x92\x83\x92\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x18\"W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x18F\x91\x90a(\xDFV[`@\x85\x81\x01Q\x86Q\x91Q\x7Fp\xA0\x821\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x92\x83\x16`\x04\x82\x01R\x91\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x18\xB7W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x18\xDB\x91\x90a(\xDFV[\x91P\x91P_\x80_\x80_\x88`\x80\x01Q\x87a\x18\xF4\x91\x90a*\xAEV[\x90P_\x89``\x01Q\x87a\x19\x07\x91\x90a*\xAEV[\x90P\x81\x81\x10\x15a\x19mW\x89` \x01Q\x95P\x89`@\x01Q\x94Pa\x199\x81\x8B`\x80\x01Q`\x02a\x194\x91\x90a*\xAEV[a\"{V[a\x19D`\x02\x8Aa*\xF2V[a\x19N\x91\x90a+\x05V[\x93Pa\x19f\x84\x88a\x19_\x82\x8Ca+\x05V[`\x01a\"\xCBV[\x92Pa\x19\xB9V[\x89`@\x01Q\x95P\x89` \x01Q\x94Pa\x19\x90\x82\x8B``\x01Q`\x02a\x194\x91\x90a*\xAEV[a\x19\x9B`\x02\x89a*\xF2V[a\x19\xA5\x91\x90a+\x05V[\x93Pa\x19\xB6\x84\x89a\x19_\x82\x8Ba+\x05V[\x92P[`@Q\x80a\x01\x80\x01`@R\x80\x87s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x86s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01_s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01\x85\x81R` \x01\x84\x81R` \x01a\x01,Ba\x1A3\x91\x90a+\x18V[c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x8B`\xA0\x01Q\x81R` \x01_\x81R` \x01\x7F\xF3\xB2wr\x8B?\xEEt\x94\x81\xEB>\x0B;H\x98\r\xBB\xABxe\x8F\xC4\x19\x02\\\xB1n\xEE4gu\x81R` \x01`\x01\x15\x15\x81R` \x01\x7FZ(\xE96;\xB9B\xB69'\0b\xAAk\xB2\x95\xF44\xBC\xDF\xC4,\x97&{\xF0\x03\xF2r\x06\r\xC9\x81R` \x01\x7FZ(\xE96;\xB9B\xB69'\0b\xAAk\xB2\x95\xF44\xBC\xDF\xC4,\x97&{\xF0\x03\xF2r\x06\r\xC9\x81RP\x98PPPPPPPPP\x91\x90PV[`@\x80Qa\x01\x80\x81\x01\x82R_\x80\x82R` \x82\x01\x81\x90R\x91\x81\x01\x82\x90R``\x81\x01\x82\x90R`\x80\x81\x01\x82\x90R`\xA0\x81\x01\x82\x90R`\xC0\x81\x01\x82\x90R`\xE0\x81\x01\x82\x90Ra\x01\0\x81\x01\x82\x90Ra\x01 \x81\x01\x82\x90Ra\x01@\x81\x01\x82\x90Ra\x01`\x81\x01\x91\x90\x91R``\x80``a\x1BD\x87a\x01>V[a\x1BzW`@Q\x7F\xEF\xC8i\xB4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_\x80a\x1B\x85\x89a!_V[\x91P\x91P_\x81`@\x01Q\x80` \x01\x90Q\x81\x01\x90a\x1B\xA2\x91\x90a+=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x1D\x07\x91\x90a(\xDFV[\x90P\x80\x7F\xD5\xA2[\xA2\xE9p\x94\xAD}\x83\xDC(\xA6W-\xA7\x97\xD6\xB3\xE7\xFCfc\xBD\x93\xEF\xB7\x89\xFC\x17\xE4\x89\x89`@Q` \x01a\x1D<\x91\x90a*-V[`@\x80Q\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x81\x84\x03\x01\x81R_``\x84\x01\x81\x81R`\x80\x85\x01\x84R\x84R` \x80\x85\x01\x8A\x90R\x83Q\x80\x82\x01\x85R\x91\x82R\x84\x84\x01\x91\x90\x91R\x91Q\x90\x92a\x1D\xA0\x92\x90\x91\x01a+\xF4V[`@\x80Q\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x81\x84\x03\x01\x81R\x90\x82\x90Ra\x1D\xDE\x94\x93\x92\x91`$\x01a,\x9DV[`@\x80Q\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x81\x84\x03\x01\x81R\x91\x81R` \x80\x83\x01\x80Q{\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F_\xD7\xE9}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x17\x90R\x81Q`\x01\x80\x82R\x81\x84\x01\x90\x93R\x92\x97P\x82\x01[`@\x80Q``\x80\x82\x01\x83R_\x80\x83R` \x83\x01R\x91\x81\x01\x91\x90\x91R\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x1EhW\x90PP`@\x80Q``\x81\x01\x82R\x85Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R_` \x82\x01R\x91\x98P\x81\x01\x8Ca\x1FU\x8B\x85\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x90\x91\x01\x80Q\x7F\xD5\xA2[\xA2\xE9p\x94\xAD}\x83\xDC(\xA6W-\xA7\x97\xD6\xB3\xE7\xFCfc\xBD\x93\xEF\xB7\x89\xFC\x17\xE4\x89\x82Ra\x01\xA0\x82 \x91R`@Q\x7F\x19\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x02\x81\x01\x92\x90\x92R`\"\x82\x01R`B\x90 \x90V[`@Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x92\x16`$\x83\x01R`D\x82\x01R`d\x01`@\x80Q\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x81\x84\x03\x01\x81R\x91\x90R` \x81\x01\x80Q{\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F0\xF7<\x99\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x17\x90R\x90R\x87Q\x88\x90_\x90a \x07Wa \x07a*\0V[` \x90\x81\x02\x91\x90\x91\x01\x01R`@\x80Q`\x01\x80\x82R\x81\x83\x01\x90\x92R\x90\x81` \x01[`@\x80Q``\x80\x82\x01\x83R_\x80\x83R` \x83\x01R\x91\x81\x01\x91\x90\x91R\x81R` \x01\x90`\x01\x90\x03\x90\x81a 'W\x90PP\x95P`@Q\x80``\x01`@R\x80\x84_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01_\x81R` \x01\x8C_\x80\x1B`@Q`$\x01a \xBD\x92\x91\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x92\x90\x92\x16\x82R` \x82\x01R`@\x01\x90V[`@\x80Q\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x81\x84\x03\x01\x81R\x91\x90R` \x81\x01\x80Q{\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x7F0\xF7<\x99\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x17\x90R\x90R\x86Q\x87\x90_\x90a!GWa!Ga*\0V[` \x02` \x01\x01\x81\x90RPPPPP\x93P\x93P\x93P\x93V[`@\x80Q``\x81\x81\x01\x83R_\x80\x83R` \x83\x01R\x91\x81\x01\x82\x90Ra!\x82\x83a\x05\x0CV[\x80` \x01\x90Q\x81\x01\x90a!\x95\x91\x90a(\xF6V[\x90P_\x81`@\x01Q\x80` \x01\x90Q\x81\x01\x90a!\xB0\x91\x90a+V[_\x81Q\x80\x84R\x80` \x84\x01` \x86\x01^_` \x82\x86\x01\x01R` \x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x83\x01\x16\x85\x01\x01\x91PP\x92\x91PPV[` \x81R_a\"\xC2` \x83\x01\x84a$}V[_\x80_`@\x84\x86\x03\x12\x15a$\xEDW_\x80\xFD[\x835a$\xF8\x81a$>V[\x92P` \x84\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a%\x14W_\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12a%'W_\x80\xFD[\x815\x81\x81\x11\x15a%5W_\x80\xFD[\x87` \x82`\x05\x1B\x85\x01\x01\x11\x15a%IW_\x80\xFD[` \x83\x01\x94P\x80\x93PPPP\x92P\x92P\x92V[\x80Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x82R` \x81\x01Qa%\x9D` \x84\x01\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90RV[P`@\x81\x01Qa%\xC5`@\x84\x01\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90RV[P``\x81\x01Q``\x83\x01R`\x80\x81\x01Q`\x80\x83\x01R`\xA0\x81\x01Qa%\xF1`\xA0\x84\x01\x82c\xFF\xFF\xFF\xFF\x16\x90RV[P`\xC0\x81\x01Q`\xC0\x83\x01R`\xE0\x81\x01Q`\xE0\x83\x01Ra\x01\0\x80\x82\x01Q\x81\x84\x01RPa\x01 \x80\x82\x01Qa&&\x82\x85\x01\x82\x15\x15\x90RV[PPa\x01@\x81\x81\x01Q\x90\x83\x01Ra\x01`\x90\x81\x01Q\x91\x01RV[_\x82\x82Q\x80\x85R` \x80\x86\x01\x95P\x80\x82`\x05\x1B\x84\x01\x01\x81\x86\x01_[\x84\x81\x10\x15a&\xDCW\x85\x83\x03\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x01\x89R\x81Q\x80Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84R\x84\x81\x01Q\x85\x85\x01R`@\x90\x81\x01Q``\x91\x85\x01\x82\x90R\x90a&\xC8\x81\x86\x01\x83a$}V[\x9A\x86\x01\x9A\x94PPP\x90\x83\x01\x90`\x01\x01a&ZV[P\x90\x97\x96PPPPPPPV[_a\x01\xE0a&\xF7\x83\x88a%\\V[\x80a\x01\x80\x84\x01Ra'\n\x81\x84\x01\x87a&?V[\x90P\x82\x81\x03a\x01\xA0\x84\x01Ra'\x1F\x81\x86a&?V[\x90P\x82\x81\x03a\x01\xC0\x84\x01Ra\x05\x01\x81\x85a$}V[` \x80\x82R\x82Q\x82\x82\x01\x81\x90R_\x91\x90\x84\x82\x01\x90`@\x85\x01\x90\x84[\x81\x81\x10\x15a'\x81W\x83Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x83R\x92\x84\x01\x92\x91\x84\x01\x91`\x01\x01a'OV[P\x90\x96\x95PPPPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[`@Q`\xC0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a'\xDDWa'\xDDa'\x8DV[`@R\x90V[_\x82`\x1F\x83\x01\x12a'\xF2W_\x80\xFD[\x81Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a(\rWa(\ra'\x8DV[`@Q`\x1F\x83\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x90\x81\x16`?\x01\x16\x81\x01\x90\x82\x82\x11\x81\x83\x10\x17\x15a(SWa(Sa'\x8DV[\x81`@R\x83\x81R\x86` \x85\x88\x01\x01\x11\x15a(kW_\x80\xFD[\x83` \x87\x01` \x83\x01^_` \x85\x83\x01\x01R\x80\x94PPPPP\x92\x91PPV[_` \x82\x84\x03\x12\x15a(\x9AW_\x80\xFD[\x81Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a(\xB0W_\x80\xFD[a(\xBC\x84\x82\x85\x01a'\xE3V[\x94\x93PPPPV[_` \x82\x84\x03\x12\x15a(\xD4W_\x80\xFD[\x81Qa$\x0B\x81a$>V[_` \x82\x84\x03\x12\x15a(\xEFW_\x80\xFD[PQ\x91\x90PV[_` \x82\x84\x03\x12\x15a)\x06W_\x80\xFD[\x81Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a)\x1DW_\x80\xFD[\x90\x83\x01\x90``\x82\x86\x03\x12\x15a)0W_\x80\xFD[`@Q``\x81\x01\x81\x81\x10\x83\x82\x11\x17\x15a)KWa)Ka'\x8DV[`@R\x82Qa)Y\x81a$>V[\x81R` \x83\x81\x01Q\x90\x82\x01R`@\x83\x01Q\x82\x81\x11\x15a)vW_\x80\xFD[a)\x82\x87\x82\x86\x01a'\xE3V[`@\x83\x01RP\x95\x94PPPPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81Q\x16\x82R` \x81\x01Q` \x83\x01R_`@\x82\x01Q```@\x85\x01Ra(\xBC``\x85\x01\x82a$}V[` \x81R_a\"\xC2` \x83\x01\x84a)\x91V[_` \x82\x84\x03\x12\x15a)\xF1W_\x80\xFD[\x81Q\x80\x15\x15\x81\x14a$\x0BW_\x80\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`2`\x04R`$_\xFD[a\x01\x80\x81\x01a\"\xC5\x82\x84a%\\V[\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\x83``\x1B\x16\x81R_\x82Q\x80` \x85\x01`\x14\x85\x01^_\x92\x01`\x14\x01\x91\x82RP\x92\x91PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x11`\x04R`$_\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\"\xC5Wa\"\xC5a*\x81V[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`\x12`\x04R`$_\xFD[_\x82a+\0Wa+\0a*\xC5V[P\x04\x90V[\x81\x81\x03\x81\x81\x11\x15a\"\xC5Wa\"\xC5a*\x81V[c\xFF\xFF\xFF\xFF\x81\x81\x16\x83\x82\x16\x01\x90\x80\x82\x11\x15a+5Wa+5a*\x81V[P\x92\x91PPV[_` \x82\x84\x03\x12\x15a+LW_\x80\xFD[\x81Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a+cW_\x80\xFD[\x90\x83\x01\x90`\xC0\x82\x86\x03\x12\x15a+vW_\x80\xFD[a+~a'\xBAV[\x82Qa+\x89\x81a$>V[\x81R` \x83\x01Qa+\x99\x81a$>V[` \x82\x01R`@\x83\x81\x01Q\x90\x82\x01R``\x83\x01Qa+\xB6\x81a$>V[``\x82\x01R`\x80\x83\x01Q\x82\x81\x11\x15a+\xCCW_\x80\xFD[a+\xD8\x87\x82\x86\x01a'\xE3V[`\x80\x83\x01RP`\xA0\x83\x01Q`\xA0\x82\x01R\x80\x93PPPP\x92\x91PPV[` \x80\x82R\x82Q``\x83\x83\x01R\x80Q`\x80\x84\x01\x81\x90R_\x92\x91\x82\x01\x90\x83\x90`\xA0\x86\x01\x90[\x80\x83\x10\x15a,8W\x83Q\x82R\x92\x84\x01\x92`\x01\x92\x90\x92\x01\x91\x90\x84\x01\x90a,\x18V[P\x83\x87\x01Q\x93P\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x92P\x82\x86\x82\x03\x01`@\x87\x01Ra,v\x81\x85a)\x91V[\x93PPP`@\x85\x01Q\x81\x85\x84\x03\x01``\x86\x01Ra,\x93\x83\x82a$}V[\x96\x95PPPPPPV[\x84\x81R\x83` \x82\x01R`\x80`@\x82\x01R_a,\xBB`\x80\x83\x01\x85a$}V[\x82\x81\x03``\x84\x01Ra\x05\x01\x81\x85a$}V[\x80\x82\x01\x80\x82\x11\x15a\"\xC5Wa\"\xC5a*\x81V[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`!`\x04R`$_\xFD[_`\xFF\x83\x16\x80a-\x1FWa-\x1Fa*\xC5V[\x80`\xFF\x84\x16\x06\x91PP\x92\x91PPV\xFE\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\x0042;\x930\x96SNC\x95\x8Fl{\xF4O+\xB5\x94$\xDA\xC5\xA0\xE7V\xAC\x88\xC1\xD3\xA4\xC4\x19\0\xD9w\xFE\x93\xC2\xD3O\xC9Z\0\xCA>\x84\xEBLkP\xFA\xF9I\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\xC0*\xAA9\xB2#\xFE\x8D\n\x0E\\O'\xEA\xD9\x08\xA8\x14\xF6N~\x04\xA3\xB9I\xA5qx\x9E\x19lZ\x91\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0j\x02<\xCD\x1F\xF6\xF2\x04\\3\tv\x8E\xAD\x9Eh\xF9x\xF6\xE1\0\0\0\0\0\0\0\0\0\0\0\0\xE9\x1D\x15>\x0BAQ\x8A,\xE8\xDD=yD\xFA\x864c\xA9}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\n\xFF\xD9\xFD\xEB\x8E\x08\0\0\0\0\0\0\0\0\0\0\0\0\xD3\xA8H\x95\x08\x06\t\xE1\x16<\x80\xB2\xBDesm\xB1\xB8k\xEC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC0M\x82\x1D\xDC\x9Deaw\xDA\xD4\xD5\xC2\xF7jK\xFF.\xD5\x14\xFFi\xFAJ\xA4\xFD\x86\x9Dn\x98\xD5\\\x89\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \xA9\x9F\xD9\x95\x0B]]\xCE\xEA\xF4\x93\x9E\"\x1D\xCA\x8C\xA9\xB98\xAB\0\x01\0\0\0\0\0\0\0\0\0%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\xB1H\xF4\x0F\xFF\x05\xB5\xCEk\"u,\xF8\xE4T\xB5V\xF7\xA8Qx\xA7)\xEE0\x08\xC7\xD4\x882\xD0\"g\xB7._4\xAD\xA8\xF5T\xA6s\x1A6\x8F\x01Y\x0E\xD7\x1B4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\x80\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\xCBDN\x90\xD8\x19\x84\x15&lj'$\xB7\x90\x0F\xB1/\xC5n\0\0\0\0\0\0\0\0\0\0\0\0\xE9\x1D\x15>\x0BAQ\x8A,\xE8\xDD=yD\xFA\x864c\xA9}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V\x19zT%\xC0\xC8\0\0\0\0\0\0\0\0\0\0\0\0\xBD\x91\xA7-\xC3\xD9\xB5\xD9\xB1n\xE8c\x8D\xA1\xFCe1\x1B\xD9\n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC0M\x82\x1D\xDC\x9Deaw\xDA\xD4\xD5\xC2\xF7jK\xFF.\xD5\x14\xFFi\xFAJ\xA4\xFD\x86\x9Dn\x98\xD5\\\x89\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x80\0\0\0\0\0\0\0\0\0\0\0\0\xABp\xBC\xB2`\x07=\x03m\x16` \x1E\x9DT\x05\xF5\x82\x9Bz\0\0\0\0\0\0\0\0\0\0\0\0g\x8D\xF3A_\xC3\x19G\xDAC$\xECc!(t\xBEZ\x82\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01Q\x80\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\xB1H\xF4\x0F\xFF\x05\xB5\xCEk\"u,\xF8\xE4T\xB5V\xF7\xA8Q.1\x98\x1E4\x96\ti\xEBT\x9F^\x82l\xF7\x7Fe^r\xB06\x03\xADWJy\xFD\x01_M\xE4\xDE\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0lv\x97\x1F\x98\x94Z\xE9\x8D\xD7\xD4\xDF\xCA\x87\x11\xEB\xEA\x94n\xA6\0\0\0\0\0\0\0\0\0\0\0\0\xAF Gv\xC7$[\xF4\x14|&\x12\xBFnYr\xEEH7\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\n\x16\xC9ZM.<\0\0\0\0\0\0\0\0\0\0\0\0\xD3\xA8H\x95\x08\x06\t\xE1\x16<\x80\xB2\xBDesm\xB1\xB8k\xEC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC0\xCE\x9E\x05\xC2\xAE\xE5\xF2/\x99A\xC4\xCD\x1F\x1A\x1D\x13\x19K\x10\x97yB-Z\xD9\xA9\x80\x15{\xD0\xF1d\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \xBC*\xCF^\x82\x1C\\\x9F\x86g\xA3k\xB1\x13\x1D\xAD&\xEDd\xF9\0\x02\0\0\0\0\0\0\0\0\0c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\xB1H\xF4\x0F\xFF\x05\xB5\xCEk\"u,\xF8\xE4T\xB5V\xF7\xA8Q\xA2\x02\x9F\xBBTYx\xD0Sx\xB6\xDF\x19\xE3uO\xE5\xED-\x0B\xA1\xE0Q\x02u\x03\x93Cr\xF7\xBE\xB2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\x9CX\xBA\xCC3\x1C\x9A\xA8q\xAF\xD8\x02\xDBcy\xA9\x8E\x80\xCE\xDB\0\0\0\0\0\0\0\0\0\0\0\0\x17q'b,J\0\xF3\xD4\t\xB7Uq\xE1,\xB3\xC8\x97=<\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0R\xBA\x9E\xFC8D\x1A\0\0\0\0\0\0\0\0\0\0\0\0\xD3\xA8H\x95\x08\x06\t\xE1\x16<\x80\xB2\xBDesm\xB1\xB8k\xEC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC0M\x82\x1D\xDC\x9Deaw\xDA\xD4\xD5\xC2\xF7jK\xFF.\xD5\x14\xFFi\xFAJ\xA4\xFD\x86\x9Dn\x98\xD5\\\x89\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 !\xD4\xC7\x92\xEA~8\xE0\xD0\x81\x9C \x11\xA2\xB1\xCBrR\xBD\x99\0\x02\0\0\0\0\0\0\0\0\0\x1E\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\x0042;\x930\x96SNC\x95\x8Fl{\xF4O+\xB5\x94$\xDA\xCAD\xB6\xA3\x04\xBA\xA1m\x11\xB6\xDB\x07\x06l\x12v\xB1'>\xE3\xF9E\x90\xBB\xD02\x01\xA6\x18\x82\xAF\x9A\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\xA0\xB8i\x91\xC6!\x8B6\xC1\xD1\x9DJ.\x9E\xB0\xCE6\x06\xEBH\0\0\0\0\0\0\0\0\0\0\0\0\xC0*\xAA9\xB2#\xFE\x8D\n\x0E\\O'\xEA\xD9\x08\xFE\xCD\x84a\x8Cz\x16\x8E\x88\xB9\xCB}\x1C\r\xB1(\xAF\x1E\xFE\n\x08\xBB\xB1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0lv\x97\x1F\x98\x94Z\xE9\x8D\xD7\xD4\xDF\xCA\x87\x11\xEB\xEA\x94n\xA6\0\0\0\0\0\0\0\0\0\0\0\0\xAF Gv\xC7$[\xF4\x14|&\x12\xBFnYr\xEEH7\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\n\x17'?\xC1Kd\0\0\0\0\0\0\0\0\0\0\0\0\xD3\xA8H\x95\x08\x06\t\xE1\x16<\x80\xB2\xBDesm\xB1\xB8k\xEC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC0M\x82\x1D\xDC\x9Deaw\xDA\xD4\xD5\xC2\xF7jK\xFF.\xD5\x14\xFFi\xFAJ\xA4\xFD\x86\x9Dn\x98\xD5\\\x89\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \xBC*\xCF^\x82\x1C\\\x9F\x86g\xA3k\xB1\x13\x1D\xAD&\xEDd\xF9\0\x02\0\0\0\0\0\0\0\0\0c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\x0042;\x930\x96SNC\x95\x8Fl{\xF4O+\xB5\x94$\xDA\x80\xBAS?\x01N\xF4#\x8A\xB7\xAD <\n\xEA\xCB\xF3\nq\xC04a@\xDBw\xC4:\xE3\x12\x1A\xFA\xDD\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\xAE\xA4j`6\x8A{\xD0`\xEE\xC7\xDF\x8C\xBAC\xB7\xEFA\xAD\x85\0\0\0\0\0\0\0\0\0\0\0\0\xC0*\xAA9\xB2#\xFE\x8D\n\x0E\\O'\xEA\xD9\x08\x0BAQ\x8A,\xE8\xDD=yD\xFA\x864c\xA9}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0'\x10\0\0\0\0\0\0\0\0\0\0\0\0\xE0\x89\x04\x90'\xB9\\'E\xD1\xA9T\xBC\x1D$SR\xD8\x84\xE9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC0M\x82\x1D\xDC\x9Deaw\xDA\xD4\xD5\xC2\xF7jK\xFF.\xD5\x14\xFFi\xFAJ\xA4\xFD\x86\x9Dn\x98\xD5\\\x89\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\x8D\xB8\x87\x0C\xA4\xB8\xAC\x18\x8CM\x1A\x01O4\xA3\x81\xAE'\xE1\xC2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\xB1H\xF4\x0F\xFF\x05\xB5\xCEk\"u,\xF8\xE4T\xB5V\xF7\xA8Q \x9C\x17\xD9\xEB\xE3\xACsRy_\x7F\x8B=\x14\xD2S\xD9$0\x83\x1D;,9e\xF9\xA5x\xDAv\x18\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\x80\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\xE9\x1D\x15>\x0BAQ\x8A,\xE8\xDD=yD\xFA\x864c\xA9}\0\0\0\0\0\0\0\0\0\0\0\0lv\x97\x1F\x98\x94Z\xE9\x8D\xD7\xD4\xDF\xCA\x87\x11\xEB\xEA\x94n\xA6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x8A\xA3\xA5(\x15&/X\0\0\0\0\0\0\0\0\0\0\0\0\xBD\x91\xA7-\xC3\xD9\xB5\xD9\xB1n\xE8c\x8D\xA1\xFCe1\x1B\xD9\n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC0M\x82\x1D\xDC\x9Deaw\xDA\xD4\xD5\xC2\xF7jK\xFF.\xD5\x14\xFFi\xFAJ\xA4\xFD\x86\x9Dn\x98\xD5\\\x89\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x80\0\0\0\0\0\0\0\0\0\0\0\0\0d\xAC\0\x7F\xF6e\xCF\x8D\r:\xF5\xE0\xAD\x1C&\xA3\xF8S\xEA\0\0\0\0\0\0\0\0\0\0\0\0\xA7g\xF7E3\x1D&|wQ)}\x98+\x05\x0C\x93\x98V'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01Q\x80\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\xB1H\xF4\x0F\xFF\x05\xB5\xCEk\"u,\xF8\xE4T\xB5V\xF7\xA8Q\x05Ad`\xDE\xB7mW\xAF`\x1B\xE1~w{\x93Y-\x8DMJ@\x96\xC5xv\xA9\x1C\x84\xF4\x18\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\x9CX\xBA\xCC3\x1C\x9A\xA8q\xAF\xD8\x02\xDBcy\xA9\x8E\x80\xCE\xDB\0\0\0\0\0\0\0\0\0\0\0\0\xCE\x11\xE1B%WYE\xB8\xE6\xDC\rO-\xD4\xC5p\xF7\x9D\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0#\x86\xF2o\xC1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x964\xCAdtt\xB6\xB7\x8D3\x823\x1Aw\xCD\0\xA8\xA9@\xDA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\x0042;\x930\x96SNC\x95\x8Fl{\xF4O+\xB5\x94$\xDA\x93%B)O\xF2p\xA8\xBB\xDB\xE1\xFB\x92\x1D\xE3\xD0\x9C\x97I\xDC5bsa\xFC\x17\xC4K\x9B\x02k\x81\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\x83\x90\xA1\xDA\x07\xE3v\xEFz\xDDK\xE8Y\xBAt\xFB\x83\xAA\x02\xD5\0\0\0\0\0\0\0\0\0\0\0\0\xC0*\xAA9\xB2#\xFE\x8D\n\x0E\\O'\xEA\xD9\x08\x82d\xEC\xF9\x86\xCA\0\0\0\0\0\0\0\0\0\0\0\0\xC0*\xAA9\xB2#\xFE\x8D\n\x0E\\O'\xEA\xD9\x08q\x01\xD8\x17\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\xB1H\xF4\x0F\xFF\x05\xB5\xCEk\"u,\xF8\xE4T\xB5V\xF7\xA8Q\xD1\xE8h\xD1 \xE3&\xE5X\x1C\xAA9\x85+\xB0\xDA\x924\xA5\x11\xEDv\xE6\xF7\xA9\xDC\xCE\xB0\xD5\xF1T\xC7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0lv\x97\x1F\x98\x94Z\xE9\x8D\xD7\xD4\xDF\xCA\x87\x11\xEB\xEA\x94n\xA6\0\0\0\0\0\0\0\0\0\0\0\0\xAF Gv\xC7$[\xF4\x14|&\x12\xBFnYr\xEEH7\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\t\x8EF\x99T%\xCA\0\0\0\0\0\0\0\0\0\0\0\0\xD3\xA8H\x95\x08\x06\t\xE1\x16<\x80\xB2\xBDesm\xB1\xB8k\xEC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC0M\x82\x1D\xDC\x9Deaw\xDA\xD4\xD5\xC2\xF7jK\xFF.\xD5\x14\xFFi\xFAJ\xA4\xFD\x86\x9Dn\x98\xD5\\\x89\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \xBC*\xCF^\x82\x1C\\\x9F\x86g\xA3k\xB1\x13\x1D\xAD&\xEDd\xF9\0\x02\0\0\0\0\0\0\0\0\0c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\xB1H\xF4\x0F\xFF\x05\xB5\xCEk\"u,\xF8\xE4T\xB5V\xF7\xA8Q\xF0\xE8\xECQ+%\x07\xDA\xE9\x91u\xA0\xA4y-\x8AS\xE0\x86?\xBB^sZ\\\x992\x95\xBB\xD1\x7FH\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0lv\x97\x1F\x98\x94Z\xE9\x8D\xD7\xD4\xDF\xCA\x87\x11\xEB\xEA\x94n\xA6\0\0\0\0\0\0\0\0\0\0\0\0\x9CX\xBA\xCC3\x1C\x9A\xA8q\xAF\xD8\x02\xDBcy\xA9\x8E\x80\xCE\xDB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\tO\x8D\x91h\xE2q\0\0\0\0\0\0\0\0\0\0\0\0\xD3\xA8H\x95\x08\x06\t\xE1\x16<\x80\xB2\xBDesm\xB1\xB8k\xEC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC0M\x82\x1D\xDC\x9Deaw\xDA\xD4\xD5\xC2\xF7jK\xFF.\xD5\x14\xFFi\xFAJ\xA4\xFD\x86\x9Dn\x98\xD5\\\x89\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 F\x83\xE3@\xA8\x04\x92a\x05}Z\xB1\xB2\x9C\x8D\x84\x0Eui^\0\x02\0\0\0\0\0\0\0\0\0Z\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\x0042;\x930\x96SNC\x95\x8Fl{\xF4O+\xB5\x94$\xDA\xD0\x03\x83\x88)\x11_]\x9F\xF3\xEDi\xC8\xD2\xB4\xB2n\x10\xEB\x1Ay3\x12\x06\xC2\x8F\xBBG49\n^\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\x80\x85\x07\x12\x1B\x80\xC0#\x88\xFA\xD1G&H.\x06\x1B\x8D\xA8'\0\0\0\0\0\0\0\0\0\0\0\0\xC0*\xAA9\xB2#\xFE\x8D\n\x0E\\O'\xEA\xD9\x08 = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: InvalidArrayLength) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for InvalidArrayLength { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for InvalidArrayLength { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [157u8, 137u8, 2u8, 10u8]; - const SIGNATURE: &'static str = "InvalidArrayLength()"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(Self::new) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `MathOverflowedMulDiv()` and selector `0x227bc153`. - ```solidity - error MathOverflowedMulDiv(); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct MathOverflowedMulDiv; - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: MathOverflowedMulDiv) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for MathOverflowedMulDiv { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for MathOverflowedMulDiv { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [34u8, 123u8, 193u8, 83u8]; - const SIGNATURE: &'static str = "MathOverflowedMulDiv()"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(Self::new) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `NoOrder()` and selector `0x19aad573`. - ```solidity - error NoOrder(); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct NoOrder; - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: NoOrder) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for NoOrder { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for NoOrder { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [25u8, 170u8, 213u8, 115u8]; - const SIGNATURE: &'static str = "NoOrder()"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(Self::new) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `PoolDoesNotExist()` and selector `0x9c8787c0`. - ```solidity - error PoolDoesNotExist(); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct PoolDoesNotExist; - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: PoolDoesNotExist) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for PoolDoesNotExist { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for PoolDoesNotExist { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [156u8, 135u8, 135u8, 192u8]; - const SIGNATURE: &'static str = "PoolDoesNotExist()"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(Self::new) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `PoolIsClosed()` and selector `0xefc869b4`. - ```solidity - error PoolIsClosed(); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct PoolIsClosed; - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: PoolIsClosed) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for PoolIsClosed { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for PoolIsClosed { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [239u8, 200u8, 105u8, 180u8]; - const SIGNATURE: &'static str = "PoolIsClosed()"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(Self::new) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Custom error with signature `PoolIsPaused()` and selector `0x21081abf`. - ```solidity - error PoolIsPaused(); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct PoolIsPaused; - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: PoolIsPaused) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for PoolIsPaused { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for PoolIsPaused { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [33u8, 8u8, 26u8, 191u8]; - const SIGNATURE: &'static str = "PoolIsPaused()"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - - #[inline] - fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(Self::new) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Event with signature `COWAMMPoolCreated(address)` and selector `0x0d03834d0d86c7f57e877af40e26f176dc31bd637535d4ba153d1ac9de88a7ea`. - ```solidity - event COWAMMPoolCreated(address indexed amm); - ```*/ - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - #[derive(Clone)] - pub struct COWAMMPoolCreated { - #[allow(missing_docs)] - pub amm: alloy_sol_types::private::Address, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - #[automatically_derived] - impl alloy_sol_types::SolEvent for COWAMMPoolCreated { - type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type DataTuple<'a> = (); - type TopicList = ( - alloy_sol_types::sol_data::FixedBytes<32>, - alloy_sol_types::sol_data::Address, - ); - - const ANONYMOUS: bool = false; - const SIGNATURE: &'static str = "COWAMMPoolCreated(address)"; - const SIGNATURE_HASH: alloy_sol_types::private::B256 = - alloy_sol_types::private::B256::new([ - 13u8, 3u8, 131u8, 77u8, 13u8, 134u8, 199u8, 245u8, 126u8, 135u8, 122u8, 244u8, - 14u8, 38u8, 241u8, 118u8, 220u8, 49u8, 189u8, 99u8, 117u8, 53u8, 212u8, 186u8, - 21u8, 61u8, 26u8, 201u8, 222u8, 136u8, 167u8, 234u8, - ]); - - #[allow(unused_variables)] - #[inline] - fn new( - topics: ::RustType, - data: as alloy_sol_types::SolType>::RustType, - ) -> Self { - Self { amm: topics.1 } - } - - #[inline] - fn check_signature( - topics: &::RustType, - ) -> alloy_sol_types::Result<()> { - if topics.0 != Self::SIGNATURE_HASH { - return Err(alloy_sol_types::Error::invalid_event_signature_hash( - Self::SIGNATURE, - topics.0, - Self::SIGNATURE_HASH, - )); - } - Ok(()) - } - - #[inline] - fn tokenize_body(&self) -> Self::DataToken<'_> { - () - } - - #[inline] - fn topics(&self) -> ::RustType { - (Self::SIGNATURE_HASH.into(), self.amm.clone()) - } - - #[inline] - fn encode_topics_raw( - &self, - out: &mut [alloy_sol_types::abi::token::WordToken], - ) -> alloy_sol_types::Result<()> { - if out.len() < ::COUNT { - return Err(alloy_sol_types::Error::Overrun); - } - out[0usize] = alloy_sol_types::abi::token::WordToken(Self::SIGNATURE_HASH); - out[1usize] = ::encode_topic( - &self.amm, - ); - Ok(()) - } - } - #[automatically_derived] - impl alloy_sol_types::private::IntoLogData for COWAMMPoolCreated { - fn to_log_data(&self) -> alloy_sol_types::private::LogData { - From::from(self) - } - - fn into_log_data(self) -> alloy_sol_types::private::LogData { - From::from(&self) - } - } - #[automatically_derived] - impl From<&COWAMMPoolCreated> for alloy_sol_types::private::LogData { - #[inline] - fn from(this: &COWAMMPoolCreated) -> alloy_sol_types::private::LogData { - alloy_sol_types::SolEvent::encode_log_data(this) - } - } - }; - /**Constructor`. - ```solidity - constructor(); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct constructorCall {} - const _: () = { - use alloy_sol_types; - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: constructorCall) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for constructorCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self {} - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolConstructor for constructorCall { - type Parameters<'a> = (); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `factory()` and selector `0xc45a0155`. - ```solidity - function factory() external view returns (address); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct factoryCall; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the - /// [`factory()`](factoryCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct factoryReturn { - #[allow(missing_docs)] - pub _0: alloy_sol_types::private::Address, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: factoryCall) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for factoryCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self - } - } - } - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (alloy_sol_types::sol_data::Address,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy_sol_types::private::Address,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: factoryReturn) -> Self { - (value._0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for factoryReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for factoryCall { - type Parameters<'a> = (); - type Return = alloy_sol_types::private::Address; - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type ReturnTuple<'a> = (alloy_sol_types::sol_data::Address,); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [196u8, 90u8, 1u8, 85u8]; - const SIGNATURE: &'static str = "factory()"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - (::tokenize(ret),) - } - - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data).map( - |r| { - let r: factoryReturn = r.into(); - r._0 - }, - ) - } - - #[inline] - fn abi_decode_returns_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(|r| { - let r: factoryReturn = r.into(); - r._0 - }) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `order(address,uint256[])` and selector `0x27242c9b`. - ```solidity - function order(address pool, uint256[] memory prices) external view returns (GPv2Order.Data memory _order, GPv2Interaction.Data[] memory preInteractions, GPv2Interaction.Data[] memory postInteractions, bytes memory sig); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct orderCall { - #[allow(missing_docs)] - pub pool: alloy_sol_types::private::Address, - #[allow(missing_docs)] - pub prices: - alloy_sol_types::private::Vec, - } - #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the - /// [`order(address,uint256[])`](orderCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct orderReturn { - #[allow(missing_docs)] - pub _order: ::RustType, - #[allow(missing_docs)] - pub preInteractions: alloy_sol_types::private::Vec< - ::RustType, - >, - #[allow(missing_docs)] - pub postInteractions: alloy_sol_types::private::Vec< - ::RustType, - >, - #[allow(missing_docs)] - pub sig: alloy_sol_types::private::Bytes, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = ( - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Array>, - ); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy_sol_types::private::Address, - alloy_sol_types::private::Vec, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: orderCall) -> Self { - (value.pool, value.prices) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for orderCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - pool: tuple.0, - prices: tuple.1, - } - } - } - } - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = ( - GPv2Order::Data, - alloy_sol_types::sol_data::Array, - alloy_sol_types::sol_data::Array, - alloy_sol_types::sol_data::Bytes, - ); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - ::RustType, - alloy_sol_types::private::Vec< - ::RustType, - >, - alloy_sol_types::private::Vec< - ::RustType, - >, - alloy_sol_types::private::Bytes, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: orderReturn) -> Self { - ( - value._order, - value.preInteractions, - value.postInteractions, - value.sig, - ) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for orderReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - _order: tuple.0, - preInteractions: tuple.1, - postInteractions: tuple.2, - sig: tuple.3, - } - } - } - } - impl orderReturn { - fn _tokenize(&self) -> ::ReturnToken<'_> { - ( - ::tokenize( - &self._order, - ), - as alloy_sol_types::SolType>::tokenize(&self.preInteractions), - as alloy_sol_types::SolType>::tokenize(&self.postInteractions), - ::tokenize( - &self.sig, - ), - ) - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for orderCall { - type Parameters<'a> = ( - alloy_sol_types::sol_data::Address, - alloy_sol_types::sol_data::Array>, - ); - type Return = orderReturn; - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type ReturnTuple<'a> = ( - GPv2Order::Data, - alloy_sol_types::sol_data::Array, - alloy_sol_types::sol_data::Array, - alloy_sol_types::sol_data::Bytes, - ); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [39u8, 36u8, 44u8, 155u8]; - const SIGNATURE: &'static str = "order(address,uint256[])"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.pool, - ), - , - > as alloy_sol_types::SolType>::tokenize(&self.prices), - ) - } - - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - orderReturn::_tokenize(ret) - } - - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data) - .map(Into::into) - } - - #[inline] - fn abi_decode_returns_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(Into::into) - } - } - }; - #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `tokens(address)` and selector `0xe4860339`. - ```solidity - function tokens(address pool) external view returns (address[] memory _tokens); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct tokensCall { - #[allow(missing_docs)] - pub pool: alloy_sol_types::private::Address, - } - #[derive(Default, Debug, PartialEq, Eq, Hash)] - ///Container type for the return parameters of the - /// [`tokens(address)`](tokensCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct tokensReturn { - #[allow(missing_docs)] - pub _tokens: alloy_sol_types::private::Vec, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy_sol_types; - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = (alloy_sol_types::sol_data::Address,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy_sol_types::private::Address,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: tokensCall) -> Self { - (value.pool,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for tokensCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { pool: tuple.0 } - } - } - } - { - #[doc(hidden)] - #[allow(dead_code)] - type UnderlyingSolTuple<'a> = - (alloy_sol_types::sol_data::Array,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = - (alloy_sol_types::private::Vec,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: tokensReturn) -> Self { - (value._tokens,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for tokensReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _tokens: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for tokensCall { - type Parameters<'a> = (alloy_sol_types::sol_data::Address,); - type Return = alloy_sol_types::private::Vec; - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type ReturnTuple<'a> = - (alloy_sol_types::sol_data::Array,); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - - const SELECTOR: [u8; 4] = [228u8, 134u8, 3u8, 57u8]; - const SIGNATURE: &'static str = "tokens(address)"; - - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.pool, - ), - ) - } - - #[inline] - fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { - ( as alloy_sol_types::SolType>::tokenize(ret),) - } - - #[inline] - fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence(data).map( - |r| { - let r: tokensReturn = r.into(); - r._tokens - }, - ) - } - - #[inline] - fn abi_decode_returns_validate(data: &[u8]) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence_validate( - data, - ) - .map(|r| { - let r: tokensReturn = r.into(); - r._tokens - }) - } - } - }; - ///Container for all the [`CowAmmLegacyHelper`](self) function calls. - #[derive(Clone)] - pub enum CowAmmLegacyHelperCalls { - #[allow(missing_docs)] - factory(factoryCall), - #[allow(missing_docs)] - order(orderCall), - #[allow(missing_docs)] - tokens(tokensCall), - } - impl CowAmmLegacyHelperCalls { - /// All the selectors of this enum. - /// - /// Note that the selectors might not be in the same order as the - /// variants. No guarantees are made about the order of the - /// selectors. - /// - /// Prefer using `SolInterface` methods instead. - pub const SELECTORS: &'static [[u8; 4usize]] = &[ - [39u8, 36u8, 44u8, 155u8], - [196u8, 90u8, 1u8, 85u8], - [228u8, 134u8, 3u8, 57u8], - ]; - /// The signatures in the same order as `SELECTORS`. - pub const SIGNATURES: &'static [&'static str] = &[ - ::SIGNATURE, - ::SIGNATURE, - ::SIGNATURE, - ]; - /// The names of the variants in the same order as `SELECTORS`. - pub const VARIANT_NAMES: &'static [&'static str] = &[ - ::core::stringify!(order), - ::core::stringify!(factory), - ::core::stringify!(tokens), - ]; - - /// Returns the signature for the given selector, if known. - #[inline] - pub fn signature_by_selector( - selector: [u8; 4usize], - ) -> ::core::option::Option<&'static str> { - match Self::SELECTORS.binary_search(&selector) { - ::core::result::Result::Ok(idx) => { - ::core::option::Option::Some(Self::SIGNATURES[idx]) - } - ::core::result::Result::Err(_) => ::core::option::Option::None, - } - } - - /// Returns the enum variant name for the given selector, if known. - #[inline] - pub fn name_by_selector(selector: [u8; 4usize]) -> ::core::option::Option<&'static str> { - let sig = Self::signature_by_selector(selector)?; - sig.split_once('(').map(|(name, _)| name) - } - } - #[automatically_derived] - impl alloy_sol_types::SolInterface for CowAmmLegacyHelperCalls { - const COUNT: usize = 3usize; - const MIN_DATA_LENGTH: usize = 0usize; - const NAME: &'static str = "CowAmmLegacyHelperCalls"; - - #[inline] - fn selector(&self) -> [u8; 4] { - match self { - Self::factory(_) => ::SELECTOR, - Self::order(_) => ::SELECTOR, - Self::tokens(_) => ::SELECTOR, - } - } - - #[inline] - fn selector_at(i: usize) -> ::core::option::Option<[u8; 4]> { - Self::SELECTORS.get(i).copied() - } - - #[inline] - fn valid_selector(selector: [u8; 4]) -> bool { - Self::SELECTORS.binary_search(&selector).is_ok() - } - - #[inline] - #[allow(non_snake_case)] - fn abi_decode_raw(selector: [u8; 4], data: &[u8]) -> alloy_sol_types::Result { - static DECODE_SHIMS: &[fn( - &[u8], - ) - -> alloy_sol_types::Result] = &[ - { - fn order(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw(data) - .map(CowAmmLegacyHelperCalls::order) - } - order - }, - { - fn factory(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw(data) - .map(CowAmmLegacyHelperCalls::factory) - } - factory - }, - { - fn tokens(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw(data) - .map(CowAmmLegacyHelperCalls::tokens) - } - tokens - }, - ]; - let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { - return Err(alloy_sol_types::Error::unknown_selector( - ::NAME, - selector, - )); - }; - DECODE_SHIMS[idx](data) - } - - #[inline] - #[allow(non_snake_case)] - fn abi_decode_raw_validate( - selector: [u8; 4], - data: &[u8], - ) -> alloy_sol_types::Result { - static DECODE_VALIDATE_SHIMS: &[fn( - &[u8], - ) -> alloy_sol_types::Result< - CowAmmLegacyHelperCalls, - >] = &[ - { - fn order(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw_validate(data) - .map(CowAmmLegacyHelperCalls::order) - } - order - }, - { - fn factory(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw_validate(data) - .map(CowAmmLegacyHelperCalls::factory) - } - factory - }, - { - fn tokens(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw_validate(data) - .map(CowAmmLegacyHelperCalls::tokens) - } - tokens - }, - ]; - let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { - return Err(alloy_sol_types::Error::unknown_selector( - ::NAME, - selector, - )); - }; - DECODE_VALIDATE_SHIMS[idx](data) - } - - #[inline] - fn abi_encoded_size(&self) -> usize { - match self { - Self::factory(inner) => { - ::abi_encoded_size(inner) - } - Self::order(inner) => { - ::abi_encoded_size(inner) - } - Self::tokens(inner) => { - ::abi_encoded_size(inner) - } - } - } - - #[inline] - fn abi_encode_raw(&self, out: &mut alloy_sol_types::private::Vec) { - match self { - Self::factory(inner) => { - ::abi_encode_raw(inner, out) - } - Self::order(inner) => { - ::abi_encode_raw(inner, out) - } - Self::tokens(inner) => { - ::abi_encode_raw(inner, out) - } - } - } - } - ///Container for all the [`CowAmmLegacyHelper`](self) custom errors. - #[derive(Clone, Debug, PartialEq, Eq, Hash)] - pub enum CowAmmLegacyHelperErrors { - #[allow(missing_docs)] - InvalidArrayLength(InvalidArrayLength), - #[allow(missing_docs)] - MathOverflowedMulDiv(MathOverflowedMulDiv), - #[allow(missing_docs)] - NoOrder(NoOrder), - #[allow(missing_docs)] - PoolDoesNotExist(PoolDoesNotExist), - #[allow(missing_docs)] - PoolIsClosed(PoolIsClosed), - #[allow(missing_docs)] - PoolIsPaused(PoolIsPaused), - } - impl CowAmmLegacyHelperErrors { - /// All the selectors of this enum. - /// - /// Note that the selectors might not be in the same order as the - /// variants. No guarantees are made about the order of the - /// selectors. - /// - /// Prefer using `SolInterface` methods instead. - pub const SELECTORS: &'static [[u8; 4usize]] = &[ - [25u8, 170u8, 213u8, 115u8], - [33u8, 8u8, 26u8, 191u8], - [34u8, 123u8, 193u8, 83u8], - [156u8, 135u8, 135u8, 192u8], - [157u8, 137u8, 2u8, 10u8], - [239u8, 200u8, 105u8, 180u8], - ]; - /// The signatures in the same order as `SELECTORS`. - pub const SIGNATURES: &'static [&'static str] = &[ - ::SIGNATURE, - ::SIGNATURE, - ::SIGNATURE, - ::SIGNATURE, - ::SIGNATURE, - ::SIGNATURE, - ]; - /// The names of the variants in the same order as `SELECTORS`. - pub const VARIANT_NAMES: &'static [&'static str] = &[ - ::core::stringify!(NoOrder), - ::core::stringify!(PoolIsPaused), - ::core::stringify!(MathOverflowedMulDiv), - ::core::stringify!(PoolDoesNotExist), - ::core::stringify!(InvalidArrayLength), - ::core::stringify!(PoolIsClosed), - ]; - - /// Returns the signature for the given selector, if known. - #[inline] - pub fn signature_by_selector( - selector: [u8; 4usize], - ) -> ::core::option::Option<&'static str> { - match Self::SELECTORS.binary_search(&selector) { - ::core::result::Result::Ok(idx) => { - ::core::option::Option::Some(Self::SIGNATURES[idx]) - } - ::core::result::Result::Err(_) => ::core::option::Option::None, - } - } - - /// Returns the enum variant name for the given selector, if known. - #[inline] - pub fn name_by_selector(selector: [u8; 4usize]) -> ::core::option::Option<&'static str> { - let sig = Self::signature_by_selector(selector)?; - sig.split_once('(').map(|(name, _)| name) - } - } - #[automatically_derived] - impl alloy_sol_types::SolInterface for CowAmmLegacyHelperErrors { - const COUNT: usize = 6usize; - const MIN_DATA_LENGTH: usize = 0usize; - const NAME: &'static str = "CowAmmLegacyHelperErrors"; - - #[inline] - fn selector(&self) -> [u8; 4] { - match self { - Self::InvalidArrayLength(_) => { - ::SELECTOR - } - Self::MathOverflowedMulDiv(_) => { - ::SELECTOR - } - Self::NoOrder(_) => ::SELECTOR, - Self::PoolDoesNotExist(_) => { - ::SELECTOR - } - Self::PoolIsClosed(_) => ::SELECTOR, - Self::PoolIsPaused(_) => ::SELECTOR, - } - } - - #[inline] - fn selector_at(i: usize) -> ::core::option::Option<[u8; 4]> { - Self::SELECTORS.get(i).copied() - } - - #[inline] - fn valid_selector(selector: [u8; 4]) -> bool { - Self::SELECTORS.binary_search(&selector).is_ok() - } - - #[inline] - #[allow(non_snake_case)] - fn abi_decode_raw(selector: [u8; 4], data: &[u8]) -> alloy_sol_types::Result { - static DECODE_SHIMS: &[fn( - &[u8], - ) - -> alloy_sol_types::Result] = &[ - { - fn NoOrder(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw(data) - .map(CowAmmLegacyHelperErrors::NoOrder) - } - NoOrder - }, - { - fn PoolIsPaused( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw(data) - .map(CowAmmLegacyHelperErrors::PoolIsPaused) - } - PoolIsPaused - }, - { - fn MathOverflowedMulDiv( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw(data) - .map(CowAmmLegacyHelperErrors::MathOverflowedMulDiv) - } - MathOverflowedMulDiv - }, - { - fn PoolDoesNotExist( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw(data) - .map(CowAmmLegacyHelperErrors::PoolDoesNotExist) - } - PoolDoesNotExist - }, - { - fn InvalidArrayLength( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw(data) - .map(CowAmmLegacyHelperErrors::InvalidArrayLength) - } - InvalidArrayLength - }, - { - fn PoolIsClosed( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw(data) - .map(CowAmmLegacyHelperErrors::PoolIsClosed) - } - PoolIsClosed - }, - ]; - let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { - return Err(alloy_sol_types::Error::unknown_selector( - ::NAME, - selector, - )); - }; - DECODE_SHIMS[idx](data) - } - - #[inline] - #[allow(non_snake_case)] - fn abi_decode_raw_validate( - selector: [u8; 4], - data: &[u8], - ) -> alloy_sol_types::Result { - static DECODE_VALIDATE_SHIMS: &[fn( - &[u8], - ) -> alloy_sol_types::Result< - CowAmmLegacyHelperErrors, - >] = &[ - { - fn NoOrder(data: &[u8]) -> alloy_sol_types::Result { - ::abi_decode_raw_validate(data) - .map(CowAmmLegacyHelperErrors::NoOrder) - } - NoOrder - }, - { - fn PoolIsPaused( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate(data) - .map(CowAmmLegacyHelperErrors::PoolIsPaused) - } - PoolIsPaused - }, - { - fn MathOverflowedMulDiv( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(CowAmmLegacyHelperErrors::MathOverflowedMulDiv) - } - MathOverflowedMulDiv - }, - { - fn PoolDoesNotExist( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(CowAmmLegacyHelperErrors::PoolDoesNotExist) - } - PoolDoesNotExist - }, - { - fn InvalidArrayLength( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(CowAmmLegacyHelperErrors::InvalidArrayLength) - } - InvalidArrayLength - }, - { - fn PoolIsClosed( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate(data) - .map(CowAmmLegacyHelperErrors::PoolIsClosed) - } - PoolIsClosed - }, - ]; - let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { - return Err(alloy_sol_types::Error::unknown_selector( - ::NAME, - selector, - )); - }; - DECODE_VALIDATE_SHIMS[idx](data) - } - - #[inline] - fn abi_encoded_size(&self) -> usize { - match self { - Self::InvalidArrayLength(inner) => { - ::abi_encoded_size(inner) - } - Self::MathOverflowedMulDiv(inner) => { - ::abi_encoded_size(inner) - } - Self::NoOrder(inner) => { - ::abi_encoded_size(inner) - } - Self::PoolDoesNotExist(inner) => { - ::abi_encoded_size(inner) - } - Self::PoolIsClosed(inner) => { - ::abi_encoded_size(inner) - } - Self::PoolIsPaused(inner) => { - ::abi_encoded_size(inner) - } - } - } - - #[inline] - fn abi_encode_raw(&self, out: &mut alloy_sol_types::private::Vec) { - match self { - Self::InvalidArrayLength(inner) => { - ::abi_encode_raw(inner, out) - } - Self::MathOverflowedMulDiv(inner) => { - ::abi_encode_raw(inner, out) - } - Self::NoOrder(inner) => { - ::abi_encode_raw(inner, out) - } - Self::PoolDoesNotExist(inner) => { - ::abi_encode_raw(inner, out) - } - Self::PoolIsClosed(inner) => { - ::abi_encode_raw(inner, out) - } - Self::PoolIsPaused(inner) => { - ::abi_encode_raw(inner, out) - } - } - } - } - ///Container for all the [`CowAmmLegacyHelper`](self) events. - #[derive(Clone, Debug, PartialEq, Eq, Hash)] - pub enum CowAmmLegacyHelperEvents { - #[allow(missing_docs)] - COWAMMPoolCreated(COWAMMPoolCreated), - } - impl CowAmmLegacyHelperEvents { - /// All the selectors of this enum. - /// - /// Note that the selectors might not be in the same order as the - /// variants. No guarantees are made about the order of the - /// selectors. - /// - /// Prefer using `SolInterface` methods instead. - pub const SELECTORS: &'static [[u8; 32usize]] = &[[ - 13u8, 3u8, 131u8, 77u8, 13u8, 134u8, 199u8, 245u8, 126u8, 135u8, 122u8, 244u8, 14u8, - 38u8, 241u8, 118u8, 220u8, 49u8, 189u8, 99u8, 117u8, 53u8, 212u8, 186u8, 21u8, 61u8, - 26u8, 201u8, 222u8, 136u8, 167u8, 234u8, - ]]; - /// The signatures in the same order as `SELECTORS`. - pub const SIGNATURES: &'static [&'static str] = - &[::SIGNATURE]; - /// The names of the variants in the same order as `SELECTORS`. - pub const VARIANT_NAMES: &'static [&'static str] = &[::core::stringify!(COWAMMPoolCreated)]; - - /// Returns the signature for the given selector, if known. - #[inline] - pub fn signature_by_selector( - selector: [u8; 32usize], - ) -> ::core::option::Option<&'static str> { - match Self::SELECTORS.binary_search(&selector) { - ::core::result::Result::Ok(idx) => { - ::core::option::Option::Some(Self::SIGNATURES[idx]) - } - ::core::result::Result::Err(_) => ::core::option::Option::None, - } - } - - /// Returns the enum variant name for the given selector, if known. - #[inline] - pub fn name_by_selector(selector: [u8; 32usize]) -> ::core::option::Option<&'static str> { - let sig = Self::signature_by_selector(selector)?; - sig.split_once('(').map(|(name, _)| name) - } - } - #[automatically_derived] - impl alloy_sol_types::SolEventInterface for CowAmmLegacyHelperEvents { - const COUNT: usize = 1usize; - const NAME: &'static str = "CowAmmLegacyHelperEvents"; - - fn decode_raw_log( - topics: &[alloy_sol_types::Word], - data: &[u8], - ) -> alloy_sol_types::Result { - match topics.first().copied() { - Some(::SIGNATURE_HASH) => { - ::decode_raw_log(topics, data) - .map(Self::COWAMMPoolCreated) - } - _ => alloy_sol_types::private::Err(alloy_sol_types::Error::InvalidLog { - name: ::NAME, - log: alloy_sol_types::private::Box::new( - alloy_sol_types::private::LogData::new_unchecked( - topics.to_vec(), - data.to_vec().into(), - ), - ), - }), - } - } - } - #[automatically_derived] - impl alloy_sol_types::private::IntoLogData for CowAmmLegacyHelperEvents { - fn to_log_data(&self) -> alloy_sol_types::private::LogData { - match self { - Self::COWAMMPoolCreated(inner) => { - alloy_sol_types::private::IntoLogData::to_log_data(inner) - } - } - } - - fn into_log_data(self) -> alloy_sol_types::private::LogData { - match self { - Self::COWAMMPoolCreated(inner) => { - alloy_sol_types::private::IntoLogData::into_log_data(inner) - } - } - } - } - use alloy_contract; - /**Creates a new wrapper around an on-chain [`CowAmmLegacyHelper`](self) contract instance. - - See the [wrapper's documentation](`CowAmmLegacyHelperInstance`) for more details.*/ - #[inline] - pub const fn new< - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - >( - address: alloy_sol_types::private::Address, - __provider: P, - ) -> CowAmmLegacyHelperInstance { - CowAmmLegacyHelperInstance::::new(address, __provider) - } - /**Deploys this contract using the given `provider` and constructor arguments, if any. - - Returns a new instance of the contract, if the deployment was successful. - - For more fine-grained control over the deployment process, use [`deploy_builder`] instead.*/ - #[inline] - pub fn deploy, N: alloy_contract::private::Network>( - __provider: P, - ) -> impl ::core::future::Future>> - { - CowAmmLegacyHelperInstance::::deploy(__provider) - } - /**Creates a `RawCallBuilder` for deploying this contract using the given `provider` - and constructor arguments, if any. - - This is a simple wrapper around creating a `RawCallBuilder` with the data set to - the bytecode concatenated with the constructor's ABI-encoded arguments.*/ - #[inline] - pub fn deploy_builder< - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - >( - __provider: P, - ) -> alloy_contract::RawCallBuilder { - CowAmmLegacyHelperInstance::::deploy_builder(__provider) - } - /**A [`CowAmmLegacyHelper`](self) instance. - - Contains type-safe methods for interacting with an on-chain instance of the - [`CowAmmLegacyHelper`](self) contract located at a given `address`, using a given - provider `P`. - - If the contract bytecode is available (see the [`sol!`](alloy_sol_types::sol!) - documentation on how to provide it), the `deploy` and `deploy_builder` methods can - be used to deploy a new instance of the contract. - - See the [module-level documentation](self) for all the available methods.*/ - #[derive(Clone)] - pub struct CowAmmLegacyHelperInstance { - address: alloy_sol_types::private::Address, - provider: P, - _network: ::core::marker::PhantomData, - } - #[automatically_derived] - impl ::core::fmt::Debug for CowAmmLegacyHelperInstance { - #[inline] - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple("CowAmmLegacyHelperInstance") - .field(&self.address) - .finish() - } - } - /// Instantiation and getters/setters. - impl, N: alloy_contract::private::Network> - CowAmmLegacyHelperInstance - { - /**Creates a new wrapper around an on-chain [`CowAmmLegacyHelper`](self) contract instance. - - See the [wrapper's documentation](`CowAmmLegacyHelperInstance`) for more details.*/ - #[inline] - pub const fn new(address: alloy_sol_types::private::Address, __provider: P) -> Self { - Self { - address, - provider: __provider, - _network: ::core::marker::PhantomData, - } - } - - /**Deploys this contract using the given `provider` and constructor arguments, if any. - - Returns a new instance of the contract, if the deployment was successful. - - For more fine-grained control over the deployment process, use [`deploy_builder`] instead.*/ - #[inline] - pub async fn deploy( - __provider: P, - ) -> alloy_contract::Result> { - let call_builder = Self::deploy_builder(__provider); - let contract_address = call_builder.deploy().await?; - Ok(Self::new(contract_address, call_builder.provider)) - } - - /**Creates a `RawCallBuilder` for deploying this contract using the given `provider` - and constructor arguments, if any. - - This is a simple wrapper around creating a `RawCallBuilder` with the data set to - the bytecode concatenated with the constructor's ABI-encoded arguments.*/ - #[inline] - pub fn deploy_builder(__provider: P) -> alloy_contract::RawCallBuilder { - alloy_contract::RawCallBuilder::new_raw_deploy( - __provider, - ::core::clone::Clone::clone(&BYTECODE), - ) - } - - /// Returns a reference to the address. - #[inline] - pub const fn address(&self) -> &alloy_sol_types::private::Address { - &self.address - } - - /// Sets the address. - #[inline] - pub fn set_address(&mut self, address: alloy_sol_types::private::Address) { - self.address = address; - } - - /// Sets the address and returns `self`. - pub fn at(mut self, address: alloy_sol_types::private::Address) -> Self { - self.set_address(address); - self - } - - /// Returns a reference to the provider. - #[inline] - pub const fn provider(&self) -> &P { - &self.provider - } - } - impl CowAmmLegacyHelperInstance<&P, N> { - /// Clones the provider and returns a new instance with the cloned - /// provider. - #[inline] - pub fn with_cloned_provider(self) -> CowAmmLegacyHelperInstance { - CowAmmLegacyHelperInstance { - address: self.address, - provider: ::core::clone::Clone::clone(&self.provider), - _network: ::core::marker::PhantomData, - } - } - } - /// Function calls. - impl, N: alloy_contract::private::Network> - CowAmmLegacyHelperInstance - { - /// Creates a new call builder using this contract instance's provider - /// and address. - /// - /// Note that the call can be any function call, not just those defined - /// in this contract. Prefer using the other methods for - /// building type-safe contract calls. - pub fn call_builder( - &self, - call: &C, - ) -> alloy_contract::SolCallBuilder<&P, C, N> { - alloy_contract::SolCallBuilder::new_sol(&self.provider, &self.address, call) - } - - ///Creates a new call builder for the [`factory`] function. - pub fn factory(&self) -> alloy_contract::SolCallBuilder<&P, factoryCall, N> { - self.call_builder(&factoryCall) - } - - ///Creates a new call builder for the [`order`] function. - pub fn order( - &self, - pool: alloy_sol_types::private::Address, - prices: alloy_sol_types::private::Vec< - alloy_sol_types::private::primitives::aliases::U256, - >, - ) -> alloy_contract::SolCallBuilder<&P, orderCall, N> { - self.call_builder(&orderCall { pool, prices }) - } - - ///Creates a new call builder for the [`tokens`] function. - pub fn tokens( - &self, - pool: alloy_sol_types::private::Address, - ) -> alloy_contract::SolCallBuilder<&P, tokensCall, N> { - self.call_builder(&tokensCall { pool }) - } - } - /// Event filters. - impl, N: alloy_contract::private::Network> - CowAmmLegacyHelperInstance - { - /// Creates a new event filter using this contract instance's provider - /// and address. - /// - /// Note that the type can be any event, not just those defined in this - /// contract. Prefer using the other methods for building - /// type-safe event filters. - pub fn event_filter( - &self, - ) -> alloy_contract::Event<&P, E, N> { - alloy_contract::Event::new_sol(&self.provider, &self.address) - } - - ///Creates a new event filter for the [`COWAMMPoolCreated`] event. - pub fn COWAMMPoolCreated_filter(&self) -> alloy_contract::Event<&P, COWAMMPoolCreated, N> { - self.event_filter::() - } - } -} -pub type Instance = CowAmmLegacyHelper::CowAmmLegacyHelperInstance<::alloy_provider::DynProvider>; -use { - alloy_primitives::{Address, address}, - alloy_provider::{DynProvider, Provider}, - anyhow::{Context, Result}, - std::{collections::HashMap, sync::LazyLock}, -}; -pub const fn deployment_info(chain_id: u64) -> Option<(Address, Option)> { - match chain_id { - 1u64 => Some(( - ::alloy_primitives::address!("0x3705ceee5eaa561e3157cf92641ce28c45a3999c"), - Some(20332745u64), - )), - 100u64 => Some(( - ::alloy_primitives::address!("0xd9ec06b001957498ab1bc716145515d1d0e30ffb"), - Some(35026999u64), - )), - _ => None, - } -} -pub const fn deployment_address(chain_id: &u64) -> Option<::alloy_primitives::Address> { - match deployment_info(*chain_id) { - Some((address, _)) => Some(address), - None => None, - } -} -pub const fn deployment_block(chain_id: &u64) -> Option { - match deployment_info(*chain_id) { - Some((_, block)) => block, - None => None, - } -} -impl Instance { - pub fn deployed(provider: &DynProvider) -> impl Future> + Send { - async move { - let chain_id = provider - .get_chain_id() - .await - .context("could not fetch current chain id")?; - let (address, _deployed_block) = deployment_info(chain_id) - .with_context(|| format!("no deployment info for chain {chain_id:?}"))?; - Ok(Instance::new(address, provider.clone())) - } - } -} diff --git a/contracts/generated/contracts-generated/cowammuniswapv2priceoracle/Cargo.toml b/contracts/generated/contracts-generated/cowammuniswapv2priceoracle/Cargo.toml deleted file mode 100644 index aba73a2198..0000000000 --- a/contracts/generated/contracts-generated/cowammuniswapv2priceoracle/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -# Auto-generated by contracts-generate. Do not edit. -[package] -name = "cow-contract-cowammuniswapv2priceoracle" -version = "0.1.0" -edition = "2024" -publish = false - -[lib] -doctest = false - -[dependencies] -alloy-contract = { workspace = true } -alloy-primitives = { workspace = true } -alloy-provider = { workspace = true } -alloy-sol-types = { workspace = true } -anyhow = { workspace = true } - -[lints] -workspace = true diff --git a/contracts/generated/contracts-generated/cowammuniswapv2priceoracle/src/lib.rs b/contracts/generated/contracts-generated/cowammuniswapv2priceoracle/src/lib.rs deleted file mode 100644 index b7847d6413..0000000000 --- a/contracts/generated/contracts-generated/cowammuniswapv2priceoracle/src/lib.rs +++ /dev/null @@ -1,230 +0,0 @@ -#![allow( - unused_imports, - unused_attributes, - clippy::all, - rustdoc::all, - non_snake_case -)] -//! Auto-generated contract bindings. Do not edit. -/** - -Generated by the following Solidity interface... -```solidity -interface CowAmmUniswapV2PriceOracle {} -``` - -...which was generated by the following JSON ABI: -```json -[] -```*/ -#[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style, - clippy::empty_structs_with_brackets -)] -pub mod CowAmmUniswapV2PriceOracle { - use {super::*, alloy_sol_types}; - /// The creation / init bytecode of the contract. - /// - /// ```text - ///0x6080604052348015600e575f80fd5b506105468061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063355efdd91461002d575b5f80fd5b61004061003b366004610386565b610059565b6040805192835260208301919091520160405180910390f35b5f808061006884860186610411565b9050805f015173ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156100b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100da91906104a2565b826dffffffffffffffffffffffffffff169250816dffffffffffffffffffffffffffff1691505080935081945050505f815f015173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610156573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061017a91906104ee565b90505f825f015173ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ed91906104ee565b90508073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff160361022757929392905b8173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16146102c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f7261636c653a20696e76616c696420746f6b656e300000000000000000000060448201526064015b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614610356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f7261636c653a20696e76616c696420746f6b656e310000000000000000000060448201526064016102b8565b50505094509492505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610383575f80fd5b50565b5f805f8060608587031215610399575f80fd5b84356103a481610362565b935060208501356103b481610362565b9250604085013567ffffffffffffffff808211156103d0575f80fd5b818701915087601f8301126103e3575f80fd5b8135818111156103f1575f80fd5b886020828501011115610402575f80fd5b95989497505060200194505050565b5f60208284031215610421575f80fd5b6040516020810181811067ffffffffffffffff82111715610469577f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604052823561047781610362565b81529392505050565b80516dffffffffffffffffffffffffffff8116811461049d575f80fd5b919050565b5f805f606084860312156104b4575f80fd5b6104bd84610480565b92506104cb60208501610480565b9150604084015163ffffffff811681146104e3575f80fd5b809150509250925092565b5f602082840312156104fe575f80fd5b815161050981610362565b939250505056fea26469706673582212201fe6ad4d6b89d204db5394bdedef23d10ed8c7e4f83be4c5fe14dcc09470223464736f6c63430008190033 - /// ``` - #[rustfmt::skip] - #[allow(clippy::all)] - pub static BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"`\x80`@R4\x80\x15`\x0EW_\x80\xFD[Pa\x05F\x80a\0\x1C_9_\xF3\xFE`\x80`@R4\x80\x15a\0\x0FW_\x80\xFD[P`\x046\x10a\0)W_5`\xE0\x1C\x80c5^\xFD\xD9\x14a\0-W[_\x80\xFD[a\0@a\0;6`\x04a\x03\x86V[a\0YV[`@\x80Q\x92\x83R` \x83\x01\x91\x90\x91R\x01`@Q\x80\x91\x03\x90\xF3[_\x80\x80a\0h\x84\x86\x01\x86a\x04\x11V[\x90P\x80_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\t\x02\xF1\xAC`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01```@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\0\xB6W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\0\xDA\x91\x90a\x04\xA2V[\x82m\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x92P\x81m\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x91PP\x80\x93P\x81\x94PPP_\x81_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\r\xFE\x16\x81`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x01VW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x01z\x91\x90a\x04\xEEV[\x90P_\x82_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xD2\x12 \xA7`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x01\xC9W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x01\xED\x91\x90a\x04\xEEV[\x90P\x80s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x89s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x03a\x02'W\x92\x93\x92\x90[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x89s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x02\xC1W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x16`$\x82\x01R\x7Foracle: invalid token0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[\x80s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x88s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x03VW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x16`$\x82\x01R\x7Foracle: invalid token1\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x02\xB8V[PPP\x94P\x94\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x03\x83W_\x80\xFD[PV[_\x80_\x80``\x85\x87\x03\x12\x15a\x03\x99W_\x80\xFD[\x845a\x03\xA4\x81a\x03bV[\x93P` \x85\x015a\x03\xB4\x81a\x03bV[\x92P`@\x85\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x03\xD0W_\x80\xFD[\x81\x87\x01\x91P\x87`\x1F\x83\x01\x12a\x03\xE3W_\x80\xFD[\x815\x81\x81\x11\x15a\x03\xF1W_\x80\xFD[\x88` \x82\x85\x01\x01\x11\x15a\x04\x02W_\x80\xFD[\x95\x98\x94\x97PP` \x01\x94PPPV[_` \x82\x84\x03\x12\x15a\x04!W_\x80\xFD[`@Q` \x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a\x04iW\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[`@R\x825a\x04w\x81a\x03bV[\x81R\x93\x92PPPV[\x80Qm\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x04\x9DW_\x80\xFD[\x91\x90PV[_\x80_``\x84\x86\x03\x12\x15a\x04\xB4W_\x80\xFD[a\x04\xBD\x84a\x04\x80V[\x92Pa\x04\xCB` \x85\x01a\x04\x80V[\x91P`@\x84\x01Qc\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x04\xE3W_\x80\xFD[\x80\x91PP\x92P\x92P\x92V[_` \x82\x84\x03\x12\x15a\x04\xFEW_\x80\xFD[\x81Qa\x05\t\x81a\x03bV[\x93\x92PPPV\xFE\xA2dipfsX\"\x12 \x1F\xE6\xADMk\x89\xD2\x04\xDBS\x94\xBD\xED\xEF#\xD1\x0E\xD8\xC7\xE4\xF8;\xE4\xC5\xFE\x14\xDC\xC0\x94p\"4dsolcC\0\x08\x19\x003", - ); - /// The runtime bytecode of the contract, as deployed on the network. - /// - /// ```text - ///0x608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063355efdd91461002d575b5f80fd5b61004061003b366004610386565b610059565b6040805192835260208301919091520160405180910390f35b5f808061006884860186610411565b9050805f015173ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156100b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100da91906104a2565b826dffffffffffffffffffffffffffff169250816dffffffffffffffffffffffffffff1691505080935081945050505f815f015173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610156573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061017a91906104ee565b90505f825f015173ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ed91906104ee565b90508073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff160361022757929392905b8173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16146102c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f7261636c653a20696e76616c696420746f6b656e300000000000000000000060448201526064015b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614610356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f7261636c653a20696e76616c696420746f6b656e310000000000000000000060448201526064016102b8565b50505094509492505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610383575f80fd5b50565b5f805f8060608587031215610399575f80fd5b84356103a481610362565b935060208501356103b481610362565b9250604085013567ffffffffffffffff808211156103d0575f80fd5b818701915087601f8301126103e3575f80fd5b8135818111156103f1575f80fd5b886020828501011115610402575f80fd5b95989497505060200194505050565b5f60208284031215610421575f80fd5b6040516020810181811067ffffffffffffffff82111715610469577f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604052823561047781610362565b81529392505050565b80516dffffffffffffffffffffffffffff8116811461049d575f80fd5b919050565b5f805f606084860312156104b4575f80fd5b6104bd84610480565b92506104cb60208501610480565b9150604084015163ffffffff811681146104e3575f80fd5b809150509250925092565b5f602082840312156104fe575f80fd5b815161050981610362565b939250505056fea26469706673582212201fe6ad4d6b89d204db5394bdedef23d10ed8c7e4f83be4c5fe14dcc09470223464736f6c63430008190033 - /// ``` - #[rustfmt::skip] - #[allow(clippy::all)] - pub static DEPLOYED_BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"`\x80`@R4\x80\x15a\0\x0FW_\x80\xFD[P`\x046\x10a\0)W_5`\xE0\x1C\x80c5^\xFD\xD9\x14a\0-W[_\x80\xFD[a\0@a\0;6`\x04a\x03\x86V[a\0YV[`@\x80Q\x92\x83R` \x83\x01\x91\x90\x91R\x01`@Q\x80\x91\x03\x90\xF3[_\x80\x80a\0h\x84\x86\x01\x86a\x04\x11V[\x90P\x80_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\t\x02\xF1\xAC`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01```@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\0\xB6W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\0\xDA\x91\x90a\x04\xA2V[\x82m\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x92P\x81m\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x91PP\x80\x93P\x81\x94PPP_\x81_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\r\xFE\x16\x81`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x01VW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x01z\x91\x90a\x04\xEEV[\x90P_\x82_\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\xD2\x12 \xA7`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x01\xC9W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x01\xED\x91\x90a\x04\xEEV[\x90P\x80s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x89s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x03a\x02'W\x92\x93\x92\x90[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x89s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x02\xC1W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x16`$\x82\x01R\x7Foracle: invalid token0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[\x80s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x88s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x03VW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x16`$\x82\x01R\x7Foracle: invalid token1\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x02\xB8V[PPP\x94P\x94\x92PPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x03\x83W_\x80\xFD[PV[_\x80_\x80``\x85\x87\x03\x12\x15a\x03\x99W_\x80\xFD[\x845a\x03\xA4\x81a\x03bV[\x93P` \x85\x015a\x03\xB4\x81a\x03bV[\x92P`@\x85\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x03\xD0W_\x80\xFD[\x81\x87\x01\x91P\x87`\x1F\x83\x01\x12a\x03\xE3W_\x80\xFD[\x815\x81\x81\x11\x15a\x03\xF1W_\x80\xFD[\x88` \x82\x85\x01\x01\x11\x15a\x04\x02W_\x80\xFD[\x95\x98\x94\x97PP` \x01\x94PPPV[_` \x82\x84\x03\x12\x15a\x04!W_\x80\xFD[`@Q` \x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a\x04iW\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[`@R\x825a\x04w\x81a\x03bV[\x81R\x93\x92PPPV[\x80Qm\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x04\x9DW_\x80\xFD[\x91\x90PV[_\x80_``\x84\x86\x03\x12\x15a\x04\xB4W_\x80\xFD[a\x04\xBD\x84a\x04\x80V[\x92Pa\x04\xCB` \x85\x01a\x04\x80V[\x91P`@\x84\x01Qc\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x04\xE3W_\x80\xFD[\x80\x91PP\x92P\x92P\x92V[_` \x82\x84\x03\x12\x15a\x04\xFEW_\x80\xFD[\x81Qa\x05\t\x81a\x03bV[\x93\x92PPPV\xFE\xA2dipfsX\"\x12 \x1F\xE6\xADMk\x89\xD2\x04\xDBS\x94\xBD\xED\xEF#\xD1\x0E\xD8\xC7\xE4\xF8;\xE4\xC5\xFE\x14\xDC\xC0\x94p\"4dsolcC\0\x08\x19\x003", - ); - use alloy_contract; - /**Creates a new wrapper around an on-chain [`CowAmmUniswapV2PriceOracle`](self) contract instance. - - See the [wrapper's documentation](`CowAmmUniswapV2PriceOracleInstance`) for more details.*/ - #[inline] - pub const fn new< - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - >( - address: alloy_sol_types::private::Address, - __provider: P, - ) -> CowAmmUniswapV2PriceOracleInstance { - CowAmmUniswapV2PriceOracleInstance::::new(address, __provider) - } - /**Deploys this contract using the given `provider` and constructor arguments, if any. - - Returns a new instance of the contract, if the deployment was successful. - - For more fine-grained control over the deployment process, use [`deploy_builder`] instead.*/ - #[inline] - pub fn deploy, N: alloy_contract::private::Network>( - __provider: P, - ) -> impl ::core::future::Future< - Output = alloy_contract::Result>, - > { - CowAmmUniswapV2PriceOracleInstance::::deploy(__provider) - } - /**Creates a `RawCallBuilder` for deploying this contract using the given `provider` - and constructor arguments, if any. - - This is a simple wrapper around creating a `RawCallBuilder` with the data set to - the bytecode concatenated with the constructor's ABI-encoded arguments.*/ - #[inline] - pub fn deploy_builder< - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - >( - __provider: P, - ) -> alloy_contract::RawCallBuilder { - CowAmmUniswapV2PriceOracleInstance::::deploy_builder(__provider) - } - /**A [`CowAmmUniswapV2PriceOracle`](self) instance. - - Contains type-safe methods for interacting with an on-chain instance of the - [`CowAmmUniswapV2PriceOracle`](self) contract located at a given `address`, using a given - provider `P`. - - If the contract bytecode is available (see the [`sol!`](alloy_sol_types::sol!) - documentation on how to provide it), the `deploy` and `deploy_builder` methods can - be used to deploy a new instance of the contract. - - See the [module-level documentation](self) for all the available methods.*/ - #[derive(Clone)] - pub struct CowAmmUniswapV2PriceOracleInstance { - address: alloy_sol_types::private::Address, - provider: P, - _network: ::core::marker::PhantomData, - } - #[automatically_derived] - impl ::core::fmt::Debug for CowAmmUniswapV2PriceOracleInstance { - #[inline] - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple("CowAmmUniswapV2PriceOracleInstance") - .field(&self.address) - .finish() - } - } - /// Instantiation and getters/setters. - impl, N: alloy_contract::private::Network> - CowAmmUniswapV2PriceOracleInstance - { - /**Creates a new wrapper around an on-chain [`CowAmmUniswapV2PriceOracle`](self) contract instance. - - See the [wrapper's documentation](`CowAmmUniswapV2PriceOracleInstance`) for more details.*/ - #[inline] - pub const fn new(address: alloy_sol_types::private::Address, __provider: P) -> Self { - Self { - address, - provider: __provider, - _network: ::core::marker::PhantomData, - } - } - - /**Deploys this contract using the given `provider` and constructor arguments, if any. - - Returns a new instance of the contract, if the deployment was successful. - - For more fine-grained control over the deployment process, use [`deploy_builder`] instead.*/ - #[inline] - pub async fn deploy( - __provider: P, - ) -> alloy_contract::Result> { - let call_builder = Self::deploy_builder(__provider); - let contract_address = call_builder.deploy().await?; - Ok(Self::new(contract_address, call_builder.provider)) - } - - /**Creates a `RawCallBuilder` for deploying this contract using the given `provider` - and constructor arguments, if any. - - This is a simple wrapper around creating a `RawCallBuilder` with the data set to - the bytecode concatenated with the constructor's ABI-encoded arguments.*/ - #[inline] - pub fn deploy_builder(__provider: P) -> alloy_contract::RawCallBuilder { - alloy_contract::RawCallBuilder::new_raw_deploy( - __provider, - ::core::clone::Clone::clone(&BYTECODE), - ) - } - - /// Returns a reference to the address. - #[inline] - pub const fn address(&self) -> &alloy_sol_types::private::Address { - &self.address - } - - /// Sets the address. - #[inline] - pub fn set_address(&mut self, address: alloy_sol_types::private::Address) { - self.address = address; - } - - /// Sets the address and returns `self`. - pub fn at(mut self, address: alloy_sol_types::private::Address) -> Self { - self.set_address(address); - self - } - - /// Returns a reference to the provider. - #[inline] - pub const fn provider(&self) -> &P { - &self.provider - } - } - impl CowAmmUniswapV2PriceOracleInstance<&P, N> { - /// Clones the provider and returns a new instance with the cloned - /// provider. - #[inline] - pub fn with_cloned_provider(self) -> CowAmmUniswapV2PriceOracleInstance { - CowAmmUniswapV2PriceOracleInstance { - address: self.address, - provider: ::core::clone::Clone::clone(&self.provider), - _network: ::core::marker::PhantomData, - } - } - } - /// Function calls. - impl, N: alloy_contract::private::Network> - CowAmmUniswapV2PriceOracleInstance - { - /// Creates a new call builder using this contract instance's provider - /// and address. - /// - /// Note that the call can be any function call, not just those defined - /// in this contract. Prefer using the other methods for - /// building type-safe contract calls. - pub fn call_builder( - &self, - call: &C, - ) -> alloy_contract::SolCallBuilder<&P, C, N> { - alloy_contract::SolCallBuilder::new_sol(&self.provider, &self.address, call) - } - } - /// Event filters. - impl, N: alloy_contract::private::Network> - CowAmmUniswapV2PriceOracleInstance - { - /// Creates a new event filter using this contract instance's provider - /// and address. - /// - /// Note that the type can be any event, not just those defined in this - /// contract. Prefer using the other methods for building - /// type-safe event filters. - pub fn event_filter( - &self, - ) -> alloy_contract::Event<&P, E, N> { - alloy_contract::Event::new_sol(&self.provider, &self.address) - } - } -} -pub type Instance = - CowAmmUniswapV2PriceOracle::CowAmmUniswapV2PriceOracleInstance<::alloy_provider::DynProvider>; diff --git a/contracts/src/main.rs b/contracts/src/main.rs index 2c46fc1944..cde57d2f9f 100644 --- a/contracts/src/main.rs +++ b/contracts/src/main.rs @@ -493,23 +493,6 @@ fn build_module() -> Module { PLASMA => "0x6100E367285b01F48D07953803A2d8dCA5D19873", INK => "0x4200000000000000000000000000000000000006", ])) - .add_submodule( - Submodule::new("cow_amm") - .add_contract(Contract::new("CowAmm")) - .add_contract(Contract::new("CowAmmConstantProductFactory").with_networks( - networks![ - MAINNET => ("0x40664207e3375FB4b733d4743CE9b159331fd034", 19861952), - GNOSIS => ("0xdb1cba3a87f2db53b6e1e6af48e28ed877592ec0", 33874317), - SEPOLIA => ("0xb808e8183e3a72d196457d127c7fd4befa0d7fd3", 5874562), - ], - )) - .add_contract(Contract::new("CowAmmLegacyHelper").with_networks(networks![ - MAINNET => ("0x3705ceee5eaa561e3157cf92641ce28c45a3999c", 20332745), - GNOSIS => ("0xd9ec06b001957498ab1bc716145515d1d0e30ffb", 35026999), - ])) - .add_contract(Contract::new("CowAmmUniswapV2PriceOracle")) - .add_contract(Contract::new("CowAmmFactoryGetter")), - ) .add_submodule( Submodule::new("test") .add_contract(Contract::new("GasHog")) diff --git a/crates/autopilot/Cargo.toml b/crates/autopilot/Cargo.toml index c82d89eae7..02b67a39ae 100644 --- a/crates/autopilot/Cargo.toml +++ b/crates/autopilot/Cargo.toml @@ -32,7 +32,6 @@ clap = { workspace = true } configs = { workspace = true } const-hex = { workspace = true } contracts = { workspace = true } -cow-amm = { workspace = true } dashmap = { workspace = true } database = { workspace = true } derive_more = { workspace = true } diff --git a/crates/autopilot/src/maintenance.rs b/crates/autopilot/src/maintenance.rs index 4ba4148b04..b8ddd787f8 100644 --- a/crates/autopilot/src/maintenance.rs +++ b/crates/autopilot/src/maintenance.rs @@ -24,7 +24,6 @@ use { }, std::{ future::Future, - sync::Arc, time::{Duration, Instant}, }, tokio::sync::watch, @@ -94,8 +93,6 @@ pub struct Maintenance { /// Used for periodic cleanup tasks to not have the DB overflow with old /// data. db_cleanup: Postgres, - /// All indexing tasks to keep cow amms up to date. - cow_amm_indexer: Vec>, /// Tasks to index ethflow orders that were submitted onchain. ethflow_order_indexer: Vec, /// Tasks to index ethflow refunds. @@ -113,7 +110,6 @@ impl Maintenance { Self { settlement_indexer, db_cleanup, - cow_amm_indexer: Default::default(), ethflow_order_indexer: Default::default(), ethflow_refund_indexer: Default::default(), settlement_observer, @@ -208,14 +204,6 @@ impl Maintenance { "settlement_indexer", self.settlement_indexer.run_maintenance() ), - Self::timed_future( - "cow_amm_indexer", - futures::future::try_join_all( - self.cow_amm_indexer - .iter() - .map(|indexer| indexer.run_maintenance()), - ), - ), Self::timed_future( "ethflow_order_indexer", futures::future::try_join_all( @@ -266,13 +254,6 @@ impl Maintenance { self.ethflow_refund_indexer.push(refund_indexer); } - /// Registers all maintenance tasks that are necessary to correctly support - /// CoW AMMs. - pub fn add_cow_amm_indexer(&mut self, registry: &cow_amm::Registry) { - self.cow_amm_indexer - .extend(registry.maintenance_tasks().clone()); - } - /// Runs the future and collects runtime metrics. async fn timed_future(label: &str, fut: impl Future) -> T { let _timer = metrics() diff --git a/crates/autopilot/src/run.rs b/crates/autopilot/src/run.rs index 028163df57..3dee5a4dbb 100644 --- a/crates/autopilot/src/run.rs +++ b/crates/autopilot/src/run.rs @@ -426,27 +426,6 @@ pub async fn run(config: Configuration, shutdown_controller: ShutdownController) skip_event_sync_start, ); - let archive_node_web3 = config - .cow_amm - .archive_node_url - .as_ref() - .map_or(web3.clone(), |url| boundary::web3_client(url, ðrpc_args)); - - let mut cow_amm_registry = cow_amm::Registry::new(Arc::new(BlockRetriever { - provider: archive_node_web3.provider, - block_stream: eth.current_block().clone(), - })); - for cow_amm_config in &config.cow_amm.contracts { - cow_amm_registry - .add_listener( - cow_amm_config.index_start, - cow_amm_config.factory, - cow_amm_config.helper, - db_write.pool.clone(), - ) - .await; - } - let quoter = Arc::new(OrderQuoter::new( price_estimator, api_native_price_estimator.clone(), @@ -502,7 +481,7 @@ pub async fn run(config: Configuration, shutdown_controller: ShutdownController) config.shared.enable_sell_equals_buy_volume_fee, *eth.contracts().weth().address(), ), - cow_amm_registry.clone(), + config.surplus_capturing_jit_order_owners, config.native_price_timeout, *eth.contracts().settlement().address(), config.disable_order_balance_filter, @@ -559,7 +538,6 @@ pub async fn run(config: Configuration, shutdown_controller: ShutdownController) db_write.clone(), settlement_observer, ); - maintenance.add_cow_amm_indexer(&cow_amm_registry); if !config.ethflow.contracts.is_empty() { let ethflow_refund_start_block = determine_ethflow_refund_indexing_start( diff --git a/crates/autopilot/src/solvable_orders.rs b/crates/autopilot/src/solvable_orders.rs index dd3007b7e1..938afeaf7e 100644 --- a/crates/autopilot/src/solvable_orders.rs +++ b/crates/autopilot/src/solvable_orders.rs @@ -138,7 +138,7 @@ pub struct SolvableOrdersCache { native_price_estimator: Arc, weth: Address, protocol_fees: domain::ProtocolFees, - cow_amm_registry: cow_amm::Registry, + surplus_capturing_jit_order_owners: Vec
, native_price_timeout: Duration, settlement_contract: Address, disable_order_balance_filter: bool, @@ -163,7 +163,7 @@ impl SolvableOrdersCache { native_price_estimator: Arc, weth: Address, protocol_fees: domain::ProtocolFees, - cow_amm_registry: cow_amm::Registry, + surplus_capturing_jit_order_owners: Vec
, native_price_timeout: Duration, settlement_contract: Address, disable_order_balance_filter: bool, @@ -178,7 +178,7 @@ impl SolvableOrdersCache { native_price_estimator, weth, protocol_fees, - cow_amm_registry, + surplus_capturing_jit_order_owners, native_price_timeout, settlement_contract, disable_order_balance_filter, @@ -230,7 +230,7 @@ impl SolvableOrdersCache { .map(|order| order.metadata.uid) .collect(); - let (balances, orders, cow_amms, in_flight) = { + let (balances, orders, in_flight) = { let queries = orders .iter() .map(|o| Query::from_order(o)) @@ -238,7 +238,6 @@ impl SolvableOrdersCache { tokio::join!( self.fetch_balances(queries), self.filter_invalid_orders(orders, &mut invalid_order_uids), - self.timed_future("cow_amm_registry", self.cow_amm_registry.amms()), self.fetch_in_flight_orders(block), ) }; @@ -271,11 +270,6 @@ impl SolvableOrdersCache { orders }; - let cow_amm_tokens = cow_amms - .iter() - .flat_map(|cow_amm| cow_amm.traded_tokens().iter().copied()) - .collect::>(); - // create auction let (orders, removed, mut prices) = self .timed_future( @@ -283,7 +277,6 @@ impl SolvableOrdersCache { get_orders_with_native_prices( orders, &self.native_price_estimator, - cow_amm_tokens, self.native_price_timeout, ), ) @@ -304,36 +297,19 @@ impl SolvableOrdersCache { self.store_events_by_reason(filtered_order_events, OrderEventLabel::Filtered); } - let in_flight_owners: HashSet<_> = in_flight + // Exclude any owner that already has an order in-flight (i.e. won a previous + // auction and is being settled on-chain). A surplus-capturing JIT order created + // on its behalf could conflict with the settling order, so we drop the owner + // from this auction until the in-flight order clears. + let in_flight_owners: HashSet
= in_flight .iter() .map(|uid| domain::OrderUid(uid.0).owner()) .collect(); - let surplus_capturing_jit_order_owners: Vec<_> = cow_amms + let surplus_capturing_jit_order_owners: Vec
= self + .surplus_capturing_jit_order_owners .iter() - .filter(|cow_amm| { - // Orders rebalancing cow amms revert when the cow amm does not have exactly the - // state the order was crafted for so having multiple orders in-flight for the - // same cow amm is an issue. Additionally an amm can be rebalanced in many - // different ways which would all result in different order UIDs so filtering - // based on that is not sufficient. That's way we check if there is any order - // in-flight for that amm based on the owner of the order (i.e. the cow amm) and - // then discard that amm altogether for that auction. - if in_flight_owners.contains(cow_amm.address()) { - return false; - } - cow_amm.traded_tokens().iter().all(|token| { - let price_exist = prices.contains_key(token); - if !price_exist { - tracing::debug!( - cow_amm = ?cow_amm.address(), - ?token, - "omitted from auction due to missing prices" - ); - } - price_exist - }) - }) - .map(|cow_amm| *cow_amm.address()) + .filter(|owner| !in_flight_owners.contains(*owner)) + .copied() .collect(); let auction = domain::RawAuctionData { block, @@ -678,7 +654,6 @@ fn filter_dust_orders<'a>( async fn get_orders_with_native_prices<'a>( orders: Vec<&'a Order>, native_price_estimator: &NativePriceUpdater, - additional_tokens: impl IntoIterator, timeout: Duration, ) -> ( Vec<&'a Order>, @@ -688,7 +663,6 @@ async fn get_orders_with_native_prices<'a>( let traded_tokens = orders .iter() .flat_map(|order| [order.data.sell_token, order.data.buy_token]) - .chain(additional_tokens) .collect::>(); let prices = get_native_prices(traded_tokens, native_price_estimator, timeout).await; @@ -825,7 +799,6 @@ mod tests { let (filtered_orders, _removed, prices) = get_orders_with_native_prices( orders_ref, &native_price_estimator, - vec![], Duration::from_millis(100), ) .await; @@ -845,7 +818,6 @@ mod tests { let token2 = Address::repeat_byte(2); let token3 = Address::repeat_byte(3); let token4 = Address::repeat_byte(4); - let token5 = Address::repeat_byte(5); let orders = [ Arc::new( @@ -902,11 +874,6 @@ mod tests { .times(1) .withf(move |token, _| *token == token4) .returning(|_, _| async { Ok(0.) }.boxed()); - native_price_estimator - .expect_estimate_native_price() - .times(1) - .withf(move |token, _| *token == token5) - .returning(|_, _| async { Ok(5.) }.boxed()); let cache = Cache::new(Duration::from_secs(10), Default::default()); let caching_estimator = CachingNativePriceEstimator::new( @@ -925,13 +892,9 @@ mod tests { // We'll have no native prices in this call. But set_tokens_to_update // will cause the background task to fetch them in the next cycle. let orders_ref = orders.iter().map(|o| o.as_ref()).collect::>(); - let (alive_orders, _removed_orders, prices) = get_orders_with_native_prices( - orders_ref, - &native_price_estimator, - vec![token5], - Duration::ZERO, - ) - .await; + let (alive_orders, _removed_orders, prices) = + get_orders_with_native_prices(orders_ref, &native_price_estimator, Duration::ZERO) + .await; assert!(alive_orders.is_empty()); assert!(prices.is_empty()); @@ -940,13 +903,9 @@ mod tests { // Now we have all the native prices we want. let orders_ref = orders.iter().map(|o| o.as_ref()).collect::>(); - let (alive_orders, _removed_orders, prices) = get_orders_with_native_prices( - orders_ref, - &native_price_estimator, - vec![token5], - Duration::ZERO, - ) - .await; + let (alive_orders, _removed_orders, prices) = + get_orders_with_native_prices(orders_ref, &native_price_estimator, Duration::ZERO) + .await; assert_eq!(alive_orders, [orders[2].as_ref()]); assert_eq!( @@ -954,7 +913,6 @@ mod tests { btreemap! { token1 => alloy::primitives::U256::from(2_000_000_000_000_000_000_u128), token3 => alloy::primitives::U256::from(250_000_000_000_000_000_u128), - token5 => alloy::primitives::U256::from(5_000_000_000_000_000_000_u128), } ); } @@ -1031,7 +989,6 @@ mod tests { let (alive_orders, _removed_orders, prices) = get_orders_with_native_prices( orders_ref, &native_price_estimator, - vec![], Duration::from_secs(10), ) .await; diff --git a/crates/configs/src/autopilot/cow_amm.rs b/crates/configs/src/autopilot/cow_amm.rs deleted file mode 100644 index 009317e570..0000000000 --- a/crates/configs/src/autopilot/cow_amm.rs +++ /dev/null @@ -1,70 +0,0 @@ -use {alloy::primitives::Address, serde::Deserialize, url::Url}; - -/// Configuration for indexing CoW AMMs. -#[derive(Debug, Clone, Default, Deserialize)] -#[cfg_attr(any(test, feature = "test-util"), derive(serde::Serialize))] -#[serde(rename_all = "kebab-case", deny_unknown_fields)] -pub struct CowAmmGroupConfig { - /// List of CoW AMM factory/helper/start-block configurations. - #[serde(default)] - pub contracts: Vec, - - /// Archive node URL used to index CoW AMMs. - pub archive_node_url: Option, -} - -/// A single CoW AMM factory configuration. -#[derive(Debug, Clone, Deserialize)] -#[cfg_attr(any(test, feature = "test-util"), derive(serde::Serialize))] -#[serde(rename_all = "kebab-case", deny_unknown_fields)] -pub struct CowAmmConfig { - /// Contract address emitting CoW AMM deployment events. - pub factory: Address, - - /// Contract address to interface with pools deployed by the factory. - pub helper: Address, - - /// Block at which indexing should start (1 block before factory - /// deployment). - pub index_start: u64, -} - -#[cfg(test)] -mod tests { - use {super::*, alloy::primitives::address}; - - #[test] - fn deserialize_defaults() { - let config: CowAmmGroupConfig = toml::from_str("").unwrap(); - assert!(config.contracts.is_empty()); - assert!(config.archive_node_url.is_none()); - } - - #[test] - fn deserialize_full() { - let toml = r#" - archive-node-url = "http://archive.example.com" - - [[contracts]] - factory = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" - helper = "0xdAC17F958D2ee523a2206206994597C13D831ec7" - index-start = 12345678 - - [[contracts]] - factory = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" - helper = "0x6B175474E89094C44Da98b954EedeAC495271d0F" - index-start = 99999999 - "#; - let config: CowAmmGroupConfig = toml::from_str(toml).unwrap(); - assert_eq!(config.contracts.len(), 2); - assert_eq!( - config.contracts[0].factory, - address!("C02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2") - ); - assert_eq!(config.contracts[0].index_start, 12345678); - assert_eq!( - config.archive_node_url.unwrap().as_str(), - "http://archive.example.com/" - ); - } -} diff --git a/crates/configs/src/autopilot/mod.rs b/crates/configs/src/autopilot/mod.rs index 8dd4492e1d..5cfcc3af78 100644 --- a/crates/configs/src/autopilot/mod.rs +++ b/crates/configs/src/autopilot/mod.rs @@ -1,7 +1,6 @@ use { crate::{ autopilot::{ - cow_amm::CowAmmGroupConfig, ethflow::EthflowConfig, fee_policy::FeePoliciesConfig, native_price::NativePriceConfig, @@ -25,7 +24,6 @@ use { url::Url, }; -pub mod cow_amm; pub mod ethflow; pub mod fee_policy; pub mod native_price; @@ -114,9 +112,10 @@ pub struct Configuration { #[serde(default = "default_api_address")] pub api_address: SocketAddr, - /// Configuration for CoW AMM indexing and archive node access. + /// Allowlist of owner addresses whose JIT orders are allowed to capture + /// surplus in the auction. #[serde(default)] - pub cow_amm: CowAmmGroupConfig, + pub surplus_capturing_jit_order_owners: Vec
, /// Configuration for the autopilot's main auction run loop. #[serde(default)] @@ -217,7 +216,7 @@ impl Configuration { shadow: Default::default(), metrics_address: default_metrics_address(), api_address: default_api_address(), - cow_amm: Default::default(), + surplus_capturing_jit_order_owners: Default::default(), run_loop: TestDefault::test_default(), disable_order_balance_filter: false, max_maintenance_timeout: default_max_maintenance_timeout(), @@ -248,7 +247,7 @@ impl Configuration { shadow: Default::default(), metrics_address: default_metrics_address(), api_address: default_api_address(), - cow_amm: Default::default(), + surplus_capturing_jit_order_owners: Default::default(), run_loop: TestDefault::test_default(), disable_order_balance_filter: false, max_maintenance_timeout: default_max_maintenance_timeout(), @@ -303,6 +302,7 @@ mod tests { fn deserialize_full_configuration() { let toml = r#" unsupported-tokens = ["0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"] + surplus-capturing-jit-order-owners = ["0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"] min-order-validity-period = "2m" max-auction-age = "10m" native-price-timeout = "3s" @@ -446,6 +446,11 @@ mod tests { config.unsupported_tokens[0], address!("C02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2") ); + assert_eq!(config.surplus_capturing_jit_order_owners.len(), 1); + assert_eq!( + config.surplus_capturing_jit_order_owners[0], + address!("C02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2") + ); assert_eq!(config.min_order_validity_period, Duration::from_secs(120)); assert_eq!(config.max_auction_age, Duration::from_secs(600)); assert_eq!(config.native_price_timeout, Duration::from_secs(3)); @@ -508,6 +513,7 @@ mod tests { assert!(config.s3.is_none()); assert!(config.unsupported_tokens.is_empty()); + assert!(config.surplus_capturing_jit_order_owners.is_empty()); assert_eq!(config.min_order_validity_period, Duration::from_secs(60)); assert_eq!(config.max_auction_age, Duration::from_secs(300)); assert_eq!(config.native_price_timeout, Duration::ZERO); diff --git a/crates/configs/src/shared.rs b/crates/configs/src/shared.rs index 8e474f989d..657e345e90 100644 --- a/crates/configs/src/shared.rs +++ b/crates/configs/src/shared.rs @@ -30,7 +30,7 @@ const fn default_ethrpc_max_concurrent_requests() -> usize { fn default_log_filter() -> String { String::from( "info,autopilot=debug,driver=debug,observe=info,observe::http_body=debug,orderbook=debug,\ - solver=debug,shared=debug,cow_amm=debug", + solver=debug,shared=debug", ) } diff --git a/crates/cow-amm/Cargo.toml b/crates/cow-amm/Cargo.toml deleted file mode 100644 index 77992a730c..0000000000 --- a/crates/cow-amm/Cargo.toml +++ /dev/null @@ -1,31 +0,0 @@ -[package] -name = "cow-amm" -version = "0.1.0" -edition = "2024" - -[dependencies] -alloy-contract = { workspace = true } -alloy-primitives = { workspace = true } -alloy-provider = { workspace = true } -alloy-rpc-types = { workspace = true } -alloy-sol-types = { workspace = true } -anyhow = { workspace = true } -app-data = { workspace = true } -async-trait = { workspace = true } -const-hex = { workspace = true } -contracts = { workspace = true } -database = { workspace = true } -ethrpc = { workspace = true } -event-indexing = { workspace = true } -futures = { workspace = true } -model = { workspace = true } -observe = { workspace = true } -prometheus = { workspace = true } -prometheus-metric-storage = { workspace = true } -signature-validator = { workspace = true } -sqlx = { workspace = true } -tokio = { workspace = true, features = [] } -tracing = { workspace = true } - -[lints] -workspace = true diff --git a/crates/cow-amm/src/amm.rs b/crates/cow-amm/src/amm.rs deleted file mode 100644 index 4e39f36867..0000000000 --- a/crates/cow-amm/src/amm.rs +++ /dev/null @@ -1,203 +0,0 @@ -use { - alloy_primitives::{Address, TxHash, U256}, - anyhow::{Context, Result}, - app_data::AppDataHash, - contracts::cow_amm::{CowAmmLegacyHelper, CowAmmLegacyHelper::CowAmmLegacyHelper::orderReturn}, - database::byte_array::ByteArray, - model::{ - DomainSeparator, - interaction::InteractionData, - order::{BuyTokenDestination, OrderData, OrderKind, SellTokenSource}, - signature::{Signature, hashed_eip712_message}, - }, - signature_validator::{SignatureCheck, SignatureValidating}, -}; - -#[derive(Clone, Debug)] -pub struct Amm { - helper: CowAmmLegacyHelper::Instance, - address: Address, - tradeable_tokens: Vec
, -} - -impl Amm { - pub async fn new( - address: Address, - helper: &CowAmmLegacyHelper::Instance, - ) -> alloy_contract::Result { - let tradeable_tokens = helper.tokens(address).call().await?; - - Ok(Self { - address, - helper: helper.clone(), - tradeable_tokens, - }) - } - - pub fn address(&self) -> &Address { - &self.address - } - - /// Returns all tokens traded by this pool in stable order. - pub fn traded_tokens(&self) -> &[Address] { - &self.tradeable_tokens - } - - /// Returns an order to rebalance the AMM based on the provided reference - /// prices. `prices` need to be computed using a common denominator and - /// need to be supplied in the same order as `traded_tokens` returns - /// token addresses. - pub async fn template_order(&self, prices: Vec) -> Result { - let order_return = self.helper.order(self.address, prices).call().await?; - self.convert_orders_reponse(order_return) - } - - /// Generates a template order to rebalance the AMM but also verifies that - /// the signature is actually valid to protect against buggy helper - /// contracts. - pub async fn validated_template_order( - &self, - prices: Vec, - validator: &dyn SignatureValidating, - domain_separator: &DomainSeparator, - ) -> Result { - let template = self.template_order(prices).await?; - - // A buggy helper contract could return a signature that is actually not valid. - // To avoid issues caused by that we check the validity of the signature. - let hash = hashed_eip712_message(domain_separator, &template.order.hash_struct()); - validator - .validate_signature_and_get_additional_gas(SignatureCheck::new( - self.address, - hash.0, - template.signature.to_bytes(), - template.pre_interactions.clone(), - None, - )) - .await - .context("invalid signature")?; - - Ok(template) - } - - pub fn try_to_db_type( - &self, - block_number: u64, - factory_address: Address, - tx_hash: TxHash, - ) -> Result { - Ok(database::cow_amms::CowAmm { - address: ByteArray(self.address.0.0), - factory_address: ByteArray(factory_address.0.0), - tradeable_tokens: self - .tradeable_tokens - .iter() - .cloned() - .map(|addr| ByteArray(addr.0.0)) - .collect(), - block_number: i64::try_from(block_number) - .with_context(|| format!("block number {block_number} is not i64"))?, - tx_hash: ByteArray(tx_hash.0), - }) - } - - /// Converts a successful response of the CowAmmHelper into domain types. - /// Can be used for any contract that correctly implements the CoW AMM - /// helper interface. - fn convert_orders_reponse(&self, order_return: orderReturn) -> Result { - let order = OrderData { - sell_token: order_return._order.sellToken, - buy_token: order_return._order.buyToken, - receiver: Some(order_return._order.receiver), - sell_amount: order_return._order.sellAmount, - buy_amount: order_return._order.buyAmount, - valid_to: order_return._order.validTo, - app_data: AppDataHash(order_return._order.appData.0), - fee_amount: order_return._order.feeAmount, - kind: convert_kind(&order_return._order.kind.0)?, - partially_fillable: order_return._order.partiallyFillable, - sell_token_balance: convert_sell_token_source(&order_return._order.sellTokenBalance.0)?, - buy_token_balance: convert_buy_token_destination( - &order_return._order.buyTokenBalance.0, - )?, - }; - - let pre_interactions = convert_interactions(order_return.preInteractions); - let post_interactions = convert_interactions(order_return.postInteractions); - - // The settlement contract expects a signature composed of 2 parts: the - // signer address and the actual signature bytes. - // The helper contract returns exactly that format but in our code base we - // expect the signature to not already include the signer address (the parts - // will be concatenated in the encoding logic) so we discard the first 20 bytes. - let raw_signature = order_return.sig.0.into_iter().skip(20).collect(); - let signature = Signature::Eip1271(raw_signature); - - Ok(TemplateOrder { - order, - signature, - pre_interactions, - post_interactions, - }) - } -} - -/// Order suggested by a CoW AMM helper contract to rebalance the AMM according -/// to an external price vector. -pub struct TemplateOrder { - /// CoW protocol order that should be executed. - pub order: OrderData, - /// Signature for the given order. - pub signature: Signature, - /// Transactions to be executed before transfering funds into the settlement - /// contract. - pub pre_interactions: Vec, - /// Transactions to be executed after transfering funds out of the - /// settlement contract. - pub post_interactions: Vec, -} - -fn convert_interactions( - interactions: Vec, -) -> Vec { - interactions - .into_iter() - .map(|interaction| InteractionData { - target: interaction.target, - value: interaction.value, - call_data: interaction.callData.to_vec(), - }) - .collect() -} - -// Hex strings for enums have been copied from -// - -fn convert_kind(bytes: &[u8]) -> Result { - match const_hex::encode(bytes).as_str() { - "f3b277728b3fee749481eb3e0b3b48980dbbab78658fc419025cb16eee346775" => Ok(OrderKind::Sell), - "6ed88e868af0a1983e3886d5f3e95a2fafbd6c3450bc229e27342283dc429ccc" => Ok(OrderKind::Buy), - bytes => anyhow::bail!("unknown order type: {bytes}"), - } -} - -const BALANCE_ERC20: &str = "5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc9"; -const BALANCE_INTERNAL: &str = "4ac99ace14ee0a5ef932dc609df0943ab7ac16b7583634612f8dc35a4289a6ce"; -const BALANCE_EXTERNAL: &str = "abee3b73373acd583a130924aad6dc38cfdc44ba0555ba94ce2ff63980ea0632"; - -fn convert_sell_token_source(bytes: &[u8]) -> Result { - match const_hex::encode(bytes).as_str() { - BALANCE_ERC20 => Ok(SellTokenSource::Erc20), - BALANCE_INTERNAL => Ok(SellTokenSource::Internal), - BALANCE_EXTERNAL => Ok(SellTokenSource::External), - bytes => anyhow::bail!("unknown sell token source: {bytes}"), - } -} - -fn convert_buy_token_destination(bytes: &[u8]) -> Result { - match const_hex::encode(bytes).as_str() { - BALANCE_ERC20 => Ok(BuyTokenDestination::Erc20), - BALANCE_INTERNAL => Ok(BuyTokenDestination::Internal), - bytes => anyhow::bail!("unknown buy token destination: {bytes}"), - } -} diff --git a/crates/cow-amm/src/cache.rs b/crates/cow-amm/src/cache.rs deleted file mode 100644 index 8dfd59eb3c..0000000000 --- a/crates/cow-amm/src/cache.rs +++ /dev/null @@ -1,243 +0,0 @@ -use { - crate::{Amm, Metrics}, - alloy_primitives::Address, - alloy_rpc_types::Log, - anyhow::Context, - contracts::cow_amm::{ - CowAmmLegacyHelper, - CowAmmLegacyHelper::CowAmmLegacyHelper::CowAmmLegacyHelperEvents as CowAmmEvent, - }, - database::byte_array::ByteArray, - event_indexing::{block_retriever::RangeInclusive, event_handler::EventStoring}, - sqlx::PgPool, - std::{collections::HashMap, sync::Arc}, - tokio::sync::RwLock, -}; - -#[derive(Clone, Debug)] -pub(crate) struct Storage(Arc); - -impl Storage { - pub(crate) async fn new( - deployment_block: u64, - helper: CowAmmLegacyHelper::Instance, - factory_address: Address, - db: PgPool, - ) -> Self { - let self_ = Self(Arc::new(Inner { - cache: Default::default(), - factory_address, - // make sure to start 1 block **before** the deployment to get all the events - start_of_index: deployment_block - 1, - helper, - db, - })); - - if let Err(err) = self_.initialize_from_database().await { - tracing::error!( - ?err, - ?factory_address, - "failed to initialize AMM cache from database" - ); - } - - self_ - } - - async fn initialize_from_database(&self) -> anyhow::Result<()> { - let mut ex = self.0.db.acquire().await?; - let factory_address = ByteArray(self.0.factory_address.0.0); - let db_amms = { - let _timer = Metrics::get() - .database_queries - .with_label_values(&["cow_amm_fetch_by_helper"]) - .start_timer(); - - database::cow_amms::fetch_by_factory_address(&mut ex, &factory_address).await? - }; - - if db_amms.is_empty() { - return Ok(()); - } - - let amm_process_tasks = db_amms.into_iter().map(|db_amm| async move { - let amm_address = Address::from_slice(&db_amm.address.0); - let amm = Amm::new(amm_address, &self.0.helper).await?; - let block_number = u64::try_from(db_amm.block_number).context(format!( - "db stored cow amm {:?} block number is not u64", - db_amm.address - ))?; - - Ok::<(u64, Arc), anyhow::Error>((block_number, Arc::new(amm))) - }); - let processed_amms = futures::future::try_join_all(amm_process_tasks).await?; - - let count = processed_amms.len(); - let db_amms = processed_amms - .iter() - .map(|(_, amm)| *amm.address()) - .collect::>(); - let mut cache = self.0.cache.write().await; - for (block_number, amm) in processed_amms { - cache.entry(block_number).or_default().push(amm); - } - tracing::info!( - count, - ?factory_address, - ?db_amms, - "initialized AMMs from database" - ); - - Ok(()) - } - - pub(crate) async fn cow_amms(&self) -> Vec> { - let lock = self.0.cache.read().await; - lock.values() - .flat_map(|amms| amms.iter().cloned()) - .collect() - } - - pub(crate) async fn remove_amms(&self, amm_addresses: &[Address]) { - let mut lock = self.0.cache.write().await; - for amms in lock.values_mut() { - amms.retain(|amm| !amm_addresses.contains(amm.address())) - } - } -} - -#[derive(Debug)] -struct Inner { - /// Store indexed data associated to the indexed events type id. - /// That type erasure allows us to index multiple concrete contracts - /// in a single Registry to make for a nicer user facing API. - cache: RwLock>>>, - /// The earliest block where indexing the contract makes sense. - /// The contract did not emit any events before this block. - start_of_index: u64, - /// Address of the factory contract that deployed the AMMs. - factory_address: Address, - /// Helper contract to query required data from the cow amm. - helper: CowAmmLegacyHelper::Instance, - /// Database connection to persist CoW AMMs and the last indexed block. - db: PgPool, -} - -#[async_trait::async_trait] -impl EventStoring<(CowAmmEvent, Log)> for Storage { - async fn replace_events( - &mut self, - events: Vec<(CowAmmEvent, Log)>, - range: RangeInclusive, - ) -> anyhow::Result<()> { - { - let mut ex = self.0.db.acquire().await?; - let start_block = i64::try_from(*range.start()).context("start block is not i64")?; - let end_block = i64::try_from(*range.end()).context("end block is not i64")?; - let factory_address = ByteArray(self.0.factory_address.0.0); - database::cow_amms::delete_by_block_range( - &mut ex, - &factory_address, - start_block, - end_block, - ) - .await?; - } - - { - let cache = &mut *self.0.cache.write().await; - for key in *range.start()..=*range.end() { - cache.remove(&key); - } - } - - self.append_events(events).await - } - - /// Apply all the events to the given CoW AMM registry and update the - /// internal registry - async fn append_events(&mut self, events: Vec<(CowAmmEvent, Log)>) -> anyhow::Result<()> { - let mut processed_events = Vec::with_capacity(events.len()); - for (event, log) in events { - let (Some(block_number), Some(tx_hash)) = (log.block_number, log.transaction_hash) - else { - tracing::warn!(?event, "event does not contain required meta data"); - continue; - }; - - let CowAmmEvent::COWAMMPoolCreated(cow_amm) = event; - let cow_amm = cow_amm.amm; - match Amm::new(cow_amm, &self.0.helper).await { - Ok(amm) => processed_events.push((block_number, tx_hash, Arc::new(amm))), - Err(err) if matches!(&err, alloy_contract::Error::TransportError(_)) => { - // Abort completely to later try the entire block range again. - // That keeps the cache in a consistent state and avoids indexing - // the same event multiple times which would result in duplicate amms. - tracing::debug!(?cow_amm, ?err, "retryable error"); - return Err(err.into()); - } - Err(err) => { - tracing::info!(?cow_amm, ?err, "helper contract does not support amm"); - continue; - } - }; - } - - if !processed_events.is_empty() { - let db_amms = processed_events - .iter() - .filter_map(|(block_number, tx_hash, amm)| { - amm.as_ref() - .try_to_db_type(*block_number, self.0.factory_address, *tx_hash) - .inspect_err(|err| { - tracing::warn!( - ?err, - ?amm, - ?block_number, - ?tx_hash, - helper = ?self.0.helper.address(), - "failed to convert amm to db domain" - ); - }) - .ok() - }) - .collect::>(); - let _timer = Metrics::get() - .database_queries - .with_label_values(&["cow_amms_upsert_batched"]) - .start_timer(); - - let mut ex = self.0.db.begin().await?; - database::cow_amms::upsert_batched(&mut ex, &db_amms).await?; - ex.commit().await?; - } - - // Update cache - let cache = &mut *self.0.cache.write().await; - for (block, _tx_hash, amm) in processed_events { - tracing::info!(cow_amm = ?amm.address(), "indexed new cow amm"); - cache.entry(block).or_default().push(amm); - } - - Ok(()) - } - - async fn last_event_block(&self) -> anyhow::Result { - let mut ex = self.0.db.acquire().await?; - database::last_indexed_blocks::fetch(&mut ex, &format!("{:#x}", self.0.factory_address)) - .await? - .map(|block| block.try_into().context("last block is not u64")) - .unwrap_or(Ok(self.0.start_of_index)) - } - - async fn persist_last_indexed_block(&mut self, latest_block: u64) -> anyhow::Result<()> { - let mut ex = self.0.db.acquire().await?; - database::last_indexed_blocks::update( - &mut ex, - &format!("{:#x}", self.0.factory_address), - i64::try_from(latest_block).context("latest block is not u64")?, - ) - .await?; - Ok(()) - } -} diff --git a/crates/cow-amm/src/factory.rs b/crates/cow-amm/src/factory.rs deleted file mode 100644 index ee506217b4..0000000000 --- a/crates/cow-amm/src/factory.rs +++ /dev/null @@ -1,33 +0,0 @@ -use { - alloy_primitives::Address, - alloy_provider::DynProvider, - alloy_rpc_types::{Filter, FilterSet}, - alloy_sol_types::SolEvent, - contracts::cow_amm::CowAmmLegacyHelper::CowAmmLegacyHelper::{ - self, - CowAmmLegacyHelperEvents as CowAmmEvent, - }, - ethrpc::AlloyProvider, - event_indexing::event_handler::AlloyEventRetrieving, -}; - -pub(crate) struct Factory { - pub(crate) provider: AlloyProvider, - pub(crate) address: Address, -} - -impl AlloyEventRetrieving for Factory { - type Event = CowAmmEvent; - - fn filter(&self) -> Filter { - Filter::new() - .address(self.address) - .event_signature(FilterSet::from_iter([ - CowAmmLegacyHelper::COWAMMPoolCreated::SIGNATURE_HASH, - ])) - } - - fn provider(&self) -> &DynProvider { - &self.provider - } -} diff --git a/crates/cow-amm/src/lib.rs b/crates/cow-amm/src/lib.rs deleted file mode 100644 index 9aa1cd3c4d..0000000000 --- a/crates/cow-amm/src/lib.rs +++ /dev/null @@ -1,107 +0,0 @@ -mod amm; -mod cache; -mod factory; -mod maintainers; -mod registry; - -pub use { - amm::Amm, - contracts::cow_amm::CowAmmLegacyHelper::Instance as Helper, - registry::Registry, -}; - -#[derive(prometheus_metric_storage::MetricStorage)] -pub(crate) struct Metrics { - /// How log db queries take. - #[metric(name = "cow_amm_database_queries", labels("type"))] - database_queries: prometheus::HistogramVec, -} - -impl Metrics { - fn get() -> &'static Self { - Metrics::instance(observe::metrics::get_storage_registry()).unwrap() - } -} - -/// GPv2Order-specific signing utilities. -/// -/// CoW Protocol uses GPv2Order structs for order representation. For EIP-712 -/// signing, certain fields use `string` types in the type hash function (for -/// better UX) but the same fields are stored on-chain as `bytes32`. -/// -/// See: -pub mod gpv2_order { - use { - alloy_primitives::{Address, B256, Keccak256}, - alloy_sol_types::{SolStruct, SolValue}, - contracts::cow_amm::CowAmm, - model::{DomainSeparator, interaction::InteractionData, signature::hashed_eip712_message}, - }; - - /// The correct EIP-712 type hash for GPv2Order as defined in CoW Protocol - /// contracts. - /// - /// This corresponds to: - /// ```text - /// keccak256("Order(address sellToken,address buyToken,address receiver,uint256 sellAmount,uint256 buyAmount,uint32 validTo,bytes32 appData,uint256 feeAmount,string kind,bool partiallyFillable,string sellTokenBalance,string buyTokenBalance)") - /// ``` - /// - /// Note the use of `string` for kind, sellTokenBalance, and buyTokenBalance - /// instead of `bytes32`. - const TYPE_HASH: [u8; 32] = - alloy_primitives::hex!("d5a25ba2e97094ad7d83dc28a6572da797d6b3e7fc6663bd93efb789fc17e489"); - - /// Computes the correct EIP-712 hash for a GPv2Order. - fn eip712_hash_struct(order: &CowAmm::GPv2Order::Data) -> B256 { - let mut hasher = Keccak256::new(); - hasher.update(TYPE_HASH); - hasher.update(order.eip712_encode_data()); - hasher.finalize() - } - - /// Generates an EIP-1271 signature for a CoW AMM GPv2Order. - /// - /// The signature format is: - /// 1. AMM address (20 bytes) - /// 2. ABI-encoded order data and trading parameters - /// - /// # Returns - /// The complete signature bytes that can be verified by the CoW Protocol - /// settlement contract. - pub fn generate_eip1271_signature( - order: &CowAmm::GPv2Order::Data, - trading_params: &CowAmm::ConstantProduct::TradingParams, - amm_address: Address, - ) -> Vec { - // Encode the order and trading params - let signature_data = (order.clone(), trading_params.clone()).abi_encode_sequence(); - - // Prepend AMM address to the signature - amm_address - .as_slice() - .iter() - .copied() - .chain(signature_data) - .collect() - } - - /// Generates a commit interaction for a CoW AMM GPv2Order. - /// - /// The commit interaction ensures that only the specified order can be - /// settled in the current CoW Protocol batch. - pub fn generate_commit_interaction( - order: &CowAmm::GPv2Order::Data, - amm: &CowAmm::Instance, - domain_separator: &DomainSeparator, - ) -> InteractionData { - let order_hash = eip712_hash_struct(order); - let order_hash = hashed_eip712_message(domain_separator, &order_hash); - let calldata = amm.commit(order_hash).calldata().clone(); - - InteractionData { - target: *amm.address(), - value: Default::default(), - call_data: calldata.to_vec(), - } - } -} diff --git a/crates/cow-amm/src/maintainers.rs b/crates/cow-amm/src/maintainers.rs deleted file mode 100644 index 12431db15f..0000000000 --- a/crates/cow-amm/src/maintainers.rs +++ /dev/null @@ -1,91 +0,0 @@ -use { - crate::{Amm, cache::Storage}, - contracts::ERC20, - ethrpc::AlloyProvider, - event_indexing::maintenance::Maintaining, - futures::{ - future::{join_all, select_ok}, - stream::{FuturesUnordered, StreamExt}, - }, - std::sync::Arc, - tokio::sync::RwLock, -}; - -pub struct EmptyPoolRemoval { - storage: Arc>>, - provider: AlloyProvider, -} - -impl EmptyPoolRemoval { - pub fn new(storage: Arc>>, provider: AlloyProvider) -> Self { - Self { storage, provider } - } - - /// Checks if the given AMM has a zero token balance. - async fn has_zero_balance(&self, amm: Arc) -> bool { - let amm_address = amm.address(); - let futures = amm - .traded_tokens() - .iter() - .map(move |token| async move { - ERC20::Instance::new(*token, self.provider.clone()) - .balanceOf(*amm_address) - .call() - .await - .map_err(|err| { - tracing::warn!( - amm = ?amm_address, - ?token, - ?err, - "failed to check AMM token balance" - ); - }) - .and_then(|balance| if balance.is_zero() { Ok(()) } else { Err(()) }) - }) - .map(Box::pin); - // If any future resolved to Ok(()), then there exists a zero balance. - select_ok(futures).await.is_ok() - } -} - -#[async_trait::async_trait] -impl Maintaining for EmptyPoolRemoval { - async fn run_maintenance(&self) -> anyhow::Result<()> { - let mut amms_to_check = Vec::>::new(); - { - let lock = self.storage.read().await; - for storage in lock.iter() { - amms_to_check.extend(storage.cow_amms().await); - } - } - - let empty_amms: Vec<_> = amms_to_check - .iter() - .map(|amm| { - let amm = amm.clone(); - async move { - let address = *amm.address(); - self.has_zero_balance(amm).await.then_some(address) - } - }) - .collect::>() - .filter_map(std::future::ready) - .collect() - .await; - if !empty_amms.is_empty() { - tracing::debug!(amms = ?empty_amms, "removing AMMs with zero token balance"); - let lock = self.storage.read().await; - join_all( - lock.iter() - .map(|storage| async { storage.remove_amms(&empty_amms).await }), - ) - .await; - } - - Ok(()) - } - - fn name(&self) -> &str { - "EmptyPoolRemoval" - } -} diff --git a/crates/cow-amm/src/registry.rs b/crates/cow-amm/src/registry.rs deleted file mode 100644 index 853df2f771..0000000000 --- a/crates/cow-amm/src/registry.rs +++ /dev/null @@ -1,97 +0,0 @@ -use { - crate::{Amm, cache::Storage, factory::Factory, maintainers::EmptyPoolRemoval}, - alloy_primitives::Address, - contracts::cow_amm::CowAmmLegacyHelper, - ethrpc::AlloyProvider, - event_indexing::{ - block_retriever::BlockRetriever, - event_handler::EventHandler, - maintenance::Maintaining, - }, - sqlx::PgPool, - std::sync::Arc, - tokio::sync::{Mutex, RwLock}, - tracing::instrument, -}; - -/// CoW AMM indexer which stores events in-memory. -#[derive(Clone)] -pub struct Registry { - block_retriever: Arc, - storage: Arc>>, - maintenance_tasks: Vec>, -} - -impl Registry { - pub fn new(block_retriever: Arc) -> Self { - Self { - storage: Default::default(), - block_retriever, - maintenance_tasks: vec![], - } - } - - fn provider(&self) -> &AlloyProvider { - &self.block_retriever.provider - } - - /// Registers a new listener to detect CoW AMMs deployed by `factory`. - /// Interfacing with the CoW AMM happens via the - /// [`contracts::CowAmmLegacyHelper`] deployed at `helper_contract`. - /// To actually start indexing these pools call `spawn_maintenance_tasks()`. - #[instrument(skip_all)] - pub async fn add_listener( - &mut self, - deployment_block: u64, - factory: Address, - helper_contract: Address, - db: PgPool, - ) { - let storage = Storage::new( - deployment_block, - CowAmmLegacyHelper::Instance::new(helper_contract, self.provider().clone()), - factory, - db, - ) - .await; - - self.storage.write().await.push(storage.clone()); - - let indexer = Factory { - provider: self.provider().clone(), - address: factory, - }; - let event_handler = EventHandler::new(self.block_retriever.clone(), indexer, storage, None); - let token_balance_maintainer = - EmptyPoolRemoval::new(self.storage.clone(), self.provider().clone()); - - self.maintenance_tasks - .push(Arc::new(Mutex::new(event_handler))); - self.maintenance_tasks - .push(Arc::new(token_balance_maintainer)); - } - - /// Returns all the deployed CoW AMMs - #[instrument(skip_all)] - pub async fn amms(&self) -> Vec> { - let mut result = vec![]; - let lock = self.storage.read().await; - for cache in &*lock { - result.extend(cache.cow_amms().await); - } - result - } - - pub fn maintenance_tasks(&self) -> &Vec> { - &self.maintenance_tasks - } -} - -impl std::fmt::Debug for Registry { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - f.debug_struct("Registry") - .field("block_retriever", &self.block_retriever) - .field("storage", &self.storage) - .finish() - } -} diff --git a/crates/database/src/cow_amms.rs b/crates/database/src/cow_amms.rs deleted file mode 100644 index 22abb0f10a..0000000000 --- a/crates/database/src/cow_amms.rs +++ /dev/null @@ -1,182 +0,0 @@ -use { - crate::{Address, PgTransaction, TransactionHash}, - sqlx::{Executor, PgConnection, QueryBuilder}, - tracing::instrument, -}; - -/// Represents a CoW AMM stored in the database -#[derive(Debug, Clone, PartialEq, sqlx::FromRow)] -pub struct CowAmm { - pub address: Address, - pub factory_address: Address, - pub tradeable_tokens: Vec
, - pub block_number: i64, - pub tx_hash: TransactionHash, -} - -/// Insert or update multiple CoW AMMs in the database using batch insert -#[instrument(skip_all)] -pub async fn upsert_batched( - ex: &mut PgTransaction<'_>, - cow_amms: &[CowAmm], -) -> Result<(), sqlx::Error> { - if cow_amms.is_empty() { - return Ok(()); - } - - const BATCH_SIZE: usize = 200; - - for chunk in cow_amms.chunks(BATCH_SIZE) { - upsert(ex, chunk).await?; - } - - Ok(()) -} - -/// Insert or update a batch of CoW AMMs in the database -#[instrument(skip_all)] -async fn upsert(ex: &mut PgConnection, cow_amms: &[CowAmm]) -> Result<(), sqlx::Error> { - const QUERY: &str = - "INSERT INTO cow_amms (address, factory_address, tradeable_tokens, block_number, tx_hash) "; - const CONFLICT_CLAUSE: &str = r#" -ON CONFLICT (address) -DO UPDATE SET - factory_address = EXCLUDED.factory_address, - tradeable_tokens = EXCLUDED.tradeable_tokens, - block_number = EXCLUDED.block_number, - tx_hash = EXCLUDED.tx_hash - "#; - - let mut query_builder = QueryBuilder::new(QUERY); - - query_builder.push_values(cow_amms, |mut builder, cow_amm| { - builder - .push_bind(cow_amm.address) - .push_bind(cow_amm.factory_address) - .push_bind(cow_amm.tradeable_tokens.clone()) - .push_bind(cow_amm.block_number) - .push_bind(cow_amm.tx_hash); - }); - query_builder.push(CONFLICT_CLAUSE); - query_builder.build().execute(ex).await?; - - Ok(()) -} - -/// Fetch all CoW AMMs for a specific helper contract -#[instrument(skip_all)] -pub async fn fetch_by_factory_address( - ex: &mut PgConnection, - address: &Address, -) -> Result, sqlx::Error> { - const QUERY: &str = "SELECT * FROM cow_amms WHERE factory_address = $1"; - - let cow_amms = sqlx::query_as(QUERY).bind(address).fetch_all(ex).await?; - - Ok(cow_amms) -} - -/// Delete CoW AMMs within a block range for a specific factory address. -#[instrument(skip_all)] -pub async fn delete_by_block_range( - ex: &mut PgConnection, - factory_address: &Address, - start_block: i64, - end_block: i64, -) -> Result<(), sqlx::Error> { - const QUERY: &str = r#" -DELETE FROM cow_amms -WHERE factory_address = $1 - AND block_number BETWEEN $2 AND $3; - "#; - - ex.execute( - sqlx::query(QUERY) - .bind(factory_address) - .bind(start_block) - .bind(end_block), - ) - .await?; - Ok(()) -} - -#[cfg(test)] -mod tests { - use {super::*, crate::byte_array::ByteArray, sqlx::Connection}; - - #[tokio::test] - #[ignore] - async fn postgres_cow_amm_roundtrip() { - let mut db = PgConnection::connect("postgresql://").await.unwrap(); - let mut db = db.begin().await.unwrap(); - crate::clear_DANGER_(&mut db).await.unwrap(); - - let address = ByteArray([1u8; 20]); - let tx_hash = ByteArray([0xabu8; 32]); - let cow_amm = CowAmm { - address, - factory_address: address, - block_number: 1, - tradeable_tokens: vec![ByteArray([1u8; 20]), ByteArray([2u8; 20])], - tx_hash, - }; - - // Test upsert - upsert(&mut db, std::slice::from_ref(&cow_amm)) - .await - .unwrap(); - - // Test fetch by helper address - let fetched = fetch_by_factory_address(&mut db, &address).await.unwrap(); - assert_eq!(fetched.len(), 1); - assert_eq!(fetched[0], cow_amm); - - // Test batch upsert - let tx_hash2 = ByteArray([0xcdu8; 32]); - let cow_amm2 = CowAmm { - address: ByteArray([43u8; 20]), - factory_address: address, - block_number: 2, - tradeable_tokens: vec![ByteArray([3u8; 20])], - tx_hash: tx_hash2, - }; - upsert_batched(&mut db, std::slice::from_ref(&cow_amm2)) - .await - .unwrap(); - - let fetched = fetch_by_factory_address(&mut db, &address).await.unwrap(); - assert_eq!(fetched.len(), 2); - - // Test delete by block range for a specific factory - delete_by_block_range(&mut db, &address, 1, 1) - .await - .unwrap(); - let fetched = fetch_by_factory_address(&mut db, &address).await.unwrap(); - assert_eq!(fetched.len(), 1); - assert_eq!(fetched[0], cow_amm2); - - // Test that delete only affects the specified factory - let another_factory = ByteArray([2u8; 20]); - let tx_hash3 = ByteArray([0xefu8; 32]); - let cow_amm3 = CowAmm { - address: ByteArray([5u8; 20]), - factory_address: another_factory, - block_number: 1, - tradeable_tokens: vec![ByteArray([4u8; 20])], - tx_hash: tx_hash3, - }; - upsert(&mut db, std::slice::from_ref(&cow_amm3)) - .await - .unwrap(); - - // Delete block 1 for the first factory - should not affect the second factory - delete_by_block_range(&mut db, &address, 1, 1) - .await - .unwrap(); - let fetched = fetch_by_factory_address(&mut db, &another_factory) - .await - .unwrap(); - assert_eq!(fetched.len(), 1); - assert_eq!(fetched[0], cow_amm3); - } -} diff --git a/crates/database/src/lib.rs b/crates/database/src/lib.rs index 52671aebaa..3656e41a7f 100644 --- a/crates/database/src/lib.rs +++ b/crates/database/src/lib.rs @@ -2,7 +2,6 @@ pub mod app_data; pub mod auction; pub mod auction_prices; pub mod byte_array; -pub mod cow_amms; pub mod ethflow_orders; pub mod events; pub mod fee_policies; @@ -52,7 +51,6 @@ pub type PgTransaction<'a> = sqlx::Transaction<'a, sqlx::Postgres>; pub const TABLES: &[&str] = &[ "app_data", "auctions", - "cow_amms", "ethflow_orders", "ethflow_refunds", "interactions", diff --git a/crates/driver/Cargo.toml b/crates/driver/Cargo.toml index 21386e8986..6c28ed1347 100644 --- a/crates/driver/Cargo.toml +++ b/crates/driver/Cargo.toml @@ -32,7 +32,6 @@ chain = { workspace = true } chrono = { workspace = true, default-features = false, features = ["clock"] } configs = { workspace = true } const-hex = { workspace = true } -cow-amm = { workspace = true } dashmap = { workspace = true } derive_more = { workspace = true } eth-domain-types = { workspace = true } diff --git a/crates/driver/example.toml b/crates/driver/example.toml index d82b4ee910..9d0719a0e0 100644 --- a/crates/driver/example.toml +++ b/crates/driver/example.toml @@ -36,12 +36,6 @@ balances = "0x3e8C6De9510e7ECad902D005DE3Ab52f35cF4f1b" signatures = "0x8262d639c38470F38d2eff15926F7071c28057Af" flashloan-router = "0x0000000000000000000000000000000000000000" -[[contracts.cow-amms]] -# address of factory creating new CoW AMMs -factory = "0x86f3df416979136cb4fdea2c0886301b911c163b" -# address of contract to help interfacing with the created CoW AMMs -helper = "0x86f3df416979136cb4fdea2c0886301b911c163b" - [liquidity] base-tokens = [ "0xDEf1CA1fb7FBcDC777520aa7f396b4E015F497aB", diff --git a/crates/driver/src/domain/competition/mod.rs b/crates/driver/src/domain/competition/mod.rs index 41a6673834..85b271301f 100644 --- a/crates/driver/src/domain/competition/mod.rs +++ b/crates/driver/src/domain/competition/mod.rs @@ -599,17 +599,11 @@ impl Competition { } async fn assemble_auction(&self, tasks: &DataFetchingTasks) -> Auction { - let (base_auction, cow_amm_orders) = - tokio::join!(tasks.auction.clone(), tasks.cow_amm_orders.clone()); + let base_auction = tasks.auction.clone().await; let auction = Auction { id: base_auction.id, - orders: base_auction - .orders - .iter() - .cloned() - .chain(cow_amm_orders.iter().cloned()) - .collect(), + orders: base_auction.orders.clone(), tokens: base_auction.tokens.clone(), gas_price: base_auction.gas_price, deadline: base_auction.deadline, @@ -638,7 +632,7 @@ impl Competition { // Same as before with sort_orders, we use spawn_blocking() because a lot of CPU // bound computations are happening and we want to avoid blocking // the runtime. - Self::update_orders(auction, balances, app_data, cow_amm_orders) + Self::update_orders(auction, balances, app_data) }) .await; self.without_unsupported_orders(auction).await @@ -668,12 +662,10 @@ impl Competition { mut auction: Auction, balances: Arc, app_data: Arc>>, - cow_amm_orders: Arc>, ) -> Auction { // Clone balances since we only aggregate data once but each solver needs // to use and modify the data individually. let mut balances = balances.as_ref().clone(); - let cow_amms: HashSet<_> = cow_amm_orders.iter().map(|o| o.uid).collect(); let mut discarded_orders = BTreeMap::>::new(); @@ -686,15 +678,6 @@ impl Competition { // down in case the available user balance is only enough to partially // cover the rest of the order. auction.orders.retain_mut(|order| { - if cow_amms.contains(&order.uid) { - // cow amm orders already get constructed fully initialized - // so we don't have to handle them here anymore. - // Without this short circuiting logic they would get filtered - // out later because we don't bother fetching their balances - // for performance reasons. - return true; - } - // Update order app data if it was fetched. if let Some(fetched_app_data) = app_data.get(&order.app_data.hash()) { order.app_data = fetched_app_data.clone().into(); diff --git a/crates/driver/src/domain/competition/pre_processing.rs b/crates/driver/src/domain/competition/pre_processing.rs index c9bddca00c..f541254293 100644 --- a/crates/driver/src/domain/competition/pre_processing.rs +++ b/crates/driver/src/domain/competition/pre_processing.rs @@ -1,32 +1,23 @@ use { - super::{Auction, Order, order}, + super::{Auction, order}, crate::{ domain::{ competition::order::{SellTokenBalance, app_data::AppData}, - cow_amm, liquidity, }, infra::{self, api::routes::solve::dto::SolveRequest, observe::metrics, tokens}, }, account_balances::{BalanceFetching, Query}, - alloy::primitives::{Bytes, FixedBytes}, anyhow::{Context, Result}, axum::{ body::{self, Body}, http::Request, }, balance_overrides::BalanceOverrideRequest, - chrono::Utc, - eth_domain_types::{self as eth, Address, TokenAddress}, + eth_domain_types::{self as eth}, futures::{FutureExt, StreamExt, future::BoxFuture, stream::FuturesUnordered}, itertools::Itertools, - model::{ - interaction::InteractionData, - order::{OrderKind, SellTokenSource}, - signature::Signature, - }, - observe::tracing::lazy::Lazy, - signature_validator::SignatureValidating, + model::{interaction::InteractionData, order::SellTokenSource}, std::{ collections::HashMap, future::Future, @@ -55,19 +46,16 @@ pub struct DataFetchingTasks { pub balances: Shared>, pub app_data: Shared>>>, - pub cow_amm_orders: Shared>>, pub liquidity: Shared>>, } /// All the components used for fetching the necessary data. pub struct Utilities { eth: infra::Ethereum, - signature_validator: Arc, app_data_retriever: Option, liquidity_fetcher: infra::liquidity::Fetcher, tokens: tokens::Fetcher, balance_fetcher: Arc, - cow_amm_cache: Option, } impl std::fmt::Debug for Utilities { @@ -138,34 +126,13 @@ impl DataAggregator { tokens: tokens::Fetcher, balance_fetcher: Arc, ) -> Self { - let signature_validator = signature_validator::validator( - eth.web3(), - signature_validator::Contracts { - settlement: eth.contracts().settlement().clone(), - vault_relayer: *eth.contracts().vault_relayer(), - signatures: eth.contracts().signatures().clone(), - }, - eth.state_overrider(), - ); - - let cow_amm_helper_by_factory = eth - .contracts() - .cow_amm_helper_by_factory() - .iter() - .map(|(factory, helper)| (Address::from(*factory), Address::from(*helper))) - .collect(); - let cow_amm_cache = - cow_amm::Cache::new(eth.web3().provider.clone(), cow_amm_helper_by_factory); - Self { utilities: Arc::new(Utilities { eth, - signature_validator, app_data_retriever, liquidity_fetcher, tokens, balance_fetcher, - cow_amm_cache, }), control: Mutex::new(ControlBlock { auction_id: Default::default(), @@ -173,7 +140,6 @@ impl DataAggregator { auction: futures::future::pending().boxed().shared(), balances: futures::future::pending().boxed().shared(), app_data: futures::future::pending().boxed().shared(), - cow_amm_orders: futures::future::pending().boxed().shared(), liquidity: futures::future::pending().boxed().shared(), }, }), @@ -190,9 +156,6 @@ impl DataAggregator { Arc::clone(&self.utilities).collect_orders_app_data(Arc::clone(&auction)), ); - let cow_amm_orders = - Self::spawn_shared(Arc::clone(&self.utilities).cow_amm_orders(Arc::clone(&auction))); - let liquidity = Self::spawn_shared(Arc::clone(&self.utilities).fetch_liquidity(Arc::clone(&auction))); @@ -200,7 +163,6 @@ impl DataAggregator { auction: futures::future::ready(auction).boxed().shared(), balances, app_data, - cow_amm_orders, liquidity, }) } @@ -410,142 +372,6 @@ impl Utilities { Arc::new(app_data) } - async fn cow_amm_orders(self: Arc, auction: Arc) -> Arc> { - let Some(ref cow_amm_cache) = self.cow_amm_cache else { - // CoW AMMs are not configured, return empty vec - return Default::default(); - }; - - let _timer = metrics::get().processing_stage_timer("cow_amm_orders"); - let _timer2 = - observe::metrics::metrics().on_auction_overhead_start("driver", "cow_amm_orders"); - - let cow_amms = cow_amm_cache - .get_or_create_amms(&auction.surplus_capturing_jit_order_owners) - .await; - - let domain_separator = self.eth.contracts().settlement_domain_separator(); - let domain_separator = model::DomainSeparator(domain_separator.0); - let validator = self.signature_validator.as_ref(); - - let results: Vec<_> = futures::future::join_all( - cow_amms - .into_iter() - // Only generate orders where the auction provided the required - // reference prices. Otherwise there will be an error during the - // surplus calculation which will also result in 0 surplus for - // this order. - .filter_map(|amm| { - let prices = amm - .traded_tokens() - .iter() - .map(|t| { - auction.tokens - .get(&TokenAddress::from(*t)) - .and_then(|token| token.price) - .map(|price| price.0.0) - }) - .collect::>>()?; - Some((amm, prices)) - }) - .map(|(cow_amm, prices)| async move { - let order = cow_amm.validated_template_order( - prices, - validator, - &domain_separator - ).await; - (*cow_amm.address(), order) - }), - ) - .await; - - // Convert results to domain format. - let domain_separator = model::DomainSeparator(domain_separator.0); - let orders: Vec<_> = results - .into_iter() - .filter_map(|(amm, result)| match result { - Ok(template) => { - let partial = match template.order.partially_fillable { - true => order::Partial::Yes { - available: match template.order.kind { - OrderKind::Sell => order::TargetAmount(template.order.sell_amount), - OrderKind::Buy => order::TargetAmount(template.order.buy_amount), - }, - }, - false => order::Partial::No, - }; - let signature = match template.signature { - Signature::Eip1271(bytes) => order::Signature { - scheme: order::signature::Scheme::Eip1271, - data: Bytes::from(bytes), - signer: amm, - }, - _ => { - tracing::warn!( - signature = ?template.signature, - ?amm, - "signature for cow amm order has incorrect scheme" - ); - return None; - } - }; - Some(Order { - data: Arc::new(order::OrderData { - uid: template.order.uid(&domain_separator, amm).0.into(), - receiver: template.order.receiver, - created: u32::try_from(Utc::now().timestamp()) - .unwrap_or(u32::MIN) - .into(), - valid_to: template.order.valid_to.into(), - buy: eth::Asset { - amount: template.order.buy_amount.into(), - token: template.order.buy_token.into(), - }, - sell: eth::Asset { - amount: template.order.sell_amount.into(), - token: template.order.sell_token.into(), - }, - kind: order::Kind::Limit, - side: template.order.kind.into(), - buy_token_balance: template.order.buy_token_balance.into(), - sell_token_balance: template.order.sell_token_balance.into(), - pre_interactions: template - .pre_interactions - .into_iter() - .map(Into::into) - .collect(), - post_interactions: template - .post_interactions - .into_iter() - .map(Into::into) - .collect(), - signature, - protocol_fees: vec![], - quote: None, - }), - app_data: order::app_data::AppDataHash(FixedBytes( - template.order.app_data.0, - )) - .into(), - partial, - }) - } - Err(err) => { - tracing::warn!(?err, ?amm, "failed to generate template order for cow amm"); - None - } - }) - .collect(); - - if !orders.is_empty() { - tracing::trace!(?orders, "generated cow amm template orders (details)"); - let orders = Lazy(|| orders.iter().map(|o| o.uid).collect_vec()); - tracing::debug!(?orders, "generated cow amm template orders"); - } - - Arc::new(orders) - } - async fn fetch_liquidity( self: Arc, auction: Arc, diff --git a/crates/driver/src/domain/cow_amm.rs b/crates/driver/src/domain/cow_amm.rs deleted file mode 100644 index 9b9cd8688c..0000000000 --- a/crates/driver/src/domain/cow_amm.rs +++ /dev/null @@ -1,133 +0,0 @@ -use { - alloy::{primitives::Address, providers::DynProvider}, - contracts::cow_amm::CowAmmLegacyHelper, - cow_amm::Amm, - eth_domain_types as eth, - itertools::{ - Either::{Left, Right}, - Itertools, - }, - std::{ - collections::{HashMap, HashSet}, - sync::Arc, - }, - tokio::sync::RwLock, -}; - -/// Cache for CoW AMM data to avoid using the registry dependency. -/// Maps AMM address to the corresponding Amm instance. -pub struct Cache { - inner: RwLock>>, - web3: DynProvider, - helper_by_factory: HashMap, -} - -impl Cache { - pub fn new(web3: DynProvider, factory_mapping: HashMap) -> Option { - if factory_mapping.is_empty() { - return None; - } - - let helper_by_factory = factory_mapping - .into_iter() - .map(|(factory, helper)| { - ( - factory, - CowAmmLegacyHelper::Instance::new(helper, web3.clone()), - ) - }) - .collect(); - Some(Self { - inner: RwLock::new(HashMap::new()), - web3: web3.clone(), - helper_by_factory, - }) - } - - /// Gets or creates AMM instances for the given surplus capturing JIT order - /// owners. - pub async fn get_or_create_amms( - &self, - surplus_capturing_jit_order_owners: &HashSet, - ) -> Vec> { - let (mut cached_amms, missing_amms): (Vec>, Vec
) = { - let cache = self.inner.read().await; - surplus_capturing_jit_order_owners - .iter() - .partition_map(|&address| match cache.get(&address) { - Some(amm) => Left(amm.clone()), - None => Right(address), - }) - }; - - if missing_amms.is_empty() { - return cached_amms; - } - - let fetch_futures = missing_amms.into_iter().map(|amm_address| async move { - let factory_address = self - .fetch_amm_factory_address(amm_address) - .await - .inspect_err(|err| { - tracing::warn!( - ?err, - amm_address = ?amm_address.0, - "failed to fetch CoW AMM factory address" - ); - }) - .ok()?; - - let Some(helper) = self.helper_by_factory.get(&factory_address) else { - tracing::warn!( - factory_address = ?factory_address.0, - amm_address = ?amm_address.0, - "no helper contract configured for CoW AMM factory" - ); - return None; - }; - - match Amm::new(amm_address, helper).await { - Ok(amm) => Some((amm_address, Arc::new(amm))), - Err(err) => { - let helper_address = helper.address().0; - tracing::warn!( - ?err, - amm_address = ?amm_address.0, - ?helper_address, - "failed to create CoW AMM instance" - ); - None - } - } - }); - - let fetched_results = futures::future::join_all(fetch_futures).await; - - // Update cache with newly fetched AMMs - let newly_created_amms = { - let mut cache = self.inner.write().await; - fetched_results - .into_iter() - .flatten() - .map(|(amm_address, amm)| { - cache.insert(amm_address, amm.clone()); - amm - }) - .collect::>() - }; - - // Combine cached and newly created AMMs - cached_amms.extend(newly_created_amms); - cached_amms - } - - /// Fetches the factory address for the given AMM by calling the - /// `FACTORY` function. - async fn fetch_amm_factory_address(&self, amm_address: Address) -> anyhow::Result
{ - let factory_getter = contracts::cow_amm::CowAmmFactoryGetter::CowAmmFactoryGetter::new( - amm_address, - self.web3.clone(), - ); - Ok(factory_getter.FACTORY().call().await?) - } -} diff --git a/crates/driver/src/domain/mod.rs b/crates/driver/src/domain/mod.rs index 29590c611a..f17cb1ec9f 100644 --- a/crates/driver/src/domain/mod.rs +++ b/crates/driver/src/domain/mod.rs @@ -1,6 +1,5 @@ pub mod blockchain; pub mod competition; -pub mod cow_amm; pub mod flashloan; pub mod interaction; pub mod liquidity; diff --git a/crates/driver/src/infra/blockchain/contracts.rs b/crates/driver/src/infra/blockchain/contracts.rs index 7ab38b6153..d95f127633 100644 --- a/crates/driver/src/infra/blockchain/contracts.rs +++ b/crates/driver/src/infra/blockchain/contracts.rs @@ -3,7 +3,6 @@ use { contracts::{FlashLoanRouter, GPv2Settlement, WETH9, support::Balances}, eth_domain_types as eth, ethrpc::Web3, - std::collections::HashMap, }; #[derive(Debug, Clone)] @@ -22,9 +21,6 @@ pub struct Contracts { // everywhere flashloan_router: Option, balance_helper: Balances::Instance, - /// Mapping from CoW AMM factory address to the corresponding CoW AMM - /// helper. - cow_amm_helper_by_factory: HashMap, web3: Web3, } @@ -34,7 +30,6 @@ pub struct Addresses { pub signatures: Option, pub weth: Option, pub balances: Option, - pub cow_amm_helper_by_factory: HashMap, pub flashloan_router: Option, } @@ -104,7 +99,6 @@ impl Contracts { settlement_domain_separator, flashloan_router, balance_helper, - cow_amm_helper_by_factory: addresses.cow_amm_helper_by_factory, web3: web3.clone(), }) } @@ -144,10 +138,4 @@ impl Contracts { pub fn web3(&self) -> &Web3 { &self.web3 } - - pub fn cow_amm_helper_by_factory( - &self, - ) -> &HashMap { - &self.cow_amm_helper_by_factory - } } diff --git a/crates/driver/src/infra/config/file/load.rs b/crates/driver/src/infra/config/file/load.rs index f501de6477..fcdc4c18a1 100644 --- a/crates/driver/src/infra/config/file/load.rs +++ b/crates/driver/src/infra/config/file/load.rs @@ -348,12 +348,6 @@ pub async fn load(chain: Chain, path: &Path) -> infra::Config { weth: config.contracts.weth.map(Into::into), balances: config.contracts.balances.map(Into::into), signatures: config.contracts.signatures.map(Into::into), - cow_amm_helper_by_factory: config - .contracts - .cow_amms - .into_iter() - .map(|cfg| (cfg.factory.into(), cfg.helper.into())) - .collect(), flashloan_router: config.contracts.flashloan_router.map(Into::into), }, disable_access_list_simulation: config.disable_access_list_simulation, diff --git a/crates/driver/src/infra/config/file/mod.rs b/crates/driver/src/infra/config/file/mod.rs index 02cd8fca7b..a850efecc7 100644 --- a/crates/driver/src/infra/config/file/mod.rs +++ b/crates/driver/src/infra/config/file/mod.rs @@ -470,24 +470,11 @@ struct ContractsConfig { /// Override the default address of the Signatures contract. signatures: Option, - /// List of all cow amm factories with the corresponding helper contract. - #[serde(default)] - cow_amms: Vec, - /// Flashloan router to support taking out multiple flashloans /// in the same settlement. flashloan_router: Option, } -#[derive(Debug, Clone, Deserialize)] -#[serde(rename_all = "kebab-case", deny_unknown_fields)] -pub struct CowAmmConfig { - /// CoW AMM factory address. - pub factory: eth::Address, - /// Which helper contract to use for interfacing with CoW AMMs. - pub helper: eth::Address, -} - #[derive(Clone, Debug, Default, Deserialize)] #[serde(rename_all = "kebab-case", deny_unknown_fields)] struct LiquidityConfig { diff --git a/crates/driver/src/tests/setup/solver.rs b/crates/driver/src/tests/setup/solver.rs index e48ae9ea80..a453e0f733 100644 --- a/crates/driver/src/tests/setup/solver.rs +++ b/crates/driver/src/tests/setup/solver.rs @@ -486,7 +486,6 @@ impl Solver { weth: Some((*config.blockchain.weth.address()).into()), balances: Some((*config.blockchain.balances.address()).into()), signatures: Some((*config.blockchain.signatures.address()).into()), - cow_amm_helper_by_factory: Default::default(), flashloan_router: Some((*config.blockchain.flashloan_router.address()).into()), }, &shared::current_block::Arguments { diff --git a/crates/e2e/Cargo.toml b/crates/e2e/Cargo.toml index d644e47f47..93ebf75316 100644 --- a/crates/e2e/Cargo.toml +++ b/crates/e2e/Cargo.toml @@ -41,7 +41,6 @@ clap = { workspace = true } configs = { workspace = true, features = ["test-util"] } const-hex = { workspace = true } contracts = { workspace = true } -cow-amm = { workspace = true } database = { workspace = true } driver = { workspace = true } eth-domain-types = { workspace = true } diff --git a/crates/e2e/src/setup/mod.rs b/crates/e2e/src/setup/mod.rs index 3939588e9c..df2f34de82 100644 --- a/crates/e2e/src/setup/mod.rs +++ b/crates/e2e/src/setup/mod.rs @@ -86,7 +86,6 @@ static NODE_MUTEX: Mutex<()> = Mutex::new(()); const DEFAULT_FILTERS: &[&str] = &[ "warn", "autopilot=debug", - "cow_amm=debug", "driver=debug", "e2e=debug", "orderbook=debug", diff --git a/crates/e2e/tests/e2e/cow_amm.rs b/crates/e2e/tests/e2e/cow_amm.rs deleted file mode 100644 index 77fb134f95..0000000000 --- a/crates/e2e/tests/e2e/cow_amm.rs +++ /dev/null @@ -1,1082 +0,0 @@ -use { - alloy::{ - primitives::{Address, Bytes, FixedBytes, U256, address}, - providers::{ - Provider, - ext::{AnvilApi, ImpersonateConfig}, - }, - }, - configs::{ - autopilot::{Configuration, solver::Solver}, - order_quoting::{ExternalSolver, OrderQuoting}, - test_util::TestDefault, - }, - contracts::{ - ERC20, - support::{Balances, Signatures}, - }, - e2e::setup::{ - DeployedContracts, - OnchainComponents, - Services, - TIMEOUT, - colocation::{self, SolverEngine}, - mock::Mock, - run_forked_test_with_block_number, - run_test, - wait_for_condition, - }, - eth_domain_types::NonZeroU256, - ethrpc::alloy::CallBuilderExt, - model::{ - order::{OrderClass, OrderCreation, OrderKind, OrderUid}, - quote::{OrderQuoteRequest, OrderQuoteSide, SellAmount}, - signature::EcdsaSigningScheme, - }, - number::units::EthUnit, - shared::web3::Web3, - solvers_dto::solution::{ - BuyTokenBalance, - Call, - Kind, - SellTokenBalance, - SigningScheme, - Solution, - }, - std::collections::{HashMap, HashSet}, -}; - -#[tokio::test] -#[ignore] -async fn local_node_cow_amm_jit() { - run_test(cow_amm_jit).await; -} - -/// Tests that solvers are able to propose and settle cow amm orders -/// on their own in the form of JIT orders. -async fn cow_amm_jit(web3: Web3) { - let mut onchain = OnchainComponents::deploy(web3.clone()).await; - - let [solver] = onchain.make_solvers(100u64.eth()).await; - let [bob, cow_amm_owner] = onchain.make_accounts(1000u64.eth()).await; - - let [dai] = onchain - .deploy_tokens_with_weth_uni_v2_pools(300_000u64.eth(), 100u64.eth()) - .await; - - // Fund the buffers with a lot of buy tokens so we can pay out the required - // tokens for 2 orders in the same direction without having to worry about - // getting the liquidity on-chain. - dai.mint( - *onchain.contracts().gp_settlement.address(), - 100_000u64.eth(), - ) - .await; - - // set up cow_amm - let oracle = - contracts::cow_amm::CowAmmUniswapV2PriceOracle::Instance::deploy(web3.provider.clone()) - .await - .unwrap(); - - let cow_amm_factory = contracts::cow_amm::CowAmmConstantProductFactory::Instance::deploy( - web3.provider.clone(), - *onchain.contracts().gp_settlement.address(), - ) - .await - .unwrap(); - - // Fund cow amm owner with 2_000 dai and allow factory take them - dai.mint(cow_amm_owner.address(), 2_000u64.eth()).await; - - dai.approve(*cow_amm_factory.address(), 2_000u64.eth()) - .from(cow_amm_owner.address()) - .send_and_watch() - .await - .unwrap(); - // Fund cow amm owner with 1 WETH and allow factory take them - onchain - .contracts() - .weth - .deposit() - .value(1u64.eth()) - .from(cow_amm_owner.address()) - .send_and_watch() - .await - .unwrap(); - onchain - .contracts() - .weth - .approve(*cow_amm_factory.address(), 1u64.eth()) - .from(cow_amm_owner.address()) - .send_and_watch() - .await - .unwrap(); - - let pair = onchain - .contracts() - .uniswap_v2_factory - .getPair(*onchain.contracts().weth.address(), *dai.address()) - .call() - .await - .expect("failed to get Uniswap V2 pair"); - - let cow_amm = cow_amm_factory - .ammDeterministicAddress( - cow_amm_owner.address(), - *dai.address(), - *onchain.contracts().weth.address(), - ) - .call() - .await - .unwrap(); - - // pad with 12 zeros in the front to end up with 32 bytes - let oracle_data: Vec<_> = std::iter::repeat_n(0u8, 12).chain(pair.to_vec()).collect(); - const APP_DATA: [u8; 32] = [12u8; 32]; - - cow_amm_factory - .create( - *dai.address(), - 2_000u64.eth(), - *onchain.contracts().weth.address(), - 1u64.eth(), - U256::ZERO, // min traded token - *oracle.address(), - Bytes::copy_from_slice(&oracle_data), - FixedBytes(APP_DATA), - ) - .from(cow_amm_owner.address()) - .send_and_watch() - .await - .unwrap(); - let cow_amm = contracts::cow_amm::CowAmm::Instance::new(cow_amm, web3.provider.clone()); - - // Start system with the regular baseline solver as a quoter but a mock solver - // for the actual solver competition. That way we can handcraft a solution - // for this test and don't have to implement complete support for CoW AMMs - // in the baseline solver. - let mock_solver = Mock::new().await; - colocation::start_driver( - onchain.contracts(), - vec![ - colocation::start_baseline_solver( - "test_solver".into(), - solver.clone(), - *onchain.contracts().weth.address(), - vec![], - 1, - true, - ) - .await, - SolverEngine { - name: "mock_solver".into(), - account: solver.clone(), - endpoint: mock_solver.url.clone(), - base_tokens: vec![], - merge_solutions: true, - haircut_bps: 0, - submission_keys: vec![], - }, - ], - colocation::LiquidityProvider::UniswapV2, - false, - ); - let services = Services::new(&onchain).await; - - services - .start_autopilot( - None, - Configuration { - order_quoting: OrderQuoting::test_with_drivers(vec![ExternalSolver::new( - "test_solver", - "http://localhost:11088/test_solver", - )]), - ..Configuration::test("mock_solver", solver.address()) - }, - ) - .await; - services - .start_api(configs::orderbook::Configuration { - order_quoting: OrderQuoting::test_with_drivers(vec![ExternalSolver::new( - "test_solver", - "http://localhost:11088/test_solver", - )]), - ..configs::orderbook::Configuration::test_default() - }) - .await; - - // Derive the order's valid_to from the blockchain because the cow amm enforces - // a relatively small valid_to and we initialize the chain with a date in - // the past so the computer's current time is way ahead of the blockchain. - let block = web3 - .provider - .get_block(alloy::eips::BlockId::latest()) - .await - .unwrap() - .unwrap(); - let valid_to = u32::try_from(block.header.timestamp).unwrap() + 300; - - // CoW AMM order with a limit price extremely close to the AMM's current price. - // current price => 1 WETH == 2000 DAI - // order price => 0.1 WETH == 230 DAI => 1 WETH == 2300 DAI - // oracle price => 100 WETH == 300000 DAI => 1 WETH == 3000 DAI - // If this order gets settled around the oracle price it will receive plenty of - // surplus. - let cow_amm_order = contracts::cow_amm::CowAmm::GPv2Order::Data { - sellToken: *onchain.contracts().weth.address(), - buyToken: *dai.address(), - receiver: Default::default(), - sellAmount: 0.1.eth(), - buyAmount: 230u64.eth(), - validTo: valid_to, - appData: FixedBytes(APP_DATA), - feeAmount: U256::ZERO, - kind: FixedBytes::from_slice( - &const_hex::decode("f3b277728b3fee749481eb3e0b3b48980dbbab78658fc419025cb16eee346775") - .unwrap(), - ), // sell order - partiallyFillable: false, - sellTokenBalance: FixedBytes::from_slice( - &const_hex::decode("5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc9") - .unwrap(), - ), // erc20 - buyTokenBalance: FixedBytes::from_slice( - &const_hex::decode("5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc9") - .unwrap(), - ), // erc20 - }; - let trading_params = contracts::cow_amm::CowAmm::ConstantProduct::TradingParams { - minTradedToken0: U256::ZERO, - priceOracle: *oracle.address(), - priceOracleData: Bytes::copy_from_slice(&oracle_data), - appData: FixedBytes(APP_DATA), - }; - - // Generate EIP-1271 signature for the CoW AMM order - let signature = cow_amm::gpv2_order::generate_eip1271_signature( - &cow_amm_order, - &trading_params, - *cow_amm.address(), - ); - - // Generate commit interaction for the pre-interaction - let cow_amm_commitment_data = cow_amm::gpv2_order::generate_commit_interaction( - &cow_amm_order, - &cow_amm, - &onchain.contracts().domain_separator, - ); - let cow_amm_commitment = Call { - target: cow_amm_commitment_data.target, - value: cow_amm_commitment_data.value, - calldata: cow_amm_commitment_data.call_data, - }; - - // fund trader "bob" and approve vault relayer - onchain - .contracts() - .weth - .deposit() - .from(bob.address()) - .value(0.1.eth()) - .send_and_watch() - .await - .unwrap(); - onchain - .contracts() - .weth - .approve(onchain.contracts().allowance, U256::MAX) - .from(bob.address()) - .send_and_watch() - .await - .unwrap(); - - // place user order with the same limit price as the CoW AMM order - let user_order = OrderCreation { - sell_token: *onchain.contracts().weth.address(), - sell_amount: 0.1.eth(), // 0.1 WETH - buy_token: *dai.address(), - buy_amount: 230u64.eth(), // 230 DAI - valid_to: model::time::now_in_epoch_seconds() + 300, - kind: OrderKind::Sell, - ..Default::default() - } - .sign( - EcdsaSigningScheme::Eip712, - &onchain.contracts().domain_separator, - &bob.signer, - ); - let user_order_id = services.create_order(&user_order).await.unwrap(); - - let amm_balance_before = dai.balanceOf(*cow_amm.address()).call().await.unwrap(); - let bob_balance_before = dai.balanceOf(bob.address()).call().await.unwrap(); - - let fee = 0.01.eth(); // 0.01 WETH - - mock_solver.configure_solution(Some(Solution { - id: 1, - // assume price of the univ2 pool - prices: HashMap::from([ - (*dai.address(), 100u64.eth()), - (*onchain.contracts().weth.address(), 300_000u64.eth()), - ]), - trades: vec![ - solvers_dto::solution::Trade::Jit(solvers_dto::solution::JitTrade { - order: solvers_dto::solution::JitOrder { - sell_token: cow_amm_order.sellToken, - buy_token: cow_amm_order.buyToken, - receiver: cow_amm_order.receiver, - sell_amount: cow_amm_order.sellAmount, - buy_amount: cow_amm_order.buyAmount, - partially_fillable: cow_amm_order.partiallyFillable, - valid_to: cow_amm_order.validTo, - app_data: cow_amm_order.appData.0, - kind: Kind::Sell, - sell_token_balance: SellTokenBalance::Erc20, - buy_token_balance: BuyTokenBalance::Erc20, - signing_scheme: SigningScheme::Eip1271, - signature, - }, - executed_amount: cow_amm_order.sellAmount - fee, - fee: Some(fee), - }), - solvers_dto::solution::Trade::Fulfillment(solvers_dto::solution::Fulfillment { - order: solvers_dto::solution::OrderUid(user_order_id.0), - executed_amount: (user_order.sell_amount - fee), - fee: Some(fee), - }), - ], - pre_interactions: vec![cow_amm_commitment], - interactions: vec![], - post_interactions: vec![], - gas: None, - flashloans: None, - wrappers: vec![], - gas_fee_override: None, - })); - - // Drive solution - tracing::info!("Waiting for trade."); - onchain.mint_block().await; - wait_for_condition(TIMEOUT, || async { - let amm_balance = dai.balanceOf(*cow_amm.address()).call().await.unwrap(); - let bob_balance = dai.balanceOf(bob.address()).call().await.unwrap(); - - let amm_received = amm_balance - amm_balance_before; - let bob_received = bob_balance - bob_balance_before; - - // bob and CoW AMM both got surplus and an equal amount - amm_received >= cow_amm_order.buyAmount && bob_received > user_order.buy_amount - }) - .await - .unwrap(); -} - -#[tokio::test] -#[ignore] -async fn forked_node_mainnet_cow_amm_driver_support() { - run_forked_test_with_block_number( - cow_amm_driver_support, - std::env::var("FORK_URL_MAINNET") - .expect("FORK_URL_MAINNET must be set to run forked tests"), - // block before relevant cow amm was finalized - 20476674, - ) - .await; -} - -/// Tests that the driver is able to generate template orders for indexed -/// cow amms and that they can be settled by solvers like regular orders. -async fn cow_amm_driver_support(web3: Web3) { - // The Balances SC is deployed many blocks after the cow amm helper contract, so - // since changing the forked number would result in very costly ~1 year of event - // syncing, we deploy the following SCs - let deployed_contracts = { - let balances = Balances::Instance::deploy(web3.provider.clone()) - .await - .unwrap(); - let signatures = Signatures::Instance::deploy(web3.provider.clone()) - .await - .unwrap(); - DeployedContracts { - balances: Some(*balances.address()), - signatures: Some(*signatures.address()), - } - }; - let mut onchain = OnchainComponents::deployed_with(web3.clone(), deployed_contracts).await; - - let [solver] = onchain.make_solvers_forked(11u64.eth()).await; - let [trader] = onchain.make_accounts(1u64.eth()).await; - - // find some USDC available onchain - const USDC_WHALE_MAINNET: Address = address!("28c6c06298d514db089934071355e5743bf21d60"); - - // create necessary token instances - let usdc = ERC20::Instance::new( - address!("a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"), - web3.provider.clone(), - ); - - let usdt = ERC20::Instance::new( - address!("dac17f958d2ee523a2206206994597c13d831ec7"), - web3.provider.clone(), - ); - - // Unbalance the cow amm enough that baseline is able to rebalance - // it with the current liquidity. - const USDC_WETH_COW_AMM: Address = address!("f08d4dea369c456d26a3168ff0024b904f2d8b91"); - - let weth_balance = onchain - .contracts() - .weth - .balanceOf(USDC_WETH_COW_AMM) - .call() - .await - .unwrap(); - // Assuming that the pool is balanced, imbalance it by ~30%, so the driver can - // crate a CoW AMM JIT order. This imbalance shouldn't exceed 50%, since - // such an order will be rejected by the SC: - let weth_to_send = weth_balance.checked_div(U256::from(3)).unwrap(); - onchain - .contracts() - .weth - .deposit() - .from(solver.address()) - .value(weth_to_send) - .send_and_watch() - .await - .unwrap(); - onchain - .contracts() - .weth - .transfer(USDC_WETH_COW_AMM, weth_to_send) - .from(solver.address()) - .send_and_watch() - .await - .unwrap(); - - let amm_usdc_balance_before = usdc.balanceOf(USDC_WETH_COW_AMM).call().await.unwrap(); - - // Now we create an unfillable order just so the orderbook is not empty. - // Otherwise all auctions would be skipped because there is no user order to - // settle. - - // Give trader some USDC - web3.provider - .anvil_send_impersonated_transaction_with_config( - usdc.transfer(trader.address(), 1000u64.matom()) - .from(USDC_WHALE_MAINNET) - .into_transaction_request(), - ImpersonateConfig { - fund_amount: None, - stop_impersonate: true, - }, - ) - .await - .unwrap() - .get_receipt() - .await - .unwrap(); - - // Approve GPv2 for trading - usdc.approve(onchain.contracts().allowance, 1000u64.matom()) - .from(trader.address()) - .send_and_watch() - .await - .unwrap(); - - // Empty liquidity of one of the AMMs to test EmptyPoolRemoval maintenance job. - const ZERO_BALANCE_AMM: Address = address!("b3bf81714f704720dcb0351ff0d42eca61b069fc"); - let pendle_token = ERC20::Instance::new( - address!("808507121b80c02388fad14726482e061b8da827"), - web3.provider.clone(), - ); - let balance = pendle_token - .balanceOf(ZERO_BALANCE_AMM) - .call() - .await - .unwrap(); - web3.provider - .anvil_send_impersonated_transaction_with_config( - pendle_token - .transfer( - address!("027e1cbf2c299cba5eb8a2584910d04f1a8aa403"), - balance, - ) - .from(ZERO_BALANCE_AMM) - .into_transaction_request(), - ImpersonateConfig { - fund_amount: None, - stop_impersonate: true, - }, - ) - .await - .unwrap() - .get_receipt() - .await - .unwrap(); - - assert!( - pendle_token - .balanceOf(ZERO_BALANCE_AMM) - .call() - .await - .unwrap() - .is_zero() - ); - - // spawn a mock solver so we can later assert things about the received auction - let mock_solver = Mock::new().await; - colocation::start_driver_with_config_override( - onchain.contracts(), - vec![ - colocation::start_baseline_solver( - "test_solver".into(), - solver.clone(), - *onchain.contracts().weth.address(), - vec![], - 1, - true, - ) - .await, - SolverEngine { - name: "mock_solver".into(), - account: solver.clone(), - endpoint: mock_solver.url.clone(), - base_tokens: vec![], - merge_solutions: true, - haircut_bps: 0, - submission_keys: vec![], - }, - ], - colocation::LiquidityProvider::UniswapV2, - false, - Some( - r#" -[[contracts.cow-amms]] -helper = "0x3FF0041A614A9E6Bf392cbB961C97DA214E9CB31" -factory = "0xf76c421bAb7df8548604E60deCCcE50477C10462" -"#, - ), - ); - let services = Services::new(&onchain).await; - - services - .start_autopilot( - None, - Configuration { - drivers: vec![ - Solver::test("test_solver", solver.address()), - Solver::test("mock_solver", solver.address()), - ], - cow_amm: configs::autopilot::cow_amm::CowAmmGroupConfig { - contracts: vec![configs::autopilot::cow_amm::CowAmmConfig { - factory: address!("f76c421bAb7df8548604E60deCCcE50477C10462"), - helper: address!("3FF0041A614A9E6Bf392cbB961C97DA214E9CB31"), - index_start: 20476672, - }], - ..Default::default() - }, - order_quoting: OrderQuoting::test_with_drivers(vec![ExternalSolver::new( - "test_solver", - "http://localhost:11088/test_solver", - )]), - ..Configuration::test_no_drivers() - }, - ) - .await; - services - .start_api(configs::orderbook::Configuration { - order_quoting: OrderQuoting::test_with_drivers(vec![ExternalSolver::new( - "test_solver", - "http://localhost:11088/test_solver", - )]), - ..configs::orderbook::Configuration::test_default() - }) - .await; - - onchain.mint_block().await; - - // Place Orders - let order = OrderCreation { - sell_token: *usdc.address(), - sell_amount: 1000u64.matom(), - buy_token: *usdt.address(), - buy_amount: 2000u64.matom(), - valid_to: model::time::now_in_epoch_seconds() + 300, - kind: OrderKind::Sell, - ..Default::default() - } - .sign( - EcdsaSigningScheme::Eip712, - &onchain.contracts().domain_separator, - &trader.signer, - ); - - // Warm up co-located driver by quoting the order (otherwise placing an order - // may time out) - let _ = services - .submit_quote(&OrderQuoteRequest { - sell_token: *usdc.address(), - buy_token: *usdt.address(), - side: OrderQuoteSide::Sell { - sell_amount: SellAmount::BeforeFee { - value: (1000u64.matom()).try_into().unwrap(), - }, - }, - ..Default::default() - }) - .await; - - let order_id = services.create_order(&order).await.unwrap(); - let limit_order = services.get_order(&order_id).await.unwrap(); - assert_eq!(limit_order.metadata.class, OrderClass::Limit); - - // Drive solution - tracing::info!("Waiting for trade."); - wait_for_condition(TIMEOUT, || async { - // Keep mining blocks to trigger the event indexing logic - onchain.mint_block().await; - tokio::time::sleep(tokio::time::Duration::from_millis(1_000)).await; - - let amm_usdc_balance_after = usdc.balanceOf(USDC_WETH_COW_AMM).call().await.unwrap(); - // CoW AMM traded automatically - amm_usdc_balance_after != amm_usdc_balance_before - }) - .await - .unwrap(); - - // all cow amms on mainnet the helper contract is aware of - tracing::info!("Waiting for all cow amms to be indexed."); - wait_for_condition(TIMEOUT, || async { - let auctions = mock_solver.get_auctions(); - let found_cow_amms: HashSet<_> = auctions - .iter() - .flat_map(|a| a.surplus_capturing_jit_order_owners.clone()) - .collect(); - - found_cow_amms.contains(&USDC_WETH_COW_AMM) - }) - .await - .unwrap(); - - // all tokens traded by the cow amms - tracing::info!("Waiting for all relevant native prices to be indexed."); - let expected_prices = [ - address!("C02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"), // WETH - address!("A0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"), // USDC - ]; - - wait_for_condition(TIMEOUT, || async { - let auctions = mock_solver.get_auctions(); - let auction_prices: HashSet<_> = auctions - .iter() - .flat_map(|auction| { - auction - .tokens - .iter() - .filter_map(|(token, info)| info.reference_price.map(|_| token)) - }) - .collect(); - - let found_amm_jit_orders = auctions.iter().any(|auction| { - auction.orders.iter().any(|order| { - order.owner == USDC_WETH_COW_AMM - && order.sell_token == *onchain.contracts().weth.address() - && order.buy_token == *usdc.address() - }) - }); - - found_amm_jit_orders - && expected_prices - .iter() - .all(|token| auction_prices.contains(token)) - }) - .await - .unwrap(); -} - -#[tokio::test] -#[ignore] -async fn local_node_cow_amm_opposite_direction() { - run_test(cow_amm_opposite_direction).await; -} - -/// Tests that only CoW AMM liquidity can be used to fulfill the order. -async fn cow_amm_opposite_direction(web3: Web3) { - let mut onchain = OnchainComponents::deploy(web3.clone()).await; - - let [solver] = onchain.make_solvers(100u64.eth()).await; - let [bob, cow_amm_owner] = onchain.make_accounts(1000u64.eth()).await; - - let [dai] = onchain - .deploy_tokens_with_weth_uni_v2_pools(300_000u64.eth(), 100u64.eth()) - .await; - - // No need to fund the buffers since we're testing the CoW AMM directly filling - // the user order. - - // Set up the CoW AMM as before - let oracle = - contracts::cow_amm::CowAmmUniswapV2PriceOracle::Instance::deploy(web3.provider.clone()) - .await - .unwrap(); - - let cow_amm_factory = contracts::cow_amm::CowAmmConstantProductFactory::Instance::deploy( - web3.provider.clone(), - *onchain.contracts().gp_settlement.address(), - ) - .await - .unwrap(); - - // Fund the CoW AMM owner with DAI and WETH and approve the factory to transfer - // them - dai.mint(cow_amm_owner.address(), 2_000u64.eth()).await; - - dai.approve(*cow_amm_factory.address(), 2_000u64.eth()) - .from(cow_amm_owner.address()) - .send_and_watch() - .await - .unwrap(); - - onchain - .contracts() - .weth - .deposit() - .from(cow_amm_owner.address()) - .value(1u64.eth()) - .send_and_watch() - .await - .unwrap(); - onchain - .contracts() - .weth - .approve(*cow_amm_factory.address(), 1u64.eth()) - .from(cow_amm_owner.address()) - .send_and_watch() - .await - .unwrap(); - - onchain - .contracts() - .weth - .deposit() - .from(solver.address()) - .value(1u64.eth()) - .send_and_watch() - .await - .unwrap(); - - let pair = onchain - .contracts() - .uniswap_v2_factory - .getPair(*onchain.contracts().weth.address(), *dai.address()) - .call() - .await - .expect("failed to get Uniswap V2 pair"); - - let cow_amm_address = cow_amm_factory - .ammDeterministicAddress( - cow_amm_owner.address(), - *dai.address(), - *onchain.contracts().weth.address(), - ) - .call() - .await - .unwrap(); - - // pad with 12 zeros to end up with 32 bytes - let oracle_data: Vec<_> = std::iter::repeat_n(0u8, 12).chain(pair.to_vec()).collect(); - const APP_DATA: [u8; 32] = [12u8; 32]; - - // Create the CoW AMM - cow_amm_factory - .create( - *dai.address(), - 2_000u64.eth(), - *onchain.contracts().weth.address(), - 1u64.eth(), - U256::ZERO, // min traded token - *oracle.address(), - Bytes::copy_from_slice(&oracle_data), - FixedBytes(APP_DATA), - ) - .from(cow_amm_owner.address()) - .send_and_watch() - .await - .unwrap(); - let cow_amm = contracts::cow_amm::CowAmm::Instance::new(cow_amm_address, web3.provider.clone()); - - // Start system with the mocked solver. Baseline is still required for the - // native price estimation. - let mock_solver = Mock::new().await; - colocation::start_driver( - onchain.contracts(), - vec![ - colocation::start_baseline_solver( - "test_solver".into(), - solver.clone(), - *onchain.contracts().weth.address(), - vec![], - 1, - true, - ) - .await, - SolverEngine { - name: "mock_solver".into(), - account: solver.clone(), - endpoint: mock_solver.url.clone(), - base_tokens: vec![], - merge_solutions: true, - haircut_bps: 0, - submission_keys: vec![], - }, - ], - colocation::LiquidityProvider::UniswapV2, - true, - ); - let services = Services::new(&onchain).await; - - services - .start_autopilot( - None, - Configuration { - order_quoting: OrderQuoting::test_with_drivers(vec![ExternalSolver::new( - "mock_solver", - "http://localhost:11088/mock_solver", - )]), - ..Configuration::test("mock_solver", solver.address()) - }, - ) - .await; - services - .start_api(configs::orderbook::Configuration { - order_quoting: OrderQuoting::test_with_drivers(vec![ExternalSolver::new( - "mock_solver", - "http://localhost:11088/mock_solver", - )]), - ..configs::orderbook::Configuration::test_default() - }) - .await; - - // Get the current block timestamp - let block = web3 - .provider - .get_block(alloy::eips::BlockId::latest()) - .await - .unwrap() - .unwrap(); - let valid_to = u32::try_from(block.header.timestamp).unwrap() + 300; - let executed_amount = 230u64.eth(); - - // CoW AMM order remains the same (selling WETH for DAI) - let cow_amm_order = contracts::cow_amm::CowAmm::GPv2Order::Data { - sellToken: *onchain.contracts().weth.address(), - buyToken: *dai.address(), - receiver: Default::default(), - sellAmount: 0.1.eth(), - buyAmount: executed_amount, - validTo: valid_to, - appData: FixedBytes(APP_DATA), - feeAmount: U256::ZERO, - kind: FixedBytes::from_slice( - &const_hex::decode("f3b277728b3fee749481eb3e0b3b48980dbbab78658fc419025cb16eee346775") - .unwrap(), - ), // sell order - partiallyFillable: false, - sellTokenBalance: FixedBytes::from_slice( - &const_hex::decode("5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc9") - .unwrap(), - ), // erc20 - buyTokenBalance: FixedBytes::from_slice( - &const_hex::decode("5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc9") - .unwrap(), - ), // erc20 - }; - let trading_params = contracts::cow_amm::CowAmm::ConstantProduct::TradingParams { - minTradedToken0: U256::ZERO, - priceOracle: *oracle.address(), - priceOracleData: Bytes::copy_from_slice(&oracle_data), - appData: FixedBytes(APP_DATA), - }; - // Generate EIP-1271 signature for the CoW AMM order - let signature = cow_amm::gpv2_order::generate_eip1271_signature( - &cow_amm_order, - &trading_params, - *cow_amm.address(), - ); - - // Generate commit interaction for the pre-interaction - let cow_amm_commitment_data = cow_amm::gpv2_order::generate_commit_interaction( - &cow_amm_order, - &cow_amm, - &onchain.contracts().domain_separator, - ); - let cow_amm_commitment = Call { - target: cow_amm_commitment_data.target, - value: cow_amm_commitment_data.value, - calldata: cow_amm_commitment_data.call_data, - }; - - // Fund trader "bob" with DAI and approve allowance - dai.mint(bob.address(), 250u64.eth()).await; - - dai.approve(onchain.contracts().allowance, alloy::primitives::U256::MAX) - .from(bob.address()) - .send_and_watch() - .await - .unwrap(); - - // Get balances before the trade - let amm_weth_balance_before = onchain - .contracts() - .weth - .balanceOf(*cow_amm.address()) - .call() - .await - .unwrap(); - let bob_weth_balance_before = onchain - .contracts() - .weth - .balanceOf(bob.address()) - .call() - .await - .unwrap(); - - // Compensate a delay between the `CurrentBlockStream` and the actual onchain - // data. - tokio::time::sleep(tokio::time::Duration::from_secs(1)).await; - - // Set the fees appropriately - let fee_cow_amm = 0.01.eth(); // 0.01 WETH - let fee_user = 1u64.eth(); // 1 DAI - - let mocked_solutions = |order_uid: OrderUid| { - Solution { - id: 1, - prices: HashMap::from([ - (*dai.address(), 1u64.eth()), // 1 DAI = $1 - (*onchain.contracts().weth.address(), 2300u64.eth()), // 1 WETH = $2300 - ]), - trades: vec![ - solvers_dto::solution::Trade::Jit(solvers_dto::solution::JitTrade { - order: solvers_dto::solution::JitOrder { - sell_token: cow_amm_order.sellToken, - buy_token: cow_amm_order.buyToken, - receiver: cow_amm_order.receiver, - sell_amount: cow_amm_order.sellAmount, - buy_amount: cow_amm_order.buyAmount, - partially_fillable: cow_amm_order.partiallyFillable, - valid_to: cow_amm_order.validTo, - app_data: cow_amm_order.appData.0, - kind: Kind::Sell, - sell_token_balance: SellTokenBalance::Erc20, - buy_token_balance: BuyTokenBalance::Erc20, - signing_scheme: SigningScheme::Eip1271, - signature: signature.clone(), - }, - executed_amount: cow_amm_order.sellAmount - fee_cow_amm, - fee: Some(fee_cow_amm), - }), - solvers_dto::solution::Trade::Fulfillment(solvers_dto::solution::Fulfillment { - order: solvers_dto::solution::OrderUid(order_uid.0), - executed_amount: executed_amount - fee_user, - fee: Some(fee_user), - }), - ], - pre_interactions: vec![cow_amm_commitment.clone()], - interactions: vec![], - post_interactions: vec![], - gas: None, - flashloans: None, - wrappers: vec![], - gas_fee_override: None, - } - }; - - // Configure the mocked `/quote` solver's solution - let mocked_quote_solution = mocked_solutions(OrderUid([0u8; 56])); - mock_solver.configure_solution(Some(mocked_quote_solution)); - - let quote_request = OrderQuoteRequest { - from: bob.address(), - sell_token: *dai.address(), - buy_token: *onchain.contracts().weth.address(), - side: OrderQuoteSide::Sell { - sell_amount: SellAmount::AfterFee { - value: NonZeroU256::try_from(executed_amount).unwrap(), - }, - }, - ..Default::default() - }; - - // Must align with the mocked_solutions. - let quote_response = services.submit_quote("e_request).await.unwrap(); - assert!(quote_response.verified); - assert_eq!(quote_response.quote.sell_token, *dai.address()); - assert_eq!( - quote_response.quote.buy_token, - *onchain.contracts().weth.address() - ); - // Ensure the amounts are the same as the solution proposes. - assert_eq!(quote_response.quote.sell_amount, executed_amount); - assert_eq!(quote_response.quote.buy_amount, 0.1.eth()); - - // Place user order where bob sells DAI to buy WETH (opposite direction) - let user_order = OrderCreation { - sell_token: *dai.address(), - sell_amount: executed_amount, // 230 DAI - buy_token: *onchain.contracts().weth.address(), - buy_amount: 0.09.eth(), // 0.09 WETH to generate some surplus - valid_to: model::time::now_in_epoch_seconds() + 300, - kind: OrderKind::Sell, - ..Default::default() - } - .sign( - EcdsaSigningScheme::Eip712, - &onchain.contracts().domain_separator, - &bob.signer, - ); - let user_order_id = services.create_order(&user_order).await.unwrap(); - - // Configure the mocked `/solve` solver's solution - let mocked_solve_solution = mocked_solutions(user_order_id); - mock_solver.configure_solution(Some(mocked_solve_solution.clone())); - - // Drive solution - tracing::info!("Waiting for trade."); - onchain.mint_block().await; - wait_for_condition(TIMEOUT, || async { - let amm_weth_balance_after = onchain - .contracts() - .weth - .balanceOf(*cow_amm.address()) - .call() - .await - .unwrap(); - let bob_weth_balance_after = onchain - .contracts() - .weth - .balanceOf(bob.address()) - .call() - .await - .unwrap(); - - let amm_weth_sent = amm_weth_balance_before - amm_weth_balance_after; - let bob_weth_received = bob_weth_balance_after - bob_weth_balance_before; - - // Bob should receive WETH, CoW AMM's WETH balance decreases - bob_weth_received >= user_order.buy_amount && amm_weth_sent == cow_amm_order.sellAmount - }) - .await - .unwrap(); - - // Verify that the trade is indexed - tracing::info!("Waiting for trade to be indexed."); - wait_for_condition(TIMEOUT, || async { - let trades = services.get_trades(&user_order_id).await.ok(); - trades.is_some_and(|trades| !trades.is_empty()) - }) - .await - .unwrap(); -} diff --git a/crates/e2e/tests/e2e/main.rs b/crates/e2e/tests/e2e/main.rs index f61367e48d..51abfc5265 100644 --- a/crates/e2e/tests/e2e/main.rs +++ b/crates/e2e/tests/e2e/main.rs @@ -12,7 +12,6 @@ mod banned_users; mod buffers; mod contract_revert; mod cors; -mod cow_amm; mod database; mod debug_order; mod deprecated_endpoints; diff --git a/crates/shared/src/arguments.rs b/crates/shared/src/arguments.rs index 5687741882..41a8c6de44 100644 --- a/crates/shared/src/arguments.rs +++ b/crates/shared/src/arguments.rs @@ -49,7 +49,7 @@ macro_rules! logging_args_with_default_filter { logging_args_with_default_filter!( LoggingArguments, "info,autopilot=debug,driver=debug,observe=info,observe::http_body=debug,orderbook=debug,\ - solver=debug,shared=debug,cow_amm=debug" + solver=debug,shared=debug" ); #[derive(Debug, clap::Parser)] diff --git a/database/sql/V113__drop_cow_amms.sql b/database/sql/V113__drop_cow_amms.sql new file mode 100644 index 0000000000..2a2f4b44b7 --- /dev/null +++ b/database/sql/V113__drop_cow_amms.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS cow_amms;