UNPKG

@gooddollar/goodprotocol

Version:
1,229 lines 119 kB
{ "_format": "hh-sol-artifact-1", "contractName": "GoodCompoundStaking", "sourceName": "contracts/staking/compound/GoodCompoundStaking.sol", "abi": [ { "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": false, "internalType": "uint8", "name": "version", "type": "uint8" } ], "name": "Initialized", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "recipient", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "iTokenGains", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "tokenGains", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "actualTokenRedeemed", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "actualRewardTokenEarned", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "interestCollectedInDAI", "type": "uint256" } ], "name": "InterestCollected", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "staker", "type": "address" }, { "indexed": false, "internalType": "address", "name": "token", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "StakeWithdraw", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "staker", "type": "address" }, { "indexed": false, "internalType": "address", "name": "token", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Staked", "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" }, { "inputs": [], "name": "accAmountPerShare", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "accumulatedRewards", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "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": [], "name": "claimReputation", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "collectInterestGasCost", "outputs": [ { "internalType": "uint32", "name": "", "type": "uint32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_recipient", "type": "address" } ], "name": "collectUBIInterest", "outputs": [ { "internalType": "uint256", "name": "actualTokenRedeemed", "type": "uint256" }, { "internalType": "uint256", "name": "actualRewardTokenRedeemed", "type": "uint256" }, { "internalType": "uint256", "name": "actualDai", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "comp", "outputs": [ { "internalType": "contract ERC20", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "compCollectGasCost", "outputs": [ { "internalType": "uint32", "name": "", "type": "uint32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "compUsdOracle", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bool", "name": "_returnTokenBalanceInUSD", "type": "bool" }, { "internalType": "bool", "name": "_returnTokenGainsInUSD", "type": "bool" } ], "name": "currentGains", "outputs": [ { "internalType": "uint256", "name": "iTokenGains", "type": "uint256" }, { "internalType": "uint256", "name": "tokenGains", "type": "uint256" }, { "internalType": "uint256", "name": "tokenBalance", "type": "uint256" }, { "internalType": "uint256", "name": "balanceInUSD", "type": "uint256" }, { "internalType": "uint256", "name": "tokenGainsInUSD", "type": "uint256" } ], "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": "view", "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": "getGasCostForInterestTransfer", "outputs": [ { "internalType": "uint32", "name": "", "type": "uint32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "user", "type": "address" } ], "name": "getProductivity", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getRouter", "outputs": [ { "internalType": "contract Uniswap", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_oracle", "type": "address" }, { "internalType": "uint256", "name": "_amount", "type": "uint256" }, { "internalType": "uint256", "name": "_decimals", "type": "uint256" } ], "name": "getTokenValueInUSD", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_staker", "type": "address" } ], "name": "getUserMintedAndPending", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "user", "type": "address" }, { "internalType": "uint256", "name": "rewardsPerBlock", "type": "uint256" }, { "internalType": "uint256", "name": "blockStart", "type": "uint256" }, { "internalType": "uint256", "name": "blockEnd", "type": "uint256" } ], "name": "getUserPendingReward", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "iToken", "outputs": [ { "internalType": "contract ERC20", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "iTokenWorthInToken", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "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": "address", "name": "_token", "type": "address" }, { "internalType": "address", "name": "_iToken", "type": "address" }, { "internalType": "contract INameService", "name": "_ns", "type": "address" }, { "internalType": "string", "name": "_tokenName", "type": "string" }, { "internalType": "string", "name": "_tokenSymbol", "type": "string" }, { "internalType": "uint64", "name": "_maxRewardThreshold", "type": "uint64" }, { "internalType": "address", "name": "_tokenUsdOracle", "type": "address" }, { "internalType": "address", "name": "_compUsdOracle", "type": "address" }, { "internalType": "address[]", "name": "_tokenToDaiSwapPath", "type": "address[]" } ], "name": "init", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_token", "type": "address" }, { "internalType": "address", "name": "_iToken", "type": "address" }, { "internalType": "contract INameService", "name": "_ns", "type": "address" }, { "internalType": "string", "name": "_tokenName", "type": "string" }, { "internalType": "string", "name": "_tokenSymbol", "type": "string" }, { "internalType": "uint64", "name": "_maxRewardThreshold", "type": "uint64" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "isPaused", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "lastRewardBlock", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "maxLiquidityPercentageSwap", "outputs": [ { "internalType": "uint24", "name": "", "type": "uint24" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "maxMultiplierThreshold", "outputs": [ { "internalType": "uint64", "name": "", "type": "uint64" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "mintedRewards", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "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": [ { "internalType": "bool", "name": "_isPaused", "type": "bool" } ], "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "contract ERC20", "name": "_token", "type": "address" } ], "name": "recover", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "user", "type": "address" }, { "internalType": "uint256", "name": "rewardsPerBlock", "type": "uint256" }, { "internalType": "uint256", "name": "blockStart", "type": "uint256" }, { "internalType": "uint256", "name": "blockEnd", "type": "uint256" } ], "name": "rewardsMinted", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint24", "name": "_maxPercentage", "type": "uint24" } ], "name": "setMaxLiquidityPercentageSwap", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint32", "name": "_collectInterestGasCost", "type": "uint32" }, { "internalType": "uint32", "name": "_rewardTokenCollectCost", "type": "uint32" } ], "name": "setcollectInterestGasCostParams", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_amount", "type": "uint256" }, { "internalType": "uint256", "name": "_donationPer", "type": "uint256" }, { "internalType": "bool", "name": "_inInterestToken", "type": "bool" } ], "name": "stake", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "token", "outputs": [ { "internalType": "contract ERC20", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "tokenDecimalDifference", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "tokenToDaiSwapPath", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "tokenUsdOracle", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "tokenWorthIniToken", "outputs": [ { "internalType": "uint256", "name": "tokenWorth", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalEffectiveStakes", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalProductivity", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "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": "uniswapContract", "outputs": [ { "internalType": "contract Uniswap", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "updateAvatar", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "users", "outputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "effectiveStakes", "type": "uint256" }, { "internalType": "uint256", "name": "rewardDebt", "type": "uint256" }, { "internalType": "uint256", "name": "rewardEarn", "type": "uint256" }, { "internalType": "uint256", "name": "rewardMinted", "type": "uint256" }, { "internalType": "uint64", "name": "lastRewardTime", "type": "uint64" }, { "internalType": "uint64", "name": "multiplierResetTime", "type": "uint64" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "withdrawRewards", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_amount", "type": "uint256" }, { "internalType": "bool", "name": "_inInterestToken", "type": "bool" } ], "name": "withdrawStake", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ], "bytecode": "0x608060405234801561001057600080fd5b506159da80620000216000396000f3fe608060405234801561001057600080fd5b50600436106102935760003560e01c806302329a291461029857806306fdde03146102ad578063095ea7b3146102cb57806309b04fb4146102ee5780630cd865ec14610329578063109d0af81461033c57806316965b9a1461035c57806317a6a40c1461036f57806318160ddd146103905780631b3c90a8146103985780631ce720f3146103a057806323b872dd146103bf57806328e964e9146103d25780632bbbdc8914610414578063313ce56714610427578063374559901461042f578063395093511461045d5780633a608032146104705780633e6326fc14610479578063408cfe241461048c5780634162169f1461049f57806343d93ca0146104b257806346b30ff5146104c55780634a291b01146104cd578063561b2463146104d6578063574c5c93146104e95780635836af9b146104fc5780635a6d735c1461050f5780635abea7dc146105225780635aef7de61461053557806370a08231146105485780638955e46f14610571578063899e1b6c1461059d57806389eb6426146105c857806395d89b41146105db5780639c81ff6b146105e3578063a457c2d7146105ec578063a82415ae146105ff578063a87430ba14610612578063a9059cbb146106aa578063a9f8d181146106bd578063ad1e5d75146106c6578063b0ce7abb146106d9578063b0f479a1146106ec578063b187bd26146106f4578063b76e230e14610708578063bea281151461071f578063c7b8981c14610728578063dd62ed3e14610730578063e1758bd814610743578063e319828c1461074b578063e32f172614610754578063e660b53f14610767578063ead8dbd41461076f578063edb5b86314610782578063f412a6af14610795578063fc0c546a146107bf575b600080fd5b6102ab6102a6366004614c74565b6107d2565b005b6102b56107f8565b6040516102c29190614c91565b60405180910390f35b6102de6102d9366004614d04565b61088a565b60405190151581526020016102c2565b6103016102fc366004614d30565b6108a4565b604080519586526020860194909452928401919091526060830152608082015260a0016102c2565b6102ab610337366004614d69565b610af5565b60da5461034f906001600160a01b031681565b6040516102c29190614d86565b6102ab61036a366004614f06565b610cd1565b61038261037d366004614ff2565b610fb9565b6040519081526020016102c2565b603554610382565b6102ab6110f0565b60a1546103ad9060ff1681565b60405160ff90911681526020016102c2565b6102de6103cd36600461500b565b611217565b6103ff6103e0366004614d69565b6001600160a01b0316600090815260a26020526040902054609a549091565b604080519283526020830191909152016102c2565b6102ab61042236600461505e565b61123b565b6103ad611282565b61044261043d366004614d69565b6112f5565b604080519384526020840192909252908201526060016102c2565b6102de61046b366004614d04565b6113fa565b610382609c5481565b60675461034f906001600160a01b031681565b60d65461034f906001600160a01b031681565b60655461034f906001600160a01b031681565b6102ab6104c036600461508c565b61141c565b6102ab611448565b610382609b5481565b6102ab6104e43660046150b1565b611573565b6103826104f73660046150ea565b611b48565b60d85461034f906001600160a01b031681565b61038261051d366004614ff2565b611bd6565b60db5461034f906001600160a01b031681565b60665461034f906001600160a01b031681565b610382610556366004614d69565b6001600160a01b031660009081526033602052604090205490565b60d85461058890600160c01b900463ffffffff1681565b60405163ffffffff90911681526020016102c2565b609f546105b0906001600160401b031681565b6040516001600160401b0390911681526020016102c2565b60d75461034f906001600160a01b031681565b6102b5611d09565b610382609e5481565b6102de6105fa366004614d04565b611d18565b61038261060d3660046150ea565b611d93565b610669610620366004614d69565b60a26020526000908152604090208054600182015460028301546003840154600485015460059095015493949293919290916001600160401b0380821691600160401b90041687565b60408051978852602088019690965294860193909352606085019190915260808401526001600160401b0390811660a08401521660c082015260e0016102c2565b6102de6106b8366004614d04565b611fbc565b61038260a05481565b6103826106d4366004615125565b611fca565b61034f6106e7366004614ff2565b61204b565b61034f612075565b60d6546102de90600160a01b900460ff1681565b60d85461058890600160a01b900463ffffffff1681565b610382609a5481565b6102ab6120e5565b61038261073e36600461515a565b612237565b61034f612262565b610382609d5481565b6102ab610762366004615188565b6122ae565b61058861259c565b6102ab61077d366004615236565b612652565b6103ff610790366004614d69565b612c63565b60d6546107ab90600160a81b900462ffffff1681565b60405162ffffff90911681526020016102c2565b60d55461034f906001600160a01b031681565b6107da612dc3565b60d68054911515600160a01b0260ff60a01b19909216919091179055565b6060603680546108079061525b565b80601f01602080910402602001604051908101604052809291908181526020018280546108339061525b565b80156108805780601f1061085557610100808354040283529160200191610880565b820191906000526020600020905b81548152906001019060200180831161086357829003601f168201915b5050505050905090565b600033610898818585612e86565b60019150505b92915050565b60d6546040516370a0823160e01b81526000918291829182918291610924916001600160a01b03909116906370a08231906108e3903090600401614d86565b602060405180830381865afa158015610900573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051d9190615295565b9250866109325760006109b4565b60d75460d5546040805163313ce56760e01b815290516109b4936001600160a01b0390811693889391169163313ce567916004808201926020929091908290030181865afa158015610988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ac91906152ae565b60ff16611fca565b91506000866109c4576000610a45565b60d85460da546040516370a0823160e01b8152610a45926001600160a01b039081169216906370a08231906109fd903090600401614d86565b602060405180830381865afa158015610a1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3e9190615295565b6012611fca565b9050609a548411610a5e57600095508594509050610aeb565b609a54610a6b90856152e7565b945086610a79576000610adc565b60d75460d5546040805163313ce56760e01b815290518493610ad2936001600160a01b03918216938b93919092169163313ce5679160048083019260209291908290030181865afa158015610988573d6000803e3d6000fd5b610adc91906152fa565b9150610ae785610fb9565b9550505b9295509295909350565b610afd612dc3565b6040516370a0823160e01b81526000906001600160a01b038316906370a0823190610b2c903090600401614d86565b602060405180830381865afa158015610b49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6d9190615295565b60d6549091506001600160a01b0390811690831603610c1057609a54158015610b9f575060d654600160a01b900460ff165b610c105760405162461bcd60e51b815260206004820152603760248201527f63616e207265636f7665722069546f6b656e206f6e6c79207768656e2073746160448201527635b2b9903430bb32903132b2b7103bb4ba34323930bbb760491b60648201526084015b60405180910390fd5b60665460405163a9059cbb60e01b81526001600160a01b038481169263a9059cbb92610c449290911690859060040161530d565b6020604051808303816000875af1158015610c63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c879190615326565b610ccd5760405162461bcd60e51b81526020600482015260176024820152761c9958dbdd995c881d1c985b9cd9995c8819985a5b1959604a1b6044820152606401610c07565b5050565b610cdf8989898989896122ae565b60675460405163bf40fac160e01b81526000916001600160a01b03169063bf40fac190610d0e90600401615343565b602060405180830381865afa158015610d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4f9190615360565b9050806001600160a01b03168a6001600160a01b03161480610dde5750896001600160a01b031682600081518110610d8957610d8961537d565b60200260200101516001600160a01b0316148015610dde5750806001600160a01b03168260018451610dbb91906152e7565b81518110610dcb57610dcb61537d565b60200260200101516001600160a01b0316145b610e195760405162461bcd60e51b815260206004820152600c60248201526b0d2dcecc2d8d2c840e0c2e8d60a31b6044820152606401610c07565b60d880546001600160a01b038086166001600160a01b03199283161790925560d78054928716929091169190911790558151610e5c9060d9906020850190614bec565b5060675460405163bf40fac160e01b81526001600160a01b039091169063bf40fac190610ea4906004016020808252600490820152630434f4d560e41b604082015260600190565b602060405180830381865afa158015610ec1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee59190615360565b60da80546001600160a01b0319166001600160a01b0392831617905560675460405163bf40fac160e01b815291169063bf40fac190610f2690600401615393565b602060405180830381865afa158015610f43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f679190615360565b60db80546001600160a01b0319166001600160a01b039290921691909117905560d88054600160a01b600160e01b03191665249f00003d0960a41b179055610fad612faa565b50505050505050505050565b60008060d660009054906101000a90046001600160a01b03166001600160a01b031663182df0f56040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110339190615295565b905060008061104061311c565b91509150600061104e613165565b6110566131df565b6110619060126152fa565b61106b91906152e7565b90506001821515146110b1578361108382600a61549f565b61108e85600a61549f565b61109890896154ab565b6110a291906154ab565b6110ac91906154c2565b6110e6565b836110bd82600a61549f565b6110c885600a61549f565b6110d290896154c2565b6110dc91906154ab565b6110e691906154c2565b9695505050505050565b60675460405163bf40fac160e01b815260206004820152600a60248201526921a7a72a2927a62622a960b11b60448201526001600160a01b039091169063bf40fac190606401602060405180830381865afa158015611153573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111779190615360565b606580546001600160a01b0319166001600160a01b0392909216918217905560408051632d77bef360e11b81529051635aef7de6916004808201926020929091908290030181865afa1580156111d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f59190615360565b606680546001600160a01b0319166001600160a01b0392909216919091179055565b60003361122585828561322c565b6112308585856132a6565b506001949350505050565b611243612dc3565b60d88054600160a01b600160e01b031916600160a01b63ffffffff9485160263ffffffff60c01b191617600160c01b9290931691909102919091179055565b60d5546040805163313ce56760e01b815290516000926001600160a01b03169163313ce5679160048083019260209291908290030181865afa1580156112cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f091906152ae565b905090565b6000806000611302613533565b306001600160a01b0385160361136b5760405162461bcd60e51b815260206004820152602860248201527f526563697069656e742063616e6e6f7420626520746865207374616b696e672060448201526718dbdb9d1c9858dd60c21b6064820152608401610c07565b6000806113796000806108a4565b5050509150915061138a8287613610565b604080516001600160a01b038b16815260208101879052908101859052606081018490526080810183905260a0810182905292975090955093507f38c2c21f82a20481909d7aef48247b0743f69728fbb599c274039e2eecf8bb179060c00160405180910390a150509193909250565b60003361089881858561140d8383612237565b61141791906152fa565b612e86565b611424612dc3565b60d6805462ffffff909216600160a81b0262ffffff60a81b19909216919091179055565b60675460405163bf40fac160e01b81526000916001600160a01b03169063bf40fac190611477906004016154e4565b602060405180830381865afa158015611494573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b89190615360565b90506001600160a01b03811615611570576040805160018082528183019092526000916020808301908036833701905050905030816000815181106114ff576114ff61537d565b6001600160a01b03928316602091820292909201015260405163455518ef60e11b815290831690638aaa31de9061153c903390859060040161554e565b600060405180830381600087803b15801561155657600080fd5b505af115801561156a573d6000803e3d6000fd5b50505050505b50565b61157b613cf3565b60d654600160a01b900460ff16156115c95760405162461bcd60e51b815260206004820152601160248201527014dd185ada5b99c81a5cc81c185d5cd959607a1b6044820152606401610c07565b8115806115d65750816064145b6116315760405162461bcd60e51b815260206004820152602660248201527f446f6e6174696f6e2070657263656e746167652073686f756c6420626520302060448201526506f72203130360d41b6064820152608401610c07565b600083116116935760405162461bcd60e51b815260206004820152602960248201527f596f75206e65656420746f207374616b65206120706f73697469766520746f6b604482015268195b88185b5bdd5b9d60ba1b6064820152608401610c07565b806116a95760d5546001600160a01b03166116b6565b60d6546001600160a01b03165b6001600160a01b03166323b872dd336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018690526064016020604051808303816000875af1158015611718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173c9190615326565b6117ab5760405162461bcd60e51b815260206004820152603a60248201527f7472616e7366657246726f6d206661696c65642c206d616b652073757265207960448201527937ba9030b8383937bb32b2103a37b5b2b7103a3930b739b332b960311b6064820152608401610c07565b806117b657826117bf565b6117bf83611bd6565b92508015156000036117d4576117d483613d4c565b6117de3384613e16565b60675460405163bf40fac160e01b8152600091829182916001600160a01b03169063bf40fac1906118119060040161557a565b602060405180830381865afa15801561182e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118529190615360565b6001600160a01b031663d0250144306040518263ffffffff1660e01b815260040161187d9190614d86565b608060405180830381865afa15801561189a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118be91906155a0565b509250925092506118f16118cf3390565b878563ffffffff16856001600160401b0316856001600160401b03168a613ec5565b5060675460405163bf40fac160e01b81526000916001600160a01b03169063bf40fac190611921906004016154e4565b602060405180830381865afa15801561193e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119629190615360565b90506001600160a01b03811615611aee5760d5546040805163313ce56760e01b815290516000926001600160a01b03169163313ce5679160048083019260209291908290030181865afa1580156119bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e191906152ae565b60ff16601214611a875760d560009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6291906152ae565b611a6d9060126155ff565b611a7890600a615618565b611a8290896154ab565b611a89565b875b60405163a39b215360e01b81529091506001600160a01b0383169063a39b215390611aba903390859060040161530d565b600060405180830381600087803b158015611ad457600080fd5b505af1158015611ae8573d6000803e3d6000fd5b50505050505b60d55460405133917f5dac0c1b1112564a045ba943c9d50270893e8e826c49be8e7073adc713ab7bd791611b2d916001600160a01b0316908b9061530d565b60405180910390a250505050611b43600160a355565b505050565b6001600160a01b038416600090815260a260205260408120611b68613533565b611b73858585613f20565b611b838682600001546001614025565b60038101805460009182905560048301805491928392611ba49084906152fa565b9091555050609d54611bb79082906152fa565b609d55611bcb662386f26fc10000826154c2565b979650505050505050565b60d6546040805163182df0f560e01b815290516000926001600160a01b0316918391839163182df0f59160048083019260209291908290030181865afa158015611c24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c489190615295565b9050600080611c5561311c565b915091506000611c63613165565b611c6b6131df565b611c769060126152fa565b611c8091906152e7565b90506000600183151514611cc857611c9982600a61549f565b85611ca586600a61549f565b611caf908b6154c2565b611cb991906154ab565b611cc391906154c2565b611cfd565b611cd382600a61549f565b85611cdf86600a61549f565b611ce9908b6154ab565b611cf391906154ab565b611cfd91906154c2565b98975050505050505050565b6060603780546108079061525b565b60003381611d268286612237565b905083811015611d865760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610c07565b6112308286868403612e86565b6001600160a01b038416600090815260a260209081526040808320815160e081018352815481526001820154938101939093526002810154918301919091526003810154606083015260048101546080830152600501546001600160401b0380821660a0840152600160401b9091041660c0820152609c54609b54839015801590611e1e5750854310155b8015611e2a5750438510155b15611fac57600060a05443611e3f91906152e7565b90506000611e5489662386f26fc100006154ab565b611e5e90836154ab565b90506000806000611e6e8861434f565b60a1549295509093509150611e879060ff16600a615618565b609b54611e9491906154ab565b611ea985676765c793fa10079d601b1b6154ab565b611eb391906154c2565b611ebd90886152fa565b9650878315611fa557604081015160a154676765c793fa10079d601b1b908a90611eeb9060ff16600a615618565b8460200151611efa91906154ab565b611f0491906154ab565b611f0e91906154c2565b611f1891906152e7565b96506000611f2e85670de0b6b3a76400006154ab565b611f4389676765c793fa10079d601b1b6154ab565b611f4d91906154c2565b905064174876e80081611f618560646154ab565b600a611f6e8860646154ab565b611f799060056154ab565b611f8391906154c2565b611f8d91906152fa565b611f9791906154ab565b611fa191906154c2565b9750505b5050505050505b808360600151611cfd91906152fa565b6000336108988185856132a6565b6000808490506000816001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612010573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120349190615295565b905061204184600a61549f565b6110dc86836154ab565b60d9818154811061205b57600080fd5b6000918252602090912001546001600160a01b0316905081565b60675460405163bf40fac160e01b81526000916001600160a01b03169063bf40fac1906120a490600401615393565b602060405180830381865afa1580156120c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f09190615360565b6120ed613cf3565b60675460405163bf40fac160e01b81526001600160a01b039091169063bf40fac19061211b9060040161557a565b602060405180830381865afa158015612138573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215c9190615360565b60675460405163bf40fac160e01b81526001600160a01b039283169263f03b289092169063bf40fac19061219290600401615627565b602060405180830381865afa1580156121af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d39190615360565b336040518363ffffffff1660e01b81526004016121f1929190615645565b600060405180830381600087803b15801561220b57600080fd5b505af115801561221f573d6000803e3d6000fd5b5050505061222b611448565b612235600160a355565b565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b60675460405163bf40fac160e01b815260206004820152600a60248201526923a7a7a22227a62620a960b11b60448201526000916001600160a01b03169063bf40fac1906064016120a4565b600054610100900460ff16158080156122ce5750600054600160ff909116105b806122e85750303b1580156122e8575060005460ff166001145b61234b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610c07565b6000805460ff19166001179055801561236e576000805461ff0019166101001790555b612377856143fe565b60d580546001600160a01b03808a166001600160a01b03199283161790925560d68054928916929091169190911790556123b18484614421565b60d5546040805163313ce56760e01b815290516012926001600160a01b03169163313ce5679160048083019260209291908290030181865afa1580156123fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061241f91906152ae565b60ff1611156124875760405162461bcd60e51b815260206004820152602e60248201527f546f6b656e20646563696d616c732073686f756c64206265206c65737320746860448201526d616e20313820646563696d616c7360901b6064820152608401610c07565b60d560009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124fe91906152ae565b6125099060126155ff565b60a1805460ff191660ff92909216919091179055609f80546001600160401b0319166001600160401b03841617905560d6805462ffffff60a81b1916604b60aa1b1790558015612593576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60da546040516370a0823160e01b815260009182916001600160a01b03909116906370a08231906125d1903090600401614d86565b602060405180830381865afa1580156125ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126129190615295565b9050801561263d5760d85461263790600160a01b900463ffffffff1662030d4061565f565b91505090565b505060d854600160a01b900463ffffffff1690565b61265a613cf3565b6000811561270957600061266d84611bd6565b60d65460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb906126a0903390889060040161530d565b6020604051808303816000875af11580156126bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e39190615326565b6126ff5760405162461bcd60e51b8152600401610c0790615683565b9250829050612825565b508161271481614452565b60d5546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612745903090600401614d86565b602060405180830381865afa158015612762573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127869190615295565b905081811015612794578091505b60d5546001600160a01b031663a9059cbb33846040518363ffffffff1660e01b81526004016127c492919061530d565b6020604051808303816000875af11580156127e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128079190615326565b6128235760405162461bcd60e51b8152600401610c0790615683565b505b60675460405163bf40fac160e01b81526000916001600160a01b03169063bf40fac1906128549060040161557a565b602060405180830381865afa158015612871573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128959190615360565b90506128a133856144de565b6000806000836001600160a01b031663d0250144306040518263ffffffff1660e01b81526004016128d29190614d86565b608060405180830381865afa1580156128ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061291391906155a0565b509250925092506129456129243390565b888563ffffffff16856001600160401b0316856001600160401b0316614600565b5060675460405163bf40fac160e01b81526001600160a01b038087169263f03b28909291169063bf40fac19061297d90600401615627565b602060405180830381865afa15801561299a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129be9190615360565b336040518363ffffffff1660e01b81526004016129dc929190615645565b600060405180830381600087803b1580156129f657600080fd5b505af1158015612a0a573d6000803e3d6000fd5b505060675460405163bf40fac160e01b8152600093506001600160a01b03909116915063bf40fac190612a3f906004016154e4565b602060405180830381865afa158015612a5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a809190615360565b90506001600160a01b03811615612c0c5760d5546040805163313ce56760e01b815290516000926001600160a01b03169163313ce5679160048083019260209291908290030181865afa158015612adb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aff91906152ae565b60ff16601214612ba55760d560009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b8091906152ae565b612b8b9060126155ff565b612b9690600a615618565b612ba0908a6154ab565b612ba7565b885b604051631f22c54760e11b81529091506001600160a01b03831690633e458a8e90612bd8903390859060040161530d565b600060405180830381600087803b158015612bf257600080fd5b505af1158015612c06573d6000803e3d6000fd5b50505050505b60d55460405133917f89b2bca2609b9ce42215fdd646f9162cdfb9c1620c93db1cc6302479489d3f3291612c4b916001600160a01b0316908a9061530d565b60405180910390a2505050505050610ccd600160a355565b60675460405163bf40fac160e01b815260009182918291829182916001600160a01b03169063bf40fac190612c9a9060040161557a565b602060405180830381865afa158015612cb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cdb9190615360565b6001600160a01b031663d0250144306040518263ffffffff1660e01b8152600401612d069190614d86565b608060405180830381865afa158015612d23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d4791906155a0565b509250925092506000612d74878563ffffffff16856001600160401b0316856001600160401b0316611d93565b6001600160a01b038816600090815260a26020526040902060040154909150612da590662386f26fc10000906154c2565b612db6662386f26fc10000836154c2565b9550955050505050915091565b60655460408051632d77bef360e11b8152905133926001600160a01b031691635aef7de69160048083019260209291908290030181865afa158015612e0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e309190615360565b6001600160a01b0316146122355760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206176617461722063616e2063616c6c2074686973206d6574686f646044820152606401610c07565b6001600160a01b038316612ee85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f20616464604