Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0xd5Fdd5E156e2D3d0F87838351e8b733b8Fd26b89
Balance 0 ETH
Nonce 1
Code Size 14968 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

14968 bytes
0x6080604052600436106102d7575f3560e01c80637f1d24c811610189578063c8f74e11116100d8578063e6ab143411610092578063f309fed91161006d578063f309fed9146109d1578063f597573f146109f0578063fb4aa0a114610a0f578063fe9f676e14610a2e575f80fd5b8063e6ab1434146108d6578063ecf5f43714610993578063f2fde38b146109b2575f80fd5b8063c8f74e1114610826578063cf87367714610845578063d01608c114610864578063d099850a14610883578063e0cef1b0146108a2578063e18e84f9146108c1575f80fd5b80639752f3cb11610143578063aa1c3aa51161011e578063aa1c3aa51461072c578063aeccf73514610741578063b04c734614610760578063b36d6919146107f8575f80fd5b80639752f3cb146106d9578063a05d03fd146106f8578063a7c601601461070d575f80fd5b80637f1d24c814610636578063833cde52146106555780638561c315146106745780638d79e66d146106935780638da5cb5b146106a85780638e15f473146106c5575f80fd5b806348bf4fcf11610245578063680f2e4f116101ff5780637108b385116101da5780637108b385146105d0578063715018a6146105e4578063718a1962146105f857806379b8d93814610617575f80fd5b8063680f2e4f146105805780636f891f821461059f5780636fb4adff146105b1575f80fd5b806348bf4fcf146104da5780634a3bf6c9146104ef5780634a6413f71461050e578063582b57231461052d57806358f985851461054c5780635dfd59f614610561575f80fd5b80632127fe04116102965780632127fe04146103b357806323b221a0146103e057806325312e54146103ff5780632ffac82c1461043657806338c67b73146104a657806339764363146104c5575f80fd5b806213eb4b146102db578062dde10e1461031e5780630d07cc301461034c5780630ec809a81461036d57806311b5444f1461038c5780631d5de91c14610394575b5f80fd5b3480156102e6575f80fd5b506103096102f53660046132e9565b600c6020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b348015610329575f80fd5b50610309610338366004613302565b60076020525f908152604090205460ff1681565b348015610357575f80fd5b5061036b6103663660046132e9565b610a4d565b005b348015610378575f80fd5b5061036b6103873660046132e9565b610a77565b610309610ae5565b34801561039f575f80fd5b5061036b6103ae366004613302565b610f94565b3480156103be575f80fd5b506103d26103cd366004613319565b610fa1565b604051908152602001610315565b3480156103eb575f80fd5b5061036b6103fa366004613302565b611070565b34801561040a575f80fd5b5060035461041e906001600160a01b031681565b6040516001600160a01b039091168152602001610315565b348015610441575f80fd5b5061047e610450366004613302565b60096020525f9081526040902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a001610315565b3480156104b1575f80fd5b5061036b6104c0366004613302565b61107e565b3480156104d0575f80fd5b506103d260135481565b3480156104e5575f80fd5b506103d260125481565b3480156104fa575f80fd5b5061036b610509366004613339565b611131565b348015610519575f80fd5b5061036b610528366004613302565b61118e565b348015610538575f80fd5b5061036b610547366004613302565b61126a565b348015610557575f80fd5b506103d2600f5481565b34801561056c575f80fd5b5061036b61057b366004613370565b6112a9565b34801561058b575f80fd5b5061036b61059a3660046133a1565b61138d565b3480156105aa575f80fd5b50426103d2565b3480156105bc575f80fd5b5061036b6105cb3660046132e9565b61140e565b3480156105db575f80fd5b5061036b611483565b3480156105ef575f80fd5b5061036b6114f9565b348015610603575f80fd5b506103d2610612366004613319565b61150c565b348015610622575f80fd5b506103d26106313660046133a1565b611553565b348015610641575f80fd5b5061036b6106503660046133d6565b61164c565b348015610660575f80fd5b5060055461041e906001600160a01b031681565b34801561067f575f80fd5b5061036b61068e3660046132e9565b61167f565b34801561069e575f80fd5b506103d260105481565b3480156106b3575f80fd5b506001546001600160a01b031661041e565b3480156106d0575f80fd5b506103d26116f4565b3480156106e4575f80fd5b5061036b6106f3366004613339565b611775565b348015610703575f80fd5b506103d260115481565b348015610718575f80fd5b50610309610727366004613302565b611864565b348015610737575f80fd5b506103d2600e5481565b34801561074c575f80fd5b5061030961075b366004613302565b611d3a565b34801561076b575f80fd5b506107c361077a3660046133a1565b600a602052815f5260405f20602052805f5260405f205f9150915050805f0154908060010154908060020154908060030154908060040154908060050154908060060154905087565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e001610315565b348015610803575f80fd5b506103096108123660046132e9565b600b6020525f908152604090205460ff1681565b348015610831575f80fd5b5061036b6108403660046134b0565b6121d6565b348015610850575f80fd5b5061036b61085f366004613579565b612335565b34801561086f575f80fd5b5061036b61087e366004613302565b612354565b34801561088e575f80fd5b5061036b61089d3660046135a2565b61241c565b3480156108ad575f80fd5b5061036b6108bc3660046135d1565b6125c7565b3480156108cc575f80fd5b506103d2600d5481565b3480156108e1575f80fd5b506109456108f0366004613302565b600860208190525f918252604090912080546001820154600283015460038401546004850154600586015460068701546007880154979098015495979496939592949193909260ff808216916101009004168a565b604080519a8b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c085015260e08401521515610100830152151561012082015261014001610315565b34801561099e575f80fd5b5061036b6109ad3660046132e9565b6125f9565b3480156109bd575f80fd5b5061036b6109cc3660046132e9565b61266e565b3480156109dc575f80fd5b506103d26109eb366004613319565b6126e4565b3480156109fb575f80fd5b5060025461041e906001600160a01b031681565b348015610a1a575f80fd5b5060065461041e906001600160a01b031681565b348015610a39575f80fd5b506103d2610a48366004613319565b612716565b610a556127a7565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b610a7f6127a7565b6005546040514281526001600160a01b038381169216907f08bc1d537b06e3eae23dbd7475fa799c807a3eab60257650edc088d96d923d4c9060200160405180910390a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b5f6011545f81118015610af9575060115481145b610b1e5760405162461bcd60e51b8152600401610b15906135fb565b60405180910390fd5b601154610b2b813461150c565b5f828152600860208190526040909120015460ff161515600114610b615760405162461bcd60e51b8152600401610b1590613627565b5f81118015610b9157505f8281526008602052604090206004810154600590910154610b8d9190613667565b8111155b610bad5760405162461bcd60e51b8152600401610b159061367a565b610bb5612801565b6013545f90610bc490806136a7565b601254610bcf6116f4565b610bd990346136a7565b610be391906136a7565b610bed91906136be565b6011545f908152600860205260409020600681015460079091015491925090610c179083906136dd565b1115610c355760405162461bcd60e51b8152600401610b15906136f0565b335f908152600b602052604090205460ff1615610c645760405162461bcd60e51b8152600401610b1590613736565b6011545f9081526007602052604090205460ff1615610c955760405162461bcd60e51b8152600401610b1590613766565b6011545f908152600860208190526040909120015460ff161515600114610cce5760405162461bcd60e51b8152600401610b159061378e565b335f908152600c602052604090205460ff16610d1157335f908152600c60205260408120805460ff19166001179055600e805491610d0b836137c5565b91905055505b5f610d1e601154836126e4565b9050601054811015610d695760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e7420616d6f756e742160601b6044820152606401610b15565b6011545f9081526008602052604081206004018054839290610d8c9084906136dd565b90915550506011545f9081526008602052604081206007018054849290610db49084906136dd565b9250508190555081600f5f828254610dcc91906136dd565b9091555050335f908152600a60209081526040808320601154845290915290206002015415610e5e57335f908152600a60209081526040808320601154845290915281206002018054839290610e239084906136dd565b9091555050335f908152600a60209081526040808320601154845290915281208054849290610e539084906136dd565b90915550610f029050565b6040518060e001604052808381526020015f81526020018281526020015f81526020015f81526020015f81526020015f815250600a5f610e9b3390565b6001600160a01b0316815260208082019290925260409081015f90812060115482528352819020835181559183015160018301558201516002820155606082015160038201556080820151600482015560a0820151600582015560c0909101516006909101555b6006546040516001600160a01b03909116903480156108fc02915f818181858888f19350505050158015610f38573d5f803e3d5ffd5b5060115460408051838152346020820152428183015290515f929133917f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d369181900360600190a4600195505050610f8e60015f55565b50505090565b610f9c6127a7565b601055565b5f828152600860205260408120600201548190610fbe90846136a7565b905060055f9054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611010573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103491906137dd565b61103f90600a6138dd565b6110476116f4565b61105191906136a7565b60135461105e90836136a7565b61106891906136be565b949350505050565b61107a3382612858565b5050565b6110866127a7565b5f818152600860205260409020600501546110d95760405162461bcd60e51b8152602060048201526013602482015272141c995cd85b1948191bdb89dd08195e1a5cdd606a1b6044820152606401610b15565b6011541561110d57601180545f908152600860208190526040808320426001909101559254825291902001805460ff191690555b5f81815260086020819052604090912042815501805460ff19166001179055601155565b6111396127a7565b5f858152600960205260409020848155600181018490556002810183905560030181905580611169846064613667565b61117391906136be565b5f958652600960205260409095206004019490945550505050565b805f8111801561119f575060115481145b6111bb5760405162461bcd60e51b8152600401610b15906135fb565b6111c36127a7565b5f8281526007602052604090205460ff16156112125760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481c185d5cd95960921b6044820152606401610b15565b5f8281526007602052604090819020805460ff191660011790555182907f927e6cd2dce24f32508868820cdc35f09d9de0f4b44e945114110125196fba9f9061125e9042815260200190565b60405180910390a25050565b6112726127a7565b6006546040516001600160a01b039091169082156108fc029083905f818181858888f1935050505015801561107a573d5f803e3d5ffd5b6112b16127a7565b60015b600d54811015611352576001600160a01b0383165f908152600c602052604090205460ff166112f55760405162461bcd60e51b8152600401610b15906138eb565b6001600160a01b038381165f908152600a6020818152604080842086855280835281852060029081018054978a1687529484528286208887528452918520909101949094559290925290558061134a816137c5565b9150506112b4565b506001600160a01b039182165f908152600c6020526040808220805460ff199081169091559290931681529190912080549091166001179055565b6113956127a7565b60065460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016020604051808303815f875af11580156113e5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611409919061391b565b505050565b6114166127a7565b6001600160a01b0381166114615760405162461bcd60e51b8152602060048201526012602482015271496e76616c696420706172616d657465727360701b6044820152606401610b15565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b60015b600d548160ff16116114f657335f908152600a6020908152604080832060ff85168452909152902060020154158015906114d0575060ff81165f9081526009602052604090205442115b156114e4576114e2338260ff16612858565b505b806114ee81613936565b915050611486565b50565b6115016127a7565b61150a5f61327d565b565b5f8060135460135461151e91906136a7565b6012546115296116f4565b61153390866136a7565b61153d91906136a7565b61154791906136be565b905061106884826126e4565b6001600160a01b0382165f908152600a602090815260408083208484528252808320815160e0810183528154815260018201549381019390935260028101549183018290526003810154606084015260048101546080840152600581015460a08401526006015460c08301526115fe5760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f20636c61696d60801b6044820152606401610b15565b6040810151806116425760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b6044820152606401610b15565b9150505b92915050565b6116546127a7565b5f91825260086020819052604090922090910180549115156101000261ff0019909216919091179055565b6116876127a7565b6001600160a01b0381166116d25760405162461bcd60e51b81526020600482015260126024820152715a65726f20746f6b656e206164647265737360701b6044820152606401610b15565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6004805460408051633fabe5a360e21b815290515f9384936001600160a01b03169263feaf968c928183019260a0928290030181865afa15801561173a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061175e919061396d565b505050915050806402540be40061164691906139b9565b61177d6127a7565b5f84116117b95760405162461bcd60e51b815260206004820152600a6024820152695a65726f20707269636560b01b6044820152606401610b15565b5f82116117fe5760405162461bcd60e51b815260206004820152601360248201527216995c9bc81d1bdad95b9cc81d1bc81cd95b1b606a1b6044820152606401610b15565b5f811161183b5760405162461bcd60e51b815260206004820152600b60248201526a05a65726f206861726361760ac1b6044820152606401610b15565b5f9485526008602052604090942060028101939093556003830191909155600582015560060155565b5f6011545f81118015611878575060115481145b6118945760405162461bcd60e51b8152600401610b15906135fb565b6011546118a181856126e4565b5f828152600860208190526040909120015460ff1615156001146118d75760405162461bcd60e51b8152600401610b1590613627565b5f8111801561190757505f82815260086020526040902060048101546005909101546119039190613667565b8111155b6119235760405162461bcd60e51b8152600401610b159061367a565b61192b612801565b6011545f9081526007602052604090205460ff161561195c5760405162461bcd60e51b8152600401610b1590613766565b6011545f908152600860208190526040909120015460ff1615156001146119955760405162461bcd60e51b8152600401610b159061378e565b335f908152600b602052604090205460ff16156119c45760405162461bcd60e51b8152600401610b1590613736565b6011545f90815260086020526040902060068101546007909101546119ea9087906136dd565b1115611a085760405162461bcd60e51b8152600401610b15906136f0565b335f908152600c602052604090205460ff16611a4b57335f908152600c60205260408120805460ff19166001179055600e805491611a45836137c5565b91905055505b5f611a58601154876126e4565b90508060085f60115481526020019081526020015f206004015f828254611a7f91906136dd565b90915550506011545f9081526008602052604081206007018054889290611aa79084906136dd565b9250508190555085600f5f828254611abf91906136dd565b9091555050601054811015611b0d5760405162461bcd60e51b815260206004820152601460248201527313195cdcc81d1a185b881b5a5b88185b5bdd5b9d60621b6044820152606401610b15565b335f908152600a60209081526040808320601154845290915290206002015415611b9a57335f908152600a60209081526040808320601154845290915281206002018054839290611b5f9084906136dd565b9091555050335f908152600a60209081526040808320601154845290915281208054889290611b8f9084906136dd565b90915550611c3e9050565b6040518060e001604052808781526020015f81526020018281526020015f81526020015f81526020015f81526020015f815250600a5f611bd73390565b6001600160a01b0316815260208082019290925260409081015f90812060115482528352819020835181559183015160018301558201516002820155606082015160038201556080820151600482015560a0820151600582015560c0909101516006909101555b6002546006546040516323b872dd60e01b81523360048201526001600160a01b039182166024820152604481018990529116906323b872dd906064016020604051808303815f875af1158015611c96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cba919061391b565b506002546011546001600160a01b0390911690335b6001600160a01b03167f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d36848a42604051611d1c939291909283526020830191909152604082015260600190565b60405180910390a46001945050611d3260015f55565b505050919050565b5f6011545f81118015611d4e575060115481145b611d6a5760405162461bcd60e51b8152600401610b15906135fb565b601154611d7781856126e4565b5f828152600860208190526040909120015460ff161515600114611dad5760405162461bcd60e51b8152600401610b1590613627565b5f81118015611ddd57505f8281526008602052604090206004810154600590910154611dd99190613667565b8111155b611df95760405162461bcd60e51b8152600401610b159061367a565b611e01612801565b6011545f9081526007602052604090205460ff1615611e325760405162461bcd60e51b8152600401610b1590613766565b6011545f908152600860208190526040909120015460ff161515600114611e6b5760405162461bcd60e51b8152600401610b159061378e565b6011545f9081526008602052604090206006810154600790910154611e919087906136dd565b1115611eaf5760405162461bcd60e51b8152600401610b15906136f0565b335f908152600b602052604090205460ff1615611ede5760405162461bcd60e51b8152600401610b1590613736565b335f908152600c602052604090205460ff16611f2157335f908152600c60205260408120805460ff19166001179055600e805491611f1b836137c5565b91905055505b5f611f2e601154876126e4565b90508060085f60115481526020019081526020015f206004015f828254611f5591906136dd565b90915550506011545f9081526008602052604081206007018054889290611f7d9084906136dd565b9250508190555085600f5f828254611f9591906136dd565b9091555050601054811015611fe35760405162461bcd60e51b815260206004820152601460248201527313195cdcc81d1a185b881b5a5b88185b5bdd5b9d60621b6044820152606401610b15565b335f908152600a6020908152604080832060115484529091529020600201541561207057335f908152600a602090815260408083206011548452909152812060020180548392906120359084906136dd565b9091555050335f908152600a602090815260408083206011548452909152812080548892906120659084906136dd565b909155506121419050565b6040518060e001604052808781526020015f81526020018281526020015f81526020015f81526020015f81526020015f815250600a5f6120ad3390565b6001600160a01b0316815260208082019290925260409081015f9081206011548252835281812084518155848401516001820155848301516002820155606085015160038201556080850151600482015560a0850151600582015560c090940151600690940193909355338352600c90915290205460ff166121415760405162461bcd60e51b8152600401610b15906138eb565b6003546006546040516323b872dd60e01b81523360048201526001600160a01b039182166024820152604481018990529116906323b872dd906064016020604051808303815f875af1158015612199573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121bd919061391b565b506003546011546001600160a01b039091169033611ccf565b6121de6127a7565b5f5b855181101561232d576040518060a00160405280868381518110612206576122066139e8565b60200260200101518152602001858381518110612225576122256139e8565b60200260200101518152602001848381518110612244576122446139e8565b60200260200101518152602001838381518110612263576122636139e8565b60200260200101518152602001838381518110612282576122826139e8565b602002602001015186848151811061229c5761229c6139e8565b602002602001015160646122b09190613667565b6122ba91906136be565b81525060095f8884815181106122d2576122d26139e8565b602002602001015181526020019081526020015f205f820151815f0155602082015181600101556040820151816002015560608201518160030155608082015181600401559050508080612325906137c5565b9150506121e0565b505050505050565b61233d6127a7565b5f9283526008602052604090922090815560010155565b805f81118015612365575060115481145b6123815760405162461bcd60e51b8152600401610b15906135fb565b6123896127a7565b5f8281526007602052604090205460ff166123d35760405162461bcd60e51b815260206004820152600a602482015269139bdd081c185d5cd95960b21b6044820152606401610b15565b5f8281526007602052604090819020805460ff191690555182907ff608654a6d8e1785594639dd55babb61d7ae157382015f904a24224e50333b1d9061125e9042815260200190565b6124246127a7565b5f84116124605760405162461bcd60e51b815260206004820152600a6024820152695a65726f20707269636560b01b6044820152606401610b15565b5f82116124a55760405162461bcd60e51b815260206004820152601360248201527216995c9bc81d1bdad95b9cc81d1bc81cd95b1b606a1b6044820152606401610b15565b600d8054905f6124b4836137c5565b909155505060408051610140810182525f8082526020808301828152838501898152606085018981526080860185815260a087018a815260c088018a815260e08901888152610100808b018a81526101208c018b8152600d80548d5260089b8c90528e8d209d518e55995160018e0155975160028d0155955160038c0155935160048b0155915160058a015551600689015551600788015590519590930180549151151590930261ff00199515159590951661ffff1990911617939093179055905491517f6a00651728a92841411081673eaa4eddbed06d102a590e050c22def40d4dd0b8916125b99186919081909283526020830191909152604082015260600190565b60405180910390a250505050565b6125cf6127a7565b6001600160a01b03919091165f908152600b60205260409020805460ff1916911515919091179055565b6126016127a7565b6001600160a01b03811661264c5760405162461bcd60e51b81526020600482015260126024820152715a65726f20746f6b656e206164647265737360701b6044820152606401610b15565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6126766127a7565b6001600160a01b0381166126db5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b15565b6114f68161327d565b6012545f8381526008602052604081206002015490919061270590846136a7565b61270f91906136be565b9392505050565b6005546040805163313ce56760e01b815290515f926001600160a01b03169163313ce5679160048083019260209291908290030181865afa15801561275d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061278191906137dd565b61278c90600a6138dd565b5f8481526008602052604090206002015461270590846136a7565b6001546001600160a01b0316331461150a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b15565b60025f54036128525760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b15565b60025f55565b335f908152600c602052604081205460ff166128865760405162461bcd60e51b8152600401610b15906138eb565b5f6128918484611553565b90505f81116128d85760405162461bcd60e51b8152602060048201526013602482015272139bc818db185a5b58589b1948185b5bdd5b9d606a1b6044820152606401610b15565b6001600160a01b0384165f908152600b602052604090205460ff16156129105760405162461bcd60e51b8152600401610b1590613736565b6005546001600160a01b03166129685760405162461bcd60e51b815260206004820152601d60248201527f50726573616c6520746f6b656e2061646472657373206e6f74207365740000006044820152606401610b15565b6005546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156129ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129d291906139fc565b811115612a2b5760405162461bcd60e51b815260206004820152602160248201527f4e6f7420656e6f75676820746f6b656e7320696e2074686520636f6e747261636044820152601d60fa1b6064820152608401610b15565b5f838152600860208190526040909120015460ff610100909104161515600114612a8d5760405162461bcd60e51b8152602060048201526013602482015272436c61696d206973206e6f7420656e61626c6560681b6044820152606401610b15565b5f838152600960205260409020544211612ae95760405162461bcd60e51b815260206004820152601f60248201527f56657374696e672074696d65206973206e6f74207374617274656420796574006044820152606401610b15565b6001600160a01b0384165f908152600a602090815260408083208684529091528120600501548103612cd0575f848152600960205260409020600101546103e890612b3490846136a7565b612b3e91906136be565b5f858152600960205260409020600301549091506103e890612b6090846136a7565b612b6a91906136be565b6001600160a01b038681165f818152600a602090815260408083208a845290915280822060060194909455600554935163a9059cbb60e01b8152600481019290925260248201859052929091169063a9059cbb906044016020604051808303815f875af1158015612bdd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c01919061391b565b905080612c205760405162461bcd60e51b8152600401610b1590613a13565b6001600160a01b0386165f908152600a6020908152604080832088845290915281206002018054849290612c55908490613667565b90915550506001600160a01b0386165f908152600a6020908152604080832088845290915281206004018054849290612c8f9084906136dd565b90915550506001600160a01b0386165f908152600a602090815260408083208884529091528120600501805491612cc5836137c5565b91905055505061322d565b6001600160a01b0385165f908152600a60209081526040808320878452909152902060068101546002909101541115612f9c575f84815260096020526040812054612d1b9042613667565b5f8681526009602052604081206002015491925090612d3a90836136be565b5f87815260096020526040902060040154909150811115612d6857505f858152600960205260409020600401545b6001600160a01b0387165f908152600a60209081526040808320898452909152812060060154612d9890836136a7565b6001600160a01b0389165f908152600a602090815260408083208b8452909152902060030154909150612dcb9082613667565b93505f8411612e1c5760405162461bcd60e51b815260206004820152601b60248201527f506c6561736520776169742074696c6c206e65787420636c61696d00000000006044820152606401610b15565b60055460405163a9059cbb60e01b81526001600160a01b038a81166004830152602482018790525f92169063a9059cbb906044016020604051808303815f875af1158015612e6c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e90919061391b565b905080612eaf5760405162461bcd60e51b8152600401610b1590613a13565b6001600160a01b0389165f908152600a602090815260408083208b845290915281206002018054879290612ee4908490613667565b90915550506001600160a01b0389165f908152600a602090815260408083208b845290915281206003018054879290612f1e9084906136dd565b90915550506001600160a01b0389165f908152600a602090815260408083208b845290915281206004018054879290612f589084906136dd565b90915550506001600160a01b0389165f908152600a602090815260408083208b84529091528120600501805491612f8e836137c5565b91905055505050505061322d565b5f84815260096020526040812054612fb49042613667565b5f8681526009602052604081206002015491925090612fd390836136be565b5f87815260096020526040902060040154909150612ff29060016136dd565b8111156131eb576001600160a01b0387165f908152600a6020908152604080832089845290915290206002015492508261306e5760405162461bcd60e51b815260206004820152601b60248201527f506c6561736520776169742074696c6c206e65787420636c61696d00000000006044820152606401610b15565b60055460405163a9059cbb60e01b81526001600160a01b038981166004830152602482018690525f92169063a9059cbb906044016020604051808303815f875af11580156130be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130e2919061391b565b9050806131015760405162461bcd60e51b8152600401610b1590613a13565b6001600160a01b0388165f908152600a602090815260408083208a845290915281206002018054869290613136908490613667565b90915550506001600160a01b0388165f908152600a602090815260408083208a8452909152812060040180548692906131709084906136dd565b90915550506001600160a01b0388165f908152600a602090815260408083208a8452909152812060030180548692906131aa9084906136dd565b90915550506001600160a01b0388165f908152600a602090815260408083208a845290915281206005018054916131e0836137c5565b91905055505061322a565b60405162461bcd60e51b81526020600482015260146024820152735761697420666f72206e65787420636c6169696d60601b6044820152606401610b15565b50505b6040805182815242602082015285916001600160a01b038816917fe49649ad7d04a14b0d2a43dae89f207c0822143ff6f88a6480e88907e4e5c548910160405180910390a3506001949350505050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b80356001600160a01b03811681146132e4575f80fd5b919050565b5f602082840312156132f9575f80fd5b61270f826132ce565b5f60208284031215613312575f80fd5b5035919050565b5f806040838503121561332a575f80fd5b50508035926020909101359150565b5f805f805f60a0868803121561334d575f80fd5b505083359560208501359550604085013594606081013594506080013592509050565b5f8060408385031215613381575f80fd5b61338a836132ce565b9150613398602084016132ce565b90509250929050565b5f80604083850312156133b2575f80fd5b6133bb836132ce565b946020939093013593505050565b80151581146114f6575f80fd5b5f80604083850312156133e7575f80fd5b8235915060208301356133f9816133c9565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112613427575f80fd5b8135602067ffffffffffffffff8083111561344457613444613404565b8260051b604051601f19603f8301168101818110848211171561346957613469613404565b604052938452858101830193838101925087851115613486575f80fd5b83870191505b848210156134a55781358352918301919083019061348c565b979650505050505050565b5f805f805f60a086880312156134c4575f80fd5b853567ffffffffffffffff808211156134db575f80fd5b6134e789838a01613418565b965060208801359150808211156134fc575f80fd5b61350889838a01613418565b9550604088013591508082111561351d575f80fd5b61352989838a01613418565b9450606088013591508082111561353e575f80fd5b61354a89838a01613418565b9350608088013591508082111561355f575f80fd5b5061356c88828901613418565b9150509295509295909350565b5f805f6060848603121561358b575f80fd5b505081359360208301359350604090920135919050565b5f805f80608085870312156135b5575f80fd5b5050823594602084013594506040840135936060013592509050565b5f80604083850312156135e2575f80fd5b6135eb836132ce565b915060208301356133f9816133c9565b602080825260129082015271125b9d985b1a59081c1c995cd85b19481a5960721b604082015260600190565b60208082526012908201527170726553416c65206e6f742041637469766560701b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561164657611646613653565b602080825260139082015272125b9d985b1a59081cd85b1948185b5bdd5b9d606a1b604082015260600190565b808202811582820484141761164657611646613653565b5f826136d857634e487b7160e01b5f52601260045260245ffd5b500490565b8082018082111561164657611646613653565b60208082526026908201527f416d6f756e742073686f756c64206265206c657373207468616e206c6566744860408201526506172646361760d41b606082015260800190565b6020808252601690820152751058d8dbdd5b9d081a5cc8189b1858dad31a5cdd195960521b604082015260600190565b6020808252600e908201526d141c995cd85b19481c185d5cd95960921b604082015260600190565b60208082526019908201527f50726573616c65206973206e6f74206163746976652079657400000000000000604082015260600190565b5f600182016137d6576137d6613653565b5060010190565b5f602082840312156137ed575f80fd5b815160ff8116811461270f575f80fd5b600181815b8085111561383757815f190482111561381d5761381d613653565b8085161561382a57918102915b93841c9390800290613802565b509250929050565b5f8261384d57506001611646565b8161385957505f611646565b816001811461386f576002811461387957613895565b6001915050611646565b60ff84111561388a5761388a613653565b50506001821b611646565b5060208310610133831016604e8410600b84101617156138b8575081810a611646565b6138c283836137fd565b805f19048211156138d5576138d5613653565b029392505050565b5f61270f60ff84168361383f565b602080825260169082015275155cd95c881b9bdd0818481c185c9d1a58da5c185b9d60521b604082015260600190565b5f6020828403121561392b575f80fd5b815161270f816133c9565b5f60ff821660ff810361394b5761394b613653565b60010192915050565b805169ffffffffffffffffffff811681146132e4575f80fd5b5f805f805f60a08688031215613981575f80fd5b61398a86613954565b94506020860151935060408601519250606086015191506139ad60808701613954565b90509295509295909350565b8082025f8212600160ff1b841416156139d4576139d4613653565b818105831482151761164657611646613653565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613a0c575f80fd5b5051919050565b602080825260159082015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b60408201526060019056fea2646970667358221220fc7d2b63adf86d214922cbc8df3389cbef8f5f73e8efd3ac102ed9a97f704a1764736f6c63430008140033

