UNPKG

@cryptoalgebra/integral-periphery

Version:

Peripheral smart contracts of Algebra Integral protocol

351 lines 51.4 kB
{ "_format": "hh-sol-artifact-1", "contractName": "QuoterV2", "sourceName": "contracts/lens/QuoterV2.sol", "abi": [ { "inputs": [ { "internalType": "address", "name": "_factory", "type": "address" }, { "internalType": "address", "name": "_WNativeToken", "type": "address" }, { "internalType": "address", "name": "_poolDeployer", "type": "address" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "WNativeToken", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "int256", "name": "amount0Delta", "type": "int256" }, { "internalType": "int256", "name": "amount1Delta", "type": "int256" }, { "internalType": "bytes", "name": "callbackData", "type": "bytes" } ], "name": "algebraSwapCallback", "outputs": [], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "factory", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "poolDeployer", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes", "name": "path", "type": "bytes" }, { "internalType": "bytes[]", "name": "pluginsData", "type": "bytes[]" }, { "internalType": "uint256", "name": "amountInRequired", "type": "uint256" } ], "name": "quoteExactInput", "outputs": [ { "internalType": "uint256[]", "name": "amountOutList", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "amountInList", "type": "uint256[]" }, { "internalType": "uint160[]", "name": "sqrtPriceX96AfterList", "type": "uint160[]" }, { "internalType": "uint32[]", "name": "initializedTicksCrossedList", "type": "uint32[]" }, { "internalType": "uint256", "name": "gasEstimate", "type": "uint256" }, { "internalType": "uint16[]", "name": "feeList", "type": "uint16[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "bytes", "name": "pluginData", "type": "bytes" }, { "internalType": "address", "name": "tokenIn", "type": "address" }, { "internalType": "address", "name": "tokenOut", "type": "address" }, { "internalType": "address", "name": "deployer", "type": "address" }, { "internalType": "uint256", "name": "amountIn", "type": "uint256" }, { "internalType": "uint160", "name": "limitSqrtPrice", "type": "uint160" } ], "internalType": "struct IQuoterV2.QuoteExactInputSingleParams", "name": "params", "type": "tuple" } ], "name": "quoteExactInputSingle", "outputs": [ { "internalType": "uint256", "name": "amountOut", "type": "uint256" }, { "internalType": "uint256", "name": "amountIn", "type": "uint256" }, { "internalType": "uint160", "name": "sqrtPriceX96After", "type": "uint160" }, { "internalType": "uint32", "name": "initializedTicksCrossed", "type": "uint32" }, { "internalType": "uint256", "name": "gasEstimate", "type": "uint256" }, { "internalType": "uint16", "name": "fee", "type": "uint16" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes", "name": "path", "type": "bytes" }, { "internalType": "bytes[]", "name": "pluginsData", "type": "bytes[]" }, { "internalType": "uint256", "name": "amountOutRequired", "type": "uint256" } ], "name": "quoteExactOutput", "outputs": [ { "internalType": "uint256[]", "name": "amountOutList", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "amountInList", "type": "uint256[]" }, { "internalType": "uint160[]", "name": "sqrtPriceX96AfterList", "type": "uint160[]" }, { "internalType": "uint32[]", "name": "initializedTicksCrossedList", "type": "uint32[]" }, { "internalType": "uint256", "name": "gasEstimate", "type": "uint256" }, { "internalType": "uint16[]", "name": "feeList", "type": "uint16[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "bytes", "name": "pluginData", "type": "bytes" }, { "internalType": "address", "name": "tokenIn", "type": "address" }, { "internalType": "address", "name": "tokenOut", "type": "address" }, { "internalType": "address", "name": "deployer", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint160", "name": "limitSqrtPrice", "type": "uint160" } ], "internalType": "struct IQuoterV2.QuoteExactOutputSingleParams", "name": "params", "type": "tuple" } ], "name": "quoteExactOutputSingle", "outputs": [ { "internalType": "uint256", "name": "amountOut", "type": "uint256" }, { "internalType": "uint256", "name": "amountIn", "type": "uint256" }, { "internalType": "uint160", "name": "sqrtPriceX96After", "type": "uint160" }, { "internalType": "uint32", "name": "initializedTicksCrossed", "type": "uint32" }, { "internalType": "uint256", "name": "gasEstimate", "type": "uint256" }, { "internalType": "uint16", "name": "fee", "type": "uint16" } ], "stateMutability": "nonpayable", "type": "function" } ], "bytecode": "0x60e06040523480156200001157600080fd5b5060405162002a9b38038062002a9b83398101604081905262000034916200006e565b6001600160a01b03928316608052821660a0521660c052620000b8565b80516001600160a01b03811681146200006957600080fd5b919050565b6000806000606084860312156200008457600080fd5b6200008f8462000051565b92506200009f6020850162000051565b9150620000af6040850162000051565b90509250925092565b60805160a05160c0516129a6620000f560003960006101ac01526000818160e8015281816109410152611224015260006101d301526129a66000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80633a7f71261161005b5780633a7f71261461012f578063723c4f22146101945780638af3ac85146101a7578063c45a0155146101ce57600080fd5b806306f8e56c1461008d578063222e5728146100bb5780632c8958f6146100ce5780633119049a146100e3575b600080fd5b6100a061009b366004611f2d565b6101f5565b6040516100b2969594939291906120af565b60405180910390f35b6100a06100c9366004611f2d565b610550565b6100e16100dc36600461215d565b610892565b005b61010a7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b2565b61014261013d366004612296565b610b3f565b60408051968752602087019590955273ffffffffffffffffffffffffffffffffffffffff9093169385019390935263ffffffff166060840152608083019190915261ffff1660a082015260c0016100b2565b6101426101a2366004612296565b610e79565b61010a7f000000000000000000000000000000000000000000000000000000000000000081565b61010a7f000000000000000000000000000000000000000000000000000000000000000081565b6060806060806000606061020889611132565b67ffffffffffffffff81111561022057610220611dc6565b604051908082528060200260200182016040528015610249578160200160208202803683370190505b50955061025589611132565b67ffffffffffffffff81111561026d5761026d611dc6565b604051908082528060200260200182016040528015610296578160200160208202803683370190505b5094506102a289611132565b67ffffffffffffffff8111156102ba576102ba611dc6565b6040519080825280602002602001820160405280156102e3578160200160208202803683370190505b5093506102ef89611132565b67ffffffffffffffff81111561030757610307611dc6565b604051908082528060200260200182016040528015610330578160200160208202803683370190505b50925061033c89611132565b67ffffffffffffffff81111561035457610354611dc6565b60405190808252806020026020018201604052801561037d578160200160208202803683370190505b50905060005b6040805160c081018252606080825260006020830181905292820183905281018290526080810182905260a081018290529080806103c08e61115d565b9250925092508c85815181106103d8576103d86122cb565b602090810291909101810151855273ffffffffffffffffffffffffffffffffffffffff91821690850152908116606084015216604082015260808101899052600061042282610b3f565b8e8981518110610434576104346122cb565b602002602001018e8a8151811061044d5761044d6122cb565b602002602001018e8b81518110610466576104666122cb565b602002602001018e8c8151811061047f5761047f6122cb565b602002602001018d8d81518110610498576104986122cb565b61ffff9096166020968702919091019095019490945263ffffffff90951690925273ffffffffffffffffffffffffffffffffffffffff9094169092529290529190915288519091508890849081106104f2576104f26122cb565b6020026020010151995080856105089190612329565b9450826105148161233c565b9350506105208c611197565b156105355761052e8c6111cf565b9b5061053d565b505050610544565b5050610383565b93975093979195509350565b6060806060806000606061056389611132565b67ffffffffffffffff81111561057b5761057b611dc6565b6040519080825280602002602001820160405280156105a4578160200160208202803683370190505b5095506105b089611132565b67ffffffffffffffff8111156105c8576105c8611dc6565b6040519080825280602002602001820160405280156105f1578160200160208202803683370190505b5094506105fd89611132565b67ffffffffffffffff81111561061557610615611dc6565b60405190808252806020026020018201604052801561063e578160200160208202803683370190505b50935061064a89611132565b67ffffffffffffffff81111561066257610662611dc6565b60405190808252806020026020018201604052801561068b578160200160208202803683370190505b50925061069789611132565b67ffffffffffffffff8111156106af576106af611dc6565b6040519080825280602002602001820160405280156106d8578160200160208202803683370190505b50905060005b6040805160c081018252606080825260006020830181905292820183905281018290526080810182905260a0810182905290808061071b8e61115d565b9250925092508c8581518110610733576107336122cb565b602090810291909101810151855273ffffffffffffffffffffffffffffffffffffffff93841690850152908216606084015216604082015260808101899052600061077d82610e79565b8e898151811061078f5761078f6122cb565b602002602001018e8a815181106107a8576107a86122cb565b602002602001018e8b815181106107c1576107c16122cb565b602002602001018e8c815181106107da576107da6122cb565b602002602001018d8d815181106107f3576107f36122cb565b61ffff9096166020968702919091019095019490945263ffffffff90951690925273ffffffffffffffffffffffffffffffffffffffff90941690925292905291909152895190915089908490811061084d5761084d6122cb565b6020026020010151995080856108639190612329565b94508261086f8161233c565b93505061087b8c611197565b15610535576108898c6111cf565b9b5050506106de565b60008313806108a15750600082135b61090c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5a65726f206c697175696469747920737761700000000000000000000000000060448201526064015b60405180910390fd5b60008180602001905181019061092291906123dd565b90506000806000610936846020015161115d565b9250925092506109687f00000000000000000000000000000000000000000000000000000000000000008385846111fe565b506000806000808a136109b4578573ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610898b6109af90612516565b6109ee565b8373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16108a8a6109ee90612516565b9250925092506000610a0186888761121d565b905060008060008373ffffffffffffffffffffffffffffffffffffffff1663e76c01e46040518163ffffffff1660e01b815260040160c060405180830381865afa158015610a53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a779190612572565b5050509250925092508615610aa95760405185815286602082015283604082015282606082015281608082015260e081fd5b60005415610b1c576000548514610b1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4e6f742072656365697665642066756c6c20616d6f756e744f757400000000006044820152606401610903565b60405185815286602082015283604082015282606082015281608082015260e081fd5b6000806000806000806000876040015173ffffffffffffffffffffffffffffffffffffffff16886020015173ffffffffffffffffffffffffffffffffffffffff161090506000610b9c89606001518a602001518b6040015161121d565b90508860a0015173ffffffffffffffffffffffffffffffffffffffff16600003610bc95760808901516000555b60005a9050600060405180608001604052808c6000015181526020018c602001518d606001518e60400151604051602001610c4493929190606093841b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000908116825292841b83166014820152921b166028820152603c0190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181529181529082526000602080840182905282518281529081018352929091019190610ca9565b6060815260200190600190039081610c945790505b5081525090508273ffffffffffffffffffffffffffffffffffffffff1663128acb083086610cda8f6080015161125b565b610ce390612516565b8f60a0015173ffffffffffffffffffffffffffffffffffffffff16600014610d0f578f60a00151610d48565b88610d3857610d33600173fffd8963efd1fc6a506488495d951d5263988d266125f9565b610d48565b610d486401000276a3600161262d565b86604051602001610d5991906126a4565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401610d88959493929190612783565b60408051808303816000875af1925050508015610de0575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610ddd918101906127d5565b60015b610e69573d808015610e0e576040519150601f19603f3d011682016040523d82523d6000602084013e610e13565b606091505b505a610e1f90846127f9565b96508b60a0015173ffffffffffffffffffffffffffffffffffffffff16600003610e4857600080555b610e5381858961126f565b9a509a509a509a509a509a505050505050610e70565b5050505050505b91939550919395565b6000806000806000806000876040015173ffffffffffffffffffffffffffffffffffffffff16886020015173ffffffffffffffffffffffffffffffffffffffff161090506000610ed689606001518a602001518b6040015161121d565b905060005a9050600060405180608001604052808c6000015181526020018c602001518d606001518e60400151604051602001610f5393929190606093841b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000908116825292841b83166014820152921b166028820152603c0190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181529181529082526000602080840182905282518281529081018352929091019190610fb8565b6060815260200190600190039081610fa35790505b5081525090508273ffffffffffffffffffffffffffffffffffffffff1663128acb083086610fe98f6080015161125b565b8f60a0015173ffffffffffffffffffffffffffffffffffffffff16600014611015578f60a0015161104e565b8861103e57611039600173fffd8963efd1fc6a506488495d951d5263988d266125f9565b61104e565b61104e6401000276a3600161262d565b8660405160200161105f91906126a4565b6040516020818303038152906040526040518663ffffffff1660e01b815260040161108e959493929190612783565b60408051808303816000875af19250505080156110e6575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526110e3918101906127d5565b60015b610e69573d808015611114576040519150601f19603f3d011682016040523d82523d6000602084013e611119565b606091505b505a61112590846127f9565b9650610e5381858961126f565b600061113f601480612329565b6014835161114d91906127f9565b611157919061283b565b92915050565b6000808061116b848261133f565b925061117884601461133f565b915061118f611188601480612329565b859061133f565b929491935050565b60006111a4601480612329565b60146111b08180612329565b6111ba9190612329565b6111c49190612329565b825110159050919050565b60606111576111df601480612329565b6111ea601480612329565b84516111f691906127f9565b8491906113c8565b60006112148561120f868686611534565b6115c2565b95945050505050565b60006112537f000000000000000000000000000000000000000000000000000000000000000061124e868686611534565b61164f565b949350505050565b80600081121561126a57600080fd5b919050565b6000806000806000806000808973ffffffffffffffffffffffffffffffffffffffff1663e76c01e46040518163ffffffff1660e01b815260040160c060405180830381865afa1580156112c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ea9190612572565b509295506112fe93508e9250611884915050565b939b509199509750909350905061132c73ffffffffffffffffffffffffffffffffffffffff8b16838361192e565b9450889350505093975093979195509350565b600081601401835110156113af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e647300000000000000000000006044820152606401610903565b5001602001516c01000000000000000000000000900490565b60608182601f011015611437576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610903565b818301845110156114a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610903565b6060821580156114c3576040519150600082526020820160405261152b565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156114fc5780518352602092830192016114e4565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051606081018252600080825260208201819052918101919091528173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161115611589579091905b506040805160608101825273ffffffffffffffffffffffffffffffffffffffff9485168152928416602084015292169181019190915290565b60006115ce838361164f565b90503373ffffffffffffffffffffffffffffffffffffffff821614611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f496e76616c69642063616c6c6572206f662063616c6c6261636b0000000000006044820152606401610903565b6000816040015173ffffffffffffffffffffffffffffffffffffffff16826020015173ffffffffffffffffffffffffffffffffffffffff16106116ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e76616c6964206f72646572206f6620746f6b656e730000000000000000006044820152606401610903565b8151839073ffffffffffffffffffffffffffffffffffffffff1615611767578251602080850151604080870151905161175394930173ffffffffffffffffffffffffffffffffffffffff93841681529183166020830152909116604082015260600190565b6040516020818303038152906040526117b1565b60208084015160408086015190516117a1930173ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b6040516020818303038152906040525b805160209182012060405161184793927f62441ebe4e4315cf3d49d5957f94d66b253dbabe7006f34ad7f70947e60bf15c91017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b6000806000806000855160e014611908576000865111611900576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f556e6578706563746564206572726f72000000000000000000000000000000006044820152606401610903565b855186602001fd5b8580602001905181019061191c919061284f565b939a9299509097509550909350915050565b6000808080808080600289900b60081d8161194b6101008c6128a8565b905060028a900b60081d60006119636101008d6128a8565b905060008160ff166001901b8f73ffffffffffffffffffffffffffffffffffffffff1663c677e3e0856040518263ffffffff1660e01b81526004016119b1919060019190910b815260200190565b602060405180830381865afa1580156119ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f291906128ca565b16118015611a7957508d73ffffffffffffffffffffffffffffffffffffffff1663d0c93a7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6a91906128e3565b611a74908d6128a8565b60020b155b8015611a8a57508b60020b8d60020b135b945060008360ff166001901b8f73ffffffffffffffffffffffffffffffffffffffff1663c677e3e0876040518263ffffffff1660e01b8152600401611ad8919060019190910b815260200190565b602060405180830381865afa158015611af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1991906128ca565b16118015611ba057508d73ffffffffffffffffffffffffffffffffffffffff1663d0c93a7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9191906128e3565b611b9b908e6128a8565b60020b155b8015611bb157508b60020b8d60020b125b95508160010b8460010b1280611bdd57508160010b8460010b148015611bdd57508060ff168360ff1611155b15611bf357839950829750819850809650611c00565b8199508097508398508296505b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff87161b9150505b8560010b8760010b13611d64578560010b8760010b03611c7b57611c518460ff612905565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff919091161c165b6040517fc677e3e0000000000000000000000000000000000000000000000000000000008152600188900b6004820152600090829073ffffffffffffffffffffffffffffffffffffffff8e169063c677e3e090602401602060405180830381865afa158015611cee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1291906128ca565b169050611d1e81611d9a565b611d2c9061ffff168a61291e565b985087611d388161293b565b9850507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff915050611c2c565b8115611d7857611d7560018961295b565b97505b8215611d8c57611d8960018961295b565b97505b505050505050509392505050565b6000805b82156111575780611dae81612978565b9150611dbd90506001846127f9565b83169250611d9e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715611e1857611e18611dc6565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611e6557611e65611dc6565b604052919050565b600067ffffffffffffffff821115611e8757611e87611dc6565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112611ec457600080fd5b8135611ed7611ed282611e6d565b611e1e565b818152846020838601011115611eec57600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff821115611f2357611f23611dc6565b5060051b60200190565b600080600060608486031215611f4257600080fd5b833567ffffffffffffffff80821115611f5a57600080fd5b611f6687838801611eb3565b9450602091508186013581811115611f7d57600080fd5b8601601f81018813611f8e57600080fd5b8035611f9c611ed282611f09565b81815260059190911b8201840190848101908a831115611fbb57600080fd5b8584015b83811015611ff357803586811115611fd75760008081fd5b611fe58d8983890101611eb3565b845250918601918601611fbf565b50979a979950505050604095909501359450505050565b600081518084526020808501945080840160005b8381101561203a5781518752958201959082019060010161201e565b509495945050505050565b600081518084526020808501945080840160005b8381101561203a57815163ffffffff1687529582019590820190600101612059565b600081518084526020808501945080840160005b8381101561203a57815161ffff168752958201959082019060010161208f565b60c0815260006120c260c083018961200a565b6020838203818501526120d5828a61200a565b84810360408601528851808252828a0193509082019060005b8181101561212057845173ffffffffffffffffffffffffffffffffffffffff16835293830193918301916001016120ee565b505084810360608601526121348189612045565b9250505084608084015282810360a0840152612150818561207b565b9998505050505050505050565b60008060006060848603121561217257600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561219757600080fd5b6121a386828701611eb3565b9150509250925092565b73ffffffffffffffffffffffffffffffffffffffff811681146121cf57600080fd5b50565b803561126a816121ad565b600060c082840312156121ef57600080fd5b60405160c0810167ffffffffffffffff828210818311171561221357612213611dc6565b81604052829350843591508082111561222b57600080fd5b5061223885828601611eb3565b8252506020830135612249816121ad565b6020820152604083013561225c816121ad565b6040820152606083013561226f816121ad565b60608201526080838101359082015261228a60a084016121d2565b60a08201525092915050565b6000602082840312156122a857600080fd5b813567ffffffffffffffff8111156122bf57600080fd5b611253848285016121dd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115611157576111576122fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361236d5761236d6122fa565b5060010190565b60005b8381101561238f578181015183820152602001612377565b50506000910152565b600082601f8301126123a957600080fd5b81516123b7611ed282611e6d565b8181528460208386010111156123cc57600080fd5b611253826020830160208701612374565b600060208083850312156123f057600080fd5b825167ffffffffffffffff8082111561240857600080fd5b908401906080828703121561241c57600080fd5b612424611df5565b82518281111561243357600080fd5b61243f88828601612398565b825250838301518281111561245357600080fd5b61245f88828601612398565b85830152506040830151612472816121ad565b604082015260608301518281111561248957600080fd5b80840193505086601f84011261249e57600080fd5b82516124ac611ed282611f09565b81815260059190911b840185019085810190898311156124cb57600080fd5b8686015b83811015612503578051868111156124e75760008081fd5b6124f58c8a838b0101612398565b8452509187019187016124cf565b5060608401525090979650505050505050565b60007f80000000000000000000000000000000000000000000000000000000000000008203612547576125476122fa565b5060000390565b8051600281900b811461126a57600080fd5b805161ffff8116811461126a57600080fd5b60008060008060008060c0878903121561258b57600080fd5b8651612596816121ad565b95506125a46020880161254e565b94506125b260408801612560565b9350606087015160ff811681146125c857600080fd5b92506125d660808801612560565b915060a087015180151581146125eb57600080fd5b809150509295509295509295565b73ffffffffffffffffffffffffffffffffffffffff828116828216039080821115612626576126266122fa565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff818116838216019080821115612626576126266122fa565b60008151808452612672816020860160208601612374565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000602080835283516080828501526126c060a085018261265a565b9050818501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808684030160408701526126fb838361265a565b925073ffffffffffffffffffffffffffffffffffffffff604088015116606087015260608701519150808684030160808701528282518085528585019150858160051b860101868501945060005b82811015612775578487830301845261276382875161265a565b95880195938801939150600101612749565b509998505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a060808301526127ca60a083018461265a565b979650505050505050565b600080604083850312156127e857600080fd5b505080516020909101519092909150565b81810381811115611157576111576122fa565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261284a5761284a61280c565b500490565b600080600080600060a0868803121561286757600080fd5b85519450602086015193506040860151612880816121ad565b925061288e6060870161254e565b915061289c60808701612560565b90509295509295909350565b60008260020b806128bb576128bb61280c565b808360020b0791505092915050565b6000602082840312156128dc57600080fd5b5051919050565b6000602082840312156128f557600080fd5b6128fe8261254e565b9392505050565b60ff8281168282160390811115611157576111576122fa565b63ffffffff818116838216019080821115612626576126266122fa565b60008160010b617fff8103612952576129526122fa565b60010192915050565b63ffffffff828116828216039080821115612626576126266122fa565b600061ffff80831681810361298f5761298f6122fa565b600101939250505056fea164736f6c6343000814000a", "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c80633a7f71261161005b5780633a7f71261461012f578063723c4f22146101945780638af3ac85146101a7578063c45a0155146101ce57600080fd5b806306f8e56c1461008d578063222e5728146100bb5780632c8958f6146100ce5780633119049a146100e3575b600080fd5b6100a061009b366004611f2d565b6101f5565b6040516100b2969594939291906120af565b60405180910390f35b6100a06100c9366004611f2d565b610550565b6100e16100dc36600461215d565b610892565b005b61010a7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b2565b61014261013d366004612296565b610b3f565b60408051968752602087019590955273ffffffffffffffffffffffffffffffffffffffff9093169385019390935263ffffffff166060840152608083019190915261ffff1660a082015260c0016100b2565b6101426101a2366004612296565b610e79565b61010a7f000000000000000000000000000000000000000000000000000000000000000081565b61010a7f000000000000000000000000000000000000000000000000000000000000000081565b6060806060806000606061020889611132565b67ffffffffffffffff81111561022057610220611dc6565b604051908082528060200260200182016040528015610249578160200160208202803683370190505b50955061025589611132565b67ffffffffffffffff81111561026d5761026d611dc6565b604051908082528060200260200182016040528015610296578160200160208202803683370190505b5094506102a289611132565b67ffffffffffffffff8111156102ba576102ba611dc6565b6040519080825280602002602001820160405280156102e3578160200160208202803683370190505b5093506102ef89611132565b67ffffffffffffffff81111561030757610307611dc6565b604051908082528060200260200182016040528015610330578160200160208202803683370190505b50925061033c89611132565b67ffffffffffffffff81111561035457610354611dc6565b60405190808252806020026020018201604052801561037d578160200160208202803683370190505b50905060005b6040805160c081018252606080825260006020830181905292820183905281018290526080810182905260a081018290529080806103c08e61115d565b9250925092508c85815181106103d8576103d86122cb565b602090810291909101810151855273ffffffffffffffffffffffffffffffffffffffff91821690850152908116606084015216604082015260808101899052600061042282610b3f565b8e8981518110610434576104346122cb565b602002602001018e8a8151811061044d5761044d6122cb565b602002602001018e8b81518110610466576104666122cb565b602002602001018e8c8151811061047f5761047f6122cb565b602002602001018d8d81518110610498576104986122cb565b61ffff9096166020968702919091019095019490945263ffffffff90951690925273ffffffffffffffffffffffffffffffffffffffff9094169092529290529190915288519091508890849081106104f2576104f26122cb565b6020026020010151995080856105089190612329565b9450826105148161233c565b9350506105208c611197565b156105355761052e8c6111cf565b9b5061053d565b505050610544565b5050610383565b93975093979195509350565b6060806060806000606061056389611132565b67ffffffffffffffff81111561057b5761057b611dc6565b6040519080825280602002602001820160405280156105a4578160200160208202803683370190505b5095506105b089611132565b67ffffffffffffffff8111156105c8576105c8611dc6565b6040519080825280602002602001820160405280156105f1578160200160208202803683370190505b5094506105fd89611132565b67ffffffffffffffff81111561061557610615611dc6565b60405190808252806020026020018201604052801561063e578160200160208202803683370190505b50935061064a89611132565b67ffffffffffffffff81111561066257610662611dc6565b60405190808252806020026020018201604052801561068b578160200160208202803683370190505b50925061069789611132565b67ffffffffffffffff8111156106af576106af611dc6565b6040519080825280602002602001820160405280156106d8578160200160208202803683370190505b50905060005b6040805160c081018252606080825260006020830181905292820183905281018290526080810182905260a0810182905290808061071b8e61115d565b9250925092508c8581518110610733576107336122cb565b602090810291909101810151855273ffffffffffffffffffffffffffffffffffffffff93841690850152908216606084015216604082015260808101899052600061077d82610e79565b8e898151811061078f5761078f6122cb565b602002602001018e8a815181106107a8576107a86122cb565b602002602001018e8b815181106107c1576107c16122cb565b602002602001018e8c815181106107da576107da6122cb565b602002602001018d8d815181106107f3576107f36122cb565b61ffff9096166020968702919091019095019490945263ffffffff90951690925273ffffffffffffffffffffffffffffffffffffffff90941690925292905291909152895190915089908490811061084d5761084d6122cb565b6020026020010151995080856108639190612329565b94508261086f8161233c565b93505061087b8c611197565b15610535576108898c6111cf565b9b5050506106de565b60008313806108a15750600082135b61090c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5a65726f206c697175696469747920737761700000000000000000000000000060448201526064015b60405180910390fd5b60008180602001905181019061092291906123dd565b90506000806000610936846020015161115d565b9250925092506109687f00000000000000000000000000000000000000000000000000000000000000008385846111fe565b506000806000808a136109b4578573ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610898b6109af90612516565b6109ee565b8373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16108a8a6109ee90612516565b9250925092506000610a0186888761121d565b905060008060008373ffffffffffffffffffffffffffffffffffffffff1663e76c01e46040518163ffffffff1660e01b815260040160c060405180830381865afa158015610a53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a779190612572565b5050509250925092508615610aa95760405185815286602082015283604082015282606082015281608082015260e081fd5b60005415610b1c576000548514610b1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4e6f742072656365697665642066756c6c20616d6f756e744f757400000000006044820152606401610903565b60405185815286602082015283604082015282606082015281608082015260e081fd5b6000806000806000806000876040015173ffffffffffffffffffffffffffffffffffffffff16886020015173ffffffffffffffffffffffffffffffffffffffff161090506000610b9c89606001518a602001518b6040015161121d565b90508860a0015173ffffffffffffffffffffffffffffffffffffffff16600003610bc95760808901516000555b60005a9050600060405180608001604052808c6000015181526020018c602001518d606001518e60400151604051602001610c4493929190606093841b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000908116825292841b83166014820152921b166028820152603c0190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181529181529082526000602080840182905282518281529081018352929091019190610ca9565b6060815260200190600190039081610c945790505b5081525090508273ffffffffffffffffffffffffffffffffffffffff1663128acb083086610cda8f6080015161125b565b610ce390612516565b8f60a0015173ffffffffffffffffffffffffffffffffffffffff16600014610d0f578f60a00151610d48565b88610d3857610d33600173fffd8963efd1fc6a506488495d951d5263988d266125f9565b610d48565b610d486401000276a3600161262d565b86604051602001610d5991906126a4565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401610d88959493929190612783565b60408051808303816000875af1925050508015610de0575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610ddd918101906127d5565b60015b610e69573d808015610e0e576040519150601f19603f3d011682016040523d82523d6000602084013e610e13565b606091505b505a610e1f90846127f9565b96508b60a0015173ffffffffffffffffffffffffffffffffffffffff16600003610e4857600080555b610e5381858961126f565b9a509a509a509a509a509a505050505050610e70565b5050505050505b91939550919395565b6000806000806000806000876040015173ffffffffffffffffffffffffffffffffffffffff16886020015173ffffffffffffffffffffffffffffffffffffffff161090506000610ed689606001518a602001518b6040015161121d565b905060005a9050600060405180608001604052808c6000015181526020018c602001518d606001518e60400151604051602001610f5393929190606093841b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000908116825292841b83166014820152921b166028820152603c0190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181529181529082526000602080840182905282518281529081018352929091019190610fb8565b6060815260200190600190039081610fa35790505b5081525090508273ffffffffffffffffffffffffffffffffffffffff1663128acb083086610fe98f6080015161125b565b8f60a0015173ffffffffffffffffffffffffffffffffffffffff16600014611015578f60a0015161104e565b8861103e57611039600173fffd8963efd1fc6a506488495d951d5263988d266125f9565b61104e565b61104e6401000276a3600161262d565b8660405160200161105f91906126a4565b6040516020818303038152906040526040518663ffffffff1660e01b815260040161108e959493929190612783565b60408051808303816000875af19250505080156110e6575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526110e3918101906127d5565b60015b610e69573d808015611114576040519150601f19603f3d011682016040523d82523d6000602084013e611119565b606091505b505a61112590846127f9565b9650610e5381858961126f565b600061113f601480612329565b6014835161114d91906127f9565b611157919061283b565b92915050565b6000808061116b848261133f565b925061117884601461133f565b915061118f611188601480612329565b859061133f565b929491935050565b60006111a4601480612329565b60146111b08180612329565b6111ba9190612329565b6111c49190612329565b825110159050919050565b60606111576111df601480612329565b6111ea601480612329565b84516111f691906127f9565b8491906113c8565b60006112148561120f868686611534565b6115c2565b95945050505050565b60006112537f000000000000000000000000000000000000000000000000000000000000000061124e868686611534565b61164f565b949350505050565b80600081121561126a57600080fd5b919050565b6000806000806000806000808973ffffffffffffffffffffffffffffffffffffffff1663e76c01e46040518163ffffffff1660e01b815260040160c060405180830381865afa1580156112c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ea9190612572565b509295506112fe93508e9250611884915050565b939b509199509750909350905061132c73ffffffffffffffffffffffffffffffffffffffff8b16838361192e565b9450889350505093975093979195509350565b600081601401835110156113af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e647300000000000000000000006044820152606401610903565b5001602001516c01000000000000000000000000900490565b60608182601f011015611437576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610903565b818301845110156114a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610903565b6060821580156114c3576040519150600082526020820160405261152b565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156114fc5780518352602092830192016114e4565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051606081018252600080825260208201819052918101919091528173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161115611589579091905b506040805160608101825273ffffffffffffffffffffffffffffffffffffffff9485168152928416602084015292169181019190915290565b60006115ce838361164f565b90503373ffffffffffffffffffffffffffffffffffffffff821614611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f496e76616c69642063616c6c6572206f662063616c6c6261636b0000000000006044820152606401610903565b6000816040015173ffffffffffffffffffffffffffffffffffffffff16826020015173ffffffffffffffffffffffffffffffffffffffff16106116ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e76616c6964206f72646572206f6620746f6b656e730000000000000000006044820152606401610903565b8151839073ffffffffffffffffffffffffffffffffffffffff1615611767578251602080850151604080870151905161175394930173ffffffffffffffffffffffffffffffffffffffff93841681529183166020830152909116604082015260600190565b6040516020818303038152906040526117b1565b60208084015160408086015190516117a1930173ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b6040516020818303038152906040525b805160209182012060405161184793927f62441ebe4e4315cf3d49d5957f94d66b253dbabe7006f34ad7f70947e60bf15c91017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b6000806000806000855160e014611908576000865111611900576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f556e6578706563746564206572726f72000000000000000000000000000000006044820152606401610903565b855186602001fd5b8580602001905181019061191c919061284f565b939a9299509097509550909350915050565b6000808080808080600289900b60081d8161194b6101008c6128a8565b905060028a900b60081d60006119636101008d6128a8565b905060008160ff166001901b8f73ffffffffffffffffffffffffffffffffffffffff1663c677e3e0856040518263ffffffff1660e01b81526004016119b1919060019190910b815260200190565b602060405180830381865afa1580156119ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f291906128ca565b16118015611a7957508d73ffffffffffffffffffffffffffffffffffffffff1663d0c93a7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6a91906128e3565b611a74908d6128a8565b60020b155b8015611a8a57508b60020b8d60020b135b945060008360ff166001901b8f73ffffffffffffffffffffffffffffffffffffffff1663c677e3e0876040518263ffffffff1660e01b8152600401611ad8919060019190910b815260200190565b602060405180830381865afa158015611af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1991906128ca565b16118015611ba057508d73ffffffffffffffffffffffffffffffffffffffff1663d0c93a7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9191906128e3565b611b9b908e6128a8565b60020b155b8015611bb157508b60020b8d60020b125b95508160010b8460010b1280611bdd57508160010b8460010b148015611bdd57508060ff168360ff1611155b15611bf357839950829750819850809650611c00565b8199508097508398508296505b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff87161b9150505b8560010b8760010b13611d64578560010b8760010b03611c7b57611c518460ff612905565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff919091161c165b6040517fc677e3e0000000000000000000000000000000000000000000000000000000008152600188900b6004820152600090829073ffffffffffffffffffffffffffffffffffffffff8e169063c677e3e090602401602060405180830381865afa158015611cee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1291906128ca565b169050611d1e81611d9a565b611d2c9061ffff168a61291e565b985087611d388161293b565b9850507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff915050611c2c565b8115611d7857611d7560018961295b565b97505b8215611d8c57611d8960018961295b565b97505b505050505050509392505050565b6000805b82156111575780611dae81612978565b9150611dbd90506001846127f9565b83169250611d9e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715611e1857611e18611dc6565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611e6557611e65611dc6565b604052919050565b600067ffffffffffffffff821115611e8757611e87611dc6565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112611ec457600080fd5b8135611ed7611ed282611e6d565b611e1e565b818152846020838601011115611eec57600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff821115611f2357611f23611dc6565b5060051b60200190565b600080600060608486031215611f4257600080fd5b833567ffffffffffffffff80821115611f5a57600080fd5b611f6687838801611eb3565b9450602091508186013581811115611f7d57600080fd5b8601601f81018813611f8e57600080fd5b8035611f9c611ed282611f09565b81815260059190911b8201840190848101908a831115611fbb57600080fd5b8584015b83811015611ff357803586811115611fd75760008081fd5b611fe58d8983890101611eb3565b845250918601918601611fbf565b50979a979950505050604095909501359450505050565b600081518084526020808501945080840160005b8381101561203a5781518752958201959082019060010161201e565b509495945050505050565b600081518084526020808501945080840160005b8381101561203a57815163ffffffff1687529582019590820190600101612059565b600081518084526020808501945080840160005b8381101561203a57815161ffff168752958201959082019060010161208f565b60c0815260006120c260c083018961200a565b6020838203818501526120d5828a61200a565b84810360408601528851808252828a0193509082019060005b8181101561212057845173ffffffffffffffffffffffffffffffffffffffff16835293830193918301916001016120ee565b505084810360608601526121348189612045565b9250505084608084015282810360a0840152612150818561207b565b9998505050505050505050565b60008060006060848603121561217257600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561219757600080fd5b6121a386828701611eb3565b9150509250925092565b73ffffffffffffffffffffffffffffffffffffffff811681146121cf57600080fd5b50565b803561126a816121ad565b600060c082840312156121ef57600080fd5b60405160c0810167ffffffffffffffff828210818311171561221357612213611dc6565b81604052829350843591508082111561222b57600080fd5b5061223885828601611eb3565b8252506020830135612249816121ad565b6020820152604083013561225c816121ad565b6040820152606083013561226f816121ad565b60608201526080838101359082015261228a60a084016121d2565b60a08201525092915050565b6000602082840312156122a857600080fd5b813567ffffffffffffffff8111156122bf57600080fd5b611253848285016121dd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115611157576111576122fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361236d5761236d6122fa565b5060010190565b60005b8381101561238f578181015183820152602001612377565b50506000910152565b600082601f8301126123a957600080fd5b81516123b7611ed282611e6d565b8181528460208386010111156123cc57600080fd5b611253826020830160208701612374565b600060208083850312156123f057600080fd5b825167ffffffffffffffff8082111561240857600080fd5b908401906080828703121561241c57600080fd5b612424611df5565b82518281111561243357600080fd5b61243f88828601612398565b825250838301518281111561245357600080fd5b61245f88828601612398565b85830152506040830151612472816121ad565b604082015260608301518281111561248957600080fd5b80840193505086601f84011261249e57600080fd5b82516124ac611ed282611f09565b81815260059190911b840185019085810190898311156124cb57600080fd5b8686015b83811015612503578051868111156124e75760008081fd5b6124f58c8a838b0101612398565b8452509187019187016124cf565b5060608401525090979650505050505050565b60007f80000000000000000000000000000000000000000000000000000000000000008203612547576125476122fa565b5060000390565b8051600281900b811461126a57600080fd5b805161ffff8116811461126a57600080fd5b60008060008060008060c0878903121561258b57600080fd5b8651612596816121ad565b95506125a46020880161254e565b94506125b260408801612560565b9350606087015160ff811681146125c857600080fd5b92506125d660808801612560565b915060a087015180151581146125eb57600080fd5b809150509295509295509295565b73ffffffffffffffffffffffffffffffffffffffff828116828216039080821115612626576126266122fa565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff818116838216019080821115612626576126266122fa565b60008151808452612672816020860160208601612374565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000602080835283516080828501526126c060a085018261265a565b9050818501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808684030160408701526126fb838361265a565