编译器
0.8.20+commit.a1b79de6
文件 1 的 10: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;
}
}
文件 2 的 10:ERC20Logic.sol
pragma solidity ^0.8.20;
import {IERC20} from "./IERC20.sol";
import {Context} from "./Context.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);
}
contract ERC20Logic is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 public totalSupply;
string public name;
string public symbol;
function decimals() public view virtual override returns (uint8) {
return 18;
}
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), 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) {
_approve(_msgSender(), spender, amount);
return true;
}
function transferFrom(
address sender,
address recipient,
uint256 amount
) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
uint256 currentAllowance = _allowances[sender][_msgSender()];
require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
unchecked {
_approve(sender, _msgSender(), currentAllowance - amount);
}
return true;
}
function burn(uint256 value) public virtual {
_burn(_msgSender(), value);
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
uint256 currentAllowance = _allowances[_msgSender()][spender];
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(_msgSender(), spender, currentAllowance - subtractedValue);
}
return true;
}
function _transfer(
address sender,
address recipient,
uint256 amount
) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the 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 the zero address");
totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
}
totalSupply -= amount;
emit Transfer(account, address(0), amount);
}
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
}
文件 3 的 10:IERC20.sol
pragma solidity ^0.8.20;
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);
function burn(uint256 value) external;
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
文件 4 的 10:IUniswapV2Factory.sol
pragma solidity ^0.8.20;
interface IUniswapV2Factory {
function getPair(address tokenA, address tokenB) external view returns (address pair);
function createPair(address tokenA, address tokenB) external returns (address pair);
}
文件 5 的 10:IUniswapV2Pair.sol
pragma solidity ^0.8.20;
interface IUniswapV2Pair {
function mint(address to) external returns (uint liquidity);
}
文件 6 的 10:IUniswapV2Router02.sol
pragma solidity ^0.8.20;
interface IUniswapV2Router02 {
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
}
文件 7 的 10:IWETH.sol
pragma solidity ^0.8.20;
interface IWETH {
function deposit() external payable;
function transfer(address to, uint value) external returns (bool);
function withdraw(uint) external;
}
文件 8 的 10:Ownable.sol
pragma solidity ^0.8.20;
import {Context} from "./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);
}
}
文件 9 的 10:TokenFactory.sol
pragma solidity ^0.8.20;
import {ITokenLogic, TokenLogic} from "./TokenLogic.sol";
import {IERC20} from "./utils/IERC20.sol";
import {IUniswapV2Router02} from "./utils/IUniswapV2Router02.sol";
import {IUniswapV2Factory} from "./utils/IUniswapV2Factory.sol";
import {Ownable} from "./utils/Ownable.sol";
interface ITokenFactory {
function externalTryBurn(address token) external;
}
contract TokenFactory is Ownable {
bytes public constant TOKEN_PROXY_BYTECODE = hex"60a060405234801561000f575f80fd5b506040516102dc3803806102dc833981810160405281019061003191906100c9565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050506100f4565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100988261006f565b9050919050565b6100a88161008e565b81146100b2575f80fd5b50565b5f815190506100c38161009f565b92915050565b5f602082840312156100de576100dd61006b565b5b5f6100eb848285016100b5565b91505092915050565b6080516101cb6101115f395f81816030015260ea01526101cb5ff3fe60806040526004361061002c575f3560e01c8063629c52a914610070578063d77177501461009a5761002d565b5b5f7f00000000000000000000000000000000000000000000000000000000000000009050365f80375f80365f845af43d5f803e805f811461006c573d5ff35b3d5ffd5b34801561007b575f80fd5b506100846100c4565b6040516100919190610124565b60405180910390f35b3480156100a5575f80fd5b506100ae6100e8565b6040516100bb919061017c565b60405180910390f35b7f10eeeeffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f819050919050565b61011e8161010c565b82525050565b5f6020820190506101375f830184610115565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101668261013d565b9050919050565b6101768161015c565b82525050565b5f60208201905061018f5f83018461016d565b9291505056fea26469706673582212208caaf51ee3f849b605f6e63e26072b5c076726d07d40423546787cda62f1dc5b64736f6c63430008140033";
bytes public TOKEN_PROXY_DEPLOY_BYTECODE;
uint public uniqueId = 0x1000100000000000000000000000000000000000000000000000000000000000;
address payable public protocolFeesRecipient;
address public immutable tokenLogic;
IUniswapV2Router02 constant uniswapRouter = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
IUniswapV2Factory immutable uniswapFactory;
uint8 public stakingFees = 0;
address payable public stakingContract;
enum LaunchStatus {
LAUNCH_ACTIVE,
LIQUIDITY_BURNED,
LIQUIDITY_REFUNDED
}
struct TokenInfo {
bool isChildToken;
uint uniqueId;
LaunchStatus launchStatus;
uint feesReceived;
}
mapping (address => TokenInfo) public childTokens;
mapping (address => address[]) public tokensDeployed;
mapping (address => bool) public withdrawalAddresses;
event TokenCreated(address indexed token, address indexed deployer, string name, string symbol);
event LiquidityBurned(address indexed token);
event LiquidityRefunded(address indexed token);
constructor(address _protocolFeesRecipient) Ownable(msg.sender) {
protocolFeesRecipient = payable(_protocolFeesRecipient);
tokenLogic = address(new TokenLogic(address(this)));
TOKEN_PROXY_DEPLOY_BYTECODE = abi.encodePacked(
TOKEN_PROXY_BYTECODE,
abi.encode(tokenLogic)
);
uniswapFactory = IUniswapV2Factory(uniswapRouter.factory());
}
modifier onlyEoa() {
require(tx.origin == msg.sender, "Not EOA");
_;
}
function setStaking(address _stakingContract, uint8 _stakingFees) external onlyOwner {
require(_stakingFees <= 100, "Invalid fees");
stakingFees = _stakingFees;
stakingContract = payable(_stakingContract);
}
function setWithdrawalAddresses(address account, bool isWithdrawalAddr) external onlyOwner {
withdrawalAddresses[account] = isWithdrawalAddr;
}
function setProtocolFeesRecipient(address payable _protocolFeesRecipient) external {
require(msg.sender == protocolFeesRecipient);
protocolFeesRecipient = _protocolFeesRecipient;
}
function deployToken(string memory _name, string memory _symbol) onlyEoa external payable returns (address) {
address deployer = msg.sender;
address token = deployNewBytecode();
(bool success, ) = token.call{
value: msg.value
}(abi.encodeWithSelector(0x90657147, deployer, _name, _symbol));
require(success, "Error initializing token");
childTokens[token].isChildToken = true;
childTokens[token].uniqueId = uniqueId - 1;
tokensDeployed[deployer].push(token);
emit TokenCreated(token, deployer, _name, _symbol);
return token;
}
function deployNewBytecode() private returns (address token) {
bytes memory bytecode = TOKEN_PROXY_DEPLOY_BYTECODE;
bytes32 _id = bytes32(uniqueId);
assembly {
mstore(add(bytecode, 503), _id)
token := create(0, add(bytecode, 0x20), mload(bytecode))
if iszero(extcodesize(token)) {
revert(0, 0)
}
}
uniqueId++;
}
receive() external payable {
address token = msg.sender;
if (token == address(uniswapRouter)) return;
require(childTokens[token].isChildToken, "Unknown token");
childTokens[token].feesReceived += msg.value;
bool result = _tryBurn(token);
if (!result && childTokens[token].launchStatus != LaunchStatus.LAUNCH_ACTIVE) {
uint protocolFees = msg.value / 5;
_distributeFees(token, msg.value - protocolFees, protocolFees);
}
}
function withdrawLiquidity(address token) external {
require(childTokens[token].isChildToken == true, "Unknown token");
require(msg.sender == ITokenLogic(token).deployer() || withdrawalAddresses[msg.sender], "Unauthorized");
if (childTokens[token].launchStatus != LaunchStatus.LAUNCH_ACTIVE) return;
if (_tryBurn(token)) return;
require(block.timestamp - ITokenLogic(token).launchTimestamp() > 24 hours, "Token not ready to refund");
childTokens[token].launchStatus = LaunchStatus.LIQUIDITY_REFUNDED;
IERC20 lpToken = IERC20(uniswapFactory.getPair(token, uniswapRouter.WETH()));
uint amount = lpToken.balanceOf(address(this));
lpToken.approve(address(uniswapRouter), amount);
(uint amountToken, uint amountETH) = uniswapRouter.removeLiquidityETH(token, amount, 0, 0, address(this), block.timestamp);
IERC20(token).burn(amountToken);
uint deployerRefund = min(amountETH, 1 ether);
uint protocolTip = amountETH > 1 ether ? amountETH - 1 ether : 0;
(uint deployerFees, uint protocolFees) = getTokenFees(token);
_distributeFees(token, deployerRefund + deployerFees, protocolTip + protocolFees);
emit LiquidityRefunded(token);
}
function externalTryBurn(address token) external {
require(childTokens[token].isChildToken == true, "Unknown token");
_tryBurn(token);
}
function _tryBurn(address token) private returns (bool) {
if (childTokens[token].launchStatus != LaunchStatus.LAUNCH_ACTIVE) return false;
(uint deployerFees, uint protocolFees) = getTokenFees(token);
if (deployerFees >= 1 ether) {
childTokens[token].launchStatus = LaunchStatus.LIQUIDITY_BURNED;
IERC20 lpToken = IERC20(uniswapFactory.getPair(token, uniswapRouter.WETH()));
lpToken.transfer(address(0), lpToken.balanceOf(address(this)));
_distributeFees(token, deployerFees, protocolFees);
emit LiquidityBurned(token);
return true;
}
return false;
}
function getTokenFees(address token) public view returns (uint deployerFees, uint protocolFees) {
uint totalFees = childTokens[token].feesReceived;
protocolFees = totalFees / 5;
deployerFees = totalFees - protocolFees;
}
function _distributeFees(address token, uint deployerFees, uint protocolFees) private {
if (deployerFees != 0) {
(bool result, ) = ITokenLogic(token).deployer().call{value: deployerFees}("");
require(result, "Failed to refund deployer");
}
if (protocolFees != 0) {
uint feesToStaking = (stakingFees * protocolFees) / 100;
uint feesToDev = protocolFees - feesToStaking;
if (feesToDev != 0) {
(bool result, ) = protocolFeesRecipient.call{value: feesToDev}("");
require(result, "Failed to forward");
}
if (feesToStaking != 0) {
(bool result, ) = stakingContract.call{value: feesToStaking}("");
require(result, "Failed to forward");
}
}
}
function getTokenUniqueId(address token) external view returns (bytes32) {
return bytes32(childTokens[token].uniqueId);
}
function getTokensDeployed(address deployer) external view returns (address[] memory) {
return tokensDeployed[deployer];
}
function min(uint a, uint b) private pure returns (uint) {
return a < b ? a : b;
}
}
文件 10 的 10:TokenLogic.sol
pragma solidity ^0.8.20;
import {ERC20Logic} from "./utils/ERC20Logic.sol";
import {IUniswapV2Router02} from "./utils/IUniswapV2Router02.sol";
import {IUniswapV2Factory} from "./utils/IUniswapV2Factory.sol";
import {IUniswapV2Pair} from "./utils/IUniswapV2Pair.sol";
import {IWETH} from "./utils/IWETH.sol";
interface ITokenLogic {
function initialize(address _deployer, string memory _name, string memory _symbol) external payable;
function launchTimestamp() external view returns(uint);
function deployer() external view returns(address payable);
}
contract TokenLogic is ERC20Logic, ITokenLogic {
enum FeesTier {
HIGH_FEES,
MEDIUM_FEES,
LOW_FEES
}
uint private constant HIGH_FEES_DURATION = 300;
uint private constant LIMITS_DURATION = 300;
uint private constant BASE_TOTAL_SUPPLY = 1_000_000_000 * 10**18;
uint public constant MAX_TX_AMOUNT = (1 * BASE_TOTAL_SUPPLY) / 100;
uint public constant MAX_WALLET_AMOUNT = (3 * BASE_TOTAL_SUPPLY) / 100;
uint private constant LIQUIDITY_AMOUNT = (80 * BASE_TOTAL_SUPPLY) / 100;
address public immutable tokenFactory;
address public immutable WETH;
IUniswapV2Factory public immutable uniswapFactory;
IUniswapV2Router02 constant uniswapRouter = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
bool _swapping;
uint public launchTimestamp;
address payable public deployer;
address public uniswapPair;
FeesTier public feesTier;
constructor (address _tokenFactory) {
tokenFactory = _tokenFactory;
uniswapFactory = IUniswapV2Factory(uniswapRouter.factory());
WETH = uniswapRouter.WETH();
}
modifier lockSwap {
_swapping = true;
_;
_swapping = false;
}
function initialize(address _deployer, string memory _name, string memory _symbol) external payable {
require(msg.sender == tokenFactory, "Unauthorized");
require(msg.value == 1 ether, "Wrong initial liquidity");
name = _name;
symbol = _symbol;
deployer = payable(_deployer);
launchTimestamp = block.timestamp;
_mint(address(this), BASE_TOTAL_SUPPLY - LIQUIDITY_AMOUNT);
uniswapPair = uniswapFactory.createPair(address(this), WETH);
_mint(uniswapPair, LIQUIDITY_AMOUNT);
IWETH(WETH).deposit{value: 1 ether}();
assert(IWETH(WETH).transfer(uniswapPair, 1 ether));
IUniswapV2Pair(uniswapPair).mint(tokenFactory);
}
function _transfer(address sender, address recipient, uint256 amount) internal override {
if (_swapping) return super._transfer(sender, recipient, amount);
uint fees = _takeFees(sender, recipient, amount);
if (fees != 0) {
super._transfer(sender, address(this), fees);
amount -= fees;
}
if (recipient == uniswapPair) _swapFees(amount);
super._transfer(sender, recipient, amount);
_forwardFees();
}
function _takeFees(address sender, address recipient, uint amount) private returns (uint) {
if ((sender != uniswapPair && recipient != uniswapPair) || recipient == tokenFactory || sender == address(this) || recipient == address(uniswapRouter)) return 0;
if (limitsActive() && sender == uniswapPair) {
require(amount <= MAX_TX_AMOUNT, "Max tx amount reached");
require(balanceOf(recipient) + amount <= MAX_WALLET_AMOUNT, "Max wallet amount reached");
}
if (feesTier == FeesTier.LOW_FEES) return amount / 100;
else if (feesTier == FeesTier.MEDIUM_FEES) {
if (balanceOf(address(this)) <= totalSupply / 100) {
feesTier = FeesTier.LOW_FEES;
return amount / 100;
}
return amount / 20;
}
else {
if (block.timestamp - launchTimestamp > HIGH_FEES_DURATION) {
feesTier = FeesTier.MEDIUM_FEES;
return amount / 20;
}
return amount / 5;
}
}
function _swapFees(uint maxAmount) private lockSwap {
uint tokenAmount = min(min(maxAmount, balanceOf(address(this))), totalSupply / 100);
if (tokenAmount < 1e18) return;
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = WETH;
_approve(address(this), address(uniswapRouter), tokenAmount);
uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0,
path,
address(this),
block.timestamp
);
}
function limitsActive() public view returns (bool) {
return block.timestamp - launchTimestamp <= LIMITS_DURATION;
}
function _forwardFees() private {
uint balance = address(this).balance;
if (balance == 0) return;
(bool result, ) = tokenFactory.call{value: balance}("");
require(result, "Failed to forward fees");
}
function min(uint a, uint b) private pure returns (uint) {
return a < b ? a : b;
}
receive() external payable {}
}
{
"compilationTarget": {
"contracts/TokenFactory.sol": "TokenFactory"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_protocolFeesRecipient","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"LiquidityBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"LiquidityRefunded","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":"token","type":"address"},{"indexed":true,"internalType":"address","name":"deployer","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"}],"name":"TokenCreated","type":"event"},{"inputs":[],"name":"TOKEN_PROXY_BYTECODE","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_PROXY_DEPLOY_BYTECODE","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"childTokens","outputs":[{"internalType":"bool","name":"isChildToken","type":"bool"},{"internalType":"uint256","name":"uniqueId","type":"uint256"},{"internalType":"enum TokenFactory.LaunchStatus","name":"launchStatus","type":"uint8"},{"internalType":"uint256","name":"feesReceived","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"deployToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"externalTryBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getTokenFees","outputs":[{"internalType":"uint256","name":"deployerFees","type":"uint256"},{"internalType":"uint256","name":"protocolFees","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getTokenUniqueId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"deployer","type":"address"}],"name":"getTokensDeployed","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolFeesRecipient","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_protocolFeesRecipient","type":"address"}],"name":"setProtocolFeesRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakingContract","type":"address"},{"internalType":"uint8","name":"_stakingFees","type":"uint8"}],"name":"setStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isWithdrawalAddr","type":"bool"}],"name":"setWithdrawalAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingContract","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingFees","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenLogic","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokensDeployed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniqueId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"withdrawLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"withdrawalAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]