编译器
0.8.20+commit.a1b79de6
文件 1 的 9:Context.sol
pragma solidity ^0.8.20;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
文件 2 的 9:ERC20.sol
pragma solidity 0.8.20;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import {Context} from "@openzeppelin/contracts/utils/Context.sol";
interface IERC20Errors {
error ERC20InvalidSender(address sender);
error ERC20InvalidReceiver(address receiver);
error ERC20InvalidApprover(address approver);
error ERC20InvalidSpender(address spender);
error ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 value);
}
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
mapping(address account => uint256) internal _balances;
mapping(address account => mapping(address spender => uint256)) private _allowances;
uint256 internal _totalSupply;
string private _name;
string private _symbol;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function name() public view virtual returns (string memory) {
return _name;
}
function symbol() public view virtual returns (string memory) {
return _symbol;
}
function decimals() public view virtual returns (uint8) {
return 18;
}
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view virtual returns (uint256) {
return _balances[account];
}
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_transfer(owner, to, value);
return true;
}
function allowance(address owner, address spender) public view virtual returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, value);
return true;
}
function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, value);
_transfer(from, to, value);
return true;
}
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));
}
_update(from, to, value);
}
function _update(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
_totalSupply += value;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
_balances[from] = fromBalance - value;
}
}
if (to == address(0)) {
unchecked {
_totalSupply -= value;
}
} else {
unchecked {
_balances[to] += value;
}
}
emit Transfer(from, to, value);
}
function _mint(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(address(0), account, value);
}
function _burn(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidSender(address(0));
}
_update(account, address(0), value);
}
function _approve(address owner, address spender, uint256 value) internal {
_approve(owner, spender, value, true);
}
function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
if (owner == address(0)) {
revert ERC20InvalidApprover(address(0));
}
if (spender == address(0)) {
revert ERC20InvalidSpender(address(0));
}
_allowances[owner][spender] = value;
if (emitEvent) {
emit Approval(owner, spender, value);
}
}
function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
if (currentAllowance < value) {
revert ERC20InsufficientAllowance(spender, currentAllowance, value);
}
unchecked {
_approve(owner, spender, currentAllowance - value, false);
}
}
}
}
文件 3 的 9:IERC20.sol
pragma solidity ^0.8.20;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
文件 4 的 9:IERC20Metadata.sol
pragma solidity ^0.8.20;
import {IERC20} from "../IERC20.sol";
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
文件 5 的 9:IOnlyUpFactory.sol
pragma solidity ^0.8.20;
interface IOnlyUpFactory {
function createToken(string memory name, string memory symbol) external returns (address token);
function tradeFee() external view returns (uint256);
function mainToTax() external view returns (uint256);
function mainFromTax() external view returns (uint256);
function creatorShare() external view returns (uint256);
function treasuryShare() external view returns (uint256);
function ownerGraduationMintShare() external view returns (uint256);
function feeShares() external view returns (address treasury, uint256 creatorShare, uint256 treasuryShare);
function getTaxes(address _from, address _to) external view returns (uint256 fromTax, uint256 toTax);
function addInitialLiquidity(uint256 _reserve0, uint256 _reserve1) external;
function tokenPriceBuffer() external view returns (int256);
function graduationMintRatio() external view returns (uint256);
}
文件 6 的 9:IOnlyUpToken.sol
pragma solidity 0.8.20;
interface IOnlyUpToken {
error MintingDisabled();
error NoReentrancy();
error DisableTimeNotReached();
error InvalidAirdropToken();
error TokenNotDisabled();
error InvalidSwapParameters();
error AirdropNotInitiated();
error RestrictedTransfer();
error InvalidAirdropPeriod();
error InvalidReserveIn();
error InvalidSender();
event OwnerBurn(address indexed sender, uint256 amount);
event Evolve(address indexed token, uint256 timestamp);
event Swap(
address indexed sender,
uint256 amount0In,
uint256 amount1In,
uint256 amount0Out,
uint256 amount1Out,
address indexed to
);
event Mint(address indexed sender, uint256 amount0, uint256 amount1);
event Burn(address indexed sender, uint256 amount0, uint256 amount1);
event Disable(address indexed sender, uint256 timestamp);
function mint(address _receiver) external payable;
function redeem(address _receiver, uint256 _tokenAmount) external;
function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external payable;
function determineTax(address _from, address _to, uint256 _value) external view returns (uint256);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function getAmountOut(uint256 _amountIn, uint256 _reserve0, uint256 _reserve1) external view returns (uint256);
function getAmountIn(uint256 _amountOut, uint256 _reserve0, uint256 _reserve1) external view returns (uint256);
}
文件 7 的 9:IWETH.sol
pragma solidity 0.8.20;
interface IWETH {
function deposit() external payable;
function transfer(address to, uint256 value) external returns (bool);
function withdraw(uint256) external;
function balanceOf(address) external view returns (uint256);
}
文件 8 的 9:OnlyUpToken.sol
pragma solidity 0.8.20;
import {ERC20} from "./ERC20.sol";
import {IWETH} from "../interfaces/IWETH.sol";
import {IOnlyUpFactory} from "../interfaces/IOnlyUpFactory.sol";
import {IOnlyUpToken} from "../interfaces/IOnlyUpToken.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
contract OnlyUpToken is ERC20, IOnlyUpToken, Ownable {
uint256 constant DIVISOR = 10_000;
uint256 constant BUFFER = 1e18;
uint256 constant INITIAL_ETH_PER_TOKEN = 1e13;
int24 constant TICK_SPACING = 200;
uint256 constant INITIAL_LIQUIDITY_MINT_RATIO = 4;
IWETH private weth;
IOnlyUpFactory public factory;
bool public disabled;
uint256 public genesis;
address public token0;
address public token1;
bool private locked;
uint256 private reserve1;
uint256 private reserve0;
uint256 private blockTimestampLast;
constructor(address _owner, string memory _name, string memory _symbol, address _weth)
ERC20(_name, _symbol)
Ownable(_owner)
{
factory = IOnlyUpFactory(msg.sender);
genesis = block.timestamp;
weth = IWETH(_weth);
token0 = address(this);
token1 = _weth;
}
modifier notDisabled() {
if (disabled) revert MintingDisabled();
_;
}
modifier nonReentrant() {
if (locked) revert NoReentrancy();
locked = true;
_;
locked = false;
}
function mint(address _receiver) public payable notDisabled nonReentrant {
uint256 ethAmount = msg.value;
if (ethAmount > 0) weth.deposit{value: msg.value}();
else ethAmount = weth.balanceOf(address(this)) - reserve1;
uint256 fee = ethAmount * factory.tradeFee() / DIVISOR;
uint256 ethAmtAfterFee = ethAmount - fee;
_sendFees(fee);
uint256 shares = convertToShares(ethAmtAfterFee);
_mint(_receiver, shares);
_updateReserves();
emit Mint(msg.sender, 0, shares);
emit Swap(msg.sender, ethAmount, 0, 0, shares, _receiver);
}
function redeem(address _receiver, uint256 _tokenAmount) public nonReentrant notDisabled {
uint256 tokenAmount = _tokenAmount > 0 ? _tokenAmount : balanceOf(address(this));
address burnFrom = _tokenAmount == 0 ? address(this) : msg.sender;
_burn(burnFrom, tokenAmount);
uint256 tax = (tokenAmount * factory.mainFromTax()) / DIVISOR;
uint256 tokenAmountAfterTax = tokenAmount - tax;
uint256 ethAmount = convertToAssets(tokenAmountAfterTax);
uint256 fee = ethAmount * factory.tradeFee() / DIVISOR;
_sendFees(fee);
ethAmount -= fee;
if (_tokenAmount == 0) {
weth.transfer(_receiver, ethAmount);
} else {
weth.withdraw(ethAmount);
payable(_receiver).transfer(ethAmount);
}
_updateReserves();
emit Burn(msg.sender, 0, tokenAmount);
emit Swap(msg.sender, 0, tokenAmount, ethAmount, 0, _receiver);
}
function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata) external payable {
if (amount1Out > 0 && amount0Out == 0) {
mint(to);
} else if (amount0Out > 0 && amount1Out == 0) {
redeem(to, amount0Out);
} else {
revert InvalidSwapParameters();
}
}
receive() external payable {}
function convertToAssets(uint256 _tokenAmount) public view returns (uint256 ethAmount) {
uint256 ethPerToken = _totalSupply == 0 ? INITIAL_ETH_PER_TOKEN : (reserve1 * BUFFER) / _totalSupply;
ethAmount = (_tokenAmount * ethPerToken) / BUFFER;
}
function convertToShares(uint256 _ethAmount) public view returns (uint256 tokenAmount) {
uint256 ethPerToken = _totalSupply == 0 ? INITIAL_ETH_PER_TOKEN : ((reserve1 * BUFFER) / _totalSupply);
tokenAmount = (_ethAmount * BUFFER) / ethPerToken;
}
function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {
_reserve0 = uint112(reserve0);
_reserve1 = uint112(reserve1);
_blockTimestampLast = uint32(blockTimestampLast);
}
function getTaxes(uint256 _amount, bool _buy) public view returns (uint256 taxes) {
uint256 tax = _buy ? factory.mainFromTax() : factory.mainToTax();
uint256 actualTax;
if (_buy) {
actualTax = (tax * reserve1 * BUFFER) / (reserve1 + _amount);
} else {
actualTax = (tax * _totalSupply * BUFFER) / (_totalSupply + _amount);
}
taxes = (_amount * actualTax) / DIVISOR / BUFFER;
}
function determineTax(address _from, address _to, uint256 _value) public view returns (uint256) {
return _determineTax(_from, _to, _value);
}
function getAmountOut(uint256 _amountIn, uint256 _reserveIn, uint256) public view returns (uint256 amountOut) {
if (_reserveIn != reserve1 && _reserveIn != reserve0) revert InvalidReserveIn();
address tokenIn = _reserveIn == reserve0 ? address(weth) : address(this);
if (tokenIn == address(this)) {
uint256 taxAmt = (_amountIn * factory.mainToTax()) / DIVISOR;
uint256 actualAmt = _amountIn - taxAmt;
uint256 ethAmount = convertToAssets(actualAmt);
uint256 fee = (ethAmount * factory.tradeFee()) / DIVISOR;
amountOut = ethAmount - fee;
} else {
uint256 taxAmt = (_amountIn * factory.mainFromTax()) / DIVISOR;
uint256 actualAmt = _amountIn - taxAmt;
uint256 tokenAmount = convertToShares(actualAmt);
uint256 fee = (tokenAmount * factory.tradeFee()) / DIVISOR;
amountOut = tokenAmount - fee;
}
}
function getAmountIn(uint256 _amountOut, uint256 _reserveIn, uint256) public view returns (uint256 amountIn) {
if (_reserveIn != reserve1 && _reserveIn != reserve0) revert InvalidReserveIn();
address tokenIn = _reserveIn == reserve0 ? address(weth) : address(this);
uint256 tradeFee = factory.tradeFee();
uint256 mainFromTax = factory.mainFromTax();
uint256 mainToTax = factory.mainToTax();
if (tokenIn == address(this)) {
uint256 assetsNeeded = (_amountOut * DIVISOR) / (DIVISOR - tradeFee);
uint256 sharesNeeded = convertToShares(assetsNeeded);
amountIn = (sharesNeeded * DIVISOR) / (DIVISOR - mainToTax);
} else {
uint256 sharesNeeded = (_amountOut * DIVISOR) / (DIVISOR - tradeFee);
uint256 assetsNeeded = convertToAssets(sharesNeeded);
amountIn = (assetsNeeded * DIVISOR) / (DIVISOR - mainFromTax);
}
}
function _sendFees(uint256 _amount) internal {
weth.withdraw(_amount);
(address treasury, uint256 creatorShare, uint256 treasuryShare) = factory.feeShares();
payable(owner()).transfer((_amount * creatorShare) / DIVISOR);
payable(treasury).transfer((_amount * treasuryShare) / DIVISOR);
}
function _updateReserves() internal {
reserve1 = weth.balanceOf(address(this));
reserve0 = _totalSupply;
blockTimestampLast = block.timestamp;
}
function _update(address from, address to, uint256 value) internal virtual override {
uint256 tax;
if (!disabled) {
tax = _determineTax(from, to, value);
if (tax > 0) {
_awardTaxes(from, tax);
}
}
uint256 receiveValue = value - tax;
if (from == address(0)) {
_totalSupply += receiveValue;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < receiveValue) revert ERC20InsufficientBalance(from, fromBalance, receiveValue);
unchecked {
_balances[from] = fromBalance - receiveValue;
}
}
if (to == address(0)) {
unchecked {
_totalSupply -= receiveValue;
}
} else {
unchecked {
_balances[to] += receiveValue;
}
}
emit Transfer(from, to, receiveValue);
}
function _determineTax(address _from, address _to, uint256 _value) internal view returns (uint256 taxAmount) {
if (_to == address(this)) return 0;
(uint256 fromTax, uint256 toTax) = factory.getTaxes(_from, _to);
taxAmount += (_value * fromTax) / DIVISOR;
taxAmount += (_value * toTax) / DIVISOR;
}
function _awardTaxes(address _from, uint256 _amount) internal {
address to = address(this);
if (_from != address(0)) {
_balances[_from] -= _amount;
_totalSupply -= _amount;
emit Transfer(_from, to, _amount);
emit Transfer(to, _from, _amount);
} else {
emit Transfer(address(0), to, _amount);
emit Transfer(to, address(0), _amount);
}
}
function graduate() external onlyOwner {
disabled = true;
emit Disable(address(this), block.timestamp);
uint256 mintAmount = (_totalSupply * factory.graduationMintRatio()) / DIVISOR;
uint256 ownerAmount = mintAmount * factory.ownerGraduationMintShare() / DIVISOR;
uint256 liquidityAmount = mintAmount - ownerAmount;
_mint(address(factory), liquidityAmount);
_mint(owner(), ownerAmount);
uint256 wethAmount = weth.balanceOf(address(this));
weth.transfer(address(factory), wethAmount);
factory.addInitialLiquidity(mintAmount, wethAmount);
_transferOwnership(address(0));
emit Evolve(address(this), block.timestamp);
}
}
文件 9 的 9:Ownable.sol
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
error OwnableUnauthorizedAccount(address account);
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
{
"compilationTarget": {
"src/tokens/OnlyUpToken.sol": "OnlyUpToken"
},
"evmVersion": "shanghai",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [
":@chainlink/contracts/=lib/chainlink-brownie-contracts/contracts/",
":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
":chainlink-brownie-contracts/=lib/chainlink-brownie-contracts/",
":ds-test/=lib/solmate/lib/ds-test/src/",
":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
":forge-std/=lib/forge-std/src/",
":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
":openzeppelin-contracts/=lib/openzeppelin-contracts/",
":solmate/=lib/solmate/src/"
]
}
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AirdropNotInitiated","type":"error"},{"inputs":[],"name":"DisableTimeNotReached","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"InvalidAirdropPeriod","type":"error"},{"inputs":[],"name":"InvalidAirdropToken","type":"error"},{"inputs":[],"name":"InvalidReserveIn","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"InvalidSwapParameters","type":"error"},{"inputs":[],"name":"MintingDisabled","type":"error"},{"inputs":[],"name":"NoReentrancy","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"RestrictedTransfer","type":"error"},{"inputs":[],"name":"TokenNotDisabled","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":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Disable","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Evolve","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OwnerBurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","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":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"convertToAssets","outputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ethAmount","type":"uint256"}],"name":"convertToShares","outputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"determineTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IOnlyUpFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesis","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountOut","type":"uint256"},{"internalType":"uint256","name":"_reserveIn","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_reserveIn","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"_reserve0","type":"uint112"},{"internalType":"uint112","name":"_reserve1","type":"uint112"},{"internalType":"uint32","name":"_blockTimestampLast","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_buy","type":"bool"}],"name":"getTaxes","outputs":[{"internalType":"uint256","name":"taxes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"graduate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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":"value","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"},{"stateMutability":"payable","type":"receive"}]