This contract's source code is verified! Compiler
0.8.27+commit.40a35a09
File 1 of 9: ERC20.sol
pragma solidity >=0.8.0;
abstract contract ERC20 {
event Transfer (address indexed from , address indexed to, uint256 amount ) ;
event Approval (address indexed owner, address indexed spender, uint256 amount ) ;
string public name;
string public symbol;
uint8 public immutable decimals;
uint256 public totalSupply;
mapping (address = > uint256 ) public balanceOf;
mapping (address = > mapping (address = > uint256 )) public allowance;
uint256 internal immutable INITIAL_CHAIN_ID;
bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;
mapping (address = > uint256 ) public nonces;
constructor (
string memory _name,
string memory _symbol,
uint8 _decimals
) {
name = _name;
symbol = _symbol;
decimals = _decimals;
INITIAL_CHAIN_ID = block .chainid ;
INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
}
function approve (address spender, uint256 amount ) public virtual returns (bool ) {
allowance[msg .sender ][spender] = amount;
emit Approval(msg .sender , spender, amount);
return true ;
}
function transfer (address to, uint256 amount ) public virtual returns (bool ) {
balanceOf[msg .sender ] - = amount;
amount = _transferHook(msg .sender , to, amount);
unchecked {
balanceOf[to] + = amount;
}
emit Transfer(msg .sender , to, amount);
return true ;
}
function _transferHook (address from , address to, uint256 amount ) internal virtual returns (uint256 amountTo ) {
return amount;
}
function transferFrom (
address from ,
address to,
uint256 amount
) public virtual returns (bool ) {
uint256 allowed = allowance[from ][msg .sender ];
if (allowed ! = type (uint256 ).max ) allowance[from ][msg .sender ] = allowed - amount;
balanceOf[from ] - = amount;
amount = _transferHook(from , to, amount);
unchecked {
balanceOf[to] + = amount;
}
emit Transfer(from , to, amount);
return true ;
}
function permit (
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) public virtual {
require (deadline > = block .timestamp , "PERMIT_DEADLINE_EXPIRED" );
unchecked {
address recoveredAddress = ecrecover (
keccak256 (
abi .encodePacked (
"\x19\x01" ,
DOMAIN_SEPARATOR(),
keccak256 (
abi .encode (
keccak256 (
"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
),
owner,
spender,
value,
nonces[owner]+ + ,
deadline
)
)
)
),
v,
r,
s
);
require (recoveredAddress ! = address (0 ) & & recoveredAddress = = owner, "INVALID_SIGNER" );
allowance[recoveredAddress][spender] = value;
}
emit Approval(owner, spender, value);
}
function DOMAIN_SEPARATOR ( ) public view virtual returns (bytes32 ) {
return block .chainid = = INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
}
function computeDomainSeparator ( ) internal view virtual returns (bytes32 ) {
return
keccak256 (
abi .encode (
keccak256 ("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ),
keccak256 (bytes (name)),
keccak256 ("1" ),
block .chainid ,
address (this )
)
);
}
function _mint (address to, uint256 amount ) internal virtual {
totalSupply + = amount;
unchecked {
balanceOf[to] + = amount;
}
emit Transfer(address (0 ), to, amount);
}
function _burn (address from , uint256 amount ) internal virtual {
balanceOf[from ] - = amount;
unchecked {
totalSupply - = amount;
}
emit Transfer(from , address (0 ), amount);
}
}
File 2 of 9: IUniswapV2Factory.sol
pragma solidity >=0.5.0;
interface IUniswapV2Factory {
event PairCreated (address indexed token0, address indexed token1, address pair, uint ) ;
function feeTo ( ) external view returns (address ) ;
function feeToSetter ( ) external view returns (address ) ;
function getPair (address tokenA, address tokenB ) external view returns (address pair ) ;
function allPairs (uint ) external view returns (address pair ) ;
function allPairsLength ( ) external view returns (uint ) ;
function createPair (address tokenA, address tokenB ) external returns (address pair ) ;
function setFeeTo (address ) external ;
function setFeeToSetter (address ) external ;
}
File 3 of 9: IUniswapV2Pair.sol
pragma solidity >=0.5.0;
interface IUniswapV2Pair {
event Approval (address indexed owner, address indexed spender, uint value ) ;
event Transfer (address indexed from , address indexed to, uint value ) ;
function name ( ) external pure returns (string memory ) ;
function symbol ( ) external pure returns (string memory ) ;
function decimals ( ) external pure returns (uint8 ) ;
function totalSupply ( ) external view returns (uint ) ;
function balanceOf (address owner ) external view returns (uint ) ;
function allowance (address owner, address spender ) external view returns (uint ) ;
function approve (address spender, uint value ) external returns (bool ) ;
function transfer (address to, uint value ) external returns (bool ) ;
function transferFrom (address from , address to, uint value ) external returns (bool ) ;
function DOMAIN_SEPARATOR ( ) external view returns (bytes32 ) ;
function PERMIT_TYPEHASH ( ) external pure returns (bytes32 ) ;
function nonces (address owner ) external view returns (uint ) ;
function permit (address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s ) external ;
event Mint (address indexed sender, uint amount0, uint amount1 ) ;
event Burn (address indexed sender, uint amount0, uint amount1, address indexed to ) ;
event Swap (
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
) ;
event Sync (uint112 reserve0, uint112 reserve1 ) ;
function MINIMUM_LIQUIDITY ( ) external pure returns (uint ) ;
function factory ( ) external view returns (address ) ;
function token0 ( ) external view returns (address ) ;
function token1 ( ) external view returns (address ) ;
function getReserves ( ) external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ) ;
function price0CumulativeLast ( ) external view returns (uint ) ;
function price1CumulativeLast ( ) external view returns (uint ) ;
function kLast ( ) external view returns (uint ) ;
function mint (address to ) external returns (uint liquidity ) ;
function burn (address to ) external returns (uint amount0, uint amount1 ) ;
function swap (uint amount0Out, uint amount1Out, address to, bytes calldata data ) external ;
function skim (address to ) external ;
function sync ( ) external ;
function initialize (address , address ) external ;
}
File 4 of 9: IUniswapV2Router01.sol
pragma solidity >=0.6.2;
interface IUniswapV2Router01 {
function factory ( ) external pure returns (address ) ;
function WETH ( ) external pure returns (address ) ;
function addLiquidity (
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity ) ;
function addLiquidityETH (
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity ) ;
function removeLiquidity (
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB ) ;
function removeLiquidityETH (
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH ) ;
function removeLiquidityWithPermit (
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB ) ;
function removeLiquidityETHWithPermit (
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH ) ;
function swapExactTokensForTokens (
uint amountIn,
uint amountOutMin,
address [] calldata path,
address to,
uint deadline
) external returns (uint [] memory amounts ) ;
function swapTokensForExactTokens (
uint amountOut,
uint amountInMax,
address [] calldata path,
address to,
uint deadline
) external returns (uint [] memory amounts ) ;
function swapExactETHForTokens (uint amountOutMin, address [] calldata path, address to, uint deadline )
external
payable
returns (uint [] memory amounts ) ;
function swapTokensForExactETH (uint amountOut, uint amountInMax, address [] calldata path, address to, uint deadline )
external
returns (uint [] memory amounts ) ;
function swapExactTokensForETH (uint amountIn, uint amountOutMin, address [] calldata path, address to, uint deadline )
external
returns (uint [] memory amounts ) ;
function swapETHForExactTokens (uint amountOut, address [] calldata path, address to, uint deadline )
external
payable
returns (uint [] memory amounts ) ;
function quote (uint amountA, uint reserveA, uint reserveB ) external pure returns (uint amountB ) ;
function getAmountOut (uint amountIn, uint reserveIn, uint reserveOut ) external pure returns (uint amountOut ) ;
function getAmountIn (uint amountOut, uint reserveIn, uint reserveOut ) external pure returns (uint amountIn ) ;
function getAmountsOut (uint amountIn, address [] calldata path ) external view returns (uint [] memory amounts ) ;
function getAmountsIn (uint amountOut, address [] calldata path ) external view returns (uint [] memory amounts ) ;
}
File 5 of 9: IUniswapV2Router02.sol
pragma solidity >=0.6.2;
import './IUniswapV2Router01.sol' ;
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens (
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH ) ;
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens (
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH ) ;
function swapExactTokensForTokensSupportingFeeOnTransferTokens (
uint amountIn,
uint amountOutMin,
address [] calldata path,
address to,
uint deadline
) external ;
function swapExactETHForTokensSupportingFeeOnTransferTokens (
uint amountOutMin,
address [] calldata path,
address to,
uint deadline
) external payable ;
function swapExactTokensForETHSupportingFeeOnTransferTokens (
uint amountIn,
uint amountOutMin,
address [] calldata path,
address to,
uint deadline
) external ;
}
File 6 of 9: Owned.sol
pragma solidity >=0.8.0;
abstract contract Owned {
event OwnershipTransferred (address indexed user, address indexed newOwner ) ;
address public owner;
modifier onlyOwner ( ) virtual {
require (msg .sender = = owner, "UNAUTHORIZED" );
_ ;
}
constructor (address _owner ) {
owner = _owner;
emit OwnershipTransferred(address (0 ), _owner);
}
function transferOwnership (address newOwner ) public virtual onlyOwner {
owner = newOwner;
emit OwnershipTransferred(msg .sender , newOwner);
}
}
File 7 of 9: SafeTransferLib.sol
pragma solidity >=0.8.0;
import {ERC20 } from "../tokens/ERC20.sol" ;
library SafeTransferLib {
function safeTransferETH (address to, uint256 amount ) internal {
bool success;
assembly {
success := call (gas (), to, amount, 0 , 0 , 0 , 0 )
}
require (success, "ETH_TRANSFER_FAILED" );
}
function safeTransferFrom (
ERC20 token,
address from ,
address to,
uint256 amount
) internal {
bool success;
assembly {
let freeMemoryPointer := mload (0x40 )
mstore (freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000 )
mstore (add (freeMemoryPointer, 4 ), and (from, 0xffffffffffffffffffffffffffffffffffffffff ))
mstore (add (freeMemoryPointer, 36 ), and (to, 0xffffffffffffffffffffffffffffffffffffffff ))
mstore (add (freeMemoryPointer, 68 ), amount)
success := and (
or (and (eq (mload (0 ), 1 ), gt (returndatasize (), 31 )), iszero (returndatasize ())),
call (gas (), token, 0 , freeMemoryPointer, 100 , 0 , 32 )
)
}
require (success, "TRANSFER_FROM_FAILED" );
}
function safeTransfer (
ERC20 token,
address to,
uint256 amount
) internal {
bool success;
assembly {
let freeMemoryPointer := mload (0x40 )
mstore (freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000 )
mstore (add (freeMemoryPointer, 4 ), and (to, 0xffffffffffffffffffffffffffffffffffffffff ))
mstore (add (freeMemoryPointer, 36 ), amount)
success := and (
or (and (eq (mload (0 ), 1 ), gt (returndatasize (), 31 )), iszero (returndatasize ())),
call (gas (), token, 0 , freeMemoryPointer, 68 , 0 , 32 )
)
}
require (success, "TRANSFER_FAILED" );
}
function safeApprove (
ERC20 token,
address to,
uint256 amount
) internal {
bool success;
assembly {
let freeMemoryPointer := mload (0x40 )
mstore (freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000 )
mstore (add (freeMemoryPointer, 4 ), and (to, 0xffffffffffffffffffffffffffffffffffffffff ))
mstore (add (freeMemoryPointer, 36 ), amount)
success := and (
or (and (eq (mload (0 ), 1 ), gt (returndatasize (), 31 )), iszero (returndatasize ())),
call (gas (), token, 0 , freeMemoryPointer, 68 , 0 , 32 )
)
}
require (success, "APPROVE_FAILED" );
}
}
File 8 of 9: Unibridge.sol
pragma solidity ^0.8.0;
import '@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol' ;
import '@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol' ;
import '@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol' ;
import 'solmate/src/tokens/ERC20.sol' ;
import 'solmate/src/utils/SafeTransferLib.sol' ;
import 'solmate/src/auth/Owned.sol' ;
import 'solmate/src/tokens/WETH.sol' ;
enum TRANSFER_TYPE {
BUY,
SELL,
TRANSFER
}
contract Unibridge is ERC20 , Owned {
using SafeTransferLib for ERC20 ;
modifier checkTaxes (uint256 _tax ) {
if (_tax > maxTax) revert TaxTooHigh();
_ ;
}
modifier onlyAllowed ( ) {
if (msg .sender ! = deployer & & msg .sender ! = owner) revert NotAllowed();
_ ;
}
error NotTrading ( ) ;
error TaxTooHigh ( ) ;
error NotAllowed ( ) ;
error InvalidAddress ( ) ;
IUniswapV2Router02 internal constant router =
IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D );
WETH internal immutable weth;
IUniswapV2Factory internal immutable factory;
IUniswapV2Pair public immutable pair;
address internal immutable deployer;
address public treasury;
uint256 public constant TOTAL_SUPPLY = 10_000_000 ether ;
uint256 internal constant MAX_SELL_CHUNK = TOTAL_SUPPLY / 100 ;
uint256 public maxTax = 300 ;
uint256 public buyTax = 50 ;
uint256 public sellTax = 50 ;
bool public tradingEnabled;
constructor (
string memory _name,
string memory _symbol
) ERC20 (_name, _symbol, 18 ) Owned (msg .sender ) {
weth = WETH(payable (router.WETH()));
factory = IUniswapV2Factory(router.factory());
pair = IUniswapV2Pair(factory.createPair(address (this ), address (weth)));
_mint(msg .sender , TOTAL_SUPPLY);
approve(address (router), type (uint256 ).max );
approve(address (this ), type (uint256 ).max );
deployer = msg .sender ;
}
function setBuyTax (uint256 _tax ) external onlyOwner checkTaxes (_tax ) {
buyTax = _tax;
}
function setSellTax (uint256 _tax ) external onlyOwner checkTaxes (_tax ) {
sellTax = _tax;
}
function enableTrading ( ) external onlyOwner ( ) {
tradingEnabled = true ;
}
function setTreasury (address _treasury ) external onlyAllowed {
treasury = _treasury;
}
function _transferHook (
address from ,
address to,
uint256 amount
) internal override returns (uint256 ) {
(bool allowed, TRANSFER_TYPE transferType, bool skipTax) = _isAllowedToTrade(from , to, amount);
if (! allowed) revert NotTrading();
if (transferType = = TRANSFER_TYPE.BUY & & ! skipTax) {
uint256 tax = (amount * buyTax) / 1000 ;
amount - = tax;
balanceOf[address (this )] + = tax;
} else if (transferType = = TRANSFER_TYPE.SELL) {
if (! skipTax) {
uint256 tax = (amount * sellTax) / 1000 ;
amount - = tax;
balanceOf[address (this )] + = tax;
}
_sellChunk();
}
return amount;
}
function _isAllowedToTrade (
address _from,
address _to,
uint256 _amount
) internal view returns (bool allowed, TRANSFER_TYPE transferType, bool skipTax ) {
if (_from = = deployer | | _from = = owner | | _from = = treasury | | _from = = address (this ))
return (true , TRANSFER_TYPE.TRANSFER, true );
if (_to = = deployer | | _to = = owner | | _to = = treasury | | _to = = address (this ))
return (true , TRANSFER_TYPE.TRANSFER, true );
if (! tradingEnabled) return (false , TRANSFER_TYPE.TRANSFER, false );
TRANSFER_TYPE transferType = _from = = address (pair) ? TRANSFER_TYPE.BUY : _to = = address (pair) ? TRANSFER_TYPE.SELL : TRANSFER_TYPE.TRANSFER;
return (
true ,
transferType,
(transferType = = TRANSFER_TYPE.TRANSFER) ? true : false
);
}
function _sellChunk ( ) internal {
allowance[address (this )][address (router)] = type (uint256 ).max ;
uint256 balance = balanceOf[address (this )];
if (balance > MAX_SELL_CHUNK) balance = MAX_SELL_CHUNK;
if (balance = = 0 ) return ;
address [] memory path = new address [](2 );
path[0 ] = address (this );
path[1 ] = address (weth);
router.swapExactTokensForETHSupportingFeeOnTransferTokens(
balance,
0 ,
path,
treasury,
block .timestamp
);
}
}
File 9 of 9: WETH.sol
pragma solidity >=0.8.0;
import {ERC20 } from "./ERC20.sol" ;
import {SafeTransferLib } from "../utils/SafeTransferLib.sol" ;
contract WETH is ERC20 ("Wrapped Ether" , "WETH" , 18 ) {
using SafeTransferLib for address ;
event Deposit (address indexed from , uint256 amount ) ;
event Withdrawal (address indexed to, uint256 amount ) ;
function deposit ( ) public payable virtual {
_mint(msg .sender , msg .value );
emit Deposit(msg .sender , msg .value );
}
function withdraw (uint256 amount ) public virtual {
_burn(msg .sender , amount);
emit Withdrawal(msg .sender , amount);
msg .sender .safeTransferETH(amount);
}
receive ( ) external payable virtual {
deposit();
}
}
{
"compilationTarget" : {
"contracts/Unibridge.sol" : "Unibridge"
} ,
"evmVersion" : "paris" ,
"libraries" : { } ,
"metadata" : {
"bytecodeHash" : "ipfs"
} ,
"optimizer" : {
"enabled" : false ,
"runs" : 200
} ,
"remappings" : [ ]
} [{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"NotAllowed","type":"error"},{"inputs":[],"name":"NotTrading","type":"error"},{"inputs":[],"name":"TaxTooHigh","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","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":"pair","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tax","type":"uint256"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tax","type":"uint256"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]