Verified Source Code Partial Match

Compiler: v0.8.20+commit.a1b79de6 EVM: shanghai Optimization: Yes (200 runs)
MediCoin_Presale.sol 749 lines
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        _status = _NOT_ENTERED;
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    constructor() {
        _transferOwnership(_msgSender());
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

interface IERC20 {
    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address to, uint256 amount) external returns (bool);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);
}

interface Aggregator {
    function latestRoundData()
        external
        view
        returns (
            uint80 roundId,
            int256 answer,
            uint256 startedAt,
            uint256 updatedAt,
            uint80 answeredInRound
        );
}

contract MediCoin_Presale is ReentrancyGuard, Ownable {
    IERC20Metadata public USDTInterface;
    IERC20Metadata public USDCInterface;
    Aggregator internal aggregatorInterface;
    address public SaleToken;
    address public fundReceiver;

    struct PresaleData {
        uint256 startTime;
        uint256 endTime;
        uint256 price;
        uint256 nextStagePrice;
        uint256 Sold;
        uint256 tokensToSell;
        uint256 usdHardcap;
        uint256 amountRaised;
        bool Active;
        bool isEnableClaim;
    }

    struct VestingData {
        uint256 vestingStartTime;
        uint256 initialClaimPercent;
        uint256 vestingTime;
        uint256 vestingPercentage;
        uint256 totalClaimCycles;
    }

    struct UserData {
        uint256 investedAmount;
        uint256 claimAt;
        uint256 claimAbleAmount;
        uint256 claimedVestingAmount;
        uint256 claimedAmount;
        uint256 claimCount;
        uint256 activePercentAmount;
    }

    mapping(uint256 => bool) public paused;
    mapping(uint256 => PresaleData) public presale;
    mapping(uint256 => VestingData) public vesting;
    mapping(address => mapping(uint256 => UserData)) public userClaimData;
    mapping(address => bool) public isBlackList;
    mapping(address => bool) public isExist;

    uint256 public presaleId;
    uint256 public uniqueBuyers;
    uint256 public overalllRaised;
    uint256 public MinTokenTobuy;
    uint256 public currentSale;
    uint256 public USDT_MULTIPLIER;
    uint256 public ETH_MULTIPLIER;

    uint256 initialClaimPercent;
    uint256 vestingTime;
    uint256 vestingPercentage;
    uint256 totalClaimCycles;

    event PresaleCreated(
        uint256 indexed id,
        uint256 totalTokens,
        uint256 startTime,
        uint256 endTime
    );

    event TokensBought(
        address indexed user,
        uint256 indexed id,
        address indexed purchaseToken,
        uint256 tokensBought,
        uint256 amountPaid,
        uint256 timestamp
    );

    event TokensClaimed(
        address indexed user,
        uint256 indexed id,
        uint256 amount,
        uint256 timestamp
    );

    event PresaleTokenAddressUpdated(
        address indexed prevValue,
        address indexed newValue,
        uint256 timestamp
    );

    event PresalePaused(uint256 indexed id, uint256 timestamp);
    event PresaleUnpaused(uint256 indexed id, uint256 timestamp);

    constructor(
        address _oracle,
        address _usdt,
        address _usdc,
        address _SaleToken
    ) {
        aggregatorInterface = Aggregator(_oracle);
        SaleToken = _SaleToken;
        MinTokenTobuy = 100e9;
        USDTInterface = IERC20Metadata(_usdt);
        USDCInterface = IERC20Metadata(_usdc);
        ETH_MULTIPLIER = (10**18);
        USDT_MULTIPLIER = (10**6);
        fundReceiver = msg.sender;
    }

    function createPresale(
        uint256 _price,
        uint256 _nextStagePrice,
        uint256 _tokensToSell,
        uint256 _usdHardcap
    ) external onlyOwner {
        require(_price > 0, "Zero price");
        require(_tokensToSell > 0, "Zero tokens to sell");

        presaleId++;

        presale[presaleId] = PresaleData(
            0,
            0,
            _price,
            _nextStagePrice,
            0,
            _tokensToSell,
            _usdHardcap,
            0,
            false,
            false
        );

        emit PresaleCreated(presaleId, _tokensToSell, 0, 0);
    }

    function setCurrentStage(uint256 _id) public onlyOwner {
        require(presale[_id].tokensToSell > 0, "Presale don't exist");
        if (currentSale != 0) {
            presale[currentSale].endTime = block.timestamp;
            presale[currentSale].Active = false;
        }
        presale[_id].startTime = block.timestamp;
        presale[_id].Active = true;
        currentSale = _id;
    }

    function setPresaleVesting(
        uint256[] memory _id,
        uint256[] memory vestingStartTime,
        uint256[] memory _initialClaimPercent,
        uint256[] memory _vestingTime,
        uint256[] memory _vestingPercentage
    ) public onlyOwner {
        for (uint256 i = 0; i < _id.length; i++) {
            vesting[_id[i]] = VestingData(
                vestingStartTime[i],
                _initialClaimPercent[i],
                _vestingTime[i],
                _vestingPercentage[i],
                (100 - _initialClaimPercent[i]) / _vestingPercentage[i]
            );
        }
    }

    function updatePresaleVesting(
        uint256 _id,
        uint256 _vestingStartTime,
        uint256 _initialClaimPercent,
        uint256 _vestingTime,
        uint256 _vestingPercentage
    ) public onlyOwner {
        vesting[_id].vestingStartTime = _vestingStartTime;
        vesting[_id].initialClaimPercent = _initialClaimPercent;
        vesting[_id].vestingTime = _vestingTime;
        vesting[_id].vestingPercentage = _vestingPercentage;
        vesting[_id].totalClaimCycles =
            (100 - _initialClaimPercent) /
            _vestingPercentage;
    }

    function updateClaimStatus(uint256 _id, bool _status) public onlyOwner {
        presale[_id].isEnableClaim = _status;
    }

    function updatePresale(
        uint256 _id,
        uint256 _price,
        uint256 _nextStagePrice,
        uint256 _tokensToSell,
        uint256 _Hardcap
    ) external onlyOwner {
        require(_price > 0, "Zero price");
        require(_tokensToSell > 0, "Zero tokens to sell");
        require(_Hardcap > 0, "Zero harcap");
        presale[_id].price = _price;
        presale[_id].nextStagePrice = _nextStagePrice;
        presale[_id].tokensToSell = _tokensToSell;
        presale[_id].usdHardcap = _Hardcap;
    }

    function updatePresaleTime(
        uint256 _id,
        uint256 _startTime,
        uint256 _endTime
    ) external onlyOwner {
        presale[_id].startTime = _startTime;
        presale[_id].endTime = _endTime;
    }

    function changeFundWallet(address _wallet) external onlyOwner {
        require(_wallet != address(0), "Invalid parameters");
        fundReceiver = _wallet;
    }

    function changeUSDTToken(address _newAddress) external onlyOwner {
        require(_newAddress != address(0), "Zero token address");
        USDTInterface = IERC20Metadata(_newAddress);
    }

    function changeUSDCToken(address _newAddress) external onlyOwner {
        require(_newAddress != address(0), "Zero token address");
        USDCInterface = IERC20Metadata(_newAddress);
    }

    function WithdrawTokens(address _token, uint256 amount) external onlyOwner {
        IERC20(_token).transfer(fundReceiver, amount);
    }

    function WithdrawContractFunds(uint256 amount) external onlyOwner {
        payable(fundReceiver).transfer(amount);
    }

    function ChangeTokenToSell(address _token) public onlyOwner {
        emit PresaleTokenAddressUpdated(SaleToken, _token, block.timestamp);
        SaleToken = _token;
    }

    function ChangeMinTokenToBuy(uint256 _amount) public onlyOwner {
        MinTokenTobuy = _amount;
    }

    function ChangeOracleAddress(address _oracle) public onlyOwner {
        aggregatorInterface = Aggregator(_oracle);
    }

    function pausePresale(uint256 _id) external checkPresaleId(_id) onlyOwner {
        require(!paused[_id], "Already paused");
        paused[_id] = true;
        emit PresalePaused(_id, block.timestamp);
    }

    function unPausePresale(uint256 _id)
        external
        checkPresaleId(_id)
        onlyOwner
    {
        require(paused[_id], "Not paused");
        paused[_id] = false;
        emit PresaleUnpaused(_id, block.timestamp);
    }

    function getLatestPrice() public view returns (uint256) {
        (, int256 price, , , ) = aggregatorInterface.latestRoundData();
        price = (price * (10**10));
        return uint256(price);
    }

    modifier checkPresaleId(uint256 _id) {
        require(_id > 0 && _id == currentSale, "Invalid presale id");
        _;
    }

    modifier checkSaleState(uint256 _id, uint256 amount) {
        require(presale[_id].Active == true, "preSAle not Active");
        require(
            amount > 0 &&
                amount <= presale[_id].tokensToSell - presale[_id].Sold,
            "Invalid sale amount"
        );
        _;
    }

    function changeClaimAddress(address _oldAddress, address _newWallet)
        public
        onlyOwner
    {
        for (uint256 i = 1; i < presaleId; i++) {
            require(isExist[_oldAddress], "User not a participant");
            userClaimData[_newWallet][i].claimAbleAmount = userClaimData[
                _oldAddress
            ][i].claimAbleAmount;
            userClaimData[_oldAddress][i].claimAbleAmount = 0;
        }
        isExist[_oldAddress] = false;
        isExist[_newWallet] = true;
    }

    function blackListUser(address _user, bool _value) public onlyOwner {
        isBlackList[_user] = _value;
    }

    function buyWithEth()
        external
        payable
        checkPresaleId(currentSale)
        checkSaleState(currentSale, ethToTokens(currentSale, msg.value))
        nonReentrant
        returns (bool)
    {
        uint256 usdAmount = (msg.value * getLatestPrice() * USDT_MULTIPLIER) /
            (ETH_MULTIPLIER * ETH_MULTIPLIER);
        require(
            presale[currentSale].amountRaised + usdAmount <=
                presale[currentSale].usdHardcap,
            "Amount should be less than leftHardcap"
        );
        require(!isBlackList[msg.sender], "Account is blackListed");
        require(!paused[currentSale], "Presale paused");
        require(
            presale[currentSale].Active == true,
            "Presale is not active yet"
        );
        if (!isExist[msg.sender]) {
            isExist[msg.sender] = true;
            uniqueBuyers++;
        }

        uint256 tokens = usdtToTokens(currentSale, usdAmount);
        require(tokens >= MinTokenTobuy, "Insufficient amount!");
        presale[currentSale].Sold += tokens;
        presale[currentSale].amountRaised += usdAmount;
        overalllRaised += usdAmount;

        if (userClaimData[_msgSender()][currentSale].claimAbleAmount > 0) {
            userClaimData[_msgSender()][currentSale].claimAbleAmount += tokens;
            userClaimData[_msgSender()][currentSale].investedAmount += usdAmount;
        } else {
            userClaimData[_msgSender()][currentSale] = UserData(
                usdAmount,
                0, // Last claimed at
                tokens, // total tokens to be claimed
                0, // vesting claimed amount
                0, // claimed amount
                0, // claim count
                0 // vesting percent
            );
        }

        payable(fundReceiver).transfer(msg.value);
        emit TokensBought(
            _msgSender(),
            currentSale,
            address(0),
            tokens,
            msg.value,
            block.timestamp
        );
        return true;
    }

    function ethBuyHelper(uint256 _id, uint256 amount)
        external
        view
        returns (uint256 ethAmount)
    {
        uint256 usdPrice = (amount * presale[_id].price);
        ethAmount =
            (usdPrice * ETH_MULTIPLIER) /
            (getLatestPrice() * 10**IERC20Metadata(SaleToken).decimals());
    }

    function ethToTokens(uint256 _id, uint256 amount)
        public
        view
        returns (uint256 _tokens)
    {
        uint256 usdAmount = (amount * getLatestPrice() * USDT_MULTIPLIER) /
            (ETH_MULTIPLIER * ETH_MULTIPLIER);
        _tokens = usdtToTokens(_id, usdAmount);
    }

    function buyWithUSDT(uint256 usdAmount)
        external
        checkPresaleId(currentSale)
        checkSaleState(currentSale, usdtToTokens(currentSale, usdAmount))
        nonReentrant
        returns (bool)
    {
        require(!paused[currentSale], "Presale paused");
        require(
            presale[currentSale].Active == true,
            "Presale is not active yet"
        );
        require(!isBlackList[msg.sender], "Account is blackListed");
        require(
            presale[currentSale].amountRaised + usdAmount <=
                presale[currentSale].usdHardcap,
            "Amount should be less than leftHardcap"
        );
        if (!isExist[msg.sender]) {
            isExist[msg.sender] = true;
            uniqueBuyers++;
        }
        uint256 tokens = usdtToTokens(currentSale, usdAmount);
        presale[currentSale].Sold += tokens;
        presale[currentSale].amountRaised += usdAmount;
        overalllRaised += usdAmount;
        require(tokens >= MinTokenTobuy, "Less than min amount");
        
        if (userClaimData[_msgSender()][currentSale].claimAbleAmount > 0) {
            userClaimData[_msgSender()][currentSale].claimAbleAmount += tokens;
            userClaimData[_msgSender()][currentSale].investedAmount += usdAmount;
        } else {
            userClaimData[_msgSender()][currentSale] = UserData(
                usdAmount,
                0,
                tokens,
                0,
                0,
                0,
                0
            );
        }
        USDTInterface.transferFrom(msg.sender, fundReceiver, usdAmount);
        emit TokensBought(
            _msgSender(),
            currentSale,
            address(USDTInterface),
            tokens,
            usdAmount,
            block.timestamp
        );
        return true;
    }

    function buyWithUSDC(uint256 usdAmount)
        external
        checkPresaleId(currentSale)
        checkSaleState(currentSale, usdtToTokens(currentSale, usdAmount))
        nonReentrant
        returns (bool)
    {
        require(!paused[currentSale], "Presale paused");
        require(
            presale[currentSale].Active == true,
            "Presale is not active yet"
        );
        require(
            presale[currentSale].amountRaised + usdAmount <=
                presale[currentSale].usdHardcap,
            "Amount should be less than leftHardcap"
        );
        require(!isBlackList[msg.sender], "Account is blackListed");
        if (!isExist[msg.sender]) {
            isExist[msg.sender] = true;
            uniqueBuyers++;
        }
        uint256 tokens = usdtToTokens(currentSale, usdAmount);
        presale[currentSale].Sold += tokens;
        presale[currentSale].amountRaised += usdAmount;
        overalllRaised += usdAmount;
        require(tokens >= MinTokenTobuy, "Less than min amount");
        
        if (userClaimData[_msgSender()][currentSale].claimAbleAmount > 0) {
            userClaimData[_msgSender()][currentSale].claimAbleAmount += tokens;
            userClaimData[_msgSender()][currentSale].investedAmount += usdAmount;
        } else {
            userClaimData[_msgSender()][currentSale] = UserData(
                usdAmount,
                0,
                tokens,
                0,
                0,
                0,
                0
            );
            require(isExist[_msgSender()], "User not a participant");
        }

        USDCInterface.transferFrom(msg.sender, fundReceiver, usdAmount);
        emit TokensBought(
            _msgSender(),
            currentSale,
            address(USDCInterface),
            tokens,
            usdAmount,
            block.timestamp
        );
        return true;
    }

    function usdtBuyHelper(uint256 _id, uint256 amount)
        external
        view
        returns (uint256 usdPrice)
    {
        usdPrice =
            (amount * presale[_id].price) /
            10**IERC20Metadata(SaleToken).decimals();
    }

    function usdtToTokens(uint256 _id, uint256 amount)
        public
        view
        returns (uint256 _tokens)
    {
        _tokens = (amount * presale[_id].price) / USDT_MULTIPLIER;
    }

    function claimableAmount(address user, uint256 _id)
        public
        view
        returns (uint256)
    {
        UserData memory _user = userClaimData[user][_id];

        require(_user.claimAbleAmount > 0, "Nothing to claim");
        uint256 amount = _user.claimAbleAmount;
        require(amount > 0, "Already claimed");
        return amount;
    }

    function claimMultiple() public {
        for(uint8 i=1 ; i<=presaleId ; i++){
            if(userClaimData[msg.sender][i].claimAbleAmount > 0 && 
            block.timestamp > vesting[i].vestingStartTime){
                claim(msg.sender, i);
            }
        }
    }

    function claimAmount(uint256 _id) public {
        claim(msg.sender, _id);
    }

    function claim(address _user, uint256 _id) internal returns (bool) {
        require(isExist[_msgSender()], "User not a participant");
        uint256 amount = claimableAmount(_user, _id);
        require(amount > 0, "No claimable amount");
        require(!isBlackList[_user], "Account is blackListed");
        require(SaleToken != address(0), "Presale token address not set");
        require(
            amount <= IERC20(SaleToken).balanceOf(address(this)),
            "Not enough tokens in the contract"
        );
        require((presale[_id].isEnableClaim == true), "Claim is not enable");
        require(block.timestamp > vesting[_id].vestingStartTime,"Vesting time is not started yet");
        uint256 transferAmount;
        if (userClaimData[_user][_id].claimCount == 0) {
            transferAmount =
                (amount * (vesting[_id].initialClaimPercent)) /
                1000;
            userClaimData[_user][_id].activePercentAmount =
                (amount * vesting[_id].vestingPercentage) /
                1000;
            bool status = IERC20(SaleToken).transfer(
                _user,
                transferAmount
            );
            require(status, "Token transfer failed");
            userClaimData[_user][_id].claimAbleAmount -= transferAmount;
            userClaimData[_user][_id].claimedAmount += transferAmount;
            userClaimData[_user][_id].claimCount++;
        } else if (
            userClaimData[_user][_id].claimAbleAmount >
            userClaimData[_user][_id].activePercentAmount
        ) {
            uint256 duration = block.timestamp - vesting[_id].vestingStartTime;
            uint256 multiplier = duration / vesting[_id].vestingTime;
            if (multiplier > vesting[_id].totalClaimCycles) {
                multiplier = vesting[_id].totalClaimCycles;
            }
            uint256 _amount = multiplier *
                userClaimData[_user][_id].activePercentAmount;
            transferAmount =
                _amount -
                userClaimData[_user][_id].claimedVestingAmount;
            require(transferAmount > 0, "Please wait till next claim");
            bool status = IERC20(SaleToken).transfer(
                _user,
                transferAmount
            );
            require(status, "Token transfer failed");
            userClaimData[_user][_id].claimAbleAmount -= transferAmount;
            userClaimData[_user][_id]
                .claimedVestingAmount += transferAmount;
            userClaimData[_user][_id].claimedAmount += transferAmount;
            userClaimData[_user][_id].claimCount++;
        } else {
            uint256 duration = block.timestamp - vesting[_id].vestingStartTime;
            uint256 multiplier = duration / vesting[_id].vestingTime;
            if (multiplier > vesting[_id].totalClaimCycles + 1) {
                transferAmount = userClaimData[_user][_id].claimAbleAmount;
                require(transferAmount > 0, "Please wait till next claim");
                bool status = IERC20(SaleToken).transfer(
                    _user,
                    transferAmount
                );
                require(status, "Token transfer failed");
                userClaimData[_user][_id]
                    .claimAbleAmount -= transferAmount;
                userClaimData[_user][_id].claimedAmount += transferAmount;
                userClaimData[_user][_id]
                    .claimedVestingAmount += transferAmount;
                userClaimData[_user][_id].claimCount++;
            } else {
                revert("Wait for next claiim");
            }
        }
        emit TokensClaimed(_user, _id, transferAmount, block.timestamp);
        return true;
    }

    function blockTimeStamp() public view returns(uint256) {
        return block.timestamp;
    }
}

