Address Contract Verified
Address
0xE5a2bDDa0d976e7ccDBca6739fdfE8f07F51A3e5
Balance
0 ETH
Nonce
1
Code Size
4606 bytes
Creator
0xC4aa2b68...9532 at tx 0x42a7a253...f168fe
Indexed Transactions
0 (1 on-chain, 0.8% indexed)
Contract Bytecode
4606 bytes
0x608060405260043610610164575f3560e01c806342966c68116100cd5780638da5cb5b11610087578063c7fee63e11610062578063c7fee63e14610401578063d0febe4c14610415578063dd62ed3e1461041d578063f856d60514610461575f80fd5b80638da5cb5b1461039757806395d89b41146103ce578063a9059cbb146103e2575f80fd5b806342966c68146102e95780634d82680e146103085780635d58ce361461031d57806370a082311461032f57806379cc6790146103635780637efad8e014610382575f80fd5b80631f11310e1161011e5780631f11310e1461023257806323b872dd146102475780632e1a7d4d14610266578063313ce5671461028557806334fcf437146102ab57806340c10f19146102ca575f80fd5b806306fdde0314610177578063095ea7b3146101a15780630cb60443146101d05780631502906d146101f357806318160ddd146102085780631cff44831461021d575f80fd5b3661017357610171610476565b005b5f80fd5b348015610182575f80fd5b5061018b61054e565b6040516101989190610ea1565b60405180910390f35b3480156101ac575f80fd5b506101c06101bb366004610f07565b6105d9565b6040519015158152602001610198565b3480156101db575f80fd5b506101e560055481565b604051908152602001610198565b3480156101fe575f80fd5b506101e560085481565b348015610213575f80fd5b506101e560025481565b348015610228575f80fd5b506101e560075481565b34801561023d575f80fd5b506101e560065481565b348015610252575f80fd5b506101c0610261366004610f2f565b6105ef565b348015610271575f80fd5b50610171610280366004610f68565b610680565b348015610290575f80fd5b50610299601281565b60405160ff9091168152602001610198565b3480156102b6575f80fd5b506101716102c5366004610f68565b6107c5565b3480156102d5575f80fd5b506101c06102e4366004610f07565b610835565b3480156102f4575f80fd5b50610171610303366004610f68565b61086b565b348015610313575f80fd5b506101e560095481565b348015610328575f80fd5b50476101e5565b34801561033a575f80fd5b506101e5610349366004610f7f565b6001600160a01b03165f908152600a602052604090205490565b34801561036e575f80fd5b5061017161037d366004610f07565b610875565b34801561038d575f80fd5b506101e561271081565b3480156103a2575f80fd5b506003546103b6906001600160a01b031681565b6040516001600160a01b039091168152602001610198565b3480156103d9575f80fd5b5061018b6108fa565b3480156103ed575f80fd5b506101c06103fc366004610f07565b610907565b34801561040c575f80fd5b50610171610913565b610171610476565b348015610428575f80fd5b506101e5610437366004610f9f565b6001600160a01b039182165f908152600b6020908152604080832093909416825291909152205490565b34801561046c575f80fd5b506101e560045481565b5f34116104b55760405162461bcd60e51b81526020600482015260086024820152670a6cadcc8408aa8960c31b60448201526064015b60405180910390fd5b6104bd61091d565b5f670de0b6b3a76400006104d36012600a6110c4565b6004546104e090346110d2565b6104ea91906110d2565b6104f491906110e9565b90505f81116105365760405162461bcd60e51b815260206004820152600e60248201526d0a8dede40d8d2e8e8d8ca408aa8960931b60448201526064016104ac565b6105403382610a03565b61054b600654610aed565b50565b5f805461055a90611108565b80601f016020809104026020016040519081016040528092919081815260200182805461058690611108565b80156105d15780601f106105a8576101008083540402835291602001916105d1565b820191905f5260205f20905b8154815290600101906020018083116105b457829003601f168201915b505050505081565b5f6105e5338484610b96565b5060015b92915050565b6001600160a01b0383165f908152600b60209081526040808320338452909152812054828110156106565760405162461bcd60e51b8152602060048201526011602482015270416c6c6f77616e636520746f6f206c6f7760781b60448201526064016104ac565b61066a85336106658685611140565b610b96565b610675858585610c4c565b506001949350505050565b6003546001600160a01b031633146106aa5760405162461bcd60e51b81526004016104ac90611153565b804710156106ed5760405162461bcd60e51b815260206004820152601060248201526f092dce6eaccccd2c6d2cadce8408aa8960831b60448201526064016104ac565b6003546040515f916001600160a01b03169083908381818185875af1925050503d805f8114610737576040519150601f19603f3d011682016040523d82523d5f602084013e61073c565b606091505b505090508061077f5760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a191c985dc819985a5b1959608a1b60448201526064016104ac565b6003546040518381526001600160a01b03909116907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a25050565b6003546001600160a01b031633146107ef5760405162461bcd60e51b81526004016104ac90611153565b600480549082905560408051828152602081018490527f4ac9052a820bf4f8c02d7588587cae835573b5b99ea7ad4ca002f17f319f718691015b60405180910390a15050565b6003545f906001600160a01b031633146108615760405162461bcd60e51b81526004016104ac90611153565b6105e58383610a03565b61054b3382610d67565b6001600160a01b0382165f908152600b60209081526040808320338452909152902054818110156108dc5760405162461bcd60e51b8152602060048201526011602482015270416c6c6f77616e636520746f6f206c6f7760781b60448201526064016104ac565b6108eb83336106658585611140565b6108f58383610d67565b505050565b6001805461055a90611108565b5f6105e5338484610c4c565b61091b61091d565b565b60085460095461092d9190611177565b42101561093657565b5f600854600954426109489190611140565b61095291906110e9565b6004549091505f5b828110156109c4575f61271060075460045461097691906110d2565b61098091906110e9565b90506005546004541161099957506005546004556109c4565b8060045f8282546109aa9190611140565b909155508291506109bc90508161118a565b91505061095a565b50426009556004546040805183815260208101929092527f4ac9052a820bf4f8c02d7588587cae835573b5b99ea7ad4ca002f17f319f71869101610829565b6001600160a01b038216610a295760405162461bcd60e51b81526004016104ac906111a2565b8060025f828254610a3a9190611177565b90915550506001600160a01b0382165f908152600a602052604081208054839290610a66908490611177565b90915550506040518181526001600160a01b038316907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a26040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600554600454118015610aff57505f81115b1561054b576004545f612710610b1584846110d2565b610b1f91906110e9565b90505f8160045411610b3357600554610b41565b81600454610b419190611140565b9050600554811015610b5257506005545b600481905560408051848152602081018390527f4ac9052a820bf4f8c02d7588587cae835573b5b99ea7ad4ca002f17f319f7186910160405180910390a150505050565b6001600160a01b03831615801590610bb657506001600160a01b03821615155b610beb5760405162461bcd60e51b81526004016104ac906020808252600490820152635a65726f60e01b604082015260600190565b6001600160a01b038381165f818152600b602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038216610c725760405162461bcd60e51b81526004016104ac906111a2565b6001600160a01b0383165f908152600a602052604090205481811015610cce5760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f75676820746f6b656e7360781b60448201526064016104ac565b610cd88282611140565b6001600160a01b038086165f908152600a60205260408082209390935590851681529081208054849290610d0d908490611177565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610d5991815260200190565b60405180910390a350505050565b6001600160a01b038216610d8d5760405162461bcd60e51b81526004016104ac906111a2565b6001600160a01b0382165f908152600a602052604090205481811015610dea5760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f7567682062616c616e636560701b60448201526064016104ac565b610df48282611140565b6001600160a01b0384165f908152600a602052604081209190915560028054849290610e21908490611140565b90915550506040518281526001600160a01b038416907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59060200160405180910390a26040518281525f906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610c3f565b5f6020808352835180828501525f5b81811015610ecc57858101830151858201604001528201610eb0565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610f02575f80fd5b919050565b5f8060408385031215610f18575f80fd5b610f2183610eec565b946020939093013593505050565b5f805f60608486031215610f41575f80fd5b610f4a84610eec565b9250610f5860208501610eec565b9150604084013590509250925092565b5f60208284031215610f78575f80fd5b5035919050565b5f60208284031215610f8f575f80fd5b610f9882610eec565b9392505050565b5f8060408385031215610fb0575f80fd5b610fb983610eec565b9150610fc760208401610eec565b90509250929050565b634e487b7160e01b5f52601160045260245ffd5b600181815b8085111561101e57815f190482111561100457611004610fd0565b8085161561101157918102915b93841c9390800290610fe9565b509250929050565b5f82611034575060016105e9565b8161104057505f6105e9565b816001811461105657600281146110605761107c565b60019150506105e9565b60ff84111561107157611071610fd0565b50506001821b6105e9565b5060208310610133831016604e8410600b841016171561109f575081810a6105e9565b6110a98383610fe4565b805f19048211156110bc576110bc610fd0565b029392505050565b5f610f9860ff841683611026565b80820281158282048414176105e9576105e9610fd0565b5f8261110357634e487b7160e01b5f52601260045260245ffd5b500490565b600181811c9082168061111c57607f821691505b60208210810361113a57634e487b7160e01b5f52602260045260245ffd5b50919050565b818103818111156105e9576105e9610fd0565b6020808252600a908201526927b7363c9037bbb732b960b11b604082015260600190565b808201808211156105e9576105e9610fd0565b5f6001820161119b5761119b610fd0565b5060010190565b6020808252600c908201526b5a65726f206164647265737360a01b60408201526060019056fea2646970667358221220c97e252a91ac8f7544a6bf628af366f964c9b5bd0b8bcf43332344bec21c644064736f6c63430008150033
Verified Source Code Full Match
Compiler: v0.8.21+commit.d9974bed
EVM: shanghai
Optimization: Yes (200 runs)
MyToken.sol 212 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract MyToken {
string public name;
string public symbol;
uint8 public constant decimals = 18;
uint256 public totalSupply;
address public owner;
// --- Цена ---
uint256 public tokensPerEther;
uint256 public minRate;
uint256 public growthStep;
uint256 public timeGrowthStep;
uint256 public timeStep;
uint256 public lastRateUpdate;
uint256 public constant RATE_DENOMINATOR = 10000;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
event Mint(address indexed to, uint256 value);
event Burn(address indexed from, uint256 value);
event RateChanged(uint256 oldRate, uint256 newRate);
event Withdraw(address indexed to, uint256 amount);
modifier onlyOwner() {
require(msg.sender == owner, "Only owner");
_;
}
constructor(
string memory _name,
string memory _symbol,
uint256 initialSupply,
uint256 initialRate,
uint256 _minRate,
uint256 _growthStep,
uint256 _timeGrowthStep,
uint256 _timeStep
) {
name = _name;
symbol = _symbol;
owner = msg.sender;
tokensPerEther = initialRate;
minRate = _minRate;
growthStep = _growthStep;
timeGrowthStep = _timeGrowthStep;
timeStep = _timeStep;
lastRateUpdate = block.timestamp;
_mint(owner, initialSupply * (10 ** decimals));
}
// --- ERC20 ---
function balanceOf(address account) external view returns (uint256) {
return _balances[account];
}
function allowance(address _owner, address spender) external view returns (uint256) {
return _allowances[_owner][spender];
}
function approve(address spender, uint256 amount) external returns (bool) {
_approve(msg.sender, spender, amount);
return true;
}
function transfer(address to, uint256 amount) external returns (bool) {
_transfer(msg.sender, to, amount);
return true;
}
function transferFrom(address from, address to, uint256 amount) external returns (bool) {
uint256 currentAllowance = _allowances[from][msg.sender];
require(currentAllowance >= amount, "Allowance too low");
_approve(from, msg.sender, currentAllowance - amount);
_transfer(from, to, amount);
return true;
}
// --- Mint / Burn ---
function mint(address to, uint256 amount) external onlyOwner returns (bool) {
_mint(to, amount);
return true;
}
function burn(uint256 amount) external {
_burn(msg.sender, amount);
}
function burnFrom(address from, uint256 amount) external {
uint256 currentAllowance = _allowances[from][msg.sender];
require(currentAllowance >= amount, "Allowance too low");
_approve(from, msg.sender, currentAllowance - amount);
_burn(from, amount);
}
// --- Покупка токенов ---
function buyTokens() public payable {
require(msg.value > 0, "Send ETH");
_updateRateByTime();
uint256 tokens = (msg.value * tokensPerEther * (10 ** decimals)) / 1 ether;
require(tokens > 0, "Too little ETH");
_mint(msg.sender, tokens);
_increasePrice(growthStep);
}
receive() external payable {
buyTokens();
}
// --- Управление ---
function setRate(uint256 newRate) external onlyOwner {
uint256 oldRate = tokensPerEther;
tokensPerEther = newRate;
emit RateChanged(oldRate, newRate);
}
function withdraw(uint256 amount) external onlyOwner {
require(address(this).balance >= amount, "Insufficient ETH");
(bool success, ) = payable(owner).call{value: amount}("");
require(success, "Withdraw failed");
emit Withdraw(owner, amount);
}
function contractEthBalance() external view returns (uint256) {
return address(this).balance;
}
// --- Ручное обновление курса ---
function updateRate() external {
_updateRateByTime();
}
// --- Внутренние ---
function _transfer(address from, address to, uint256 amount) internal {
require(to != address(0), "Zero address");
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "Not enough tokens");
_balances[from] = fromBalance - amount;
_balances[to] += amount;
emit Transfer(from, to, amount);
}
function _mint(address to, uint256 amount) internal {
require(to != address(0), "Zero address");
totalSupply += amount;
_balances[to] += amount;
emit Mint(to, amount);
emit Transfer(address(0), to, amount);
}
function _burn(address from, uint256 amount) internal {
require(from != address(0), "Zero address");
uint256 bal = _balances[from];
require(bal >= amount, "Not enough balance");
_balances[from] = bal - amount;
totalSupply -= amount;
emit Burn(from, amount);
emit Transfer(from, address(0), amount);
}
function _approve(address _owner, address spender, uint256 amount) internal {
require(_owner != address(0) && spender != address(0), "Zero");
_allowances[_owner][spender] = amount;
emit Approval(_owner, spender, amount);
}
// --- Логика цены ---
function _increasePrice(uint256 step) internal {
if (tokensPerEther > minRate && step > 0) {
uint256 oldRate = tokensPerEther;
uint256 decrease = (tokensPerEther * step) / RATE_DENOMINATOR;
uint256 newRate = tokensPerEther > decrease ? tokensPerEther - decrease : minRate;
if (newRate < minRate) newRate = minRate;
tokensPerEther = newRate;
emit RateChanged(oldRate, newRate);
}
}
function _updateRateByTime() internal {
if (block.timestamp < lastRateUpdate + timeStep) return;
uint256 periods = (block.timestamp - lastRateUpdate) / timeStep;
// Вместо цикла — математическая формула:
// tokensPerEther = tokensPerEther * (1 - step)^periods
uint256 oldRate = tokensPerEther;
for (uint256 i = 0; i < periods; i++) {
uint256 decrease = (tokensPerEther * timeGrowthStep) / RATE_DENOMINATOR;
if (tokensPerEther <= minRate) {
tokensPerEther = minRate;
break;
}
tokensPerEther -= decrease;
}
lastRateUpdate = block.timestamp;
emit RateChanged(oldRate, tokensPerEther);
}
}
Read Contract
RATE_DENOMINATOR 0x7efad8e0 → uint256
allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
contractEthBalance 0x5d58ce36 → uint256
decimals 0x313ce567 → uint8
growthStep 0x1f11310e → uint256
lastRateUpdate 0x4d82680e → uint256
minRate 0x0cb60443 → uint256
name 0x06fdde03 → string
owner 0x8da5cb5b → address
symbol 0x95d89b41 → string
timeGrowthStep 0x1cff4483 → uint256
timeStep 0x1502906d → uint256
tokensPerEther 0xf856d605 → uint256
totalSupply 0x18160ddd → uint256
Write Contract 10 functions
These functions modify contract state and require a wallet transaction to execute.
approve 0x095ea7b3
address spender
uint256 amount
returns: bool
burn 0x42966c68
uint256 amount
burnFrom 0x79cc6790
address from
uint256 amount
buyTokens 0xd0febe4c
No parameters
mint 0x40c10f19
address to
uint256 amount
returns: bool
setRate 0x34fcf437
uint256 newRate
transfer 0xa9059cbb
address to
uint256 amount
returns: bool
transferFrom 0x23b872dd
address from
address to
uint256 amount
returns: bool
updateRate 0xc7fee63e
No parameters
withdraw 0x2e1a7d4d
uint256 amount
Recent Transactions
This address has 1 on-chain transactions, but only 0.8% of the chain is indexed. Transactions will appear as indexing progresses. View on Etherscan →