UNPKG

@ensuro/swaplibrary

Version:

Solidity Library that implements swap using different plaforms with a homogeneneous interface

708 lines (707 loc) 34.3 kB
{ "_format": "hh-sol-artifact-1", "contractName": "P2PSwapRouter", "sourceName": "contracts/P2PSwapRouter.sol", "abi": [ { "inputs": [ { "internalType": "address", "name": "onBehalfOf", "type": "address" }, { "internalType": "address", "name": "admin", "type": "address" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "AccessControlBadConfirmation", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "bytes32", "name": "neededRole", "type": "bytes32" } ], "name": "AccessControlUnauthorizedAccount", "type": "error" }, { "inputs": [], "name": "AmountCannotBeZero", "type": "error" }, { "inputs": [], "name": "DeadlineInThePast", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "amountIn", "type": "uint256" }, { "internalType": "uint256", "name": "amountInMaximum", "type": "uint256" } ], "name": "InputAmountExceedsSlippage", "type": "error" }, { "inputs": [], "name": "NotImplemented", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "amountOut", "type": "uint256" }, { "internalType": "uint256", "name": "amountOutMinimum", "type": "uint256" } ], "name": "OutputAmountLessThanSlippage", "type": "error" }, { "inputs": [], "name": "RecipientCannotBeZero", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "token", "type": "address" } ], "name": "SafeERC20FailedOperation", "type": "error" }, { "inputs": [], "name": "TokenCannotBeZero", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "onBehalfOf", "type": "address" } ], "name": "OnBehalfOfChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "tokenIn", "type": "address" }, { "indexed": false, "internalType": "address", "name": "tokenOut", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "price", "type": "uint256" } ], "name": "PriceUpdated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "indexed": true, "internalType": "bytes32", "name": "previousAdminRole", "type": "bytes32" }, { "indexed": true, "internalType": "bytes32", "name": "newAdminRole", "type": "bytes32" } ], "name": "RoleAdminChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } ], "name": "RoleGranted", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } ], "name": "RoleRevoked", "type": "event" }, { "inputs": [], "name": "ADMIN_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "PRICER_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "SWAP_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "bytes", "name": "path", "type": "bytes" }, { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" }, { "internalType": "uint256", "name": "amountIn", "type": "uint256" }, { "internalType": "uint256", "name": "amountOutMinimum", "type": "uint256" } ], "internalType": "struct ISwapRouter.ExactInputParams", "name": "", "type": "tuple" } ], "name": "exactInput", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "address", "name": "tokenIn", "type": "address" }, { "internalType": "address", "name": "tokenOut", "type": "address" }, { "internalType": "uint24", "name": "fee", "type": "uint24" }, { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" }, { "internalType": "uint256", "name": "amountIn", "type": "uint256" }, { "internalType": "uint256", "name": "amountOutMinimum", "type": "uint256" }, { "internalType": "uint160", "name": "sqrtPriceLimitX96", "type": "uint160" } ], "internalType": "struct ISwapRouter.ExactInputSingleParams", "name": "params", "type": "tuple" } ], "name": "exactInputSingle", "outputs": [ { "internalType": "uint256", "name": "amountOut", "type": "uint256" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "bytes", "name": "path", "type": "bytes" }, { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" }, { "internalType": "uint256", "name": "amountOut", "type": "uint256" }, { "internalType": "uint256", "name": "amountInMaximum", "type": "uint256" } ], "internalType": "struct ISwapRouter.ExactOutputParams", "name": "", "type": "tuple" } ], "name": "exactOutput", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "address", "name": "tokenIn", "type": "address" }, { "internalType": "address", "name": "tokenOut", "type": "address" }, { "internalType": "uint24", "name": "fee", "type": "uint24" }, { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" }, { "internalType": "uint256", "name": "amountOut", "type": "uint256" }, { "internalType": "uint256", "name": "amountInMaximum", "type": "uint256" }, { "internalType": "uint160", "name": "sqrtPriceLimitX96", "type": "uint160" } ], "internalType": "struct ISwapRouter.ExactOutputSingleParams", "name": "params", "type": "tuple" } ], "name": "exactOutputSingle", "outputs": [ { "internalType": "uint256", "name": "amountIn", "type": "uint256" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "tokenIn", "type": "address" }, { "internalType": "address", "name": "tokenOut", "type": "address" } ], "name": "getCurrentPrice", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getOnBehalfOf", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" } ], "name": "getRoleAdmin", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "grantRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "hasRole", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "callerConfirmation", "type": "address" } ], "name": "renounceRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "revokeRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "tokenIn", "type": "address" }, { "internalType": "address", "name": "tokenOut", "type": "address" }, { "internalType": "uint256", "name": "price_", "type": "uint256" } ], "name": "setCurrentPrice", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "onBehalfOf", "type": "address" } ], "name": "setOnBehalfOf", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "int256", "name": "", "type": "int256" }, { "internalType": "int256", "name": "", "type": "int256" }, { "internalType": "bytes", "name": "", "type": "bytes" } ], "name": "uniswapV3SwapCallback", "outputs": [], "stateMutability": "pure", "type": "function" } ], "bytecode": "0x608060405234801561001057600080fd5b5060405161131038038061131083398101604081905261002f9161015d565b61003a60008261004b565b50610044826100f7565b5050610190565b6000828152602081815260408083206001600160a01b038516845290915281205460ff166100ed576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556100a53390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016100f1565b5060005b92915050565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f0d4942cd92e3890d7c5981c00a2fad602608157938bcd2c069ce005804288e3a90600090a250565b80516001600160a01b038116811461015857600080fd5b919050565b6000806040838503121561017057600080fd5b61017983610141565b915061018760208401610141565b90509250929050565b6111718061019f6000396000f3fe6080604052600436106101145760003560e01c8063a217fddf116100a0578063db16a55511610064578063db16a55514610319578063db3e21981461035f578063f28c04981461028a578063fa461e3314610372578063fbb812791461039257600080fd5b8063a217fddf14610275578063c04b8d591461028a578063caf031811461029d578063d4b7f403146102c5578063d547741f146102f957600080fd5b8063414bf389116100e7578063414bf389146101ce5780634562e015146101e157806370eceb6a1461020157806375b238fc1461022157806391d148541461025557600080fd5b806301ffc9a714610119578063248a9ca31461014e5780632f2ff15d1461018c57806336568abe146101ae575b600080fd5b34801561012557600080fd5b50610139610134366004610d90565b6103c6565b60405190151581526020015b60405180910390f35b34801561015a57600080fd5b5061017e610169366004610dba565b60009081526020819052604090206001015490565b604051908152602001610145565b34801561019857600080fd5b506101ac6101a7366004610def565b6103fd565b005b3480156101ba57600080fd5b506101ac6101c9366004610def565b610428565b61017e6101dc366004610e34565b610460565b3480156101ed57600080fd5b506101ac6101fc366004610e51565b61066f565b34801561020d57600080fd5b506101ac61021c366004610e8d565b610757565b34801561022d57600080fd5b5061017e7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b34801561026157600080fd5b50610139610270366004610def565b61078e565b34801561028157600080fd5b5061017e600081565b61017e610298366004610eba565b6107b7565b3480156102a957600080fd5b506002546040516001600160a01b039091168152602001610145565b3480156102d157600080fd5b5061017e7f499b8dbdbe4f7b12284c4a222a9951ce4488b43af4d09f42655d67f73b612fe181565b34801561030557600080fd5b506101ac610314366004610def565b6107d2565b34801561032557600080fd5b5061017e610334366004610ef7565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61017e61036d366004610e34565b6107f7565b34801561037e57600080fd5b506101ac61038d366004610f21565b6109d7565b34801561039e57600080fd5b5061017e7fc6823861ee2bb2198ce6b1fd6faf4c8f44f745bc804aca4a762f67e0d507fd8a81565b60006001600160e01b03198216637965db0b60e01b14806103f757506301ffc9a760e01b6001600160e01b03198316145b92915050565b600082815260208190526040902060010154610418816109f0565b61042283836109fd565b50505050565b6001600160a01b03811633146104515760405163334bd91960e11b815260040160405180910390fd5b61045b8282610a8f565b505050565b60007f499b8dbdbe4f7b12284c4a222a9951ce4488b43af4d09f42655d67f73b612fe161048c816109f0565b600061049e6080850160608601610e8d565b6001600160a01b0316036104c45760405162e18e7f60e71b815260040160405180910390fd5b42836080013510156104ec576040516001623859e760e21b0319815260040160405180910390fd5b60008360a00135116105115760405163d11b25af60e01b815260040160405180910390fd5b60006105aa670de0b6b3a764000060018361052f6020890189610e8d565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008760200160208101906105649190610e8d565b6001600160a01b0316815260208082019290925260400160002054906105959061059090890189610e8d565b610afa565b6105a39060a0890135610fba565b9190610b74565b90506105bf6105906040860160208701610e8d565b6105c99082610fe7565b92508260c0850135808210156106005760405163296ba6e160e01b8152600481019290925260248201526044015b60405180910390fd5b50506002546106379033906001600160a01b031660a08701356106266020890189610e8d565b6001600160a01b0316929190610c30565b600254610668906001600160a01b03166106576080870160608801610e8d565b856106266040890160208a01610e8d565b5050919050565b7fc6823861ee2bb2198ce6b1fd6faf4c8f44f745bc804aca4a762f67e0d507fd8a610699816109f0565b6001600160a01b0384166106c05760405163165a825360e21b815260040160405180910390fd5b6001600160a01b0383166106e75760405163165a825360e21b815260040160405180910390fd5b6001600160a01b0384811660008181526001602090815260408083209488168084529482529182902086905581519283528201929092529081018390527fb71c154260e8508e211e2ace194becba2c6d7e727c3ed292fe4787458969cd109060600160405180910390a150505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610781816109f0565b61078a82610c8a565b5050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b600060405163d623472560e01b815260040160405180910390fd5b6000828152602081905260409020600101546107ed816109f0565b6104228383610a8f565b60007f499b8dbdbe4f7b12284c4a222a9951ce4488b43af4d09f42655d67f73b612fe1610823816109f0565b60006108356080850160608601610e8d565b6001600160a01b03160361085b5760405162e18e7f60e71b815260040160405180910390fd5b4283608001351015610883576040516001623859e760e21b0319815260040160405180910390fd5b60008360a00135116108a85760405163d11b25af60e01b815260040160405180910390fd5b60006109326001826108bd6020880188610e8d565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008660200160208101906108f29190610e8d565b6001600160a01b03166001600160a01b0316815260200190815260200160002054670de0b6b3a76400006105958760200160208101906105909190610e8d565b90506109446105906020860186610e8d565b61094e9082610fe7565b92508260c08501358082111561098057604051639a06025d60e01b8152600481019290925260248201526044016105f7565b50506002546109a29033906001600160a01b0316856106266020890189610e8d565b600254610668906001600160a01b03166109c26080870160608801610e8d565b60a08701356106266040890160208a01610e8d565b60405163d623472560e01b815260040160405180910390fd5b6109fa8133610cd4565b50565b6000610a09838361078e565b610a87576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610a3f3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016103f7565b5060006103f7565b6000610a9b838361078e565b15610a87576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016103f7565b6000816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5e9190611009565b610b6990601261102c565b6103f790600a61112c565b6000838302816000198587098281108382030391505080600003610bab57838281610ba157610ba1610fd1565b0492505050610c29565b808411610bc257610bc26003851502601118610d0d565b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150505b9392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610422908590610d1f565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f0d4942cd92e3890d7c5981c00a2fad602608157938bcd2c069ce005804288e3a90600090a250565b610cde828261078e565b61078a5760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016105f7565b634e487b71600052806020526024601cfd5b600080602060008451602086016000885af180610d42576040513d6000823e3d81fd5b50506000513d91508115610d5a578060011415610d67565b6001600160a01b0384163b155b1561042257604051635274afe760e01b81526001600160a01b03851660048201526024016105f7565b600060208284031215610da257600080fd5b81356001600160e01b031981168114610c2957600080fd5b600060208284031215610dcc57600080fd5b5035919050565b80356001600160a01b0381168114610dea57600080fd5b919050565b60008060408385031215610e0257600080fd5b82359150610e1260208401610dd3565b90509250929050565b60006101008284031215610e2e57600080fd5b50919050565b60006101008284031215610e4757600080fd5b610c298383610e1b565b600080600060608486031215610e6657600080fd5b610e6f84610dd3565b9250610e7d60208501610dd3565b9150604084013590509250925092565b600060208284031215610e9f57600080fd5b610c2982610dd3565b600060a08284031215610e2e57600080fd5b600060208284031215610ecc57600080fd5b813567ffffffffffffffff811115610ee357600080fd5b610eef84828501610ea8565b949350505050565b60008060408385031215610f0a57600080fd5b610f1383610dd3565b9150610e1260208401610dd3565b60008060008060608587031215610f3757600080fd5b8435935060208501359250604085013567ffffffffffffffff811115610f5c57600080fd5b8501601f81018713610f6d57600080fd5b803567ffffffffffffffff811115610f8457600080fd5b876020828401011115610f9657600080fd5b949793965060200194505050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176103f7576103f7610fa4565b634e487b7160e01b600052601260045260246000fd5b60008261100457634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561101b57600080fd5b815160ff81168114610c2957600080fd5b60ff82811682821603908111156103f7576103f7610fa4565b6001815b60018411156110805780850481111561106457611064610fa4565b600184161561107257908102905b60019390931c928002611049565b935093915050565b600082611097575060016103f7565b816110a4575060006103f7565b81600181146110ba57600281146110c4576110e0565b60019150506103f7565b60ff8411156110d5576110d5610fa4565b50506001821b6103f7565b5060208310610133831016604e8410600b8410161715611103575081810a6103f7565b6111106000198484611045565b806000190482111561112457611124610fa4565b029392505050565b6000610c2960ff84168361108856fea26469706673582212206d9746c70bd3433da28d4c5a2bf320425ef91dd5829793f88ed83f518e37788064736f6c634300081c0033", "deployedBytecode": "0x6080604052600436106101145760003560e01c8063a217fddf116100a0578063db16a55511610064578063db16a55514610319578063db3e21981461035f578063f28c04981461028a578063fa461e3314610372578063fbb812791461039257600080fd5b8063a217fddf14610275578063c04b8d591461028a578063caf031811461029d578063d4b7f403146102c5578063d547741f146102f957600080fd5b8063414bf389116100e7578063414bf389146101ce5780634562e015146101e157806370eceb6a1461020157806375b238fc1461022157806391d148541461025557600080fd5b806301ffc9a714610119578063248a9ca31461014e5780632f2ff15d1461018c57806336568abe146101ae575b600080fd5b34801561012557600080fd5b50610139610134366004610d90565b6103c6565b60405190151581526020015b60405180910390f35b34801561015a57600080fd5b5061017e610169366004610dba565b60009081526020819052604090206001015490565b604051908152602001610145565b34801561019857600080fd5b506101ac6101a7366004610def565b6103fd565b005b3480156101ba57600080fd5b506101ac6101c9366004610def565b610428565b61017e6101dc366004610e34565b610460565b3480156101ed57600080fd5b506101ac6101fc366004610e51565b61066f565b34801561020d57600080fd5b506101ac61021c366004610e8d565b610757565b34801561022d57600080fd5b5061017e7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b34801561026157600080fd5b50610139610270366004610def565b61078e565b34801561028157600080fd5b5061017e600081565b61017e610298366004610eba565b6107b7565b3480156102a957600080fd5b506002546040516001600160a01b039091168152602001610145565b3480156102d157600080fd5b5061017e7f499b8dbdbe4f7b12284c4a222a9951ce4488b43af4d09f42655d67f73b612fe181565b34801561030557600080fd5b506101ac610314366004610def565b6107d2565b34801561032557600080fd5b5061017e610334366004610ef7565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61017e61036d366004610e34565b6107f7565b34801561037e57600080fd5b506101ac61038d366004610f21565b6109d7565b34801561039e57600080fd5b5061017e7fc6823861ee2bb2198ce6b1fd6faf4c8f44f745bc804aca4a762f67e0d507fd8a81565b60006001600160e01b03198216637965db0b60e01b14806103f757506301ffc9a760e01b6001600160e01b03198316145b92915050565b600082815260208190526040902060010154610418816109f0565b61042283836109fd565b50505050565b6001600160a01b03811633146104515760405163334bd91960e11b815260040160405180910390fd5b61045b8282610a8f565b505050565b60007f499b8dbdbe4f7b12284c4a222a9951ce4488b43af4d09f42655d67f73b612fe161048c816109f0565b600061049e6080850160608601610e8d565b6001600160a01b0316036104c45760405162e18e7f60e71b815260040160405180910390fd5b42836080013510156104ec576040516001623859e760e21b0319815260040160405180910390fd5b60008360a00135116105115760405163d11b25af60e01b815260040160405180910390fd5b60006105aa670de0b6b3a764000060018361052f6020890189610e8d565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008760200160208101906105649190610e8d565b6001600160a01b0316815260208082019290925260400160002054906105959061059090890189610e8d565b610afa565b6105a39060a0890135610fba565b9190610b74565b90506105bf6105906040860160208701610e8d565b6105c99082610fe7565b92508260c0850135808210156106005760405163296ba6e160e01b8152600481019290925260248201526044015b60405180910390fd5b50506002546106379033906001600160a01b031660a08701356106266020890189610e8d565b6001600160a01b0316929190610c30565b600254610668906001600160a01b03166106576080870160608801610e8d565b856106266040890160208a01610e8d565b5050919050565b7fc6823861ee2bb2198ce6b1fd6faf4c8f44f745bc804aca4a762f67e0d507fd8a610699816109f0565b6001600160a01b0384166106c05760405163165a825360e21b815260040160405180910390fd5b6001600160a01b0383166106e75760405163165a825360e21b815260040160405180910390fd5b6001600160a01b0384811660008181526001602090815260408083209488168084529482529182902086905581519283528201929092529081018390527fb71c154260e8508e211e2ace194becba2c6d7e727c3ed292fe4787458969cd109060600160405180910390a150505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610781816109f0565b61078a82610c8a565b5050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b600060405163d623472560e01b815260040160405180910390fd5b6000828152602081905260409020600101546107ed816109f0565b6104228383610a8f565b60007f499b8dbdbe4f7b12284c4a222a9951ce4488b43af4d09f42655d67f73b612fe1610823816109f0565b60006108356080850160608601610e8d565b6001600160a01b03160361085b5760405162e18e7f60e71b815260040160405180910390fd5b4283608001351015610883576040516001623859e760e21b0319815260040160405180910390fd5b60008360a00135116108a85760405163d11b25af60e01b815260040160405180910390fd5b60006109326001826108bd6020880188610e8d565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008660200160208101906108f29190610e8d565b6001600160a01b03166001600160a01b0316815260200190815260200160002054670de0b6b3a76400006105958760200160208101906105909190610e8d565b90506109446105906020860186610e8d565b61094e9082610fe7565b92508260c08501358082111561098057604051639a06025d60e01b8152600481019290925260248201526044016105f7565b50506002546109a29033906001600160a01b0316856106266020890189610e8d565b600254610668906001600160a01b03166109c26080870160608801610e8d565b60a08701356106266040890160208a01610e8d565b60405163d623472560e01b815260040160405180910390fd5b6109fa8133610cd4565b50565b6000610a09838361078e565b610a87576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610a3f3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016103f7565b5060006103f7565b6000610a9b838361078e565b15610a87576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016103f7565b6000816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5e9190611009565b610b6990601261102c565b6103f790600a61112c565b6000838302816000198587098281108382030391505080600003610bab57838281610ba157610ba1610fd1565b0492505050610c29565b808411610bc257610bc26003851502601118610d0d565b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150505b9392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610422908590610d1f565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f0d4942cd92e3890d7c5981c00a2fad602608157938bcd2c069ce005804288e3a90600090a250565b610cde828261078e565b61078a5760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016105f7565b634e487b71600052806020526024601cfd5b600080602060008451602086016000885af180610d42576040513d6000823e3d81fd5b50506000513d91508115610d5a578060011415610d67565b6001600160a01b0384163b155b1561042257604051635274afe760e01b81526001600160a01b03851660048201526024016105f7565b600060208284031215610da257600080fd5b81356001600160e01b031981168114610c2957600080fd5b600060208284031215610dcc57600080fd5b5035919050565b80356001600160a01b0381168114610dea57600080fd5b919050565b60008060408385031215610e0257600080fd5b82359150610e1260208401610dd3565b90509250929050565b60006101008284031215610e2e57600080fd5b50919050565b60006101008284031215610e4757600080fd5b610c298383610e1b565b600080600060608486031215610e6657600080fd5b610e6f84610dd3565b9250610e7d60208501610dd3565b9150604084013590509250925092565b600060208284031215610e9f57600080fd5b610c2982610dd3565b600060a08284031215610e2e57600080fd5b600060208284031215610ecc57600080fd5b813567ffffffffffffffff811115610ee357600080fd5b610eef84828501610ea8565b949350505050565b60008060408385031215610f0a57600080fd5b610f1383610dd3565b9150610e1260208401610dd3565b60008060008060608587031215610f3757600080fd5b8435935060208501359250604085013567ffffffffffffffff811115610f5c57600080fd5b8501601f81018713610f6d57600080fd5b803567ffffffffffffffff811115610f8457600080fd5b876020828401011115610f9657600080fd5b949793965060200194505050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176103f7576103f7610fa4565b634e487b7160e01b600052601260045260246000fd5b60008261100457634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561101b57600080fd5b815160ff81168114610c2957600080fd5b60ff82811682821603908111156103f7576103f7610fa4565b6001815b60018411156110805780850481111561106457611064610fa4565b600184161561107257908102905b60019390931c928002611049565b935093915050565b600082611097575060016103f7565b816110a4575060006103f7565b81600181146110ba57600281146110c4576110e0565b60019150506103f7565b60ff8411156110d5576110d5610fa4565b50506001821b6103f7565b5060208310610133831016604e8410600b8410161715611103575081810a6103f7565b6111106000198484611045565b806000190482111561112457611124610fa4565b029392505050565b6000610c2960ff84168361108856fea26469706673582212206d9746c70bd3433da28d4c5a2bf320425ef91dd5829793f88ed83f518e37788064736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} }