Read Contract

ETH_MULTIPLIER 0x39764363 → uint256
MinTokenTobuy 0x8d79e66d → uint256
SaleToken 0x833cde52 → address
USDCInterface 0x25312e54 → address
USDTInterface 0xf597573f → address
USDT_MULTIPLIER 0x48bf4fcf → uint256
blockTimeStamp 0x6f891f82 → uint256
claimableAmount 0x79b8d938 → uint256
currentSale 0xa05d03fd → uint256
ethBuyHelper 0x2127fe04 → uint256
ethToTokens 0x718a1962 → uint256
fundReceiver 0xfb4aa0a1 → address
getLatestPrice 0x8e15f473 → uint256
isBlackList 0xb36d6919 → bool
isExist 0x0013eb4b → bool
overalllRaised 0x58f98585 → uint256
owner 0x8da5cb5b → address
paused 0x00dde10e → bool
presale 0xe6ab1434 → uint256, uint256, uint256, uint256, uint256, uint256, uint256, uint256, bool, bool
presaleId 0xe18e84f9 → uint256
uniqueBuyers 0xaa1c3aa5 → uint256
usdtBuyHelper 0xfe9f676e → uint256
usdtToTokens 0xf309fed9 → uint256
userClaimData 0xb04c7346 → uint256, uint256, uint256, uint256, uint256, uint256, uint256
vesting 0x2ffac82c → uint256, uint256, uint256, uint256, uint256

