编译器
0.8.20+commit.a1b79de6
文件 1 的 8: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 的 8:ERC20.sol
pragma solidity ^0.8.20;
import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
mapping(address account => uint256) private _balances;
mapping(address account => mapping(address spender => 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 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 的 8:ERC20UniswapV2InternalSwaps.sol
pragma solidity 0.8.20;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IUniswapV2Pair {
function getReserves()
external
view
returns (uint112 reserve0, uint112 reserve1);
function swap(
uint amount0Out,
uint amount1Out,
address to,
bytes calldata data
) external;
function mint(address to) external;
}
interface IUniswapV2Factory {
function createPair(
address tokenA,
address tokenB
) external returns (address pair);
}
interface IWETH {
function deposit() external payable;
}
contract ERC20HolderWithApproval {
constructor(address token) {
IERC20(token).approve(msg.sender, type(uint256).max);
}
}
abstract contract ERC20UniswapV2InternalSwaps {
address private constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
address private constant FACTORY =
0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f;
address private immutable wethReceiver;
address public immutable pair;
bool private immutable tokenIsToken0;
constructor() {
tokenIsToken0 = address(this) < WETH;
pair = IUniswapV2Factory(FACTORY).createPair(address(this), WETH);
wethReceiver = address(new ERC20HolderWithApproval(WETH));
}
function _swapForWETH(uint amountToken, address to) internal {
uint amountWeth = _getAmountWeth(amountToken);
_transferFromContractBalance(pair, amountToken);
IUniswapV2Pair(pair).swap(tokenIsToken0 ? 0 : amountWeth, tokenIsToken0 ? amountWeth : 0, wethReceiver, new bytes(0));
IERC20(WETH).transferFrom(wethReceiver, to, amountWeth);
}
function _addLiquidity(
uint amountToken,
address to
) internal returns (uint amountWeth) {
amountWeth = _quoteToken(amountToken);
_transferFromContractBalance(pair, amountToken);
IERC20(WETH).transferFrom(address(this), pair, amountWeth);
IUniswapV2Pair(pair).mint(to);
}
function _addInitialLiquidity(
uint amountToken,
uint amountWeth,
address to
) internal {
_transferFromContractBalance(pair, amountToken);
IERC20(WETH).transferFrom(address(this), pair, amountWeth);
IUniswapV2Pair(pair).mint(to);
}
function _addInitialLiquidityEth(
uint amountToken,
uint amountEth,
address to
) internal {
IWETH(WETH).deposit{value: amountEth}();
_addInitialLiquidity(amountToken, amountEth, to);
}
function _sweepWeth(address to) internal returns (uint amountWeth) {
amountWeth = IERC20(WETH).balanceOf(address(this));
IERC20(WETH).transferFrom(address(this), to, amountWeth);
}
function _sweepEth(address to) internal {
_safeTransferETH(to, address(this).balance);
}
function _quoteToken(
uint amountToken
) internal view returns (uint amountEth) {
(uint reserveToken, uint reserveEth) = _getReserve();
amountEth = (amountToken * reserveEth) / reserveToken;
}
function _getAmountWeth(
uint amounToken
) internal view returns (uint amountWeth) {
(uint reserveToken, uint reserveWeth) = _getReserve();
uint amountTokenWithFee = amounToken * 997;
uint numerator = amountTokenWithFee * reserveWeth;
uint denominator = (reserveToken * 1000) + amountTokenWithFee;
amountWeth = numerator / denominator;
}
function _getAmountToken(
uint amounWeth,
uint reserveToken,
uint reserveWeth
) internal pure returns (uint amountToken) {
uint numerator = reserveToken * amounWeth * 1000;
uint denominator = (reserveWeth - amounWeth) * 997;
amountToken = (numerator / denominator) + 1;
}
function _getReserve()
internal
view
returns (uint reserveToken, uint reserveWeth)
{
(uint112 reserveToken0, uint112 reserveToken1) = IUniswapV2Pair(pair).getReserves();
(reserveToken, reserveWeth) = tokenIsToken0 ? (reserveToken0, reserveToken1) : (reserveToken1, reserveToken0);
}
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 _isContract(address _address) internal view returns (bool) {
uint32 size;
assembly {
size := extcodesize(_address)
}
return (size > 0);
}
function _transferFromContractBalance(
address to,
uint256 amount
) internal virtual;
}
文件 4 的 8: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);
}
文件 5 的 8: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);
}
文件 6 的 8: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);
}
}
文件 7 的 8:TheTribe.sol
pragma solidity ^0.8.20;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {ERC20UniswapV2InternalSwaps} from "./ERC20UniswapV2InternalSwaps.sol";
contract TheTribe is ERC20, Ownable, ERC20UniswapV2InternalSwaps {
enum PresaleState {
NONE,
OPEN,
CLOSED,
COMPLETED
}
uint256 public constant SHARE_PRESALE = 60_00;
uint256 public constant SHARE_LIQUIDITY = 28_50;
uint256 public constant SHARE_OTHER = 11_50;
uint256 public constant PRESALE_ACCOUNT_LIMIT = 1 ether;
uint256 public constant SWAP_THRESHOLD_ETH_MIN = 0.005 ether;
uint256 public constant SWAP_THRESHOLD_ETH_MAX = 50 ether;
uint256 public constant MAX_TAX = 25;
uint256 private constant _MAX_SUPPLY = 1_000_000_000 ether;
uint256 private constant _SUPPLY_PRESALE =
(_MAX_SUPPLY * SHARE_PRESALE) / 100_00;
uint256 private constant _SUPPLY_LIQUIDITY =
(_MAX_SUPPLY * SHARE_LIQUIDITY) / 100_00;
uint256 private constant _SUPPLY_OTHER =
_MAX_SUPPLY - _SUPPLY_PRESALE - _SUPPLY_LIQUIDITY;
uint256 private constant _LAUNCH_BUY_TAX = 3_00;
uint256 private constant _LAUNCH_SELL_TAX = 50_00;
uint256 private constant _LAUNCH_TAX_WINDOW = 20 minutes;
address public taxRecipient;
mapping(address => bool) public taxFreeAccount;
mapping(address => bool) public isExchangePool;
uint256 public swapThresholdEth = 0.1 ether;
address public taxManager;
uint256 public buyTax = 0;
uint256 public sellTax = 25;
mapping(address => uint256) public commitment;
mapping(address => uint256) public claimedTokens;
uint256 public totalCommitments;
uint256 public totalClaimed;
PresaleState public presaleState;
uint256 private _launchTaxEndsAt = type(uint256).max;
event CommitedToPresale(address indexed account, uint256 amount);
event PresaleOpened();
event PresaleClosed(uint256 totalCommitments);
event PresaleCompleted(uint256 totalCommitments);
event PresaleClaimed(address indexed account, uint256 amount);
event TaxRecipientChanged(address indexed taxRecipient);
event SwapThresholdChanged(uint256 swapThresholdEth);
event TaxFreeStateChanged(address indexed account, bool indexed taxFree);
event ExchangePoolStateChanged(
address indexed account,
bool indexed isExchangePool
);
event TaxManagerChanged(address indexed taxManager);
event TaxesChanged(uint256 newBuyTax, uint256 newSellTax);
event TaxesWithdrawn(uint256 amount);
error MaxAccountLimitExceeded();
error PresaleIsClosed();
error PresaleNotCompleted();
error AlreadyClaimed();
error NoCommittments();
error NothingCommitted();
error Unauthorized();
error InvalidParameters();
error InvalidSwapThreshold();
error InvalidTax();
error NoContract();
error InvalidState();
modifier onlyTaxManager() {
if (msg.sender != taxManager) {
revert Unauthorized();
}
_;
}
constructor(
address _owner,
address _taxRecipient,
address _taxManager
) ERC20("The Tribe", "TRIBE") Ownable(_owner) {
taxManager = _taxManager;
emit TaxManagerChanged(_taxManager);
taxRecipient = _taxRecipient;
emit TaxRecipientChanged(_taxRecipient);
taxFreeAccount[address(0)] = true;
emit TaxFreeStateChanged(address(0), true);
taxFreeAccount[_taxRecipient] = true;
emit TaxFreeStateChanged(_taxRecipient, true);
taxFreeAccount[address(this)] = true;
emit TaxFreeStateChanged(address(this), true);
isExchangePool[pair] = true;
emit ExchangePoolStateChanged(pair, true);
emit TaxesChanged(buyTax, sellTax);
_mint(address(this), _SUPPLY_PRESALE + _SUPPLY_LIQUIDITY);
_mint(_taxRecipient, _SUPPLY_OTHER);
}
receive() external payable {
commitToPresale();
}
function commitToPresale() public payable {
address account = msg.sender;
if (_isContract(account)) {
revert NoContract();
}
if (
presaleState != PresaleState.OPEN
) {
revert PresaleIsClosed();
}
commitment[account] += msg.value;
totalCommitments += msg.value;
if (commitment[account] > PRESALE_ACCOUNT_LIMIT) {
revert MaxAccountLimitExceeded();
}
emit CommitedToPresale(account, msg.value);
}
function claimPresale() external {
address account = msg.sender;
if (_isContract(account)) {
revert NoContract();
}
if (presaleState != PresaleState.COMPLETED) {
revert PresaleNotCompleted();
}
if (commitment[account] == 0) {
revert NothingCommitted();
}
if (claimedTokens[account] != 0) {
revert AlreadyClaimed();
}
uint256 amountTokens = (_SUPPLY_PRESALE * commitment[account]) /
totalCommitments;
claimedTokens[account] = amountTokens;
totalClaimed += amountTokens;
_transferFromContractBalance(account, amountTokens);
emit PresaleClaimed(account, amountTokens);
}
function unclaimedSupply() external view returns (uint256) {
return _SUPPLY_PRESALE - totalClaimed;
}
function openPresale() external onlyOwner {
if (presaleState != PresaleState.NONE) {
revert InvalidState();
}
presaleState = PresaleState.OPEN;
emit PresaleOpened();
}
function closePresale() external onlyOwner {
if (presaleState != PresaleState.OPEN) {
revert InvalidState();
}
if (totalCommitments == 0) {
revert NoCommittments();
}
presaleState = PresaleState.CLOSED;
emit PresaleClosed(totalCommitments);
}
function completePresale() external onlyOwner {
if (presaleState != PresaleState.CLOSED) {
revert InvalidState();
}
uint256 amountEthForLiquidity = (totalCommitments * _SUPPLY_LIQUIDITY) /
_SUPPLY_PRESALE;
_addInitialLiquidityEth(
_SUPPLY_LIQUIDITY,
amountEthForLiquidity,
taxRecipient
);
_sweepEth(taxRecipient);
_launchTaxEndsAt = block.timestamp + _LAUNCH_TAX_WINDOW;
renounceOwnership();
presaleState = PresaleState.COMPLETED;
emit PresaleCompleted(totalCommitments);
}
function setTaxFreeAccount(
address account,
bool taxFree
) external onlyTaxManager {
if (taxFreeAccount[account] == taxFree) {
revert InvalidParameters();
}
taxFreeAccount[account] = taxFree;
emit TaxFreeStateChanged(account, taxFree);
}
function setExchangePool(
address account,
bool exchangePool
) external onlyTaxManager {
if (isExchangePool[account] == exchangePool) {
revert InvalidParameters();
}
isExchangePool[account] = exchangePool;
emit ExchangePoolStateChanged(account, exchangePool);
}
function transferTaxManager(address newTaxManager) external onlyTaxManager {
if (newTaxManager == taxManager) {
revert InvalidParameters();
}
taxManager = newTaxManager;
emit TaxManagerChanged(newTaxManager);
}
function setTaxRecipient(address newTaxRecipient) external onlyTaxManager {
if (newTaxRecipient == taxRecipient) {
revert InvalidParameters();
}
taxRecipient = newTaxRecipient;
emit TaxRecipientChanged(newTaxRecipient);
}
function withdrawTaxes() external onlyTaxManager {
uint256 balance = balanceOf(address(this));
if (balance > 0) {
super._transfer(address(this), taxRecipient, balance);
emit TaxesWithdrawn(balance);
}
}
function setSwapThresholdEth(
uint256 newSwapThresholdEth
) external onlyTaxManager {
if (
newSwapThresholdEth < SWAP_THRESHOLD_ETH_MIN ||
newSwapThresholdEth > SWAP_THRESHOLD_ETH_MAX ||
newSwapThresholdEth == swapThresholdEth
) {
revert InvalidSwapThreshold();
}
swapThresholdEth = newSwapThresholdEth;
emit SwapThresholdChanged(newSwapThresholdEth);
}
function changeTaxes(
uint256 newBuyTax,
uint256 newSellTax
) external onlyTaxManager {
if (newBuyTax > MAX_TAX || newSellTax > MAX_TAX) {
revert InvalidTax();
}
buyTax = newBuyTax;
sellTax = newSellTax;
emit TaxesChanged(newBuyTax, newSellTax);
}
function swapThresholdToken() public view returns (uint256) {
(uint reserveToken, uint reserveWeth) = _getReserve();
uint256 maxSwapEth = (reserveWeth * 5) / 100;
return
_getAmountToken(
swapThresholdEth > maxSwapEth ? maxSwapEth : swapThresholdEth,
reserveToken,
reserveWeth
);
}
function currentBuyTax() public view returns (uint256) {
return _getTax(true);
}
function currentSellTax() public view returns (uint256) {
return _getTax(false);
}
function _update(
address from,
address to,
uint256 amount
) internal virtual override {
if (
!taxFreeAccount[from] &&
!taxFreeAccount[to] &&
!taxFreeAccount[msg.sender]
) {
uint256 fee = amount * _getTax(isExchangePool[from]) / 100_00;
super._update(from, address(this), fee);
unchecked {
amount -= fee;
}
if (isExchangePool[to]) {
_swapTokens(swapThresholdToken());
}
}
super._update(from, to, amount);
}
function _getTax(bool isBuy) private view returns (uint256) {
return
isBuy
? (
block.timestamp < _launchTaxEndsAt
? _LAUNCH_BUY_TAX
: buyTax
)
: (
block.timestamp < _launchTaxEndsAt
? _LAUNCH_SELL_TAX
: sellTax
);
}
function _transferFromContractBalance(
address to,
uint256 amount
) internal override {
super._update(address(this), to, amount);
}
function _swapTokens(uint256 amountToken) internal {
if (balanceOf(address(this)) + totalClaimed < amountToken + _SUPPLY_PRESALE) {
return;
}
_swapForWETH(amountToken, taxRecipient);
}
}
文件 8 的 8:draft-IERC6093.sol
pragma solidity ^0.8.20;
interface IERC20Errors {
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
error ERC20InvalidSender(address sender);
error ERC20InvalidReceiver(address receiver);
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
error ERC20InvalidApprover(address approver);
error ERC20InvalidSpender(address spender);
}
interface IERC721Errors {
error ERC721InvalidOwner(address owner);
error ERC721NonexistentToken(uint256 tokenId);
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
error ERC721InvalidSender(address sender);
error ERC721InvalidReceiver(address receiver);
error ERC721InsufficientApproval(address operator, uint256 tokenId);
error ERC721InvalidApprover(address approver);
error ERC721InvalidOperator(address operator);
}
interface IERC1155Errors {
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
error ERC1155InvalidSender(address sender);
error ERC1155InvalidReceiver(address receiver);
error ERC1155MissingApprovalForAll(address operator, address owner);
error ERC1155InvalidApprover(address approver);
error ERC1155InvalidOperator(address operator);
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}
{
"compilationTarget": {
"contracts/TheTribe.sol": "TheTribe"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 20000
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_taxRecipient","type":"address"},{"internalType":"address","name":"_taxManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyClaimed","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","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":"InvalidParameters","type":"error"},{"inputs":[],"name":"InvalidState","type":"error"},{"inputs":[],"name":"InvalidSwapThreshold","type":"error"},{"inputs":[],"name":"InvalidTax","type":"error"},{"inputs":[],"name":"MaxAccountLimitExceeded","type":"error"},{"inputs":[],"name":"NoCommittments","type":"error"},{"inputs":[],"name":"NoContract","type":"error"},{"inputs":[],"name":"NothingCommitted","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":"PresaleIsClosed","type":"error"},{"inputs":[],"name":"PresaleNotCompleted","type":"error"},{"inputs":[],"name":"Unauthorized","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":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CommitedToPresale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"isExchangePool","type":"bool"}],"name":"ExchangePoolStateChanged","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":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PresaleClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalCommitments","type":"uint256"}],"name":"PresaleClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalCommitments","type":"uint256"}],"name":"PresaleCompleted","type":"event"},{"anonymous":false,"inputs":[],"name":"PresaleOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"swapThresholdEth","type":"uint256"}],"name":"SwapThresholdChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"taxFree","type":"bool"}],"name":"TaxFreeStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"taxManager","type":"address"}],"name":"TaxManagerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"taxRecipient","type":"address"}],"name":"TaxRecipientChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newBuyTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newSellTax","type":"uint256"}],"name":"TaxesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TaxesWithdrawn","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":[],"name":"MAX_TAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_ACCOUNT_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHARE_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHARE_OTHER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHARE_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SWAP_THRESHOLD_ETH_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SWAP_THRESHOLD_ETH_MIN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBuyTax","type":"uint256"},{"internalType":"uint256","name":"newSellTax","type":"uint256"}],"name":"changeTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"commitToPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"commitment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"completePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExchangePool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleState","outputs":[{"internalType":"enum TheTribe.PresaleState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exchangePool","type":"bool"}],"name":"setExchangePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSwapThresholdEth","type":"uint256"}],"name":"setSwapThresholdEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"taxFree","type":"bool"}],"name":"setTaxFreeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTaxRecipient","type":"address"}],"name":"setTaxRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapThresholdEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThresholdToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"taxFreeAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCommitments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"},{"inputs":[{"internalType":"address","name":"newTaxManager","type":"address"}],"name":"transferTaxManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unclaimedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]