@ensuro/swaplibrary
Version:
Solidity Library that implements swap using different plaforms with a homogeneneous interface
708 lines (707 loc) • 34.3 kB
JSON
{
"_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": {}
}