@ensuro/core
Version:
Ensuro - Blockchain-based insurance protocol
778 lines • 52.2 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "RiskModule",
"sourceName": "contracts/RiskModule.sol",
"abi": [
{
"inputs": [
{
"internalType": "contract IPolicyPool",
"name": "policyPool_",
"type": "address"
},
{
"internalType": "contract IPremiumsAccount",
"name": "premiumsAccount_",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
}
],
"name": "AddressEmptyCode",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "implementation",
"type": "address"
}
],
"name": "ERC1967InvalidImplementation",
"type": "error"
},
{
"inputs": [],
"name": "ERC1967NonPayable",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint40",
"name": "expiration",
"type": "uint40"
},
{
"internalType": "uint40",
"name": "now",
"type": "uint40"
}
],
"name": "ExpirationMustBeInTheFuture",
"type": "error"
},
{
"inputs": [],
"name": "FailedCall",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "customer",
"type": "address"
}
],
"name": "InvalidCustomer",
"type": "error"
},
{
"inputs": [],
"name": "InvalidInitialization",
"type": "error"
},
{
"inputs": [
{
"internalType": "contract IUnderwriter",
"name": "uw",
"type": "address"
}
],
"name": "InvalidUnderwriter",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "wallet",
"type": "address"
}
],
"name": "InvalidWallet",
"type": "error"
},
{
"inputs": [],
"name": "NoZeroPolicyPool",
"type": "error"
},
{
"inputs": [],
"name": "NotInitializing",
"type": "error"
},
{
"inputs": [],
"name": "OnlyPolicyPool",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "premium",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "payout",
"type": "uint256"
}
],
"name": "PremiumExceedsPayout",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "premium",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "minPremium",
"type": "uint256"
}
],
"name": "PremiumLessThanMinimum",
"type": "error"
},
{
"inputs": [],
"name": "PremiumsAccountMustBePartOfThePool",
"type": "error"
},
{
"inputs": [],
"name": "UUPSUnauthorizedCallContext",
"type": "error"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "slot",
"type": "bytes32"
}
],
"name": "UUPSUnsupportedProxiableUUID",
"type": "error"
},
{
"inputs": [],
"name": "UpgradeCannotChangePolicyPool",
"type": "error"
},
{
"inputs": [],
"name": "UpgradeCannotChangePremiumsAccount",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint64",
"name": "version",
"type": "uint64"
}
],
"name": "Initialized",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "oldWallet",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "newWallet",
"type": "address"
}
],
"name": "PartnerWalletChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "contract IUnderwriter",
"name": "oldUW",
"type": "address"
},
{
"indexed": false,
"internalType": "contract IUnderwriter",
"name": "newUW",
"type": "address"
}
],
"name": "UnderwriterChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "implementation",
"type": "address"
}
],
"name": "Upgraded",
"type": "event"
},
{
"inputs": [],
"name": "UPGRADE_INTERFACE_VERSION",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes",
"name": "inputData",
"type": "bytes"
}
],
"name": "cancelPolicy",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "currency",
"outputs": [
{
"internalType": "contract IERC20Metadata",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "payout",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lossProb",
"type": "uint256"
},
{
"internalType": "uint40",
"name": "start",
"type": "uint40"
},
{
"internalType": "uint40",
"name": "expiration",
"type": "uint40"
},
{
"components": [
{
"internalType": "uint256",
"name": "moc",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "jrCollRatio",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "collRatio",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "ensuroPpFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "ensuroCocFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "jrRoc",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "srRoc",
"type": "uint256"
}
],
"internalType": "struct Policy.Params",
"name": "p",
"type": "tuple"
}
],
"name": "getMinimumPremium",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IUnderwriter",
"name": "underwriter_",
"type": "address"
},
{
"internalType": "address",
"name": "wallet_",
"type": "address"
}
],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes[]",
"name": "inputData",
"type": "bytes[]"
},
{
"internalType": "address",
"name": "onBehalfOf",
"type": "address"
}
],
"name": "newPolicies",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes",
"name": "inputData",
"type": "bytes"
},
{
"internalType": "address",
"name": "onBehalfOf",
"type": "address"
}
],
"name": "newPolicy",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "payout",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "jrScr",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "srScr",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lossProb",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "purePremium",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "ensuroCommission",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "partnerCommission",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "jrCoc",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "srCoc",
"type": "uint256"
},
{
"internalType": "uint40",
"name": "start",
"type": "uint40"
},
{
"internalType": "uint40",
"name": "expiration",
"type": "uint40"
}
],
"internalType": "struct Policy.PolicyData",
"name": "policy",
"type": "tuple"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "policyPool",
"outputs": [
{
"internalType": "contract IPolicyPool",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "premiumsAccount",
"outputs": [
{
"internalType": "contract IPremiumsAccount",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "proxiableUUID",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes",
"name": "inputData",
"type": "bytes"
}
],
"name": "replacePolicy",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "payout",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "jrScr",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "srScr",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lossProb",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "purePremium",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "ensuroCommission",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "partnerCommission",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "jrCoc",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "srCoc",
"type": "uint256"
},
{
"internalType": "uint40",
"name": "start",
"type": "uint40"
},
{
"internalType": "uint40",
"name": "expiration",
"type": "uint40"
}
],
"internalType": "struct Policy.PolicyData",
"name": "policy",
"type": "tuple"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "payout",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "jrScr",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "srScr",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lossProb",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "purePremium",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "ensuroCommission",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "partnerCommission",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "jrCoc",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "srCoc",
"type": "uint256"
},
{
"internalType": "uint40",
"name": "start",
"type": "uint40"
},
{
"internalType": "uint40",
"name": "expiration",
"type": "uint40"
}
],
"internalType": "struct Policy.PolicyData",
"name": "policy",
"type": "tuple"
},
{
"internalType": "uint256",
"name": "payout",
"type": "uint256"
}
],
"name": "resolvePolicy",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IUnderwriter",
"name": "newUW",
"type": "address"
}
],
"name": "setUnderwriter",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newWallet",
"type": "address"
}
],
"name": "setWallet",
"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": "underwriter",
"outputs": [
{
"internalType": "contract IUnderwriter",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newImplementation",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "upgradeToAndCall",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "wallet",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
}
],
"bytecode": "0x60e060405230608052348015610013575f5ffd5b50604051612323380380612323833981016040819052610032916101e6565b816001600160a01b03811661005a57604051636b23cf0160e01b815260040160405180910390fd5b610062610120565b806001600160a01b031660a0816001600160a01b03168152505050816001600160a01b0316816001600160a01b0316634d15eb036040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e7919061021e565b6001600160a01b03161461010e5760405163fec343d560e01b815260040160405180910390fd5b6001600160a01b031660c05250610240565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156101705760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101cf5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b03811681146101cf575f5ffd5b5f5f604083850312156101f7575f5ffd5b8251610202816101d2565b6020840151909250610213816101d2565b809150509250929050565b5f6020828403121561022e575f5ffd5b8151610239816101d2565b9392505050565b60805160a05160c05161207a6102a95f395f818161028d015261129901525f81816101d70152818161071e0152818161082e01528181610a0001528181610aa301528181610bac01526113e501525f8181610edb01528181610f04015261104e015261207a5ff3fe608060405260043610610105575f3560e01c806368beecf911610092578063ad3cb1cc11610062578063ad3cb1cc146102ef578063bd644c561461032c578063deaa59df1461034b578063e5a6b10f1461036a578063f00db2601461037e575f5ffd5b806368beecf91461025357806373a952e81461027f57806373d0efd0146102b15780638dab1952146102d0575f5ffd5b8063485cc955116100d8578063485cc955146101aa5780634d15eb03146101c95780634f1ef2861461020f578063521eb2731461022257806352d1902d1461023f575f5ffd5b806301ffc9a71461010957806308bb5f7b1461013d5780631f0f3e181461015e57806323d09ac91461017d575b5f5ffd5b348015610114575f5ffd5b50610128610123366004611650565b61039b565b60405190151581526020015b60405180910390f35b348015610148575f5ffd5b5061015c61015736600461168b565b6103c6565b005b348015610169575f5ffd5b5061015c6101783660046116a6565b610469565b348015610188575f5ffd5b5061019c6101973660046117d7565b6104af565b604051908152602001610134565b3480156101b5575f5ffd5b5061015c6101c4366004611889565b6104cb565b3480156101d4575f5ffd5b507f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b039091168152602001610134565b61015c61021d3660046118c0565b6105c4565b34801561022d575f5ffd5b506033546001600160a01b03166101f7565b34801561024a575f5ffd5b5061019c6105e3565b34801561025e575f5ffd5b5061027261026d3660046119a9565b6105fe565b6040516101349190611a7e565b34801561028a575f5ffd5b507f00000000000000000000000000000000000000000000000000000000000000006101f7565b3480156102bc575f5ffd5b5061015c6102cb3660046119a9565b6107a8565b3480156102db575f5ffd5b506102726102ea366004611a8d565b6108b3565b3480156102fa575f5ffd5b5061031f604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101349190611ad4565b348015610337575f5ffd5b5061015c610346366004611b09565b610a8c565b348015610356575f5ffd5b5061015c61036536600461168b565b610b0b565b348015610375575f5ffd5b506101f7610ba9565b348015610389575f5ffd5b506032546001600160a01b03166101f7565b5f6103a582610c2f565b806103c057506001600160e01b031982166321b7e09b60e01b145b92915050565b806001600160a01b0381166103ff57604051633f8317d160e21b81526001600160a01b0390911660048201526024015b60405180910390fd5b50603254604080516001600160a01b03928316815291831660208301527fae536502f25a82de70abed467008489d54fa0cbf58cdc51718efe6d49406724f910160405180910390a1603280546001600160a01b0319166001600160a01b0392909216919091179055565b5f5b828110156104a9576104a084848381811061048857610488611b3a565b905060200281019061049a9190611b4e565b846108b3565b5060010161046b565b50505050565b5f6104bd8287878688610c64565b60e001519695505050505050565b5f6104d4610e8e565b805490915060ff600160401b82041615906001600160401b03165f811580156104fa5750825b90505f826001600160401b031660011480156105155750303b155b905081158015610523575080155b156105415760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561056b57845460ff60401b1916600160401b1785555b6105758787610eb6565b83156105bb57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6105cc610ed0565b6105d582610f76565b6105df8282610f82565b5050565b5f6105ec611043565b505f5160206120255f395f51905f5290565b6106066115ed565b603254604051634dd4a16b60e11b81525f918291829182918291829182916001600160a01b031690639ba942d6906106469030908e908e90600401611b90565b61030060405180830381865afa158015610662573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106869190611cf8565b96509650965096509650965096505f1985036106b1576106ae868589610140015186856104af565b94505b4264ffffffffff168364ffffffffff1610156106f15760405163a67fcb1d60e01b815264ffffffffff8085166004830152421660248201526044016103f6565b61070481868887878c610140015161108c565b60405163663d833760e01b81529098506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063663d833790610759908a908c9033908890600401611d71565b6020604051808303815f875af1158015610775573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107999190611db9565b88525050505050505092915050565b60325460405163197c2bfd60e11b81525f918291829182916001600160a01b03909116906332f857fa906107e49030908a908a90600401611b90565b6101e060405180830381865afa158015610800573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108249190611dd0565b93509350935093507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636f520b73858585856040518563ffffffff1660e01b815260040161087e9493929190611e0f565b5f604051808303815f87803b158015610895575f5ffd5b505af11580156108a7573d5f5f3e3d5ffd5b50505050505050505050565b6108bb6115ed565b603254604051635d04bd1560e11b81525f91829182918291829182916001600160a01b039091169063ba097a2a906108fb9030908e908e90600401611b90565b61018060405180830381865afa158015610917573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093b9190611e3c565b9550955095509550955095505f4290505f1986036109635761096087868387866104af565b95505b838164ffffffffff808216908316116109a05760405163a67fcb1d60e01b815264ffffffffff9283166004820152911660248201526044016103f6565b508990506001600160a01b0381166109d757604051632c74914160e11b81526001600160a01b0390911660048201526024016103f6565b506109e682878988888661108c565b604051630d100acb60e01b81529098506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630d100acb90610a3b908b9033908e908990600401611e9d565b6020604051808303815f875af1158015610a57573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a7b9190611db9565b8852505050505050505b9392505050565b604051635eb2262b60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063bd644c5690610ada9085908590600401611edf565b5f604051808303815f87803b158015610af1575f5ffd5b505af1158015610b03573d5f5f3e3d5ffd5b505050505050565b806001600160a01b038116610b3f57604051633146914d60e11b81526001600160a01b0390911660048201526024016103f6565b50603354604080516001600160a01b03928316815291831660208301527fe3d815eb4e0fdd9b02285235cb46b09f34bee9bd0eb8d8dc3a1fe84694079bc2910160405180910390a1603380546001600160a01b0319166001600160a01b0392909216919091179055565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c06573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c2a9190611f87565b905090565b5f6001600160e01b031982166301ffc9a760e01b14806103c057506001600160e01b03198216634d15eb0360e01b1492915050565b610ca46040518061010001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b8551610cc590670de0b6b3a7640000610cbe888883611193565b9190611193565b81526020860151610ce0908690670de0b6b3a7640000611193565b6020820181905281511015610d0a578051602082018051610d02908390611fb6565b905250610d11565b5f60208201525b6040860151610d2a908690670de0b6b3a7640000611193565b604082015260208101518151610d409190611fc9565b81604001511115610d755760208101518151610d5c9190611fc9565b81604001818151610d6d9190611fb6565b905250610d7c565b5f60408201525b610dc1610d898385611fdc565b64ffffffffff168760a00151610d9f9190611ff9565b610db56301e13380670de0b6b3a7640000611ff9565b60208401519190611193565b6060820152610e0b610dd38385611fdc565b64ffffffffff168760c00151610de99190611ff9565b610dff6301e13380670de0b6b3a7640000611ff9565b60408401519190611193565b6080820181905260608201515f91610e2291611fc9565b6080880151909150610e3e908290670de0b6b3a7640000611193565b60608801518351610e5791670de0b6b3a7640000611193565b610e619190611fc9565b60a0830181905282518291610e7591611fc9565b610e7f9190611fc9565b60e08301525095945050505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006103c0565b610ebe611243565b610ec6611268565b6105df8282611270565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610f5657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610f4a5f5160206120255f395f51905f52546001600160a01b031690565b6001600160a01b031614155b15610f745760405163703e46dd60e11b815260040160405180910390fd5b565b610f7f8161128a565b50565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610fdc575060408051601f3d908101601f19168201909252610fd991810190611db9565b60015b61100457604051634c9c8ce360e01b81526001600160a01b03831660048201526024016103f6565b5f5160206120255f395f51905f52811461103457604051632a87526960e21b8152600481018290526024016103f6565b61103e8383611348565b505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f745760405163703e46dd60e11b815260040160405180910390fd5b6110946115ed565b85858082106110bf5760405163319308d960e11b8152600481019290925260248201526044016103f6565b50506110c96115ed565b602081018690526080810185905264ffffffffff80841661014083015284166101608201525f6110fc8988888888610c64565b805160a0808501919091526020820151604080860191909152820151606080860191909152820151610100850152608082015161012085015281015160c084015260e08101519091508890818111156111715760405163fc09662760e01b8152600481019290925260248201526044016103f6565b505060e08101516111829089611fb6565b60e083015250979650505050505050565b5f5f5f6111a0868661139d565b91509150815f036111c4578381816111ba576111ba612010565b0492505050610a85565b8184116111db576111db60038515026011186113b9565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b61124b6113ca565b610f7457604051631afcd79f60e31b815260040160405180910390fd5b610f74611243565b611278611243565b61128181610b0b565b6105df826103c6565b611293816113e3565b5f8190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112fd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113219190611f87565b6001600160a01b0316146105df5760405163050f87e160e21b815260040160405180910390fd5b61135182611494565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156113955761103e82826114f7565b6105df611597565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f6113d3610e8e565b54600160401b900460ff16919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316634d15eb036040518163ffffffff1660e01b8152600401602060405180830381865afa158015611449573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061146d9190611f87565b6001600160a01b031614610f7f5760405163d2b3d33f60e01b815260040160405180910390fd5b806001600160a01b03163b5f036114c957604051634c9c8ce360e01b81526001600160a01b03821660048201526024016103f6565b5f5160206120255f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f61150484846115b6565b905080801561152557505f3d118061152557505f846001600160a01b03163b115b1561153a576115326115c9565b9150506103c0565b801561156457604051639996b31560e01b81526001600160a01b03851660048201526024016103f6565b3d15611577576115726115e2565b611590565b60405163d6bda27560e01b815260040160405180910390fd5b5092915050565b3415610f745760405163b398979f60e01b815260040160405180910390fd5b5f5f5f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b6040518061018001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f64ffffffffff1681526020015f64ffffffffff1681525090565b5f60208284031215611660575f5ffd5b81356001600160e01b031981168114610a85575f5ffd5b6001600160a01b0381168114610f7f575f5ffd5b5f6020828403121561169b575f5ffd5b8135610a8581611677565b5f5f5f604084860312156116b8575f5ffd5b83356001600160401b038111156116cd575f5ffd5b8401601f810186136116dd575f5ffd5b80356001600160401b038111156116f2575f5ffd5b8660208260051b8401011115611706575f5ffd5b60209182019450925084013561171b81611677565b809150509250925092565b64ffffffffff81168114610f7f575f5ffd5b803561174381611726565b919050565b634e487b7160e01b5f52604160045260245ffd5b60405160e081016001600160401b038111828210171561177e5761177e611748565b60405290565b60405161018081016001600160401b038111828210171561177e5761177e611748565b604051601f8201601f191681016001600160401b03811182821017156117cf576117cf611748565b604052919050565b5f5f5f5f5f8587036101608112156117ed575f5ffd5b8635955060208701359450604087013561180681611726565b9350606087013561181681611726565b925060e0607f1982011215611829575f5ffd5b5061183261175c565b608087810135825260a080890135602084015260c0808a0135604085015260e08a013560608501526101008a0135928401929092526101208901359083015261014090970135968101969096525092959194509290565b5f5f6040838503121561189a575f5ffd5b82356118a581611677565b915060208301356118b581611677565b809150509250929050565b5f5f604083850312156118d1575f5ffd5b82356118dc81611677565b915060208301356001600160401b038111156118f6575f5ffd5b8301601f81018513611906575f5ffd5b80356001600160401b0381111561191f5761191f611748565b611932601f8201601f19166020016117a7565b818152866020838501011115611946575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f5f83601f840112611975575f5ffd5b5081356001600160401b0381111561198b575f5ffd5b6020830191508360208285010111156119a2575f5ffd5b9250929050565b5f5f602083850312156119ba575f5ffd5b82356001600160401b038111156119cf575f5ffd5b6119db85828601611965565b90969095509350505050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e0830152610100810151610100830152610120810151610120830152610140810151611a6361014084018264ffffffffff169052565b5061016081015161103e61016084018264ffffffffff169052565b61018081016103c082846119e7565b5f5f5f60408486031215611a9f575f5ffd5b83356001600160401b03811115611ab4575f5ffd5b611ac086828701611965565b909450925050602084013561171b81611677565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f8284036101a0811215611b1c575f5ffd5b610180811215611b2a575f5ffd5b5091936101808501359350915050565b634e487b7160e01b5f52603260045260245ffd5b5f5f8335601e19843603018112611b63575f5ffd5b8301803591506001600160401b03821115611b7c575f5ffd5b6020019150368190038213156119a2575f5ffd5b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b805161174381611726565b5f6101808284031215611beb575f5ffd5b611bf3611784565b825181526020808401519082015260408084015190820152606080840151908201526080808401519082015260a0808401519082015260c0808401519082015260e08084015190820152610100808401519082015261012080840151908201529050611c626101408301611bcf565b610140820152611c756101608301611bcf565b61016082015292915050565b80516001600160601b0381168114611743575f5ffd5b5f60e08284031215611ca7575f5ffd5b611caf61175c565b825181526020808401519082015260408084015190820152606080840151908201526080808401519082015260a0808401519082015260c0928301519281019290925250919050565b5f5f5f5f5f5f5f610300888a031215611d0f575f5ffd5b611d198989611bda565b6101808901516101a08a01516101c08b01516101e08c0151939a5091985096509450611d4481611726565b9250611d536102008901611c81565b9150611d63896102208a01611c97565b905092959891949750929550565b6103408101611d8082876119e7565b611d8e6101808301866119e7565b6001600160a01b03939093166103008201526001600160601b03919091166103209091015292915050565b5f60208284031215611dc9575f5ffd5b5051919050565b5f5f5f5f6101e08587031215611de4575f5ffd5b611dee8686611bda565b6101808601516101a08701516101c090970151919890975090945092505050565b6101e08101611e1e82876119e7565b84610180830152836101a0830152826101c083015295945050505050565b5f5f5f5f5f5f6101808789031215611e52575f5ffd5b86516020880151604089015160608a01519298509096509450611e7481611726565b9250611e8260808801611c81565b9150611e918860a08901611c97565b90509295509295509295565b6101e08101611eac82876119e7565b6001600160a01b03948516610180830152929093166101a08401526001600160601b03166101c090920191909152919050565b823581526020808401359082015260408084013590820152606080840135908201526080808401359082015260a0808401359082015260c0808401359082015260e08084013590820152610100808401359082015261012080840135908201526101a08101611f516101408501611738565b64ffffffffff16610140830152611f6b6101608501611738565b64ffffffffff1661016083015261018090910191909152919050565b5f60208284031215611f97575f5ffd5b8151610a8581611677565b634e487b7160e01b5f52601160045260245ffd5b818103818111156103c0576103c0611fa2565b808201808211156103c0576103c0611fa2565b64ffffffffff82811682821603908111156103c0576103c0611fa2565b80820281158282048414176103c0576103c0611fa2565b634e487b7160e01b5f52601260045260245ffdfe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220edc61d32e4b136dd05376b7b6b80e1aed5ae1f9cd496aaccb31494d2872f455664736f6c634300081e0033",
"deployedBytecode": "0x608060405260043610610105575f3560e01c806368beecf911610092578063ad3cb1cc11610062578063ad3cb1cc146102ef578063bd644c561461032c578063deaa59df1461034b578063e5a6b10f1461036a578063f00db2601461037e575f5ffd5b806368beecf91461025357806373a952e81461027f57806373d0efd0146102b15780638dab1952146102d0575f5ffd5b8063485cc955116100d8578063485cc955146101aa5780634d15eb03146101c95780634f1ef2861461020f578063521eb2731461022257806352d1902d1461023f575f5ffd5b806301ffc9a71461010957806308bb5f7b1461013d5780631f0f3e181461015e57806323d09ac91461017d575b5f5ffd5b348015610114575f5ffd5b50610128610123366004611650565b61039b565b60405190151581526020015b60405180910390f35b348015610148575f5ffd5b5061015c61015736600461168b565b6103c6565b005b348015610169575f5ffd5b5061015c6101783660046116a6565b610469565b348015610188575f5ffd5b5061019c6101973660046117d7565b6104af565b604051908152602001610134565b3480156101b5575f5ffd5b5061015c6101c4366004611889565b6104cb565b3480156101d4575f5ffd5b507f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b039091168152602001610134565b61015c61021d3660046118c0565b6105c4565b34801561022d575f5ffd5b506033546001600160a01b03166101f7565b34801561024a575f5ffd5b5061019c6105e3565b34801561025e575f5ffd5b5061027261026d3660046119a9565b6105fe565b6040516101349190611a7e565b34801561028a575f5ffd5b507f00000000000000000000000000000000000000000000000000000000000000006101f7565b3480156102bc575f5ffd5b5061015c6102cb3660046119a9565b6107a8565b3480156102db575f5ffd5b506102726102ea366004611a8d565b6108b3565b3480156102fa575f5ffd5b5061031f604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101349190611ad4565b348015610337575f5ffd5b5061015c610346366004611b09565b610a8c565b348015610356575f5ffd5b5061015c61036536600461168b565b610b0b565b348015610375575f5ffd5b506101f7610ba9565b348015610389575f5ffd5b506032546001600160a01b03166101f7565b5f6103a582610c2f565b806103c057506001600160e01b031982166321b7e09b60e01b145b92915050565b806001600160a01b0381166103ff57604051633f8317d160e21b81526001600160a01b0390911660048201526024015b60405180910390fd5b50603254604080516001600160a01b03928316815291831660208301527fae536502f25a82de70abed467008489d54fa0cbf58cdc51718efe6d49406724f910160405180910390a1603280546001600160a01b0319166001600160a01b0392909216919091179055565b5f5b828110156104a9576104a084848381811061048857610488611b3a565b905060200281019061049a9190611b4e565b846108b3565b5060010161046b565b50505050565b5f6104bd8287878688610c64565b60e001519695505050505050565b5f6104d4610e8e565b805490915060ff600160401b82041615906001600160401b03165f811580156104fa5750825b90505f826001600160401b031660011480156105155750303b155b905081158015610523575080155b156105415760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561056b57845460ff60401b1916600160401b1785555b6105758787610eb6565b83156105bb57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6105cc610ed0565b6105d582610f76565b6105df8282610f82565b5050565b5f6105ec611043565b505f5160206120255f395f51905f5290565b6106066115ed565b603254604051634dd4a16b60e11b81525f918291829182918291829182916001600160a01b031690639ba942d6906106469030908e908e90600401611b90565b61030060405180830381865afa158015610662573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106869190611cf8565b96509650965096509650965096505f1985036106b1576106ae868589610140015186856104af565b94505b4264ffffffffff168364ffffffffff1610156106f15760405163a67fcb1d60e01b815264ffffffffff8085166004830152421660248201526044016103f6565b61070481868887878c610140015161108c565b60405163663d833760e01b81529098506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063663d833790610759908a908c9033908890600401611d71565b6020604051808303815f875af1158015610775573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107999190611db9565b88525050505050505092915050565b60325460405163197c2bfd60e11b81525f918291829182916001600160a01b03909116906332f857fa906107e49030908a908a90600401611b90565b6101e060405180830381865afa158015610800573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108249190611dd0565b93509350935093507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636f520b73858585856040518563ffffffff1660e01b815260040161087e9493929190611e0f565b5f604051808303815f87803b158015610895575f5ffd5b505af11580156108a7573d5f5f3e3d5ffd5b50505050505050505050565b6108bb6115ed565b603254604051635d04bd1560e11b81525f91829182918291829182916001600160a01b039091169063ba097a2a906108fb9030908e908e90600401611b90565b61018060405180830381865afa158015610917573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093b9190611e3c565b9550955095509550955095505f4290505f1986036109635761096087868387866104af565b95505b838164ffffffffff808216908316116109a05760405163a67fcb1d60e01b815264ffffffffff9283166004820152911660248201526044016103f6565b508990506001600160a01b0381166109d757604051632c74914160e11b81526001600160a01b0390911660048201526024016103f6565b506109e682878988888661108c565b604051630d100acb60e01b81529098506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630d100acb90610a3b908b9033908e908990600401611e9d565b6020604051808303815f875af1158015610a57573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a7b9190611db9565b8852505050505050505b9392505050565b604051635eb2262b60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063bd644c5690610ada9085908590600401611edf565b5f604051808303815f87803b158015610af1575f5ffd5b505af1158015610b03573d5f5f3e3d5ffd5b505050505050565b806001600160a01b038116610b3f57604051633146914d60e11b81526001600160a01b0390911660048201526024016103f6565b50603354604080516001600160a01b03928316815291831660208301527fe3d815eb4e0fdd9b02285235cb46b09f34bee9bd0eb8d8dc3a1fe84694079bc2910160405180910390a1603380546001600160a01b0319166001600160a01b0392909216919091179055565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c06573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c2a9190611f87565b905090565b5f6001600160e01b031982166301ffc9a760e01b14806103c057506001600160e01b03198216634d15eb0360e01b1492915050565b610ca46040518061010001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b8551610cc590670de0b6b3a7640000610cbe888883611193565b9190611193565b81526020860151610ce0908690670de0b6b3a7640000611193565b6020820181905281511015610d0a578051602082018051610d02908390611fb6565b905250610d11565b5f60208201525b6040860151610d2a908690670de0b6b3a7640000611193565b604082015260208101518151610d409190611fc9565b81604001511115610d755760208101518151610d5c9190611fc9565b81604001818151610d6d9190611fb6565b905250610d7c565b5f60408201525b610dc1610d898385611fdc565b64ffffffffff168760a00151610d9f9190611ff9565b610db56301e13380670de0b6b3a7640000611ff9565b60208401519190611193565b6060820152610e0b610dd38385611fdc565b64ffffffffff168760c00151610de99190611ff9565b610dff6301e13380670de0b6b3a7640000611ff9565b60408401519190611193565b6080820181905260608201515f91610e2291611fc9565b6080880151909150610e3e908290670de0b6b3a7640000611193565b60608801518351610e5791670de0b6b3a7640000611193565b610e619190611fc9565b60a0830181905282518291610e7591611fc9565b610e7f9190611fc9565b60e08301525095945050505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006103c0565b610ebe611243565b610ec6611268565b6105df8282611270565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610f5657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610f4a5f5160206120255f395f51905f52546001600160a01b031690565b6001600160a01b031614155b15610f745760405163703e46dd60e11b815260040160405180910390fd5b565b610f7f8161128a565b50565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610fdc575060408051601f3d908101601f19168201909252610fd991810190611db9565b60015b61100457604051634c9c8ce360e01b81526001600160a01b03831660048201526024016103f6565b5f5160206120255f395f51905f52811461103457604051632a87526960e21b8152600481018290526024016103f6565b61103e8383611348565b505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f745760405163703e46dd60e11b815260040160405180910390fd5b6110946115ed565b85858082106110bf5760405163319308d960e11b8152600481019290925260248201526044016103f6565b50506110c96115ed565b602081018690526080810185905264ffffffffff80841661014083015284166101608201525f6110fc8988888888610c64565b805160a0808501919091526020820151604080860191909152820151606080860191909152820151610100850152608082015161012085015281015160c084015260e08101519091508890818111156111715760405163fc09662760e01b8152600481019290925260248201526044016103f6565b505060e08101516111829089611fb6565b60e083015250979650505050505050565b5f5f5f6111a0868661139d565b91509150815f036111c4578381816111ba576111ba612010565b0492505050610a85565b8184116111db576111db60038515026011186113b9565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b61124b6113ca565b610f7457604051631afcd79f60e31b815260040160405180910390fd5b610f74611243565b611278611243565b61128181610b0b565b6105df826103c6565b611293816113e3565b5f8190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112fd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113219190611f87565b6001600160a01b0316146105df5760405163050f87e160e21b815260040160405180910390fd5b61135182611494565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156113955761103e82826114f7565b6105df611597565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f6113d3610e8e565b54600160401b900460ff16919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316634d15eb036040518163ffffffff1660e01b8152600401602060405180830381865afa158015611449573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061146d9190611f87565b6001600160a01b031614610f7f5760405163d2b3d33f60e01b815260040160405180910390fd5b806001600160a01b03163b5f036114c957604051634c9c8ce360e01b81526001600160a01b03821660048201526024016103f6565b5f5160206120255f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f61150484846115b6565b905080801561152557505f3d118061152557505f846001600160a01b03163b115b1561153a576115326115c9565b9150506103c0565b801561156457604051639996b31560e01b81526001600160a01b03851660048201526024016103f6565b3d15611577576115726115e2565b611590565b60405163d6bda27560e01b815260040160405180910390fd5b5092915050565b3415610f745760405163b398979f60e01b815260040160405180910390fd5b5f5f5f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b6040518061018001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f64ffffffffff1681526020015f64ffffffffff1681525090565b5f60208284031215611660575f5ffd5b81356001600160e01b031981168114610a85575f5ffd5b6001600160a01b0381168114610f7f575f5ffd5b5f6020828403121561169b575f5ffd5b8135610a8581611677565b5f5f5f604084860312156116b8575f5ffd5b83356001600160401b038111156116cd575f5ffd5b8401601f810186136116dd575f5ffd5b80356001600160401b038111156116f2575f5ffd5b8660208260051b8401011115611706575f5ffd5b60209182019450925084013561171b81611677565b809150509250925092565b64ffffffffff81168114610f7f575f5ffd5b803561174381611726565b919050565b634e487b7160e01b5f52604160045260245ffd5b60405160e081016001600160401b038111828210171561177e5761177e611748565b60405290565b60405161018081016001600160401b038111828210171561177e5761177e611748565b604051601f8201601f191681016001600160401b03811182821017156117cf576117cf611748565b604052919050565b5f5f5f5f5f8587036101608112156117ed575f5ffd5b8635955060208701359450604087013561180681611726565b9350606087013561181681611726565b925060e0607f1982011215611829575f5ffd5b5061183261175c565b608087810135825260a080890135602084015260c0808a0135604085015260e08a013560608501526101008a0135928401929092526101208901359083015261014090970135968101969096525092959194509290565b5f5f6040838503121561189a575f5ffd5b82356118a581611677565b915060208301356118b581611677565b809150509250929050565b5f5f604083850312156118d1575f5ffd5b82356118dc81611677565b915060208301356001600160401b038111156118f6575f5ffd5b8301601f81018513611906575f5ffd5b80356001600160401b0381111561191f5761191f611748565b611932601f8201601f19166020016117a7565b818152866020838501011115611946575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f5f83601f840112611975575f5ffd5b5081356001600160401b0381111561198b575f5ffd5b6020830191508360208285010111156119a2575f5ffd5b9250929050565b5f5f602083850312156119ba575f5ffd5b82356001600160401b038111156119cf575f5ffd5b6119db85828601611965565b90969095509350505050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e0830152610100810151610100830152610120810151610120830152610140810151611a6361014084018264ffffffffff169052565b5061016081015161103e61016084018264ffffffffff169052565b61018081016103c082846119e7565b5f5f5f60408486031215611a9f575f5ffd5b83356001600160401b03811115611ab4575f5ffd5b611ac086828701611965565b909450925050602084013561171b81611677565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f8284036101a0811215611b1c575f5ffd5b610180811215611b2a575f5ffd5b5091936101808501359350915050565b634e487b7160e01b5f52603260045260245ffd5b5f5f8335601e19843603018112611b63575f5ffd5b8301803591506001600160401b03821115611b7c575f5ffd5b6020019150368190038213156119a2575f5ffd5b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b805161174381611726565b5f6101808284031215611beb575f5ffd5b611bf3611784565b825181526020808401519082015260408084015190820152606080840151908201526080808401519082015260a0808401519082015260c0808401519082015260e080840151908201526101008084015190820152