@ensuro/core
Version:
Ensuro - Blockchain-based insurance protocol
1,318 lines • 92.3 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "PremiumsAccount",
"sourceName": "contracts/PremiumsAccount.sol",
"abi": [
{
"inputs": [
{
"internalType": "contract IPolicyPool",
"name": "policyPool_",
"type": "address"
},
{
"internalType": "contract IEToken",
"name": "juniorEtk_",
"type": "address"
},
{
"internalType": "contract IEToken",
"name": "seniorEtk_",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
}
],
"name": "AddressEmptyCode",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountLeft",
"type": "uint256"
}
],
"name": "CannotBeBorrowed",
"type": "error"
},
{
"inputs": [
{
"internalType": "int256",
"name": "currentDeficit",
"type": "int256"
},
{
"internalType": "int256",
"name": "newMaxDeficit",
"type": "int256"
}
],
"name": "DeficitExceedsMaxDeficit",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "implementation",
"type": "address"
}
],
"name": "ERC1967InvalidImplementation",
"type": "error"
},
{
"inputs": [],
"name": "ERC1967NonPayable",
"type": "error"
},
{
"inputs": [],
"name": "FailedCall",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newDeficitRatio",
"type": "uint256"
}
],
"name": "InvalidDeficitRatio",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "destination",
"type": "address"
}
],
"name": "InvalidDestination",
"type": "error"
},
{
"inputs": [],
"name": "InvalidInitialization",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "loanLimit",
"type": "uint256"
}
],
"name": "InvalidLoanLimit",
"type": "error"
},
{
"inputs": [
{
"internalType": "contract IEToken",
"name": "oldEToken",
"type": "address"
},
{
"internalType": "contract IEToken",
"name": "newEToken",
"type": "address"
}
],
"name": "InvalidUpgradeETokenChanged",
"type": "error"
},
{
"inputs": [],
"name": "InvalidYieldVault",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "losses",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "excess",
"type": "uint256"
}
],
"name": "LossesCannotExceedMaxDeficit",
"type": "error"
},
{
"inputs": [],
"name": "NoZeroPolicyPool",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "required",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "available",
"type": "uint256"
}
],
"name": "NotEnoughCash",
"type": "error"
},
{
"inputs": [],
"name": "NotInitializing",
"type": "error"
},
{
"inputs": [],
"name": "OnlyPolicyPool",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "receiver",
"type": "address"
}
],
"name": "ReserveInvalidReceiver",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint8",
"name": "bits",
"type": "uint8"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "SafeCastOverflowedUintDowncast",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
}
],
"name": "SafeERC20FailedOperation",
"type": "error"
},
{
"inputs": [],
"name": "UUPSUnauthorizedCallContext",
"type": "error"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "slot",
"type": "bytes32"
}
],
"name": "UUPSUnsupportedProxiableUUID",
"type": "error"
},
{
"inputs": [],
"name": "UpgradeCannotChangePolicyPool",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountRequired",
"type": "uint256"
},
{
"internalType": "int256",
"name": "surplus",
"type": "int256"
}
],
"name": "WithdrawExceedsSurplus",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "oldRatio",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "newRatio",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "adjustment",
"type": "uint256"
}
],
"name": "DeficitRatioChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "int256",
"name": "earnings",
"type": "int256"
}
],
"name": "EarningsRecorded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "contract IERC4626",
"name": "oldVault",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "shares",
"type": "uint256"
}
],
"name": "ErrorIgnoredDeinvestingVault",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint64",
"name": "version",
"type": "uint64"
}
],
"name": "Initialized",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "oldLimit",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "newLimit",
"type": "uint256"
},
{
"indexed": false,
"internalType": "bool",
"name": "isSenior",
"type": "bool"
}
],
"name": "LoanLimitChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "implementation",
"type": "address"
}
],
"name": "Upgraded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "bool",
"name": "moneyIn",
"type": "bool"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "WonPremiumsInOut",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "contract IERC4626",
"name": "oldVault",
"type": "address"
},
{
"indexed": true,
"internalType": "contract IERC4626",
"name": "newVault",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "forced",
"type": "bool"
}
],
"name": "YieldVaultChanged",
"type": "event"
},
{
"inputs": [],
"name": "UPGRADE_INTERFACE_VERSION",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "activePurePremiums",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "borrowedActivePP",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "currency",
"outputs": [
{
"internalType": "contract IERC20Metadata",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "deficitRatio",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "depositIntoYieldVault",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "etks",
"outputs": [
{
"internalType": "contract IEToken",
"name": "",
"type": "address"
},
{
"internalType": "contract IEToken",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "fundsAvailable",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "investedInYV",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "jrLoanLimit",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "juniorEtk",
"outputs": [
{
"internalType": "contract IEToken",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"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": "purePremiumRefund",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "jrCocRefund",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "srCocRefund",
"type": "uint256"
},
{
"internalType": "address",
"name": "policyHolder",
"type": "address"
}
],
"name": "policyCancelled",
"outputs": [],
"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"
}
],
"name": "policyCreated",
"outputs": [],
"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"
}
],
"name": "policyExpired",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "policyPool",
"outputs": [
{
"internalType": "contract IPolicyPool",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"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": "oldPolicy",
"type": "tuple"
},
{
"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": "newPolicy",
"type": "tuple"
}
],
"name": "policyReplaced",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "policyHolder",
"type": "address"
},
{
"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": "policyResolvedWithPayout",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "proxiableUUID",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "purePremiums",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "receiveGrant",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "recordEarnings",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "repayLoans",
"outputs": [
{
"internalType": "uint256",
"name": "available",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "seniorEtk",
"outputs": [
{
"internalType": "contract IEToken",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newRatio",
"type": "uint256"
},
{
"internalType": "bool",
"name": "adjustment",
"type": "bool"
}
],
"name": "setDeficitRatio",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newLimitJr",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "newLimitSr",
"type": "uint256"
}
],
"name": "setLoanLimits",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IERC4626",
"name": "newYieldVault",
"type": "address"
},
{
"internalType": "bool",
"name": "force",
"type": "bool"
}
],
"name": "setYieldVault",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "srLoanLimit",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes4",
"name": "interfaceId",
"type": "bytes4"
}
],
"name": "supportsInterface",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "surplus",
"outputs": [
{
"internalType": "int256",
"name": "",
"type": "int256"
}
],
"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": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "withdrawFromYieldVault",
"outputs": [
{
"internalType": "uint256",
"name": "deinvested",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "address",
"name": "destination",
"type": "address"
}
],
"name": "withdrawWonPremiums",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "wonPurePremiums",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "yieldVault",
"outputs": [
{
"internalType": "contract IERC4626",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
}
],
"bytecode": "0x61010060405230608052348015610014575f5ffd5b50604051613e5a380380613e5a83398101604081905261003391610149565b82806001600160a01b03811661005c57604051636b23cf0160e01b815260040160405180910390fd5b610064610083565b6001600160a01b0390811660a05292831660c052501660e05250610193565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100d35760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101325780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b0381168114610132575f5ffd5b5f5f5f6060848603121561015b575f5ffd5b835161016681610135565b602085015190935061017781610135565b604085015190925061018881610135565b809150509250925092565b60805160a05160c05160e051613b916102c95f395f818161041b01528181610473015281816116470152818161173001528181611976015281816119ac01528181611b5c01528181611eef015281816121c60152818161226c01528181612a6c01528181612ef401528181612f2f0152612f5b01525f81816103b8015281816103f601528181610c97015281816114b20152818161159b015281816119df01528181611a1501528181611ab001528181611e2c01528181611f9b0152818161204b015281816120f40152818161298801528181612e3701528181612e720152612e9e01525f81816102f0015281816108f001528181610d8901528181611439015281816117ce0152818161187301528181611a44015261325501525f81816124430152818161246c01526126010152613b915ff3fe6080604052600436106101fc575f3560e01c806376185ff111610113578063ac860f741161009d578063e5a6b10f1161006d578063e5a6b10f146105e7578063e823584a146105fb578063ee1f9a6a1461060f578063f39a4bc51461062e578063f79ac18314610642575f5ffd5b8063ac860f741461054d578063ad3cb1cc1461056c578063d336078c146105a9578063d5c6c166146105c8575f5ffd5b80638129fc1c116100e35780638129fc1c146104bf57806381ced71f146104d357806397a146c0146104f2578063a0ce58b814610511578063a7f8a5e214610530575f5ffd5b806376185ff1146104465780637b83037b146104655780637bb62319146104975780637d919a97146104ab575f5ffd5b80634d15eb031161019457806350093f041161016457806350093f041461036357806352d1902d14610382578063536c9a4314610396578063536ebbfc146103aa5780635e445859146103dc575f5ffd5b80634d15eb03146102e25780634eb978a4146103285780634f1ef2861461033c5780634fe0bd1e1461034f575f5ffd5b80631dda2899116101cf5780631dda28991461028757806326ccbd22146102a65780632d8f892a146102ba5780634863c8b0146102ce575f5ffd5b806301ffc9a7146102005780631388856514610234578063194448e5146102525780631a548a2714610273575b5f5ffd5b34801561020b575f5ffd5b5061021f61021a3660046134ab565b610661565b60405190151581526020015b60405180910390f35b34801561023f575f5ffd5b506065545b60405190815260200161022b565b34801561025d575f5ffd5b5061027161026c3660046134f3565b61068c565b005b34801561027e575f5ffd5b50606454610244565b348015610292575f5ffd5b506102716102a1366004613541565b6108e5565b3480156102b1575f5ffd5b506102446109c0565b3480156102c5575f5ffd5b506102446109d6565b3480156102d9575f5ffd5b50610244610a0c565b3480156102ed575f5ffd5b507f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b03909116815260200161022b565b348015610333575f5ffd5b50610271610a2d565b61027161034a3660046135ef565b610b62565b34801561035a575f5ffd5b50610244610b81565b34801561036e575f5ffd5b5061027161037d366004613696565b610b9f565b34801561038d575f5ffd5b50610244610d4b565b3480156103a1575f5ffd5b50610244610d67565b3480156103b5575f5ffd5b507f0000000000000000000000000000000000000000000000000000000000000000610310565b3480156103e7575f5ffd5b50604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811682527f00000000000000000000000000000000000000000000000000000000000000001660208201520161022b565b348015610451575f5ffd5b506102716104603660046136b9565b610d7e565b348015610470575f5ffd5b507f0000000000000000000000000000000000000000000000000000000000000000610310565b3480156104a2575f5ffd5b50610244610e04565b3480156104b6575f5ffd5b50603254610244565b3480156104ca575f5ffd5b50610271610e34565b3480156104de575f5ffd5b506102716104ed3660046136d4565b610f2b565b3480156104fd575f5ffd5b5061027161050c3660046136eb565b610f91565b34801561051c575f5ffd5b5061024461052b36600461370b565b6110f4565b34801561053b575f5ffd5b506066546001600160a01b0316610310565b348015610558575f5ffd5b506102716105673660046136d4565b611208565b348015610577575f5ffd5b5061059c604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161022b919061372e565b3480156105b4575f5ffd5b506102446105c33660046136d4565b61138e565b3480156105d3575f5ffd5b506102716105e2366004613763565b61142e565b3480156105f2575f5ffd5b506103106117cb565b348015610606575f5ffd5b5061024461184c565b34801561061a575f5ffd5b50610271610629366004613798565b611868565b348015610639575f5ffd5b50610244611936565b34801561064d575f5ffd5b5061027161065c3660046136b9565b611a39565b5f61066b82611bf0565b8061068657506001600160e01b0319821663f7e4b01b60e01b145b92915050565b5f5f6106966117cb565b90506001600160a01b038416158061071e5750806001600160a01b0316846001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061071391906137ee565b6001600160a01b0316145b61073b57604051638959269160e01b815260040160405180910390fd5b5f61074e6066546001600160a01b031690565b90505f6001600160a01b03821615610863576040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa1580156107a4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107c89190613809565b905080156108615785156107e9576107e08382611c25565b95509150610861565b604051635d043b2960e11b815260048101829052306024820181905260448201526001600160a01b0384169063ba087652906064016020604051808303815f875af115801561083a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085e9190613809565b91505b505b606680546001600160a01b0319166001600160a01b0388161790556108946032548261088f9190613834565b611d68565b5f60325560405184151581526001600160a01b0380881691908416907f243f9479bbdaf9f3395e726975293ee3724f3819f4322a018c98afb9de70a1e09060200160405180910390a3505050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461092e5760405163799e780f60e01b815260040160405180910390fd5b8160a0013560645f8282546109439190613853565b909155505f905061096061095b60a085013584613834565b611dcd565b905080156109955761097f61097a3685900385018561387f565b611e20565b61099081855f866040013511611f7d565b6109a7565b6109a761097a3685900385018561387f565b6109ba846109b58385613853565b6122fc565b50505050565b5f6065546064546109d19190613927565b905090565b6066545f90600160a01b900463ffffffff1615610a06576066546109d190600160a01b900463ffffffff166123b5565b505f1990565b6066545f906109d190655af3107a400090600160e01b900461ffff1661394e565b5f610a406066546001600160a01b031690565b90506001600160a01b038116610a6957604051638959269160e01b815260040160405180910390fd5b6040516370a0823160e01b81523060048201525f906001600160a01b038316906307a2d13a9082906370a0823190602401602060405180830381865afa158015610ab5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ad99190613809565b6040518263ffffffff1660e01b8152600401610af791815260200190565b602060405180830381865afa158015610b12573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b369190613809565b90505f60325482610b479190613834565b90508015610b5d576032829055610b5d81611d68565b505050565b610b6a612438565b610b73826124de565b610b7d82826124e7565b5050565b5f610b92610b8d610a0c565b6125a3565b6065546109d19190613834565b5f610bb8610bb3655af3107a400085613979565b6125c4565b9050670de0b6b3a76400008311158015610be4575082610be2655af3107a400061ffff841661394e565b145b8390610c0f576040516346c20ab760e01b8152600401610c0691815260200190565b60405180910390fd5b505f610c1a846125a3565b905082158015610c2b575080606554125b15610c6757606554610c3c90613998565b610c4582613998565b60405163287223f960e01b815260048101929092526024820152604401610c06565b5f816065541215610cc65781606554610c7f90613998565b610c899190613927565b60658390559050610cc681307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161515611f7d565b6066547f5b2441044bd7b1320018e9cf93f7a9a26d14db096298500121b8370aff51133d90610d0790655af3107a400090600160e01b900461ffff1661394e565b6040805191825260208201889052810183905260600160405180910390a150506066805461ffff909216600160e01b0261ffff60e01b199092169190911790555050565b5f610d546125f6565b505f516020613b3c5f395f51905f525b90565b5f5f6065541215610d7757505f90565b5060655490565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610dc75760405163799e780f60e01b815260040160405180910390fd5b8060a0013560645f828254610ddc9190613853565b90915550610def905060a082013561263f565b610e0161097a3683900383018361387f565b50565b6066545f90600160c01b900463ffffffff1615610a06576066546109d190600160c01b900463ffffffff166123b5565b5f610e3d612658565b805490915060ff600160401b820416159067ffffffffffffffff165f81158015610e645750825b90505f8267ffffffffffffffff166001148015610e805750303b155b905081158015610e8e575080155b15610eac5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ed657845460ff60401b1916600160401b1785555b610ede612680565b8315610f2457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050565b610f348161263f565b610f53333083610f426117cb565b6001600160a01b0316929190612698565b6040805160018152602081018390527fd60d524f1cae273480bb0a4ddfb992b6ac0b61c8e12ffbe2e4e31463f9e9019991015b60405180910390a150565b5f198214611043577f1366686786a1d0cde83e2e2241a477fcf29662506a51f052f72e47b15729bf0b610fc26109d6565b60408051918252602082018590525f9082015260600160405180910390a1610fe9826126ce565b6066805463ffffffff60a01b1916600160a01b63ffffffff93841681029190911791829055849261101e9291909104166123b5565b14829061104157604051634a8fd66f60e01b8152600401610c0691815260200190565b505b5f198114610b7d577f1366686786a1d0cde83e2e2241a477fcf29662506a51f052f72e47b15729bf0b611074610e04565b604080519182526020820184905260019082015260600160405180910390a161109c816126ce565b6066805463ffffffff60c01b1916600160c01b63ffffffff9384168102919091179182905583926110d19291909104166123b5565b148190610b5d57604051634a8fd66f60e01b8152600401610c0691815260200190565b5f816001600160a01b03811661112957604051638eaba6f960e01b81526001600160a01b039091166004820152602401610c06565b505f61113d6066546001600160a01b031690565b6001600160a01b03161461115357611153610a2d565b5f198303611175575f6065541361116b57505f610686565b60655492506111a7565b6065548390808213156111a45760405163241b522760e11b815260048101929092526024820152604401610c06565b50505b8260655f8282546111b89190613834565b909155506111c8905082846122fc565b604080515f8152602081018590527fd60d524f1cae273480bb0a4ddfb992b6ac0b61c8e12ffbe2e4e31463f9e90199910160405180910390a15090919050565b5f61121b6066546001600160a01b031690565b90506001600160a01b03811661124457604051638959269160e01b815260040160405180910390fd5b5f61124d612753565b90505f19830361125f5780925061128e565b82818082111561128b5760405163531309fb60e11b815260048101929092526024820152604401610c06565b50505b8260325f82825461129f91906139b2565b909155506112ad90506117cb565b60405163095ea7b360e01b81526001600160a01b03848116600483015260248201869052919091169063095ea7b3906044016020604051808303815f875af11580156112fb573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061131f91906139c5565b50604051636e553f6560e01b8152600481018490523060248201526001600160a01b03831690636e553f65906044016020604051808303815f875af115801561136a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109ba9190613809565b5f611397610a2d565b5f6113aa6066546001600160a01b031690565b90505f19830361141d5760405163ce96cb7760e01b81523060048201526001600160a01b0382169063ce96cb7790602401602060405180830381865afa1580156113f6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061141a9190613809565b92505b61142781846127c4565b5090919050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114775760405163799e780f60e01b815260040160405180910390fd5b61148960a08084013590830135613853565b60645f82825461149991906139b2565b9091555050604082013515611587576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a227dc41833560408501356114f56114f03688900388018861387f565b612877565b61150c6115073689900389018961387f565b6128bf565b61151e6115073689900389018961387f565b6115289190613834565b6040516001600160e01b031960e087901b16815260048101949094526024840192909252604483015260648201526084015f604051808303815f87803b158015611570575f5ffd5b505af1158015611582573d5f5f3e3d5ffd5b505050505b604081013515611633576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016634ffcda8c823560408401356115d96114f03687900387018761387f565b6040516001600160e01b031960e086901b1681526004810193909352602483019190915260448201526064015f604051808303815f87803b15801561161c575f5ffd5b505af115801561162e573d5f5f3e3d5ffd5b505050505b60608201351561171c576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a227dc418335606085013561168a6116853688900388018861387f565b612902565b6116a161169c3689900389018961387f565b612943565b6116b361169c3689900389018961387f565b6116bd9190613834565b6040516001600160e01b031960e087901b16815260048101949094526024840192909252604483015260648201526084015f604051808303815f87803b158015611705575f5ffd5b505af1158015611717573d5f5f3e3d5ffd5b505050505b606081013515610b7d576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016634ffcda8c8235606084013561176e6116853687900387018761387f565b6040516001600160e01b031960e086901b1681526004810193909352602483019190915260448201526064015f604051808303815f87803b1580156117b1575f5ffd5b505af11580156117c3573d5f5f3e3d5ffd5b505050505050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611828573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109d191906137ee565b5f5f6065541215611863576065546109d190613998565b505f90565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146118b15760405163799e780f60e01b815260040160405180910390fd5b8460a0013560645f8282546118c69190613853565b909155505f90506118de61095b60a088013587613834565b90508015611916576119006118f83688900388018861387f565b85858561297c565b61191181835f896040013511611f7d565b611928565b6119286118f83688900388018861387f565b6117c3826109b58388613853565b5f8061194a6066546001600160a01b031690565b6001600160a01b03161461196057611960610a2d565b611968610b81565b905080158015906119a157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b156119d3576119d0817f0000000000000000000000000000000000000000000000000000000000000000612b49565b90505b8015801590611a0a57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b15610d64576109d1817f0000000000000000000000000000000000000000000000000000000000000000612b49565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611a825760405163799e780f60e01b815260040160405180910390fd5b8060a0013560645f828254611a9791906139b2565b9091555050604081013515611b48576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016634ffcda8c82356040840135611aee6114f03687900387018761387f565b6040516001600160e01b031960e086901b1681526004810193909352602483019190915260448201526064015f604051808303815f87803b158015611b31575f5ffd5b505af1158015611b43573d5f5f3e3d5ffd5b505050505b606081013515610e01576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016634ffcda8c82356060840135611b9a6116853687900387018761387f565b6040516001600160e01b031960e086901b1681526004810193909352602483019190915260448201526064015b5f604051808303815f87803b158015611bde575f5ffd5b505af1158015610f24573d5f5f3e3d5ffd5b5f6001600160e01b031982166301ffc9a760e01b148061068657506001600160e01b03198216634d15eb0360e01b1492915050565b604051636c82bbbf60e11b81523060048201525f9081906001600160a01b0385169063d905777e90602401602060405180830381865afa925050508015611c89575060408051601f3d908101601f19168201909252611c8691810190613809565b60015b15611ca05783811015611c9e57600191508093505b505b604051635d043b2960e11b815260048101849052306024820181905260448201526001600160a01b0385169063ba087652906064016020604051808303815f875af1925050508015611d0f575060408051601f3d908101601f19168201909252611d0c91810190613809565b60015b611d5e57836001600160a01b03167f25bce30047860a48c9d8830dbf31873be5434f4d28f14a5808a4ea8e35d0829684604051611d4e91815260200190565b60405180910390a2506001611d61565b91505b9250929050565b5f8112611d7d57611d788161263f565b611dc4565b5f611d8a61095b83613998565b90508015611d9783613998565b829091611dc057604051630fc2324b60e11b815260048101929092526024820152604401610c06565b5050505b610e0181612d5e565b5f5f82606554611ddd9190613834565b90505f611deb610b8d610a0c565b9050808212611dff5750606555505f919050565b606581905580611e0e83613998565b611e189190613927565b949350505050565b604081015115611ee3577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a227dc41825f01518360400151611e6b85612877565b611e74866128bf565b866101000151611e849190613834565b6040516001600160e01b031960e087901b16815260048101949094526024840192909252604483015260648201526084015f604051808303815f87803b158015611ecc575f5ffd5b505af1158015611ede573d5f5f3e3d5ffd5b505050505b606081015115610e01577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a227dc41825f01518360600151611f2e85612902565b611f3786612943565b866101200151611f479190613834565b6040516001600160e01b031960e087901b1681526004810194909452602484019290925260448301526064820152608401611bc7565b8281156121a1576040516333481fc960e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333481fc990602401602060405180830381865afa158015611fe8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061200c9190613809565b90506120166109d6565b61202086836139b2565b116120bc576040516330f7e76b60e21b8152600481018690526001600160a01b0385811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c3df9dac906044016020604051808303815f875af1158015612091573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120b59190613809565b915061219f565b6120c46109d6565b81101561219f575f6120d46109d6565b6120de87846139b2565b6120e89190613853565b90506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c3df9dac6121238389613853565b6040516001600160e01b031960e084901b16815260048101919091526001600160a01b03881660248201526044016020604051808303815f875af115801561216d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121919190613809565b61219b90826139b2565b9250505b505b80156109ba576121af610e04565b6040516333481fc960e01b815230600482015282907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333481fc990602401602060405180830381865afa158015612213573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122379190613809565b61224191906139b2565b116122d9576040516330f7e76b60e21b8152600481018290526001600160a01b0384811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c3df9dac906044016020604051808303815f875af11580156122b2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122d69190613809565b90505b808015610f245760405163093f664360e01b8152600401610c0691815260200190565b816001600160a01b03811661233057604051636427f27360e11b81526001600160a01b039091166004820152602401610c06565b50805f0361233c575050565b5f612345612753565b905081811015612388575f6123626066546001600160a01b031690565b90506001600160a01b0381161561238657612386816123818486613853565b6127c4565b505b6001600160a01b0383163014610b5d57610b5d83836123a56117cb565b6001600160a01b03169190612d8e565b5f6123be6117cb565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123f9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061241d91906139e0565b61242890600a613ae3565b6106869063ffffffff841661394e565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806124be57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166124b25f516020613b3c5f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156124dc576040516