Address Contract Partially Verified
Address
0x2D4e9a41225042eD13111754b96da0b0f9dec92C
Balance
0 ETH
Nonce
1
Code Size
19789 bytes
Creator
0xEd24aC5E...5eED at tx 0xf976bc70...7c4f53
Indexed Transactions
0
Contract Bytecode
19789 bytes
0x608060405260043610610203575f3560e01c80637dc304e611610117578063bf4b19901161009f578063d87854b31161006e578063d87854b314610732578063e1b106901461075c578063ee3743ab14610772578063f2fde38b1461079c578063f33261ac146107c457610203565b8063bf4b19901461068b578063c22ba0ef146106b5578063c8910913146106cb578063d095362f1461070a57610203565b80639721d6ad116100e65780639721d6ad14610599578063a158657c146105c3578063a9fca6a0146105eb578063bc0547e314610627578063bc84b7951461066357610203565b80637dc304e6146104de5780638291a0981461051f5780638da5cb5b1461054757806391cec0a21461057157610203565b8063427c0c7f1161019a5780636970e2bb116101695780636970e2bb146103ff5780636c7835f21461043c578063741bef1a14610464578063780223b61461048e5780637bc1f8f5146104b657610203565b8063427c0c7f14610367578063444aa92f146103915780634864d8d9146103ad5780635ff0b400146103d757610203565b80632f48ab7d116101d65780632f48ab7d146102c057806336965d02146102ea578063372500ab14610327578063397643631461033d57610203565b806304b99f27146102075780630ec32977146102445780630f035c531461025a5780631c22454214610296575b5f80fd5b348015610212575f80fd5b5061022d600480360381019061022891906132fe565b6107ee565b60405161023b929190613338565b60405180910390f35b34801561024f575f80fd5b5061025861085e565b005b348015610265575f80fd5b50610280600480360381019061027b91906132fe565b610aa5565b60405161028d91906133e7565b60405180910390f35b3480156102a1575f80fd5b506102aa610b0b565b6040516102b79190613400565b60405180910390f35b3480156102cb575f80fd5b506102d4610b22565b6040516102e19190613493565b60405180910390f35b3480156102f5575f80fd5b50610310600480360381019061030b91906132fe565b610b47565b60405161031e929190613338565b60405180910390f35b348015610332575f80fd5b5061033b610b95565b005b348015610348575f80fd5b50610351610d2f565b60405161035e9190613400565b60405180910390f35b348015610372575f80fd5b5061037b610d3b565b6040516103889190613400565b60405180910390f35b6103ab60048036038101906103a691906134e7565b610d41565b005b3480156103b8575f80fd5b506103c1610f12565b6040516103ce9190613400565b60405180910390f35b3480156103e2575f80fd5b506103fd60048036038101906103f89190613512565b610f18565b005b34801561040a575f80fd5b506104256004803603810190610420919061368c565b61112f565b604051610433929190613338565b60405180910390f35b348015610447575f80fd5b50610462600480360381019061045d91906136d3565b611167565b005b34801561046f575f80fd5b506104786112bb565b6040516104859190613757565b60405180910390f35b348015610499575f80fd5b506104b460048036038101906104af9190613512565b6112e0565b005b3480156104c1575f80fd5b506104dc60048036038101906104d791906132fe565b6115b3565b005b3480156104e9575f80fd5b5061050460048036038101906104ff91906132fe565b611722565b60405161051696959493929190613770565b60405180910390f35b34801561052a575f80fd5b50610545600480360381019061054091906137cf565b61175a565b005b348015610552575f80fd5b5061055b61187d565b604051610568919061382e565b60405180910390f35b34801561057c575f80fd5b5061059760048036038101906105929190613847565b6118a5565b005b3480156105a4575f80fd5b506105ad6119c3565b6040516105ba9190613493565b60405180910390f35b3480156105ce575f80fd5b506105e960048036038101906105e49190613512565b6119e8565b005b3480156105f6575f80fd5b50610611600480360381019061060c919061368c565b611ba6565b60405161061e91906138e0565b60405180910390f35b348015610632575f80fd5b5061064d600480360381019061064891906132fe565b611bf1565b60405161065a9190613400565b60405180910390f35b34801561066e575f80fd5b5061068960048036038101906106849190613512565b611d87565b005b348015610696575f80fd5b5061069f611f3e565b6040516106ac9190613400565b60405180910390f35b3480156106c0575f80fd5b506106c961202d565b005b3480156106d6575f80fd5b506106f160048036038101906106ec91906134e7565b6120e6565b6040516107019493929190613913565b60405180910390f35b348015610715575f80fd5b50610730600480360381019061072b9190613512565b61211e565b005b34801561073d575f80fd5b50610746612597565b6040516107539190613956565b60405180910390f35b348015610767575f80fd5b506107706125a9565b005b34801561077d575f80fd5b506107866128c2565b6040516107939190613400565b60405180910390f35b3480156107a7575f80fd5b506107c260048036038101906107bd91906134e7565b6128c8565b005b3480156107cf575f80fd5b506107d8612a83565b6040516107e59190613400565b60405180910390f35b5f805f600b5f60055481526020019081526020015f209050805f0154670de0b6b3a76400008561081e919061399c565b6108289190613a0a565b92505f91505f8160020154111561085857606481600201548461084b919061399c565b6108559190613a0a565b91505b50915091565b5f600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015490505f81116108e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108db90613a94565b60405180910390fd5b5f600b5f60055481526020019081526020015f2090505f815f0154670de0b6b3a764000084610913919061399c565b61091d9190613a0a565b90505f600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600201819055503373ffffffffffffffffffffffffffffffffffffffff167fc7207087d1b9602815027342116944238a53ba3db91a70042ead521a6fcff5c8826040516109aa9190613afc565b60405180910390a260025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e1a7cc7a33670de0b6b3a764000084610a04919061399c565b6040518363ffffffff1660e01b8152600401610a21929190613b28565b6020604051808303815f875af1158015610a3d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a619190613b79565b610aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9790613bee565b60405180910390fd5b505050565b610aad613272565b600b5f8381526020019081526020015f206040518060c00160405290815f8201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250509050919050565b670de0b6b3a764000080610b1f919061399c565b81565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f610b52611f3e565b90505f670de0b6b3a764000080610b69919061399c565b8286610b75919061399c565b610b7f9190613a0a565b9050610b8a816107ee565b935093505050915091565b5f600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015490505f8111610c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1290613a94565b60405180910390fd5b5f610c24611f3e565b90505f81670de0b6b3a764000080610c3c919061399c565b84610c47919061399c565b610c519190613a0a565b90505f600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600201819055503373ffffffffffffffffffffffffffffffffffffffff167fc7207087d1b9602815027342116944238a53ba3db91a70042ead521a6fcff5c882604051610cde9190613c56565b60405180910390a23373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610d29573d5f803e3d5ffd5b50505050565b670de0b6b3a764000081565b60075481565b60025f5403610d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7c90613ccc565b60405180910390fd5b60025f81905550803373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df290613d34565b60405180910390fd5b60085f9054906101000a900460ff16610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4090613dc2565b60405180910390fd5b5f3411610e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8290613e2a565b60405180910390fd5b5f610e94611f3e565b90505f670de0b6b3a764000080610eab919061399c565b8234610eb7919061399c565b610ec19190613a0a565b9050610f0581346040518060400160405280600381526020017f4554480000000000000000000000000000000000000000000000000000000000815250875f612a89565b50505060015f8190555050565b60055481565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9e90613e92565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100c90613efa565b60405180910390fd5b5f8211611057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104e90613f62565b60405180910390fd5b7f294f4eca3566840efd0fe4451d539da734104020ed1588450bde20ad1bb00ed9826040516110869190613afc565b60405180910390a160025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82846040518363ffffffff1660e01b81526004016110ea929190613b28565b6020604051808303815f875af1158015611106573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061112a9190613b79565b505050565b6009818051602081018201805184825260208301602085012081835280955050505050505f91509050805f0154908060010154905082565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ed90613e92565b60405180910390fd5b81600b5f8681526020019081526020015f20600201819055505f8111156112315780600b5f8681526020019081526020015f20600101819055505b5f8311156112525782600b5f8681526020019081526020015f205f01819055505b837f8801cd9c7e0d9b0ed3a85806cd1f1890396eeb59814f915c53295614f679c6ff600b5f8781526020019081526020015f205f0154600b5f8881526020019081526020015f2060010154856040516112ad93929190613f80565b60405180910390a250505050565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461136f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136690613e92565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d490613efa565b60405180910390fd5b5f821161141f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141690613f62565b60405180910390fd5b7f294f4eca3566840efd0fe4451d539da734104020ed1588450bde20ad1bb00ed98260405161144e9190613fff565b60405180910390a15f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1633846040516024016114a2929190613b28565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161152c9190614097565b5f604051808303815f865af19150503d805f8114611565576040519150601f19603f3d011682016040523d82523d5f602084013e61156a565b606091505b50509050806115ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a5906140f7565b60405180910390fd5b505050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163990613e92565b60405180910390fd5b6005548111611686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167d9061415f565b60405180910390fd5b6001600c54611695919061417d565b81106116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd906141fa565b60405180910390fd5b806005819055506001816116ea9190614218565b6006819055506005547f03eab6a60b7fa9a8ce2e4f8516274d21fb3606afe26ba1b5bc7e487bd4a25cc660405160405180910390a250565b600b602052805f5260405f205f91509050805f0154908060010154908060020154908060030154908060040154908060050154905086565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e090613e92565b60405180910390fd5b5f831161182b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182290614295565b60405180910390fd5b5f821161186d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611864906142fd565b60405180910390fd5b611878838383613104565b505050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192b90613e92565b60405180910390fd5b5f8111611976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196d90614365565b60405180910390fd5b60405180604001604052808381526020018281525060098460405161199b91906143c7565b90815260200160405180910390205f820151815f015560208201518160010155905050505050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6e90613e92565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adc90613efa565b60405180910390fd5b5f8211611b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1e90613f62565b60405180910390fd5b7f294f4eca3566840efd0fe4451d539da734104020ed1588450bde20ad1bb00ed982604051611b569190613c56565b60405180910390a18073ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f19350505050158015611ba1573d5f803e3d5ffd5b505050565b611bae6132a2565b600982604051611bbe91906143c7565b90815260200160405180910390206040518060400160405290815f82015481526020016001820154815250509050919050565b5f6009604051611c0090614427565b90815260200160405180910390205f01548210611c555760646009604051611c2790614427565b90815260200160405180910390206001015483611c44919061399c565b611c4e9190613a0a565b9050611d82565b6009604051611c6390614485565b90815260200160405180910390205f01548210611cb85760646009604051611c8a90614485565b90815260200160405180910390206001015483611ca7919061399c565b611cb19190613a0a565b9050611d82565b6009604051611cc6906144e3565b90815260200160405180910390205f01548210611d1b5760646009604051611ced906144e3565b90815260200160405180910390206001015483611d0a919061399c565b611d149190613a0a565b9050611d82565b6009604051611d2990614541565b90815260200160405180910390205f01548210611d7e5760646009604051611d5090614541565b90815260200160405180910390206001015483611d6d919061399c565b611d779190613a0a565b9050611d82565b5f90505b919050565b60025f5403611dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc290613ccc565b60405180910390fd5b60025f8190555060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5890613e92565b60405180910390fd5b60085f9054906101000a900460ff16611eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea690613dc2565b60405180910390fd5b5f8211611ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee89061459f565b60405180910390fd5b611f3382836040518060400160405280600481526020017f55534454000000000000000000000000000000000000000000000000000000008152505f85612a89565b60015f819055505050565b5f8060045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611faa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fce9190614643565b5050509150505f8113612016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200d90614704565b60405180910390fd5b6402540be40081612027919061399c565b91505090565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b390613e92565b60405180910390fd5b60085f9054906101000a900460ff161560085f6101000a81548160ff021916908315150217905550565b600a602052805f5260405f205f91509050805f015490806001015490806002015490806003015f9054906101000a900460ff16905084565b60025f5403612162576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215990613ccc565b60405180910390fd5b60025f81905550803373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036121d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cf90613d34565b60405180910390fd5b60085f9054906101000a900460ff16612226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221d90613dc2565b60405180910390fd5b5f8311612268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225f9061459f565b60405180910390fd5b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016122c5929190614722565b602060405180830381865afa1580156122e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123049190614749565b905080841115612349576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612340906147e4565b60405180910390fd5b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16333060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123ee573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124129190614838565b600a61241e9190614992565b88612429919061399c565b60405160240161243b939291906149dc565b6040516020818303038152906040527f23b872dd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516124c59190614097565b5f604051808303815f865af19150503d805f81146124fe576040519150601f19603f3d011682016040523d82523d5f602084013e612503565b606091505b5050905080612547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253e90614a5b565b60405180910390fd5b61258985866040518060400160405280600481526020017f5553445400000000000000000000000000000000000000000000000000000000815250875f612a89565b50505060015f819055505050565b60085f9054906101000a900460ff1681565b5f600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015490505f811161262f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262690613a94565b60405180910390fd5b5f600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600201819055503373ffffffffffffffffffffffffffffffffffffffff167fc7207087d1b9602815027342116944238a53ba3db91a70042ead521a6fcff5c8826040516126ba9190613fff565b60405180910390a25f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163360035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612766573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061278a9190614838565b600a6127969190614992565b846127a1919061399c565b6040516024016127b2929190613b28565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161283c9190614097565b5f604051808303815f865af19150503d805f8114612875576040519150601f19603f3d011682016040523d82523d5f602084013e61287a565b606091505b50509050806128be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b590614ac3565b60405180910390fd5b5050565b60065481565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294e90613e92565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036129c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129bc90614b2b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a38060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b5f80612a94876107ee565b915091505f600b5f60055481526020019081526020015f2090505f8284612abb9190614218565b90508160010154841115612cd9575f826001015490506064836002015482612ae3919061399c565b612aed9190613a0a565b93505f835f015482612aff919061399c565b90505f670de0b6b3a764000082612b169190613a0a565b8c612b21919061417d565b90505f856001018190555082856003015f828254612b3f9190614218565b92505081905550670de0b6b3a764000082612b5a9190613a0a565b856004015f828254612b6c9190614218565b9250508190555085856005015f828254612b869190614218565b92505081905550612b956131db565b5f600b5f60055481526020019081526020015f2090505f815f0154670de0b6b3a764000084612bc4919061399c565b612bce9190613a0a565b90508082600101541015612c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0e90614b93565b60405180910390fd5b808260010154612c27919061417d565b82600101819055505f6064836002015483612c42919061399c565b612c4c9190613a0a565b905081836003015f828254612c619190614218565b9250508190555080836005015f828254612c7b9190614218565b9250508190555083836004015f828254612c959190614218565b9250508190555080898388612caa9190614218565b612cb49190614218565b612cbe9190614218565b96508186612ccc9190614218565b9950505050505050612d63565b83826001015f828254612cec919061417d565b9250508190555083826003015f828254612d069190614218565b9250508190555088826004015f828254612d209190614218565b9250508190555082826005015f828254612d3a9190614218565b925050819055505f826001015411612d6257600c546006541015612d6157612d606131db565b5b5b5b8860075f828254612d749190614218565b925050819055505f8073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603612db757339050612dbb565b8590505b89600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f828254612e099190614218565b9250508190555081600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015f828254612e5f9190614218565b925050819055506001600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206003015f6101000a81548160ff0219169083151502179055506005548173ffffffffffffffffffffffffffffffffffffffff167f0f4d35027858b49dd6528229c6f1e3730ea0e0354584dd4484e8654e886b792c8c858c604051612f0b93929190614be9565b60405180910390a35f73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161461300a575f612f508b611bf1565b90505f8111156130085780600a5f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015f828254612fa99190614218565b925050819055506005548273ffffffffffffffffffffffffffffffffffffffff167f92125e7a7a19d9944f684f8c643be37764c5f47c5e67dee98154800e21f3773b8a8e8a86604051612fff9493929190614c25565b60405180910390a35b505b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e1a7cc7a82670de0b6b3a76400008561305c919061399c565b6040518363ffffffff1660e01b8152600401613079929190613b28565b6020604051808303815f875af1158015613095573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130b99190613b79565b6130f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ef90613bee565b60405180910390fd5b50505050505050505050565b6040518060c001604052808481526020018381526020018281526020015f81526020015f81526020015f815250600b5f600c5481526020019081526020015f205f820151815f01556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050600c547fa2d152469ed23350eee02ba88bb41deb4e4762688d2b0d7496d6552cd11604d68484846040516131b793929190613f80565b60405180910390a2600c5f8154809291906131d190614c68565b9190505550505050565b600c5460065410613221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321890614cf9565b60405180910390fd5b60065460058190555060065f81548092919061323c90614c68565b91905055506005547f03eab6a60b7fa9a8ce2e4f8516274d21fb3606afe26ba1b5bc7e487bd4a25cc660405160405180910390a2565b6040518060c001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b60405180604001604052805f81526020015f81525090565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b6132dd816132cb565b81146132e7575f80fd5b50565b5f813590506132f8816132d4565b92915050565b5f60208284031215613313576133126132c3565b5b5f613320848285016132ea565b91505092915050565b613332816132cb565b82525050565b5f60408201905061334b5f830185613329565b6133586020830184613329565b9392505050565b613368816132cb565b82525050565b60c082015f8201516133825f85018261335f565b506020820151613395602085018261335f565b5060408201516133a8604085018261335f565b5060608201516133bb606085018261335f565b5060808201516133ce608085018261335f565b5060a08201516133e160a085018261335f565b50505050565b5f60c0820190506133fa5f83018461336e565b92915050565b5f6020820190506134135f830184613329565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f61345b61345661345184613419565b613438565b613419565b9050919050565b5f61346c82613441565b9050919050565b5f61347d82613462565b9050919050565b61348d81613473565b82525050565b5f6020820190506134a65f830184613484565b92915050565b5f6134b682613419565b9050919050565b6134c6816134ac565b81146134d0575f80fd5b50565b5f813590506134e1816134bd565b92915050565b5f602082840312156134fc576134fb6132c3565b5b5f613509848285016134d3565b91505092915050565b5f8060408385031215613528576135276132c3565b5b5f613535858286016132ea565b9250506020613546858286016134d3565b9150509250929050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61359e82613558565b810181811067ffffffffffffffff821117156135bd576135bc613568565b5b80604052505050565b5f6135cf6132ba565b90506135db8282613595565b919050565b5f67ffffffffffffffff8211156135fa576135f9613568565b5b61360382613558565b9050602081019050919050565b828183375f83830152505050565b5f61363061362b846135e0565b6135c6565b90508281526020810184848401111561364c5761364b613554565b5b613657848285613610565b509392505050565b5f82601f83011261367357613672613550565b5b813561368384826020860161361e565b91505092915050565b5f602082840312156136a1576136a06132c3565b5b5f82013567ffffffffffffffff8111156136be576136bd6132c7565b5b6136ca8482850161365f565b91505092915050565b5f805f80608085870312156136eb576136ea6132c3565b5b5f6136f8878288016132ea565b9450506020613709878288016132ea565b935050604061371a878288016132ea565b925050606061372b878288016132ea565b91505092959194509250565b5f61374182613462565b9050919050565b61375181613737565b82525050565b5f60208201905061376a5f830184613748565b92915050565b5f60c0820190506137835f830189613329565b6137906020830188613329565b61379d6040830187613329565b6137aa6060830186613329565b6137b76080830185613329565b6137c460a0830184613329565b979650505050505050565b5f805f606084860312156137e6576137e56132c3565b5b5f6137f3868287016132ea565b9350506020613804868287016132ea565b9250506040613815868287016132ea565b9150509250925092565b613828816134ac565b82525050565b5f6020820190506138415f83018461381f565b92915050565b5f805f6060848603121561385e5761385d6132c3565b5b5f84013567ffffffffffffffff81111561387b5761387a6132c7565b5b6138878682870161365f565b9350506020613898868287016132ea565b92505060406138a9868287016132ea565b9150509250925092565b604082015f8201516138c75f85018261335f565b5060208201516138da602085018261335f565b50505050565b5f6040820190506138f35f8301846138b3565b92915050565b5f8115159050919050565b61390d816138f9565b82525050565b5f6080820190506139265f830187613329565b6139336020830186613329565b6139406040830185613329565b61394d6060830184613904565b95945050505050565b5f6020820190506139695f830184613904565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6139a6826132cb565b91506139b1836132cb565b92508282026139bf816132cb565b915082820484148315176139d6576139d561396f565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613a14826132cb565b9150613a1f836132cb565b925082613a2f57613a2e6139dd565b5b828204905092915050565b5f82825260208201905092915050565b7f4e6f207265776172647320666f756e642e0000000000000000000000000000005f82015250565b5f613a7e601183613a3a565b9150613a8982613a4a565b602082019050919050565b5f6020820190508181035f830152613aab81613a72565b9050919050565b7f45444d00000000000000000000000000000000000000000000000000000000005f82015250565b5f613ae6600383613a3a565b9150613af182613ab2565b602082019050919050565b5f604082019050613b0f5f830184613329565b8181036020830152613b2081613ada565b905092915050565b5f604082019050613b3b5f83018561381f565b613b486020830184613329565b9392505050565b613b58816138f9565b8114613b62575f80fd5b50565b5f81519050613b7381613b4f565b92915050565b5f60208284031215613b8e57613b8d6132c3565b5b5f613b9b84828501613b65565b91505092915050565b7f546f6b656e207472616e73666572206661696c656400000000000000000000005f82015250565b5f613bd8601583613a3a565b9150613be382613ba4565b602082019050919050565b5f6020820190508181035f830152613c0581613bcc565b9050919050565b7f45544800000000000000000000000000000000000000000000000000000000005f82015250565b5f613c40600383613a3a565b9150613c4b82613c0c565b602082019050919050565b5f604082019050613c695f830184613329565b8181036020830152613c7a81613c34565b905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f613cb6601f83613a3a565b9150613cc182613c82565b602082019050919050565b5f6020820190508181035f830152613ce381613caa565b9050919050565b7f53656c662d726566657272616c206973206e6f7420616c6c6f776564000000005f82015250565b5f613d1e601c83613a3a565b9150613d2982613cea565b602082019050919050565b5f6020820190508181035f830152613d4b81613d12565b9050919050565b7f50757263686173696e672069732063757272656e746c7920756e617661696c615f8201527f626c652e00000000000000000000000000000000000000000000000000000000602082015250565b5f613dac602483613a3a565b9150613db782613d52565b604082019050919050565b5f6020820190508181035f830152613dd981613da0565b9050919050565b7f43616e6e6f742073656e642030204554480000000000000000000000000000005f82015250565b5f613e14601183613a3a565b9150613e1f82613de0565b602082019050919050565b5f6020820190508181035f830152613e4181613e08565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613e7c602083613a3a565b9150613e8782613e48565b602082019050919050565b5f6020820190508181035f830152613ea981613e70565b9050919050565b7f41646472657373206d757374206e6f74206265203000000000000000000000005f82015250565b5f613ee4601583613a3a565b9150613eef82613eb0565b602082019050919050565b5f6020820190508181035f830152613f1181613ed8565b9050919050565b7f416d6f756e74206d757374206e6f7420626520300000000000000000000000005f82015250565b5f613f4c601483613a3a565b9150613f5782613f18565b602082019050919050565b5f6020820190508181035f830152613f7981613f40565b9050919050565b5f606082019050613f935f830186613329565b613fa06020830185613329565b613fad6040830184613329565b949350505050565b7f55534454000000000000000000000000000000000000000000000000000000005f82015250565b5f613fe9600483613a3a565b9150613ff482613fb5565b602082019050919050565b5f6040820190506140125f830184613329565b818103602083015261402381613fdd565b905092915050565b5f81519050919050565b5f81905092915050565b5f5b8381101561405c578082015181840152602081019050614041565b5f8484015250505050565b5f6140718261402b565b61407b8185614035565b935061408b81856020860161403f565b80840191505092915050565b5f6140a28284614067565b915081905092915050565b7f55534454205472616e73666572206661696c65640000000000000000000000005f82015250565b5f6140e1601483613a3a565b91506140ec826140ad565b602082019050919050565b5f6020820190508181035f83015261410e816140d5565b9050919050565b7f43616e6e6f742061637469766174652070726576696f757320737461676573005f82015250565b5f614149601f83613a3a565b915061415482614115565b602082019050919050565b5f6020820190508181035f8301526141768161413d565b9050919050565b5f614187826132cb565b9150614192836132cb565b92508282039050818111156141aa576141a961396f565b5b92915050565b7f5374616765206e6f7420617661696c61626c65000000000000000000000000005f82015250565b5f6141e4601383613a3a565b91506141ef826141b0565b602082019050919050565b5f6020820190508181035f830152614211816141d8565b9050919050565b5f614222826132cb565b915061422d836132cb565b92508282019050808211156142455761424461396f565b5b92915050565b7f5072696365206d7573742062652067726561746572207468616e2030000000005f82015250565b5f61427f601c83613a3a565b915061428a8261424b565b602082019050919050565b5f6020820190508181035f8301526142ac81614273565b9050919050565b7f546f6b656e73206d7573742062652067726561746572207468616e20300000005f82015250565b5f6142e7601d83613a3a565b91506142f2826142b3565b602082019050919050565b5f6020820190508181035f830152614314816142db565b9050919050565b7f50657263656e74206d7573742067726561746572207468616e207a65726f00005f82015250565b5f61434f601e83613a3a565b915061435a8261431b565b602082019050919050565b5f6020820190508181035f83015261437c81614343565b9050919050565b5f81519050919050565b5f81905092915050565b5f6143a182614383565b6143ab818561438d565b93506143bb81856020860161403f565b80840191505092915050565b5f6143d28284614397565b915081905092915050565b7f506c6174696e756d0000000000000000000000000000000000000000000000005f82015250565b5f61441160088361438d565b915061441c826143dd565b600882019050919050565b5f61443182614405565b9150819050919050565b7f476f6c64000000000000000000000000000000000000000000000000000000005f82015250565b5f61446f60048361438d565b915061447a8261443b565b600482019050919050565b5f61448f82614463565b9150819050919050565b7f53696c76657200000000000000000000000000000000000000000000000000005f82015250565b5f6144cd60068361438d565b91506144d882614499565b600682019050919050565b5f6144ed826144c1565b9150819050919050565b7f42726f6e7a6500000000000000000000000000000000000000000000000000005f82015250565b5f61452b60068361438d565b9150614536826144f7565b600682019050919050565b5f61454b8261451f565b9150819050919050565b7f43616e6e6f742073656e642030205553445400000000000000000000000000005f82015250565b5f614589601283613a3a565b915061459482614555565b602082019050919050565b5f6020820190508181035f8301526145b68161457d565b9050919050565b5f69ffffffffffffffffffff82169050919050565b6145db816145bd565b81146145e5575f80fd5b50565b5f815190506145f6816145d2565b92915050565b5f819050919050565b61460e816145fc565b8114614618575f80fd5b50565b5f8151905061462981614605565b92915050565b5f8151905061463d816132d4565b92915050565b5f805f805f60a0868803121561465c5761465b6132c3565b5b5f614669888289016145e8565b955050602061467a8882890161461b565b945050604061468b8882890161462f565b935050606061469c8882890161462f565b92505060806146ad888289016145e8565b9150509295509295909350565b7f496e76616c6964204554482070726963650000000000000000000000000000005f82015250565b5f6146ee601183613a3a565b91506146f9826146ba565b602082019050919050565b5f6020820190508181035f83015261471b816146e2565b9050919050565b5f6040820190506147355f83018561381f565b614742602083018461381f565b9392505050565b5f6020828403121561475e5761475d6132c3565b5b5f61476b8482850161462f565b91505092915050565b7f4d616b65207375726520746f2061646420656e6f75676820616c6c6f77616e635f8201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b5f6147ce602183613a3a565b91506147d982614774565b604082019050919050565b5f6020820190508181035f8301526147fb816147c2565b9050919050565b5f60ff82169050919050565b61481781614802565b8114614821575f80fd5b50565b5f815190506148328161480e565b92915050565b5f6020828403121561484d5761484c6132c3565b5b5f61485a84828501614824565b91505092915050565b5f8160011c9050919050565b5f808291508390505b60018511156148b8578086048111156148945761489361396f565b5b60018516156148a35780820291505b80810290506148b185614863565b9450614878565b94509492505050565b5f826148d0576001905061498b565b816148dd575f905061498b565b81600181146148f357600281146148fd5761492c565b600191505061498b565b60ff84111561490f5761490e61396f565b5b8360020a9150848211156149265761492561396f565b5b5061498b565b5060208310610133831016604e8410600b84101617156149615782820a90508381111561495c5761495b61396f565b5b61498b565b61496e848484600161486f565b925090508184048111156149855761498461396f565b5b81810290505b9392505050565b5f61499c826132cb565b91506149a783614802565b92506149d47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846148c1565b905092915050565b5f6060820190506149ef5f83018661381f565b6149fc602083018561381f565b614a096040830184613329565b949350505050565b7f55534454207472616e73666572206661696c65640000000000000000000000005f82015250565b5f614a45601483613a3a565b9150614a5082614a11565b602082019050919050565b5f6020820190508181035f830152614a7281614a39565b9050919050565b7f436c61696d206661696c656400000000000000000000000000000000000000005f82015250565b5f614aad600c83613a3a565b9150614ab882614a79565b602082019050919050565b5f6020820190508181035f830152614ada81614aa1565b9050919050565b7f4f776e65722063616e6e6f7420626520746865207a65726f20616464726573735f82015250565b5f614b15602083613a3a565b9150614b2082614ae1565b602082019050919050565b5f6020820190508181035f830152614b4281614b09565b9050919050565b7f4e6f7420656e6f75676820746f6b656e7320696e206e657874207374616765005f82015250565b5f614b7d601f83613a3a565b9150614b8882614b49565b602082019050919050565b5f6020820190508181035f830152614baa81614b71565b9050919050565b5f614bbb82614383565b614bc58185613a3a565b9350614bd581856020860161403f565b614bde81613558565b840191505092915050565b5f606082019050614bfc5f830186613329565b614c096020830185613329565b8181036040830152614c1b8184614bb1565b9050949350505050565b5f608082019050614c385f83018761381f565b614c456020830186613329565b614c526040830185613329565b614c5f6060830184613329565b95945050505050565b5f614c72826132cb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614ca457614ca361396f565b5b600182019050919050565b7f4e6f206d6f72652073746167657320617661696c61626c6500000000000000005f82015250565b5f614ce3601883613a3a565b9150614cee82614caf565b602082019050919050565b5f6020820190508181035f830152614d1081614cd7565b905091905056fea264697066735822122087c658718a45950c4a583a8913b86392da3bf833a3551849559238b1f4925d2e64736f6c63430008170033
Verified Source Code Partial Match
Compiler: v0.8.23+commit.f704f362
EVM: shanghai
Optimization: No
emda-presale.sol 515 lines
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)
pragma solidity 0.8.23;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
// File: @chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol
// solhint-disable-next-line interface-starts-with-i
interface AggregatorV3Interface {
function decimals() external view returns (uint8);
function description() external view returns (string memory);
function version() external view returns (uint256);
function getRoundData(
uint80 _roundId
) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
function latestRoundData()
external
view
returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
}
// File: Mainnet/EDMPresaleNew.sol
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
_;
_status = _NOT_ENTERED;
}
}
abstract contract Ownable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_owner = msg.sender;
emit OwnershipTransferred(address(0), _owner);
}
modifier onlyOwner() {
require(msg.sender == _owner, "Ownable: caller is not the owner");
_;
}
function owner() public view returns (address) {
return _owner;
}
function transferOwnership(address newOwner) external onlyOwner {
require(newOwner != address(0), "Owner cannot be the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
interface CustomIER20 is IERC20Metadata {
function transferAndVest(address recipient, uint256 amount) external returns (bool);
}
contract EDMAPresale is ReentrancyGuard, Ownable {
struct PresaleStage {
uint256 pricePerToken; // Price in USD (scaled to 18 decimals)
uint256 tokensToSell; // Total tokens allocated for this stage
uint256 bonusPercentage; // Bonus percentage for this stage
uint256 tokensSold; // Total tokens sold in this stage
uint256 fundsRaised; // Total funds raised in USD for this stage
uint256 bonusGiven; // Total bonus given
}
uint256 public constant ETH_MULTIPLIER = 10**18;
uint256 public constant DOUBLE_ETH_MULTIPLIER = ETH_MULTIPLIER * ETH_MULTIPLIER;
CustomIER20 public edm; // EDMA token
CustomIER20 public usdt; // USDT token
AggregatorV3Interface public priceFeed; // Chainlink price feed for ETH/USD
uint256 public activeStage; // Active presale stage ID
uint256 public nextStage; // ID of the next presale stage
uint256 public totalFundsRaised; // Total funds raised across all stages
bool public isBuyEnabled = true;
struct RewardTier {
uint256 minAmount;
uint256 percentage;
}
mapping(string => RewardTier) public rewardTiers;
struct UserData {
uint256 investedAmountUSD;
uint256 receivedTokenAmount;
uint256 referalRewardUSDAmount;
bool didInvested;
}
mapping(address => UserData) public userData; // wallet address => user's detail
mapping(uint256 => PresaleStage) public presaleStages; // Stage ID => Stage Data
uint256 public stageCount; // Total number of stages created
event StageCreated(uint256 indexed stageId, uint256 pricePerToken, uint256 tokensToSell, uint256 bonusPercentage);
event StageUpdated(uint256 indexed stageId, uint256 pricePerToken, uint256 tokensToSell, uint256 bonusPercentage);
event TokensPurchased(address indexed buyer, uint256 indexed stageId, uint256 usdAmount, uint256 tokens, string method);
event RewardAdded(address indexed tokenBuyer, address referralAddress, uint256 indexed stageId, uint256 usdAmount, uint256 purchasedTokens, uint256 rewardAmount);
event RewardClaimed(address indexed user, uint256 claimedRewardAmount, string method);
event StageActivated(uint256 indexed stageId);
event FundsWithdrawn(uint256 amount, string method);
modifier validReferral(address referalAddress) {
require(referalAddress != msg.sender, "Self-referral is not allowed");
// require(referalAddress == address(0) || userData[referalAddress].didInvested == true, "Invalid referral");
_;
}
constructor(
address _edm,
address _usdt,
address _priceFeed
) {
require(_edm != address(0), "Invalid EDM address");
require(_usdt != address(0), "Invalid USDT token address");
require(_priceFeed != address(0), "Invalid price feed address");
edm = CustomIER20(_edm);
usdt = CustomIER20(_usdt);
priceFeed = AggregatorV3Interface(_priceFeed);
// Initialize the first two stages
_createStage(5e16, 20_000_000 , 10); // Stage 1: $0.05
// setting second stage in advance
_createStage(8e16, 20_000_000 , 5); // Stage 2: $0.08
// Set the first stage as active and the second as next
activeStage = 0;
nextStage = 1;
// set rewardtiers
rewardTiers["Platinum"] = RewardTier({minAmount: 5_000, percentage: 10});
rewardTiers["Gold"] = RewardTier({minAmount: 1_000, percentage: 7});
rewardTiers["Silver"] = RewardTier({minAmount: 100, percentage: 5});
rewardTiers["Bronze"] = RewardTier({minAmount: 10, percentage: 3});
}
function _createStage(uint256 pricePerToken, uint256 tokensToSell, uint256 bonusPercentage) internal {
presaleStages[stageCount] = PresaleStage(pricePerToken, tokensToSell, bonusPercentage, 0, 0, 0);
emit StageCreated(stageCount, pricePerToken, tokensToSell, bonusPercentage);
stageCount++;
}
function createNewStage(uint256 pricePerToken, uint256 tokensToSell, uint256 bonusPercentage) external onlyOwner {
require(pricePerToken > 0, "Price must be greater than 0");
require(tokensToSell > 0, "Tokens must be greater than 0");
_createStage(pricePerToken, tokensToSell , bonusPercentage);
}
function activateStage(uint256 stageId) external onlyOwner {
require(stageId > activeStage, "Cannot activate previous stages");
require(stageId < stageCount - 1, "Stage not available");
activeStage = stageId;
nextStage = stageId+1;
emit StageActivated(activeStage);
}
function updateStage(uint256 stageId, uint256 pricePerToken, uint256 bonusPercentage, uint256 tokensToSell) external onlyOwner {
presaleStages[stageId].bonusPercentage = bonusPercentage;
// only udpdate tokens and price if its passed.
if(tokensToSell > 0) {
presaleStages[stageId].tokensToSell = tokensToSell;
}
if(pricePerToken > 0) {
presaleStages[stageId].pricePerToken = pricePerToken;
}
emit StageUpdated(stageId, presaleStages[stageId].pricePerToken, presaleStages[stageId].tokensToSell, bonusPercentage);
}
function buyWithETH(address referalAddress) external payable nonReentrant validReferral(referalAddress) {
require(isBuyEnabled, "Purchasing is currently unavailable.");
require(msg.value > 0, "Cannot send 0 ETH");
uint256 ethPriceUSD = getETHUSDPrice();
uint256 usdAmount = (msg.value * ethPriceUSD) / (DOUBLE_ETH_MULTIPLIER);
_handlePurchase(usdAmount, msg.value, "ETH", referalAddress, address(0));
// (bool success, ) = payable(address(this)).call{value: msg.value}("");
// require(success, "ETH transfer failed");
}
function buyWithUSDT(uint256 usdtAmount, address referalAddress) external nonReentrant validReferral(referalAddress) {
require(isBuyEnabled, "Purchasing is currently unavailable.");
require(usdtAmount > 0, "Cannot send 0 USDT");
uint256 ourAllowance = usdt.allowance(msg.sender,address(this));
require(usdtAmount <= ourAllowance, "Make sure to add enough allowance");
(bool success, ) = address(usdt).call(
abi.encodeWithSignature(
"transferFrom(address,address,uint256)",
msg.sender,
address(this),
usdtAmount * (10**usdt.decimals())
)
);
require(success, "USDT transfer failed");
_handlePurchase(usdtAmount, usdtAmount, "USDT", referalAddress, address(0));
}
function sendTokenForUSDInvestment(uint256 usdtAmount, address receipentAddress) external nonReentrant onlyOwner {
require(isBuyEnabled, "Purchasing is currently unavailable.");
require(usdtAmount > 0, "Cannot send 0 USDT");
_handlePurchase(usdtAmount, usdtAmount, "USDT", address(0), receipentAddress);
}
function calculateTokenWithBnus(uint256 usdAmount) public view returns (uint256 tokensToBuy, uint256 tokenBonus) {
PresaleStage storage stage = presaleStages[activeStage];
tokensToBuy = (usdAmount * ETH_MULTIPLIER) / stage.pricePerToken;
tokenBonus = 0;
if(stage.bonusPercentage > 0) {
tokenBonus = (tokensToBuy * stage.bonusPercentage) / 100;
}
return (tokensToBuy, tokenBonus);
}
function calculateTokenWithEth(uint256 ethAmount) external view returns (uint256 tokensToBuy, uint256 tokenBonus) {
uint256 ethPriceUSD = getETHUSDPrice();
uint256 usdAmount = (ethAmount * ethPriceUSD) / (DOUBLE_ETH_MULTIPLIER);
return calculateTokenWithBnus(usdAmount);
}
function _handlePurchase(uint256 usdAmount, uint256 /*paymentAmount*/, string memory method, address referalAddress, address receipentAddress) internal {
(uint256 tokensToBuy, uint256 tokenBonus) = calculateTokenWithBnus(usdAmount);
PresaleStage storage stage = presaleStages[activeStage];
uint256 tokenWithBonus = tokensToBuy+tokenBonus;
if (tokensToBuy > stage.tokensToSell) {
uint256 tokensFromCurrentStage = stage.tokensToSell;
tokenBonus = (tokensFromCurrentStage * stage.bonusPercentage) / 100; // update bonus;
// uint256 remainingTokens = tokensToBuy - tokensFromCurrentStage;
uint256 calToken = tokensFromCurrentStage * stage.pricePerToken;
uint256 remainingUSD = usdAmount - ((calToken) / ETH_MULTIPLIER);
stage.tokensToSell = 0;
stage.tokensSold += tokensFromCurrentStage;
stage.fundsRaised += ((calToken) / ETH_MULTIPLIER);
stage.bonusGiven += tokenBonus;
_activateNextStage();
PresaleStage storage next = presaleStages[activeStage];
uint256 tokensFromNextStage = (remainingUSD * ETH_MULTIPLIER) / next.pricePerToken;
require(next.tokensToSell >= tokensFromNextStage, "Not enough tokens in next stage");
next.tokensToSell = next.tokensToSell - tokensFromNextStage;
uint nexttokenBonus = (tokensFromNextStage * next.bonusPercentage) / 100; // update bonus;
next.tokensSold += tokensFromNextStage;
next.bonusGiven += nexttokenBonus;
next.fundsRaised += remainingUSD;
// final tokens to be given
tokenWithBonus = (tokensFromCurrentStage + tokensFromNextStage + tokenBonus + nexttokenBonus);
tokensToBuy = (tokensFromCurrentStage + tokensFromNextStage);
} else {
stage.tokensToSell -= tokensToBuy;
stage.tokensSold += tokensToBuy;
stage.fundsRaised += usdAmount;
stage.bonusGiven += tokenBonus;
if(stage.tokensToSell <= 0) {
if(nextStage < stageCount) {
_activateNextStage();
}
}
}
totalFundsRaised += usdAmount;
// update Stats
address edmReceipentAddress;
if(receipentAddress == address(0)) {
edmReceipentAddress = msg.sender;
} else {
edmReceipentAddress = receipentAddress;
}
userData[edmReceipentAddress].investedAmountUSD += usdAmount;
userData[edmReceipentAddress].receivedTokenAmount += tokenWithBonus;
userData[edmReceipentAddress].didInvested = true;
emit TokensPurchased(edmReceipentAddress, activeStage, usdAmount, tokenWithBonus, method);
// check and generate reward for refferal user.
if(referalAddress != address(0)) {
uint256 rewardAmount = _calculateRewards(usdAmount);
if(rewardAmount > 0) {
userData[referalAddress].referalRewardUSDAmount += rewardAmount;
emit RewardAdded(edmReceipentAddress, referalAddress, activeStage, usdAmount, tokensToBuy, rewardAmount);
}
}
require(edm.transferAndVest(edmReceipentAddress, tokenWithBonus*ETH_MULTIPLIER), "Token transfer failed");
}
function claimUsdtRewards() external {
uint256 usdAmount = userData[msg.sender].referalRewardUSDAmount;
require(usdAmount > 0, "No rewards found.");
userData[msg.sender].referalRewardUSDAmount = 0;
emit RewardClaimed(msg.sender, usdAmount, "USDT");
(bool success, ) = address(usdt).call(
abi.encodeWithSignature(
"transfer(address,uint256)",
msg.sender,
usdAmount* (10**usdt.decimals())
)
);
require(success, "Claim failed");
// require(usdt.transfer(msg.sender, usdAmount* (10**usdt.decimals())), "Claim failed");
}
function claimTokenRewards() external {
uint256 usdAmount = userData[msg.sender].referalRewardUSDAmount;
require(usdAmount > 0, "No rewards found.");
PresaleStage storage stage = presaleStages[activeStage];
uint256 tokensToReward = (usdAmount * ETH_MULTIPLIER) / stage.pricePerToken;
userData[msg.sender].referalRewardUSDAmount = 0;
emit RewardClaimed(msg.sender, tokensToReward, "EDM");
require(edm.transferAndVest(msg.sender, tokensToReward*ETH_MULTIPLIER), "Token transfer failed");
}
function claimRewards() external {
uint256 usdAmount = userData[msg.sender].referalRewardUSDAmount;
require(usdAmount > 0, "No rewards found.");
uint256 ethPriceUSD = getETHUSDPrice();
uint256 ethAmount = (usdAmount * (DOUBLE_ETH_MULTIPLIER) ) / ethPriceUSD;
userData[msg.sender].referalRewardUSDAmount = 0;
emit RewardClaimed(msg.sender, ethAmount, "ETH");
payable(msg.sender).transfer(ethAmount);
}
function _calculateRewards(uint256 usdAmount) public view returns(uint256) {
if (usdAmount >= rewardTiers["Platinum"].minAmount) {
return (usdAmount * rewardTiers["Platinum"].percentage) / 100; // 10% reward for Platinum
} else if (usdAmount >= rewardTiers["Gold"].minAmount) {
return (usdAmount * rewardTiers["Gold"].percentage) / 100; // 7% reward for Gold
} else if (usdAmount >= rewardTiers["Silver"].minAmount) {
return (usdAmount * rewardTiers["Silver"].percentage) / 100; // 5% reward for Silver
} else if (usdAmount >= rewardTiers["Bronze"].minAmount) {
return (usdAmount * rewardTiers["Bronze"].percentage) / 100; // 3% reward for Bronze
} else {
return 0; // No reward for amounts less than $100
}
}
function updateRewardTier(string memory tierName, uint256 minAmount, uint256 percentage) public onlyOwner {
require(percentage > 0, "Percent must greater than zero");
rewardTiers[tierName] = RewardTier({minAmount: minAmount, percentage: percentage});
}
function _activateNextStage() internal {
require(nextStage < stageCount, "No more stages available");
activeStage = nextStage;
nextStage++;
emit StageActivated(activeStage);
}
function getPreSaleStage(uint256 stageId) public view returns (PresaleStage memory stageDetails) {
stageDetails = presaleStages[stageId];
return stageDetails;
}
function getRewardTier(string memory tier) public view returns (RewardTier memory rewardTierDetails) {
rewardTierDetails = rewardTiers[tier];
return rewardTierDetails;
}
function getETHUSDPrice() public view returns (uint256) {
(, int256 price, , , ) = priceFeed.latestRoundData();
require(price > 0, "Invalid ETH price");
return uint256(price) * 10 ** 10; // Scale to 18 decimals
}
function withdrawUSDT(uint256 amount, address fundReceiver) external onlyOwner {
require(fundReceiver != address(0), "Address must not be 0");
require(amount > 0, "Amount must not be 0");
emit FundsWithdrawn(amount, "USDT");
(bool success, ) = address(usdt).call(
abi.encodeWithSignature(
"transfer(address,uint256)",
msg.sender,
amount
)
);
require(success, "USDT Transfer failed");
// usdt.transfer(fundReceiver, amount);
}
function withdrawEDM(uint256 amount, address fundReceiver) external onlyOwner {
require(fundReceiver != address(0), "Address must not be 0");
require(amount > 0, "Amount must not be 0");
emit FundsWithdrawn(amount, "EDM");
edm.transfer(fundReceiver, amount);
}
function withdrawEth(uint256 amount, address fundReceiver) external onlyOwner {
require(fundReceiver != address(0), "Address must not be 0");
require(amount > 0, "Amount must not be 0");
emit FundsWithdrawn(amount, "ETH");
payable(fundReceiver).transfer(amount);
}
function toggleBuyEnabled() external onlyOwner {
isBuyEnabled = !isBuyEnabled;
}
}
Read Contract
DOUBLE_ETH_MULTIPLIER 0x1c224542 → uint256
ETH_MULTIPLIER 0x39764363 → uint256
_calculateRewards 0xbc0547e3 → uint256
activeStage 0x4864d8d9 → uint256
calculateTokenWithBnus 0x04b99f27 → uint256, uint256
calculateTokenWithEth 0x36965d02 → uint256, uint256
edm 0x9721d6ad → address
getETHUSDPrice 0xbf4b1990 → uint256
getPreSaleStage 0x0f035c53 → tuple
getRewardTier 0xa9fca6a0 → tuple
isBuyEnabled 0xd87854b3 → bool
nextStage 0xee3743ab → uint256
owner 0x8da5cb5b → address
presaleStages 0x7dc304e6 → uint256, uint256, uint256, uint256, uint256, uint256
priceFeed 0x741bef1a → address
rewardTiers 0x6970e2bb → uint256, uint256
stageCount 0xf33261ac → uint256
totalFundsRaised 0x427c0c7f → uint256
usdt 0x2f48ab7d → address
userData 0xc8910913 → uint256, uint256, uint256, bool
Write Contract 15 functions
These functions modify contract state and require a wallet transaction to execute.
activateStage 0x7bc1f8f5
uint256 stageId
buyWithETH 0x444aa92f
address referalAddress
buyWithUSDT 0xd095362f
uint256 usdtAmount
address referalAddress
claimRewards 0x372500ab
No parameters
claimTokenRewards 0x0ec32977
No parameters
claimUsdtRewards 0xe1b10690
No parameters
createNewStage 0x8291a098
uint256 pricePerToken
uint256 tokensToSell
uint256 bonusPercentage
sendTokenForUSDInvestment 0xbc84b795
uint256 usdtAmount
address receipentAddress
toggleBuyEnabled 0xc22ba0ef
No parameters
transferOwnership 0xf2fde38b
address newOwner
updateRewardTier 0x91cec0a2
string tierName
uint256 minAmount
uint256 percentage
updateStage 0x6c7835f2
uint256 stageId
uint256 pricePerToken
uint256 bonusPercentage
uint256 tokensToSell
withdrawEDM 0x5ff0b400
uint256 amount
address fundReceiver
withdrawEth 0xa158657c
uint256 amount
address fundReceiver
withdrawUSDT 0x780223b6
uint256 amount
address fundReceiver
Recent Transactions
No transactions found for this address