UNPKG

@ensuro/extensions

Version:

Extension contracts that operate with the Ensuro Protocol

1,167 lines 93.7 kB
{ "_format": "hh-sol-artifact-1", "contractName": "StableSwapPayoutHandler", "sourceName": "contracts/StableSwapPayoutHandler.sol", "abi": [ { "inputs": [ { "internalType": "contract IERC20Metadata", "name": "outSable_", "type": "address" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "previousAdmin", "type": "address" }, { "indexed": false, "internalType": "address", "name": "newAdmin", "type": "address" } ], "name": "AdminChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "approved", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "ApprovalForAll", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "beacon", "type": "address" } ], "name": "BeaconUpgraded", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint8", "name": "version", "type": "uint8" } ], "name": "Initialized", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "account", "type": "address" } ], "name": "Paused", "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" }, { "anonymous": false, "inputs": [ { "components": [ { "internalType": "enum SwapLibrary.SwapProtocol", "name": "protocol", "type": "uint8" }, { "internalType": "uint256", "name": "maxSlippage", "type": "uint256" }, { "internalType": "bytes", "name": "customParams", "type": "bytes" } ], "indexed": false, "internalType": "struct SwapLibrary.SwapConfig", "name": "newConfig", "type": "tuple" } ], "name": "SwapConfigChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "newPrice", "type": "uint256" } ], "name": "SwapPriceChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "account", "type": "address" } ], "name": "Unpaused", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "implementation", "type": "address" } ], "name": "Upgraded", "type": "event" }, { "inputs": [], "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "GUARDIAN_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "POLICY_CREATOR_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "SWAP_PRICER_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "approve", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "cashflowLender", "outputs": [ { "internalType": "contract ERC4626CashFlowLender", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "currency", "outputs": [ { "internalType": "contract IERC20Metadata", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "getApproved", "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": "string", "name": "name", "type": "string" }, { "internalType": "string", "name": "symbol", "type": "string" }, { "internalType": "contract ERC4626CashFlowLender", "name": "cashflowLender_", "type": "address" }, { "components": [ { "internalType": "enum SwapLibrary.SwapProtocol", "name": "protocol", "type": "uint8" }, { "internalType": "uint256", "name": "maxSlippage", "type": "uint256" }, { "internalType": "bytes", "name": "customParams", "type": "bytes" } ], "internalType": "struct SwapLibrary.SwapConfig", "name": "swapConfig_", "type": "tuple" }, { "internalType": "uint256", "name": "swapPrice_", "type": "uint256" }, { "internalType": "address", "name": "admin", "type": "address" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "operator", "type": "address" } ], "name": "isApprovedForAll", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "riskModules", "type": "address[]" }, { "internalType": "uint256[]", "name": "payout", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "premium", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "lossProb", "type": "uint256[]" }, { "internalType": "uint40[]", "name": "expiration", "type": "uint40[]" }, { "internalType": "address[]", "name": "onBehalfOf", "type": "address[]" }, { "internalType": "uint256[]", "name": "bucketId", "type": "uint256[]" }, { "internalType": "bytes32[]", "name": "policyData", "type": "bytes32[]" }, { "internalType": "bytes32[]", "name": "quoteSignatureR", "type": "bytes32[]" }, { "internalType": "bytes32[]", "name": "quoteSignatureVS", "type": "bytes32[]" }, { "internalType": "uint40[]", "name": "quoteValidUntil", "type": "uint40[]" } ], "name": "newPoliciesInBatchOnBehalfOf", "outputs": [ { "internalType": "uint256", "name": "policyId", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "riskModule", "type": "address" }, { "internalType": "uint256", "name": "payout", "type": "uint256" }, { "internalType": "uint256", "name": "premium", "type": "uint256" }, { "internalType": "uint256", "name": "lossProb", "type": "uint256" }, { "internalType": "uint40", "name": "expiration", "type": "uint40" }, { "internalType": "address", "name": "onBehalfOf", "type": "address" }, { "internalType": "uint256", "name": "bucketId", "type": "uint256" }, { "internalType": "bytes32", "name": "policyData", "type": "bytes32" }, { "internalType": "bytes32", "name": "quoteSignatureR", "type": "bytes32" }, { "internalType": "bytes32", "name": "quoteSignatureVS", "type": "bytes32" }, { "internalType": "uint40", "name": "quoteValidUntil", "type": "uint40" } ], "name": "newPolicyOnBehalfOf", "outputs": [ { "internalType": "uint256", "name": "policyId", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "bytes", "name": "", "type": "bytes" } ], "name": "onERC721Received", "outputs": [ { "internalType": "bytes4", "name": "", "type": "bytes4" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "onPayoutReceived", "outputs": [ { "internalType": "bytes4", "name": "", "type": "bytes4" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "onPolicyExpired", "outputs": [ { "internalType": "bytes4", "name": "", "type": "bytes4" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "outStable", "outputs": [ { "internalType": "contract IERC20Metadata", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "ownerOf", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "paused", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "pool", "outputs": [ { "internalType": "contract IPolicyPool", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "proxiableUUID", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "recoverPolicy", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "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": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "safeTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "safeTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "setApprovalForAll", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "newPrice", "type": "uint256" } ], "name": "setSwapPrice", "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": [], "name": "swapConfig", "outputs": [ { "components": [ { "internalType": "enum SwapLibrary.SwapProtocol", "name": "protocol", "type": "uint8" }, { "internalType": "uint256", "name": "maxSlippage", "type": "uint256" }, { "internalType": "bytes", "name": "customParams", "type": "bytes" } ], "internalType": "struct SwapLibrary.SwapConfig", "name": "", "type": "tuple" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "swapPrice", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "tokenURI", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "transferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newImplementation", "type": "address" } ], "name": "upgradeTo", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newImplementation", "type": "address" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "upgradeToAndCall", "outputs": [], "stateMutability": "payable", "type": "function" } ], "bytecode": "0x60c0604052306080523480156200001557600080fd5b506040516200439238038062004392833981016040819052620000389162000196565b6001600160a01b038116620000ba5760405162461bcd60e51b815260206004820152603e60248201527f537461626c65537761705061796f757448616e646c65723a206f75745374616260448201527f6c655f2063616e6e6f7420626520746865207a65726f2061646472657373000060648201526084015b60405180910390fd5b6001600160a01b03811660a052620000d1620000d8565b50620001c8565b600054610100900460ff1615620001425760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000b1565b60005460ff9081161462000194576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b600060208284031215620001a957600080fd5b81516001600160a01b0381168114620001c157600080fd5b9392505050565b60805160a05161417a6200021860003960008181610593015281816118aa015261193d015260008181610ec201528181610f0201528181610fbc01528181610ffc015261108b015261417a6000f3fe60806040526004361061023b5760003560e01c806353da9f511161012e578063a22cb465116100ab578063d547741f1161006f578063d547741f14610717578063d6281d3e14610737578063e5a6b10f14610757578063e8e617b71461076c578063e985e9c51461078c57600080fd5b8063a22cb46514610677578063aa4ae7a014610697578063b88d4fde146106b7578063c5cf9611146106d7578063c87b56dd146106f757600080fd5b80636b3b4810116100f25780636b3b4810146105ed57806370a082311461060d57806391d148541461062d57806395d89b411461064d578063a217fddf1461066257600080fd5b806353da9f511461054a5780635c975abb1461056c57806362d5fc6a146105845780636352211e146105b75780636831e0d8146105d757600080fd5b806324ea54f4116101bc57806342842e0e1161018057806342842e0e146104af57806345f739ff146104cf57806349efc7b6146105035780634f1ef2861461052257806352d1902d1461053557600080fd5b806324ea54f4146103fb5780632c12cbaa1461042f5780632f2ff15d1461044f57806336568abe1461046f5780633659cfe61461048f57600080fd5b8063103c7ca911610203578063103c7ca91461031f578063150b7a021461035357806316f0115b1461038c57806323b872dd146103ab578063248a9ca3146103cb57600080fd5b806301ffc9a71461024057806302a2e3bb1461027557806306fdde03146102a3578063081812fc146102c5578063095ea7b3146102fd575b600080fd5b34801561024c57600080fd5b5061026061025b3660046130c1565b6107d5565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b50610295610290366004613118565b610810565b60405190815260200161026c565b3480156102af57600080fd5b506102b8610926565b60405161026c9190613207565b3480156102d157600080fd5b506102e56102e036600461321a565b6109b8565b6040516001600160a01b03909116815260200161026c565b34801561030957600080fd5b5061031d610318366004613233565b6109df565b005b34801561032b57600080fd5b506102957fa8fa0f9cd4619460951371f38dd26c5dd5417036c104d4f64f899db50ea27e9d81565b34801561035f57600080fd5b5061037361036e36600461325f565b610af9565b6040516001600160e01b0319909116815260200161026c565b34801561039857600080fd5b5061015f546001600160a01b03166102e5565b3480156103b757600080fd5b5061031d6103c63660046132fe565b610b76565b3480156103d757600080fd5b506102956103e636600461321a565b60009081526065602052604090206001015490565b34801561040757600080fd5b506102957f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b34801561043b57600080fd5b5061029561044a366004613504565b610ba7565b34801561045b57600080fd5b5061031d61046a3660046136af565b610e15565b34801561047b57600080fd5b5061031d61048a3660046136af565b610e3a565b34801561049b57600080fd5b5061031d6104aa3660046136df565b610eb8565b3480156104bb57600080fd5b5061031d6104ca3660046132fe565b610f97565b3480156104db57600080fd5b506102957f90fe2ba5da14f172ed5a0a0fec391dbf8f191c9a2f3557d79ede5d6b1c1c9ffb81565b34801561050f57600080fd5b50610160546001600160a01b03166102e5565b61031d61053036600461376c565b610fb2565b34801561054157600080fd5b5061029561107e565b34801561055657600080fd5b5061055f611131565b60405161026c91906137f4565b34801561057857600080fd5b5060c95460ff16610260565b34801561059057600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102e5565b3480156105c357600080fd5b506102e56105d236600461321a565b611229565b3480156105e357600080fd5b5061016454610295565b3480156105f957600080fd5b5061031d61060836600461321a565b611289565b34801561061957600080fd5b506102956106283660046136df565b611366565b34801561063957600080fd5b506102606106483660046136af565b6113ec565b34801561065957600080fd5b506102b8611417565b34801561066e57600080fd5b50610295600081565b34801561068357600080fd5b5061031d610692366004613838565b611426565b3480156106a357600080fd5b5061031d6106b236600461321a565b611431565b3480156106c357600080fd5b5061031d6106d2366004613866565b61154a565b3480156106e357600080fd5b5061031d6106f23660046138d2565b611582565b34801561070357600080fd5b506102b861071236600461321a565b61169f565b34801561072357600080fd5b5061031d6107323660046136af565b611713565b34801561074357600080fd5b506103736107523660046139d7565b611738565b34801561076357600080fd5b506102e5611978565b34801561077857600080fd5b506103736107873660046132fe565b6119ec565b34801561079857600080fd5b506102606107a7366004613a1d565b6001600160a01b039182166000908152609c6020908152604080832093909416825291909152205460ff1690565b60006107e082611a3c565b806107ef57506107ef82611a71565b8061080a57506001600160e01b03198216633ece0a8960e01b145b92915050565b60007f90fe2ba5da14f172ed5a0a0fec391dbf8f191c9a2f3557d79ede5d6b1c1c9ffb61083c81611ab1565b61084a600160601b87613a4b565b6bffffffffffffffffffffffff1660608e6001600160a01b0316901b6108709190613a83565b915061087c8883611abb565b61016060009054906101000a90046001600160a01b03166001600160a01b03166302a2e3bb8e8e8e8e8e308e8e8e8e8e6040518c63ffffffff1660e01b81526004016108d29b9a99989796959493929190613a96565b6020604051808303816000875af11580156108f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109159190613afe565b50509b9a5050505050505050505050565b60606097805461093590613b17565b80601f016020809104026020016040519081016040528092919081815260200182805461096190613b17565b80156109ae5780601f10610983576101008083540402835291602001916109ae565b820191906000526020600020905b81548152906001019060200180831161099157829003601f168201915b5050505050905090565b60006109c382611ad5565b506000908152609b60205260409020546001600160a01b031690565b60006109ea82611229565b9050806001600160a01b0316836001600160a01b031603610a5c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610a785750610a7881336107a7565b610aea5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610a53565b610af48383611b34565b505050565b61015f546000906001600160a01b0316336001600160a01b031614610b305760405162461bcd60e51b8152600401610a5390613b51565b6000848152609960205260409020546001600160a01b0316610b645760405162461bcd60e51b8152600401610a5390613bae565b50630a85bd0160e11b95945050505050565b610b803382611ba2565b610b9c5760405162461bcd60e51b8152600401610a5390613bfe565b610af4838383611c20565b60007f90fe2ba5da14f172ed5a0a0fec391dbf8f191c9a2f3557d79ede5d6b1c1c9ffb610bd381611ab1565b60005b8d5181101561091557600160601b878281518110610bf657610bf6613c4b565b602002602001015160001c610c0b9190613a4b565b6bffffffffffffffffffffffff1660608f8381518110610c2d57610c2d613c4b565b60200260200101516001600160a01b0316901b610c4a9190613a83565b9250610c6f898281518110610c6157610c61613c4b565b602002602001015184611abb565b61016060009054906101000a90046001600160a01b03166001600160a01b03166302a2e3bb8f8381518110610ca657610ca6613c4b565b60200260200101518f8481518110610cc057610cc0613c4b565b60200260200101518f8581518110610cda57610cda613c4b565b60200260200101518f8681518110610cf457610cf4613c4b565b60200260200101518f8781518110610d0e57610d0e613c4b565b6020026020010151308f8981518110610d2957610d29613c4b565b60200260200101518f8a81518110610d4357610d43613c4b565b60200260200101518f8b81518110610d5d57610d5d613c4b565b60200260200101518f8c81518110610d7757610d77613c4b565b60200260200101518f8d81518110610d9157610d91613c4b565b60200260200101516040518c63ffffffff1660e01b8152600401610dbf9b9a99989796959493929190613a96565b6020604051808303816000875af1158015610dde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e029190613afe565b5080610e0d81613c61565b915050610bd6565b600082815260656020526040902060010154610e3081611ab1565b610af48383611d84565b6001600160a01b0381163314610eaa5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610a53565b610eb48282611e0a565b5050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610f005760405162461bcd60e51b8152600401610a5390613c7a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610f496000805160206140fe833981519152546001600160a01b031690565b6001600160a01b031614610f6f5760405162461bcd60e51b8152600401610a5390613cc6565b610f7881611e71565b60408051600080825260208201909252610f9491839190611e9b565b50565b610af48383836040518060200160405280600081525061154a565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610ffa5760405162461bcd60e51b8152600401610a5390613c7a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110436000805160206140fe833981519152546001600160a01b031690565b6001600160a01b0316146110695760405162461bcd60e51b8152600401610a5390613cc6565b61107282611e71565b610eb482826001611e9b565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461111e5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610a53565b506000805160206140fe83398151915290565b6040805160608082018352600080835260208301529181019190915260408051606081019091526101618054829060ff166001811115611173576111736137bc565b6001811115611184576111846137bc565b8152602001600182015481526020016002820180546111a290613b17565b80601f01602080910402602001604051908101604052809291908181526020018280546111ce90613b17565b801561121b5780601f106111f05761010080835404028352916020019161121b565b820191906000526020600020905b8154815290600101906020018083116111fe57829003601f168201915b505050505081525050905090565b6000818152609960205260408120546001600160a01b03168061080a5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a53565b7fa8fa0f9cd4619460951371f38dd26c5dd5417036c104d4f64f899db50ea27e9d6112b381611ab1565b600082116113295760405162461bcd60e51b815260206004820152603860248201527f537461626c65537761705061796f757448616e646c65723a206e65775072696360448201527f65206d7573742062652067726561746572207468616e203000000000000000006064820152608401610a53565b6101648290556040518281527f7b36a11e212518475a558da44c1a19ba65d5e6d250c96b9f29789d4fbadc24849060200160405180910390a15050565b60006001600160a01b0382166113d05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610a53565b506001600160a01b03166000908152609a602052604090205490565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606098805461093590613b17565b610eb4338383612006565b3361143b82611229565b6001600160a01b0316146114c35760405162461bcd60e51b815260206004820152604360248201527f537461626c65537761705061796f757448616e646c65723a20796f75206d757360448201527f74206f776e20746865204e465420746f207265636f7665722074686520706f6c60648201526269637960e81b608482015260a401610a53565b6114cc816120d4565b61015f546001600160a01b03166342842e0e30336040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260448101849052606401600060405180830381600087803b15801561152f57600080fd5b505af1158015611543573d6000803e3d6000fd5b5050505050565b6115543383611ba2565b6115705760405162461bcd60e51b8152600401610a5390613bfe565b61157c84848484612169565b50505050565b600054610100900460ff16158080156115a25750600054600160ff909116105b806115bc5750303b1580156115bc575060005460ff166001145b61161f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a53565b6000805460ff191660011790558015611642576000805461ff0019166101001790555b61165087878787878761219c565b8015611696576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60606116aa82611ad5565b60006116c160408051602081019091526000815290565b905060008151116116e1576040518060200160405280600081525061170c565b806116eb846121f9565b6040516020016116fc929190613d12565b6040516020818303038152906040525b9392505050565b60008281526065602052604090206001015461172e81611ab1565b610af48383611e0a565b61015f546000906001600160a01b0316336001600160a01b03161461176f5760405162461bcd60e51b8152600401610a5390613b51565b6000838152609960205260409020546001600160a01b0316806117a45760405162461bcd60e51b8152600401610a5390613bae565b6117ad846120d4565b60408051606081019091526101618054829060ff1660018111156117d3576117d36137bc565b60018111156117e4576117e46137bc565b81526020016001820154815260200160028201805461180290613b17565b80601f016020809104026020016040519081016040528092919081815260200182805461182e90613b17565b801561187b5780601f106118505761010080835404028352916020019161187b565b820191906000526020600020905b81548152906001019060200180831161185e57829003601f168201915b50505050508152505073__$acbb9ece542dcf2065f41aa3c8cca5827e$__63581e517d90916118a8611978565b7f000000000000000000000000000000000000000000000000000000000000000087610164546040518663ffffffff1660e01b81526004016118ee959493929190613d71565b602060405180830381865af415801561190b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192f9190613afe565b506119646001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016828561228c565b50636b140e9f60e11b90505b949350505050565b61015f546040805163e5a6b10f60e01b815290516000926001600160a01b03169163e5a6b10f9160048083019260209291908290030181865afa1580156119c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e79190613db1565b905090565b61015f546000906001600160a01b0316336001600160a01b031614611a235760405162461bcd60e51b8152600401610a5390613b51565b611a2c826120d4565b5063e8e617b760e01b9392505050565b60006001600160e01b03198216637965db0b60e01b148061080a57506301ffc9a760e01b6001600160e01b031983161461080a565b60006001600160e01b031982166380ac58cd60e01b1480611aa257506001600160e01b03198216635b5e139f60e01b145b8061080a575061080a82611a3c565b610f9481336122de565b610eb4828260405180602001604052806000815250612337565b6000818152609960205260409020546001600160a01b0316610f945760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a53565b6000818152609b6020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b6982611229565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611bae83611229565b9050806001600160a01b0316846001600160a01b03161480611bf557506001600160a01b038082166000908152609c602090815260408083209388168352929052205460ff165b806119705750836001600160a01b0316611c0e846109b8565b6001600160a01b031614949350505050565b826001600160a01b0316611c3382611229565b6001600160a01b031614611c595760405162461bcd60e51b8152600401610a5390613dce565b6001600160a01b038216611cbb5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a53565b826001600160a01b0316611cce82611229565b6001600160a01b031614611cf45760405162461bcd60e51b8152600401610a5390613dce565b6000818152609b6020908152604080832080546001600160a01b03199081169091556001600160a01b03878116808652609a8552838620805460001901905590871680865283862080546001019055868652609990945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611d8e82826113ec565b610eb45760008281526065602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611dc63390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611e1482826113ec565b15610eb45760008281526065602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610eb481611ab1565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611ece57610af48361236a565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611f28575060408051601f3d908101601f19168201909252611f2591810190613afe565b60015b611f8b5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610a53565b6000805160206140fe8339815191528114611ffa5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610a53565b50610af4838383612406565b816001600160a01b0316836001600160a01b0316036120675760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a53565b6001600160a01b038381166000818152609c6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60006120df82611229565b90506120ea82611229565b6000838152609b6020908152604080832080546001600160a01b03199081169091556001600160a01b038516808552609a845282852080546000190190558785526099909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b612174848484611c20565b6121808484848461242b565b61157c5760405162461bcd60e51b8152600401610a5390613e13565b600054610100900460ff166121c35760405162461bcd60e51b8152600401610a5390613e65565b6121cb612529565b6121d3612529565b6121dd8686612552565b6121e5612583565b6121f1848484846125b2565b505050505050565b60606000612206836128e3565b600101905060008167ffffffffffffffff8111156122265761222661333f565b6040519080825280601f01601f191660200182016040528015612250576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461225a57509392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610af49084906129bb565b6122e882826113ec565b610eb4576122f581612a90565b612300836020612aa2565b604051602001612311929190613eb0565b60408051601f198184030181529082905262461bcd60e51b8252610a5391600401613207565b6123418383612c3e565b61234e600084848461242b565b610af45760405162461bcd60e51b8152600401610a5390613e13565b6001600160a01b0381163b6123d75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610a53565b6000805160206140fe83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61240f83612dc9565b60008251118061241c5750805b15610af45761157c8383612e09565b60006001600160a01b0384163b1561252157604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061246f903390899088908890600401613f25565b6020604051808303816000875af19250505080156124aa575060408051601f3d908101601f191682019092526124a791810190613f58565b60015b612507573d8080156124d8576040519150601f19603f3d011682016040523d82523d6000602084013e6124dd565b606091505b5080516000036124ff5760405162461bcd60e51b8152600401610a5390613e13565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611970565b506001611970565b600054610100900460ff166125505760405162461bcd60e51b8152600401610a5390613e65565b565b600054610100900460ff166125795760405162461bcd60e51b8152600401610a5390613e65565b610eb48282612e2e565b600054610100900460ff166125aa5760405162461bcd60e51b8152600401610a5390613e65565b612550612e6e565b600054610100900460ff166125d95760405162461bcd60e51b8152600401610a5390613e65565b61016080546001600160a01b0319166001600160a01b03861690811790915560408051639ed1a98560e01b81529051639ed1a985916004808201926020929091908290030181865afa158015612633573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126579190613db1565b6001600160a01b0316634d15eb036040518163ffffffff1660e01b8152600401602060405180830381865afa158015612694573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b89190613db1565b61015f80546001600160a01b0319166001600160a01b03929092169190911790556126e4600082612ea1565b82516101618054859290829060ff191660018381811115612707576127076137bc565b0217905550602082015160018201556040820151600282019061272a9082613fbb565b50506040805160608101909152610161805491925090829060ff166001811115612756576127566137bc565b6001811115612767576127676137bc565b81526020016001820154815260200160028201805461278590613b17565b80601f01602080910402602001604051908101604052809291908181526020018280546127b190613b17565b80156127fe5780601f106127d3576101008083540402835291602001916127fe565b820191906000526020600020905b8154815290600101906020018083116127e157829003601f168201915b505050919092525050604051632cbf28cb60e21b815273__$acbb9ece542dcf2065f41aa3c8cca5827e$__9263b2fca32c925061283d9160040161407b565b60006040518083038186803b15801561285557600080fd5b505af4158015612869573d6000803e3d6000fd5b505050507f29a87cc119a403cd891b109c82ba3033d64441c72aeb3062f9a8614f5ffe9a008360405161289c91906137f4565b60405180910390a16101648290556040518281527f7b36a11e212518475a558da44c1a19ba65d5e6d250c96b9f29789d4fbadc24849060200160405180910390a150505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106129225772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061294e576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061296c57662386f26fc10000830492506010015b6305f5e1008310612984576305f5e100830492506008015b612710831061299857612710830492506004015b606483106129aa576064830492506002015b600a831061080a5760010192915050565b6000612a10826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612eab9092919063ffffffff16565b9050805160001480612a31575080806020019051810190612a31919061408e565b610af45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a53565b606061080a6001600160a01b03831660145b60606000612ab18360026140ab565b612abc906002613a83565b67ffffffffffffffff811115612ad457612ad461333f565b6040519080825280601f01601f191660200182016040528015612afe576020820181803683370190505b509050600360fc1b81600081518110612b1957612b19613c4b565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612b4857612b48613c4b565b60200101906001600160f81b031916908160001a9053506000612b6c8460026140ab565b612b77906001613a83565b90505b6001811115612bef576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612bab57612bab613c4b565b1a60f81b828281518110612bc157612bc1613c4b565b60200101906001600160f81b031916908160001a90535060049490941c93612be8816140ca565b9050612b7a565b50831561170c5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a53565b6001600160a01b038216612c945760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a53565b6000818152609960205260409020546001600160a01b031615612cf95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a53565b6000818152609960205260409020546001600160a01b031615612d5e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a53565b6001600160a01b0382166000818152609a6020908152604080832080546001019055848352609990915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b612dd28161236a565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061170c838360405180606001604052806027815260200161411e60279139612eba565b600054610100900460ff16612e555760405162461bcd60e51b8152600401610a5390613e65565b6097612e618382613fbb565b506098610af48282613fbb565b600054610100900460ff16612e955760405162461bcd60e51b8152600401610a5390613e65565b60c9805460ff19169055565b610eb48282611d84565b60606119708484600085612f32565b6060600080856001600160