@ensuro/price-risk-module
Version:
Price Risk Module for the Ensuro Protocol
1,245 lines • 116 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "ForwardPayoutAutomation",
"sourceName": "contracts/payout-automations/ForwardPayoutAutomation.sol",
"abi": [
{
"inputs": [
{
"internalType": "contract IPolicyPool",
"name": "policyPool_",
"type": "address"
},
{
"internalType": "address",
"name": "automate_",
"type": "address"
},
{
"internalType": "contract IWETH9",
"name": "weth_",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "previousAdmin",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "newAdmin",
"type": "address"
}
],
"name": "AdminChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "approved",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "operator",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "approved",
"type": "bool"
}
],
"name": "ApprovalForAll",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "beacon",
"type": "address"
}
],
"name": "BeaconUpgraded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint8",
"name": "version",
"type": "uint8"
}
],
"name": "Initialized",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "contract IPriceOracle",
"name": "oracle",
"type": "address"
}
],
"name": "OracleSet",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "previousAdminRole",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "newAdminRole",
"type": "bytes32"
}
],
"name": "RoleAdminChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "RoleGranted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "RoleRevoked",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"components": [
{
"internalType": "enum SwapLibrary.SwapProtocol",
"name": "protocol",
"type": "uint8"
},
{
"internalType": "uint256",
"name": "maxSlippage",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "customParams",
"type": "bytes"
}
],
"indexed": false,
"internalType": "struct SwapLibrary.SwapConfig",
"name": "swapConfig",
"type": "tuple"
}
],
"name": "SwapConfigSet",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "implementation",
"type": "address"
}
],
"name": "Upgraded",
"type": "event"
},
{
"inputs": [],
"name": "DEFAULT_ADMIN_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "GUARDIAN_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "SET_ORACLE_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "SET_SWAP_CONFIG_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "approve",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "automate",
"outputs": [
{
"internalType": "contract IAutomate",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IPriceRiskModule",
"name": "riskModule",
"type": "address"
},
{
"internalType": "uint256",
"name": "policyId",
"type": "uint256"
}
],
"name": "checker",
"outputs": [
{
"internalType": "bool",
"name": "canExec",
"type": "bool"
},
{
"internalType": "bytes",
"name": "execPayload",
"type": "bytes"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "dedicatedMsgSender",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "fundsOwner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "getApproved",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
}
],
"name": "getRoleAdmin",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "grantRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "hasRole",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "name_",
"type": "string"
},
{
"internalType": "string",
"name": "symbol_",
"type": "string"
},
{
"internalType": "address",
"name": "admin",
"type": "address"
},
{
"internalType": "contract IPriceOracle",
"name": "oracle_",
"type": "address"
},
{
"components": [
{
"internalType": "enum SwapLibrary.SwapProtocol",
"name": "protocol",
"type": "uint8"
},
{
"internalType": "uint256",
"name": "maxSlippage",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "customParams",
"type": "bytes"
}
],
"internalType": "struct SwapLibrary.SwapConfig",
"name": "swapConfig_",
"type": "tuple"
}
],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "operator",
"type": "address"
}
],
"name": "isApprovedForAll",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IPriceRiskModule",
"name": "riskModule",
"type": "address"
},
{
"internalType": "uint256",
"name": "triggerPrice",
"type": "uint256"
},
{
"internalType": "bool",
"name": "lower",
"type": "bool"
},
{
"internalType": "uint256",
"name": "payout",
"type": "uint256"
},
{
"internalType": "uint40",
"name": "expiration",
"type": "uint40"
},
{
"internalType": "address",
"name": "onBehalfOf",
"type": "address"
}
],
"name": "newPolicy",
"outputs": [
{
"internalType": "uint256",
"name": "policyId",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IPriceRiskModule",
"name": "riskModule",
"type": "address"
},
{
"internalType": "uint256",
"name": "triggerPrice",
"type": "uint256"
},
{
"internalType": "bool",
"name": "lower",
"type": "bool"
},
{
"internalType": "uint256",
"name": "payout",
"type": "uint256"
},
{
"internalType": "uint40",
"name": "expiration",
"type": "uint40"
},
{
"internalType": "address",
"name": "onBehalfOf",
"type": "address"
},
{
"internalType": "uint256",
"name": "permitValue",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "permitDeadline",
"type": "uint256"
},
{
"internalType": "uint8",
"name": "permitV",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "permitR",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "permitS",
"type": "bytes32"
}
],
"name": "newPolicyWithPermit",
"outputs": [
{
"internalType": "uint256",
"name": "policyId",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "onERC721Received",
"outputs": [
{
"internalType": "bytes4",
"name": "",
"type": "bytes4"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "onPayoutReceived",
"outputs": [
{
"internalType": "bytes4",
"name": "",
"type": "bytes4"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "onPolicyExpired",
"outputs": [
{
"internalType": "bytes4",
"name": "",
"type": "bytes4"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "oracle",
"outputs": [
{
"internalType": "contract IPriceOracle",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "ownerOf",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "proxiableUUID",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "policyId",
"type": "uint256"
}
],
"name": "recoverPolicy",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "renounceRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "revokeRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "safeTransferFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "safeTransferFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "operator",
"type": "address"
},
{
"internalType": "bool",
"name": "approved",
"type": "bool"
}
],
"name": "setApprovalForAll",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IPriceOracle",
"name": "oracle_",
"type": "address"
}
],
"name": "setOracle",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "enum SwapLibrary.SwapProtocol",
"name": "protocol",
"type": "uint8"
},
{
"internalType": "uint256",
"name": "maxSlippage",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "customParams",
"type": "bytes"
}
],
"internalType": "struct SwapLibrary.SwapConfig",
"name": "swapConfig_",
"type": "tuple"
}
],
"name": "setSwapConfig",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes4",
"name": "interfaceId",
"type": "bytes4"
}
],
"name": "supportsInterface",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "swapConfig",
"outputs": [
{
"components": [
{
"internalType": "enum SwapLibrary.SwapProtocol",
"name": "protocol",
"type": "uint8"
},
{
"internalType": "uint256",
"name": "maxSlippage",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "customParams",
"type": "bytes"
}
],
"internalType": "struct SwapLibrary.SwapConfig",
"name": "",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "taskTreasury",
"outputs": [
{
"internalType": "contract ITaskTreasuryUpgradable",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "index",
"type": "uint256"
}
],
"name": "tokenByIndex",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "uint256",
"name": "index",
"type": "uint256"
}
],
"name": "tokenOfOwnerByIndex",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "tokenURI",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newImplementation",
"type": "address"
}
],
"name": "upgradeTo",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newImplementation",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "upgradeToAndCall",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
},
{
"internalType": "address",
"name": "_token",
"type": "address"
}
],
"name": "withdrawFunds",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"stateMutability": "payable",
"type": "receive"
}
],
"bytecode": "0x6101a060405230610120523480156200001757600080fd5b50604051620059e8380380620059e88339810160408190526200003a9162000403565b8282828282308130816001600160a01b03166080816001600160a01b031681525050816001600160a01b031663573ea5756040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200009b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000c1919062000457565b6001600160a01b0390811660c0526040516337b6269f60e21b8152908216600482015273c815db16d4be6ddf2685c201937905abf338f5d79063ded89a7c906024016040805180830381865afa15801562000120573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200014691906200047e565b506001600160a01b0390811660a05283811660e0526080516040805163e60a321360e01b8152905191909216935063e60a3213925060048083019260209291908290030181865afa158015620001a0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001c6919062000457565b6001600160a01b0390811661010052831691506200025390505760405162461bcd60e51b815260206004820152603c60248201527f5061796f75744175746f6d6174696f6e426173653a20706f6c696379506f6f6c60448201527f5f2063616e6e6f7420626520746865207a65726f20616464726573730000000060648201526084015b60405180910390fd5b6001600160a01b03908116610140528116620002d85760405162461bcd60e51b815260206004820152603760248201527f5061796f75744175746f6d6174696f6e4261736547656c61746f3a205745544860448201527f20616464726573732063616e6e6f74206265207a65726f00000000000000000060648201526084016200024a565b806001600160a01b0316610180816001600160a01b031681525050610140516001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000335573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200035b919062000457565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000399573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003bf9190620004c1565b620003cc906012620004fc565b620003d990600a6200061b565b61016052506200062c945050505050565b6001600160a01b03811681146200040057600080fd5b50565b6000806000606084860312156200041957600080fd5b83516200042681620003ea565b60208501519093506200043981620003ea565b60408501519092506200044c81620003ea565b809150509250925092565b6000602082840312156200046a57600080fd5b81516200047781620003ea565b9392505050565b600080604083850312156200049257600080fd5b82516200049f81620003ea565b60208401519092508015158114620004b657600080fd5b809150509250929050565b600060208284031215620004d457600080fd5b815160ff811681146200047757600080fd5b634e487b7160e01b600052601160045260246000fd5b60ff8281168282160390811115620005185762000518620004e6565b92915050565b600181815b808511156200055f578160001904821115620005435762000543620004e6565b808516156200055157918102915b93841c939080029062000523565b509250929050565b600082620005785750600162000518565b81620005875750600062000518565b8160018114620005a05760028114620005ab57620005cb565b600191505062000518565b60ff841115620005bf57620005bf620004e6565b50506001821b62000518565b5060208310610133831016604e8410600b8410161715620005f0575081810a62000518565b620005fc83836200051e565b8060001904821115620006135762000613620004e6565b029392505050565b60006200047760ff84168362000567565b60805160a05160c05160e05161010051610120516101405161016051610180516152b86200073060003960008181612c280152612d3a0152600061296f015260008181610b3f015281816117e701528181611ac901528181611b6e01528181611be9015281816123fa01528181612ba601528181612dc301528181613d6e0152613e05015260008181610d5b01528181610d9b01528181610e5501528181610e950152610fb701526000818161086601526114ce0152600081816105290152818161140701526114970152600081816137440152613809015260006104550152600081816102c9015281816125850152818161288b015261365b01526152b86000f3fe6080604052600436106102765760003560e01c80636352211e1161014f578063aa4ae7a0116100c1578063d547741f1161007a578063d547741f14610814578063d6281d3e14610834578063e60a321314610854578063e8e617b714610888578063e985e9c5146108a8578063f20758e8146108f157600080fd5b8063aa4ae7a014610732578063b740a83f14610752578063b88d4fde14610772578063be2a9de914610792578063c0f6934e146107c6578063c87b56dd146107f457600080fd5b80637dc0d1d0116101135780637dc0d1d0146106895780638cead7f1146106a857806391d14854146106c857806395d89b41146106e8578063a217fddf146106fd578063a22cb4651461071257600080fd5b80636352211e146105e95780636479a3e31461060957806370a0823114610629578063744bfe61146106495780637adbf9731461066957600080fd5b80632f2ff15d116101e857806346ee3c59116101ac57806346ee3c59146105175780634f1ef2861461054b5780634f6ccce71461055e57806352d1902d1461057e57806353da9f51146105935780635e075df7146105b557600080fd5b80632f2ff15d146104775780632f745c591461049757806336568abe146104b75780633659cfe6146104d757806342842e0e146104f757600080fd5b8063150b7a021161023a578063150b7a021461036757806318160ddd146103a057806323b872dd146103bf578063248a9ca3146103df57806324ea54f41461040f57806328f150eb1461044357600080fd5b806301ffc9a714610282578063049aacfe146102b757806306fdde0314610303578063081812fc14610325578063095ea7b31461034557600080fd5b3661027d57005b600080fd5b34801561028e57600080fd5b506102a261029d3660046140df565b610911565b60405190151581526020015b60405180910390f35b3480156102c357600080fd5b506102eb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102ae565b34801561030f57600080fd5b50610318610967565b6040516102ae919061414c565b34801561033157600080fd5b506102eb61034036600461415f565b6109f9565b34801561035157600080fd5b5061036561036036600461418d565b610a20565b005b34801561037357600080fd5b506103876103823660046141b9565b610b3a565b6040516001600160e01b031990911681526020016102ae565b3480156103ac57600080fd5b5060cb545b6040519081526020016102ae565b3480156103cb57600080fd5b506103656103da366004614257565b610be7565b3480156103eb57600080fd5b506103b16103fa36600461415f565b60009081526065602052604090206001015490565b34801561041b57600080fd5b506103b17f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b34801561044f57600080fd5b506102eb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561048357600080fd5b50610365610492366004614298565b610c18565b3480156104a357600080fd5b506103b16104b236600461418d565b610c3d565b3480156104c357600080fd5b506103656104d2366004614298565b610cd3565b3480156104e357600080fd5b506103656104f23660046142c8565b610d51565b34801561050357600080fd5b50610365610512366004614257565b610e30565b34801561052357600080fd5b506102eb7f000000000000000000000000000000000000000000000000000000000000000081565b6103656105593660046143af565b610e4b565b34801561056a57600080fd5b506103b161057936600461415f565b610f17565b34801561058a57600080fd5b506103b1610faa565b34801561059f57600080fd5b506105a861105d565b6040516102ae9190614428565b3480156105c157600080fd5b506103b17f6a829efe27b6f5204e00bad8794469c27a62ccc470b513ddc27025562ea81a2a81565b3480156105f557600080fd5b506102eb61060436600461415f565b611155565b34801561061557600080fd5b506103b1610624366004614486565b6111b5565b34801561063557600080fd5b506103b16106443660046142c8565b611376565b34801561065557600080fd5b50610365610664366004614298565b6113fc565b34801561067557600080fd5b506103656106843660046142c8565b61152e565b34801561069557600080fd5b50610194546001600160a01b03166102eb565b3480156106b457600080fd5b506103656106c336600461450c565b6115d5565b3480156106d457600080fd5b506102a26106e3366004614298565b6116ef565b3480156106f457600080fd5b5061031861171a565b34801561070957600080fd5b506103b1600081565b34801561071e57600080fd5b5061036561072d3660046145bd565b611729565b34801561073e57600080fd5b5061036561074d36600461415f565b611734565b34801561075e57600080fd5b5061036561076d3660046145eb565b61184f565b34801561077e57600080fd5b5061036561078d36600461461f565b61192a565b34801561079e57600080fd5b506103b17ff6a92228322d1aae2c89be3727613c46171804b74ec1dc13994fceb7f4d3615481565b3480156107d257600080fd5b506107e66107e136600461418d565b611962565b6040516102ae92919061468a565b34801561080057600080fd5b5061031861080f36600461415f565b611a2b565b34801561082057600080fd5b5061036561082f366004614298565b611a9f565b34801561084057600080fd5b5061038761084f3660046146a5565b611ac4565b34801561086057600080fd5b506102eb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561089457600080fd5b506103876108a3366004614257565b611b69565b3480156108b457600080fd5b506102a26108c33660046146eb565b6001600160a01b039182166000908152609c6020908152604080832093909416825291909152205460ff1690565b3480156108fd57600080fd5b506103b161090c366004614719565b611be5565b600061091c82611d1a565b8061092b575061092b82611d4f565b8061094657506001600160e01b0319821663967efb0b60e01b145b8061096157506001600160e01b03198216633ece0a8960e01b145b92915050565b606060978054610976906147cb565b80601f01602080910402602001604051908101604052809291908181526020018280546109a2906147cb565b80156109ef5780601f106109c4576101008083540402835291602001916109ef565b820191906000526020600020905b8154815290600101906020018083116109d257829003601f168201915b5050505050905090565b6000610a0482611d74565b506000908152609b60205260409020546001600160a01b031690565b6000610a2b82611155565b9050806001600160a01b0316836001600160a01b031603610a9d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610ab95750610ab981336108c3565b610b2b5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610a94565b610b358383611dd3565b505050565b6000337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610b845760405162461bcd60e51b8152600401610a94906147ff565b6001600160a01b03851615610bd457610bd4858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e4192505050565b50630a85bd0160e11b5b95945050505050565b610bf13382611e74565b610c0d5760405162461bcd60e51b8152600401610a949061485c565b610b35838383611ef2565b600082815260656020526040902060010154610c3381612063565b610b35838361206d565b6000610c4883611376565b8210610caa5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a94565b506001600160a01b0391909116600090815260c960209081526040808320938352929052205490565b6001600160a01b0381163314610d435760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610a94565b610d4d82826120f3565b5050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610d995760405162461bcd60e51b8152600401610a94906148a9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610de260008051602061523c833981519152546001600160a01b031690565b6001600160a01b031614610e085760405162461bcd60e51b8152600401610a94906148f5565b610e118161215a565b60408051600080825260208201909252610e2d91839190612184565b50565b610b358383836040518060200160405280600081525061192a565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610e935760405162461bcd60e51b8152600401610a94906148a9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610edc60008051602061523c833981519152546001600160a01b031690565b6001600160a01b031614610f025760405162461bcd60e51b8152600401610a94906148f5565b610f0b8261215a565b610d4d82826001612184565b6000610f2260cb5490565b8210610f855760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a94565b60cb8281548110610f9857610f98614941565b90600052602060002001549050919050565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461104a5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610a94565b5060008051602061523c83398151915290565b6040805160608082018352600080835260208301529181019190915260408051606081019091526101918054829060ff16600181111561109f5761109f6143fe565b60018111156110b0576110b06143fe565b8152602001600182015481526020016002820180546110ce906147cb565b80601f01602080910402602001604051908101604052809291908181526020018280546110fa906147cb565b80156111475780601f1061111c57610100808354040283529160200191611147565b820191906000526020600020905b81548152906001019060200180831161112a57829003601f168201915b505050505081525050905090565b6000818152609960205260408120546001600160a01b0316806109615760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a94565b60006111c58787878787876122ef565b90506000604051806040016040528060016001600160401b038111156111ed576111ed6142e5565b604051908082528060200260200182016040528015611216578160200160208202803683370190505b50815260408051600180825281830190925260209092019190816020015b6060815260200190600190039081611234575050905280518051919250600091829061126257611262614941565b6020026020010190600381111561127b5761127b6143fe565b9081600381111561128e5761128e6143fe565b905250604080516001600160a01b038a16602482015260448082018590528251808303909101815260649091019091526020810180516001600160e01b031663607b49a760e11b1790526112e390309061253f565b81602001516000815181106112fa576112fa614941565b602002602001018190525061135b8863377e1cc960e01b60405160200161133191906001600160e01b031991909116815260200190565b6040516020818303038152906040528373eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61256b565b60008381526101956020526040902055509695505050505050565b60006001600160a01b0382166113e05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610a94565b506001600160a01b03166000908152609a602052604090205490565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114805760405162461bcd60e51b815260206004820152602360248201527f4f6e6c792066756e6473206f776e65722063616e2077697468647261772066756044820152626e647360e81b6064820152608401610a94565b604051631c20fadd60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301528281166024830152604482018490527f00000000000000000000000000000000000000000000000000000000000000001690631c20fadd90606401600060405180830381600087803b15801561151257600080fd5b505af1158015611526573d6000803e3d6000fd5b505050505050565b7ff6a92228322d1aae2c89be3727613c46171804b74ec1dc13994fceb7f4d3615461155881612063565b6001600160a01b03821661157e5760405162461bcd60e51b8152600401610a9490614957565b61019480546001600160a01b0319166001600160a01b0384169081179091556040519081527f3f32684a32a11dabdbb8c0177de80aa3ae36a004d75210335b49e544e48cd0aa906020015b60405180910390a15050565b600054610100900460ff16158080156115f55750600054600160ff909116105b8061160f5750303b15801561160f575060005460ff166001145b6116725760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a94565b6000805460ff191660011790558015611695576000805461ff0019166101001790555b6116a28686868686612603565b8015611526576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060988054610976906147cb565b610d4d33838361263f565b3361173e82611155565b6001600160a01b0316146117bc576040805162461bcd60e51b81526020600482015260248101919091527f5061796f75744175746f6d6174696f6e426173653a20796f75206d757374206f60448201527f776e20746865204e465420746f207265636f7665722074686520706f6c6963796064820152608401610a94565b6117c58161270d565b604051632142170760e11b8152306004820152336024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342842e0e906064015b600060405180830381600087803b15801561183457600080fd5b505af1158015611848573d6000803e3d6000fd5b5050505050565b7f6a829efe27b6f5204e00bad8794469c27a62ccc470b513ddc27025562ea81a2a61187981612063565b611882826149c1565b604051632cbf28cb60e21b815273__$acbb9ece542dcf2065f41aa3c8cca5827e$__9163b2fca32c916118b89190600401614a53565b60006040518083038186803b1580156118d057600080fd5b505af41580156118e4573d6000803e3d6000fd5b505050508161019181816118f89190614b6b565b9050507faee70af564b07cc1589d52c49593cfd9bacbd6fcb0d9cc4533e61dd64ce9710c826040516115c99190614bf2565b6119343383611e74565b6119505760405162461bcd60e51b8152600401610a949061485c565b61195c848484846127b0565b50505050565b60405163f92b2ed560e01b8152600481018290526000906060906001600160a01b0385169063f92b2ed590602401602060405180830381865afa1580156119ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d19190614c90565b9150836001600160a01b031663377e1cc9846040516024016119f591815260200190565b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505090509250929050565b6060611a3682611d74565b6000611a4d60408051602081019091526000815290565b90506000815111611a6d5760405180602001604052806000815250611a98565b80611a77846127e3565b604051602001611a88929190614cad565b6040516020818303038152906040525b9392505050565b600082815260656020526040902060010154611aba81612063565b610b3583836120f3565b6000337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614611b0e5760405162461bcd60e51b8152600401610a94906147ff565b6000611b1984611155565b9050611b248461270d565b60008481526101956020526040902054611b3d90612875565b6000611b48846128c2565b9050611b548282612dbc565b50636b140e9f60e11b9150505b949350505050565b6000337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614611bb35760405162461bcd60e51b8152600401610a94906147ff565b611bbc8261270d565b60008281526101956020526040902054611bd590612875565b5063e8e617b760e01b9392505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c699190614cdc565b6001600160a01b031663d505accf336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018990526064810188905260ff8716608482015260a4810186905260c4810185905260e401600060405180830381600087803b158015611ce457600080fd5b505af1158015611cf8573d6000803e3d6000fd5b50505050611d0a8c8c8c8c8c8c6111b5565b9c9b505050505050505050505050565b60006001600160e01b03198216637965db0b60e01b148061096157506301ffc9a760e01b6001600160e01b0319831614610961565b60006001600160e01b0319821663780e9d6360e01b1480610961575061096182612e53565b6000818152609960205260409020546001600160a01b0316610e2d5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a94565b6000818152609b6020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611e0882611155565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611e4b8383612e93565b611e58600084848461302c565b610b355760405162461bcd60e51b8152600401610a9490614cf9565b600080611e8083611155565b9050806001600160a01b0316846001600160a01b03161480611ec757506001600160a01b038082166000908152609c602090815260408083209388168352929052205460ff165b80611b615750836001600160a01b0316611ee0846109f9565b6001600160a01b031614949350505050565b826001600160a01b0316611f0582611155565b6001600160a01b031614611f2b5760405162461bcd60e51b8152600401610a9490614d4b565b6001600160a01b038216611f8d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a94565b611f9a838383600161312a565b826001600160a01b0316611fad82611155565b6001600160a01b031614611fd35760405162461bcd60e51b8152600401610a9490614d4b565b6000818152609b6020908152604080832080546001600160a01b03199081169091556001600160a01b03878116808652609a8552838620805460001901905590871680865283862080546001019055868652609990945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610e2d8133613257565b61207782826116ef565b610d4d5760008281526065602090815260408083206001600160a01b03851684529091529020805460ff191660011790556120af3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6120fd82826116ef565b15610d4d5760008281526065602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610d4d81612063565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156121b757610b35836132b0565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612211575060408051601f3d908101601f1916820190925261220e91810190614d90565b60015b6122745760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610a94565b60008051602061523c83398151915281146122e35760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610a94565b50610b3583838361334c565b6040516352fc596b60e11b81526004810186905284151560248201526044810184905264ffffffffff8316606482015260009081906001600160a01b0389169063a5f8b2d690608401608060405180830381865afa158015612355573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123799190614dc0565b509050806000036123f25760405162461bcd60e51b815260206004820152603760248201527f5061796f75744175746f6d6174696f6e426173653a207072656d69756d203d2060448201527f302c20706f6c696379206e6f7420737570706f727465640000000000000000006064820152608401610a94565b61248b3330837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612456573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247a9190614cdc565b6001600160a01b0316929190613371565b604051630c5d0e6560e01b81526004810188905286151560248201526044810186905264ffffffffff851660648201523060848201526001600160a01b03891690630c5d0e659060a4016020604051808303816000875af11580156124f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125189190614d90565b9150612534838360405180602001604052806000815250611e41565b509695505050505050565b60608282604051602001612554929190614e2e565b604051602081830303815290604052905092915050565b604051633323b46760e01b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633323b467906125c0908890889088908890600401614e52565b6020604051808303816000875af11580156125df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bde9190614d90565b600054610100900460ff1661262a5760405162461bcd60e51b8152600401610a9490614f41565b6126358585856133dc565b611848828261342e565b816001600160a01b0316836001600160a01b0316036126a05760405162461b