@ensuro/extensions
Version:
Extension contracts that operate with the Ensuro Protocol
1,098 lines • 70.5 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "CashFlowLender",
"sourceName": "contracts/CashFlowLender.sol",
"abi": [
{
"inputs": [
{
"internalType": "contract SignedQuoteRiskModule",
"name": "riskModule_",
"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": "beacon",
"type": "address"
}
],
"name": "BeaconUpgraded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "customer",
"type": "address"
}
],
"name": "CustomerChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "currentDebt",
"type": "uint256"
}
],
"name": "DebtChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint8",
"name": "version",
"type": "uint8"
}
],
"name": "Initialized",
"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": [
{
"indexed": true,
"internalType": "address",
"name": "implementation",
"type": "address"
}
],
"name": "Upgraded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "destination",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "Withdrawal",
"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": "OWNER_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": "RESOLVER_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "currentDebt",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "customer",
"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": "address",
"name": "customer_",
"type": "address"
}
],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"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": "bytes32[]",
"name": "policyData",
"type": "bytes32[]"
},
{
"internalType": "bytes32[]",
"name": "quoteSignatureR",
"type": "bytes32[]"
},
{
"internalType": "bytes32[]",
"name": "quoteSignatureVS",
"type": "bytes32[]"
},
{
"internalType": "uint40[]",
"name": "quoteValidUntil",
"type": "uint40[]"
}
],
"name": "newPoliciesInBatch",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"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": "",
"type": "address"
},
{
"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": "newPolicy",
"outputs": [
{
"internalType": "uint256",
"name": "policyId",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"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": "",
"type": "address"
},
{
"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": "newPolicyFull",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "payout",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "premium",
"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": "contract IRiskModule",
"name": "riskModule",
"type": "address"
},
{
"internalType": "uint40",
"name": "start",
"type": "uint40"
},
{
"internalType": "uint40",
"name": "expiration",
"type": "uint40"
}
],
"internalType": "struct Policy.PolicyData",
"name": "createdPolicy",
"type": "tuple"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"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": "",
"type": "address"
},
{
"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": "newPolicyPaidByHolder",
"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": "",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "",
"type": "bytes"
}
],
"name": "onERC721Received",
"outputs": [
{
"internalType": "bytes4",
"name": "",
"type": "bytes4"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "uint256",
"name": "",
"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": "",
"type": "uint256"
}
],
"name": "onPolicyExpired",
"outputs": [
{
"internalType": "bytes4",
"name": "",
"type": "bytes4"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [],
"name": "proxiableUUID",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "renounceRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "repayDebt",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "payout",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "premium",
"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": "contract IRiskModule",
"name": "riskModule",
"type": "address"
},
{
"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": [
{
"components": [
{
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "payout",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "premium",
"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": "contract IRiskModule",
"name": "riskModule",
"type": "address"
},
{
"internalType": "uint40",
"name": "start",
"type": "uint40"
},
{
"internalType": "uint40",
"name": "expiration",
"type": "uint40"
}
],
"internalType": "struct Policy.PolicyData",
"name": "policy",
"type": "tuple"
},
{
"internalType": "bool",
"name": "customerWon",
"type": "bool"
}
],
"name": "resolvePolicyFullPayout",
"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": [],
"name": "riskModule",
"outputs": [
{
"internalType": "contract SignedQuoteRiskModule",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "customer_",
"type": "address"
}
],
"name": "setCustomer",
"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": "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"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "address",
"name": "destination",
"type": "address"
}
],
"name": "withdraw",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
}
],
"bytecode": "0x60c0604052306080523480156200001557600080fd5b5060405162002db938038062002db9833981016040819052620000389162000189565b6001600160a01b038116620000af5760405162461bcd60e51b815260206004820152603260248201527f43617368466c6f774c656e6465723a207269736b4d6f64756c655f2063616e6e6044820152716f74206265207a65726f206164647265737360701b60648201526084015b60405180910390fd5b620000b9620000cb565b6001600160a01b031660a052620001bb565b600054610100900460ff1615620001355760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000a6565b60005460ff9081161462000187576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200019c57600080fd5b81516001600160a01b0381168114620001b457600080fd5b9392505050565b60805160a051612ba062000219600039600081816104e0015281816107c001528181610abf01528181611037015261182f0152600081816109250152818161096501528181610b5201528181610b920152610c210152612ba06000f3fe6080604052600436106101cc5760003560e01c806365533024116100f7578063a217fddf11610095578063e58378bb11610064578063e58378bb14610579578063e5ef6f4b146105ad578063e8e617b7146105cd578063ffa600e3146105f757600080fd5b8063a217fddf14610504578063c4d66de814610519578063d547741f14610539578063d6281d3e1461055957600080fd5b806378fab260116100d157806378fab2601461045d5780637a702b3c1461049157806391d14854146104b15780639ed1a985146104d157600080fd5b806365533024146102345780636b09de4514610428578063759076e51461044857600080fd5b80632f2ff15d1161016f57806345f739ff1161013e57806345f739ff146103be5780634f1ef286146103e057806352d1902d146103f3578063620c0c4b1461040857600080fd5b80632f2ff15d1461032f57806336568abe146103515780633659cfe6146103715780633711bbf51461039157600080fd5b8063150b7a02116101ab578063150b7a0214610254578063248a9ca31461029957806324ea54f4146102c95780632804b2c0146102fd57600080fd5b8062f714ce146101d157806301ffc9a71461020457806305918a7914610234575b600080fd5b3480156101dd57600080fd5b506101f16101ec366004611f22565b610617565b6040519081526020015b60405180910390f35b34801561021057600080fd5b5061022461021f366004611f52565b610757565b60405190151581526020016101fb565b34801561024057600080fd5b506101f161024f366004611f9f565b610782565b34801561026057600080fd5b5061028061026f366004612025565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020016101fb565b3480156102a557600080fd5b506101f16102b43660046120c4565b60009081526065602052604090206001015490565b3480156102d557600080fd5b506101f17f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b34801561030957600080fd5b5060fb546001600160a01b03165b6040516001600160a01b0390911681526020016101fb565b34801561033b57600080fd5b5061034f61034a366004611f22565b610873565b005b34801561035d57600080fd5b5061034f61036c366004611f22565b61089d565b34801561037d57600080fd5b5061034f61038c3660046120dd565b61091b565b34801561039d57600080fd5b506103b16103ac366004611f9f565b6109fa565b6040516101fb91906120fa565b3480156103ca57600080fd5b506101f1600080516020612b4b83398151915281565b61034f6103ee366004612229565b610b48565b3480156103ff57600080fd5b506101f1610c14565b34801561041457600080fd5b5061034f6104233660046120dd565b610cc7565b34801561043457600080fd5b5061034f6104433660046120c4565b610d47565b34801561045457600080fd5b5060fc546101f1565b34801561046957600080fd5b506101f17f92a19c77d2ea87c7f81d50c74403cb2f401780f3ad919571121efe2bdb427eb181565b34801561049d57600080fd5b5061034f6104ac3660046122ea565b610d7d565b3480156104bd57600080fd5b506102246104cc366004611f22565b610e1d565b3480156104dd57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610317565b34801561051057600080fd5b506101f1600081565b34801561052557600080fd5b5061034f6105343660046120dd565b610e48565b34801561054557600080fd5b5061034f610554366004611f22565b610f53565b34801561056557600080fd5b50610280610574366004612317565b610f78565b34801561058557600080fd5b506101f17fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e81565b3480156105b957600080fd5b5061034f6105c8366004612450565b611011565b3480156105d957600080fd5b506102806105e8366004612590565b63e8e617b760e01b9392505050565b34801561060357600080fd5b5061034f6106123660046125df565b6111df565b60007fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e61064381611248565b6001600160a01b0383166106bd5760405162461bcd60e51b815260206004820152603660248201527f43617368466c6f774c656e6465723a2064657374696e6174696f6e2063616e6e6044820152756f7420626520746865207a65726f206164647265737360501b60648201526084015b60405180910390fd5b60001984036106d5576106ce611252565b93506106e9565b6106e6846106e1611252565b6112cb565b93505b831561074f5761070c83856106fc6112e3565b6001600160a01b0316919061134e565b604080516001600160a01b0385168152602081018690527f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65910160405180910390a15b509192915050565b60006001600160e01b03198216633ece0a8960e01b148061077c575061077c826113b1565b92915050565b6000600080516020612b4b83398151915261079c81611248565b60006107a6611252565b6040516305918a7960e01b81529091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906305918a7990610805908f908f908f908f9030908f908f908f908f9060040161260e565b6020604051808303816000875af1158015610824573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108489190612660565b9250610864610855611252565b61085f908361268f565b6113e6565b50509998505050505050505050565b60008281526065602052604090206001015461088e81611248565b6108988383611436565b505050565b6001600160a01b038116331461090d5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016106b4565b61091782826114bc565b5050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036109635760405162461bcd60e51b81526004016106b4906126a2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166109ac600080516020612b04833981519152546001600160a01b031690565b6001600160a01b0316146109d25760405162461bcd60e51b81526004016106b4906126ee565b6109db81611523565b604080516000808252602082019092526109f79183919061154d565b50565b610a83604051806101c00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b03168152602001600064ffffffffff168152602001600064ffffffffff1681525090565b600080516020612b4b833981519152610a9b81611248565b6000610aa5611252565b604051633711bbf560e01b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633711bbf590610b04908f908f908f908f9030908f908f908f908f9060040161260e565b6101c0604051808303816000875af1158015610b24573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108489190612750565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610b905760405162461bcd60e51b81526004016106b4906126a2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610bd9600080516020612b04833981519152546001600160a01b031690565b6001600160a01b031614610bff5760405162461bcd60e51b81526004016106b4906126ee565b610c0882611523565b6109178282600161154d565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cb45760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016106b4565b50600080516020612b0483398151915290565b7fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e610cf181611248565b60fb80546001600160a01b0319166001600160a01b0384169081179091556040519081527f6916cc5df2feb477b7a3b701cec414e0741c02a90929bebc9c7bee5763f8f75e906020015b60405180910390a15050565b610d5360fc54826112cb565b9050610d5e816116b8565b6109f7333083610d6c6112e3565b6001600160a01b03169291906116ca565b7f92a19c77d2ea87c7f81d50c74403cb2f401780f3ad919571121efe2bdb427eb1610da781611248565b610db9610180840161016085016120dd565b6001600160a01b0316637a702b3c84846040518363ffffffff1660e01b8152600401610de69291906128e2565b600060405180830381600087803b158015610e0057600080fd5b505af1158015610e14573d6000803e3d6000fd5b50505050505050565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600054610100900460ff1615808015610e685750600054600160ff909116105b80610e825750303b158015610e82575060005460ff166001145b610ee55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106b4565b6000805460ff191660011790558015610f08576000805461ff0019166101001790555b610f1182611708565b8015610917576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610d3b565b600082815260656020526040902060010154610f6e81611248565b61089883836114bc565b6000610f8261182b565b6001600160a01b0316336001600160a01b031614610ff65760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c792074686520506f6c696379506f6f6c2073686f756c642063616c6c2060448201526a1d1a1a5cc81b595d1a1bd960aa1b60648201526084016106b4565b610fff8261188b565b50636b140e9f60e11b5b949350505050565b600080516020612b4b83398151915261102981611248565b6000611033611252565b90507f000000000000000000000000000000000000000000000000000000000000000060005b8b518110156111bc57816001600160a01b03166305918a798d8381518110611083576110836128ff565b60200260200101518d848151811061109d5761109d6128ff565b60200260200101518d85815181106110b7576110b76128ff565b60200260200101518d86815181106110d1576110d16128ff565b6020026020010151308e88815181106110ec576110ec6128ff565b60200260200101518e8981518110611106576111066128ff565b60200260200101518e8a81518110611120576111206128ff565b60200260200101518e8b8151811061113a5761113a6128ff565b60200260200101516040518a63ffffffff1660e01b81526004016111669998979695949392919061260e565b6020604051808303816000875af1158015611185573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a99190612660565b50806111b481612915565b915050611059565b506111d26111c8611252565b61085f908461268f565b5050505050505050505050565b7f92a19c77d2ea87c7f81d50c74403cb2f401780f3ad919571121efe2bdb427eb161120981611248565b61121b610180840161016085016120dd565b6001600160a01b031663ffa600e384846040518363ffffffff1660e01b8152600401610de692919061292e565b6109f781336118d8565b600061125c6112e3565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa1580156112a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c69190612660565b905090565b60008183106112da57816112dc565b825b9392505050565b60006112ed61182b565b6001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561132a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c6919061294d565b6040516001600160a01b03831660248201526044810182905261089890849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611931565b60006001600160e01b03198216637965db0b60e01b148061077c57506301ffc9a760e01b6001600160e01b031983161461077c565b8060fc60008282546113f8919061296a565b909155505060fc546040519081527fc2a7810164c21cd1d36a4181f038cf2ca0ec56362e5be49e6f773647374483f89060200160405180910390a150565b6114408282610e1d565b6109175760008281526065602090815260408083206001600160a01b03851684529091529020805460ff191660011790556114783390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6114c68282610e1d565b156109175760008281526065602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504161091781611248565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156115805761089883611a06565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156115da575060408051601f3d908101601f191682019092526115d791810190612660565b60015b61163d5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016106b4565b600080516020612b0483398151915281146116ac5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016106b4565b50610898838383611aa2565b8060fc60008282546113f8919061268f565b6040516001600160a01b03808516602483015283166044820152606481018290526117029085906323b872dd60e01b9060840161137a565b50505050565b600054610100900460ff1661172f5760405162461bcd60e51b81526004016106b49061297d565b611737611ac7565b61173f611ac7565b61174a600033611af0565b60fb80546001600160a01b0319166001600160a01b0383169081179091556040519081527f6916cc5df2feb477b7a3b701cec414e0741c02a90929bebc9c7bee5763f8f75e9060200160405180910390a16117a36112e3565b6001600160a01b031663095ea7b36117b961182b565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260001960248201526044016020604051808303816000875af1158015611807573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091791906129c8565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634d15eb036040518163ffffffff1660e01b8152600401602060405180830381865afa15801561132a573d6000803e3d6000fd5b60fc54811161189d576109f7816116b8565b60fc54156118bf5760fc546118b2908261268f565b90506118bf60fc546116b8565b60fb546109f7906001600160a01b0316826106fc6112e3565b6118e28282610e1d565b610917576118ef81611afa565b6118fa836020611b0c565b60405160200161190b929190612a09565b60408051601f198184030181529082905262461bcd60e51b82526106b491600401612a7e565b6000611986826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ca89092919063ffffffff16565b90508051600014806119a75750808060200190518101906119a791906129c8565b6108985760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106b4565b6001600160a01b0381163b611a735760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016106b4565b600080516020612b0483398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b611aab83611cb7565b600082511180611ab85750805b15610898576117028383611cf7565b600054610100900460ff16611aee5760405162461bcd60e51b81526004016106b49061297d565b565b6109178282611436565b606061077c6001600160a01b03831660145b60606000611b1b836002612ab1565b611b2690600261296a565b67ffffffffffffffff811115611b3e57611b3e6121b8565b6040519080825280601f01601f191660200182016040528015611b68576020820181803683370190505b509050600360fc1b81600081518110611b8357611b836128ff565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611bb257611bb26128ff565b60200101906001600160f81b031916908160001a9053506000611bd6846002612ab1565b611be190600161296a565b90505b6001811115611c59576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611c1557611c156128ff565b1a60f81b828281518110611c2b57611c2b6128ff565b60200101906001600160f81b031916908160001a90535060049490941c93611c5281612ad0565b9050611be4565b5083156112dc5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016106b4565b60606110098484600085611d1c565b611cc081611a06565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606112dc8383604051806060016040528060278152602001612b2460279139611df7565b606082471015611d7d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106b4565b600080866001600160a01b03168587604051611d999190612ae7565b60006040518083038185875af1925050503d8060008114611dd6576040519150601f19603f3d011682016040523d82523d6000602084013e611ddb565b606091505b5091509150611dec87838387611e6f565b979650505050505050565b6060600080856001600160a01b031685604051611e149190612ae7565b600060405180830381855af49150503d8060008114611e4f576040519150601f19603f3d011682016040523d82523d6000602084013e611e54565b606091505b5091509150611e6586838387611e6f565b9695505050505050565b60608315611ede578251600003611ed7576001600160a01b0385163b611ed75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106b4565b5081611009565b6110098383815115611ef35781518083602001fd5b8060405162461bcd60e51b81526004016106b49190612a7e565b6001600160a01b03811681146109f757600080fd5b60008060408385031215611f3557600080fd5b823591506020830135611f4781611f0d565b809150509250929050565b600060208284031215611f6457600080fd5b81356001600160e01b0319811681146112dc57600080fd5b64ffffffffff811681146109f757600080fd5b8035611f9a81611f7c565b919050565b60008060008060008060008060006101208a8c031215611fbe57600080fd5b8935985060208a0135975060408a0135965060608a0135611fde81611f7c565b955060808a0135611fee81611f0d565b945060a08a0135935060c08a0135925060e08a013591506101008a013561201481611f7c565b809150509295985092959850929598565b60008060008060006080868803121561203d57600080fd5b853561204881611f0d565b9450602086013561205881611f0d565b935060408601359250606086013567ffffffffffffffff8082111561207c57600080fd5b818801915088601f83011261209057600080fd5b81358181111561209f57600080fd5b8960208285010111156120b157600080fd5b9699959850939650602001949392505050565b6000602082840312156120d657600080fd5b5035919050565b6000602082840312156120ef57600080fd5b81356112dc81611f0d565b60006101c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e08301526101008084015181840152506101208084015181840152506101408084015181840152506101608084015161218c828501826001600160a01b03169052565b50506101808381015164ffffffffff908116918401919091526101a09384015116929091019190915290565b634e487b7160e01b600052604160045260246000fd5b6040516101c0810167ffffffffffffffff811182821017156121f2576121f26121b8565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612221576122216121b8565b604052919050565b6000806040838503121561223c57600080fd5b823561224781611f0d565b915060208381013567ffffffffffffffff8082111561226557600080fd5b818601915086601f83011261227957600080fd5b81358181111561228b5761228b6121b8565b61229d601f8201601f191685016121f8565b915080825287848285010111156122b357600080fd5b80848401858401376000848284010152508093505050509250929050565b60006101c082840312156122e457600080fd5b50919050565b6000806101e083850312156122fe57600080fd5b61230884846122d1565b946101c0939093013593505050565b6000806000806080858703121561232d57600080fd5b843561233881611f0d565b9350602085013561234881611f0d565b93969395505050506040820135916060013590565b600067ffffffffffffffff821115612377576123776121b8565b5060051b60200190565b600082601f83011261239257600080fd5b813560206123a76123a28361235d565b6121f8565b82815260059290921b840181019181810190868411156123c657600080fd5b8286015b848110156123e157803583529183019183016123ca565b509695505050505050565b600082601f8301126123fd57600080fd5b8135602061240d6123a28361235d565b82815260059290921b8401810191818101908684111561242c57600080fd5b8286015b848110156123e157803561244381611f7c565b8352918301918301612430565b600080600080600080600080610100898b03121561246d57600080fd5b883567ffffffffffffffff8082111561248557600080fd5b6124918c838d01612381565b995060208b01359150808211156124a757600080fd5b6124b38c838d01612381565b985060408b01359150808211156124c957600080fd5b6124d58c838d01612381565b975060608b01359150808211156124eb57600080fd5b6124f78c838d016123ec565b965060808b013591508082111561250d57600080fd5b6125198c838d01612381565b955060a08b013591508082111561252f57600080fd5b61253b8c838d01612381565b945060c08b013591508082111561255157600080fd5b61255d8c838d01612381565b935060e08b013591508082111561257357600080fd5b506125808b828c016123ec565b9150509295985092959890939650565b6000806000606084860312156125a557600080fd5b83356125b081611f0d565b925060208401356125c081611f0d565b929592945050506040919091013590565b80151581146109f757600080fd5b6000806101e083850312156125f357600080fd5b6125fd84846122d1565b91506101c0830135611f47816125d1565b9889526020890197909752604088019590955264ffffffffff93841660608801526001600160a01b0392909216608087015260a086015260c085015260e0840191909152166101008201526101200190565b60006020828403121561267257600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561077c5761077c612679565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b8051611f9a81611f0d565b8051611f9a81611f7c565b60006101c0828403121561276357600080fd5b61276b6121ce565b825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152506101208084015181830152506101408084015181830152506101606127e781850161273a565b908201526101806127f9848201612745565b908201526101a061280b848201612745565b908201529392505050565b8035611f9a81611f0d565b803582526020810135602083015260408101356040830152606081013560608301526080810135608083015260a081013560a083015260c081013560c083015260e081013560e083015261010080820135818401525061012080820135818401525061014080820135818401525061016061289d818301612816565b6001600160a01b0316908301526101806128b8828201611f8f565b64ffffffffff16908301526101a06128d1828201611f8f565b64ffffffffff811684830152611702565b6101e081016128f18285612821565b826101c08301529392505050565b634e487b7160e01b600052603260045260246000fd5b60006001820161292757612927612679565b5060010190565b6101e0810161293d8285612821565b8215156101c08301529392505050565b60006020828403121561295f57600080fd5b81516112dc81611f0d565b8082018082111561077c5761077c612679565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000602082840312156129da57600080fd5b81516112dc816125d1565b60005b83811015612a005781810151838201526020016129e8565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612a418160178501602088016129e5565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612a728160288401602088016129e5565b01602801949350505050565b6020815260008251806020840152612a9d8160408501602087016129e5565b601f01601f19169190910160400192915050565b6000816000190483118215151615612acb57612acb612679565b500290565b600081612adf57612adf612679565b506000190190565b60008251612af98184602087016129e5565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656490fe2ba5da14f172ed5a0a0fec391dbf8f191c9a2f3557d79ede5d6b1c1c9ffba26469706673582212202feaa95d506bdec5522c0d35a13aaaf7b249ea741e355cca5f94daf640cafe9e64736f6c63430008100033",
"deployedBytecode": "0x6080604052600436106101cc5760003560e01c806365533024116100f7578063a217fddf11610095578063e58378bb11610064578063e58378bb14610579578063e5ef6f4b146105ad578063e8e617b7146105cd578063ffa600e3146105f757600080fd5b8063a217fddf14610504578063c4d66de814610519578063d547741f14610539578063d6281d3e1461055957600080fd5b806378fab260116100d157806378fab2601461045d5780637a702b3c1461049157806391d14854146104b15780639ed1a985146104d157600080fd5b806365533024146102345780636b09de4514610428578063759076e51461044857600080fd5b80632f2ff15d1161016f57806345f739ff1161013e57806345f739ff146103be5780634f1ef286146103e057806352d1902d146103f3578063620c0c4b1461040857600080fd5b80632f2ff15d1461032f57806336568abe146103515780633659cfe6146103715780633711bbf51461039157600080fd5b8063150b7a02116101ab578063150b7a0214610254578063248a9ca31461029957806324ea54f4146102c95780632804b2c0146102fd57600080fd5b8062f714ce146101d157806301ffc9a71461020457806305918a7914610234575b600080fd5b3480156101dd57600080fd5b506101f16101ec366004611f22565b610617565b6040519081526020015b60405180910390f35b34801561021057600080fd5b5061022461021f366004611f52565b610757565b60405190151581526020016101fb565b34801561024057600080fd5b506101f161024f366004611f9f565b610782565b34801561026057600080fd5b5061028061026f366004612025565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020016101fb565b3480156102a557600080fd5b506101f16102b43660046120c4565b60009081526065602052604090206001015490565b3480156102d557600080fd5b506101f17f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b34801561030957600080fd5b5060fb546001600160a01b03165b6040516001600160a01b0390911681526020016101fb565b34801561033b57600080fd5b5061034f61034a366004611f22565b610873565b005b34801561035d57600080fd5b5061034f61036c366004611f22565b61089d565b34801561037d57600080fd5b5061034f61038c3660046120dd565b61091b565b34801561039d57600080fd5b506103b16103ac366004611f9f565b6109fa565b6040516101fb91906120fa565b3480156103ca57600080