@gooddollar/goodprotocol
Version:
GoodDollar Protocol
1,434 lines • 108 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "GoodReserveCDai",
"sourceName": "contracts/reserve/GoodReserveCDai.sol",
"abi": [
{
"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": "spender",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Approval",
"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": "distributionHelper",
"type": "address"
},
{
"indexed": false,
"internalType": "uint32",
"name": "bps",
"type": "uint32"
}
],
"name": "DistributionHelperSet",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint8",
"name": "version",
"type": "uint8"
}
],
"name": "Initialized",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "distributionHelper",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amountMinted",
"type": "uint256"
},
{
"indexed": false,
"internalType": "bool",
"name": "distributionSucceeded",
"type": "bool"
}
],
"name": "NonUBIMinted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Paused",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "previousAdminRole",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "newAdminRole",
"type": "bytes32"
}
],
"name": "RoleAdminChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "RoleGranted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "RoleRevoked",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "caller",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "inputToken",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "inputAmount",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "actualReturn",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "receiverAddress",
"type": "address"
}
],
"name": "TokenPurchased",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "caller",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "outputToken",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "gdAmount",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "contributionAmount",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "actualReturn",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "receiverAddress",
"type": "address"
}
],
"name": "TokenSold",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "day",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "interestToken",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "interestReceived",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "gdInterestMinted",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "gdExpansionMinted",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "gdUbiTransferred",
"type": "uint256"
}
],
"name": "UBIMinted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Unpaused",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "implementation",
"type": "address"
}
],
"name": "Upgraded",
"type": "event"
},
{
"inputs": [],
"name": "DEFAULT_ADMIN_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "MINTER_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "PAUSER_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "RESERVE_MINTER_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "spender",
"type": "address"
}
],
"name": "allowance",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "approve",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "avatar",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "burn",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "burnFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_tokenAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_minReturn",
"type": "uint256"
},
{
"internalType": "address",
"name": "_targetAddress",
"type": "address"
}
],
"name": "buy",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "cDaiAddress",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "cap",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "currentPrice",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "currentPriceDAI",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "daiAddress",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "dao",
"outputs": [
{
"internalType": "contract Controller",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "decimals",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "subtractedValue",
"type": "uint256"
}
],
"name": "decreaseAllowance",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "discountDisabled",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "distributionHelper",
"outputs": [
{
"internalType": "contract DistributionHelper",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "end",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "gdxAirdrop",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "gdxDisabled",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "getMarketMaker",
"outputs": [
{
"internalType": "contract GoodMarketMaker",
"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": "uint256",
"name": "index",
"type": "uint256"
}
],
"name": "getRoleMember",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
}
],
"name": "getRoleMemberCount",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"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": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "addedValue",
"type": "uint256"
}
],
"name": "increaseAllowance",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "name",
"type": "string"
},
{
"internalType": "string",
"name": "symbol",
"type": "string"
}
],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract INameService",
"name": "_ns",
"type": "address"
},
{
"internalType": "bytes32",
"name": "_gdxAirdrop",
"type": "bytes32"
}
],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "isClaimedGDX",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "lastMinted",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "mint",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_token",
"type": "address"
},
{
"internalType": "address",
"name": "_to",
"type": "address"
},
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
}
],
"name": "mintRewardFromRR",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_daiToConvert",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
},
{
"internalType": "contract ERC20",
"name": "_interestToken",
"type": "address"
}
],
"name": "mintUBI",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "nameService",
"outputs": [
{
"internalType": "contract INameService",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "nativeToken",
"outputs": [
{
"internalType": "contract IGoodDollar",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "pause",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "paused",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_scheme",
"type": "address"
},
{
"internalType": "bytes32",
"name": "_hash",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "_method",
"type": "bytes32"
}
],
"name": "pre",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [],
"name": "proxiableUUID",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract ERC20",
"name": "_token",
"type": "address"
}
],
"name": "recover",
"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": "uint256",
"name": "_gdAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_minReturn",
"type": "uint256"
},
{
"internalType": "address",
"name": "_target",
"type": "address"
},
{
"internalType": "address",
"name": "_seller",
"type": "address"
}
],
"name": "sell",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "setAddresses",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract DistributionHelper",
"name": "_helper",
"type": "address"
}
],
"name": "setDistributionHelper",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bool",
"name": "_gdxDisabled",
"type": "bool"
},
{
"internalType": "bool",
"name": "_discountDisabled",
"type": "bool"
}
],
"name": "setGDXDisabled",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_nom",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_denom",
"type": "uint256"
}
],
"name": "setReserveRatioDailyExpansion",
"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": "symbol",
"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": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "unpause",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "updateAvatar",
"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": [],
"name": "when",
"outputs": [
{
"internalType": "enum GlobalConstraintInterface.CallPhase",
"name": "",
"type": "uint8"
}
],
"stateMutability": "pure",
"type": "function"
}
],
"bytecode": "0x60a06040523060805234801561001457600080fd5b50608051614c3561004c600039600081816112280152818161126801528181611512015281816115520152611c210152614c356000f3fe6080604052600436106102c85760003560e01c806301ffc9a7146102cd57806306fdde0314610302578063095ea7b3146103245780630cd865ec1461034457806311ab3b341461036657806318160ddd146103885780631b3c90a8146103a85780631de778a5146103bd57806322c65b39146103f257806323b872dd14610409578063248a9ca3146104295780632c387275146104495780632f2ff15d14610477578063313ce56714610497578063355274ea146104b357806336568abe146104ca5780633659cfe6146104ea578063395093511461050a5780633e6326fc1461052a5780633f4ba83a1461054a57806340c10f191461055f5780634162169f1461057f57806342966c681461059f5780634345e979146105bf5780634899bb27146105df5780634cd88b76146106075780634f1ef286146106275780634f8f02181461063a57806352d1902d1461065a57806359a87bc11461066f5780635aef7de61461068f5780635c975abb146106af57806370a08231146106c857806379cc6790146106e857806380d9a50f146107085780638456cb59146107285780639010d07c1461073d57806391d148541461075d57806395d89b411461077d5780639d1b464a146107925780639f2d0d07146107a7578063a217fddf146107c7578063a457c2d7146107dc578063a7ca8c7d146107fc578063a9059cbb1461081e578063acea21d01461083e578063bbc19ab014610853578063bc3a429b1461086a578063be13f47c1461087f578063c1786ab21461089f578063ca15c873146108bf578063d5391393146108df578063d547741f14610901578063dd62ed3e14610921578063df20c4af14610941578063e092b06714610972578063e1758bd814610987578063e2b0caef1461099c578063e462d3b9146109b8578063e63ab1e9146109da578063efbe1c1c146109fc578063f2c65bf914610a11578063f8a9978f14610a32575b600080fd5b3480156102d957600080fd5b506102ed6102e836600461414d565b610a52565b60405190151581526020015b60405180910390f35b34801561030e57600080fd5b50610317610a7d565b6040516102f9919061419b565b34801561033057600080fd5b506102ed61033f3660046141e3565b610b10565b34801561035057600080fd5b5061036461035f36600461420f565b610b28565b005b34801561037257600080fd5b50610262546102ed90600160c81b900460ff1681565b34801561039457600080fd5b50610164545b6040519081526020016102f9565b3480156103b457600080fd5b50610364610c34565b3480156103c957600080fd5b506103dd6103d836600461422c565b610d5b565b604080519283526020830191909152016102f9565b3480156103fe57600080fd5b5061039a6102605481565b34801561041557600080fd5b506102ed610424366004614265565b611144565b34801561043557600080fd5b5061039a6104443660046142a6565b61116a565b34801561045557600080fd5b5061025e5461046a906001600160a01b031681565b6040516102f991906142bf565b34801561048357600080fd5b506103646104923660046142d3565b61117f565b3480156104a357600080fd5b50604051600281526020016102f9565b3480156104bf57600080fd5b5061039a61025c5481565b3480156104d657600080fd5b506103646104e53660046142d3565b6111a0565b3480156104f657600080fd5b5061036461050536600461420f565b61121e565b34801561051657600080fd5b506102ed6105253660046141e3565b6112e3565b34801561053657600080fd5b5060675461046a906001600160a01b031681565b34801561055657600080fd5b50610364611305565b34801561056b57600080fd5b5061036461057a3660046141e3565b611383565b34801561058b57600080fd5b5060655461046a906001600160a01b031681565b3480156105ab57600080fd5b506103646105ba3660046142a6565b6113fe565b3480156105cb57600080fd5b506103646105da366004614311565b611408565b3480156105eb57600080fd5b506102625461046a90600160201b90046001600160a01b031681565b34801561061357600080fd5b506103646106223660046143ea565b611445565b61036461063536600461444d565b611508565b34801561064657600080fd5b506103dd6106553660046144a6565b6115bd565b34801561066657600080fd5b5061039a611c14565b34801561067b57600080fd5b5061039a61068a36600461422c565b611cc2565b34801561069b57600080fd5b5060665461046a906001600160a01b031681565b3480156106bb57600080fd5b506101c65460ff166102ed565b3480156106d457600080fd5b5061039a6106e336600461420f565b611fe3565b3480156106f457600080fd5b506103646107033660046141e3565b611fff565b34801561071457600080fd5b5061036461072336600461420f565b612014565b34801561073457600080fd5b50610364612084565b34801561074957600080fd5b5061046a6107583660046144f0565b6120fe565b34801561076957600080fd5b506102ed6107783660046142d3565b612117565b34801561078957600080fd5b50610317612142565b34801561079e57600080fd5b5061039a612152565b3480156107b357600080fd5b506103646107c23660046144f0565b6121d4565b3480156107d357600080fd5b5061039a600081565b3480156107e857600080fd5b506102ed6107f73660046141e3565b61224b565b34801561080857600080fd5b5061039a600080516020614af983398151915281565b34801561082a57600080fd5b506102ed6108393660046141e3565b6122d1565b34801561084a57600080fd5b5061039a6122df565b34801561085f57600080fd5b5061039a61025d5481565b34801561087657600080fd5b5061036461238f565b34801561088b57600080fd5b5061036461089a3660046141e3565b612533565b3480156108ab57600080fd5b506102ed6108ba366004614512565b6126be565b3480156108cb57600080fd5b5061039a6108da3660046142a6565b6126dc565b3480156108eb57600080fd5b5061039a600080516020614bc083398151915281565b34801561090d57600080fd5b5061036461091c3660046142d3565b6126f4565b34801561092d57600080fd5b5061039a61093c366004614547565b612710565b34801561094d57600080fd5b506102ed61095c36600461420f565b6102616020526000908152604090205460ff1681565b34801561097e57600080fd5b5061046a61273c565b34801561099357600080fd5b5061046a6127c7565b3480156109a857600080fd5b5060006040516102f99190614575565b3480156109c457600080fd5b50610262546102ed90600160c01b900460ff1681565b3480156109e657600080fd5b5061039a600080516020614b7983398151915281565b348015610a0857600080fd5b506103646127f6565b348015610a1d57600080fd5b5061025f5461046a906001600160a01b031681565b348015610a3e57600080fd5b50610364610a4d366004614265565b612b88565b60006001600160e01b03198216635a05180f60e01b1480610a775750610a7782612c39565b92915050565b60606101658054610a8d9061459d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab99061459d565b8015610b065780601f10610adb57610100808354040283529160200191610b06565b820191906000526020600020905b815481529060010190602001808311610ae957829003601f168201915b5050505050905090565b600033610b1e818585612c6e565b5060019392505050565b610b30612d93565b6066546040516370a0823160e01b81526001600160a01b038084169263a9059cbb9291169083906370a0823190610b6b9030906004016142bf565b602060405180830381865afa158015610b88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bac91906145d7565b6040518363ffffffff1660e01b8152600401610bc99291906145f0565b6020604051808303816000875af1158015610be8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0c9190614609565b610c315760405162461bcd60e51b8152600401610c2890614626565b60405180910390fd5b50565b60675460405163bf40fac160e01b815260206004820152600a60248201526921a7a72a2927a62622a960b11b60448201526001600160a01b039091169063bf40fac190606401602060405180830381865afa158015610c97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbb9190614657565b606580546001600160a01b0319166001600160a01b0392909216918217905560408051632d77bef360e11b81529051635aef7de6916004808201926020929091908290030181865afa158015610d15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d399190614657565b606680546001600160a01b0319166001600160a01b0392909216919091179055565b60008061026354600103610d815760405162461bcd60e51b8152600401610c2890614674565b60016102635561025f5460405163140e25ad60e31b8152600481018790526001600160a01b039091169063a0712d68906024016020604051808303816000875af1158015610dd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df791906145d7565b506000610e0261273c565b61025f5460405163835bbd5560e01b81526001600160a01b039283169263835bbd5592610e34929116906004016142bf565b608060405180830381865afa158015610e51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7591906146ab565b5050509050600081856001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610ea991906142bf565b602060405180830381865afa158015610ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eea91906145d7565b610ef49190614708565b90506000610f0061273c565b6001600160a01b03166374920d3087846040518363ffffffff1660e01b8152600401610f2d9291906145f0565b6020604051808303816000875af1158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906145d7565b90506000610f7c61273c565b6001600160a01b031663e72a0833886040518263ffffffff1660e01b8152600401610fa791906142bf565b6020604051808303816000875af1158015610fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fea91906145d7565b4361025d5590506000610ffd828461471b565b61026254909150600160201b90046001600160a01b03166110515760405162461bcd60e51b815260206004820152600e60248201526d1a195b1c195c881b9bdd081cd95d60921b6044820152606401610c28565b6102625461107190600160201b90046001600160a01b0316826000612e56565b61026254604051630a8ba38960e41b815260048101839052600160201b9091046001600160a01b03169063a8ba389090602401600060405180830381600087803b1580156110be57600080fd5b505af11580156110d2573d6000803e3d6000fd5b505061025d546040805188815260208101889052908101869052606081018590526001600160a01b038c1693509091507f1a962236b7c7b3d7b9f6b56036cbce44ab2f93a22b0827d2f2a92a8f055552b99060800160405180910390a360006102635599929850919650505050505050565b600033611152858285613192565b61115d858585613206565b60019150505b9392505050565b600090815260fe602052604090206001015490565b6111888261116a565b611191816133ac565b61119b83836133b6565b505050565b6001600160a01b03811633146112105760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610c28565b61121a82826133d9565b5050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036112665760405162461bcd60e51b8152600401610c289061472e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166112986133fc565b6001600160a01b0316146112be5760405162461bcd60e51b8152600401610c2890614768565b6112c781613418565b60408051600080825260208201909252610c3191839190613420565b600033610b1e8185856112f68383612710565b611300919061471b565b612c6e565b61131d600080516020614b7983398151915233612117565b6113795760405162461bcd60e51b81526020600482015260396024820152600080516020614ad983398151915260448201527876652070617573657220726f6c6520746f20756e706175736560381b6064820152608401610c28565b61138161358b565b565b61139b600080516020614bc083398151915233612117565b6113f45760405162461bcd60e51b81526020600482015260366024820152600080516020614ad98339815191526044820152751d99481b5a5b9d195c881c9bdb19481d1bc81b5a5b9d60521b6064820152608401610c28565b61121a82826135d8565b610c313382613695565b611410612d93565b610262805461ffff60c01b1916600160c01b9315159390930260ff60c81b191692909217600160c81b91151591909102179055565b600054610100900460ff16158080156114655750600054600160ff909116105b806114865750611474306137c6565b158015611486575060005460ff166001145b6114a25760405162461bcd60e51b8152600401610c28906147a2565b6000805460ff1916600117905580156114c5576000805461ff0019166101001790555b6114cf83836137d5565b801561119b576000805461ff001916905560405160018152600080516020614b59833981519152906020015b60405180910390a1505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036115505760405162461bcd60e51b8152600401610c289061472e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166115826133fc565b6001600160a01b0316146115a85760405162461bcd60e51b8152600401610c2890614768565b6115b182613418565b61121a82826001613420565b600080610263546001036115e35760405162461bcd60e51b8152600401610c2890614674565b6001610263556101c65460ff161561160d5760405162461bcd60e51b8152600401610c28906147f0565b600061161761273c565b60675460405163bf40fac160e01b81529192506001600160a01b03169063bf40fac19061164690600401614810565b602060405180830381865afa158015611663573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116879190614657565b6001600160a01b0316336001600160a01b0316146116a3573393505b60675460405163bf40fac160e01b81526001600160a01b039091169063bf40fac1906116d190600401614839565b602060405180830381865afa1580156116ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117129190614657565b6001600160a01b03166323b872dd33308a6040518463ffffffff1660e01b81526004016117419392919061485d565b6020604051808303816000875af1158015611760573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117849190614609565b5060675460405163bf40fac160e01b81526001600160a01b039091169063bf40fac1906117b390600401614839565b602060405180830381865afa1580156117d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f49190614657565b6001600160a01b03166342966c68886040518263ffffffff1660e01b815260040161182191815260200190565b600060405180830381600087803b15801561183b57600080fd5b505af115801561184f573d6000803e3d6000fd5b505050506001600160a01b03851615611868578461186a565b335b61026254909550600090600160c81b900460ff16151581036118b757600061189186611fe3565b9050888111156118a157886118a3565b805b915081156118b5576118b58683613695565b505b60008880831015611a095760675460405163bf40fac160e01b815260206004820152601860248201527721a7a72a2924a12aaa24a7a72fa1a0a621aaa620aa24a7a760411b60448201526001600160a01b039091169063bf40fac190606401602060405180830381865afa158015611933573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119579190614657565b61025f546001600160a01b0391821691632cfa94fe91879130918c911661197e8988614708565b60405160e087901b6001600160e01b03191681526001600160a01b039586166004820152938516602485015291841660448401529092166064820152608481019190915260a401602060405180830381865afa1580156119e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0691906145d7565b91505b61025f5460405163058c243360e11b81526001600160a01b0391821660048201526024810183905260448101849052600091861690630b184866906064016020604051808303816000875af1158015611a66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8a91906145d7565b905089811015611aed5760405162461bcd60e51b815260206004820152602860248201527f546f6b656e2072657475726e206d7573742062652061626f766520746865206d60448201526734b72932ba3ab93760c11b6064820152608401610c28565b61025f5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611b20908c9085906004016145f0565b6020604051808303816000875af1158015611b3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b639190614609565b611ba65760405162461bcd60e51b815260206004820152601460248201527318d9185a481d1c985b9cd9995c8819985a5b195960621b6044820152606401610c28565b61025f54604080518d8152602081018690529081018390526001600160a01b03808c1692811691908b16907f067ad67f3f4d17211f9f929d19036c2395bbc9b201d517e46e81f9ceae86032e9060600160405180910390a46000610263559a91995090975050505050505050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611caf5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c6044820152771b1959081d1a1c9bdd59da0819195b1959d85d1958d85b1b60421b6064820152608401610c28565b50600080516020614b3983398151915290565b600061026354600103611ce75760405162461bcd60e51b8152600401610c2890614674565b60016102635561025f546001600160a01b03166000611d0461273c565b6001600160a01b031663cce7ec1383886040518363ffffffff1660e01b8152600401611d319291906145f0565b6020604051808303816000875af1158015611d50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7491906145d7565b90506001600160a01b03841615611d8b5783611d8d565b335b60675460405163bf40fac160e01b81529195506000916001600160a01b039091169063bf40fac190611dc190600401614810565b602060405180830381865afa158015611dde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e029190614657565b6040516323b872dd60e01b81529091506001600160a01b038416906323b872dd90611e3590339030908c9060040161485d565b6020604051808303816000875af1158015611e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e789190614609565b1515600114611ef1576040805162461bcd60e51b81526020600482015260248101919091527f7472616e7366657246726f6d206661696c65642c206d616b652073757265207960448201527f6f7520617070726f76656420696e70757420746f6b656e207472616e736665726064820152608401610c28565b85821015611f4f5760405162461bcd60e51b815260206004820152602560248201527f47442072657475726e206d7573742062652061626f766520746865206d696e5260448201526432ba3ab93760d91b6064820152608401610c28565b611f5b85836001612e56565b611f658583613818565b61025f546001600160a01b038087169181169083163303611f865732611f88565b335b6001600160a01b03167fcace70a03cbf3e4fa942b0ab9f70aa3834cfab0a31aa75bc4895262063444e128a86604051611fcb929190918252602082015260400190565b60405180910390a45060006102635595945050505050565b6001600160a01b03166000908152610162602052604090205490565b61200a823383613192565b61121a8282613695565b61201c612d93565b6102628054600160201b600160c01b031916600160201b6001600160a01b038416908102919091179091556040805191825261271060208301527f0fa8d325f44a93da78a029607ba0c95db6a44fa32278f04de5396797a4306ead910160405180910390a150565b61209c600080516020614b7983398151915233612117565b6120f65760405162461bcd60e51b81526020600482015260376024820152600080516020614ad983398151915260448201527676652070617573657220726f6c6520746f20706175736560481b6064820152608401610c28565b611381613839565b6000828152610130602052604081206111639083613877565b600091825260fe602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606101668054610a8d9061459d565b600061215c61273c565b61025f5460405163e9833c2f60e01b81526001600160a01b039283169263e9833c2f9261218e929116906004016142bf565b602060405180830381865afa1580156121ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121cf91906145d7565b905090565b6121dc612d93565b6121e461273c565b604051639f2d0d0760e01b815260048101849052602481018390526001600160a01b039190911690639f2d0d0790604401600060405180830381600087803b15801561222f57600080fd5b505af1158015612243573d6000803e3d6000fd5b505050505050565b600033816122598286612710565b9050838110156122b95760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610c28565b6122c68286868403612c6e565b506001949350505050565b600033610b1e818585613206565b61025f546040805163182df0f560e01b815290516000926001600160a01b0316916b204fce5e3e2502611000000091839163182df0f59160048083019260209291908290030181865afa15801561233a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235e91906145d7565b612366612152565b612375906402540be400614881565b61237f9190614881565b6123899190614898565b91505090565b60675460405163bf40fac160e01b815260206004820152600360248201526244414960e81b60448201526001600160a01b039091169063bf40fac190606401602060405180830381865afa1580156123eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240f9190614657565b61025e80546001600160a01b0319166001600160a01b0392831617905560675460405163bf40fac160e01b815260206004808301919091526024820152634344414960e01b604482015291169063bf40fac190606401602060405180830381865afa158015612482573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a69190614657565b61025f80546001600160a01b0319166001600160a01b0392831690811790915561025e5460405163095ea7b360e01b815292169163095ea7b3916124f091600019906004016145f0565b6020604051808303816000875af115801561250f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c319190614609565b600054610100900460ff16158080156125535750600054600160ff909116105b806125745750612562306137c6565b158015612574575060005460ff166001145b6125905760405162461bcd60e51b8152600401610c28906147a2565b6000805460ff1916600117905580156125b3576000805461ff0019166101001790555b6125f36040518060400160405280600381526020016208e88b60eb1b8152506040518060400160405280600381526020016208e48b60eb1b8152506137d5565b6125fc83613883565b61260461238f565b61261c600080516020614bc0833981519152336111a0565b612634600080516020614b79833981519152336111a0565b61263f6000336111a0565b606654612657906000906001600160a01b03166138a6565b60665461267c90600080516020614af9833981519152906001600160a01b03166138a6565b6607d0e36a81800061025c55610260829055801561119b576000805461ff001916905560405160018152600080516020614b59833981519152906020016114fb565b600081696d696e74546f6b656e7360b01b03610b1e57506000611163565b600081815261013060205260408120610