Write Contract 26 functions

These functions modify contract state and require a wallet transaction to execute.

ChangeMinTokenToBuy 0x1d5de91c
uint256 _amount
ChangeOracleAddress 0x0d07cc30
address _oracle
ChangeTokenToSell 0x0ec809a8
address _token
WithdrawContractFunds 0x582b5723
uint256 amount
WithdrawTokens 0x680f2e4f
address _token
uint256 amount
blackListUser 0xe0cef1b0
address _user
bool _value
buyWithEth 0x11b5444f
No parameters
returns: bool
buyWithUSDC 0xaeccf735
uint256 usdAmount
returns: bool
buyWithUSDT 0xa7c60160
uint256 usdAmount
returns: bool
changeClaimAddress 0x5dfd59f6
address _oldAddress
address _newWallet
changeFundWallet 0x6fb4adff
address _wallet
changeUSDCToken 0xecf5f437
address _newAddress
changeUSDTToken 0x8561c315
address _newAddress
claimAmount 0x23b221a0
uint256 _id
claimMultiple 0x7108b385
No parameters
createPresale 0xd099850a
uint256 _price
uint256 _nextStagePrice
uint256 _tokensToSell
uint256 _usdHardcap
pausePresale 0x4a6413f7
uint256 _id
renounceOwnership 0x715018a6
No parameters
setCurrentStage 0x38c67b73
uint256 _id
setPresaleVesting 0xc8f74e11
uint256[] _id
uint256[] vestingStartTime
uint256[] _initialClaimPercent
uint256[] _vestingTime
uint256[] _vestingPercentage
transferOwnership 0xf2fde38b
address newOwner
unPausePresale 0xd01608c1
uint256 _id
updateClaimStatus 0x7f1d24c8
uint256 _id
bool _status
updatePresale 0x9752f3cb
uint256 _id
uint256 _price
uint256 _nextStagePrice
uint256 _tokensToSell
uint256 _Hardcap
updatePresaleTime 0xcf873677
uint256 _id
uint256 _startTime
uint256 _endTime
updatePresaleVesting 0x4a3bf6c9
uint256 _id
uint256 _vestingStartTime
uint256 _initialClaimPercent
uint256 _vestingTime
uint256 _vestingPercentage

Recent Transactions

No transactions found for this address