Address Contract Verified
Address
0x08078D3D8A855b7e4156D1e4eEE1813fC83304aD
Balance
0 ETH
Nonce
1
Code Size
8057 bytes
Creator
0x1DdA9E9f...33f6 at tx 0xff79d023...50a257
Indexed Transactions
0
Contract Bytecode
8057 bytes
0x608060405234801561001057600080fd5b50600436106102745760003560e01c806370e08e6111610151578063cc1776d3116100c3578063e37ba8f911610087578063e37ba8f914610575578063f2fde38b14610588578063fad4e9b11461059b578063fbe4ee2a146105ae578063fdb20ccb146105b7578063fff0505e1461060c57600080fd5b8063cc1776d314610500578063d469801614610509578063d8c6404b1461051c578063dcb7a8a814610529578063dd62ed3e1461053c57600080fd5b806395d89b411161011557806395d89b41146104855780639f8290631461048d578063a457c2d7146104c8578063a51c9ace146104db578063a8660a78146104e4578063a9059cbb146104ed57600080fd5b806370e08e6114610448578063715018a61461045157806388eaa18a146104595780638a8c523c1461046c5780638da5cb5b1461047457600080fd5b8063419544a0116101ea57806354dd1da4116101ae57806354dd1da4146103df57806357b91233146103e7578063590ffdce146103fa5780636da54cd41461040d5780636fd8fb7a1461041657806370a082311461041f57600080fd5b8063419544a01461038457806349bd5a5e146103975780634f7041a5146103aa5780634fbee193146103b357806351ea605f146103d657600080fd5b806318160ddd1161023c57806318160ddd1461030f57806321cd0c401461031757806323b872dd1461032c578063313ce5671461033f578063395093511461034e5780633bbac5791461036157600080fd5b806306fdde0314610279578063095ea7b3146102975780631514617e146102ba5780631694505e146102d15780631726cbc8146102fc575b600080fd5b61028161061f565b60405161028e9190611ba1565b60405180910390f35b6102aa6102a5366004611c0b565b6106b1565b604051901515815260200161028e565b6102c360155481565b60405190815260200161028e565b600c546102e4906001600160a01b031681565b6040516001600160a01b03909116815260200161028e565b6102c361030a366004611c35565b6106cb565b6002546102c3565b61032a610325366004611c60565b6107bb565b005b6102aa61033a366004611c7b565b6107d6565b6040516006815260200161028e565b6102aa61035c366004611c0b565b6107fa565b6102aa61036f366004611c35565b600f6020526000908152604090205460ff1681565b61032a610392366004611c0b565b610839565b600d546102e4906001600160a01b031681565b6102c360075481565b6102aa6103c1366004611c35565b600e6020526000908152604090205460ff1681565b6102c360125481565b61032a6109fd565b61032a6103f5366004611cb7565b610b1d565b61032a610408366004611cd9565b610bfa565b6102c3600a5481565b6102c360115481565b6102c361042d366004611c35565b6001600160a01b031660009081526020819052604090205490565b6102c360095481565b61032a610c2d565b61032a610467366004611cb7565b610c41565b61032a610d28565b6005546001600160a01b03166102e4565b610281610dbb565b6104a061049b366004611c35565b610dca565b604080519586526020860194909452928401919091526060830152608082015260a00161028e565b6102aa6104d6366004611c0b565b610e44565b6102c361271081565b6102c360145481565b6102aa6104fb366004611c0b565b610ed8565b6102c360085481565b6006546102e4906001600160a01b031681565b6010546102aa9060ff1681565b61032a610537366004611d0c565b610ee6565b6102c361054a366004611d38565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61032a610583366004611c35565b611013565b61032a610596366004611c35565b6110ca565b61032a6105a9366004611d62565b611143565b6102c3600b5481565b6105ec6105c5366004611c35565b60136020526000908152604090208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161028e565b61032a61061a366004611d7b565b611150565b60606003805461062e90611dff565b80601f016020809104026020016040519081016040528092919081815260200182805461065a90611dff565b80156106a75780601f1061067c576101008083540402835291602001916106a7565b820191906000526020600020905b81548152906001019060200180831161068a57829003601f168201915b5050505050905090565b6000336106bf81858561123a565b60019150505b92915050565b6001600160a01b0381166000908152601360209081526040808320815160808101835281548082526001830154948201949094526002820154928101929092526003015460608201529082036107245750600092915050565b80604001514210156107395750600092915050565b8060600151816040015161074d9190611e4f565b421061076b57602081015181516107649190611e62565b9392505050565b600081604001514261077d9190611e62565b9050600082606001518284600001516107969190611e75565b6107a09190611e8c565b90508260200151816107b29190611e62565b95945050505050565b6107c3611347565b6010805460ff1916911515919091179055565b6000336107e48582856113a1565b6107ef85858561142d565b506001949350505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906106bf9082908690610834908790611e4f565b61123a565b610841611347565b6001600160a01b03821661089c5760405162461bcd60e51b815260206004820152601b60248201527f42656e6566696369617279206973207a65726f2061646472657373000000000060448201526064015b60405180910390fd5b600081116108ec5760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610893565b6001600160a01b038216600090815260136020526040902054156109525760405162461bcd60e51b815260206004820152601f60248201527f56657374696e67207363686564756c6520616c726561647920657869737473006044820152606401610893565b6040805160808101825282815260006020808301828152601454848601908152601554606086019081526001600160a01b038916855260139093529490922092518355905160018301559151600282015590516003909101556109b633308361142d565b816001600160a01b03167f969705509595726740fe60cc30769bbd53c883efff4d8e70108a82817e0392a9826040516109f191815260200190565b60405180910390a25050565b6000610a08336106cb565b905060008111610a515760405162461bcd60e51b81526020600482015260146024820152734e6f20746f6b656e7320746f2072656c6561736560601b6044820152606401610893565b3360009081526013602052604081206001018054839290610a73908490611e4f565b90915550503060009081526020819052604081208054839290610a97908490611e62565b90915550503360009081526020819052604081208054839290610abb908490611e4f565b909155505060405181815233907fc7798891864187665ac6dd119286e44ec13f014527aeeb2b8eb3fd413df931799060200160405180910390a260405181815233903090600080516020611f248339815191529060200160405180910390a350565b610b25611347565b612710821115610b6b5760405162461bcd60e51b8152602060048201526011602482015270084eaf240c4eae4dc40e8dede40d0d2ced607b1b6044820152606401610893565b612710811115610bb25760405162461bcd60e51b81526020600482015260126024820152710a6cad8d840c4eae4dc40e8dede40d0d2ced60731b6044820152606401610893565b6009829055600a81905560408051838152602081018390527f263c87936a5e67ee0cf8a36c254ed9ce096b452b8a2a24fc11d63c9fa760846691015b60405180910390a15050565b610c02611347565b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b610c35611347565b610c3f60006119e1565b565b610c49611347565b428211610c985760405162461bcd60e51b815260206004820152601c60248201527f53746172742074696d65206d75737420626520696e20667574757265000000006044820152606401610893565b60008111610ce85760405162461bcd60e51b815260206004820152601f60248201527f4475726174696f6e206d7573742062652067726561746572207468616e2030006044820152606401610893565b6014829055601581905560408051838152602081018390527fb79dde15bd2cbe08bc532457007350d72acb92c60f46fec5c08821eb34d4175f9101610bee565b610d30611347565b60115415610d805760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720616c726561647920656e61626c65640000000000000000006044820152606401610893565b4260118190556040519081527fb3da2db3dfc3778f99852546c6e9ab39ec253f9de7b0847afec61bd27878e9239060200160405180910390a1565b60606004805461062e90611dff565b6001600160a01b038116600090815260136020908152604080832081516080810183528154808252600183015494820185905260028301549382019390935260039091015460608201528392839283928392909190610e28896106cb565b6040840151606090940151929a91995097509195509350915050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015610ec95760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610893565b6107ef82866108348785611e62565b6000336106bf81858561142d565b610eee611347565b612710831115610f335760405162461bcd60e51b815260206004820152601060248201526f084eaf240e8c2f040e8dede40d0d2ced60831b6044820152606401610893565b612710821115610f795760405162461bcd60e51b81526020600482015260116024820152700a6cad8d840e8c2f040e8dede40d0d2ced607b1b6044820152606401610893565b612710811115610fbe5760405162461bcd60e51b815260206004820152601060248201526f084dee840e8c2f040e8dede40d0d2ced60831b6044820152606401610893565b60078390556008829055600b81905560408051848152602081018490529081018290527fad292e707e8a094bdd1cff9ec5263d8e4e538d8e6e457c032a2dbf7174ebec4b9060600160405180910390a1505050565b61101b611347565b6001600160a01b03811661106a5760405162461bcd60e51b8152602060048201526016602482015275496e76616c69642077616c6c6574206164647265737360501b6044820152606401610893565b600680546001600160a01b0319166001600160a01b0383169081179091556000818152600e6020526040808220805460ff19166001179055517fc0f8ad2683cf240266d4f868f5b59a16c13e4a0ff63dfcfb0f0cd3843a1217849190a250565b6110d2611347565b6001600160a01b0381166111375760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610893565b611140816119e1565b50565b61114b611347565b601255565b611158611347565b60005b828110156112345781600f600086868581811061117a5761117a611eae565b905060200201602081019061118f9190611c35565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558383828181106111c9576111c9611eae565b90506020020160208101906111de9190611c35565b6001600160a01b03167f066e0c23b9ae0bb92a88e9b0985bb7d85fce062730057312b99a9e243fde5ee18360405161121a911515815260200190565b60405180910390a28061122c81611ec4565b91505061115b565b50505050565b6001600160a01b0383166112905760405162461bcd60e51b815260206004820181905260248201527f45524332303a20617070726f76652066726f6d207a65726f20616464726573736044820152606401610893565b6001600160a01b0382166112e65760405162461bcd60e51b815260206004820152601e60248201527f45524332303a20617070726f766520746f207a65726f206164647265737300006044820152606401610893565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b03163314610c3f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610893565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461123457818110156114205760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610893565b611234848484840361123a565b6001600160a01b0383166114915760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610893565b6001600160a01b0382166114f35760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610893565b8060000361150c5761150783836000611a33565b505050565b60115415801561153557506001600160a01b0383166000908152600e602052604090205460ff16155b801561155a57506001600160a01b0382166000908152600e602052604090205460ff16155b156115d757600d546001600160a01b0384811691161480159061158b5750600d546001600160a01b03838116911614155b6115d75760405162461bcd60e51b815260206004820152601760248201527f54726164696e67206e6f7420656e61626c6564207965740000000000000000006044820152606401610893565b60105460ff1680156115eb57506000601154115b801561160657506012546011546116029190611e4f565b4211155b801561161f5750600d546001600160a01b038481169116145b801561164457506001600160a01b0382166000908152600e602052604090205460ff16155b801561165e5750600c546001600160a01b03838116911614155b156116ad576001600160a01b0382166000818152600f6020526040808220805460ff19166001179055517fd77eaf3fe9e65173bafe1c3a3d681a671b7517ffcd601dbbd91e3c721337548c9190a25b6001600160a01b038316600090815260208190526040902054818110156116e65760405162461bcd60e51b815260040161089390611edd565b6001600160a01b0384166000908152600e6020526040812054819060ff1615801561172a57506001600160a01b0385166000908152600e602052604090205460ff16155b1561184d576001600160a01b0386166000908152600f602052604090205460ff1680156117645750600d546001600160a01b038681169116145b1561178b57612710600b548561177a9190611e75565b6117849190611e8c565b915061184d565b600d546001600160a01b0386811691161480156117aa57506000600854115b156117ee57612710600854856117c09190611e75565b6117ca9190611e8c565b9150612710600a54856117dd9190611e75565b6117e79190611e8c565b905061184d565b600d546001600160a01b03878116911614801561180d57506000600754115b1561184d57612710600754856118239190611e75565b61182d9190611e8c565b9150612710600954856118409190611e75565b61184a9190611e8c565b90505b6001600160a01b0386166000908152602081905260409020848403905581156118d3576006546001600160a01b03166000908152602081905260408120805484929061189a908490611e4f565b90915550506006546040518381526001600160a01b0391821691881690600080516020611f248339815191529060200160405180910390a35b801561194d5761dead600090815260208190527f44ad89ba62b98ff34f51403ac22759b55759460c0bb5521eb4b6ee3cff49cf838054839290611917908490611e4f565b909155505060405181815261dead906001600160a01b03881690600080516020611f248339815191529060200160405180910390a35b6119578183611e4f565b6119619085611e62565b935083600080876001600160a01b03166001600160a01b0316815260200190815260200160002060008282546119979190611e4f565b92505081905550846001600160a01b0316866001600160a01b0316600080516020611f24833981519152866040516119d191815260200190565b60405180910390a3505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316611a935760405162461bcd60e51b815260206004820152602160248201527f45524332303a207472616e736665722066726f6d207a65726f206164647265736044820152607360f81b6064820152608401610893565b6001600160a01b038216611ae95760405162461bcd60e51b815260206004820152601f60248201527f45524332303a207472616e7366657220746f207a65726f2061646472657373006044820152606401610893565b6001600160a01b03831660009081526020819052604090205481811015611b225760405162461bcd60e51b815260040161089390611edd565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611b59908490611e4f565b92505081905550826001600160a01b0316846001600160a01b0316600080516020611f2483398151915284604051611b9391815260200190565b60405180910390a350505050565b600060208083528351808285015260005b81811015611bce57858101830151858201604001528201611bb2565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611c0657600080fd5b919050565b60008060408385031215611c1e57600080fd5b611c2783611bef565b946020939093013593505050565b600060208284031215611c4757600080fd5b61076482611bef565b80358015158114611c0657600080fd5b600060208284031215611c7257600080fd5b61076482611c50565b600080600060608486031215611c9057600080fd5b611c9984611bef565b9250611ca760208501611bef565b9150604084013590509250925092565b60008060408385031215611cca57600080fd5b50508035926020909101359150565b60008060408385031215611cec57600080fd5b611cf583611bef565b9150611d0360208401611c50565b90509250929050565b600080600060608486031215611d2157600080fd5b505081359360208301359350604090920135919050565b60008060408385031215611d4b57600080fd5b611d5483611bef565b9150611d0360208401611bef565b600060208284031215611d7457600080fd5b5035919050565b600080600060408486031215611d9057600080fd5b833567ffffffffffffffff80821115611da857600080fd5b818601915086601f830112611dbc57600080fd5b813581811115611dcb57600080fd5b8760208260051b8501011115611de057600080fd5b602092830195509350611df69186019050611c50565b90509250925092565b600181811c90821680611e1357607f821691505b602082108103611e3357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156106c5576106c5611e39565b818103818111156106c5576106c5611e39565b80820281158282048414176106c5576106c5611e39565b600082611ea957634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600060018201611ed657611ed6611e39565b5060010190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b60608201526080019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122089850702bb939a0916c9a8f314d55d7404ec6d04668de4382acb32f2c065b89c64736f6c63430008130033
Verified Source Code Full Match
Compiler: v0.8.19+commit.7dd6d404
EVM: paris
Optimization: Yes (200 runs)
Context.sol 16 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
/**
* @dev Provides information about the current execution context.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
ERC20.sol 121 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "./Context.sol";
import "./IERC20Metadata.sol";
/**
* @dev Implementation of the ERC20 interface.
*/
contract ERC20 is Context, IERC20Metadata {
mapping(address => uint256) internal _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function name() public view virtual override returns (string memory) {
return _name;
}
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
function decimals() public view virtual override returns (uint8) {
return 18;
}
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
address sender = _msgSender();
_transfer(sender, recipient, amount);
return true;
}
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public virtual override returns (bool) {
address sender = _msgSender();
_approve(sender, spender, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
address caller = _msgSender();
_spendAllowance(sender, caller, amount);
_transfer(sender, recipient, amount);
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address sender = _msgSender();
_approve(sender, spender, _allowances[sender][spender] + addedValue);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
address sender = _msgSender();
uint256 currentAllowance = _allowances[sender][spender];
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
_approve(sender, spender, currentAllowance - subtractedValue);
return true;
}
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from zero address");
require(recipient != address(0), "ERC20: transfer to zero address");
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[sender] = senderBalance - amount;
}
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
}
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to zero address");
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
}
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from zero address");
require(spender != address(0), "ERC20: approve to zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
}
IERC20.sol 18 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
IERC20Metadata.sol 14 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "./IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*/
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
Ownable.sol 88 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "./Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(
newOwner != address(0),
"Ownable: new owner is the zero address"
);
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
UbuntuToken.sol 360 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "./ERC20.sol";
import "./Ownable.sol";
interface IUniswapV2Factory {
function createPair(
address tokenA,
address tokenB
) external returns (address pair);
}
interface IUniswapV2Router02 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
}
/**
* @dev Ubuntu Token Contract with anti-bot and vesting features
* - Anti-bot: 99% tax on bot sells, sent to liquidity pool
* - Vesting: Gradual token release over 18 months starting June 1, 2026
* - Tax applies only on DEX trades (Uniswap)
* - Regular wallet-to-wallet transfers have 0% tax
*/
contract UbuntuToken is ERC20, Ownable {
address public liquidityWallet = address(0xa591f5Fcd9756008918259a60701b4040ff5A676);
uint256 public buyTax = 300; // 3% (300/10000)
uint256 public sellTax = 300; // 3% (300/10000)
uint256 public buyBurn = 2; // 0.02% (2/10000)
uint256 public sellBurn = 2; // 0.02% (2/10000)
uint256 public botTax = 9900; // 99% (9900/10000) for bots
uint256 public constant TAX_DENOMINATOR = 10000;
IUniswapV2Router02 public uniswapV2Router;
address public uniswapV2Pair;
// Addresses exempt from tax
mapping(address => bool) public isExcludedFromFees;
// Anti-bot tracking
mapping(address => bool) public isBot;
bool public antiBotEnabled = true;
uint256 public tradingEnabledTime;
uint256 public botProtectionDuration = 300; // 5 minutes in seconds
// Vesting structure
struct VestingSchedule {
uint256 totalAmount;
uint256 released;
uint256 startTime;
uint256 duration;
}
mapping(address => VestingSchedule) public vestingSchedules;
uint256 public vestingStartTime = 1748736000; // June 1, 2026 00:00:00 UTC
uint256 public vestingDuration = 18 * 30 days; // 18 months (approximately)
event BotDetected(address indexed bot);
event BotStatusUpdated(address indexed account, bool isBot);
event VestingScheduleCreated(address indexed beneficiary, uint256 amount);
event TokensReleased(address indexed beneficiary, uint256 amount);
event TaxUpdated(uint256 buyTax, uint256 sellTax, uint256 botTax);
event BurnUpdated(uint256 buyBurn, uint256 sellBurn);
event LiquidityWalletUpdated(address indexed newWallet);
event VestingConfigUpdated(uint256 startTime, uint256 duration);
event TradingEnabled(uint256 timestamp);
constructor() ERC20("UbuntuCoin", "UBU") Ownable() {
// Set up Uniswap router based on chain
if (block.chainid == 1) {
// Ethereum Mainnet
uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
} else if (block.chainid == 11155111) {
// Sepolia
uniswapV2Router = IUniswapV2Router02(0xeE567Fe1712Faf6149d80dA1E6934E354124CfE3);
}
// Create Uniswap pair
uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory())
.createPair(address(this), uniswapV2Router.WETH());
// Mint total supply
_mint(msg.sender, 10_000_000_000 * 10 ** decimals());
// Exempt owner, contract, and dead address from tax
isExcludedFromFees[msg.sender] = true;
isExcludedFromFees[address(this)] = true;
isExcludedFromFees[address(0xdead)] = true;
isExcludedFromFees[liquidityWallet] = true;
// Trading will be enabled by owner
tradingEnabledTime = 0;
}
function decimals() public view virtual override returns (uint8) {
return 6;
}
/**
* @dev Override transfer to apply tax ONLY on DEX trades with anti-bot logic
* Regular wallet-to-wallet transfers have NO tax
*/
function _transfer(address from, address to, uint256 amount) internal virtual override {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
if (amount == 0) {
super._transfer(from, to, 0);
return;
}
// Check if trading is enabled (allow owner and excluded addresses to trade before launch)
if (tradingEnabledTime == 0 && !isExcludedFromFees[from] && !isExcludedFromFees[to]) {
require(from != uniswapV2Pair && to != uniswapV2Pair, "Trading not enabled yet");
}
// Anti-bot detection: Mark as bot if buying in first blocks after launch
if (antiBotEnabled && tradingEnabledTime > 0 &&
block.timestamp <= tradingEnabledTime + botProtectionDuration &&
from == uniswapV2Pair && !isExcludedFromFees[to] && to != address(uniswapV2Router)) {
isBot[to] = true;
emit BotDetected(to);
}
uint256 senderBalance = _balances[from];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
// Calculate fees (only on buys/sells, NOT on wallet transfers)
uint256 fees = 0;
uint256 burnAmount = 0;
if (!isExcludedFromFees[from] && !isExcludedFromFees[to]) {
// Apply 99% tax to bots selling
if (isBot[from] && to == uniswapV2Pair) {
fees = (amount * botTax) / TAX_DENOMINATOR;
}
// On sell (transfer to Uniswap pair)
else if (to == uniswapV2Pair && sellTax > 0) {
fees = (amount * sellTax) / TAX_DENOMINATOR;
burnAmount = (amount * sellBurn) / TAX_DENOMINATOR;
}
// On buy (transfer from Uniswap pair)
else if (from == uniswapV2Pair && buyTax > 0) {
fees = (amount * buyTax) / TAX_DENOMINATOR;
burnAmount = (amount * buyBurn) / TAX_DENOMINATOR;
}
}
// Execute transfer
unchecked {
_balances[from] = senderBalance - amount;
}
if (fees > 0) {
// Transfer fees to liquidity wallet
_balances[liquidityWallet] += fees;
emit Transfer(from, liquidityWallet, fees);
}
if (burnAmount > 0) {
// Burn tokens (send to dead address)
_balances[address(0xdead)] += burnAmount;
emit Transfer(from, address(0xdead), burnAmount);
}
amount -= (fees + burnAmount);
_balances[to] += amount;
emit Transfer(from, to, amount);
}
// ============================================
// VESTING FUNCTIONS
// ============================================
/**
* @dev Create a vesting schedule for a beneficiary (only owner)
* @param beneficiary Address to receive vested tokens
* @param amount Total amount of tokens to vest
*/
function createVestingSchedule(address beneficiary, uint256 amount) external onlyOwner {
require(beneficiary != address(0), "Beneficiary is zero address");
require(amount > 0, "Amount must be greater than 0");
require(vestingSchedules[beneficiary].totalAmount == 0, "Vesting schedule already exists");
vestingSchedules[beneficiary] = VestingSchedule({
totalAmount: amount,
released: 0,
startTime: vestingStartTime,
duration: vestingDuration
});
// Transfer tokens to contract for vesting
_transfer(msg.sender, address(this), amount);
emit VestingScheduleCreated(beneficiary, amount);
}
/**
* @dev Calculate releasable tokens for a beneficiary
* @param beneficiary Address to check
*/
function releasableAmount(address beneficiary) public view returns (uint256) {
VestingSchedule memory schedule = vestingSchedules[beneficiary];
if (schedule.totalAmount == 0) {
return 0;
}
if (block.timestamp < schedule.startTime) {
return 0;
}
if (block.timestamp >= schedule.startTime + schedule.duration) {
return schedule.totalAmount - schedule.released;
}
uint256 timeFromStart = block.timestamp - schedule.startTime;
uint256 vestedAmount = (schedule.totalAmount * timeFromStart) / schedule.duration;
return vestedAmount - schedule.released;
}
/**
* @dev Release vested tokens to beneficiary
*/
function releaseVestedTokens() external {
uint256 unreleased = releasableAmount(msg.sender);
require(unreleased > 0, "No tokens to release");
vestingSchedules[msg.sender].released += unreleased;
_balances[address(this)] -= unreleased;
_balances[msg.sender] += unreleased;
emit TokensReleased(msg.sender, unreleased);
emit Transfer(address(this), msg.sender, unreleased);
}
/**
* @dev Get vesting schedule information
*/
function getVestingSchedule(address beneficiary) external view returns (
uint256 totalAmount,
uint256 released,
uint256 releasable,
uint256 startTime,
uint256 duration
) {
VestingSchedule memory schedule = vestingSchedules[beneficiary];
return (
schedule.totalAmount,
schedule.released,
releasableAmount(beneficiary),
schedule.startTime,
schedule.duration
);
}
// ============================================
// ANTI-BOT FUNCTIONS
// ============================================
/**
* @dev Enable trading (can only be called once by owner)
*/
function enableTrading() external onlyOwner {
require(tradingEnabledTime == 0, "Trading already enabled");
tradingEnabledTime = block.timestamp;
emit TradingEnabled(block.timestamp);
}
/**
* @dev Manually mark addresses as bots
*/
function setBotStatus(address[] calldata accounts, bool status) external onlyOwner {
for (uint256 i = 0; i < accounts.length; i++) {
isBot[accounts[i]] = status;
emit BotStatusUpdated(accounts[i], status);
}
}
/**
* @dev Toggle anti-bot mechanism
*/
function setAntiBotEnabled(bool enabled) external onlyOwner {
antiBotEnabled = enabled;
}
/**
* @dev Update bot protection duration
*/
function setBotProtectionDuration(uint256 duration) external onlyOwner {
botProtectionDuration = duration;
}
// ============================================
// ADMIN FUNCTIONS
// ============================================
/**
* @dev Update tax rates
*/
function updateTax(uint256 _buyTax, uint256 _sellTax, uint256 _botTax) external onlyOwner {
require(_buyTax <= 10000, "Buy tax too high"); // Max 10%
require(_sellTax <= 10000, "Sell tax too high"); // Max 10%
require(_botTax <= 10000, "Bot tax too high"); // Max 10%
buyTax = _buyTax;
sellTax = _sellTax;
botTax = _botTax;
emit TaxUpdated(_buyTax, _sellTax, _botTax);
}
/**
* @dev Update burn rates
*/
function updateBurn(uint256 _buyBurn, uint256 _sellBurn) external onlyOwner {
require(_buyBurn <= 10000, "Buy burn too high"); // Max 1%
require(_sellBurn <= 10000, "Sell burn too high"); // Max 1%
buyBurn = _buyBurn;
sellBurn = _sellBurn;
emit BurnUpdated(_buyBurn, _sellBurn);
}
/**
* @dev Update liquidity wallet address
*/
function updateLiquidityWallet(address newWallet) external onlyOwner {
require(newWallet != address(0), "Invalid wallet address");
liquidityWallet = newWallet;
isExcludedFromFees[newWallet] = true;
emit LiquidityWalletUpdated(newWallet);
}
/**
* @dev Update vesting configuration
*/
function updateVestingConfig(uint256 _startTime, uint256 _duration) external onlyOwner {
require(_startTime > block.timestamp, "Start time must be in future");
require(_duration > 0, "Duration must be greater than 0");
vestingStartTime = _startTime;
vestingDuration = _duration;
emit VestingConfigUpdated(_startTime, _duration);
}
/**
* @dev Set fee exclusion status
*/
function setExcludedFromFees(address account, bool excluded) external onlyOwner {
isExcludedFromFees[account] = excluded;
}
}
Read Contract
TAX_DENOMINATOR 0xa51c9ace → uint256
allowance 0xdd62ed3e → uint256
antiBotEnabled 0xd8c6404b → bool
balanceOf 0x70a08231 → uint256
botProtectionDuration 0x51ea605f → uint256
botTax 0xfbe4ee2a → uint256
buyBurn 0x70e08e61 → uint256
buyTax 0x4f7041a5 → uint256
decimals 0x313ce567 → uint8
getVestingSchedule 0x9f829063 → uint256, uint256, uint256, uint256, uint256
isBot 0x3bbac579 → bool
isExcludedFromFees 0x4fbee193 → bool
liquidityWallet 0xd4698016 → address
name 0x06fdde03 → string
owner 0x8da5cb5b → address
releasableAmount 0x1726cbc8 → uint256
sellBurn 0x6da54cd4 → uint256
sellTax 0xcc1776d3 → uint256
symbol 0x95d89b41 → string
totalSupply 0x18160ddd → uint256
tradingEnabledTime 0x6fd8fb7a → uint256
uniswapV2Pair 0x49bd5a5e → address
uniswapV2Router 0x1694505e → address
vestingDuration 0x1514617e → uint256
vestingSchedules 0xfdb20ccb → uint256, uint256, uint256, uint256
vestingStartTime 0xa8660a78 → uint256
Write Contract 18 functions
These functions modify contract state and require a wallet transaction to execute.
approve 0x095ea7b3
address spender
uint256 amount
returns: bool
createVestingSchedule 0x419544a0
address beneficiary
uint256 amount
decreaseAllowance 0xa457c2d7
address spender
uint256 subtractedValue
returns: bool
enableTrading 0x8a8c523c
No parameters
increaseAllowance 0x39509351
address spender
uint256 addedValue
returns: bool
releaseVestedTokens 0x54dd1da4
No parameters
renounceOwnership 0x715018a6
No parameters
setAntiBotEnabled 0x21cd0c40
bool enabled
setBotProtectionDuration 0xfad4e9b1
uint256 duration
setBotStatus 0xfff0505e
address[] accounts
bool status
setExcludedFromFees 0x590ffdce
address account
bool excluded
transfer 0xa9059cbb
address recipient
uint256 amount
returns: bool
transferFrom 0x23b872dd
address sender
address recipient
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address newOwner
updateBurn 0x57b91233
uint256 _buyBurn
uint256 _sellBurn
updateLiquidityWallet 0xe37ba8f9
address newWallet
updateTax 0xdcb7a8a8
uint256 _buyTax
uint256 _sellTax
uint256 _botTax
updateVestingConfig 0x88eaa18a
uint256 _startTime
uint256 _duration
Recent Transactions
No transactions found for this address