Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 222 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Tokens | 18078079 | 475 days ago | IN | 0 ETH | 0.00328027 | ||||
Claim Tokens | 18074225 | 475 days ago | IN | 0 ETH | 0.00115358 | ||||
Claim Tokens | 18074206 | 475 days ago | IN | 0 ETH | 0.00136819 | ||||
Claim Tokens | 18074177 | 475 days ago | IN | 0 ETH | 0.00118722 | ||||
Claim Tokens | 18073808 | 475 days ago | IN | 0 ETH | 0.00171604 | ||||
Claim Tokens | 18073586 | 475 days ago | IN | 0 ETH | 0.00195469 | ||||
Claim Tokens | 18073516 | 475 days ago | IN | 0 ETH | 0.00148934 | ||||
Claim Tokens | 18073366 | 475 days ago | IN | 0 ETH | 0.00167593 | ||||
Claim Tokens | 18073187 | 475 days ago | IN | 0 ETH | 0.00239945 | ||||
Claim Tokens | 18073117 | 475 days ago | IN | 0 ETH | 0.00298349 | ||||
Claim Tokens | 18073107 | 475 days ago | IN | 0 ETH | 0.00288067 | ||||
Claim Tokens | 18072980 | 475 days ago | IN | 0 ETH | 0.0022524 | ||||
Claim Tokens | 18072953 | 475 days ago | IN | 0 ETH | 0.00197389 | ||||
Claim Tokens | 18072895 | 475 days ago | IN | 0 ETH | 0.00307021 | ||||
Claim Tokens | 18072854 | 475 days ago | IN | 0 ETH | 0.00332308 | ||||
Claim Tokens | 18072801 | 475 days ago | IN | 0 ETH | 0.00274242 | ||||
Claim Tokens | 18072793 | 475 days ago | IN | 0 ETH | 0.00309463 | ||||
Claim Tokens | 18072774 | 475 days ago | IN | 0 ETH | 0.00350748 | ||||
Claim Tokens | 18072747 | 475 days ago | IN | 0 ETH | 0.00292593 | ||||
Claim Tokens | 18072739 | 475 days ago | IN | 0 ETH | 0.00317155 | ||||
Claim Tokens | 18072690 | 475 days ago | IN | 0 ETH | 0.00428389 | ||||
Claim Tokens | 18072683 | 475 days ago | IN | 0 ETH | 0.00423873 | ||||
Claim Tokens | 18072647 | 475 days ago | IN | 0 ETH | 0.00372538 | ||||
Claim Tokens | 18072620 | 475 days ago | IN | 0 ETH | 0.00348965 | ||||
Claim Tokens | 18072574 | 475 days ago | IN | 0 ETH | 0.00165035 |
Loading...
Loading
Contract Name:
Sale
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity ^0.8.13; import "./ERC20.sol"; import "./Owned.sol"; // ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠟⠛⠛⢉⣭⡍⠉⣍⣉⣛⡻⠿⣿⡟⣸⣻⢻⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠉⢡⣤⣬⣿⠷⠒⢋⣁⣀⣉⣡⣈⡄⣀⠶⢠⡌⠍⠘⠠⢼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠋⢠⠾⣿⣿⠗⣋⣤⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣴⣫⢰⢂⣋⡄⠶⣤⡘⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢇⠤⢀⠿⣧⠟⣠⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⣄⣛⢠⣇⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠃⡞⠒⡄⣊⠵⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣌⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠃⣾⠄⠛⠐⠟⠄⣿⡿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⢈⡗⡄⠛⢀⡯⣡⠞⡣⡟⠻⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢿⡇⠊⢰⠓⠄⠁⢠⡔⠂⠔⢻⢧⣼⢿⠛⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡛⠯⠙⡟⢡⡀⠐⡀⠉⢋⡍⣠⠶⣬⠉⡬⠄⣲⣾⣿⡿⠛⡩⣹⣿⣉⢻⣛⠻⣿⣿⣷⣬⣭⣭⣭⣭⣛⠿⢿⣿⣿⣆⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡅⣯⡗⠁⠄⠋⡌⠃⣶⡆⢡⠘⢸⠈⠁⠋⠉⢻⣿⣿⣷⣿⣾⣿⠉⠁⠈⠉⠁⠄⠉⢻⣿⣷⣶⣶⣶⣭⣭⣶⣾⣿⣿⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⣛⣭⣵⣶⣶⣶⣦⣭⣅⡉⣓⣲⠄⢭⠔⠦⣤⠄⢔⠾⠠⠞⡁⣾⣵⣾⣿⣿⣿⣿⠁⠉⣴⣤⣿⣶⣶⣦⣄⣀⠘⠛⠿⢿⠟⢏⡿⠛⠿⠛⣋⣅⠉⣩⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⣡⣾⣿⣿⣷⣶⣶⣝⢿⣿⣯⣭⡂⠈⠄⣠⣥⣦⣤⣀⠁⠚⠴⠒⣒⢿⣾⣿⣿⡿⣿⠉⢸⣷⣿⣿⠏⢉⣀⣀⣀⠨⣿⣶⣤⣄⢰⣷⡅⠤⡒⠍⠭⣿⡇⣿⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢋⣾⣿⡟⣿⣿⣿⣿⣿⣿⡎⣿⣿⣿⣿⢆⣾⠟⣋⣉⠛⠻⣧⣤⠄⠕⣹⣿⣿⣾⣿⡿⣶⠿⡮⠭⠉⢡⢰⠿⠁⠈⠙⠷⠌⣿⣿⡟⣿⣿⣿⡄⠾⢹⢿⣮⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢣⣿⣿⡿⣸⣿⣿⣿⣿⣿⣿⣿⡘⣿⣿⣿⢸⣯⢺⢟⡛⠛⢇⡘⣿⠄⢺⣿⢻⣍⣿⣿⠛⢻⣶⣿⣯⣤⣮⡻⣾⣿⣿⡿⠿⠋⣿⣿⣷⣿⣿⣿⣿⣶⣄⠲⡟⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢃⣾⣿⣿⢇⣿⣿⣿⣿⣿⣿⣿⣿⣇⢻⣿⣿⠘⣿⡆⣾⣿⠄⢸⣷⣻⠄⢸⣿⡿⣿⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣶⣢⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣿⣿⡏⣾⣿⣿⣿⣸⣿⣿⣿⣿⣿⣿⣿⣿⣿⡜⣿⣿⠄⢿⣷⣾⣷⣤⣈⣿⡟⠠⠬⣿⣧⢿⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⡹⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣿⣿⠸⣿⣿⣿⡇⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⢻⣿⢸⡘⣿⣿⡿⠿⣿⣿⣀⠄⢤⠼⠛⣿⢿⣿⣿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⢻⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣿⣿⠄⣿⣿⣿⡇⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡆⣿⡈⣿⡌⣿⣥⣤⣿⡟⠉⠄⣰⢁⣰⣯⠠⠽⠏⢈⣛⢫⣣⣾⣿⣽⣿⡿⢿⣿⠿⠋⣡⣶⣶⣶⣶⡝⣿⣿⣿⣿⣿⣿⣿⡆⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣿⢣⣿⣘⣿⡏⡇⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢸⡇⢿⣇⢻⣿⣿⣿⠛⡀⡏⠩⠅⠐⡋⢐⡔⠵⢻⠭⡙⢿⢋⣧⣥⣴⠿⢛⣥⣖⣼⡿⠿⢿⣿⣿⣿⣦⣽⣟⣿⣿⣿⣿⣧⠛⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣇⣿⣿⣿⣿⡇⡇⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡎⣶⢸⣿⡇⣉⣛⢫⡀⠃⢠⡀⣍⡌⠐⠯⠌⠔⣤⣶⠗⠰⠛⠙⠄⢴⣺⠁⠐⠛⣟⢷⣤⣤⣨⣍⡻⢿⣿⣿⣿⣿⣿⣿⣿⠄⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⢸⣿⣿⣿⣿⡇⡇⡏⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⢹⢸⣿⣿⡹⠛⠌⡘⠠⠈⡤⡋⢀⡉⣭⠄⠄⡄⠄⢂⢀⠐⠐⡂⠂⢡⠐⠃⡼⠩⢀⠉⢡⣌⠙⠛⡒⡻⠿⢿⣿⣿⣿⣿⣀⢿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⢸⣿⣿⣿⣿⡇⣷⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⣿⣿⣿⣧⠛⡏⠴⠂⣄⢀⡜⡀⠷⠄⠓⠄⠐⠄⣾⣉⠻⠷⠿⣧⣶⣤⣤⣴⣶⣶⣶⣬⣿⣶⠄⠊⢹⣷⣦⣈⠻⢿⠿⣉⣾⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⢸⣿⣿⣿⣿⣷⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⢹⣿⣿⣯⠄⢻⠛⠄⠉⡄⡄⣥⡄⠘⡅⠄⠚⣤⢸⣿⡄⣿⡇⢠⣬⠙⢻⣿⣿⣿⣿⢻⣿⡟⠄⠉⣷⣽⣿⣿⣿⣷⣾⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⠸⣿⣿⣿⣿⣿⢸⡇⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠸⣿⣿⣿⣿⡜⠆⠾⠸⠁⠂⠻⠃⠼⠃⠄⠤⠉⣽⡟⣷⣌⠄⠿⣟⠼⡷⣠⣤⡍⠄⣴⣶⢰⣦⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⠄⣷⡹⢿⣿⣿⣿⡸⡇⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⢿⣿⣿⠿⠃⢾⢆⠘⡈⣴⠃⠜⣲⠃⣟⢠⠄⠉⣷⡜⢿⣷⣄⡉⠐⠶⢙⡛⣋⠄⢲⠰⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⡏⣿⣿⣿⣿⣿⣿⣿⡇⣇⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡌⢿⡏⣀⣤⡉⠘⠆⠄⣼⢡⡜⠄⠈⢠⠄⣤⠏⢉⡟⠠⣙⢿⣿⣿⣷⣦⣤⣥⣶⣿⠃⠄⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⡿⢡⣿⣿⣿⣿⣿⣿⣿⣇⣿⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣎⢷⣿⢿⡃⠃⠏⡌⢰⠈⠍⠶⢀⡄⡖⠄⣠⠆⢈⠰⠦⠒⠉⠛⠿⠿⠿⠛⣛⠁⠐⠓⣒⡿⣛⢉⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⢣⣧⠛⣿⣿⣿⣿⣿⣿⣿⣸⡟⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡎⣿⣎⣷⡤⢐⠲⡘⠟⠄⣼⠄⡄⢀⠒⠦⠰⠰⠂⠄⠉⡒⠂⠠⠄⣰⠠⠉⠉⢐⡛⣰⣶⣴⡿⣸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣸⣿⣶⣿⣿⣿⣿⣿⣿⣿⣇⣧⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣤⢻⡜⣷⡅⣶⡆⠈⣅⠁⠶⠄⠏⠉⠄⠆⠂⠤⡅⠄⡩⠘⠉⢠⡄⠄⣤⣾⣿⣿⣿⠟⣛⢐⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⡇⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢸⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⢧⢿⣧⡸⠇⡠⡄⠄⣿⡇⢠⠛⠃⠣⠄⠄⡄⠄⠜⢠⡀⠄⠄⣼⣿⣿⣿⣿⠃⣼⣿⣿⢀⣤⣤⡜⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⡇⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣏⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⢸⣿⣷⡴⣴⢋⠁⣿⠂⠄⠄⣺⢈⠹⠡⠄⣤⢸⠆⠁⣠⣾⣿⣿⣿⣿⣵⣶⠹⣭⡝⣼⣿⡿⣃⣛⠿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⡇⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣸⡝⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⢋⠒⣹⡜⣿⠁⣾⠄⠈⠄⠐⠛⢐⠄⠰⠄⠂⣨⣴⣟⣿⣿⣿⣿⣿⣿⣿⣧⣬⣼⣿⢻⣼⣿⣿⠿⣸⣿⣿⣿⣿⣿ // ⣿⣿⣿⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⢻⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢛⣘⡻⣿⣿⡀⢠⣿⠷⠏⣀⣛⣣⣴⣾⣿⣶⣔⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣛⣻⣿⣿⠿⢟⣴⣶⡌⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣎⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣛⢁⣴⣿⣿⢣⣥⣶⣶⣶⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣎⢿⣿⣿⣿⣿⣏⣙⠛⣛⣫⣭⢭⣿⣿⣶⣿⡿⠿⢣⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡎⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣿⣿⣿⢃⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣹⡜⣿⣿⣿⣿⠟⠻⡿⣛⢻⢟⣝⢿⡏⢰⠝⣿⠄⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣤⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡏⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⣿⣿⣿⠄⣬⡇⢰⡝⡇⣶⣭⡜⣿⣿⣷⢱⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⡻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢹⣿⣿⣿⣿⣿⣿⡏⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣹⠳⠯⠽⠟⣶⢿⣯⣿⣿⡇⣿⣿⡇⡸⡿⢇⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡽⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣾⣿⣿⣿⣿⣿⣿⢧⣿⣿⣿⣿⣿⣿⣿⡿⠿⣃⣵⣿⣿⣿⣿⣶⣶⣶⣝⣛⣥⣥⣨⣼⣿⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿ // ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣎⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⣼⣿⣿⣿⣿⡿⢟⣵⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ // // https://twitter.com/ZOGworldorder // https://www.zogcoin.org/ // https://t.me/zionistworldorder contract Sale is Owned { /*///////////////////////////////////////////////// EVENTS /////////////////////////////////////////////////*/ event SaleEntered(address indexed user, uint256 amount); event SaleClaimed(address indexed user, uint256 amount); event TokensSupplied(uint256 amount); event ProceedsWithdrawn(uint256 amount); /*///////////////////////////////////////////////// STATE /////////////////////////////////////////////////*/ /// @notice token being sold off ERC20 public immutable token; /// @notice if sale is live bool public saleLive; /// @notice max amount per address to mint uint256 public immutable MAX_SALE = 5 ether / 10; /// @notice maximum amount of total ether accepted for sale uint256 public constant HARDCAP = 20 ether; /// @notice internal accounting of tokens supplied to sale, can be upped before sale ends uint256 public suppliedTokens; /// @notice internal accounting of total deposits /// @dev lp may be filled before everyone has claimed, so this maintains eth proceeds accounting uint256 public totalDeposits; /// @notice total eth deposits for each address, cannot exceed MAX_SALE mapping(address => uint256) public deposits; constructor( ERC20 token_, address owner_ ) Owned(owner_) { token = token_; saleLive = true; } receive() external payable { if(isContract(msg.sender)) revert("Contracts cannot participate"); if (!saleLive) revert("sale ended"); if (deposits[msg.sender] + msg.value > MAX_SALE) revert("max sale amount"); if(HARDCAP < totalDeposits + msg.value) revert("max sale amount"); // The total supply of ether will never overflow unchecked { deposits[msg.sender] += msg.value; totalDeposits += msg.value; } emit SaleEntered(msg.sender, msg.value); } function claimTokens() external { if (saleLive) revert("sale live"); uint256 share = getCurrentShare(msg.sender); delete deposits[msg.sender]; token.transfer(msg.sender, share); emit SaleClaimed(msg.sender, share); } function getCurrentShare(address account) public view returns (uint256) { return (suppliedTokens * deposits[account]) / totalDeposits; } function supplyTokens() external onlyOwner { if (!saleLive) revert("sale ended"); suppliedTokens = token.balanceOf(address(this)); emit TokensSupplied(token.balanceOf(address(this))); } function endSale() external onlyOwner { saleLive = false; } function withdrawProceeds() external onlyOwner { emit ProceedsWithdrawn(address(this).balance); payable(owner).transfer(address(this).balance); } function isContract(address account) private view returns (bool) { uint256 size; assembly { size := extcodesize(account) } return size > 0; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @notice Simple ERC20 + EIP-2612 implementation. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/tokens/ERC20.sol) /// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol) /// Note: /// The ERC20 standard allows minting and transferring to and from the zero address, /// minting and transferring zero tokens, as well as self-approvals. /// For performance, this implementation WILL NOT revert for such actions. /// Please add any checks with overrides if desired. abstract contract ERC20 { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CUSTOM ERRORS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The total supply has overflowed. error TotalSupplyOverflow(); /// @dev The allowance has overflowed. error AllowanceOverflow(); /// @dev The allowance has underflowed. error AllowanceUnderflow(); /// @dev Insufficient balance. error InsufficientBalance(); /// @dev Insufficient allowance. error InsufficientAllowance(); /// @dev The permit is invalid. error InvalidPermit(); /// @dev The permit has expired. error PermitExpired(); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* EVENTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Emitted when `amount` tokens is transferred from `from` to `to`. event Transfer(address indexed from, address indexed to, uint256 amount); /// @dev Emitted when `amount` tokens is approved by `owner` to be used by `spender`. event Approval( address indexed owner, address indexed spender, uint256 amount ); /// @dev `keccak256(bytes("Transfer(address,address,uint256)"))`. uint256 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; /// @dev `keccak256(bytes("Approval(address,address,uint256)"))`. uint256 private constant _APPROVAL_EVENT_SIGNATURE = 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* STORAGE */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The storage slot for the total supply. uint256 private constant _TOTAL_SUPPLY_SLOT = 0x05345cdf77eb68f44c; /// @dev The balance slot of `owner` is given by: /// ``` /// mstore(0x0c, _BALANCE_SLOT_SEED) /// mstore(0x00, owner) /// let balanceSlot := keccak256(0x0c, 0x20) /// ``` uint256 private constant _BALANCE_SLOT_SEED = 0x87a211a2; /// @dev The allowance slot of (`owner`, `spender`) is given by: /// ``` /// mstore(0x20, spender) /// mstore(0x0c, _ALLOWANCE_SLOT_SEED) /// mstore(0x00, owner) /// let allowanceSlot := keccak256(0x0c, 0x34) /// ``` uint256 private constant _ALLOWANCE_SLOT_SEED = 0x7f5e9f20; /// @dev The nonce slot of `owner` is given by: /// ``` /// mstore(0x0c, _NONCES_SLOT_SEED) /// mstore(0x00, owner) /// let nonceSlot := keccak256(0x0c, 0x20) /// ``` uint256 private constant _NONCES_SLOT_SEED = 0x38377508; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* ERC20 METADATA */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Returns the name of the token. function name() public view virtual returns (string memory); /// @dev Returns the symbol of the token. function symbol() public view virtual returns (string memory); /// @dev Returns the decimals places of the token. function decimals() public view virtual returns (uint8) { return 18; } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* ERC20 */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Returns the amount of tokens in existence. function totalSupply() public view virtual returns (uint256 result) { /// @solidity memory-safe-assembly assembly { result := sload(_TOTAL_SUPPLY_SLOT) } } /// @dev Returns the amount of tokens owned by `owner`. function balanceOf( address owner ) public view virtual returns (uint256 result) { /// @solidity memory-safe-assembly assembly { mstore(0x0c, _BALANCE_SLOT_SEED) mstore(0x00, owner) result := sload(keccak256(0x0c, 0x20)) } } /// @dev Returns the amount of tokens that `spender` can spend on behalf of `owner`. function allowance( address owner, address spender ) public view virtual returns (uint256 result) { /// @solidity memory-safe-assembly assembly { mstore(0x20, spender) mstore(0x0c, _ALLOWANCE_SLOT_SEED) mstore(0x00, owner) result := sload(keccak256(0x0c, 0x34)) } } /// @dev Sets `amount` as the allowance of `spender` over the caller's tokens. /// /// Emits a {Approval} event. function approve( address spender, uint256 amount ) public virtual returns (bool) { /// @solidity memory-safe-assembly assembly { // Compute the allowance slot and store the amount. mstore(0x20, spender) mstore(0x0c, _ALLOWANCE_SLOT_SEED) mstore(0x00, caller()) sstore(keccak256(0x0c, 0x34), amount) // Emit the {Approval} event. mstore(0x00, amount) log3( 0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, caller(), shr(96, mload(0x2c)) ) } return true; } /// @dev Atomically increases the allowance granted to `spender` by the caller. /// /// Emits a {Approval} event. function increaseAllowance( address spender, uint256 difference ) public virtual returns (bool) { /// @solidity memory-safe-assembly assembly { // Compute the allowance slot and load its value. mstore(0x20, spender) mstore(0x0c, _ALLOWANCE_SLOT_SEED) mstore(0x00, caller()) let allowanceSlot := keccak256(0x0c, 0x34) let allowanceBefore := sload(allowanceSlot) // Add to the allowance. let allowanceAfter := add(allowanceBefore, difference) // Revert upon overflow. if lt(allowanceAfter, allowanceBefore) { mstore(0x00, 0xf9067066) // `AllowanceOverflow()`. revert(0x1c, 0x04) } // Store the updated allowance. sstore(allowanceSlot, allowanceAfter) // Emit the {Approval} event. mstore(0x00, allowanceAfter) log3( 0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, caller(), shr(96, mload(0x2c)) ) } return true; } /// @dev Atomically decreases the allowance granted to `spender` by the caller. /// /// Emits a {Approval} event. function decreaseAllowance( address spender, uint256 difference ) public virtual returns (bool) { /// @solidity memory-safe-assembly assembly { // Compute the allowance slot and load its value. mstore(0x20, spender) mstore(0x0c, _ALLOWANCE_SLOT_SEED) mstore(0x00, caller()) let allowanceSlot := keccak256(0x0c, 0x34) let allowanceBefore := sload(allowanceSlot) // Revert if will underflow. if lt(allowanceBefore, difference) { mstore(0x00, 0x8301ab38) // `AllowanceUnderflow()`. revert(0x1c, 0x04) } // Subtract and store the updated allowance. let allowanceAfter := sub(allowanceBefore, difference) sstore(allowanceSlot, allowanceAfter) // Emit the {Approval} event. mstore(0x00, allowanceAfter) log3( 0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, caller(), shr(96, mload(0x2c)) ) } return true; } /// @dev Transfer `amount` tokens from the caller to `to`. /// /// Requirements: /// - `from` must at least have `amount`. /// /// Emits a {Transfer} event. function transfer( address to, uint256 amount ) public virtual returns (bool) { _beforeTokenTransfer(msg.sender, to, amount); /// @solidity memory-safe-assembly assembly { // Compute the balance slot and load its value. mstore(0x0c, _BALANCE_SLOT_SEED) mstore(0x00, caller()) let fromBalanceSlot := keccak256(0x0c, 0x20) let fromBalance := sload(fromBalanceSlot) // Revert if insufficient balance. if gt(amount, fromBalance) { mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`. revert(0x1c, 0x04) } // Subtract and store the updated balance. sstore(fromBalanceSlot, sub(fromBalance, amount)) // Compute the balance slot of `to`. mstore(0x00, to) let toBalanceSlot := keccak256(0x0c, 0x20) // Add and store the updated balance of `to`. // Will not overflow because the sum of all user balances // cannot exceed the maximum uint256 value. sstore(toBalanceSlot, add(sload(toBalanceSlot), amount)) // Emit the {Transfer} event. mstore(0x20, amount) log3( 0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, caller(), shr(96, mload(0x0c)) ) } _afterTokenTransfer(msg.sender, to, amount); return true; } /// @dev Transfers `amount` tokens from `from` to `to`. /// /// Note: does not update the allowance if it is the maximum uint256 value. /// /// Requirements: /// - `from` must at least have `amount`. /// - The caller must have at least `amount` of allowance to transfer the tokens of `from`. /// /// Emits a {Transfer} event. function transferFrom( address from, address to, uint256 amount ) public virtual returns (bool) { _beforeTokenTransfer(from, to, amount); /// @solidity memory-safe-assembly assembly { let from_ := shl(96, from) // Compute the allowance slot and load its value. mstore(0x20, caller()) mstore(0x0c, or(from_, _ALLOWANCE_SLOT_SEED)) let allowanceSlot := keccak256(0x0c, 0x34) let allowance_ := sload(allowanceSlot) // If the allowance is not the maximum uint256 value. if iszero(eq(allowance_, not(0))) { // Revert if the amount to be transferred exceeds the allowance. if gt(amount, allowance_) { mstore(0x00, 0x13be252b) // `InsufficientAllowance()`. revert(0x1c, 0x04) } // Subtract and store the updated allowance. sstore(allowanceSlot, sub(allowance_, amount)) } // Compute the balance slot and load its value. mstore(0x0c, or(from_, _BALANCE_SLOT_SEED)) let fromBalanceSlot := keccak256(0x0c, 0x20) let fromBalance := sload(fromBalanceSlot) // Revert if insufficient balance. if gt(amount, fromBalance) { mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`. revert(0x1c, 0x04) } // Subtract and store the updated balance. sstore(fromBalanceSlot, sub(fromBalance, amount)) // Compute the balance slot of `to`. mstore(0x00, to) let toBalanceSlot := keccak256(0x0c, 0x20) // Add and store the updated balance of `to`. // Will not overflow because the sum of all user balances // cannot exceed the maximum uint256 value. sstore(toBalanceSlot, add(sload(toBalanceSlot), amount)) // Emit the {Transfer} event. mstore(0x20, amount) log3( 0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c)) ) } _afterTokenTransfer(from, to, amount); return true; } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* EIP-2612 */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Returns the current nonce for `owner`. /// This value is used to compute the signature for EIP-2612 permit. function nonces( address owner ) public view virtual returns (uint256 result) { /// @solidity memory-safe-assembly assembly { // Compute the nonce slot and load its value. mstore(0x0c, _NONCES_SLOT_SEED) mstore(0x00, owner) result := sload(keccak256(0x0c, 0x20)) } } /// @dev Sets `value` as the allowance of `spender` over the tokens of `owner`, /// authorized by a signed approval by `owner`. /// /// Emits a {Approval} event. function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual { bytes32 domainSeparator = DOMAIN_SEPARATOR(); /// @solidity memory-safe-assembly assembly { // Grab the free memory pointer. let m := mload(0x40) // Revert if the block timestamp greater than `deadline`. if gt(timestamp(), deadline) { mstore(0x00, 0x1a15a3cc) // `PermitExpired()`. revert(0x1c, 0x04) } // Clean the upper 96 bits. owner := shr(96, shl(96, owner)) spender := shr(96, shl(96, spender)) // Compute the nonce slot and load its value. mstore(0x0c, _NONCES_SLOT_SEED) mstore(0x00, owner) let nonceSlot := keccak256(0x0c, 0x20) let nonceValue := sload(nonceSlot) // Increment and store the updated nonce. sstore(nonceSlot, add(nonceValue, 1)) // Prepare the inner hash. // `keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)")`. // forgefmt: disable-next-item mstore( m, 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9 ) mstore(add(m, 0x20), owner) mstore(add(m, 0x40), spender) mstore(add(m, 0x60), value) mstore(add(m, 0x80), nonceValue) mstore(add(m, 0xa0), deadline) // Prepare the outer hash. mstore(0, 0x1901) mstore(0x20, domainSeparator) mstore(0x40, keccak256(m, 0xc0)) // Prepare the ecrecover calldata. mstore(0, keccak256(0x1e, 0x42)) mstore(0x20, and(0xff, v)) mstore(0x40, r) mstore(0x60, s) pop(staticcall(gas(), 1, 0, 0x80, 0x20, 0x20)) // If the ecrecover fails, the returndatasize will be 0x00, // `owner` will be be checked if it equals the hash at 0x00, // which evaluates to false (i.e. 0), and we will revert. // If the ecrecover succeeds, the returndatasize will be 0x20, // `owner` will be compared against the returned address at 0x20. if iszero(eq(mload(returndatasize()), owner)) { mstore(0x00, 0xddafbaef) // `InvalidPermit()`. revert(0x1c, 0x04) } // Compute the allowance slot and store the value. // The `owner` is already at slot 0x20. mstore(0x40, or(shl(160, _ALLOWANCE_SLOT_SEED), spender)) sstore(keccak256(0x2c, 0x34), value) // Emit the {Approval} event. log3(add(m, 0x60), 0x20, _APPROVAL_EVENT_SIGNATURE, owner, spender) mstore(0x40, m) // Restore the free memory pointer. mstore(0x60, 0) // Restore the zero pointer. } } /// @dev Returns the EIP-2612 domains separator. function DOMAIN_SEPARATOR() public view virtual returns (bytes32 result) { /// @solidity memory-safe-assembly assembly { result := mload(0x40) // Grab the free memory pointer. } // We simply calculate it on-the-fly to allow for cases where the `name` may change. bytes32 nameHash = keccak256(bytes(name())); /// @solidity memory-safe-assembly assembly { let m := result // `keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)")`. // forgefmt: disable-next-item mstore( m, 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f ) mstore(add(m, 0x20), nameHash) // `keccak256("1")`. // forgefmt: disable-next-item mstore( add(m, 0x40), 0xc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6 ) mstore(add(m, 0x60), chainid()) mstore(add(m, 0x80), address()) result := keccak256(m, 0xa0) } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* INTERNAL MINT FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Mints `amount` tokens to `to`, increasing the total supply. /// /// Emits a {Transfer} event. function _mint(address to, uint256 amount) internal virtual { _beforeTokenTransfer(address(0), to, amount); /// @solidity memory-safe-assembly assembly { let totalSupplyBefore := sload(_TOTAL_SUPPLY_SLOT) let totalSupplyAfter := add(totalSupplyBefore, amount) // Revert if the total supply overflows. if lt(totalSupplyAfter, totalSupplyBefore) { mstore(0x00, 0xe5cfe957) // `TotalSupplyOverflow()`. revert(0x1c, 0x04) } // Store the updated total supply. sstore(_TOTAL_SUPPLY_SLOT, totalSupplyAfter) // Compute the balance slot and load its value. mstore(0x0c, _BALANCE_SLOT_SEED) mstore(0x00, to) let toBalanceSlot := keccak256(0x0c, 0x20) // Add and store the updated balance. sstore(toBalanceSlot, add(sload(toBalanceSlot), amount)) // Emit the {Transfer} event. mstore(0x20, amount) log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, 0, shr(96, mload(0x0c))) } _afterTokenTransfer(address(0), to, amount); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* INTERNAL BURN FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Burns `amount` tokens from `from`, reducing the total supply. /// /// Emits a {Transfer} event. function _burn(address from, uint256 amount) internal virtual { _beforeTokenTransfer(from, address(0), amount); /// @solidity memory-safe-assembly assembly { // Compute the balance slot and load its value. mstore(0x0c, _BALANCE_SLOT_SEED) mstore(0x00, from) let fromBalanceSlot := keccak256(0x0c, 0x20) let fromBalance := sload(fromBalanceSlot) // Revert if insufficient balance. if gt(amount, fromBalance) { mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`. revert(0x1c, 0x04) } // Subtract and store the updated balance. sstore(fromBalanceSlot, sub(fromBalance, amount)) // Subtract and store the updated total supply. sstore(_TOTAL_SUPPLY_SLOT, sub(sload(_TOTAL_SUPPLY_SLOT), amount)) // Emit the {Transfer} event. mstore(0x00, amount) log3( 0x00, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, shl(96, from)), 0 ) } _afterTokenTransfer(from, address(0), amount); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* INTERNAL TRANSFER FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Moves `amount` of tokens from `from` to `to`. function _transfer( address from, address to, uint256 amount ) internal virtual { _beforeTokenTransfer(from, to, amount); /// @solidity memory-safe-assembly assembly { let from_ := shl(96, from) // Compute the balance slot and load its value. mstore(0x0c, or(from_, _BALANCE_SLOT_SEED)) let fromBalanceSlot := keccak256(0x0c, 0x20) let fromBalance := sload(fromBalanceSlot) // Revert if insufficient balance. if gt(amount, fromBalance) { mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`. revert(0x1c, 0x04) } // Subtract and store the updated balance. sstore(fromBalanceSlot, sub(fromBalance, amount)) // Compute the balance slot of `to`. mstore(0x00, to) let toBalanceSlot := keccak256(0x0c, 0x20) // Add and store the updated balance of `to`. // Will not overflow because the sum of all user balances // cannot exceed the maximum uint256 value. sstore(toBalanceSlot, add(sload(toBalanceSlot), amount)) // Emit the {Transfer} event. mstore(0x20, amount) log3( 0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c)) ) } _afterTokenTransfer(from, to, amount); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* INTERNAL ALLOWANCE FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Updates the allowance of `owner` for `spender` based on spent `amount`. function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { /// @solidity memory-safe-assembly assembly { // Compute the allowance slot and load its value. mstore(0x20, spender) mstore(0x0c, _ALLOWANCE_SLOT_SEED) mstore(0x00, owner) let allowanceSlot := keccak256(0x0c, 0x34) let allowance_ := sload(allowanceSlot) // If the allowance is not the maximum uint256 value. if iszero(eq(allowance_, not(0))) { // Revert if the amount to be transferred exceeds the allowance. if gt(amount, allowance_) { mstore(0x00, 0x13be252b) // `InsufficientAllowance()`. revert(0x1c, 0x04) } // Subtract and store the updated allowance. sstore(allowanceSlot, sub(allowance_, amount)) } } } /// @dev Sets `amount` as the allowance of `spender` over the tokens of `owner`. /// /// Emits a {Approval} event. function _approve( address owner, address spender, uint256 amount ) internal virtual { /// @solidity memory-safe-assembly assembly { let owner_ := shl(96, owner) // Compute the allowance slot and store the amount. mstore(0x20, spender) mstore(0x0c, or(owner_, _ALLOWANCE_SLOT_SEED)) sstore(keccak256(0x0c, 0x34), amount) // Emit the {Approval} event. mstore(0x00, amount) log3( 0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, shr(96, owner_), shr(96, mload(0x2c)) ) } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* HOOKS TO OVERRIDE */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Hook that is called before any transfer of tokens. /// This includes minting and burning. function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /// @dev Hook that is called after any transfer of tokens. /// This includes minting and burning. function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Simple single owner authorization mixin. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Owned.sol) abstract contract Owned { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event OwnershipTransferred(address indexed user, address indexed newOwner); /*////////////////////////////////////////////////////////////// OWNERSHIP STORAGE //////////////////////////////////////////////////////////////*/ address public owner; modifier onlyOwner() virtual { require(msg.sender == owner, "UNAUTHORIZED"); _; } /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor(address _owner) { owner = _owner; emit OwnershipTransferred(address(0), _owner); } /*////////////////////////////////////////////////////////////// OWNERSHIP LOGIC //////////////////////////////////////////////////////////////*/ function transferOwnership(address newOwner) public virtual onlyOwner { owner = newOwner; emit OwnershipTransferred(msg.sender, newOwner); } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract ERC20","name":"token_","type":"address"},{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ProceedsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SaleClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SaleEntered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensSupplied","type":"event"},{"inputs":[],"name":"HARDCAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"deposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"suppliedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawProceeds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c06040526706f05b59d3b2000060a0908152503480156200001f575f80fd5b5060405162001537380380620015378339818101604052810190620000459190620001dd565b80805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060015f60146101000a81548160ff021916908315150217905550505062000222565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000165826200013a565b9050919050565b5f620001788262000159565b9050919050565b6200018a816200016c565b811462000195575f80fd5b50565b5f81519050620001a8816200017f565b92915050565b620001b98162000159565b8114620001c4575f80fd5b50565b5f81519050620001d781620001ae565b92915050565b5f8060408385031215620001f657620001f562000136565b5b5f620002058582860162000198565b92505060206200021885828601620001c7565b9150509250929050565b60805160a0516112d7620002605f395f818161017e015261055e01525f81816106d2015281816109eb01528181610aaa0152610cfa01526112d75ff3fe6080604052600436106100e0575f3560e01c806392925c3b1161007e578063e8dda51a11610058578063e8dda51a14610493578063f2fde38b146104bd578063fc0c546a146104e5578063fc7e286d1461050f57610329565b806392925c3b14610417578063b2cb3a9b1461042d578063e081b7811461046957610329565b806348c54b9d116100ba57806348c54b9d146103975780637d882097146103ad5780638da5cb5b146103d75780639038e6931461040157610329565b8063136f3cfc1461032d578063380d831b146103575780633bd748801461036d57610329565b36610329576100ee3361054b565b1561012e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012590610d8b565b60405180910390fd5b5f60149054906101000a900460ff1661017c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017390610df3565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000003460035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546101e69190610e47565b1115610227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021e90610ec4565b60405180910390fd5b346002546102359190610e47565b6801158e460913d000001015610280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027790610ec4565b60405180910390fd5b3460035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055503460025f82825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167f1167c754441e88a212955ede9c41605458e3bfcf355e0e7aab7b9a9adbdf55f33460405161031f9190610ef1565b60405180910390a2005b5f80fd5b348015610338575f80fd5b5061034161055c565b60405161034e9190610ef1565b60405180910390f35b348015610362575f80fd5b5061036b610580565b005b348015610378575f80fd5b50610381610628565b60405161038e9190610ef1565b60405180910390f35b3480156103a2575f80fd5b506103ab610635565b005b3480156103b8575f80fd5b506103c16107bd565b6040516103ce9190610ef1565b60405180910390f35b3480156103e2575f80fd5b506103eb6107c3565b6040516103f89190610f49565b60405180910390f35b34801561040c575f80fd5b506104156107e6565b005b348015610422575f80fd5b5061042b61090e565b005b348015610438575f80fd5b50610453600480360381019061044e9190610f90565b610b57565b6040516104609190610ef1565b60405180910390f35b348015610474575f80fd5b5061047d610bb7565b60405161048a9190610fd5565b60405180910390f35b34801561049e575f80fd5b506104a7610bc9565b6040516104b49190610ef1565b60405180910390f35b3480156104c8575f80fd5b506104e360048036038101906104de9190610f90565b610bcf565b005b3480156104f0575f80fd5b506104f9610cf8565b6040516105069190611049565b60405180910390f35b34801561051a575f80fd5b5061053560048036038101906105309190610f90565b610d1c565b6040516105429190610ef1565b60405180910390f35b5f80823b90505f8111915050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461060d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610604906110ac565b60405180910390fd5b5f8060146101000a81548160ff021916908315150217905550565b6801158e460913d0000081565b5f60149054906101000a900460ff1615610684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067b90611114565b60405180910390fd5b5f61068e33610b57565b905060035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f90557f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161072b929190611132565b6020604051808303815f875af1158015610747573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061076b9190611183565b503373ffffffffffffffffffffffffffffffffffffffff167f4b8d188a88126c55c5715b63f23b66134d881f891d43cb4cbca332e0520c9a72826040516107b29190610ef1565b60405180910390a250565b60025481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086a906110ac565b60405180910390fd5b7e85f56592462784083e828817207817f9a8413860eb3c60e01ba90ce6f925d9476040516108a19190610ef1565b60405180910390a15f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f1935050505015801561090b573d5f803e3d5ffd5b50565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461099b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610992906110ac565b60405180910390fd5b5f60149054906101000a900460ff166109e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e090610df3565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a429190610f49565b602060405180830381865afa158015610a5d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a8191906111d8565b6001819055507fac3d9837a679b12a12c0a3b0d0c20e8bf132403b05d76f80de8f4aec36297ed37f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b019190610f49565b602060405180830381865afa158015610b1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4091906111d8565b604051610b4d9190610ef1565b60405180910390a1565b5f60025460035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054600154610ba69190611203565b610bb09190611271565b9050919050565b5f60149054906101000a900460ff1681565b60015481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c53906110ac565b60405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052805f5260405f205f915090505481565b5f82825260208201905092915050565b7f436f6e7472616374732063616e6e6f74207061727469636970617465000000005f82015250565b5f610d75601c83610d31565b9150610d8082610d41565b602082019050919050565b5f6020820190508181035f830152610da281610d69565b9050919050565b7f73616c6520656e646564000000000000000000000000000000000000000000005f82015250565b5f610ddd600a83610d31565b9150610de882610da9565b602082019050919050565b5f6020820190508181035f830152610e0a81610dd1565b9050919050565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610e5182610e11565b9150610e5c83610e11565b9250828201905080821115610e7457610e73610e1a565b5b92915050565b7f6d61782073616c6520616d6f756e7400000000000000000000000000000000005f82015250565b5f610eae600f83610d31565b9150610eb982610e7a565b602082019050919050565b5f6020820190508181035f830152610edb81610ea2565b9050919050565b610eeb81610e11565b82525050565b5f602082019050610f045f830184610ee2565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610f3382610f0a565b9050919050565b610f4381610f29565b82525050565b5f602082019050610f5c5f830184610f3a565b92915050565b5f80fd5b610f6f81610f29565b8114610f79575f80fd5b50565b5f81359050610f8a81610f66565b92915050565b5f60208284031215610fa557610fa4610f62565b5b5f610fb284828501610f7c565b91505092915050565b5f8115159050919050565b610fcf81610fbb565b82525050565b5f602082019050610fe85f830184610fc6565b92915050565b5f819050919050565b5f61101161100c61100784610f0a565b610fee565b610f0a565b9050919050565b5f61102282610ff7565b9050919050565b5f61103382611018565b9050919050565b61104381611029565b82525050565b5f60208201905061105c5f83018461103a565b92915050565b7f554e415554484f52495a454400000000000000000000000000000000000000005f82015250565b5f611096600c83610d31565b91506110a182611062565b602082019050919050565b5f6020820190508181035f8301526110c38161108a565b9050919050565b7f73616c65206c69766500000000000000000000000000000000000000000000005f82015250565b5f6110fe600983610d31565b9150611109826110ca565b602082019050919050565b5f6020820190508181035f83015261112b816110f2565b9050919050565b5f6040820190506111455f830185610f3a565b6111526020830184610ee2565b9392505050565b61116281610fbb565b811461116c575f80fd5b50565b5f8151905061117d81611159565b92915050565b5f6020828403121561119857611197610f62565b5b5f6111a58482850161116f565b91505092915050565b6111b781610e11565b81146111c1575f80fd5b50565b5f815190506111d2816111ae565b92915050565b5f602082840312156111ed576111ec610f62565b5b5f6111fa848285016111c4565b91505092915050565b5f61120d82610e11565b915061121883610e11565b925082820261122681610e11565b9150828204841483151761123d5761123c610e1a565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61127b82610e11565b915061128683610e11565b92508261129657611295611244565b5b82820490509291505056fea26469706673582212209fc840b1ec0f20dc85e6f134b3afad2573ade04efec4939d40ce0d9c14881adf64736f6c63430008140033000000000000000000000000c83aedf16f508539763bb7c1d86ff6f9ae97d9e3000000000000000000000000da8d92a171aa99f1feb80e95cdc7a96923984c9f
Deployed Bytecode
0x6080604052600436106100e0575f3560e01c806392925c3b1161007e578063e8dda51a11610058578063e8dda51a14610493578063f2fde38b146104bd578063fc0c546a146104e5578063fc7e286d1461050f57610329565b806392925c3b14610417578063b2cb3a9b1461042d578063e081b7811461046957610329565b806348c54b9d116100ba57806348c54b9d146103975780637d882097146103ad5780638da5cb5b146103d75780639038e6931461040157610329565b8063136f3cfc1461032d578063380d831b146103575780633bd748801461036d57610329565b36610329576100ee3361054b565b1561012e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012590610d8b565b60405180910390fd5b5f60149054906101000a900460ff1661017c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017390610df3565b60405180910390fd5b7f00000000000000000000000000000000000000000000000006f05b59d3b200003460035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546101e69190610e47565b1115610227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021e90610ec4565b60405180910390fd5b346002546102359190610e47565b6801158e460913d000001015610280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027790610ec4565b60405180910390fd5b3460035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055503460025f82825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167f1167c754441e88a212955ede9c41605458e3bfcf355e0e7aab7b9a9adbdf55f33460405161031f9190610ef1565b60405180910390a2005b5f80fd5b348015610338575f80fd5b5061034161055c565b60405161034e9190610ef1565b60405180910390f35b348015610362575f80fd5b5061036b610580565b005b348015610378575f80fd5b50610381610628565b60405161038e9190610ef1565b60405180910390f35b3480156103a2575f80fd5b506103ab610635565b005b3480156103b8575f80fd5b506103c16107bd565b6040516103ce9190610ef1565b60405180910390f35b3480156103e2575f80fd5b506103eb6107c3565b6040516103f89190610f49565b60405180910390f35b34801561040c575f80fd5b506104156107e6565b005b348015610422575f80fd5b5061042b61090e565b005b348015610438575f80fd5b50610453600480360381019061044e9190610f90565b610b57565b6040516104609190610ef1565b60405180910390f35b348015610474575f80fd5b5061047d610bb7565b60405161048a9190610fd5565b60405180910390f35b34801561049e575f80fd5b506104a7610bc9565b6040516104b49190610ef1565b60405180910390f35b3480156104c8575f80fd5b506104e360048036038101906104de9190610f90565b610bcf565b005b3480156104f0575f80fd5b506104f9610cf8565b6040516105069190611049565b60405180910390f35b34801561051a575f80fd5b5061053560048036038101906105309190610f90565b610d1c565b6040516105429190610ef1565b60405180910390f35b5f80823b90505f8111915050919050565b7f00000000000000000000000000000000000000000000000006f05b59d3b2000081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461060d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610604906110ac565b60405180910390fd5b5f8060146101000a81548160ff021916908315150217905550565b6801158e460913d0000081565b5f60149054906101000a900460ff1615610684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067b90611114565b60405180910390fd5b5f61068e33610b57565b905060035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f90557f000000000000000000000000c83aedf16f508539763bb7c1d86ff6f9ae97d9e373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161072b929190611132565b6020604051808303815f875af1158015610747573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061076b9190611183565b503373ffffffffffffffffffffffffffffffffffffffff167f4b8d188a88126c55c5715b63f23b66134d881f891d43cb4cbca332e0520c9a72826040516107b29190610ef1565b60405180910390a250565b60025481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086a906110ac565b60405180910390fd5b7e85f56592462784083e828817207817f9a8413860eb3c60e01ba90ce6f925d9476040516108a19190610ef1565b60405180910390a15f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f1935050505015801561090b573d5f803e3d5ffd5b50565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461099b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610992906110ac565b60405180910390fd5b5f60149054906101000a900460ff166109e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e090610df3565b60405180910390fd5b7f000000000000000000000000c83aedf16f508539763bb7c1d86ff6f9ae97d9e373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a429190610f49565b602060405180830381865afa158015610a5d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a8191906111d8565b6001819055507fac3d9837a679b12a12c0a3b0d0c20e8bf132403b05d76f80de8f4aec36297ed37f000000000000000000000000c83aedf16f508539763bb7c1d86ff6f9ae97d9e373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b019190610f49565b602060405180830381865afa158015610b1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4091906111d8565b604051610b4d9190610ef1565b60405180910390a1565b5f60025460035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054600154610ba69190611203565b610bb09190611271565b9050919050565b5f60149054906101000a900460ff1681565b60015481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c53906110ac565b60405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b7f000000000000000000000000c83aedf16f508539763bb7c1d86ff6f9ae97d9e381565b6003602052805f5260405f205f915090505481565b5f82825260208201905092915050565b7f436f6e7472616374732063616e6e6f74207061727469636970617465000000005f82015250565b5f610d75601c83610d31565b9150610d8082610d41565b602082019050919050565b5f6020820190508181035f830152610da281610d69565b9050919050565b7f73616c6520656e646564000000000000000000000000000000000000000000005f82015250565b5f610ddd600a83610d31565b9150610de882610da9565b602082019050919050565b5f6020820190508181035f830152610e0a81610dd1565b9050919050565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610e5182610e11565b9150610e5c83610e11565b9250828201905080821115610e7457610e73610e1a565b5b92915050565b7f6d61782073616c6520616d6f756e7400000000000000000000000000000000005f82015250565b5f610eae600f83610d31565b9150610eb982610e7a565b602082019050919050565b5f6020820190508181035f830152610edb81610ea2565b9050919050565b610eeb81610e11565b82525050565b5f602082019050610f045f830184610ee2565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610f3382610f0a565b9050919050565b610f4381610f29565b82525050565b5f602082019050610f5c5f830184610f3a565b92915050565b5f80fd5b610f6f81610f29565b8114610f79575f80fd5b50565b5f81359050610f8a81610f66565b92915050565b5f60208284031215610fa557610fa4610f62565b5b5f610fb284828501610f7c565b91505092915050565b5f8115159050919050565b610fcf81610fbb565b82525050565b5f602082019050610fe85f830184610fc6565b92915050565b5f819050919050565b5f61101161100c61100784610f0a565b610fee565b610f0a565b9050919050565b5f61102282610ff7565b9050919050565b5f61103382611018565b9050919050565b61104381611029565b82525050565b5f60208201905061105c5f83018461103a565b92915050565b7f554e415554484f52495a454400000000000000000000000000000000000000005f82015250565b5f611096600c83610d31565b91506110a182611062565b602082019050919050565b5f6020820190508181035f8301526110c38161108a565b9050919050565b7f73616c65206c69766500000000000000000000000000000000000000000000005f82015250565b5f6110fe600983610d31565b9150611109826110ca565b602082019050919050565b5f6020820190508181035f83015261112b816110f2565b9050919050565b5f6040820190506111455f830185610f3a565b6111526020830184610ee2565b9392505050565b61116281610fbb565b811461116c575f80fd5b50565b5f8151905061117d81611159565b92915050565b5f6020828403121561119857611197610f62565b5b5f6111a58482850161116f565b91505092915050565b6111b781610e11565b81146111c1575f80fd5b50565b5f815190506111d2816111ae565b92915050565b5f602082840312156111ed576111ec610f62565b5b5f6111fa848285016111c4565b91505092915050565b5f61120d82610e11565b915061121883610e11565b925082820261122681610e11565b9150828204841483151761123d5761123c610e1a565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61127b82610e11565b915061128683610e11565b92508261129657611295611244565b5b82820490509291505056fea26469706673582212209fc840b1ec0f20dc85e6f134b3afad2573ade04efec4939d40ce0d9c14881adf64736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c83aedf16f508539763bb7c1d86ff6f9ae97d9e3000000000000000000000000da8d92a171aa99f1feb80e95cdc7a96923984c9f
-----Decoded View---------------
Arg [0] : token_ (address): 0xc83AEdf16F508539763bb7c1D86ff6F9AE97D9e3
Arg [1] : owner_ (address): 0xDa8D92a171AA99F1fEb80E95cDC7a96923984c9F
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c83aedf16f508539763bb7c1d86ff6f9ae97d9e3
Arg [1] : 000000000000000000000000da8d92a171aa99f1feb80e95cdc7a96923984c9f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.