Address Contract Partially Verified
Address
0x23cD2E6b283754Fd2340a75732f9DdBb5d11807e
Balance
0 ETH
Nonce
3
Code Size
24565 bytes
Creator
0x33280D3A...0579 at tx 0xdbce0f0e...0c3c66
Indexed Transactions
0
Contract Bytecode
24565 bytes
0x6080604052600436106104685760003560e01c80638116ed721161024a578063c87b56dd11610139578063e985e9c5116100b6578063ee1725461161007a578063ee17254614610e8f578063f04f384414610ea5578063f128b0c114610ec6578063f13ca76f14610ee6578063f2fde38b14610f0757600080fd5b8063e985e9c514610df9578063eb77837514610e19578063eb84fd7714610e39578063ebbbb8f414610e59578063ed74d26e14610e7957600080fd5b8063e33e4b49116100fd578063e33e4b4914610d6d578063e683015f14610d83578063e6c1c9fc14610da3578063e6f203f314610dc3578063e8a3d48514610de457600080fd5b8063c87b56dd14610ca0578063d22d6f4314610cc0578063d9fbb1e914610ce0578063e1f21c6714610d00578063e2c281db14610d2057600080fd5b8063a578be6c116101c7578063b88d4fde1161018b578063b88d4fde14610c18578063bada23d514610c2b578063c6557fd214610c4b578063c7b8981c14610c6b578063c7bb8dc414610c8057600080fd5b8063a578be6c14610b64578063a802d82b14610b98578063a94ea3b014610bb8578063abdf943414610bd8578063ad1ff74b14610bf857600080fd5b80638da5cb5b1161020e5780638da5cb5b14610ab057806393da8b8114610ad057806395d89b4114610af1578063a22cb46514610b24578063a556f60f14610b4457600080fd5b80638116ed7214610a03578063846ea2d014610a2357806388f8202014610a43578063894f03b514610a635780638ada6b0f14610a9057600080fd5b80632f745c59116103665780635a034bd8116102e357806368c5805e116102a757806368c5805e14610949578063702921f51461097657806370a082311461098d5780637cdd109d146109c35780637d87feb9146109e357600080fd5b80635a034bd8146108b35780635be1ee5d146108d3578063615eaa59146108f357806363234f3d146109135780636352211e1461092957600080fd5b806344d34e501161032a57806344d34e501461082a578063471a751e1461084057806352390c0214610860578063557ed1ba146108805780635718f41a1461089357600080fd5b80632f745c5914610790578063313ce567146107b05780633685d419146107d7578063411d8f2f146107f757806342842e0e1461081757600080fd5b80631370733c116103f457806323b872dd116103b857806323b872dd146106c95780632a55205a146106dc5780632a7b11e61461071b5780632b0e1d79146107505780632bcf161c1461077057600080fd5b80631370733c146106125780631635aa0314610646578063171c1fda1461067e57806317c0287c1461069e57806318160ddd146106b457600080fd5b806306fdde031161043b57806306fdde031461052b578063081812fc14610577578063095ea7b3146105af578063099785f6146105c2578063121407c9146105e257600080fd5b806301ffc9a71461046d57806304a9bbec146104a257806306d254da146104e657806306dd29e514610508575b600080fd5b34801561047957600080fd5b5061048d61048836600461523f565b610f27565b60405190151581526020015b60405180910390f35b3480156104ae57600080fd5b506104c26104bd366004615288565b610f94565b6040805163ffffffff90931683526001600160601b03909116602083015201610499565b3480156104f257600080fd5b506105066105013660046152c6565b611125565b005b34801561051457600080fd5b5061051d61119e565b604051908152602001610499565b34801561053757600080fd5b5061056a604051806040016040528060138152602001724576657252697365204e4654205374616b657360681b81525081565b604051610499919061533b565b34801561058357600080fd5b5061059761059236600461534e565b611210565b6040516001600160a01b039091168152602001610499565b6105066105bd366004615367565b611306565b3480156105ce57600080fd5b5061051d6105dd3660046152c6565b611315565b6105f56105f0366004615393565b611341565b6040805163ffffffff938416815292909116602083015201610499565b34801561061e57600080fd5b506105977f000000000000000000000000dba7b24257fc6e397cb7368b4bc922e944072f1b81565b34801561065257600080fd5b506106666106613660046153bf565b611598565b6040516001600160601b039091168152602001610499565b34801561068a57600080fd5b506105066106993660046153f2565b6115ae565b3480156106aa57600080fd5b5061051d60065481565b3480156106c057600080fd5b5061051d611776565b6105066106d736600461542b565b611796565b3480156106e857600080fd5b506106fc6106f736600461546c565b6117b4565b604080516001600160a01b039093168352602083019190915201610499565b34801561072757600080fd5b5061073b6107363660046154c1565b611800565b60405163ffffffff9091168152602001610499565b34801561075c57600080fd5b5061066661076b366004615367565b6118e1565b34801561077c57600080fd5b5061051d61078b3660046152c6565b611912565b34801561079c57600080fd5b5061073b6107ab366004615367565b61193e565b3480156107bc57600080fd5b506107c5600081565b60405160ff9091168152602001610499565b3480156107e357600080fd5b506105066107f23660046152c6565b6119d6565b34801561080357600080fd5b50600354610597906001600160a01b031681565b61050661082536600461542b565b611b8f565b34801561083657600080fd5b5061051d60045481565b34801561084c57600080fd5b5061050661085b366004615367565b611bc6565b34801561086c57600080fd5b5061050661087b3660046152c6565b611bf9565b34801561088c57600080fd5b504261051d565b34801561089f57600080fd5b506105066108ae3660046152c6565b611d48565b3480156108bf57600080fd5b506105066108ce36600461554f565b611ddf565b3480156108df57600080fd5b506105066108ee36600461556f565b611df8565b3480156108ff57600080fd5b5061073b61090e3660046155d8565b611ef6565b34801561091f57600080fd5b5061051d60165481565b34801561093557600080fd5b5061059761094436600461534e565b611f7f565b34801561095557600080fd5b50610969610964366004615614565b611fc7565b6040516104999190615639565b34801561098257600080fd5b5061051d62278d0081565b34801561099957600080fd5b5061051d6109a83660046152c6565b6001600160a01b031660009081526011602052604090205490565b3480156109cf57600080fd5b506106666109de366004615719565b612092565b3480156109ef57600080fd5b506105066109fe3660046152c6565b61213e565b348015610a0f57600080fd5b50600154610597906001600160a01b031681565b348015610a2f57600080fd5b50610506610a3e3660046152c6565b612179565b348015610a4f57600080fd5b5061048d610a5e3660046152c6565b6121f4565b348015610a6f57600080fd5b5061051d610a7e3660046152c6565b60146020526000908152604090205481565b348015610a9c57600080fd5b50600254610597906001600160a01b031681565b348015610abc57600080fd5b50600054610597906001600160a01b031681565b348015610adc57600080fd5b506005546107c590600160b81b900460ff1681565b348015610afd57600080fd5b5061056a604051806040016040528060078152602001666e66745249534560c81b81525081565b348015610b3057600080fd5b50610506610b3f366004615752565b61223c565b348015610b5057600080fd5b50610506610b5f3660046152c6565b61232d565b348015610b7057600080fd5b506105977f000000000000000000000000bbd7b847c6d0d0b5691518a363194d71426475f181565b348015610ba457600080fd5b50610969610bb336600461534e565b6123a6565b348015610bc457600080fd5b5061051d610bd336600461534e565b61249c565b348015610be457600080fd5b5061073b610bf3366004615780565b6124df565b348015610c0457600080fd5b50600554610597906001600160a01b031681565b610506610c263660046157d1565b612695565b348015610c3757600080fd5b5061073b610c46366004615870565b6126f8565b348015610c5757600080fd5b50610506610c66366004615367565b612891565b348015610c7757600080fd5b506105066128c4565b348015610c8c57600080fd5b5061073b610c9b366004615367565b612a8a565b348015610cac57600080fd5b5061056a610cbb36600461534e565b612bf2565b348015610ccc57600080fd5b50610666610cdb366004615893565b612c64565b348015610cec57600080fd5b50610506610cfb36600461534e565b612cea565b348015610d0c57600080fd5b50610506610d1b36600461542b565b612e40565b348015610d2c57600080fd5b50610d40610d3b366004615288565b612e54565b6040805163ffffffff90941684526001600160601b03909216602084015260ff1690820152606001610499565b348015610d7957600080fd5b5061051d60075481565b348015610d8f57600080fd5b50610506610d9e36600461546c565b613025565b348015610daf57600080fd5b50610506610dbe3660046152c6565b6130b1565b348015610dcf57600080fd5b506005546107c590600160a81b900460ff1681565b348015610df057600080fd5b5061056a61312a565b348015610e0557600080fd5b5061048d610e143660046153f2565b61319c565b348015610e2557600080fd5b50610506610e3436600461534e565b61321a565b348015610e4557600080fd5b5061051d610e5436600461534e565b61327f565b348015610e6557600080fd5b5061073b610e743660046158d5565b6132ba565b348015610e8557600080fd5b5061051d60155481565b348015610e9b57600080fd5b5061051d60175481565b348015610eb157600080fd5b506005546107c590600160b01b900460ff1681565b348015610ed257600080fd5b50610506610ee13660046152c6565b61387b565b348015610ef257600080fd5b506005546107c590600160a01b900460ff1681565b348015610f1357600080fd5b50610506610f223660046152c6565b6138df565b60006001600160e01b0319821663152a902d60e11b1480610f5857506001600160e01b031982166380ac58cd60e01b145b80610f7357506001600160e01b03198216635b5e139f60e01b145b80610f8e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b600080610fa033613969565b600080610fad86886139c0565b80549193509150610fd790600160c01b810465ffffffffffff1690600160f01b900460ff16613a44565b8054600554600091600160601b81046001600160601b039081169260649261100b92600160a01b90920460ff169116615919565b611015919061595e565b61101f9190615984565b6001600160601b0316905080866001600160601b031611156110545760405163bb29610960e01b815260040160405180910390fd5b61105f866000613a86565b815461107a9089908890600160f01b900460ff166001613af5565b81546110a1908790600160c01b810465ffffffffffff1690600160f01b900460ff16611598565b825490945086908390600c906110c8908490600160601b90046001600160601b03166159ac565b92506101000a8154816001600160601b0302191690836001600160601b031602179055506110f68784613b82565b600192909201805463ffffffff60a01b1916600160a01b63ffffffff8516021790555096919550909350505050565b61112d613bdd565b6001600160a01b038116611154576040516366385fa360e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517fc3f6f2bdf6d9c842a3bc549613cd55a1e4949821f557b66feb8d73eb7f576d9390600090a250565b6001546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156111e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120b91906159d7565b905090565b600061121b82613c0a565b506000828152600d602052604081206001549091906001600160a01b0316635d0341ba61124786611f7f565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160c060405180830381865afa15801561128b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112af9190615a59565b8254909150600160a01b900465ffffffffffff164211806112e657508154602082015163ffffffff908116600160d01b9092041614155b156112f5575060009392505050565b50546001600160a01b031692915050565b611311338383613cb8565b5050565b6001600160a01b03811660009081526014602052604081205461133783613e3c565b610f8e9190615b06565b6000803361134e81613ec4565b60065433903410156113735760405163627554ed60e01b815260040160405180910390fd5b61137e856000613a86565b6001546040516001600160a01b03909116904780156108fc02916000818181858888f193505050501580156113b7573d6000803e3d6000fd5b506000806113c588846139c0565b805491935091506000906113eb906001600160601b03600160601b820481169116615984565b6001600160601b0316905080886001600160601b03161061141f5760405163bb29610960e01b815260040160405180910390fd5b6114298984613b82565b8254909750600090611465906001600160601b0380821691611456918d811691600160601b900416615b1d565b6114609190615b3c565b613f50565b8354909150899084906000906114859084906001600160601b0316615984565b92506101000a8154816001600160601b0302191690836001600160601b031602179055508083600001600c8282829054906101000a90046001600160601b03166114cf9190615984565b82546001600160601b039182166101009390930a92830291909202199091161790555060018301805463ffffffff8a16600160a01b0263ffffffff60a01b19909116179055825461154c9086908b90849065ffffffffffff600160c01b8204169060ff600160f01b8204811691600160f81b900416600214613f7e565b965061155f858b8a63ffffffff16613ff3565b60405163ffffffff8816906001600160a01b03871690600090600080516020615fa0833981519152908290a45050505050509250929050565b60006115a684848442612092565b949350505050565b6115b6613bdd565b6001600160a01b0382166115dd576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b038116611604576040516366385fa360e01b815260040160405180910390fd5b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015611648573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166c91906159d7565b60000361168c5760405163bb29610960e01b815260040160405180910390fd5b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa1580156116da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fe91906159d7565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611749573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176d9190615b50565b61131157600080fd5b60135460105460009160019161178c9190615b06565b61120b9190615b06565b336117a081613ec4565b336117ad81868686614044565b5050505050565b600080836000036117d857604051635e85ae7360e01b815260040160405180910390fd5b6003546004546001600160a01b03909116906117f49085615b3c565b915091505b9250929050565b600061180b33613969565b611819888886898987614171565b90506001600160601b038316156118d6576118403089856001600160601b0316600061423a565b6040516323b872dd60e01b81526001600160a01b037f000000000000000000000000bbd7b847c6d0d0b5691518a363194d71426475f116906323b872dd90611891906000908c908890600401615b6d565b6020604051808303816000875af11580156118b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d49190615b50565b505b979650505050505050565b60006118ec33613969565b6000806118f984866139c0565b91509150611909858584846144d0565b95945050505050565b6001600160a01b0381166000908152600c602052604081205461193483611315565b610f8e9190615b99565b6001600160a01b038216600090815260116020526040812080548311156119785760405163c64200e960e01b815260040160405180910390fd5b600081848154811061198c5761198c615bb1565b90600052602060002001549050601081815481106119ac576119ac615bb1565b6000918252602090912060029091020160010154600160a01b900463ffffffff1695945050505050565b6119de613bdd565b6001600160a01b038116611a05576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b03811660009081526009602052604090205460ff16611a3e5760405163e6c4247b60e01b815260040160405180910390fd5b600e5460005b81811015611b5657826001600160a01b0316600e8281548110611a6957611a69615bb1565b6000918252602090912001546001600160a01b031603611b4e57600e8054611a9390600190615b06565b81548110611aa357611aa3615bb1565b600091825260209091200154600e80546001600160a01b039092169183908110611acf57611acf615bb1565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559185168152600b82526040808220829055600990925220805460ff19169055600e805480611b2757611b27615bc7565b600082815260209020810160001990810180546001600160a01b0319169055019055611b56565b600101611a44565b506040516001600160a01b038316907f5e8208b8ab7d1d84def348579f7a8420999ac8b055b5a49d9859b3f820fdde1290600090a25050565b33611b9981613ec4565b33611ba681868686614044565b6040805160008152602081019091526117ad90829087908790879061451d565b611bcf33613969565b60405181906001600160a01b03841690600090600080516020615fa0833981519152908290a45050565b611c01613bdd565b6001600160a01b038116611c28576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b03811660009081526009602052604090205460ff1615611c625760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0381166000908152600a602052604090205415611cbc576001600160a01b0381166000908152600a6020526040902054611ca29061327f565b6001600160a01b0382166000908152600b60205260409020555b6001600160a01b038116600081815260096020526040808220805460ff19166001908117909155600e8054918201815583527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b03191684179055517f743dcd4a012534912a3350f3ed8937d3b4f0771c62892ed15e4373dc2c5f584a9190a250565b611d50613bdd565b6001600160a01b038116611d77576040516366385fa360e01b815260040160405180910390fd5b600154611d8c906001600160a01b031661463a565b611d9581612179565b600180546001600160a01b0319166001600160a01b0383169081179091556040517f151b7e66bd44c3b053284cb5cc54c216555683d266fbd4518b9dc513064be66d90600090a250565b611de833613969565b611df3838383613ff3565b505050565b611e00613bdd565b60ff82161580611e13575060788260ff16115b15611e315760405163c64200e960e01b815260040160405180910390fd5b6005805461ffff60a01b1916600160a01b60ff8881169190910260ff60a81b191691909117600160a81b878316021761ffff60b01b1916600160b01b8683160260ff60b81b191617600160b81b9185169190910217905580611e94576001611e97565b60025b6007556040805160ff878116825286811660208301528581168284015284166060820152821515608082015290517fa6bd3ea50016bdc4bfa355baf0d0174bfd46fc6e640605397501935630aafec59181900360a00190a15050505050565b6000611f0133613969565b60ff82161580611f20575060055460ff600160b81b9091048116908316115b80611f465750600c8260ff16118015611f4657506000611f41600c84615bdd565b60ff16115b15611f645760405163c64200e960e01b815260040160405180910390fd5b611f6f836000613a86565b6115a68484600085426000614171565b600080611f8b83613c0a565b9050600060108281548110611fa257611fa2615bb1565b60009182526020909120600160029092020101546001600160a01b0316949350505050565b611fcf6151d5565b611fd983836139c0565b604080516101408101825282546001600160601b038082168352600160601b8204166020830152600160c01b80820465ffffffffffff1693830193909352600160f01b810460ff9081166060840152600160f81b91829004811660808401526001909401546001600160a01b03811660a0840152600160a01b810463ffffffff90811660c085015293810490931660e0830152600160e01b830462ffffff16610100830152909104909116610120820152949350505050565b6000806120a262278d0085615b1d565b6120ac9086615b99565b9050600060026120bf62278d0087615b1d565b6120c99190615b3c565b6120d39087615b99565b841015612105576005546064906120f490600160a81b900460ff1689615919565b6120fe919061595e565b9050612134565b818410156121345760055460649061212790600160b01b900460ff1689615919565b612131919061595e565b90505b9695505050505050565b612146613bdd565b6001600160a01b03811661216d576040516366385fa360e01b815260040160405180910390fd5b6121768161463a565b50565b612181613bdd565b6001600160a01b0381166121a8576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b038116600081815260086020526040808220805460ff19166001179055517f55c7ccdd680e7fe5636cf2334be362332f7e4972e3f724d2c01df0bc85222f039190a250565b60006001600160a01b03821661221d576040516366385fa360e01b815260040160405180910390fd5b506001600160a01b031660009081526009602052604090205460ff1690565b6001546001600160a01b0316612265576040516302c2726760e61b815260040160405180910390fd5b600033600154604051631b3b02e560e11b81526001600160a01b0380841660048301528681166024830152851515604483015292935091169063367605ca90606401600060405180830381600087803b1580156122c157600080fd5b505af11580156122d5573d6000803e3d6000fd5b50505050826001600160a01b0316816001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3184604051612320911515815260200190565b60405180910390a3505050565b612335613bdd565b6001600160a01b03811661235c576040516366385fa360e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f57f5e93e81d1f0875d66647df6e542cf10af3b19c7e656121bc389e20afab77790600090a250565b6123ae6151d5565b60006123b983613c0a565b9050601081815481106123ce576123ce615bb1565b60009182526020918290206040805161014081018252600290930290910180546001600160601b038082168552600160601b8204169484019490945265ffffffffffff600160c01b808604919091169284019290925260ff600160f01b850481166060850152600160f81b94859004811660808501526001909101546001600160a01b03811660a085015263ffffffff600160a01b8204811660c086015292810490921660e084015262ffffff600160e01b8304166101008401529290049091166101208201529392505050565b60006d05ea9ce981a106cf85ce000000008211156124cd5760405163c64200e960e01b815260040160405180910390fd5b6124d5614692565b610f8e9083615b1d565b60006124ea33613969565b6000806124f786886139c0565b8054919350915061252190600160c01b810465ffffffffffff1690600160f01b900460ff166146b5565b8315801561253b57508054600160f81b900460ff16600214155b1561255957604051630e0d376760e21b815260040160405180910390fd5b805460009061257a906001600160601b03600160601b820481169116615984565b9050806001600160601b0316866001600160601b031611156125af5760405163bb29610960e01b815260040160405180910390fd5b6125ba866001613a86565b60006001600160601b038716156125f75782546125e6908a908990600160f01b900460ff166001613af5565b6125f08783615984565b9150600190505b82546001600160601b03838116911614612628575081546001600160c01b0319166001600160601b03821617825560015b801561268557816001600160601b03166000036126545761264b898986866146ec565b60009450612689565b61265e8885613b82565b60018401805463ffffffff60a01b1916600160a01b63ffffffff8416021790559450612689565b8794505b50505050949350505050565b3361269f81613ec4565b336126ac81888888614044565b6126ef8188888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061451d92505050565b50505050505050565b60003361270481613ec4565b3360008061271287846139c0565b8054919350915061273c90600160c01b810465ffffffffffff1690600160f01b900460ff16613a44565b805460ff808816600160f01b909204161061276a576040516339fb820560e11b815260040160405180910390fd5b60055460ff600160b81b909104811690871611806127a35750600c8660ff161180156127a35750600061279e600c88615bdd565b60ff16115b156127c15760405163c64200e960e01b815260040160405180910390fd5b80546000906127da90600160f01b900460ff1688615bff565b82549091506000906127fe906001600160601b03600160601b820481169116615984565b905061280d8582846001614763565b825466ffffffffffffff60c01b1916600160f01b60ff8a160265ffffffffffff60c01b191617600160c01b4265ffffffffffff160217835561284f8985613b82565b9650868360010160146101000a81548163ffffffff021916908363ffffffff160217905550612885858a8963ffffffff16613ff3565b50505050505092915050565b61289a33613969565b60405181906000906001600160a01b03851690600080516020615fa0833981519152908390a45050565b3360006128d082611315565b9050806000036128f3576040516373380d9960e01b815260040160405180910390fd5b6001600160a01b0382166000908152600c60205260408120805483929061291b908490615b99565b9091555061292e9050823083600061423a565b6040516323b872dd60e01b81526001600160a01b037f000000000000000000000000bbd7b847c6d0d0b5691518a363194d71426475f116906323b872dd9061297f9085906000908690600401615c22565b6020604051808303816000875af115801561299e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c29190615b50565b5060015460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af1158015612a16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3a9190615b50565b612a4357600080fd5b816001600160a01b03167f8a43c4352486ec339f487f64af78ca5cbf06cd47833f073d3baf3a193e50316182604051612a7e91815260200190565b60405180910390a25050565b6005546000906001600160a01b0316336001600160a01b031614612ac157604051634014f1a560e01b815260040160405180910390fd5b600080612ace84866139c0565b80549193509150612af890600160c01b810465ffffffffffff1690600160f01b900460ff166146b5565b8054600119600160f81b90910460ff1601612b2657604051630b54d17d60e21b815260040160405180910390fd5b8054600160601b90046001600160601b031615612b975780546001600160601b03600160601b82048116918391600091612b6291859116615984565b82546001600160601b039182166101009390930a9283029190920219909116179055508054600160601b600160c01b03191681555b80546001600160f81b0316600160f91b178155612bb48483613b82565b9250828160010160146101000a81548163ffffffff021916908363ffffffff160217905550612bea85858563ffffffff16613ff3565b505092915050565b60025460405163c87b56dd60e01b8152600481018390526060916001600160a01b03169063c87b56dd90602401600060405180830381865afa158015612c3c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f8e9190810190615c46565b6000612c6f33613969565b600080612c7c85876139c0565b80549193509150612ca690600160c01b810465ffffffffffff1690600160f01b900460ff166146b5565b83158015612cc057508054600160f81b900460ff16600214155b15612cde57604051630e0d376760e21b815260040160405180910390fd5b612134868684846144d0565b612cf3336147f0565b3360008181526009602052604090205460ff1615612d24576040516334d1f12360e11b815260040160405180910390fd5b612d2f308284614829565b8160176000828254612d419190615b99565b9091555060009050612d51614692565b612d5b9084615b1d565b6001600160a01b0383166000908152600a6020526040812080549293508392909190612d88908490615b06565b9250508190555080600f6000828254612da19190615b06565b90915550506040516323b872dd60e01b81526001600160a01b037f000000000000000000000000bbd7b847c6d0d0b5691518a363194d71426475f116906323b872dd90612df79060009030908890600401615c22565b6020604051808303816000875af1158015612e16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e3a9190615b50565b50505050565b612e4933613969565b611df3838383613cb8565b60008080612e6133613969565b600080612e6e87896139c0565b80549193509150612e9890600160c01b810465ffffffffffff1690600160f01b900460ff16613a44565b612ea3866000613a86565b8054600160f01b900460ff169250612ebe8887856001614763565b8054612edc906001600160601b03600160601b820481169116615984565b81549094506001600160601b03600160601b90910481169087161115612f71578054612f1890600160601b90046001600160601b031687615984565b8154600160601b600160c01b03198116835590965086908290600090612f489084906001600160601b03166159ac565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550612fba565b805486908290600c90612f95908490600160601b90046001600160601b0316615984565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b805465ffffffffffff60c01b1916600160c01b4265ffffffffffff1602178155612fe48783613b82565b9450848160010160146101000a81548163ffffffff021916908363ffffffff16021790555061301a88888763ffffffff16613ff3565b505093509350939050565b61302d613bdd565b6103e88211156130505760405163c64200e960e01b815260040160405180910390fd5b61305b81600a615dc2565b61306d83670de0b6b3a7640000615b1d565b6130779190615b3c565b6006556040518281527f2b31447d1e8e344a5cedfa80160758f11af3dbc174e4f7fbf4b6f7a67207519c9060200160405180910390a15050565b6130b9613bdd565b6001600160a01b0381166130e0576040516366385fa360e01b815260040160405180910390fd5b600580546001600160a01b0319166001600160a01b0383169081179091556040517f4971c9b5ab1ad9f04eba5badf6c7ae3def7b48a2a8c703666b313e647fd4f5e290600090a250565b6002546040805163e8a3d48560e01b815290516060926001600160a01b03169163e8a3d4859160048083019260009291908290030181865afa158015613174573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261120b9190810190615c46565b60015460405163e985e9c560e01b81526001600160a01b0384811660048301528381166024830152600092169063e985e9c590604401602060405180830381865afa1580156131ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132139190615b50565b9392505050565b613222613bdd565b600a8111156132445760405163c64200e960e01b815260040160405180910390fd5b60048190556040518181527fd9b587d0d884e97b8e3772325d18ffc0412781f43cb5471b8eb5972667724f019060200160405180910390a150565b6000600f548211156132a45760405163c64200e960e01b815260040160405180910390fd5b60006132ae614692565b90506132138184615b3c565b6000336132c681613ec4565b6002600754146132e9576040516310a2f14360e11b815260040160405180910390fd5b336000806132f788846139c0565b9150915060008061330889866139c0565b84549193509150600090429061332c9062278d0090600160f01b900460ff16615b1d565b85546133479190600160c01b900465ffffffffffff16615b99565b835491119150600090429061336a9062278d0090600160f01b900460ff16615b1d565b84546133859190600160c01b900465ffffffffffff16615b99565b1090508115158190036134ef5782548554600160f01b9182900460ff9081169290910416146133c75760405163042e227b60e41b815260040160405180910390fd5b891580156133ea575082548554600160f81b9182900460ff908116929091041614155b15613408576040516306524e8b60e41b815260040160405180910390fd5b8454600160601b90046001600160601b0316156134795784546001600160601b03600160601b8204811691879160009161344491859116615984565b82546001600160601b039182166101009390930a9283029190920219909116179055508454600160601b600160c01b03191685555b8254600160601b90046001600160601b0316156134ea5782546001600160601b03600160601b820481169185916000916134b591859116615984565b82546001600160601b039182166101009390930a9283029190920219909116179055508254600160601b600160c01b03191683555b61355e565b80151582151514613513576040516327bfbbcb60e21b815260040160405180910390fd5b89158015613540575082548554600160601b918290046001600160601b0390811615159290910416151514155b1561355e5760405163097b027d60e01b815260040160405180910390fd5b8454600160f01b900460ff168261362f578354600090819060ff600160f01b90910481169084168110156135be576135968185615bff565b87549093506135b7906001600160601b03600160601b820481169116615984565b91506135fd565b8060ff168460ff1610156135fd576135d68482615bff565b89549093506135f7906001600160601b03600160601b820481169116615984565b91508093505b60008360ff1611801561361957506000826001600160601b0316115b1561362b5761362b8b83856001614763565b5050505b835486546001600160601b03918216918891600091613650918591166159ac565b82546101009290920a6001600160601b0381810219909316918316021790915585548854600160601b91829004831693508992600c92613695928692919004166159ac565b92506101000a8154816001600160601b0302191690836001600160601b031602179055508215613730578354865465ffffffffffff600160c01b9283900481169290910416116136f5578354600160c01b900465ffffffffffff16613707565b8554600160c01b900465ffffffffffff165b865465ffffffffffff91909116600160c01b0265ffffffffffff60c01b19909116178655613751565b855465ffffffffffff60c01b1916600160c01b4265ffffffffffff16021786555b855460ff60f01b1916600160f01b60ff838116919091029190911787558454600160f81b900416600119016137945785546001600160f81b0316600160f91b1786555b6001840180546001600160f81b0316600160f81b179081905562ffffff600160e01b909104166137c489826148cf565b60008d815260126020526040808220829055601380546001810182559083527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09001889055518e91906001600160a01b038c1690600080516020615fa0833981519152908390a46138348e89613b82565b9a508a8760010160146101000a81548163ffffffff021916908363ffffffff16021790555061386a898f8d63ffffffff16613ff3565b505050505050505050509392505050565b613883613bdd565b6001600160a01b0381166138aa576040516366385fa360e01b815260040160405180910390fd5b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015611311573d6000803e3d6000fd5b6138e7613bdd565b6001600160a01b03811661390e576040516366385fa360e01b815260040160405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b0316613992576040516302c2726760e61b815260040160405180910390fd5b6001546001600160a01b0382811691161461217657604051634014f1a560e01b815260040160405180910390fd5b6000806139cc84613c0a565b9150601082815481106139e1576139e1615bb1565b6000918252602090912060029091020160018101549091506001600160a01b03848116911614613a2457604051630a8c428360e21b815260040160405180910390fd5b6001810154600160a01b900463ffffffff1684146117f9576117f9615dce565b42613a5562278d0060ff8416615b1d565b613a679065ffffffffffff8516615b99565b101561131157604051636717a45560e01b815260040160405180910390fd5b6000613a9a670de0b6b3a764000084615de4565b613aa49084615984565b9050806001600160601b0316836001600160601b0316141580613ad7575081158015613ad757506001600160601b038316155b15611df35760405163743aec6160e01b815260040160405180910390fd5b6000613b0460ff841685615919565b6001600160601b03169050836001600160601b031660156000828254613b2a9190615b06565b925050819055508060166000828254613b439190615b06565b90915550506001600160a01b03851660009081526014602052604081208054839290613b70908490615b06565b909155506117ad90508530838561423a565b6000828152601260205260408082208290556018805463ffffffff908116808552928420859055815492939192613bb99116615e0a565b91906101000a81548163ffffffff021916908363ffffffff16021790555092915050565b6000546001600160a01b03163314613c0857604051632e6c18c960e11b815260040160405180910390fd5b565b600081600003613c2d5760405163b0ce759160e01b815260040160405180910390fd5b506000818152601260205260409020546010548110613c5f5760405163b0ce759160e01b815260040160405180910390fd5b600260ff1660108281548110613c7757613c77615bb1565b6000918252602090912060029091020160010154600160f81b900460ff1614613cb35760405163b0ce759160e01b815260040160405180910390fd5b919050565b826001600160a01b0316613ccb82611f7f565b6001600160a01b031614613cf257604051630a8c428360e21b815260040160405180910390fd5b600154604051632e81a0dd60e11b81526001600160a01b0385811660048301526000921690635d0341ba9060240160c060405180830381865afa158015613d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d619190615a59565b90506040518060600160405280846001600160a01b03168152602001826060015161ffff16600014613db1576060830151613d9e90610e10615e2d565b613dac9061ffff1642615e4e565b613db9565b65ffffffffffff5b65ffffffffffff908116825260209384015163ffffffff908116928501929092526000948552600d845260409485902083518154958501519490960151909216600160d01b0263ffffffff60d01b1993909116600160a01b026001600160d01b03199094166001600160a01b039095169490941792909217169190911790555050565b60006001600160a01b038216613e65576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b03821660009081526009602052604090205460ff1615613ea257506001600160a01b03166000908152600b602052604090205490565b6001600160a01b0382166000908152600a6020526040902054610f8e9061327f565b60015460405163060648d160e11b81526001600160a01b03838116600483015290911690630c0c91a290602401602060405180830381865afa158015613f0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f329190615b50565b15612176576040516335543b4960e21b815260040160405180910390fd5b60006001600160601b03821115613f7a57604051631a93c68960e11b815260040160405180910390fd5b5090565b6001600160a01b038616600090815260116020526040812080548290613faf90899089908990899089908f906149c7565b60019081018054845492830185556000948552602090942063ffffffff600160c01b909504851692019190915554600160a01b900490911698975050505050505050565b60405182906000906001600160a01b03861690600080516020615fa0833981519152908390a460405181906001600160a01b03851690600090600080516020615fa0833981519152908290a4505050565b6001546001600160a01b031661406d576040516302c2726760e61b815260040160405180910390fd5b6001600160a01b038316614094576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b0382166140bb576040516366385fa360e01b815260040160405180910390fd5b826001600160a01b0316846001600160a01b0316141580156140e457506140e2838561319c565b155b80156140f757506140f58382614bda565b155b1561411557604051639b144c5760e01b815260040160405180910390fd5b6000818152600d6020526040902080546001600160f01b031916905561413c838383614cd6565b80826001600160a01b0316846001600160a01b0316600080516020615fa083398151915260405160405180910390a450505050565b6000856001600160601b0316856001600160601b0316106141a55760405163c64200e960e01b815260040160405180910390fd5b6001600160a01b038716600090815260116020526040812080549091906141d7908990899088908a9089908f906149c7565b60018181015484549182018555600085815260208120600160c01b90920463ffffffff16919092015590915061420d888a615984565b905061421c8a82896001614763565b5060010154600160a01b900463ffffffff1698975050505050505050565b6001600160a01b038416614261576040516366385fa360e01b815260040160405180910390fd5b6001600160a01b038316614288576040516366385fa360e01b815260040160405180910390fd5b816000036142a957604051635e85ae7360e01b815260040160405180910390fd5b6001600160a01b03841630148015906142cb57506001600160a01b0383163014155b156142e95760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b03841660009081526009602052604090205460ff1615614345576001600160a01b03831660009081526009602052604090205460ff1661433a57614335848484614829565b61437c565b614335848484614f0c565b6001600160a01b03831660009081526009602052604090205460ff161561437157614335848484614fa7565b61437c848484614fe8565b8015612e3a57306001600160a01b0385160361442c576040516323b872dd60e01b81526001600160a01b037f000000000000000000000000dba7b24257fc6e397cb7368b4bc922e944072f1b16906323b872dd906143e39060009087908790600401615c22565b6020604051808303816000875af1158015614402573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144269190615b50565b50612e3a565b306001600160a01b03841603612e3a576040516323b872dd60e01b81526001600160a01b037f000000000000000000000000dba7b24257fc6e397cb7368b4bc922e944072f1b16906323b872dd9061448d9087906000908790600401615c22565b6020604051808303816000875af11580156144ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ad9190615b50565b805460009081906144f3906001600160601b03600160601b820481169116615984565b83549091506145119087908390600160f01b900460ff166001613af5565b611909868686866146ec565b6001600160a01b0383163b156117ad57604051630a85bd0160e11b81526001600160a01b0384169063150b7a029061455f908890889087908790600401615e6f565b602060405180830381865afa925050508015614598575060408051601f3d908101601f1916820190925261459591810190615ea2565b60015b614601576145a4615ebf565b806308c379a0036145e657506145b8615edb565b806145c357506145e8565b8060405162461bcd60e51b81526004016145dd919061533b565b60405180910390fd5b505b60405163a89c6c0d60e01b815260040160405180910390fd5b6001600160e01b03198116630a85bd0160e11b146146325760405163fa34343f60e01b815260040160405180910390fd5b505050505050565b6001600160a01b03811615612176576001600160a01b038116600081815260086020526040808220805460ff19169055517ffa3e816eec15bc5031b3b3d818bcdf26a7322c33bb66a4eaebd63a92b89ada829190a250565b600080600061469f615029565b90925090506146ae8183615b3c565b9250505090565b426146c362278d0083615b1d565b6146cd9084615b99565b111561131157604051633fb34cfb60e11b815260040160405180910390fd5b6001810180546001600160f81b0316600160f81b179081905562ffffff600160e01b9091041661471c85826148cf565b505060009182526012602052604082208290556013805460018101825592527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0909091015550565b600061477260ff841685615919565b6001600160601b03169050836001600160601b0316601560008282546147989190615b99565b9250508190555080601660008282546147b19190615b99565b90915550506001600160a01b038516600090815260146020526040812080548392906147de908490615b99565b909155506117ad90503086838561423a565b6001600160a01b03811660009081526008602052604090205460ff1661217657604051634014f1a560e01b815260040160405180910390fd5b6000614833614692565b61483d9083615b1d565b6001600160a01b0385166000908152600b602052604081208054929350849290919061486a908490615b06565b90915550506001600160a01b0384166000908152600a602052604081208054839290614897908490615b06565b90915550506001600160a01b0383166000908152600a6020526040812080548392906148c4908490615b99565b909155505050505050565b6001600160a01b038216600090815260116020526040902080546148f4836001615f65565b62ffffff168162ffffff161061499b57600082614912600184615f83565b62ffffff168154811061492757614927615bb1565b90600052602060002001549050836010828154811061494857614948615bb1565b9060005260206000209060020201600101601c6101000a81548162ffffff021916908362ffffff16021790555080838562ffffff168154811061498d5761498d615bb1565b600091825260209091200155505b818054806149ab576149ab615bc7565b6001900381819060005260206000200160009055905550505050565b6013546000908015614a4c5760136149e0600183615b06565b815481106149f0576149f0615bb1565b906000526020600020015490506013805480614a0e57614a0e615bc7565b6001900381819060005260206000200160009055905560108181548110614a3757614a37615bb1565b90600052602060002090600202019150614a86565b505060108054600181018255600091909152600281027f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67201905b81546001600160601b038a81166001600160c01b031990921691909117600160601b918a16919091021766ffffffffffffff60c01b1916600160c01b65ffffffffffff89160260ff60f01b191617600160f01b60ff88160217825584614aed576001614af0565b60025b82546001600160f81b03908116600160f81b60ff93909316929092029190911783556001830180546001600160a01b031981166001600160a01b0388169081178355601880546001600160c01b031990931690911763ffffffff928316600160a01b021766ffffffffffffff60c01b1916600160c01b8684160262ffffff60e01b191617600160e01b62ffffff89160217909316600160f91b1790915581548116600090815260126020526040812084905582549091614bb09116615e0a565b91906101000a81548163ffffffff021916908363ffffffff16021790555050979650505050505050565b6000818152600d6020526040812060015482906001600160a01b0316635d0341ba614c0486611f7f565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160c060405180830381865afa158015614c48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c6c9190615a59565b82549091506001600160a01b038681169116141580614c9a57508154600160a01b900465ffffffffffff1642115b80614cbb57508154602082015163ffffffff908116600160d01b9092041614155b15614ccb57600092505050610f8e565b506001949350505050565b600080614ce383866139c0565b80549193509150600160601b90046001600160601b031615614d475760405162461bcd60e51b815260206004820152601860248201527f42726f6b656e2c206e6f6e2d7472616e7366657261626c65000000000000000060448201526064016145dd565b6001810180546001600160a01b0319166001600160a01b03861617905580546001600160601b03811690600160f01b900460ff16614d888783836000613af5565b614d958683836000614763565b6001600160a01b037f000000000000000000000000dba7b24257fc6e397cb7368b4bc922e944072f1b166323b872dd8888614dd360ff861687615919565b6040518463ffffffff1660e01b8152600401614df193929190615b6d565b6020604051808303816000875af1158015614e10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e349190615b50565b506001830154614e51908890600160e01b900462ffffff166148cf565b6001600160a01b03808716600090815260116020908152604080832080546001808a01805462ffffff909316600160e01b0262ffffff60e01b19909316929092179091558154808201835591855292909320909201879055549051633d77147b60e21b815291169063f5dc51ec90614ed1908a908a908790600401615b6d565b600060405180830381600087803b158015614eeb57600080fd5b505af1158015614eff573d6000803e3d6000fd5b5050505050505050505050565b6000614f16614692565b614f209083615b1d565b6001600160a01b0385166000908152600b6020526040812080549293508492909190614f4d908490615b06565b90915550506001600160a01b0384166000908152600a602052604081208054839290614f7a908490615b06565b90915550506001600160a01b0383166000908152600b602052604081208054849290614897908490615b99565b6000614fb1614692565b614fbb9083615b1d565b6001600160a01b0385166000908152600a6020526040812080549293508392909190614f7a908490615b06565b6000614ff2614692565b614ffc9083615b1d565b6001600160a01b0385166000908152600a6020526040812080549293508392909190614897908490615b06565b600f54600e5460009182916d05ea9ce981a106cf85ce0000000090835b8181101561518b5783600a6000600e848154811061506657615066615bb1565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806150d1575082600b6000600e84815481106150aa576150aa615bb1565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156150f3575050600f54946d05ea9ce981a106cf85ce00000000945092505050565b600a6000600e838154811061510a5761510a615bb1565b60009182526020808320909101546001600160a01b031683528201929092526040019020546151399085615b06565b9350600b6000600e838154811061515257615152615bb1565b60009182526020808320909101546001600160a01b031683528201929092526040019020546151819084615b06565b9250600101615046565b506d05ea9ce981a106cf85ce00000000600f546151a89190615b3c565b8310156151cb575050600f54936d05ea9ce981a106cf85ce000000009350915050565b5090939092509050565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081019190915290565b6001600160e01b03198116811461217657600080fd5b60006020828403121561525157600080fd5b813561321381615229565b6001600160a01b038116811461217657600080fd5b80356001600160601b0381168114613cb357600080fd5b60008060006060848603121561529d57600080fd5b83356152a88161525c565b9250602084013591506152bd60408501615271565b90509250925092565b6000602082840312156152d857600080fd5b81356132138161525c565b60005b838110156152fe5781810151838201526020016152e6565b83811115612e3a5750506000910152565b600081518084526153278160208601602086016152e3565b601f01601f19169290920160200192915050565b602081526000613213602083018461530f565b60006020828403121561536057600080fd5b5035919050565b6000806040838503121561537a57600080fd5b82356153858161525c565b946020939093013593505050565b600080604083850312156153a657600080fd5b823591506153b660208401615271565b90509250929050565b6000806000606084860312156153d457600080fd5b6153dd84615271565b95602085013595506040909401359392505050565b6000806040838503121561540557600080fd5b82356154108161525c565b915060208301356154208161525c565b809150509250929050565b60008060006060848603121561544057600080fd5b833561544b8161525c565b9250602084013561545b8161525c565b929592945050506040919091013590565b6000806040838503121561547f57600080fd5b50508035926020909101359150565b803560ff81168114613cb357600080fd5b65ffffffffffff8116811461217657600080fd5b801515811461217657600080fd5b600080600080600080600060e0888a0312156154dc57600080fd5b87356154e78161525c565b96506154f560208901615271565b95506155036040890161548e565b945060608801356155138161549f565b935061552160808901615271565b925061552f60a08901615271565b915060c088013561553f816154b3565b8091505092959891949750929550565b60008060006060848603121561556457600080fd5b83356153dd8161525c565b600080600080600060a0868803121561558757600080fd5b6155908661548e565b945061559e6020870161548e565b93506155ac6040870161548e565b92506155ba6060870161548e565b915060808601356155ca816154b3565b809150509295509295909350565b6000806000606084860312156155ed57600080fd5b83356155f88161525c565b925061560660208501615271565b91506152bd6040850161548e565b6000806040838503121561562757600080fd5b8235915060208301356154208161525c565b81516001600160601b031681526101408101602083015161566560208401826001600160601b03169052565b50604083015161567f604084018265ffffffffffff169052565b506060830151615694606084018260ff169052565b5060808301516156a9608084018260ff169052565b5060a08301516156c460a08401826001600160a01b03169052565b5060c08301516156dc60c084018263ffffffff169052565b5060e08301516156f460e084018263ffffffff169052565b506101008381015162ffffff16908301526101208084015160ff811682850152612bea565b6000806000806080858703121561572f57600080fd5b61573885615271565b966020860135965060408601359560600135945092505050565b6000806040838503121561576557600080fd5b82356157708161525c565b91506020830135615420816154b3565b6000806000806080858703121561579657600080fd5b84356157a18161525c565b9350602085013592506157b660408601615271565b915060608501356157c6816154b3565b939692955090935050565b6000806000806000608086880312156157e957600080fd5b85356157f48161525c565b945060208601356158048161525c565b935060408601359250606086013567ffffffffffffffff8082111561582857600080fd5b818801915088601f83011261583c57600080fd5b81358181111561584b57600080fd5b89602082850101111561585d57600080fd5b9699959850939650602001949392505050565b6000806040838503121561588357600080fd5b823591506153b66020840161548e565b6000806000606084860312156158a857600080fd5b83356158b38161525c565b92506020840135915060408401356158ca816154b3565b809150509250925092565b6000806000606084860312156158ea57600080fd5b833592506020840135915060408401356158ca816154b3565b634e487b7160e01b600052601160045260246000fd5b60006001600160601b038083168185168183048111821515161561593f5761593f615903565b02949350505050565b634e487b7160e01b600052601260045260246000fd5b60006001600160601b038084168061597857615978615948565b92169190910492915050565b60006001600160601b03838116908316818110156159a4576159a4615903565b039392505050565b60006001600160601b038083168185168083038211156159ce576159ce615903565b01949350505050565b6000602082840312156159e957600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715615a2c57615a2c6159f0565b6040525050565b805163ffffffff81168114613cb357600080fd5b805161ffff81168114613cb357600080fd5b600060c08284031215615a6b57600080fd5b60405160c0810167ffffffffffffffff8282108183111715615a8f57615a8f6159f0565b81604052845191508082168214615aa557600080fd5b508152615ab460208401615a33565b6020820152615ac560408401615a33565b6040820152615ad660608401615a47565b6060820152615ae760808401615a47565b608082015260a0830151615afa8161549f565b60a08201529392505050565b600082821015615b1857615b18615903565b500390565b6000816000190483118215151615615b3757615b37615903565b500290565b600082615b4b57615b4b615948565b500490565b600060208284031215615b6257600080fd5b8151613213816154b3565b6001600160a01b0393841681529190921660208201526001600160601b03909116604082015260600190565b60008219821115615bac57615bac615903565b500190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600060ff831680615bf057615bf0615948565b8060ff84160691505092915050565b600060ff821660ff841680821015615c1957615c19615903565b90039392505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060208284031215615c5857600080fd5b815167ffffffffffffffff80821115615c7057600080fd5b818401915084601f830112615c8457600080fd5b815181811115615c9657615c966159f0565b6040519150615caf601f8201601f191660200183615a06565b808252856020828501011115615cc457600080fd5b615cd58160208401602086016152e3565b50949350505050565b600181815b80851115615d19578160001904821115615cff57615cff615903565b80851615615d0c57918102915b93841c9390800290615ce3565b509250929050565b600082615d3057506001610f8e565b81615d3d57506000610f8e565b8160018114615d535760028114615d5d57615d79565b6001915050610f8e565b60ff841115615d6e57615d6e615903565b50506001821b610f8e565b5060208310610133831016604e8410600b8410161715615d9c575081810a610f8e565b615da68383615cde565b8060001904821115615dba57615dba615903565b029392505050565b60006132138383615d21565b634e487b7160e01b600052600160045260246000fd5b60006001600160601b0380841680615dfe57615dfe615948565b92169190910692915050565b600063ffffffff808316818103615e2357615e23615903565b6001019392505050565b600061ffff8083168185168183048111821515161561593f5761593f615903565b600065ffffffffffff8083168185168083038211156159ce576159ce615903565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906121349083018461530f565b600060208284031215615eb457600080fd5b815161321381615229565b600060033d1115615ed85760046000803e5060005160e01c5b90565b600060443d1015615ee95790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715615f1957505050505090565b8285019150815181811115615f315750505050505090565b843d8701016020828501011115615f4b5750505050505090565b615f5a60208286010187615a06565b509095945050505050565b600062ffffff8083168185168083038211156159ce576159ce615903565b600062ffffff838116908316818110156159a4576159a461590356feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220ab5707e5fb50ef514258469c76028b72d8676abd2c1c4b8579ea8bd92c526a4764736f6c634300080d0033
Verified Source Code Partial Match
Compiler: v0.8.13+commit.abaa5c0e
EVM: london
Optimization: Yes (200 runs)
nftEverRise.sol 1702 lines
// Copyright (c) 2022 EverRise Pte Ltd. All rights reserved.
// EverRise licenses this file to you under the MIT license.
/*
EverRise Staking NFTs are containers of Vote Escrowed (ve)EverRise
weighted governance tokens. veRISE generates rewards from the
auto-buyback with a market driven yield curve, based on the transaction
volume of EverRise trades and veEverRise sales.
On sales of nftEverRise Staking NFTs a 10% royalty fee is collected:
* 6% for token auto-buyback from the market, with bought back tokens
directly distributed as ve-staking rewards
* 4% for Business Development (Development, Sustainability and Marketing)
________ _______ __
/ | / \ / |
$$$$$$$$/__ __ ______ ______ $$$$$$$ |$$/ _______ ______ v3.14159265
$$ |__ / \ / |/ \ / \ $$ |__$$ |/ | / | / \
$$ | $$ \ /$$//$$$$$$ |/$$$$$$ |$$ $$< $$ |/$$$$$$$/ /$$$$$$ |
_______ _______ _______ $$$$$/ $$ /$$/ $$ $$ |$$ | $$/ $$$$$$$ |$$ |$$ \ $$ $$ |
| | | ___|_ _| $$ |_____ $$ $$/ $$$$$$$$/ $$ | $$ | $$ |$$ | $$$$$$ |$$$$$$$$/
| | ___| | | $$ | $$$/ $$ |$$ | $$ | $$ |$$ |/ $$/ $$ |
|__|____|___| |___| $$$$$$$$/ $/ $$$$$$$/ $$/ $$/ $$/ $$/ $$$$$$$/ $$$$$$$/ Magnum opus
Learn more about EverRise and the EverRise Ecosystem of dApps and
how our utilities and partners can help protect your investors
and help your project grow: https://everrise.com
*/
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;
error NotZeroAddress(); // 0x66385fa3
error CallerNotApproved(); // 0x4014f1a5
error InvalidAddress(); // 0xe6c4247b
error CallerNotOwner();
error WalletLocked(); // 0xd550ed24
error DoesNotExist(); // 0xb0ce7591
error AmountMustBeGreaterThanZero(); // 0x5e85ae73
error AmountOutOfRange(); // 0xc64200e9
error StakeStillLocked(); // 0x7f6699f6
error NotStakerAddress(); // 0x2a310a0c
error AmountLargerThanAvailable(); // 0xbb296109
error StakeCanOnlyBeExtended(); // 0x73f7040a
error ArrayLengthsMismatch(); // 0x3b800a46
error NotSetup(); // 0xb09c99c0
error NotAllowedToCreateRewards(); // 0xfdc42f29
error NotAllowedToDeliverRewards(); // 0x69a3e246
error ERC721ReceiverReject(); // 0xfa34343f
error ERC721ReceiverNotImplemented(); // 0xa89c6c0d
error NotEnoughToCoverStakeFee(); // 0x627554ed
error AmountLargerThanAllowance(); // 0x9b144c57
error AchievementNotClaimed(); // 0x3834dd9c
error AchievementAlreadyClaimed(); // 0x2d5345f4
error AmountMustBeAnInteger(); // 0x743aec61
error BrokenStatusesDiffer(); // 0x097b027d
error AchievementClaimStatusesDiffer(); // 0x6524e8b0
error UnlockedStakesMustBeSametimePeriod();// 0x42e227b0
error CannotMergeLockedAndUnlockedStakes();// 0x9efeef2c
error StakeUnlocked(); // 0x6717a455
error NoRewardsToClaim(); // 0x73380d99
error NotTransferrable(); // 0x54ee5151
error Overflow(); // 0x35278d12
error MergeNotEnabled(); // 0x
// File: EverRise-v3/Interfaces/IERC173-Ownable.sol
interface IOwnable {
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
function owner() external view returns (address);
function transferOwnership(address newOwner) external;
}
// File: EverRise-v3/Abstract/Context.sol
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return payable(msg.sender);
}
}
// File: EverRise-v3/Abstract/ERC173-Ownable.sol
contract Ownable is IOwnable, Context {
address public owner;
function _onlyOwner() private view {
if (owner != _msgSender()) revert CallerNotOwner();
}
modifier onlyOwner() {
_onlyOwner();
_;
}
constructor() {
address msgSender = _msgSender();
owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
// Allow contract ownership and access to contract onlyOwner functions
// to be locked using EverOwn with control gated by community vote.
//
// EverRise ($RISE) stakers become voting members of the
// decentralized autonomous organization (DAO) that controls access
// to the token contract via the EverRise Ecosystem dApp EverOwn
function transferOwnership(address newOwner) external virtual onlyOwner {
if (newOwner == address(0)) revert NotZeroAddress();
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
}
struct ApprovalChecks {
// Prevent permits being reused (IERC2612)
uint64 nonce;
// Allow revoke all spenders/operators approvals in single txn
uint32 nftCheck;
uint32 tokenCheck;
// Allow auto timeout on approvals
uint16 autoRevokeNftHours;
uint16 autoRevokeTokenHours;
// Allow full wallet locking of all transfers
uint48 unlockTimestamp;
}
struct Allowance {
uint128 tokenAmount;
uint32 nftCheck;
uint32 tokenCheck;
uint48 timestamp;
uint8 nftApproval;
uint8 tokenApproval;
}
interface IEverRiseWallet {
event RevokeAllApprovals(address indexed account, bool tokens, bool nfts);
event SetApprovalAutoTimeout(address indexed account, uint16 tokensHrs, uint16 nftsHrs);
event LockWallet(address indexed account, address altAccount, uint256 length);
event LockWalletExtend(address indexed account, uint256 length);
}
// File: EverRise-v3/Interfaces/IERC20-Token.sol
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
function increaseAllowance(address spender, uint256 addedValue) external returns (bool);
function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool);
function transferFromWithPermit(address sender, address recipient, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external returns (bool);
}
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
// File: EverRise-v3/Interfaces/IEverRise.sol
interface IEverRise is IERC20Metadata {
function totalBuyVolume() external view returns (uint256);
function totalSellVolume() external view returns (uint256);
function holders() external view returns (uint256);
function uniswapV2Pair() external view returns (address);
function transferStake(address fromAddress, address toAddress, uint96 amountToTransfer) external;
function isWalletLocked(address fromAddress) external view returns (bool);
function setApprovalForAll(address fromAddress, address operator, bool approved) external;
function isApprovedForAll(address account, address operator) external view returns (bool);
function isExcludedFromFee(address account) external view returns (bool);
function approvals(address operator) external view returns (ApprovalChecks memory);
}
// File: EverRise-v3/Interfaces/IERC721-Nft.sol
interface IERC721 /* is ERC165 */ {
event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
function balanceOf(address _owner) external view returns (uint256);
function ownerOf(uint256 _tokenId) external view returns (address);
function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable;
function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
function approve(address _approved, uint256 _tokenId) external payable;
function setApprovalForAll(address _operator, bool _approved) external;
function getApproved(uint256 _tokenId) external view returns (address);
function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}
// File: EverRise-v3/Interfaces/InftEverRise.sol
struct StakingDetails {
uint96 initialTokenAmount; // Max 79 Bn tokens
uint96 withdrawnAmount; // Max 79 Bn tokens
uint48 depositTime; // 8 M years
uint8 numOfMonths; // Max 256 month period
uint8 achievementClaimed;
// 256 bits, 20000 gwei gas
address stakerAddress; // 160 bits (96 bits remaining)
uint32 nftId; // Max 4 Bn nfts issued
uint32 lookupIndex; // Max 4 Bn active stakes
uint24 stakerIndex; // Max 16 M active stakes per wallet
uint8 isActive;
// 256 bits, 20000 gwei gas
} // Total 768 bits, 40000 gwei gas
interface InftEverRise is IERC721 {
function voteEscrowedBalance(address account) external view returns (uint256);
function unclaimedRewardsBalance(address account) external view returns (uint256);
function totalAmountEscrowed() external view returns (uint256);
function totalAmountVoteEscrowed() external view returns (uint256);
function totalRewardsDistributed() external view returns (uint256);
function totalRewardsUnclaimed() external view returns (uint256);
function createRewards(uint256 tAmount) external;
function getNftData(uint256 id) external view returns (StakingDetails memory);
function enterStaking(address fromAddress, uint96 amount, uint8 numOfMonths) external returns (uint32 nftId);
function leaveStaking(address fromAddress, uint256 id, bool overrideNotClaimed) external returns (uint96 amount);
function earlyWithdraw(address fromAddress, uint256 id, uint96 amount) external returns (uint32 newNftId, uint96 penaltyAmount);
function withdraw(address fromAddress, uint256 id, uint96 amount, bool overrideNotClaimed) external returns (uint32 newNftId);
function bridgeStakeNftOut(address fromAddress, uint256 id) external returns (uint96 amount);
function bridgeOrAirdropStakeNftIn(address toAddress, uint96 depositAmount, uint8 numOfMonths, uint48 depositTime, uint96 withdrawnAmount, uint96 rewards, bool achievementClaimed) external returns (uint32 nftId);
function addStaker(address staker, uint256 nftId) external;
function removeStaker(address staker, uint256 nftId) external;
function reissueStakeNft(address staker, uint256 oldNftId, uint256 newNftId) external;
function increaseStake(address staker, uint256 nftId, uint96 amount) external returns (uint32 newNftId, uint96 original, uint8 numOfMonths);
function splitStake(uint256 id, uint96 amount) external payable returns (uint32 newNftId0, uint32 newNftId1);
function claimAchievement(address staker, uint256 nftId) external returns (uint32 newNftId);
function stakeCreateCost() external view returns (uint256);
function approve(address owner, address _operator, uint256 nftId) external;
}
// File: EverRise-v3/Abstract/virtualToken.sol
abstract contract virtualToken is Ownable, IERC20, IERC20Metadata {
InftEverRise public veEverRise;
uint8 public constant decimals = 18;
string public name;
string public symbol;
constructor(string memory _name, string memory _symbol ) {
name = _name;
symbol = _symbol;
veEverRise = InftEverRise(owner);
}
function transferFrom(address sender, address recipient, uint256 amount)
external returns (bool) {
if (_msgSender() != owner) {
notTransferrable();
}
emit Transfer(sender, recipient, amount);
return true;
}
function transfer(address, uint256) pure external returns (bool) {
notTransferrable();
}
function allowance(address, address) pure external returns (uint256) {
return 0;
}
function approve(address, uint256) pure external returns (bool) {
notTransferrable();
}
function increaseAllowance(address, uint256) pure external returns (bool) {
notTransferrable();
}
function decreaseAllowance(address, uint256) pure external returns (bool) {
notTransferrable();
}
function transferFromWithPermit(address, address, uint256, uint256, uint8, bytes32, bytes32) pure external returns (bool) {
notTransferrable();
}
function notTransferrable() pure private {
revert NotTransferrable();
}
}
// File: EverRise-v3/claimRISE.sol
// Copyright (c) 2022 EverRise Pte Ltd. All rights reserved.
// EverRise licenses this file to you under the MIT license.
/*
Virtual token that allows unclaimed rewards from EverRise Staking NFTs
and its Vote Escrowed (ve) EverRise to display in wallet balances.
________ _______ __
/ | / \ / |
$$$$$$$$/__ __ ______ ______ $$$$$$$ |$$/ _______ ______ v3.14159265
$$ |__ / \ / |/ \ / \ $$ |__$$ |/ | / | / \
______ _____ $$ | $$ \ /$$//$$$$$$ |/$$$$$$ |$$ $$< $$ |/$$$$$$$/ /$$$$$$ |
_________ /_____ ___(_)______ ___ $$$$$/ $$ /$$/ $$ $$ |$$ | $$/ $$$$$$$ |$$ |$$ \ $$ $$ |
_ ___/_ /_ __ `/_ /__ __ `__ \$$ |_____ $$ $$/ $$$$$$$$/ $$ | $$ | $$ |$$ | $$$$$$ |$$$$$$$$/
/ /__ _ / / /_/ /_ / _ / / / / /$$ | $$$/ $$ |$$ | $$ | $$ |$$ |/ $$/ $$ |
\___/ /_/ \__,_/ /_/ /_/ /_/ /_/ $$$$$$$$/ $/ $$$$$$$/ $$/ $$/ $$/ $$/ $$$$$$$/ $$$$$$$/
Learn more about EverRise and the EverRise Ecosystem of dApps and
how our utilities and partners can help protect your investors
and help your project grow: https://www.everrise.com
*/
contract claimRise is virtualToken("EverRise Rewards", "claimRISE") {
function totalSupply() override external view returns (uint256) {
return veEverRise.totalRewardsUnclaimed();
}
function balanceOf(address account) override external view returns (uint256) {
if (account == owner) return 0;
return veEverRise.unclaimedRewardsBalance(account);
}
}
// File: EverRise-v3/veRISE.sol
// Copyright (c) 2022 EverRise Pte Ltd. All rights reserved.
// EverRise licenses this file to you under the MIT license.
/*
Virtual token that allows the Vote Escrowed (ve) EverRise weigthed
governance tokens from EverRise Staking NFTs to display in
wallet balances.
________ _______ __
/ | / \ / |
$$$$$$$$/__ __ ______ ______ $$$$$$$ |$$/ _______ ______ v3.14159265
$$ |__ / \ / |/ \ / \ $$ |__$$ |/ | / | / \
$$ | $$ \ /$$//$$$$$$ |/$$$$$$ |$$ $$< $$ |/$$$$$$$/ /$$$$$$ |
__ _____ $$$$$/ $$ /$$/ $$ $$ |$$ | $$/ $$$$$$$ |$$ |$$ \ $$ $$ |
\ \ / / _ \ $$ |_____ $$ $$/ $$$$$$$$/ $$ | $$ | $$ |$$ | $$$$$$ |$$$$$$$$/
\ V / __/ $$ | $$$/ $$ |$$ | $$ | $$ |$$ |/ $$/ $$ |
\_/ \___| $$$$$$$$/ $/ $$$$$$$/ $$/ $$/ $$/ $$/ $$$$$$$/ $$$$$$$/
Learn more about EverRise and the EverRise Ecosystem of dApps and
how our utilities and partners can help protect your investors
and help your project grow: https://www.everrise.com
*/
contract veRise is virtualToken("Vote-escrowed EverRise", "veRISE") {
function totalSupply() override external view returns (uint256) {
return veEverRise.totalAmountVoteEscrowed();
}
function balanceOf(address account) override external view returns (uint256) {
if (account == owner) return 0;
return veEverRise.voteEscrowedBalance(account);
}
}
// File: EverRise-v3/Interfaces/IEverRoyaltySplitter.sol
interface IEverRoyaltySplitter {
event RoyaltiesSplit(uint256 value);
event SplitUpdated(uint256 previous, uint256 current);
event UniswapV2RouterSet(address indexed previous, address indexed current);
event EverRiseEcosystemSet(address indexed previous, address indexed current);
event EverRiseTokenSet(address indexed previous, address indexed current);
event StableCoinSet(address indexed previous, address indexed current);
function distribute() external;
}
/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.
interface IERC721TokenReceiver {
function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external view returns(bytes4);
}
interface IERC721Metadata /* is ERC721 */ {
function name() external view returns (string memory _name);
function symbol() external view returns (string memory _symbol);
function tokenURI(uint256 _tokenId) external view returns (string memory);
}
interface IERC721Enumerable /* is ERC721 */ {
function totalSupply() external view returns (uint256);
function tokenByIndex(uint256 _index) external view returns (uint256);
function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
}
// File: EverRise-v3/Interfaces/IEverRiseRenderer.sol
interface IOpenSeaCollectible {
function contractURI() external view returns (string memory);
}
interface IEverRiseRenderer is IOpenSeaCollectible {
event SetEverRiseNftStakes(address indexed addressStakes);
event SetEverRiseRendererGlyph(address indexed addressGlyphs);
function tokenURI(uint256 _tokenId) external view returns (string memory);
function everRiseNftStakes() external view returns (InftEverRise);
function setEverRiseNftStakes(address contractAddress) external;
}
// File: EverRise-v3/Interfaces/IERC165-SupportsInterface.sol
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: EverRise-v3/Abstract/ERC165-SupportsInterface.sol
abstract contract ERC165 is IERC165 {
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: EverRise-v3/Interfaces/IERC2981-Royalty.sol
interface IERC2981 is IERC165 {
function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (
address receiver,
uint256 royaltyAmount
);
}
// File: EverRise-v3/nftEverRise.sol
// Copyright (c) 2022 EverRise Pte Ltd. All rights reserved.
// EverRise licenses this file to you under the MIT license.
/*
EverRise Staking NFTs are Vote Escrowed (ve) EverRise weigthed governance tokens
which generate rewards with a market driven yield curve, based of the
transaction volume of EverRise trades and veEverRise sales.
On sales of veEverRise Staking NFTs a 10% royalty fee is collected
* 6% for token Buyback from the market,
with bought back tokens directly distributed as ve-staking rewards
* 4% for Business Development (Development, Sustainability and Marketing)
________ _______ __
/ | / \ / |
$$$$$$$$/__ __ ______ ______ $$$$$$$ |$$/ _______ ______ v3.14159265
$$ |__ / \ / |/ \ / \ $$ |__$$ |/ | / | / \
$$ | $$ \ /$$//$$$$$$ |/$$$$$$ |$$ $$< $$ |/$$$$$$$/ /$$$$$$ |
_______ _______ _______ $$$$$/ $$ /$$/ $$ $$ |$$ | $$/ $$$$$$$ |$$ |$$ \ $$ $$ |
| | | ___|_ _| $$ |_____ $$ $$/ $$$$$$$$/ $$ | $$ | $$ |$$ | $$$$$$ |$$$$$$$$/
| | ___| | | $$ | $$$/ $$ |$$ | $$ | $$ |$$ |/ $$/ $$ |
|__|____|___| |___| $$$$$$$$/ $/ $$$$$$$/ $$/ $$/ $$/ $$/ $$$$$$$/ $$$$$$$/
Learn more about EverRise and the EverRise Ecosystem of dApps and
how our utilities and partners can help protect your investors
and help your project grow: https://www.everrise.com
*/
contract EverRiseTokenOwned is Ownable {
IEverRise public everRiseToken;
event EverRiseTokenSet(address indexed tokenAddress);
function _onlyEverRiseToken(address senderAddress) private view {
if (address(everRiseToken) == address(0)) revert NotSetup();
if (address(everRiseToken) != senderAddress) revert CallerNotApproved();
}
modifier onlyEverRiseToken() {
_onlyEverRiseToken(_msgSender());
_;
}
}
struct IndividualAllowance {
address operator;
uint48 timestamp;
uint32 nftCheck;
}
abstract contract nftEverRiseConfigurable is EverRiseTokenOwned, InftEverRise, ERC165, IERC2981, IERC721Metadata, IOpenSeaCollectible {
event AddRewardCreator(address indexed _address);
event RemoveRewardCreator(address indexed _address);
event SetAchievementNfts(address indexed _address);
event RoyaltyFeeUpdated(uint256 newValue);
event RoyaltyAddressUpdated(address indexed contractAddress);
event RendererAddressUpdated(address indexed contractAddress);
event StakeCreateCostUpdated(uint256 newValue);
event StakingParametersSet(uint256 withdrawPct, uint256 firstHalfPenality, uint256 secondHalfPenality, uint256 maxStakeMonths, bool mergeEnabled);
IEverRiseRenderer public renderer;
IEverRoyaltySplitter public royaltySplitter;
uint256 public nftRoyaltySplit = 10;
address public currentAchievementNfts;
uint8 public maxEarlyWithdrawalPercent = 60;
uint8 public firstHalfPenality = 25;
uint8 public secondHalfPenality = 10;
uint8 public maxStakeMonths = 36;
uint256 public stakeCreateCost = 1 * 10**18 / (10**2);
uint256 public mergeEnabled = _FALSE;
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
uint256 constant _FALSE = 1;
uint256 constant _TRUE = 2;
mapping (address => bool) internal _canCreateRewards;
function setEverRiseToken(address tokenAddress) external onlyOwner {
if (tokenAddress == address(0)) revert NotZeroAddress();
_removeAddressToCreate(address(everRiseToken));
addAddressToCreate(tokenAddress);
everRiseToken = IEverRise(tokenAddress);
emit EverRiseTokenSet(tokenAddress);
}
function setStakeCreateCost(uint256 _stakeCreateCost, uint256 numOfDecimals)
external onlyOwner
{
// Catch typos, if decimals are pre-added
if (_stakeCreateCost > 1_000) revert AmountOutOfRange();
stakeCreateCost = _stakeCreateCost * (10**18) / (10**numOfDecimals);
emit StakeCreateCostUpdated(_stakeCreateCost);
}
function setAchievementNfts(address contractAddress) external onlyOwner() {
if (contractAddress == address(0)) revert NotZeroAddress();
currentAchievementNfts = contractAddress;
emit SetAchievementNfts(contractAddress);
}
function addAddressToCreate(address account) public onlyOwner {
if (account == address(0)) revert NotZeroAddress();
_canCreateRewards[account] = true;
emit AddRewardCreator(account);
}
function removeAddressToCreate(address account) external onlyOwner {
if (account == address(0)) revert NotZeroAddress();
_removeAddressToCreate(account);
}
function _removeAddressToCreate(address account) private {
if (account != address(0)){
_canCreateRewards[account] = false;
emit RemoveRewardCreator(account);
}
}
function setNftRoyaltyFeePercent(uint256 royaltySplitRate) external onlyOwner {
if (royaltySplitRate > 10) revert AmountOutOfRange();
nftRoyaltySplit = royaltySplitRate;
emit RoyaltyFeeUpdated(royaltySplitRate);
}
function setRoyaltyAddress(address newAddress) external onlyOwner {
if (newAddress == address(0)) revert NotZeroAddress();
royaltySplitter = IEverRoyaltySplitter(newAddress);
emit RoyaltyAddressUpdated(newAddress);
}
function setRendererAddress(address newAddress) external onlyOwner {
if (newAddress == address(0)) revert NotZeroAddress();
renderer = IEverRiseRenderer(newAddress);
emit RendererAddressUpdated(newAddress);
}
function setStakingParameters(uint8 _withdrawPercent, uint8 _firstHalfPenality, uint8 _secondHalfPenality, uint8 _maxStakeMonths, bool _mergEnabled)
external onlyOwner
{
if (_maxStakeMonths == 0 || _maxStakeMonths > 120) {
revert AmountOutOfRange();
}
maxEarlyWithdrawalPercent = _withdrawPercent;
firstHalfPenality = _firstHalfPenality;
secondHalfPenality = _secondHalfPenality;
maxStakeMonths = _maxStakeMonths;
mergeEnabled = _mergEnabled ? _TRUE : _FALSE;
emit StakingParametersSet(_withdrawPercent, _firstHalfPenality, _secondHalfPenality, _maxStakeMonths, _mergEnabled);
}
}
contract nftEverRise is nftEverRiseConfigurable {
string public constant name = "EverRise NFT Stakes";
string public constant symbol = "nftRISE";
uint256 public constant month = 30 days;
uint256 private constant MAX = ~uint256(0);
uint8 public constant decimals = 0;
uint256 private constant totalStakeTokensSupply = 120_000_000 * 10**6 * 10**18;
uint8 constant _FALSE8 = 1;
uint8 constant _TRUE8 = 2;
event RewardsWithdrawn(address indexed from, uint256 amount);
event ExcludedFromRewards(address indexed _address);
event IncludedToRewards(address indexed _address);
mapping (address => bool) private _isExcludedFromReward;
mapping (address => uint256) private _rOwned;
mapping (address => uint256) private _tOwned;
mapping (address => uint256) private _withdrawnRewards;
mapping (uint256 => IndividualAllowance) private _individualApproval;
address[] private _excludedList;
uint256 private _rTotal = (MAX - (MAX % totalStakeTokensSupply));
StakingDetails[] private _allStakeDetails;
mapping (address => uint256[]) private _individualStakes;
mapping (uint256 => uint256) private _stakeById;
uint256[] private _freeStakes;
mapping (address => uint256) public voteEscrowedBalance;
uint256 public totalAmountEscrowed;
uint256 public totalAmountVoteEscrowed;
uint256 public totalRewardsDistributed;
uint32 private nextNftId = 1;
veRise public immutable veRiseToken;
claimRise public immutable claimRiseToken;
constructor() {
veRiseToken = new veRise();
claimRiseToken = new claimRise();
_rOwned[address(this)] = _rTotal;
excludeFromReward(address(this));
_allStakeDetails.push(StakingDetails({
initialTokenAmount: 0,
withdrawnAmount: 0,
depositTime: 0,
numOfMonths: 1,
achievementClaimed: 0,
stakerAddress: address(0),
nftId: 0,
lookupIndex: 0,
stakerIndex: 0,
isActive: _FALSE8
}));
}
function _walletLock(address fromAddress) private view {
if (everRiseToken.isWalletLocked(fromAddress)) revert WalletLocked();
}
modifier walletLock(address fromAddress) {
_walletLock(fromAddress);
_;
}
function totalSupply() external view returns (uint256) {
return _allStakeDetails.length - _freeStakes.length - 1;
}
function _onlyRewardCreator(address senderAddress) private view {
if (!_canCreateRewards[senderAddress]) revert CallerNotApproved();
}
modifier onlyRewardCreator() {
_onlyRewardCreator(_msgSender());
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override (ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC2981).interfaceId ||
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
function contractURI() external view returns (string memory) {
return renderer.contractURI();
}
function tokenURI(uint256 nftId) external view returns (string memory) {
return renderer.tokenURI(nftId);
}
function createRewards(uint256 amount) external onlyRewardCreator() {
address sender = _msgSender();
if (_isExcludedFromReward[sender]) revert NotAllowedToDeliverRewards();
_transferFromExcluded(address(this), sender, amount);
totalRewardsDistributed += amount;
uint256 rAmount = amount * _getRate();
_rOwned[sender] -= rAmount;
_rTotal -= rAmount;
claimRiseToken.transferFrom(address(0), address(this), amount);
}
function voteEscrowedAndRewards(address account) private view returns (uint256) {
if (account == address(0)) revert NotZeroAddress();
if (_isExcludedFromReward[account]) return _tOwned[account];
return tokenFromRewards(_rOwned[account]);
}
function totalRewardsUnclaimed() external view returns (uint256) {
return everRiseToken.balanceOf(address(this));
}
function isExcludedFromReward(address account) external view returns (bool) {
if (account == address(0)) revert NotZeroAddress();
return _isExcludedFromReward[account];
}
function rewardsFromToken(uint256 tAmount) external view returns(uint256) {
if (tAmount > totalStakeTokensSupply) revert AmountOutOfRange();
return tAmount * _getRate();
}
function tokenFromRewards(uint256 rAmount) public view returns(uint256) {
if (rAmount > _rTotal) revert AmountOutOfRange();
uint256 currentRate = _getRate();
return rAmount / currentRate;
}
function excludeFromReward(address account) public onlyOwner() {
if (account == address(0)) revert NotZeroAddress();
if (_isExcludedFromReward[account]) revert InvalidAddress();
if(_rOwned[account] > 0) {
_tOwned[account] = tokenFromRewards(_rOwned[account]);
}
_isExcludedFromReward[account] = true;
_excludedList.push(account);
emit ExcludedFromRewards(account);
}
function includeInReward(address account) external onlyOwner() {
if (account == address(0)) revert NotZeroAddress();
if (!_isExcludedFromReward[account]) revert InvalidAddress();
uint256 length = _excludedList.length;
for (uint256 i = 0; i < length;) {
if (_excludedList[i] == account) {
_excludedList[i] = _excludedList[_excludedList.length - 1];
_tOwned[account] = 0;
_isExcludedFromReward[account] = false;
_excludedList.pop();
break;
}
unchecked {
++i;
}
}
emit IncludedToRewards(account);
}
function _transfer(
address sender,
address recipient,
uint256 amount,
bool emitEvent
) private {
if (sender == address(0)) revert NotZeroAddress();
if (recipient == address(0)) revert NotZeroAddress();
if (amount == 0) revert AmountMustBeGreaterThanZero();
// One of the addresses has to be this contract
if (sender != address(this) && recipient != address(this)) revert InvalidAddress();
if (_isExcludedFromReward[sender]) {
if (!_isExcludedFromReward[recipient]) {
_transferFromExcluded(sender, recipient, amount);
} else {
_transferBothExcluded(sender, recipient, amount);
}
} else if (_isExcludedFromReward[recipient]) {
_transferToExcluded(sender, recipient, amount);
} else {
_transferStandard(sender, recipient, amount);
}
if (emitEvent) {
if (sender == address(this)) {
veRiseToken.transferFrom(address(0), recipient, amount);
}
else if (recipient == address(this)) {
veRiseToken.transferFrom(sender, address(0), amount);
}
}
}
function _transferStandard(address sender, address recipient, uint256 tAmount) private {
uint256 rAmount = tAmount * _getRate();
_rOwned[sender] -= rAmount;
_rOwned[recipient] += rAmount;
}
function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
uint256 rAmount = tAmount * _getRate();
_rOwned[sender] -= rAmount;
_tOwned[recipient] += tAmount;
_rOwned[recipient] += rAmount;
}
function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
uint256 rAmount = tAmount * _getRate();
_tOwned[sender] -= tAmount;
_rOwned[sender] -= rAmount;
_rOwned[recipient] += rAmount;
}
function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
uint256 rAmount = tAmount * _getRate();
_tOwned[sender] -= tAmount;
_rOwned[sender] -= rAmount;
_tOwned[recipient] += tAmount;
_rOwned[recipient] += rAmount;
}
function _getRate() private view returns(uint256) {
(uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
return rSupply / tSupply;
}
function _getCurrentSupply() private view returns(uint256, uint256) {
uint256 rSupply = _rTotal;
uint256 tSupply = totalStakeTokensSupply;
uint256 length = _excludedList.length;
for (uint256 i = 0; i < length;) {
if (_rOwned[_excludedList[i]] > rSupply || _tOwned[_excludedList[i]] > tSupply) {
return (_rTotal, totalStakeTokensSupply);
}
rSupply -= _rOwned[_excludedList[i]];
tSupply -= _tOwned[_excludedList[i]];
unchecked {
++i;
}
}
if (rSupply < (_rTotal / totalStakeTokensSupply)) return (_rTotal, totalStakeTokensSupply);
return (rSupply, tSupply);
}
function getStakeIndex(uint256 nftId) private view returns (uint256 lookupIndex) {
if (nftId == 0) revert DoesNotExist();
lookupIndex = _stakeById[nftId];
if (lookupIndex >= _allStakeDetails.length) revert DoesNotExist();
if (_allStakeDetails[lookupIndex].isActive != _TRUE8) revert DoesNotExist();
}
function ownerOf(uint256 nftId) public view returns (address) {
uint256 lookupIndex = getStakeIndex(nftId);
StakingDetails storage stakeDetails = _allStakeDetails[lookupIndex];
return stakeDetails.stakerAddress;
}
function _getStake(uint256 nftId, address staker) private view returns (uint256 lookupIndex, StakingDetails storage stakeDetails) {
lookupIndex = getStakeIndex(nftId);
stakeDetails = _allStakeDetails[lookupIndex];
if (stakeDetails.stakerAddress != staker) revert NotStakerAddress();
assert(nftId == stakeDetails.nftId);
}
function getStake(uint256 nftId, address staker) external view returns (StakingDetails memory stakeDetails) {
(, stakeDetails) = _getStake(nftId, staker);
}
function getNftData(uint256 nftId) external view returns (StakingDetails memory) {
uint256 lookupIndex = getStakeIndex(nftId);
return _allStakeDetails[lookupIndex];
}
function balanceOf(address account) external view returns (uint256) {
return _individualStakes[account].length;
}
function unclaimedRewardsBalance(address account) public view returns (uint256) {
return voteEscrowedAndRewards(account) - voteEscrowedBalance[account];
}
function getTotalRewards(address account) external view returns (uint256) {
return unclaimedRewardsBalance(account) + _withdrawnRewards[account];
}
function tokenOfOwnerByIndex(address _owner, uint256 index) external view returns (uint32) {
uint256[] storage stakes = _individualStakes[_owner];
if (index > stakes.length) revert AmountOutOfRange();
uint256 lookupIndex = stakes[index];
return _allStakeDetails[lookupIndex].nftId;
}
function enterStaking(address staker, uint96 amount, uint8 numOfMonths)
external onlyEverRiseToken returns (uint32 nftId) {
// Stake time period must be in valid range
if (numOfMonths == 0 ||
numOfMonths > maxStakeMonths ||
(numOfMonths > 12 && (numOfMonths % 12) > 0)
) {
revert AmountOutOfRange();
}
roundingCheck(amount, false);
nftId = _createStake(staker, amount, 0, numOfMonths, uint48(block.timestamp), false);
}
// Rewards withdrawal doesn't need token lock check as is adding to locked wallet not removing
function withdrawRewards() external {
address staker = _msgSender();
uint256 rewards = unclaimedRewardsBalance(staker);
if (rewards == 0) revert NoRewardsToClaim();
// Something to withdraw
_withdrawnRewards[staker] += rewards;
// Remove the veTokens for the rewards
_transfer(staker, address(this), rewards, false);
// Emit transfer
claimRiseToken.transferFrom(staker, address(0), rewards);
// Send RISE rewards
require(everRiseToken.transfer(staker, rewards));
emit RewardsWithdrawn(staker, rewards);
}
function checkNotLocked(uint256 depositTime, uint256 numOfMonths) private view {
if (depositTime + (numOfMonths * month) > block.timestamp) {
revert StakeStillLocked();
}
}
function leaveStaking(address staker, uint256 nftId, bool overrideNotClaimed) external onlyEverRiseToken returns (uint96 amount) {
(uint256 lookupIndex, StakingDetails storage stakeDetails) = _getStake(nftId, staker);
checkNotLocked(stakeDetails.depositTime, stakeDetails.numOfMonths);
if (!overrideNotClaimed && stakeDetails.achievementClaimed != _TRUE8) {
revert AchievementNotClaimed();
}
amount = _removeStake(staker, nftId, lookupIndex, stakeDetails);
}
function withdraw(address staker, uint256 nftId, uint96 amount, bool overrideNotClaimed) external onlyEverRiseToken returns (uint32 newNftId) {
(uint256 lookupIndex, StakingDetails storage stakeDetails) = _getStake(nftId, staker);
checkNotLocked(stakeDetails.depositTime, stakeDetails.numOfMonths);
if (!overrideNotClaimed && stakeDetails.achievementClaimed != _TRUE8) {
revert AchievementNotClaimed();
}
uint96 remaining = stakeDetails.initialTokenAmount - stakeDetails.withdrawnAmount;
if (amount > remaining) revert AmountLargerThanAvailable();
roundingCheck(amount, true);
bool reissueNft = false;
if (amount > 0) {
decreaseVeAmount(staker, amount, stakeDetails.numOfMonths, true);
// Out of period, inital now becomes remaining
remaining -= amount;
reissueNft = true;
}
if (stakeDetails.initialTokenAmount != remaining) {
// Out of period, zero out the withdrawal amount
stakeDetails.initialTokenAmount = remaining;
stakeDetails.withdrawnAmount = 0;
reissueNft = true;
}
if (reissueNft) {
if (remaining == 0) {
_burnStake(staker, nftId, lookupIndex, stakeDetails);
newNftId = 0;
} else {
newNftId = _reissueStakeNftId(nftId, lookupIndex);
stakeDetails.nftId = newNftId;
}
} else {
// Nothing changed, keep the same nft
newNftId = uint32(nftId);
}
}
function claimAchievement(address staker, uint256 nftId) external returns (uint32 newNftId) {
if (_msgSender() != currentAchievementNfts) revert CallerNotApproved();
(uint256 lookupIndex, StakingDetails storage stakeDetails) = _getStake(nftId, staker);
checkNotLocked(stakeDetails.depositTime, stakeDetails.numOfMonths);
// Can only claim once
if (stakeDetails.achievementClaimed == _TRUE8) {
revert AchievementAlreadyClaimed();
}
// Reset broken status if unlocked
if (stakeDetails.withdrawnAmount > 0) {
stakeDetails.initialTokenAmount -= stakeDetails.withdrawnAmount;
stakeDetails.withdrawnAmount = 0;
}
// Mark claimed
stakeDetails.achievementClaimed = _TRUE8;
// Get new id
newNftId = _reissueStakeNftId(nftId, lookupIndex);
// Set new id
stakeDetails.nftId = newNftId;
// Emit burn and mint events
_reissueStakeNft(staker, nftId, newNftId);
}
function getTime() external view returns (uint256) {
// Used to workout UI time drift from blockchain
return block.timestamp;
}
function checkLocked(uint48 depositTime, uint8 numOfMonths) private view {
if (depositTime + (numOfMonths * month) < block.timestamp) {
revert StakeUnlocked();
}
}
function earlyWithdraw(address staker, uint256 nftId, uint96 amount) external onlyEverRiseToken returns (uint32 newNftId, uint96 penaltyAmount) {
(uint256 lookupIndex, StakingDetails storage stakeDetails) = _getStake(nftId, staker);
checkLocked(stakeDetails.depositTime, stakeDetails.numOfMonths);
uint256 remaingEarlyWithdrawal = (stakeDetails.initialTokenAmount * maxEarlyWithdrawalPercent) / 100 - stakeDetails.withdrawnAmount;
if (amount > remaingEarlyWithdrawal) {
revert AmountLargerThanAvailable();
}
roundingCheck(amount, false);
decreaseVeAmount(staker, amount, stakeDetails.numOfMonths, true);
penaltyAmount = calculateTax(amount, stakeDetails.depositTime, stakeDetails.numOfMonths); // calculate early penalty tax
stakeDetails.withdrawnAmount += uint96(amount); // update the withdrawl amount
newNftId = _reissueStakeNftId(nftId, lookupIndex);
stakeDetails.nftId = newNftId;
}
function increaseStake(address staker, uint256 nftId, uint96 amount)
external onlyEverRiseToken returns (uint32 newNftId, uint96 original, uint8 numOfMonths)
{
(uint256 lookupIndex, StakingDetails storage stakeDetails) = _getStake(nftId, staker);
checkLocked(stakeDetails.depositTime, stakeDetails.numOfMonths);
roundingCheck(amount, false);
numOfMonths = stakeDetails.numOfMonths;
increaseVeAmount(staker, amount, numOfMonths, true);
// Get current amount for main contract change event
original = stakeDetails.initialTokenAmount - stakeDetails.withdrawnAmount;
// Take amount off the withdrawnAmount, "repairing" the stake
if (amount > stakeDetails.withdrawnAmount) {
// Take withdrawn off amount
amount -= stakeDetails.withdrawnAmount;
// Clear withdrawn
stakeDetails.withdrawnAmount = 0;
// Add remaining to initial
stakeDetails.initialTokenAmount += amount;
} else {
// Just reduce amount withdrawn
stakeDetails.withdrawnAmount -= amount;
}
// Relock
stakeDetails.depositTime = uint48(block.timestamp);
newNftId = _reissueStakeNftId(nftId, lookupIndex);
stakeDetails.nftId = newNftId;
_reissueStakeNft(staker, nftId, newNftId);
}
function extendStake(uint256 nftId, uint8 numOfMonths) external walletLock(_msgSender()) returns (uint32 newNftId) {
address staker = _msgSender();
(uint256 lookupIndex, StakingDetails storage stakeDetails) = _getStake(nftId, staker);
checkLocked(stakeDetails.depositTime, stakeDetails.numOfMonths);
if (stakeDetails.numOfMonths >= numOfMonths) revert StakeCanOnlyBeExtended();
// Stake time period must be in valid range
if (numOfMonths > maxStakeMonths ||
(numOfMonths > 12 && (numOfMonths % 12) > 0)
) {
revert AmountOutOfRange();
}
uint8 extraMonths = numOfMonths - stakeDetails.numOfMonths;
uint96 amount = (stakeDetails.initialTokenAmount - stakeDetails.withdrawnAmount);
increaseVeAmount(staker, amount, extraMonths, true);
stakeDetails.numOfMonths = numOfMonths;
// Relock
stakeDetails.depositTime = uint48(block.timestamp);
newNftId = _reissueStakeNftId(nftId, lookupIndex);
stakeDetails.nftId = newNftId;
_reissueStakeNft(staker, nftId, newNftId);
}
function toUint96(uint256 value) internal pure returns (uint96) {
if (value > type(uint96).max) revert Overflow();
return uint96(value);
}
function splitStake(uint256 nftId, uint96 amount) external payable walletLock(_msgSender()) returns (uint32 newNftId0, uint32 newNftId1) {
address staker = _msgSender();
if (msg.value < stakeCreateCost) revert NotEnoughToCoverStakeFee();
roundingCheck(amount, false);
// Transfer everything, easier than transferring extras later
payable(address(everRiseToken)).transfer(address(this).balance);
(uint256 lookupIndex, StakingDetails storage stakeDetails) = _getStake(nftId, staker);
uint256 remainingAmount = stakeDetails.initialTokenAmount - stakeDetails.withdrawnAmount;
if (amount >= remainingAmount) revert AmountLargerThanAvailable();
newNftId0 = _reissueStakeNftId(nftId, lookupIndex);
// Update the existing stake
uint96 transferredWithdrawnAmount = toUint96(stakeDetails.withdrawnAmount * uint256(amount) / stakeDetails.initialTokenAmount);
stakeDetails.initialTokenAmount -= amount;
stakeDetails.withdrawnAmount -= transferredWithdrawnAmount;
stakeDetails.nftId = newNftId0;
// Create new stake
newNftId1 = _addSplitStake(
staker,
amount, // initialTokenAmount
transferredWithdrawnAmount, // withdrawnAmount
stakeDetails.depositTime, // depositTime
stakeDetails.numOfMonths,
stakeDetails.achievementClaimed == _TRUE8 // achievementClaimed
);
_reissueStakeNft(staker, nftId, newNftId0);
emit Transfer(address(0), staker, newNftId1);
}
function roundingCheck(uint96 amount, bool allowZero) private pure {
// Round to nearest unit
uint96 roundedAmount = amount - (amount % uint96(10**18));
if (amount != roundedAmount || (!allowZero && amount == 0)) revert AmountMustBeAnInteger();
}
function mergeStakes(uint256 nftId0, uint256 nftId1, bool overrideStatuses)
external walletLock(_msgSender())
returns (uint32 newNftId)
{
if (mergeEnabled != _TRUE) revert MergeNotEnabled();
address staker = _msgSender();
(uint256 loo...
// [truncated — 70540 bytes total]
Read Contract
balanceOf 0x70a08231 → uint256
calculateTax 0x1635aa03 → uint96
calculateTaxAt 0x7cdd109d → uint96
claimRiseToken 0xa578be6c → address
contractURI 0xe8a3d485 → string
currentAchievementNfts 0xad1ff74b → address
decimals 0x313ce567 → uint8
everRiseToken 0x8116ed72 → address
firstHalfPenality 0xe6f203f3 → uint8
getApproved 0x081812fc → address
getNftData 0xa802d82b → tuple
getStake 0x68c5805e → tuple
getTime 0x557ed1ba → uint256
getTotalRewards 0x2bcf161c → uint256
isApprovedForAll 0xe985e9c5 → bool
isExcludedFromReward 0x88f82020 → bool
maxEarlyWithdrawalPercent 0xf13ca76f → uint8
maxStakeMonths 0x93da8b81 → uint8
mergeEnabled 0xe33e4b49 → uint256
month 0x702921f5 → uint256
name 0x06fdde03 → string
nftRoyaltySplit 0x44d34e50 → uint256
owner 0x8da5cb5b → address
ownerOf 0x6352211e → address
renderer 0x8ada6b0f → address
rewardsFromToken 0xa94ea3b0 → uint256
royaltyInfo 0x2a55205a → address, uint256
royaltySplitter 0x411d8f2f → address
secondHalfPenality 0xf04f3844 → uint8
stakeCreateCost 0x17c0287c → uint256
supportsInterface 0x01ffc9a7 → bool
symbol 0x95d89b41 → string
tokenFromRewards 0xeb84fd77 → uint256
tokenOfOwnerByIndex 0x2f745c59 → uint32
tokenURI 0xc87b56dd → string
totalAmountEscrowed 0xed74d26e → uint256
totalAmountVoteEscrowed 0x63234f3d → uint256
totalRewardsDistributed 0xee172546 → uint256
totalRewardsUnclaimed 0x06dd29e5 → uint256
totalSupply 0x18160ddd → uint256
unclaimedRewardsBalance 0x099785f6 → uint256
veRiseToken 0x1370733c → address
voteEscrowedBalance 0x894f03b5 → uint256
Write Contract 36 functions
These functions modify contract state and require a wallet transaction to execute.
addAddressToCreate 0x846ea2d0
address account
addStaker 0x471a751e
address staker
uint256 nftId
approve 0x095ea7b3
address _operator
uint256 nftId
approve 0xe1f21c67
address account
address _operator
uint256 nftId
bridgeOrAirdropStakeNftIn 0x2a7b11e6
address toAddress
uint96 depositAmount
uint8 numOfMonths
uint48 depositTime
uint96 withdrawnAmount
uint96 rewards
bool achievementClaimed
returns: uint32
bridgeStakeNftOut 0x2b0e1d79
address fromAddress
uint256 nftId
returns: uint96
claimAchievement 0xc7bb8dc4
address staker
uint256 nftId
returns: uint32
createRewards 0xd9fbb1e9
uint256 amount
earlyWithdraw 0x04a9bbec
address staker
uint256 nftId
uint96 amount
returns: uint32, uint96
enterStaking 0x615eaa59
address staker
uint96 amount
uint8 numOfMonths
returns: uint32
excludeFromReward 0x52390c02
address account
extendStake 0xbada23d5
uint256 nftId
uint8 numOfMonths
returns: uint32
includeInReward 0x3685d419
address account
increaseStake 0xe2c281db
address staker
uint256 nftId
uint96 amount
returns: uint32, uint96, uint8
leaveStaking 0xd22d6f43
address staker
uint256 nftId
bool overrideNotClaimed
returns: uint96
mergeStakes 0xebbbb8f4
uint256 nftId0
uint256 nftId1
bool overrideStatuses
returns: uint32
reissueStakeNft 0x5a034bd8
address staker
uint256 oldNftId
uint256 newNftId
removeAddressToCreate 0x7d87feb9
address account
removeStaker 0xc6557fd2
address staker
uint256 nftId
safeTransferFrom 0x42842e0e
address from
address to
uint256 tokenId
safeTransferFrom 0xb88d4fde
address from
address to
uint256 tokenId
bytes data
setAchievementNfts 0xe6c1c9fc
address contractAddress
setApprovalForAll 0xa22cb465
address operator
bool approved
setEverRiseToken 0x5718f41a
address tokenAddress
setNftRoyaltyFeePercent 0xeb778375
uint256 royaltySplitRate
setRendererAddress 0xa556f60f
address newAddress
setRoyaltyAddress 0x06d254da
address newAddress
setStakeCreateCost 0xe683015f
uint256 _stakeCreateCost
uint256 numOfDecimals
setStakingParameters 0x5be1ee5d
uint8 _withdrawPercent
uint8 _firstHalfPenality
uint8 _secondHalfPenality
uint8 _maxStakeMonths
bool _mergEnabled
splitStake 0x121407c9
uint256 nftId
uint96 amount
returns: uint32, uint32
transferExternalTokens 0x171c1fda
address tokenAddress
address toAddress
transferFrom 0x23b872dd
address from
address to
uint256 tokenId
transferOwnership 0xf2fde38b
address newOwner
transferToAddressETH 0xf128b0c1
address receipient
withdraw 0xabdf9434
address staker
uint256 nftId
uint96 amount
bool overrideNotClaimed
returns: uint32
withdrawRewards 0xc7b8981c
No parameters
Recent Transactions
No transactions found for this address