Address Contract Partially Verified
Address
0x1EC0611B0Ec2EE8577F72283b92D8A15209469c6
Balance
0 ETH
Nonce
1
Code Size
11548 bytes
Creator
0xf116162e...df10 at tx 0xf9cad3eb...195780
Indexed Transactions
0
Contract Bytecode
11548 bytes
0x608060405260043610610215575f3560e01c80638da5cb5b1161011e578063c03afb59116100a8578063e671499b1161006d578063e671499b1461067f578063eff691721461069e578063f14210a6146106bd578063f2fde38b146106dc578063f6222807146106fb575f80fd5b8063c03afb59146105db578063cea2d018146105fa578063d4b9a3831461061b578063d4c7f20c14610630578063deaa59df14610660575f80fd5b80639ead7222116100ee5780639ead7222146104f05780639fdca0ca1461050f578063a0311bd41461052e578063a20dda2c1461054d578063bce4a66814610581575f80fd5b80638da5cb5b1461048c578063903cc583146104a857806394c33163146104c757806396ea8b9c146104db575f80fd5b806353dfb1be1161019f57806370ab730f1161016f57806370ab730f14610405578063715018a614610424578063724e78da146104385780638c819aa6146104575780638d17feb91461046a575f80fd5b806353dfb1be1461039f5780635719dd22146103be5780636a2810a6146103d25780636e34d929146103f1575f80fd5b806322e8c87d116101e557806322e8c87d146102c65780633e251e35146102e8578063405fb944146103345780634b57034814610349578063521eb27314610368575f80fd5b806306b091f91461022057806311e79a15146102415780631626bf011461027d5780631ce97fd1146102a0575f80fd5b3661021c57005b5f80fd5b34801561022b575f80fd5b5061023f61023a366004612577565b61071a565b005b34801561024c575f80fd5b5061026061025b3660046125a1565b61086a565b6040516102749897969594939291906125e6565b60405180910390f35b348015610288575f80fd5b5061029260035481565b604051908152602001610274565b3480156102ab575f80fd5b50600654600160a81b900460ff166040516102749190612650565b3480156102d1575f80fd5b506102da610956565b6040516102749291906126b9565b3480156102f3575f80fd5b50610307610302366004612724565b610d84565b604080519687526020870195909552938501929092526060840152608083015260a082015260c001610274565b34801561033f575f80fd5b5061029260025481565b348015610354575f80fd5b5061023f610363366004612744565b610e21565b348015610373575f80fd5b50600454610387906001600160a01b031681565b6040516001600160a01b039091168152602001610274565b3480156103aa575f80fd5b5061023f6103b936600461275e565b610e67565b3480156103c9575f80fd5b50600754610292565b3480156103dd575f80fd5b506103876103ec3660046125a1565b610ef9565b3480156103fc575f80fd5b50610292610f21565b348015610410575f80fd5b5061023f61041f366004612744565b610fa2565b34801561042f575f80fd5b5061023f610fe5565b348015610443575f80fd5b5061023f61045236600461278c565b610ff8565b61023f61046536600461278c565b611022565b348015610475575f80fd5b5061047e6115c2565b6040516102749291906127a7565b348015610497575f80fd5b505f546001600160a01b0316610387565b3480156104b3575f80fd5b506102926104c2366004612801565b61173a565b3480156104d2575f80fd5b506102926117ab565b3480156104e6575f80fd5b5061029260055481565b3480156104fb575f80fd5b5061038761050a3660046125a1565b61182a565b34801561051a575f80fd5b5061023f610529366004612724565b611839565b348015610539575f80fd5b5061023f6105483660046125a1565b6118c0565b348015610558575f80fd5b5061038761056736600461278c565b600b6020525f90815260409020546001600160a01b031681565b34801561058c575f80fd5b506105c461059b366004612577565b600d60209081525f92835260408084209091529082529020805460019091015460ff9091169082565b604080519215158352602083019190915201610274565b3480156105e6575f80fd5b5061023f6105f5366004612724565b6118cd565b348015610605575f80fd5b5061060e61196f565b6040516102749190612821565b348015610626575f80fd5b5061029260015481565b34801561063b575f80fd5b5060065461065090600160a01b900460ff1681565b6040519015158152602001610274565b34801561066b575f80fd5b5061023f61067a36600461278c565b611ac5565b34801561068a575f80fd5b5061023f6106993660046128ee565b611aef565b3480156106a9575f80fd5b50600654610387906001600160a01b031681565b3480156106c8575f80fd5b5061023f6106d73660046125a1565b6121df565b3480156106e7575f80fd5b5061023f6106f636600461278c565b61225c565b348015610706575f80fd5b5061023f61071536600461292d565b612299565b610722612316565b6040516370a0823160e01b8152306004820152829082906001600160a01b038316906370a0823190602401602060405180830381865afa158015610768573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061078c9190612948565b10156107d65760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064015b60405180910390fd5b806001600160a01b031663a9059cbb6107f65f546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018590526044016020604051808303815f875af1158015610840573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610864919061295f565b50505050565b60098181548110610879575f80fd5b5f9182526020909120600790910201805460018201546002830154600384015460048501546005860180549597506001600160a01b0390941695929491939092916108c39061297a565b80601f01602080910402602001604051908101604052809291908181526020018280546108ef9061297a565b801561093a5780601f106109115761010080835404028352916020019161093a565b820191905f5260205f20905b81548152906001019060200180831161091d57829003601f168201915b5050506006909301549192505060ff8082169161010090041688565b6060805f60098054905067ffffffffffffffff811115610978576109786129ac565b6040519080825280602002602001820160405280156109a1578160200160208202803683370190505b506009549091505f9067ffffffffffffffff8111156109c2576109c26129ac565b6040519080825280602002602001820160405280156109eb578160200160208202803683370190505b5090505f805b600954811015610c5c575f60098281548110610a0f57610a0f6129c0565b905f5260205f209060070201604051806101000160405290815f8201548152602001600182015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600282015481526020016003820154815260200160048201548152602001600582018054610a8c9061297a565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab89061297a565b8015610b035780601f10610ada57610100808354040283529160200191610b03565b820191905f5260205f20905b815481529060010190602001808311610ae657829003601f168201915b50505091835250506006919091015460ff8082161515602080850191909152610100909204161515604092830152828101516001600160a01b03165f908152600d82528281208451825290915290812060010154919250805b85811015610bd95783602001516001600160a01b0316888281518110610b8457610b846129c0565b60200260200101516001600160a01b031603610bd1578360600151878281518110610bb157610bb16129c0565b60200260200101818151610bc591906129e8565b90525060019150610bd9565b600101610b5c565b5080610c51578260200151878681518110610bf657610bf66129c0565b60200260200101906001600160a01b031690816001600160a01b031681525050818360600151610c2691906129e8565b868681518110610c3857610c386129c0565b602090810291909101015284610c4d816129fb565b9550505b5050506001016109f1565b508067ffffffffffffffff811115610c7657610c766129ac565b604051908082528060200260200182016040528015610c9f578160200160208202803683370190505b5094508067ffffffffffffffff811115610cbb57610cbb6129ac565b604051908082528060200260200182016040528015610ce4578160200160208202803683370190505b5093505f5b81811015610d7c57838181518110610d0357610d036129c0565b6020026020010151868281518110610d1d57610d1d6129c0565b60200260200101906001600160a01b031690816001600160a01b031681525050828181518110610d4f57610d4f6129c0565b6020026020010151858281518110610d6957610d696129c0565b6020908102919091010152600101610ce9565b505050509091565b5f805f805f805f600c5f896005811115610da057610da061263c565b6005811115610db157610db161263c565b815260208082019290925260409081015f20815160c08101835281548082526001830154948201859052600283015493820184905260038301546060830181905260048401546080840181905260059094015460a0909301839052909d949c50929a509198509650945092505050565b610e29612316565b80600c5f846005811115610e3f57610e3f61263c565b6005811115610e5057610e5061263c565b815260208101919091526040015f20600101555050565b610e6f612316565b6007548210610eb65760405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b60448201526064016107cd565b8060078381548110610eca57610eca6129c0565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b60088181548110610f08575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f8060065f9054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610f73573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f979190612a2c565b509195945050505050565b610faa612316565b80600c5f846005811115610fc057610fc061263c565b6005811115610fd157610fd161263c565b815260208101919091526040015f20555050565b610fed612316565b610ff65f612342565b565b611000612316565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b600654600160a01b900460ff16151560011461106b5760405162461bcd60e51b8152602060048201526008602482015267191a5cd8589b195960c21b60448201526064016107cd565b6005600654600160a81b900460ff16600581111561108b5761108b61263c565b036110c15760405162461bcd60e51b815260206004820152600660248201526518db1bdcd95960d21b60448201526064016107cd565b5f6110cc5f3461173a565b90505f600c5f600660159054906101000a900460ff1660058111156110f3576110f361263c565b60058111156111045761110461263c565b81526020019081526020015f209050806001015482826002015461112891906129e8565b11156111665760405162461bcd60e51b815260206004820152600d60248201526c115e18d959591cc81b1a5b5a5d609a1b60448201526064016107cd565b6001600160a01b0383161580159061118757506001600160a01b0383163314155b80156111da57506001600160a01b0383165f908152600d60205260408120600654909190600160a81b900460ff1660058111156111c6576111c661263c565b815260208101919091526040015f205460ff165b1561133b57335f908152600b60205260409020546001600160a01b031661122357335f908152600b6020526040902080546001600160a01b0319166001600160a01b0385161790555b335f908152600b60205260409020546001600160a01b0380851691160361133b576064600554836112549190612a7a565b61125e9190612a91565b6001600160a01b0384165f908152600d60205260408120600654909190600160a81b900460ff1660058111156112965761129661263c565b81526020019081526020015f206001015f8282546112b491906129e8565b90915550506001600160a01b0383165f908152600a602052604090205460ff1661133b576008805460018082019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0386169081179091555f908152600a60205260409020805460ff191690911790555b6009604051806101000160405280600660159054906101000a900460ff16600581111561136a5761136a61263c565b815233602080830191909152346040808401919091526060808401889052426080808601919091528251808401845260038082526208aa8960eb1b8287015260a080880192909252600160c088018190525f60e090980188905289548082018b559988529686902088516007909a02019889559487015195880180546001600160a01b0319166001600160a01b039097169690961790955591850151600287015584015191850191909155820151600484015581015190919060058201906114329082612afc565b5060c08201516006918201805460e09094015115156101000261ff00199215159290921661ffff199094169390931717909155335f908152600d6020526040812091546001929190600160a81b900460ff1660058111156114955761149561263c565b81526020019081526020015f205f015f6101000a81548160ff02191690831515021790555081816002015f8282546114cd91906129e8565b9250508190555034816003015f8282546114e791906129e8565b925050819055503460015f8282546114ff91906129e8565b90915550506004546040515f916001600160a01b03169034908381818185875af1925050503d805f811461154e576040519150601f19603f3d011682016040523d82523d5f602084013e611553565b606091505b505090508061159a5760405162461bcd60e51b815260206004820152601360248201527211551208151c985b9cd9995c8819985a5b1959606a1b60448201526064016107cd565b81600101548260020154106108645750506006805460ff60a81b1916600560a81b1790555050565b60085460609081908067ffffffffffffffff8111156115e3576115e36129ac565b60405190808252806020026020018201604052801561160c578160200160208202803683370190505b5092508067ffffffffffffffff811115611628576116286129ac565b60405190808252806020026020018201604052801561166c57816020015b604080518082019091525f80825260208201528152602001906001900390816116465790505b5091505f5b81811015611734575f6008828154811061168d5761168d6129c0565b905f5260205f20015f9054906101000a90046001600160a01b03169050808583815181106116bd576116bd6129c0565b6001600160a01b039283166020918202929092018101919091529082165f908152600d825260408082208280528352908190208151808301909252805460ff161515825260010154918101919091528451859084908110611720576117206129c0565b602090810291909101015250600101611671565b50509091565b6007545f90831061177d5760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b60448201526064016107cd565b5f835f036117955761178e83612391565b90506117a2565b61179f848461244a565b90505b90505b92915050565b5f80805b600560ff82161161182457600c5f8260ff1660058111156117d2576117d261263c565b60058111156117e3576117e361263c565b60058111156117f4576117f461263c565b81526020019081526020015f20600201548261181091906129e8565b91508061181c81612bb7565b9150506117af565b50919050565b60078181548110610f08575f80fd5b611841612316565b60058160058111156118555761185561263c565b036118a25760405162461bcd60e51b815260206004820152601760248201527f506861736520697320616c726561647920636c6f73656400000000000000000060448201526064016107cd565b600680546005919060ff60a81b1916600160a81b835b021790555050565b6118c8612316565b600555565b6118d5612316565b600654600160a81b900460ff1660058111156118f3576118f361263c565b8160058111156119055761190561263c565b0361194a5760405162461bcd60e51b8152602060048201526015602482015274416c726561647920696e207468617420706861736560581b60448201526064016107cd565b6006805482919060ff60a81b1916600160a81b8360058111156118b8576118b861263c565b60606009805480602002602001604051908101604052809291908181526020015f905b82821015611abc575f8481526020908190206040805161010081018252600786029092018054835260018101546001600160a01b031693830193909352600283015490820152600382015460608201526004820154608082015260058201805491929160a084019190611a049061297a565b80601f0160208091040260200160405190810160405280929190818152602001828054611a309061297a565b8015611a7b5780601f10611a5257610100808354040283529160200191611a7b565b820191905f5260205f20905b815481529060010190602001808311611a5e57829003601f168201915b50505091835250506006919091015460ff80821615156020808501919091526101009092041615156040909201919091529082526001929092019101611992565b50505050905090565b611acd612316565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b600654600160a01b900460ff16611b335760405162461bcd60e51b8152602060048201526008602482015267191a5cd8589b195960c21b60448201526064016107cd565b5f82118015611b43575060075482105b611b7f5760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b60448201526064016107cd565b6005600654600160a81b900460ff166005811115611b9f57611b9f61263c565b03611bd55760405162461bcd60e51b815260206004820152600660248201526518db1bdcd95960d21b60448201526064016107cd565b5f8111611c185760405162461bcd60e51b815260206004820152601160248201527067726561746572207468616e207a65726f60781b60448201526064016107cd565b5f611c23838361173a565b90505f600c5f600660159054906101000a900460ff166005811115611c4a57611c4a61263c565b6005811115611c5b57611c5b61263c565b81526020019081526020015f2090508060010154828260020154611c7f91906129e8565b1115611cbd5760405162461bcd60e51b815260206004820152600d60248201526c195e18d959591cc81b1a5b5a5d609a1b60448201526064016107cd565b6001600160a01b03851615801590611cde57506001600160a01b0385163314155b8015611d3157506001600160a01b0385165f908152600d60205260408120600654909190600160a81b900460ff166005811115611d1d57611d1d61263c565b815260208101919091526040015f205460ff165b15611e9257335f908152600b60205260409020546001600160a01b0316611d7a57335f908152600b6020526040902080546001600160a01b0319166001600160a01b0387161790555b335f908152600b60205260409020546001600160a01b03808716911603611e9257606460055483611dab9190612a7a565b611db59190612a91565b6001600160a01b0386165f908152600d60205260408120600654909190600160a81b900460ff166005811115611ded57611ded61263c565b81526020019081526020015f206001015f828254611e0b91906129e8565b90915550506001600160a01b0385165f908152600a602052604090205460ff16611e92576008805460018082019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0388169081179091555f908152600a60205260409020805460ff191690911790555b5f60078581548110611ea657611ea66129c0565b5f91825260209091200154600480546040516323b872dd60e01b815233928101929092526001600160a01b03908116602483015260448201879052909116915081906323b872dd906064016020604051808303815f875af1158015611f0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f31919061295f565b611f7d5760405162461bcd60e51b815260206004820152601760248201527f5061796d656e74207472616e73666572206661696c656400000000000000000060448201526064016107cd565b84600103611fbb5783826004015f828254611f9891906129e8565b925050819055508360025f828254611fb091906129e8565b90915550611ff49050565b84600203611ff45783826005015f828254611fd691906129e8565b925050819055508360035f828254611fee91906129e8565b90915550505b6009604051806101000160405280600660159054906101000a900460ff1660058111156120235761202361263c565b8152602001336001600160a01b031681526020018681526020018581526020014281526020018760011461207357604051806040016040528060048152602001635553444360e01b815250612091565b604051806040016040528060048152602001631554d11560e21b8152505b8152600160208083018290525f604093840181905285548084018755958152819020845160079096020194855583015190840180546001600160a01b0319166001600160a01b039092169190911790558101516002830155606081015160038301556080810151600483015560a081015190919060058201906121149082612afc565b5060c08201516006918201805460e09094015115156101000261ff00199215159290921661ffff199094169390931717909155335f908152600d6020526040812091546001929190600160a81b900460ff1660058111156121775761217761263c565b81526020019081526020015f205f015f6101000a81548160ff02191690831515021790555082826002015f8282546121af91906129e8565b909155505060018201546002830154106121d7576006805460ff60a81b1916600560a81b1790555b505050505050565b6121e7612316565b4781111561222e5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064016107cd565b604051339082156108fc029083905f818181858888f19350505050158015612258573d5f803e3d5ffd5b5050565b612264612316565b6001600160a01b03811661228d57604051631e4fbdf760e01b81525f60048201526024016107cd565b61229681612342565b50565b6122a1612316565b600654600160a01b900460ff161515811515036122f85760405162461bcd60e51b8152602060048201526015602482015274416c726561647920696e207468617420737461746560581b60448201526064016107cd565b60068054911515600160a01b0260ff60a01b19909216919091179055565b5f546001600160a01b03163314610ff65760405163118cdaa760e01b81523360048201526024016107cd565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f80670de0b6b3a76400006123a4610f21565b6123ae9085612a7a565b6123b89190612a91565b90505f670de0b6b3a7640000600c5f600660159054906101000a900460ff1660058111156123e8576123e861263c565b60058111156123f9576123f961263c565b815260208101919091526040015f20546124139084612a7a565b61241d9190612a91565b90505f6305f5e10061243783670de0b6b3a7640000612a7a565b6124419190612a91565b95945050505050565b5f806007848154811061245f5761245f6129c0565b5f9182526020808320909101546040805163313ce56760e01b815290516001600160a01b039092169450849263313ce567926004808401938290030181865afa1580156124ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124d29190612bd5565b90505f6124e082600a612cd8565b600654600c905f90600160a81b900460ff1660058111156125035761250361263c565b60058111156125145761251461263c565b815260208101919091526040015f205461252e9087612a7a565b6125389190612a91565b90505f670de0b6b3a764000061254e8382612a7a565b6125589190612a91565b979650505050505050565b6001600160a01b0381168114612296575f80fd5b5f8060408385031215612588575f80fd5b823561259381612563565b946020939093013593505050565b5f602082840312156125b1575f80fd5b5035919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b88815260018060a01b038816602082015286604082015285606082015284608082015261010060a08201525f6126206101008301866125b8565b93151560c08301525090151560e0909101529695505050505050565b634e487b7160e01b5f52602160045260245ffd5b602081016006831061267057634e487b7160e01b5f52602160045260245ffd5b91905290565b5f8151808452602084019350602083015f5b828110156126af5781516001600160a01b0316865260209586019590910190600101612688565b5093949350505050565b604081525f6126cb6040830185612676565b82810360208401528084518083526020830191506020860192505f5b818110156127055783518352602093840193909201916001016126e7565b50909695505050505050565b80356006811061271f575f80fd5b919050565b5f60208284031215612734575f80fd5b61273d82612711565b9392505050565b5f8060408385031215612755575f80fd5b61259383612711565b5f806040838503121561276f575f80fd5b82359150602083013561278181612563565b809150509250929050565b5f6020828403121561279c575f80fd5b81356117a281612563565b604081525f6127b96040830185612676565b82810360208401528084518083526020830191506020860192505f5b8181101561270557835180511515845260209081015181850152909301926040909201916001016127d5565b5f8060408385031215612812575f80fd5b50508035926020909101359150565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b828110156128e257603f1987860301845281518051865260018060a01b03602082015116602087015260408101516040870152606081015160608701526080810151608087015260a081015161010060a08801526128a96101008801826125b8565b905060c0820151151560c088015260e082015191506128cc60e088018315159052565b9550506020938401939190910190600101612847565b50929695505050505050565b5f805f60608486031215612900575f80fd5b833561290b81612563565b95602085013595506040909401359392505050565b8015158114612296575f80fd5b5f6020828403121561293d575f80fd5b81356117a281612920565b5f60208284031215612958575f80fd5b5051919050565b5f6020828403121561296f575f80fd5b81516117a281612920565b600181811c9082168061298e57607f821691505b60208210810361182457634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156117a5576117a56129d4565b5f60018201612a0c57612a0c6129d4565b5060010190565b805169ffffffffffffffffffff8116811461271f575f80fd5b5f805f805f60a08688031215612a40575f80fd5b612a4986612a13565b60208701516040880151606089015192975090955093509150612a6e60808701612a13565b90509295509295909350565b80820281158282048414176117a5576117a56129d4565b5f82612aab57634e487b7160e01b5f52601260045260245ffd5b500490565b601f821115612af757805f5260205f20601f840160051c81016020851015612ad55750805b601f840160051c820191505b81811015612af4575f8155600101612ae1565b50505b505050565b815167ffffffffffffffff811115612b1657612b166129ac565b612b2a81612b24845461297a565b84612ab0565b6020601f821160018114612b5c575f8315612b455750848201515b5f19600385901b1c1916600184901b178455612af4565b5f84815260208120601f198516915b82811015612b8b5787850151825560209485019460019092019101612b6b565b5084821015612ba857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60ff821660ff8103612bcc57612bcc6129d4565b60010192915050565b5f60208284031215612be5575f80fd5b815160ff811681146117a2575f80fd5b6001815b6001841115612c3057808504811115612c1457612c146129d4565b6001841615612c2257908102905b60019390931c928002612bf9565b935093915050565b5f82612c46575060016117a5565b81612c5257505f6117a5565b8160018114612c685760028114612c7257612c8e565b60019150506117a5565b60ff841115612c8357612c836129d4565b50506001821b6117a5565b5060208310610133831016604e8410600b8410161715612cb1575081810a6117a5565b612cbd5f198484612bf5565b805f1904821115612cd057612cd06129d4565b029392505050565b5f61273d60ff841683612c3856fea264697066735822122057ecb50c121a483d1fd662000164bcba92638a6c432bdb2d9209f6c7cf65335f64736f6c634300081a0033
Verified Source Code Partial Match
Compiler: v0.8.26+commit.8a97fa7a
EVM: cancun
Optimization: Yes (200 runs)
PetroPresale.sol 597 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
interface IToken {
function totalSupply() external view returns (uint256);
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
function balanceOf(address account) external view returns (uint256);
function allowance(address owner, address spender)
external
view
returns (uint256);
function transfer(address recipient, uint256 amount)
external
returns (bool);
function decimals() external view returns (uint8);
}
interface AggregatorV3Interface {
function latestRoundData()
external
view
returns (
uint80 roundId,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
);
}
contract PetroPresale is Ownable {
uint256 public amountRaisedETH;
uint256 public amountRaisedUSDT;
uint256 public amountRaisedUSDC;
address payable public wallet;
uint256 public referralPercentage;
AggregatorV3Interface public priceFeedETH;
bool public CanBuy;
enum SalePhase {
Phase1,
Phase2,
Phase3,
Phase4,
Phase5,
Closed
}
SalePhase private currentPhase;
struct PhaseDetail {
uint256 price;
uint256 maxTokens;
uint256 soldTokens;
uint256 amountRaisedETH;
uint256 amountRaisedUSDT;
uint256 amountRaisedUSDC;
}
struct TokenPurchase {
uint256 phase;
address buyer;
uint256 payAmount;
uint256 receiveToken;
uint256 timestamp;
string amountType;
bool purchased;
bool claimed;
}
struct referralDetails {
bool purchased;
uint256 referralBonus;
}
address[] public tokenList;
address[] public referralAddrss;
TokenPurchase[] public allTokenPurchases;
mapping(address => bool) private refExists;
mapping(address => address) public _referral;
mapping(SalePhase => PhaseDetail) private phaseDetails;
mapping(address => mapping(uint256 => referralDetails))
public _referralDetails;
constructor(address payable _wallet) Ownable(msg.sender) {
wallet = _wallet;
priceFeedETH = AggregatorV3Interface(
0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 //ETH
);
tokenList.push(address(0)); // ETH
tokenList.push(0xdAC17F958D2ee523a2206206994597C13D831ec7); // USDT
tokenList.push(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); // USDC
referralPercentage = 10;
CanBuy = true;
phaseDetails[SalePhase.Phase1] = PhaseDetail({
price: 500 ether,
maxTokens: 80_000_000 * 10**18,
soldTokens: 0,
amountRaisedETH: 0,
amountRaisedUSDT: 0,
amountRaisedUSDC: 0
});
phaseDetails[SalePhase.Phase2] = PhaseDetail({
price: 250 ether,
maxTokens: 80_000_000 * 10**18,
soldTokens: 0,
amountRaisedETH: 0,
amountRaisedUSDT: 0,
amountRaisedUSDC: 0
});
phaseDetails[SalePhase.Phase3] = PhaseDetail({
price: 125 ether,
maxTokens: 80_000_000 * 10**18,
soldTokens: 0,
amountRaisedETH: 0,
amountRaisedUSDT: 0,
amountRaisedUSDC: 0
});
phaseDetails[SalePhase.Phase4] = PhaseDetail({
price: 66.67 ether,
maxTokens: 80_000_000 * 10**18,
soldTokens: 0,
amountRaisedETH: 0,
amountRaisedUSDT: 0,
amountRaisedUSDC: 0
});
phaseDetails[SalePhase.Phase5] = PhaseDetail({
price: 40 ether,
maxTokens: 80_000_000 * 10**18,
soldTokens: 0,
amountRaisedETH: 0,
amountRaisedUSDT: 0,
amountRaisedUSDC: 0
});
currentPhase = SalePhase.Phase1;
_referralDetails[owner()][0].purchased = true;
_referralDetails[owner()][1].purchased = true;
_referralDetails[owner()][2].purchased = true;
_referralDetails[owner()][3].purchased = true;
_referralDetails[owner()][4].purchased = true;
_referral[owner()] = owner();
}
receive() external payable {}
function getLatestPriceETH() public view returns (uint256) {
(, int256 price, , , ) = priceFeedETH.latestRoundData();
return uint256(price);
}
function buyTokenETH(address referrer) public payable {
require(CanBuy == true, "disabled");
require(currentPhase != SalePhase.Closed, "closed");
uint256 numberOfTokens = calculateTokens(0, msg.value);
PhaseDetail storage phase = phaseDetails[currentPhase];
require(
phase.soldTokens + numberOfTokens <= phase.maxTokens,
"Exceeds limit"
);
if (
referrer != address(0) &&
referrer != msg.sender &&
_referralDetails[referrer][uint256(currentPhase)].purchased
) {
if (_referral[msg.sender] == address(0)) {
_referral[msg.sender] = referrer;
}
if (_referral[msg.sender] == referrer) {
_referralDetails[referrer][uint256(currentPhase)]
.referralBonus +=
(numberOfTokens * referralPercentage) /
100;
if (!refExists[referrer]) {
referralAddrss.push(referrer);
refExists[referrer] = true;
}
}
}
allTokenPurchases.push(
TokenPurchase({
phase: uint256(currentPhase),
buyer: msg.sender,
payAmount: msg.value,
receiveToken: numberOfTokens,
timestamp: block.timestamp,
amountType: "ETH",
purchased: true,
claimed: false
})
);
_referralDetails[msg.sender][uint256(currentPhase)].purchased = true;
phase.soldTokens += numberOfTokens;
phase.amountRaisedETH += msg.value;
amountRaisedETH += msg.value;
(bool success, ) = wallet.call{value: msg.value}("");
require(success, "ETH Transfer failed");
if (phase.soldTokens >= phase.maxTokens) {
currentPhase = SalePhase.Closed;
}
}
function buyToken(
address referrer,
uint256 tokenIn,
uint256 _amount
) public {
require(CanBuy, "disabled");
require(tokenIn > 0 && tokenIn < tokenList.length, "Invalid index");
require(currentPhase != SalePhase.Closed, "closed");
require(_amount > 0, "greater than zero");
uint256 numberOfTokens = calculateTokens(tokenIn, _amount);
PhaseDetail storage phase = phaseDetails[currentPhase];
require(
phase.soldTokens + numberOfTokens <= phase.maxTokens,
"exceeds limit"
);
if (
referrer != address(0) &&
referrer != msg.sender &&
_referralDetails[referrer][uint256(currentPhase)].purchased
) {
if (_referral[msg.sender] == address(0)) {
_referral[msg.sender] = referrer;
}
if (_referral[msg.sender] == referrer) {
_referralDetails[referrer][uint256(currentPhase)]
.referralBonus +=
(numberOfTokens * referralPercentage) /
100;
if (!refExists[referrer]) {
referralAddrss.push(referrer);
refExists[referrer] = true;
}
}
}
IToken paymentToken = IToken(tokenList[tokenIn]);
require(
paymentToken.transferFrom(msg.sender, wallet, _amount),
"Payment transfer failed"
);
if (tokenIn == 1) {
phase.amountRaisedUSDT += _amount;
amountRaisedUSDT += _amount;
} else if (tokenIn == 2) {
phase.amountRaisedUSDC += _amount;
amountRaisedUSDC += _amount;
}
allTokenPurchases.push(
TokenPurchase({
phase: uint256(currentPhase),
buyer: msg.sender,
payAmount: _amount,
receiveToken: numberOfTokens,
timestamp: block.timestamp,
amountType: tokenIn == 1 ? "USDT" : "USDC",
purchased: true,
claimed: false
})
);
_referralDetails[msg.sender][uint256(currentPhase)].purchased = true;
phase.soldTokens += numberOfTokens;
if (phase.soldTokens >= phase.maxTokens) {
currentPhase = SalePhase.Closed;
}
}
function calculateTokens(uint256 _tokenIndex, uint256 _amount)
public
view
returns (uint256)
{
require(_tokenIndex < tokenList.length, "Invalid index");
uint256 tokenAmount;
if (_tokenIndex == 0) {
tokenAmount = ETHToToken(_amount);
} else {
tokenAmount = calculate(_tokenIndex, _amount);
}
return tokenAmount;
}
function ETHToToken(uint256 _amount) internal view returns (uint256) {
uint256 ETHToUsd = (_amount * getLatestPriceETH()) / (1 ether);
uint256 numberOfTokens = (ETHToUsd * phaseDetails[currentPhase].price) /
1 ether;
uint256 tokens = (numberOfTokens * (10**18)) / 1e8;
return tokens;
}
function calculate(uint256 tokenIn, uint256 _amount)
internal
view
returns (uint256)
{
IToken token = IToken(tokenList[tokenIn]);
uint8 tokenDecimals = token.decimals();
uint256 totalTokens = (_amount * phaseDetails[currentPhase].price) /
(10**tokenDecimals);
uint256 tokens = (totalTokens * (10**18)) / (1 ether);
return tokens;
}
function setReferralPercentage(uint256 _referralPercentage)
external
onlyOwner
{
referralPercentage = _referralPercentage;
}
function getTotalTokensSold() external view returns (uint256) {
uint256 totalSoldTokens = 0;
for (uint8 i = 0; i <= uint8(SalePhase.Closed); i++) {
totalSoldTokens += phaseDetails[SalePhase(i)].soldTokens;
}
return totalSoldTokens;
}
function setBuying(bool enable) external onlyOwner {
require(enable != CanBuy, "Already in that state");
CanBuy = enable;
}
function withdrawETH(uint256 amount) external onlyOwner {
require(amount <= address(this).balance, "Insufficient balance");
payable(msg.sender).transfer(amount);
}
function withdrawTokens(address _tokenAddress, uint256 _amount)
external
onlyOwner
{
IToken token = IToken(_tokenAddress);
require(
token.balanceOf(address(this)) >= _amount,
"Insufficient balance"
);
token.transfer(owner(), _amount);
}
function updateToken(uint256 index, address newToken) external onlyOwner {
require(index < tokenList.length, "Index out of bounds");
tokenList[index] = newToken;
}
function getTokenListLength() external view returns (uint256) {
return tokenList.length;
}
function setPhase(SalePhase _phase) external onlyOwner {
require(_phase != currentPhase, "Already in that phase");
currentPhase = _phase;
}
function getActivePhase() external view returns (SalePhase) {
return currentPhase;
}
function closePhase(SalePhase _phase) external onlyOwner {
require(_phase != SalePhase.Closed, "Phase is already closed");
currentPhase = SalePhase.Closed;
}
function setWallet(address payable newWallet) external onlyOwner {
wallet = newWallet;
}
function setPhasePrice(SalePhase _phase, uint256 _price)
external
onlyOwner
{
phaseDetails[_phase].price = _price;
}
function setPhaseMaxTokens(SalePhase _phase, uint256 _maxTokens)
external
onlyOwner
{
phaseDetails[_phase].maxTokens = _maxTokens;
}
function setPriceFeed(address _priceFeed) external onlyOwner {
priceFeedETH = AggregatorV3Interface(_priceFeed);
}
function getPhaseDetails(SalePhase _phase)
external
view
returns (
uint256 _price,
uint256 _maxTokens,
uint256 _soldTokens,
uint256 _amountRaisedETH,
uint256 _amountRaisedusdt,
uint256 _amountRaisedUSDC
)
{
PhaseDetail memory phase = phaseDetails[_phase];
return (
phase.price,
phase.maxTokens,
phase.soldTokens,
phase.amountRaisedETH,
phase.amountRaisedUSDT,
phase.amountRaisedUSDC
);
}
function getAllTokenPurchases()
public
view
returns (TokenPurchase[] memory)
{
return allTokenPurchases;
}
function getReferralDetails()
external
view
returns (
address[] memory refAddresses,
referralDetails[] memory userRefDetails
)
{
uint256 totalReferrals = referralAddrss.length;
refAddresses = new address[](totalReferrals);
userRefDetails = new referralDetails[](totalReferrals);
for (uint256 i = 0; i < totalReferrals; i++) {
address refAddress = referralAddrss[i];
refAddresses[i] = refAddress;
userRefDetails[i] = _referralDetails[refAddress][0];
}
return (refAddresses, userRefDetails);
}
function getUserData()
external
view
returns (address[] memory users, uint256[] memory totalTokens)
{
address[] memory tempUsers = new address[](allTokenPurchases.length);
uint256[] memory tempTotals = new uint256[](allTokenPurchases.length);
uint256 uniqueUserCount = 0;
for (uint256 i = 0; i < allTokenPurchases.length; i++) {
TokenPurchase memory purchase = allTokenPurchases[i];
uint256 referralBonus = _referralDetails[purchase.buyer][
purchase.phase
].referralBonus;
bool isExistingUser = false;
for (uint256 j = 0; j < uniqueUserCount; j++) {
if (tempUsers[j] == purchase.buyer) {
tempTotals[j] += purchase.receiveToken;
isExistingUser = true;
break;
}
}
if (!isExistingUser) {
tempUsers[uniqueUserCount] = purchase.buyer;
tempTotals[uniqueUserCount] =
purchase.receiveToken +
referralBonus;
uniqueUserCount++;
}
}
users = new address[](uniqueUserCount);
totalTokens = new uint256[](uniqueUserCount);
for (uint256 i = 0; i < uniqueUserCount; i++) {
users[i] = tempUsers[i];
totalTokens[i] = tempTotals[i];
}
}
}
Read Contract
CanBuy 0xd4c7f20c → bool
_referral 0xa20dda2c → address
_referralDetails 0xbce4a668 → bool, uint256
allTokenPurchases 0x11e79a15 → uint256, address, uint256, uint256, uint256, string, bool, bool
amountRaisedETH 0xd4b9a383 → uint256
amountRaisedUSDC 0x1626bf01 → uint256
amountRaisedUSDT 0x405fb944 → uint256
calculateTokens 0x903cc583 → uint256
getActivePhase 0x1ce97fd1 → uint8
getAllTokenPurchases 0xcea2d018 → tuple[]
getLatestPriceETH 0x6e34d929 → uint256
getPhaseDetails 0x3e251e35 → uint256, uint256, uint256, uint256, uint256, uint256
getReferralDetails 0x8d17feb9 → address[], tuple[]
getTokenListLength 0x5719dd22 → uint256
getTotalTokensSold 0x94c33163 → uint256
getUserData 0x22e8c87d → address[], uint256[]
owner 0x8da5cb5b → address
priceFeedETH 0xeff69172 → address
referralAddrss 0x6a2810a6 → address
referralPercentage 0x96ea8b9c → uint256
tokenList 0x9ead7222 → address
wallet 0x521eb273 → address
Write Contract 15 functions
These functions modify contract state and require a wallet transaction to execute.
buyToken 0xe671499b
address referrer
uint256 tokenIn
uint256 _amount
buyTokenETH 0x8c819aa6
address referrer
closePhase 0x9fdca0ca
uint8 _phase
renounceOwnership 0x715018a6
No parameters
setBuying 0xf6222807
bool enable
setPhase 0xc03afb59
uint8 _phase
setPhaseMaxTokens 0x4b570348
uint8 _phase
uint256 _maxTokens
setPhasePrice 0x70ab730f
uint8 _phase
uint256 _price
setPriceFeed 0x724e78da
address _priceFeed
setReferralPercentage 0xa0311bd4
uint256 _referralPercentage
setWallet 0xdeaa59df
address newWallet
transferOwnership 0xf2fde38b
address newOwner
updateToken 0x53dfb1be
uint256 index
address newToken
withdrawETH 0xf14210a6
uint256 amount
withdrawTokens 0x06b091f9
address _tokenAddress
uint256 _amount
Recent Transactions
No transactions found for this address