Address Contract Verified
Address
0x3F35F0c2Ffc2BEc5cDf2fdeFd0162508b34Af15F
Balance
0 ETH
Nonce
2
Code Size
8646 bytes
Creator
0x3A3E6973...E7e8 at tx 0x3cc548c7...cacab3
Indexed Transactions
0 (2 on-chain, 0.7% indexed)
Contract Bytecode
8646 bytes
0x6080604052600436106200004f575f3560e01c80631ae5be6f14620000535780634127535814620000875780638705fcd414620000a85780638da5cb5b14620000ce578063db07b68e14620000ee575b5f80fd5b6200006a620000643660046200056c565b62000114565b6040516001600160a01b0390911681526020015b60405180910390f35b34801562000093575f80fd5b506001546200006a906001600160a01b031681565b348015620000b4575f80fd5b50620000cc620000c636600462000608565b620003e2565b005b348015620000da575f80fd5b505f546200006a906001600160a01b031681565b348015620000fa575f80fd5b506200010562000482565b6040519081526020016200007e565b5f82821015620001555760405162461bcd60e51b815260206004820152600760248201526604241445f4341560cc1b60448201526064015b60405180910390fd5b60128460ff1611156200019f5760405162461bcd60e51b81526020600482015260116024820152700888a86929a8298a6bea89e9ebe90928e9607b1b60448201526064016200014c565b6001546001600160a01b031615620002fa57600154604080516337382d3960e21b815290515f926001600160a01b03169163dce0b4e49160048083019260209291908290030181865afa158015620001f9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200021f919062000637565b90508034146200025c5760405162461bcd60e51b81526020600482015260076024820152664241445f46454560c81b60448201526064016200014c565b6001546040515f916001600160a01b03169034908381818185875af1925050503d805f8114620002a8576040519150601f19603f3d011682016040523d82523d5f602084013e620002ad565b606091505b5050905080620002f25760405162461bcd60e51b815260206004820152600f60248201526e11915157d4d1539117d19052531151608a1b60448201526064016200014c565b505062000338565b3415620003385760405162461bcd60e51b815260206004820152600b60248201526a4e4f5f4645455f4d4f444560a81b60448201526064016200014c565b87878787878787336040516200034e9062000516565b6200036198979695949392919062000677565b604051809103905ff0801580156200037b573d5f803e3d5ffd5b509050806001600160a01b0316336001600160a01b03167f0813befb236cb0e263b6572f828c20a7b124329bcf797735ad2c7518c4e470c28a8a8a8a8a8a8a604051620003cf9796959493929190620006d5565b60405180910390a3979650505050505050565b5f546001600160a01b03163314620004315760405162461bcd60e51b81526020600482015260116024820152702727aa2fa320a1aa27a92cafa7aba722a960791b60448201526064016200014c565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f11f35a22548bcd4c3788ab4a7e4fba427a2014f02e5d5e2da9af62212c03183f905f90a35050565b6001545f906001600160a01b03166200049a57505f90565b60015f9054906101000a90046001600160a01b03166001600160a01b031663dce0b4e46040518163ffffffff1660e01b8152600401602060405180830381865afa158015620004eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000511919062000637565b905090565b611a6e806200072383390190565b5f8083601f84011262000535575f80fd5b50813567ffffffffffffffff8111156200054d575f80fd5b60208301915083602082850101111562000565575f80fd5b9250929050565b5f805f805f805f60a0888a03121562000583575f80fd5b873567ffffffffffffffff808211156200059b575f80fd5b620005a98b838c0162000524565b909950975060208a0135915080821115620005c2575f80fd5b50620005d18a828b0162000524565b909650945050604088013560ff81168114620005eb575f80fd5b969995985093969295946060840135945060809093013592915050565b5f6020828403121562000619575f80fd5b81356001600160a01b038116811462000630575f80fd5b9392505050565b5f6020828403121562000648575f80fd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60c081525f6200068c60c083018a8c6200064f565b8281036020840152620006a181898b6200064f565b60ff9790971660408401525050606081019390935260808301919091526001600160a01b031660a090910152949350505050565b60a081525f620006ea60a08301898b6200064f565b8281036020840152620006ff81888a6200064f565b60ff9690961660408401525050606081019290925260809091015294935050505056fe60c060405234801562000010575f80fd5b5060405162001a6e38038062001a6e833981016040819052620000339162000210565b6001600160a01b0381166200007c5760405162461bcd60e51b815260206004820152600a6024820152692d22a927afa7aba722a960b11b60448201526064015b60405180910390fd5b82821015620000b85760405162461bcd60e51b815260206004820152600760248201526604241445f4341560cc1b604482015260640162000073565b5f620000c587826200034d565b506001620000d486826200034d565b5060ff8416608052600280546001600160a01b0319166001600160a01b03831690811790915560a083905260048490555f818152600560209081526040808320879055518681527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050505062000415565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011262000176575f80fd5b81516001600160401b038082111562000193576200019362000152565b604051601f8301601f19908116603f01168101908282118183101715620001be57620001be62000152565b81604052838152602092508683858801011115620001da575f80fd5b5f91505b83821015620001fd5785820183015181830184015290820190620001de565b5f93810190920192909252949350505050565b5f805f805f8060c0878903121562000226575f80fd5b86516001600160401b03808211156200023d575f80fd5b6200024b8a838b0162000166565b9750602089015191508082111562000261575f80fd5b506200027089828a0162000166565b955050604087015160ff8116811462000287575f80fd5b6060880151608089015160a08a015192965090945092506001600160a01b0381168114620002b3575f80fd5b809150509295509295509295565b600181811c90821680620002d657607f821691505b602082108103620002f557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000348575f81815260208120601f850160051c81016020861015620003235750805b601f850160051c820191505b8181101562000344578281556001016200032f565b5050505b505050565b81516001600160401b0381111562000369576200036962000152565b62000381816200037a8454620002c1565b84620002fb565b602080601f831160018114620003b7575f84156200039f5750858301515b5f19600386901b1c1916600185901b17855562000344565b5f85815260208120601f198616915b82811015620003e757888601518255948401946001909101908401620003c6565b50858210156200040557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611629620004455f395f81816105f00152818161095701526109af01525f61032301526116295ff3fe608060405234801561000f575f80fd5b50600436106101dc575f3560e01c806370a0823111610109578063a457c2d71161009e578063d5abeb011161006e578063d5abeb01146105eb578063dd62ed3e14610612578063e30c39781461063c578063f2fde38b1461064f575f80fd5b8063a457c2d71461053a578063a9059cbb1461054d578063cc72957f14610560578063ceb88a16146105c3575f80fd5b806379ba5097116100d957806379ba5097146104ce57806389bbf0b5146104d65780638da5cb5b1461050757806395d89b4114610532575f80fd5b806370a082311461045c578063715018a61461047b57806372f42c38146104835780637943913c146104bb575f80fd5b806323b872dd1161017f57806340c10f191161014f57806340c10f191461036a57806342966c681461037d57806362027c31146103905780636920880b1461042b575f80fd5b806323b872dd146102da5780632add73d2146102ed578063313ce5671461031e5780633950935114610357575f80fd5b806317d63605116101ba57806317d636051461026757806318160ddd146102a75780631a3b81c2146102b057806323452b9c146102d0575f80fd5b806306fdde03146101e0578063095ea7b3146101fe57806310bded5314610221575b5f80fd5b6101e8610662565b6040516101f59190611302565b60405180910390f35b61021161020c366004611368565b6106ed565b60405190151581526020016101f5565b61025961022f366004611390565b6001600160a01b03165f90815260076020526040902054600160401b90046001600160401b031690565b6040519081526020016101f5565b61028f610275366004611390565b60096020525f90815260409020546001600160401b031681565b6040516001600160401b0390911681526020016101f5565b61025960045481565b6102c36102be3660046113b0565b610777565b6040516101f5919061141e565b6102d861085b565b005b6102116102e836600461146a565b610897565b6102596102fb366004611390565b6001600160a01b03165f908152600760205260409020546001600160401b031690565b6103457f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016101f5565b610211610365366004611368565b6108b8565b6102d8610378366004611368565b610902565b6102d861038b3660046114a3565b610a61565b6103f161039e366004611390565b6001600160a01b03165f90815260076020908152604080832054600883528184205460099093529220546001600160401b0380841694600160401b8504821694600160801b900482169382169290911690565b604080516001600160401b03968716815294861660208601529285169284019290925283166060830152909116608082015260a0016101f5565b61028f610439366004611390565b6001600160a01b03165f908152600960205260409020546001600160401b031690565b61025961046a366004611390565b60056020525f908152604090205481565b6102d8610a6e565b610259610491366004611390565b6001600160a01b03165f90815260076020526040902054600160801b90046001600160401b031690565b6102c36104c93660046113b0565b610b35565b6102d8610c11565b61028f6104e4366004611390565b6001600160a01b03165f908152600860205260409020546001600160401b031690565b60025461051a906001600160a01b031681565b6040516001600160a01b0390911681526020016101f5565b6101e8610cbb565b610211610548366004611368565b610cc8565b61021161055b366004611368565b610d2d565b6105a861056e366004611390565b6001600160a01b03165f908152600760205260409020546001600160401b0380821692600160401b8304821692600160801b900490911690565b604080519384526020840192909252908201526060016101f5565b61028f6105d1366004611390565b60086020525f90815260409020546001600160401b031681565b6102597f000000000000000000000000000000000000000000000000000000000000000081565b6102596106203660046114ba565b600660209081525f928352604080842090915290825290205481565b60035461051a906001600160a01b031681565b6102d861065d366004611390565b610d42565b5f805461066e906114eb565b80601f016020809104026020016040519081016040528092919081815260200182805461069a906114eb565b80156106e55780601f106106bc576101008083540402835291602001916106e5565b820191905f5260205f20905b8154815290600101906020018083116106c857829003601f168201915b505050505081565b335f9081526006602090815260408083206001600160a01b0386168452909152812054801580159061071e57508215155b156107605760405163dc88157560e01b81523360048201526001600160a01b038516602482015260448101829052606481018490526084015b60405180910390fd5b61076b338585610e04565b60019150505b92915050565b606081806001600160401b0381111561079257610792611523565b6040519080825280602002602001820160405280156107bb578160200160208202803683370190505b5091505f5b818110156108535760085f8686848181106107dd576107dd611537565b90506020020160208101906107f29190611390565b6001600160a01b0316815260208101919091526040015f205483516001600160401b039091169084908390811061082b5761082b611537565b6001600160401b039092166020928302919091019091015261084c8161155f565b90506107c0565b505092915050565b6002546001600160a01b031633146108855760405162461bcd60e51b815260040161075790611577565b600380546001600160a01b0319169055565b5f6108a3843384610eb7565b6108ae848484610f3b565b5060019392505050565b335f8181526006602090815260408083206001600160a01b0387168452909152812054909190826108e9858361159a565b90506108f6838783610e04565b50600195945050505050565b6002546001600160a01b0316331461092c5760405162461bcd60e51b815260040161075790611577565b6001600160a01b0382166109555760405163ec442f0560e01b81525f6004820152602401610757565b7f000000000000000000000000000000000000000000000000000000000000000081600454610984919061159a565b11156109db5780600454610998919061159a565b604051637502c12360e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006024820152604401610757565b8060045f8282546109ec919061159a565b90915550506001600160a01b0382165f9081526005602052604081208054839290610a1890849061159a565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b610a6b338261126c565b50565b6002546001600160a01b03163314610a985760405162461bcd60e51b815260040161075790611577565b6003546001600160a01b031615610ae85760405162461bcd60e51b815260206004820152601460248201527350454e44494e475f4f574e45525f45584953545360601b6044820152606401610757565b600280546001600160a01b031981169091556040516001600160a01b03909116905f9082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a350565b606081806001600160401b03811115610b5057610b50611523565b604051908082528060200260200182016040528015610b79578160200160208202803683370190505b5091505f5b818110156108535760095f868684818110610b9b57610b9b611537565b9050602002016020810190610bb09190611390565b6001600160a01b0316815260208101919091526040015f205483516001600160401b0390911690849083908110610be957610be9611537565b6001600160401b0390921660209283029190910190910152610c0a8161155f565b9050610b7e565b6003546001600160a01b03163314610c5f5760405162461bcd60e51b81526020600482015260116024820152702727aa2fa822a72224a723afa7aba722a960791b6044820152606401610757565b60028054600380546001600160a01b03198084166001600160a01b038381169182179096559116909155604051929091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a350565b6001805461066e906114eb565b335f8181526006602090815260408083206001600160a01b038716845290915281205490919083811015610d1557848185604051637dc7a0d960e11b8152600401610757939291906115ad565b610d228286868403610e04565b506001949350505050565b5f610d39338484610f3b565b50600192915050565b6002546001600160a01b03163314610d6c5760405162461bcd60e51b815260040161075790611577565b6001600160a01b038116610db35760405162461bcd60e51b815260206004820152600e60248201526d2d22a927afa722abafa7aba722a960911b6044820152606401610757565b600380546001600160a01b0319166001600160a01b03838116918217909255600254604051919216907f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700905f90a350565b6001600160a01b038316610e2d57604051634b637e8f60e11b81525f6004820152602401610757565b6001600160a01b038216610e565760405163ec442f0560e01b81525f6004820152602401610757565b6001600160a01b038381165f8181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038084165f9081526006602090815260408083209386168352929052205481811015610f0357828183604051637dc7a0d960e11b8152600401610757939291906115ad565b5f198114610f35576001600160a01b038085165f90815260066020908152604080832093871683529290522082820390555b50505050565b6001600160a01b038316610f6457604051634b637e8f60e11b81525f6004820152602401610757565b6001600160a01b038216610f8d5760405163ec442f0560e01b81525f6004820152602401610757565b6001600160a01b0383165f9081526005602052604090205481811015610fcc5783818360405163391434e360e21b8152600401610757939291906115ad565b6001600160a01b038085165f8181526005602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061102b9086815260200190565b60405180910390a381158015906110545750826001600160a01b0316846001600160a01b031614155b15610f35576001600160a01b0384165f90815260076020526040902080546001600160401b03600160401b909104811610156110ce578054600160401b90046001600160401b03168160086110a8836115ce565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b80546001600160401b03600160801b9091048116101561112c578054600160801b90046001600160401b0316816010611106836115ce565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b6001600160a01b0384165f90815260076020526040902080546001600160401b0390811610156111925780546001600160401b0316815f61116c836115ce565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b80546001600160401b03600160801b909104811610156111f0578054600160801b90046001600160401b03168160106111ca836115ce565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b50506001600160a01b038085165f81815260086020908152604080832080546001600160401b0343811667ffffffffffffffff199283168117909355968a168086528386208054831690931790925594845260099092528083208054429096169585168617905590825290208054909116909117905550505050565b6001600160a01b0382165f90815260056020526040902054818110156112ab5782818360405163391434e360e21b8152600401610757939291906115ad565b6001600160a01b0383165f8181526005602090815260408083208686039055600480548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610eaa565b5f6020808352835180828501525f5b8181101561132d57858101830151858201604001528201611311565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611363575f80fd5b919050565b5f8060408385031215611379575f80fd5b6113828361134d565b946020939093013593505050565b5f602082840312156113a0575f80fd5b6113a98261134d565b9392505050565b5f80602083850312156113c1575f80fd5b82356001600160401b03808211156113d7575f80fd5b818501915085601f8301126113ea575f80fd5b8135818111156113f8575f80fd5b8660208260051b850101111561140c575f80fd5b60209290920196919550909350505050565b602080825282518282018190525f9190848201906040850190845b8181101561145e5783516001600160401b031683529284019291840191600101611439565b50909695505050505050565b5f805f6060848603121561147c575f80fd5b6114858461134d565b92506114936020850161134d565b9150604084013590509250925092565b5f602082840312156114b3575f80fd5b5035919050565b5f80604083850312156114cb575f80fd5b6114d48361134d565b91506114e26020840161134d565b90509250929050565b600181811c908216806114ff57607f821691505b60208210810361151d57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016115705761157061154b565b5060010190565b6020808252600990820152682727aa2fa7aba722a960b91b604082015260600190565b808201808211156107715761077161154b565b6001600160a01b039390931683526020830191909152604082015260600190565b5f6001600160401b038083168181036115e9576115e961154b565b600101939250505056fea264697066735822122078e99bbf5cf1a8b6eb41e70d8fb77839791b23d9be9d22998555ecfc728e6d1a64736f6c63430008140033a26469706673582212207fbaf6f1d0763a5787ef33c253e7a7f105aab015213ca7f1948104cd0b76ca1d64736f6c63430008140033
Verified Source Code Full Match
Compiler: v0.8.20+commit.a1b79de6
EVM: shanghai
Optimization: Yes (200 runs)
TokenERC20Advanced.sol 465 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/* ========= Interfaces ========= */
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner );
}
interface IERC20Counters {
function txInOf(address u) external view returns (uint256);
function txOutOf(address u) external view returns (uint256);
function txAllOf(address u) external view returns (uint256);
function txCountersOf(address u)
external
view
returns (uint256 inTx, uint256 outTx, uint256 allTx);
}
/* ========= TOKEN ========= */
contract tokenERC20Advanced is IERC20, IERC20Counters {
/* ========= METADATA ========= */
string public name;
string public symbol;
uint8 public immutable decimals;
/* ========= OWNERSHIP ========= */
address public owner;
address public pendingOwner;
modifier onlyOwner() {
require(msg.sender == owner, "NOT_OWNER");
_;
}
/* ========= ERC20 STATE ========= */
uint256 public override totalSupply;
uint256 public immutable maxSupply;
mapping(address => uint256) public override balanceOf;
mapping(address => mapping(address => uint256)) public override allowance;
/* ========= COUNTERS ========= */
struct Cnt { uint64 inTx; uint64 outTx; uint64 allTx; }
mapping(address => Cnt) private _cnt;
mapping(address => uint64) public lastTxBlock;
mapping(address => uint64) public lastTxTime;
/* ========= ERRORS ========= */
error ERC20InvalidSender(address sender);
error ERC20InvalidReceiver(address receiver);
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
error ERC20ApproveNonZeroToNonZero(
address owner,
address spender,
uint256 current,
uint256 newAmount
);
error MaxSupplyExceeded(uint256 requested, uint256 maxSupply);
/* ========= CONSTRUCTOR ========= */
constructor(
string memory name_,
string memory symbol_,
uint8 decimals_,
uint256 initialSupply_,
uint256 maxSupply_,
address owner_
) {
require(owner_ != address(0), "ZERO_OWNER");
require(maxSupply_ >= initialSupply_, "BAD_CAP");
name = name_;
symbol = symbol_;
decimals = decimals_;
owner = owner_;
maxSupply = maxSupply_;
totalSupply = initialSupply_;
balanceOf[owner_] = initialSupply_;
emit Transfer(address(0), owner_, initialSupply_);
}
/* ========= ERC20 CORE ========= */
function transfer(address to, uint256 value) external override returns (bool) {
_transfer(msg.sender, to, value);
return true;
}
function approve(address spender, uint256 value) external override returns (bool) {
uint256 current = allowance[msg.sender][spender];
if (current != 0 && value != 0) {
revert ERC20ApproveNonZeroToNonZero(
msg.sender,
spender,
current,
value
);
}
_approve(msg.sender, spender, value);
return true;
}
function transferFrom(address from, address to, uint256 value)
external
override
returns (bool)
{
_spendAllowance(from, msg.sender, value);
_transfer(from, to, value);
return true;
}
/* ========= MINT / BURN ========= */
function mint(address to, uint256 amount) external onlyOwner {
if (to == address(0)) revert ERC20InvalidReceiver(address(0));
if (totalSupply + amount > maxSupply) {
revert MaxSupplyExceeded(totalSupply + amount, maxSupply);
}
totalSupply += amount;
balanceOf[to] += amount;
emit Transfer(address(0), to, amount);
}
function burn(uint256 amount) external {
_burn(msg.sender, amount);
}
function _burn(address from, uint256 amount) internal {
uint256 bal = balanceOf[from];
if (bal < amount) revert ERC20InsufficientBalance(from, bal, amount);
unchecked {
balanceOf[from] = bal - amount;
totalSupply -= amount;
}
emit Transfer(from, address(0), amount);
}
/* ========= COUNTER VIEWS ========= */
function txInOf(address u) external view override returns (uint256) {
return _cnt[u].inTx;
}
function txOutOf(address u) external view override returns (uint256) {
return _cnt[u].outTx;
}
function txAllOf(address u) external view override returns (uint256) {
return _cnt[u].allTx;
}
function txCountersOf(address u)
external
view
override
returns (uint256 inTx, uint256 outTx, uint256 allTx)
{
Cnt storage c = _cnt[u];
return (c.inTx, c.outTx, c.allTx);
}
/* ========= META / UI VIEWS ========= */
function getLastBlockOf(address user) external view returns (uint64) {
return lastTxBlock[user];
}
function getLastTimeOf(address user) external view returns (uint64) {
return lastTxTime[user];
}
function getLastBlocks(address[] calldata users)
external
view
returns (uint64[] memory out)
{
uint256 n = users.length;
out = new uint64[](n);
for (uint256 i; i < n; ++i) {
out[i] = lastTxBlock[users[i]];
}
}
function getLastTimes(address[] calldata users)
external
view
returns (uint64[] memory out)
{
uint256 n = users.length;
out = new uint64[](n);
for (uint256 i; i < n; ++i) {
out[i] = lastTxTime[users[i]];
}
}
function getUserTransaction(address user)
external
view
returns (
uint64 totalIn,
uint64 totalOut,
uint64 totalTx,
uint64 lastBlock,
uint64 lastTime
)
{
Cnt storage c = _cnt[user];
totalIn = c.inTx;
totalOut = c.outTx;
totalTx = c.allTx;
lastBlock = lastTxBlock[user];
lastTime = lastTxTime[user];
}
/* ========= OWNERSHIP TRANSFER ========= */
/* --- propose new owner --- */
function transferOwnership(address newOwner) external onlyOwner {
require(newOwner != address(0), "ZERO_NEW_OWNER");
pendingOwner = newOwner;
emit OwnershipTransferStarted(owner, newOwner);
}
/* --- accept ownership --- */
function acceptOwnership() external {
require(msg.sender == pendingOwner, "NOT_PENDING_OWNER");
address oldOwner = owner;
owner = pendingOwner;
pendingOwner = address(0);
emit OwnershipTransferred(oldOwner, owner);
}
/* --- cancel transfer --- */
function cancelOwnershipTransfer() external onlyOwner {
pendingOwner = address(0);
}
/* --- Renounce ownership --- */
function renounceOwnership() external onlyOwner {
require(pendingOwner == address(0), "PENDING_OWNER_EXISTS");
address oldOwner = owner;
owner = address(0);
emit OwnershipTransferred(oldOwner, address(0));
}
/* --- decrease increase allowance --- */
function increaseAllowance(address spender, uint256 addedValue)
external
returns (bool)
{
address owner_ = msg.sender;
uint256 current = allowance[owner_][spender];
uint256 updated = current + addedValue; // overflow auto-revert (0.8+)
_approve(owner_, spender, updated);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue)
external
returns (bool)
{
address owner_ = msg.sender;
uint256 current = allowance[owner_][spender];
if (current < subtractedValue) {
revert ERC20InsufficientAllowance(
spender,
current,
subtractedValue
);
}
unchecked {
_approve(owner_, spender, current - subtractedValue);
}
return true;
}
/* ========= INTERNAL ========= */
function _transfer(address from, address to, uint256 value) internal {
if (from == address(0)) revert ERC20InvalidSender(address(0));
if (to == address(0)) revert ERC20InvalidReceiver(address(0));
uint256 fromBal = balanceOf[from];
if (fromBal < value) {
revert ERC20InsufficientBalance(from, fromBal, value);
}
unchecked {
balanceOf[from] = fromBal - value;
balanceOf[to] += value;
}
emit Transfer(from, to, value);
if (value != 0 && from != to) {
Cnt storage cf = _cnt[from];
if (cf.outTx < type(uint64).max) cf.outTx++;
if (cf.allTx < type(uint64).max) cf.allTx++;
Cnt storage ct = _cnt[to];
if (ct.inTx < type(uint64).max) ct.inTx++;
if (ct.allTx < type(uint64).max) ct.allTx++;
lastTxBlock[from] = uint64(block.number);
lastTxBlock[to] = uint64(block.number);
lastTxTime[from] = uint64(block.timestamp);
lastTxTime[to] = uint64(block.timestamp);
}
}
function _approve(address owner_, address spender, uint256 value) internal {
if (owner_ == address(0)) revert ERC20InvalidSender(address(0));
if (spender == address(0)) revert ERC20InvalidReceiver(address(0));
allowance[owner_][spender] = value;
emit Approval(owner_, spender, value);
}
function _spendAllowance(address owner_, address spender, uint256 value) internal {
uint256 current = allowance[owner_][spender];
if (current < value) {
revert ERC20InsufficientAllowance(spender, current, value);
}
if (current != type(uint256).max) {
unchecked {
allowance[owner_][spender] = current - value;
}
}
}
}
pragma solidity ^0.8.20;
/* ========= FEE ADDRESS INTERFACE ========= */
interface IFeeAddress {
function creationFee() external view returns (uint256);
}
/* ========= FACTORY ========= */
contract tokenERC20AdvancedFactory {
/* ========= STATE ========= */
address public owner;
address public feeAddress; // address(0) = free
/* ========= EVENTS ========= */
event TokenCreated(
address indexed creator,
address indexed token,
string name,
string symbol,
uint8 decimals,
uint256 initialSupply,
uint256 maxSupply
);
event FeeAddressUpdated(
address indexed oldAddress,
address indexed newAddress
);
/* ========= MODIFIER ========= */
modifier onlyOwner() {
require(msg.sender == owner, "NOT_FACTORY_OWNER");
_;
}
/* ========= CONSTRUCTOR ========= */
constructor(address feeAddress_) {
owner = msg.sender;
feeAddress = feeAddress_;
}
/* ========= OWNER ========= */
function setFeeAddress(address newAddress) external onlyOwner {
address old = feeAddress;
feeAddress = newAddress;
emit FeeAddressUpdated(old, newAddress);
}
/* ========= FEE VIEW ========= */
function getCreationFee() external view returns (uint256) {
if (feeAddress == address(0)) {
return 0;
}
return IFeeAddress(feeAddress).creationFee();
}
/* ========= CREATE TOKEN ========= */
function createToken(
string calldata name,
string calldata symbol,
uint8 decimals,
uint256 initialSupply,
uint256 maxSupply
)
external
payable
returns (address token)
{
require(maxSupply >= initialSupply, "BAD_CAP");
require(decimals <= 18, "DECIMALS_TOO_HIGH");
/* ===== HANDLE FEE ===== */
if (feeAddress != address(0)) {
uint256 fee = IFeeAddress(feeAddress).creationFee();
require(msg.value == fee, "BAD_FEE");
(bool ok,) = feeAddress.call{value: msg.value}("");
require(ok, "FEE_SEND_FAILED");
} else {
require(msg.value == 0, "NO_FEE_MODE");
}
/* ===== DEPLOY TOKEN ===== */
token = address(
new tokenERC20Advanced(
name,
symbol,
decimals,
initialSupply,
maxSupply,
msg.sender
)
);
emit TokenCreated(
msg.sender,
token,
name,
symbol,
decimals,
initialSupply,
maxSupply
);
}
}
Read Contract
feeAddress 0x41275358 → address
getCreationFee 0xdb07b68e → uint256
owner 0x8da5cb5b → address
Write Contract 2 functions
These functions modify contract state and require a wallet transaction to execute.
createToken 0x1ae5be6f
string name
string symbol
uint8 decimals
uint256 initialSupply
uint256 maxSupply
returns: address
setFeeAddress 0x8705fcd4
address newAddress
Recent Transactions
This address has 2 on-chain transactions, but only 0.7% of the chain is indexed. Transactions will appear as indexing progresses. View on Etherscan →