UNPKG

@gooddollar/goodprotocol

Version:
724 lines 67.5 kB
{ "_format": "hh-sol-artifact-1", "contractName": "GoodFundManager", "sourceName": "contracts/staking/GoodFundManager.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": "beacon", "type": "address" } ], "name": "BeaconUpgraded", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "newCollectInterestTimeThreshold", "type": "uint256" } ], "name": "CollectInterestTimeThresholdSet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "caller", "type": "address" }, { "indexed": false, "internalType": "address", "name": "reserve", "type": "address" }, { "indexed": false, "internalType": "address[]", "name": "stakings", "type": "address[]" }, { "indexed": false, "internalType": "uint256", "name": "cDAIinterestEarned", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "gdUBI", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "gdReward", "type": "uint256" } ], "name": "FundsTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "newGasCostExceptInterestCollect", "type": "uint256" } ], "name": "GasCostExceptInterestCollectSet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "newGasCost", "type": "uint256" } ], "name": "GasCostSet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint8", "name": "version", "type": "uint8" } ], "name": "Initialized", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint8", "name": "newInterestMultiplier", "type": "uint8" } ], "name": "InterestMultiplierSet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "stakingContract", "type": "address" }, { "indexed": false, "internalType": "address", "name": "staker", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "gdReward", "type": "uint256" } ], "name": "StakingRewardMinted", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint32", "name": "_rewardsPerBlock", "type": "uint32" }, { "indexed": false, "internalType": "address", "name": "_stakingAddress", "type": "address" }, { "indexed": false, "internalType": "uint32", "name": "_blockStart", "type": "uint32" }, { "indexed": false, "internalType": "uint32", "name": "_blockEnd", "type": "uint32" }, { "indexed": false, "internalType": "bool", "name": "_isBlackListed", "type": "bool" } ], "name": "StakingRewardSet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "implementation", "type": "address" } ], "name": "Upgraded", "type": "event" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "activeContracts", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "avatar", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "calcSortedContracts", "outputs": [ { "components": [ { "internalType": "address", "name": "contractAddress", "type": "address" }, { "internalType": "uint256", "name": "interestBalance", "type": "uint256" }, { "internalType": "uint256", "name": "collectedInterestSoFar", "type": "uint256" }, { "internalType": "uint256", "name": "gasCostSoFar", "type": "uint256" }, { "internalType": "uint256", "name": "maxGasAmountSoFar", "type": "uint256" }, { "internalType": "bool", "name": "maxGasLargerOrEqualRequired", "type": "bool" } ], "internalType": "struct GoodFundManager.InterestInfo[]", "name": "", "type": "tuple[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "_stakingContracts", "type": "address[]" }, { "internalType": "bool", "name": "_forceAndWaiverRewards", "type": "bool" } ], "name": "collectInterest", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "collectInterestTimeThreshold", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "dao", "outputs": [ { "internalType": "contract Controller", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "gasCostExceptInterestCollect", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "gdMintGasCost", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getActiveContractsCount", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_gasAmount", "type": "uint256" } ], "name": "getGasPriceInGD", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_gasAmount", "type": "uint256" }, { "internalType": "bool", "name": "_inDAI", "type": "bool" } ], "name": "getGasPriceIncDAIorDAI", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "contract INameService", "name": "_ns", "type": "address" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "interestMultiplier", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_contract", "type": "address" } ], "name": "isActiveContract", "outputs": [ { "internalType": "bool", "name": "isActive", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "lastCollectedInterest", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "lastCollectedInterestBlock", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "minCollectInterestIntervalDays", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_token", "type": "address" }, { "internalType": "address", "name": "_user", "type": "address" } ], "name": "mintReward", "outputs": [], "stateMutability": "nonpayable", "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": "proxiableUUID", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "rewardsForStakingContract", "outputs": [ { "internalType": "uint32", "name": "blockReward", "type": "uint32" }, { "internalType": "uint64", "name": "blockStart", "type": "uint64" }, { "internalType": "uint64", "name": "blockEnd", "type": "uint64" }, { "internalType": "bool", "name": "isBlackListed", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_timeThreshold", "type": "uint256" } ], "name": "setCollectInterestTimeThreshold", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_gasAmount", "type": "uint256" } ], "name": "setGasCost", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_gasAmount", "type": "uint256" } ], "name": "setGasCostExceptInterestCollect", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint8", "name": "_newMultiplier", "type": "uint8" } ], "name": "setInterestMultiplier", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint32", "name": "_rewardsPerBlock", "type": "uint32" }, { "internalType": "address", "name": "_stakingAddress", "type": "address" }, { "internalType": "uint32", "name": "_blockStart", "type": "uint32" }, { "internalType": "uint32", "name": "_blockEnd", "type": "uint32" }, { "internalType": "bool", "name": "_isBlackListed", "type": "bool" } ], "name": "setStakingReward", "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" } ], "bytecode": "0x60a06040523060805234801561001457600080fd5b5060805161326661004c60003960008181610b8e01528181610bd701528181610fa401528181610fe4015261106001526132666000f3fe60806040526004361061015d5760003560e01c806308944514146101625780630e47dbd91461018457806312ce63d9146101a8578063195dc7cc146101be5780631b3c90a8146101ea57806324ccc1e7146101ff5780633659cfe6146102215780633e6326fc146102415780634162169f1461026e57806344fa76221461028e5780634f1ef286146102ae57806352d1902d146102c15780635aef7de6146102d657806372d00e9f146102f6578063791b6bc3146103165780637c6b63b4146103365780638aba4659146103565780639d89e9a414610376578063a25dc5f414610395578063a65134d3146103ab578063aac7efb4146103db578063b6eee2c9146103fb578063b7714ae21461041b578063c4d66de81461043b578063c81a2b5d1461045b578063d025014414610471578063e1758bd814610504578063e31bf13214610519578063f03b28901461052f578063f4a7a3951461054f575b600080fd5b34801561016e57600080fd5b5061018261017d366004612a92565b610565565b005b34801561019057600080fd5b5060a0545b6040519081526020015b60405180910390f35b3480156101b457600080fd5b50610195609a5481565b3480156101ca57600080fd5b50609f546101d89060ff1681565b60405160ff909116815260200161019f565b3480156101f657600080fd5b506101826105b6565b34801561020b57600080fd5b506102146106dd565b60405161019f9190612ab5565b34801561022d57600080fd5b5061018261023c366004612b4d565b610b84565b34801561024d57600080fd5b50606754610261906001600160a01b031681565b60405161019f9190612b6a565b34801561027a57600080fd5b50606554610261906001600160a01b031681565b34801561029a57600080fd5b506101956102a9366004612b8c565b610c55565b6101826102bc366004612bd2565b610f9a565b3480156102cd57600080fd5b50610195611053565b3480156102e257600080fd5b50606654610261906001600160a01b031681565b34801561030257600080fd5b50610261610311366004612c95565b611101565b34801561032257600080fd5b50610182610331366004612c95565b61112b565b34801561034257600080fd5b50610182610351366004612cc7565b611168565b34801561036257600080fd5b50610182610371366004612c95565b6114c9565b34801561038257600080fd5b50609f546101d890610100900460ff1681565b3480156103a157600080fd5b50610195609d5481565b3480156103b757600080fd5b506103cb6103c6366004612b4d565b611506565b604051901515815260200161019f565b3480156103e757600080fd5b506101956103f6366004612c95565b611590565b34801561040757600080fd5b50610182610416366004612d32565b6116b4565b34801561042757600080fd5b50610182610436366004612c95565b611e60565b34801561044757600080fd5b50610182610456366004612b4d565b611e9d565b34801561046757600080fd5b50610195609c5481565b34801561047d57600080fd5b506104ce61048c366004612b4d565b60a16020526000908152604090205463ffffffff8116906001600160401b03600160201b8204811691600160601b81049091169060ff600160a01b9091041684565b6040805163ffffffff9590951685526001600160401b03938416602086015291909216908301521515606082015260800161019f565b34801561051057600080fd5b50610261611fda565b34801561052557600080fd5b50610195609b5481565b34801561053b57600080fd5b5061018261054a366004612db7565b612067565b34801561055b57600080fd5b50610195609e5481565b61056d6123b2565b609f805460ff191660ff83169081179091556040519081527fceef3bba37867319344ac9cc91b1d2318daa822bae8d15118d84aedc1fbba330906020015b60405180910390a150565b60675460405163bf40fac160e01b815260206004820152600a60248201526921a7a72a2927a62622a960b11b60448201526001600160a01b039091169063bf40fac190606401602060405180830381865afa158015610619573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063d9190612de5565b606580546001600160a01b0319166001600160a01b0392909216918217905560408051632d77bef360e11b81529051635aef7de6916004808201926020929091908290030181865afa158015610697573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bb9190612de5565b606680546001600160a01b0319166001600160a01b0392909216919091179055565b60a0546060906000906001600160401b038111156106fd576106fd612bbc565b604051908082528060200260200182016040528015610726578160200160208202803683370190505b5060a0549091506000906001600160401b0381111561074757610747612bbc565b604051908082528060200260200182016040528015610770578160200160208202803683370190505b5060a0549091506000906001600160401b0381111561079157610791612bbc565b60405190808252806020026020018201604052801561080657816020015b6107f36040518060c0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000151581525090565b8152602001906001900390816107af5790505b5090506000805b60a0548112156109485760a0818154811061082a5761082a612e02565b600091825260208220015460405163026c13ed60e21b81526004810192909252600160248301526001600160a01b0316906309b04fb49060440160a060405180830381865afa158015610881573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a59190612e18565b955050841592506109369150505760a081815481106108c6576108c6612e02565b9060005260206000200160009054906101000a90046001600160a01b03168582815181106108f6576108f6612e02565b60200260200101906001600160a01b031690816001600160a01b0316815250508184828151811061092957610929612e02565b6020026020010181815250505b8061094081612e6e565b91505061080d565b609c546109558587612477565b6000806000600160a08054905061096c9190612e8d565b94505b60008512610b765760006001600160a01b031689868151811061099457610994612e02565b60200260200101516001600160a01b031614610b5f578885815181106109bc576109bc612e02565b60200260200101516001600160a01b031663e660b53f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a259190612eb4565b9250878581518110610a3957610a39612e02565b602002602001015182610a4c9190612ecd565b9150610a588385612ecd565b9350609e54609a54610a6a9190612ecd565b421015610aaa57610a7c600180610c55565b609f54610a8c919060ff16612ee0565b610a9b836402540be400612ee0565b610aa59190612ef7565b610ace565b610ab5600180610c55565b610ac4836402540be400612ee0565b610ace9190612ef7565b90506040518060c001604052808a8781518110610aed57610aed612e02565b60200260200101516001600160a01b03168152602001898781518110610b1557610b15612e02565b60200260200101518152602001838152602001858152602001828152602001858310151515815250878681518110610b4f57610b4f612e02565b6020026020010181905250610b64565b610b76565b84610b6e81612f19565b95505061096f565b509498975050505050505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610bd55760405162461bcd60e51b8152600401610bcc90612f36565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c0761249b565b6001600160a01b031614610c2d5760405162461bcd60e51b8152600401610bcc90612f70565b610c36816124b7565b60408051600080825260208201909252610c52918391906124bf565b50565b60675460405163bf40fac160e01b815260206004820152601060248201526f4741535f50524943455f4f5241434c4560801b604482015260009182916001600160a01b039091169063bf40fac190606401602060405180830381865afa158015610cc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce79190612de5565b90506000816001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4d9190612eb4565b60675460405163bf40fac160e01b815260206004820152600e60248201526d4441495f4554485f4f5241434c4560901b60448201529192506000916001600160a01b039091169063bf40fac190606401602060405180830381865afa158015610dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dde9190612de5565b90506000816001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e449190612eb4565b9050600081610e5b85670de0b6b3a7640000612ee0565b610e659190612ef7565b90508615610e8357610e778882612ee0565b95505050505050610f94565b60675460405163bf40fac160e01b815289916001600160a01b03169063bf40fac190610eb190600401612faa565b602060405180830381865afa158015610ece573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef29190612de5565b6001600160a01b031663182df0f56040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f539190612eb4565b610f626402540be40084612ef7565b610f78906b204fce5e3e25026110000000612ee0565b610f829190612ef7565b610f8c9190612ee0565b955050505050505b92915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610fe25760405162461bcd60e51b8152600401610bcc90612f36565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661101461249b565b6001600160a01b03161461103a5760405162461bcd60e51b8152600401610bcc90612f70565b611043826124b7565b61104f828260016124bf565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110ee5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c6044820152771b1959081d1a1c9bdd59da0819195b1959d85d1958d85b1b60421b6064820152608401610bcc565b506000805160206131ea83398151915290565b60a0818154811061111157600080fd5b6000918252602090912001546001600160a01b0316905081565b6111336123b2565b609c8190556040518181527fcc09a90bef37a706a00b53dd3f515f9326b029e41271b4bb87777773962cbc60906020016105ab565b6111706123b2565b808061119c57506001600160a01b038416600090815260a16020526040902054600160a01b900460ff16155b6111e25760405162461bcd60e51b815260206004820152601760248201527663616e277420756e646f20626c61636b6c697374696e6760481b6044820152606401610bcc565b600060405180608001604052808763ffffffff16815260200160008663ffffffff161161120f5743611211565b855b63ffffffff166001600160401b0316815260200160008563ffffffff161161123d5763ffffffff61123f565b845b63ffffffff90811682528415156020928301526001600160a01b038816600090815260a18352604080822085518154958701519287015160608801511515600160a01b0260ff60a01b196001600160401b03928316600160601b0216600160601b600160a81b031995909216600160201b026001600160601b0319909816929096169190911795909517919091169390931791909117909155909150805b60a05460ff8216101561133f57866001600160a01b031660a08260ff168154811061130a5761130a612e02565b6000918252602090912001546001600160a01b03160361132d576001915061133f565b8061133781612fc8565b9150506112dd565b8180156113495750835b156114035760a0805461135e90600190612fe7565b8154811061136e5761136e612e02565b60009182526020909120015460a080546001600160a01b039092169160ff841690811061139d5761139d612e02565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a08054806113dc576113dc612ffa565b600082815260209020810160001990810180546001600160a01b0319169055019055611460565b8115801561140f575083155b156114605760a080546001810182556000919091527f78fdc8d422c49ced035a9edf18d00d3c6a8d81df210f3e5e448e045e77b41e880180546001600160a01b0319166001600160a01b0389161790555b6040805163ffffffff8a811682526001600160a01b038a1660208301528881168284015287166060820152851515608082015290517fcfeece178cde5fc0c509d31ec15ec2d996342bec5d9820be8aabbda11a21205b9181900360a00190a15050505050505050565b6114d16123b2565b609d8190556040518181527f08deabc2cb3286b159d9350bf977350e1f31e39ae44075269082a800e9ee59de906020016105ab565b6001600160a01b038116600090815260a16020526040812054600160a01b900460ff16158015610f9457506001600160a01b038216600090815260a16020526040902054600160201b90046001600160401b0316151580610f945750506001600160a01b0316600090815260a16020526040902054600160601b90046001600160401b0316151590565b60008061159e836000610c55565b60675460405163bf40fac160e01b81529192506000916001600160a01b039091169063bf40fac1906115d290600401613010565b602060405180830381865afa1580156115ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116139190612de5565b6001600160a01b0316639d1b464a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611650573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116749190612eb4565b90506a084595161401484a0000008161169884676765c793fa10079d601b1b612ee0565b6116a29190612ef7565b6116ac9190612ef7565b949350505050565b60a2546001036117065760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bcc565b600160a25560005a60675460405163bf40fac160e01b81529192506000918291829182916001600160a01b03169063bf40fac19061174690600401612faa565b602060405180830381865afa158015611763573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117879190612de5565b60675460405163bf40fac160e01b815260206004820152600360248201526244414960e81b60448201529192506000916001600160a01b039091169063bf40fac190606401602060405180830381865afa1580156117e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180d9190612de5565b60675460405163bf40fac160e01b81529192506001600160a01b03169063bf40fac19061183c90600401613010565b602060405180830381865afa158015611859573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187d9190612de5565b92506000816001600160a01b03166370a08231856040518263ffffffff1660e01b81526004016118ad9190612b6a565b602060405180830381865afa1580156118ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ee9190612eb4565b90506000836001600160a01b03166370a08231866040518263ffffffff1660e01b815260040161191e9190612b6a565b602060405180830381865afa15801561193b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195f9190612eb4565b9050895b8015611aeb5760008c8c611978600185612fe7565b81811061198757611987612e02565b905060200201602081019061199c9190612b4d565b6001600160a01b031614611ad9576119de8c8c6119ba600185612fe7565b8181106119c9576119c9612e02565b90506020020160208101906103c69190612b4d565b611a365760405162461bcd60e51b815260206004820152602360248201527f636f6c6c656374496e7465726573743a206e6f7420612064616f20636f6e74726044820152621858dd60ea1b6064820152608401610bcc565b8b8b611a43600184612fe7565b818110611a5257611a52612e02565b9050602002016020810190611a679190612b4d565b6001600160a01b03166337455990876040518263ffffffff1660e01b8152600401611a929190612b6a565b6060604051808303816000875af1158015611ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad59190613031565b5050505b80611ae38161305f565b915050611963565b50600082846001600160a01b03166370a08231886040518263ffffffff1660e01b8152600401611b1b9190612b6a565b602060405180830381865afa158015611b38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5c9190612eb4565b611b669190612fe7565b604051631de778a560e01b815260048101829052602481018490526001600160a01b03878116604483015291925090871690631de778a59060640160408051808303816000875af1158015611bbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be3919061306e565b90985096506000945050505086151582039050611dfe5760006064609d545a611c0c9089612fe7565b611c169190612ecd565b611c2190606e612ee0565b611c2b9190612ef7565b9050611c3681611590565b60675460405163bf40fac160e01b81529193506001600160a01b038086169263f8a9978f929091169063bf40fac190611c7190600401612faa565b602060405180830381865afa158015611c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb29190612de5565b33856040518463ffffffff1660e01b8152600401611cd293929190613092565b600060405180830381600087803b158015611cec57600080fd5b505af1158015611d00573d6000803e3d6000fd5b505050506000611d11826000610c55565b9050609e54609a54611d239190612ecd565b4210611d8b578085101580611d485750609f54611d4490849060ff16612ee0565b8610155b611d865760405162461bcd60e51b815260206004820152600f60248201526e554249203c2067617320636f73747360881b6044820152606401610bcc565b611dfb565b609f54611d9c90829060ff16612ee0565b85101580611dba5750609f54611db690849060ff16612ee0565b8610155b611dfb5760405162461bcd60e51b8152602060048201526012602482015271554249203c2020582a67617320636f73747360701b6044820152606401610bcc565b50505b336001600160a01b03167fa152fd34a7e4c4c82eb0c0b0319d3913dc9189d62ae2fe75aef590f0e391a928838a8a878987604051611e41969594939291906130b6565b60405180910390a2505042609a55505043609b555050600060a2555050565b611e686123b2565b609e8190556040518181527f28b3b60d9fa0f6edab793c2422ff4784f9381ff9d2062481d1254f732452bfbf906020016105ab565b600054610100900460ff1615808015611ebd5750600054600160ff909116105b80611ede5750611ecc3061262f565b158015611ede575060005460ff166001145b611f415760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610bcc565b6000805460ff191660011790558015611f64576000805461ff0019166101001790555b611f6d8261263e565b6203d090609d55624f1a00609e55609f8054620cf850609c5561ffff1916610704179055801561104f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b60675460405163bf40fac160e01b815260206004820152600a60248201526923a7a7a22227a62620a960b11b60448201526000916001600160a01b03169063bf40fac190606401602060405180830381865afa15801561203e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120629190612de5565b905090565b33600090815260a160209081526040918290208251608081018452905463ffffffff81168252600160201b81046001600160401b03908116938301849052600160601b82041693820193909352600160a01b90920460ff16151560608301526121125760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e6720636f6e7472616374206e6f742072656769737465726564006044820152606401610bcc565b80516020820151604080840151905163574c5c9360e01b81526001600160a01b038616600482015263ffffffff90931660248401526001600160401b039182166044840152166064820152600090339063574c5c93906084016020604051808303816000875af115801561218a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ae9190612eb4565b90506000811180156121c257506060820151155b801561229b575060675460405163bf40fac160e01b81526001600160a01b039091169063bf40fac1906121f790600401613010565b602060405180830381865afa158015612214573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122389190612de5565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612275573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122999190613127565b155b156123ac5760675460405163bf40fac160e01b81526001600160a01b039091169063bf40fac1906122ce90600401613010565b602060405180830381865afa1580156122eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230f9190612de5565b6001600160a01b031663f8a9978f8585846040518463ffffffff1660e01b815260040161233e93929190613092565b600060405180830381600087803b15801561235857600080fd5b505af115801561236c573d6000803e3d6000fd5b505050507f5c4a97f844ad1dc8cad420327f32da9b4bd075bab26efa2ae5bd66f84d1fce073384836040516123a393929190613092565b60405180910390a15b50505050565b60655460408051632d77bef360e11b8152905133926001600160a01b031691635aef7de69160048083019260209291908290030181865afa1580156123fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061241f9190612de5565b6001600160a01b0316146124755760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206176617461722063616e2063616c6c2074686973206d6574686f646044820152606401610bcc565b565b60018251111561104f5761104f82826000600186516124969190612fe7565b612661565b6000805160206131ea833981519152546001600160a01b031690565b610c526123b2565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156124f7576124f283612857565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612551575060408051601f3d908101601f1916820190925261254e91810190612eb4565b60015b6125b45760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610bcc565b6000805160206131ea83398151915281146126235760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610bcc565b506124f28383836128f1565b6001600160a01b03163b151590565b606780546001600160a01b0319166001600160a01b038316179055610c526105b6565b808210156123ac5760008460026126788486612ecd565b6126829190612ef7565b8151811061269257612692612e02565b6020908102919091010151905082825b828783815181106126b5576126b5612e02565b602002602001015110156126d557816126cd81613144565b9250506126a2565b828782815181106126e8576126e8612e02565b6020026020010151111561270857806127008161305f565b9150506126d5565b808210156128195786818151811061272257612722612e02565b602002602001015187838151811061273c5761273c612e02565b602002602001015188848151811061275657612756612e02565b6020026020010189848151811061276f5761276f612e02565b602002602001018281525082815250505085818151811061279257612792612e02565b60200260200101518683815181106127ac576127ac612e02565b60200260200101518784815181106127c6576127c6612e02565b602002602001018884815181106127df576127df612e02565b6001600160a01b039384166020918202929092010152911690528161280381613144565b92505080806128119061305f565b9150506126a2565b8085101561282d5761282d87878784612661565b8061283781613144565b9150508381101561284e5761284e87878387612661565b50505050505050565b6128608161262f565b6128c25760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610bcc565b6000805160206131ea83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6128fa83612916565b6000825111806129075750805b156124f2576123ac8383612956565b61291f81612857565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606129618361262f565b6129bc5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610bcc565b600080846001600160a01b0316846040516129d7919061317a565b600060405180830381855af49150503d8060008114612a12576040519150601f19603f3d011682016040523d82523d6000602084013e612a17565b606091505b5091509150612a3f828260405180606001604052806027815260200161320a60279139612a48565b95945050505050565b60608315612a57575081612a61565b612a618383612a68565b9392505050565b815115612a785781518083602001fd5b8060405162461bcd60e51b8152600401610bcc9190613196565b600060208284031215612aa457600080fd5b813560ff81168114612a6157600080fd5b602080825282518282018190526000919060409081850190868401855b82811015612b2b57815180516001600160a01b0316855286810151878601528581015186860152606080820151908601526080808201519086015260a09081015115159085015260c09093019290850190600101612ad2565b5091979650505050505050565b6001600160a01b0381168114610c5257600080fd5b600060208284031215612b5f57600080fd5b8135612a6181612b38565b6001600160a01b0391909116815260200190565b8015158114610c5257600080fd5b60008060408385031215612b9f57600080fd5b823591506020830135612bb181612b7e565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215612be557600080fd5b8235612bf081612b38565b915060208301356001600160401b0380821115612c0c57600080fd5b818501915085601f830112612c2057600080fd5b813581811115612c3257612c32612bbc565b604051601f8201601f19908116603f01168101908382118183101715612c5a57612c5a612bbc565b81604052828152886020848701011115612c7357600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b600060208284031215612ca757600080fd5b5035919050565b803563ffffffff81168114612cc257600080fd5b919050565b600080600080600060a08688031215612cdf57600080fd5b612ce886612cae565b94506020860135612cf881612b38565b9350612d0660408701612cae565b9250612d1460608701612cae565b91506080860135612d2481612b7e565b809150509295509295909350565b600080600060408486031215612d4757600080fd5b83356001600160401b0380821115612d5e57600080fd5b818601915086601f830112612d7257600080fd5b813581811115612d8157600080fd5b8760208260051b8501011115612d9657600080fd5b60209283019550935050840135612dac81612b7e565b809150509250925092565b60008060408385031215612dca57600080fd5b8235612dd581612b38565b91506020830135612bb181612b38565b600060208284031215612df757600080fd5b8151612a6181612b38565b634e487b7160e01b600052603260045260246000fd5b600080600080600060a08688031215612e3057600080fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b634e487b7160e01b600052601160045260246000fd5b60006001600160ff1b018201612e8657612e86612e58565b5060010190565b8181036000831280158383131683831282161715612ead57612ead612e58565b5092915050565b600060208284031215612ec657600080fd5b5051919050565b80820180821115610f9457610f94612e58565b8082028115828204841417610f9457610f94612e58565b600082612f1457634e487b7160e01b600052601260045260246000fd5b500490565b6000600160ff1b8201612f2e57612f2e612e58565b506000190190565b6020808252602c908201526000805160206131ca83398151915260408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201526000805160206131ca83398151915260408201526b6163746976652070726f787960a01b606082015260800190565b6020808252600490820152634344414960e01b604082015260600190565b600060ff821660ff8103612fde57612fde612e58565b60010192915050565b81810381811115610f9457610f94612e58565b634e487b7160e01b600052603160045260246000fd5b6020808252600790820152665245534552564560c81b604082015260600190565b60008060006060848603121561304657600080fd5b8351925060208401519150604084015190509250925092565b600081612f2e57612f2e612e58565b6000806040838503121561308157600080fd5b505080516020909101519092909150565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03878116825260a06020808401829052908301879052600091889160c08501845b8a8110156131055784356130f181612b38565b8416825293820193908201906001016130de565b5060408601989098525050505060608101929092526080909101529392505050565b60006020828403121561313957600080fd5b8151612a6181612b7e565b600060018201612e8657612e86612e58565b60005b83811015613171578181015183820152602001613159565b50506000910152565b6000825161318c818460208701613156565b9190910192915050565b60208152600082518060208401526131b5816040850160208701613156565b601f01601f1916919091016040019291505056fe46756e6374696f6e206d7573742062652063616c6c6564207468726f75676820360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220f9081255a82d3bf1e46d84591df13c5702b77de8ff357e63ee5497f90e38a1b864736f6c63430008130033", "deployedBytecode": "0x60806040526004361061015d5760003560e01c806308944514146101625780630e47dbd91461018457806312ce63d9146101a8578063195dc7cc146101be5780631b3c90a8146101ea57806324ccc1e7146101ff5780633659cfe6146102215780633e6326fc146102415780634162169f1461026e57806344fa76221461028e5780634f1ef286146102ae57806352d1902d146102c15780635aef7de6146102d657806372d00e9f146102f6578063791b6bc3146103165780637c6b63b4146103365780638aba4659146103565780639d89e9a414610376578063a25dc5f414610395578063a65134d3146103ab578063aac7efb4146103db578063b6eee2c9146103fb578063b7714ae21461041b578063c4d66de81461043b578063c81a2b5d1461045b578063d025014414610471578063e1758bd814610504578063e31bf13214610519578063f03b28901461052f578063f4a7a3951461054f575b600080fd5b34801561016e57600080fd5b5061018261017d366004612a92565b610565565b005b34801561019057600080fd5b5060a0545b6040519081526020015b60405180910390f35b3480156101b457600080fd5b50610195609a5481565b3480156101ca57600080fd5b50609f546101d89060ff1681565b60405160ff909116815260200161019f565b3480156101f657600080fd5b506101826105b6565b34801561020b57600080fd5b506102146106dd565b60405161019f9190612ab5565b34801561022d57600080fd5b5061018261023c366004612b4d565b610b84565b34801561024d57600080fd5b50606754610261906001600160a01b031681565b60405161019f9190612b6a565b34801561027a57600080fd5b50606554610261906001600160a01b031681565b34801561029a57600080fd5b506101956102a9366004612b8c565b610c55565b6101826102bc366004612bd2565b610f9a565b3480156102cd57600080fd5b50610195611053565b3480156102e257600080fd5b50606654610261906001600160a01b031681565b34801561030257600080fd5b50610261610311366004612c95565b611101565b34801561032257600080fd5b50610182610331366004612c95565b61112b565b34801561034257600080fd5b50610182610351366004612cc7565b611168565b34801561036257600080fd5b50610182610371366004612c95565b6114c9565b34801561038257600080fd5b50609f546101d890610100900460ff1681565b3480156103a157600080fd5b50610195609d5481565b3480156103b757600080fd5b506103cb6103c6366004612b4d565b611506565b604051901515815260200161019f565b3480156103e757600080fd5b506101956103f6366004612c95565b611590565b34801561040757600080fd5b50610182610416366004612d32565b6116b4565b34801561042757600080fd5b50610182610436366004612c95565b611e60565b34801561044757600080fd5b50610182610456366004612b4d565b611e9d565b34801561046757600080fd5b50610195609c5481565b34801561047d57600080fd5b506104ce61048c366004612b4d565b60a16020526000908152604090205463ffffffff8116906001600160401b03600160201b8204811691600160601b81049091169060ff600160a01b9091041684565b6040805163ffffffff9590951685526001600160401b03938416602086015291909216908301521515606082015260800161019f565b34801561051057600080fd5b50610261611fda565b34801561052557600080fd5b50610195609b5481565b34801561053b57600080fd5b5061018261054a366004612db7565b612067565b34801561055b57600080fd5b50610195609e5481565b61056d6123b2565b609f805460ff191660ff83169081179091556040519081527fceef3bba37867319344ac9cc91b1d2318daa822bae8d15118d84aedc1fbba330906020015b60405180910390a150565b60675460405163bf40fac160e01b815260206004820152600a60248201526921a7a72a2927a62622a960b11b60448201526001600160a01b039091169063bf40fac190606401602060405180830381865afa158015610619573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063d9190612de5565b606580546001600160a01b0319166001600160a01b0392909216918217905560408051632d77bef360e11b81529051635aef7de6916004808201926020929091908290030181865afa158015610697573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bb9190612de5565b606680546001600160a01b0319166001600160a01b0392909216919091179055565b60a0546060906000906001600160401b038111156106fd576106fd612bbc565b604051908082528060200260200182016040528015610726578160200160208202803683370190505b5060a0549091506000906001600160401b0381111561074757610747612bbc565b604051908082528060200260200182016040528015610770578160200160208202803683370190505b5060a0549091506000906001600160401b0381111561079157610791612bbc565b60405190808252806020026020018201604052801561080657816020015b6107f36040518060c0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000151581525090565b8152602001906001900390816107af5790505b5090506000805b60a0548112156109485760a0818154811061082a5761082a612e02565b600091825260208220015460405163026c13ed60e21b81526004810192909252600160248301526001600160a01b0316906309b04fb49060440160a060405180830381865afa158015610881573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a59190612e18565b955050841592506109369150505760a081815481106108c6576108c6612e02565b9060005260206000200160009054906101000a90046001600160a01b03168582815181106108f6576108f6612e02565b60200260200101906001600160a01b031690816001600160a01b0316815250508184828151811061092957610929612e02565b6020026020010181815250505b8061094081612e6e565b91505061080d565b609c546109558587612477565b6000806000600160a08054905061096c9190612e8d565b94505b60008512610b765760006001600160a01b031689868151811061099457610994612e02565b60200260200101516001600160a01b031614610b5f578885815181106109bc576109bc612e02565b60200260200101516001600160a01b031663e660b53f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a259190612eb4565b9250878581518110610a3957610a39612e02565b602002602001015182610a4c9190612ecd565b9150610a588385612ecd565b9350609e54609a54610a6a9190612ecd565b421015610aaa57610a7c600180610c55565b609f54610a8c919060ff16612ee0565b610a9b836402540be400612ee0565b610aa59190612ef7565b610ace565b610ab5600180610c55565b610ac4836402540be400612ee0565b610ace9190612ef7565b90506040518060c001604052808a8781518110610aed57610aed612e02565b60200260200101516001600160a01b03168152602001898781518110610b1557610b15612e02565b60200260200101518152602001838152602001858152602001828152602001858310151515815250878681518110610b4f57610b4f612e02565b6020026020010181905250610b64565b610b76565b84610b6e81612f19565b95505061096f565b509498975050505050505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610bd55760405162461bcd60e51b8152600401610bcc90612f36565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c0761249b565b6001600160a01b031614610c2d5760405162461bcd60e51b8152600401610bcc90612f70565b610c36816124b7565b60408051600080825260208201909252610c52918391906124bf565b50565b60675460405163bf40fac160e01b815260206004820152601060248201526f4741535f50524943455f4f5241434c4560801b604482015260009182916001600160a01b039091169063bf40fac190606401602060405180830381865afa158015610cc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce79190612de5565b90506000816001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4d9190612eb4565b60675460405163bf40fac160e01b815260206004820152600e60248201526d4441495f4554485f4f5241434c4560901b60448201529192506000916001600160a01b039091169063bf40fac190606401602060405180830381865afa158015610dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dde9190612de5565b90506000816001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e449190612eb4565b9050600081610e5b85670de0b6b3a7640000612ee0565b610e659190612ef7565b90508615610e8357610e778882612ee0565b95505050505050610f94565b60675460405163bf40fac160e01b815289916001600160a01b03169063bf40fac190610eb190600401612faa565b602060405180830381865afa158015610ece573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef29190612de5565b6001600160a01b031663182df0f56040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f539190612eb4565b610f626402540be40084612ef7565b610f78906b204fce5e3e25026110000000612ee0565b610f829190612ef7565b610f8c9190612ee0565b955050505050505b92915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610fe25760405162461bcd60e51b8152600401610bcc90612f36565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661101461249b565b6001600160a01b03161461103a5760405162461bcd60e51b8152600401610bcc90612f70565b611043826124b7565b61104f828