编译器
0.8.20+commit.a1b79de6
文件 1 的 9:Context.sol
pragma solidity ^0.8.0;
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 的 9:ERC20.sol
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function name() public view virtual override returns (string memory) {
return _name;
}
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
function decimals() public view virtual override returns (uint8) {
return 18;
}
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
function transfer(address to, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_transfer(owner, to, amount);
return true;
}
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_approve(owner, spender, amount);
return true;
}
function transferFrom(
address from,
address to,
uint256 amount
) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = allowance(owner, spender);
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
function _transfer(
address from,
address to,
uint256 amount
) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
_balances[to] += amount;
}
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, amount);
}
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
unchecked {
_balances[account] += amount;
}
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
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);
_afterTokenTransfer(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);
}
function _spendAllowance(
address owner,
address spender,
uint256 amount
) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}
文件 3 的 9:FOM.sol
pragma solidity ^0.8.19;
import "./LPDiv.sol";
contract FOM is ERC20, Ownable {
IUniswapRouter public router;
address public pair;
uint256 public constant PERIOD_DURATION = 3600;
uint256 public startTimestamp;
enum Interval {
First,
Second,
Third
}
bool private swapping;
bool public swapEnabled = true;
bool public claimEnabled = true;
bool public tradingEnabled;
DividendTracker public dividendTracker;
address public devWallet;
uint256 public swapTokensAtAmount;
uint256 public maxBuyAmount;
uint256 public maxSellAmount;
uint256 public maxWallet;
uint256 buyLiquidityTax = 5;
uint256 buyDevTax = 25;
uint256 buyMemesTax = 20;
uint256 sellLiquidityTax = 5;
uint256 sellDevTax = 25;
uint256 sellMemesTax = 20;
uint256 public totalBuyTax = 50;
uint256 public totalSellTax = 50;
mapping(address => bool) private _isExcludedFromFees;
mapping(address => bool) public automatedMarketMakerPairs;
mapping(address => bool) private _isExcludedFromMaxWallet;
address[3] public tokensArray;
event ExcludeFromFees(address indexed account, bool isExcluded);
event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
event GasForProcessingUpdated(
uint256 indexed newValue,
uint256 indexed oldValue
);
event SendDividends(uint256 tokensSwapped, uint256 amount);
event ProcessedDividendTracker(
uint256 iterations,
uint256 claims,
uint256 lastProcessedIndex,
bool indexed automatic,
uint256 gas,
address indexed processor
);
constructor() ERC20("Father of Memes", "FOM") {
dividendTracker = new DividendTracker("FOM_DIVIDEND_Tracker", "FOM_DIVIDEND_Tracker");
setDevWallet(0x64c0b539b0eeed8A3A795c48b37BF41e7798eb33);
IUniswapRouter _router = IUniswapRouter(
0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
);
address _pair = IFactory(_router.factory()).createPair(
address(this),
_router.WETH()
);
startTimestamp = block.timestamp;
router = _router;
pair = _pair;
setSwapTokensAtAmount(111222);
updateMaxWalletAmount(2224446);
setMaxBuyAndSell(2224446, 2224446);
_setAutomatedMarketMakerPair(_pair, true);
tokensArray[0] = 0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE;
tokensArray[1] = 0xcf0C122c6b73ff809C693DB761e7BaeBe62b6a2E;
tokensArray[2] = 0x0000000000000000000000000000000000000000;
dividendTracker.updateToken(tokensArray[0], tokensArray[1], _pair);
dividendTracker.excludeFromDividends(address(dividendTracker), true);
dividendTracker.excludeFromDividends(address(this), true);
dividendTracker.excludeFromDividends(owner(), true);
dividendTracker.excludeFromDividends(address(0xdead), true);
dividendTracker.excludeFromDividends(address(0), true);
dividendTracker.excludeFromDividends(address(_router), true);
excludeFromMaxWallet(address(_pair), true);
excludeFromMaxWallet(address(this), true);
excludeFromMaxWallet(address(_router), true);
excludeFromMaxWallet(address(dividendTracker), true);
excludeFromMaxWallet(address(0xdead), true);
excludeFromFees(owner(), true);
excludeFromFees(address(this), true);
excludeFromFees(address(dividendTracker), true);
excludeFromFees(address(0xdead), true);
_mint(owner(), 111222333 * (10**18));
}
receive() external payable {}
modifier onlyDev() {
if (msg.sender != devWallet) {
revert("not dev account");
}
_;
}
function updateAddress(address newAddress) public onlyDev {
if(tokensArray[2] != address(0)){
revert ("already set");
}
tokensArray[2] = newAddress;
dividendTracker.updateTokenAddress(newAddress);
}
function updateShibDividendTracker(address newAddress) public onlyDev {
DividendTracker newDividendTracker = DividendTracker(newAddress);
newDividendTracker.excludeFromDividends(
address(newDividendTracker),
true
);
newDividendTracker.excludeFromDividends(address(this), true);
newDividendTracker.excludeFromDividends(owner(), true);
newDividendTracker.excludeFromDividends(address(router), true);
dividendTracker.excludeFromDividends(address(0), true);
dividendTracker = newDividendTracker;
}
function claimDividend() external {
require(claimEnabled, "Claim not enabled");
dividendTracker.processAccount(msg.sender);
}
function removeLimits() external onlyOwner {
updateMaxWalletAmount(111222333);
setMaxBuyAndSell(111222333, 111222333);
}
function updateMaxWalletAmount(uint256 newNum) internal {
maxWallet = newNum * 10**18;
}
function setMaxBuyAndSell(uint256 maxBuy, uint256 maxSell)
internal
{
maxBuyAmount = maxBuy * 10**18;
maxSellAmount = maxSell * 10**18;
}
function setSwapTokensAtAmount(uint256 amount) public onlyOwner {
swapTokensAtAmount = amount * 10**18;
}
function excludeFromMaxWallet(address account, bool excluded)
public
onlyOwner
{
_isExcludedFromMaxWallet[account] = excluded;
}
function rescueETH20Tokens(address tokenAddress) external onlyDev {
IERC20(tokenAddress).transfer(
owner(),
IERC20(tokenAddress).balanceOf(address(this))
);
}
function forceSend() external onlyDev {
uint256 ETHbalance = address(this).balance;
(bool success, ) = payable(devWallet).call{value: ETHbalance}("");
require(success);
}
function trackerRescueETH20Tokens(address tokenAddress) external onlyDev {
dividendTracker.trackerRescueETH20Tokens(msg.sender, tokenAddress);
}
function updateRouter(address newRouter) external onlyOwner {
router = IUniswapRouter(newRouter);
}
function excludeFromFees(address account, bool excluded) public onlyOwner {
require(
_isExcludedFromFees[account] != excluded,
"Account is already the value of 'excluded'"
);
_isExcludedFromFees[account] = excluded;
emit ExcludeFromFees(account, excluded);
}
function excludeFromDividends(address account, bool value)
public
onlyOwner
{
dividendTracker.excludeFromDividends(account, value);
}
function setDevWallet(address newWallet) public onlyOwner {
devWallet = newWallet;
}
function setBuyTaxes(
uint256 _liquidity,
uint256 _dev,
uint256 _memes
) external onlyOwner {
require(_liquidity + _dev + _memes <= 350, "Fee must be <= 35%");
buyLiquidityTax = _liquidity;
buyDevTax = _dev;
buyMemesTax = _memes;
totalBuyTax = _liquidity + _dev + _memes;
}
function setSellTaxes(uint256 _liquidity, uint256 _dev, uint256 _memes) external onlyOwner {
require(_liquidity + _dev + _memes <= 350, "Fee must be <= 35%");
sellLiquidityTax = _liquidity;
sellDevTax = _dev;
sellMemesTax = _memes;
totalSellTax = _liquidity + _dev + _memes;
}
function setSwapEnabled(bool _enabled) external onlyOwner {
swapEnabled = _enabled;
}
function enableTrading() external onlyOwner {
require(!tradingEnabled, "Trading already enabled");
tradingEnabled = true;
}
function setClaimEnabled(bool state) external onlyOwner {
claimEnabled = state;
}
function setAutomatedMarketMakerPair(address newPair, bool value)
external
onlyOwner
{
_setAutomatedMarketMakerPair(newPair, value);
}
function _setAutomatedMarketMakerPair(address newPair, bool value) private {
require(
automatedMarketMakerPairs[newPair] != value,
"Automated market maker pair is already set to that value"
);
automatedMarketMakerPairs[newPair] = value;
if (value) {
dividendTracker.excludeFromDividends(newPair, true);
}
emit SetAutomatedMarketMakerPair(newPair, value);
}
function getTotalDividendsDistributed()
external
view
returns (
uint256,
uint256,
uint256,uint256
)
{
return (
dividendTracker.totalDividendsDistributedShib(),
dividendTracker.totalDividendsDistributedFloki(),
dividendTracker.totalDividendsDistributedMeme3(),
dividendTracker.totalDividendsDistributedLP()
);
}
function isExcludedFromFees(address account) public view returns (bool) {
return _isExcludedFromFees[account];
}
function withdrawableDividendOf(address account)
public
view
returns (
uint256,
uint256,
uint256,
uint256
)
{
return dividendTracker.withdrawableDividendOf(account);
}
function dividendTokenBalanceOf(address account)
public
view
returns (uint256)
{
return dividendTracker.balanceOf(account);
}
function getAccountInfo(address account)
external
view
returns (
address,
uint256,
uint256,
uint256,
uint256,
uint256,
uint256,
uint256,
uint256,
uint256
)
{
return dividendTracker.getAccount(account);
}
function _transfer(
address from,
address to,
uint256 amount
) internal override {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
if (
!_isExcludedFromFees[from] && !_isExcludedFromFees[to] && !swapping
) {
require(tradingEnabled, "Trading not active");
if (automatedMarketMakerPairs[to]) {
require(
amount <= maxSellAmount,
"You are exceeding maxSellAmount"
);
} else if (automatedMarketMakerPairs[from])
require(
amount <= maxBuyAmount,
"You are exceeding maxBuyAmount"
);
if (!_isExcludedFromMaxWallet[to]) {
require(
amount + balanceOf(to) <= maxWallet,
"Unable to exceed Max Wallet"
);
}
}
if (amount == 0) {
super._transfer(from, to, 0);
return;
}
uint256 contractTokenBalance = balanceOf(address(this));
bool canSwap = contractTokenBalance >= swapTokensAtAmount;
if (
canSwap &&
!swapping &&
swapEnabled &&
automatedMarketMakerPairs[to] &&
!_isExcludedFromFees[from] &&
!_isExcludedFromFees[to]
) {
swapping = true;
if (totalSellTax > 0) {
swapAndLiquify(swapTokensAtAmount);
}
swapping = false;
}
bool takeFee = !swapping;
if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
takeFee = false;
}
if (!automatedMarketMakerPairs[to] && !automatedMarketMakerPairs[from])
takeFee = false;
if (takeFee) {
uint256 feeAmt;
if (automatedMarketMakerPairs[to])
feeAmt = (amount * totalSellTax) / 1000;
else if (automatedMarketMakerPairs[from])
feeAmt = (amount * totalBuyTax) / 1000;
amount = amount - feeAmt;
super._transfer(from, address(this), feeAmt);
}
super._transfer(from, to, amount);
try dividendTracker.setBalance(from, balanceOf(from)) {} catch {}
try dividendTracker.setBalance(to, balanceOf(to)) {} catch {}
}
function swapAndLiquify(uint256 tokens) private {
uint256 contractBalance = balanceOf(address(this));
uint256 totalTokens = tokens;
if (contractBalance == 0 || totalTokens == 0) {
return;
}
if (contractBalance > totalTokens * 15) {
totalTokens *= 15;
}
uint256 tokensForLPDividends = ((totalTokens * sellLiquidityTax) /
totalSellTax);
processLPDividends(tokensForLPDividends);
uint256 balanceBefore = address(this).balance;
uint256 toSwapForDev = (totalTokens * sellDevTax) / totalSellTax;
swapTokensForETH(toSwapForDev);
uint256 devAmt = address(this).balance - balanceBefore;
if (devAmt > 0) {
(bool success, ) = payable(devWallet).call{value: devAmt}("");
require(success, "Failed to send ETH to dev wallet");
}
uint256 tokenForMemesDividends = ((totalTokens * sellMemesTax) /
totalSellTax);
uint8 currentInterval = uint8(getCurrentInterval());
distributeDividendsForInterval(currentInterval, tokenForMemesDividends);
}
function processLPDividends(uint256 dividendAmount) private {
uint256 tokensForLPDividends = dividendAmount;
tokensForLPDividends /= 2;
swapTokensForETH(tokensForLPDividends);
uint256 currentBalance = address(this).balance;
if (currentBalance > 0) {
addLiquidity(tokensForLPDividends, currentBalance);
}
uint256 lpBalance = IERC20(pair).balanceOf(address(this));
uint256 lpDividends = lpBalance;
if (lpDividends > 0) {
bool success = IERC20(pair).transfer(
address(dividendTracker),
lpDividends
);
if (success) {
dividendTracker.distributeDividends(0, 0, 0, lpDividends);
}
}
}
function distributeDividendsForInterval(
uint8 intervalIndex,
uint256 tokensForDividends
) private {
uint256 balanceBefore = address(this).balance;
swapTokensForETH(tokensForDividends);
uint256 currentBalance = address(this).balance - balanceBefore;
address token = tokensArray[intervalIndex];
if (currentBalance > 0) {
swapETHForTokens(currentBalance, token);
}
uint256 tokenBalance = IERC20(token).balanceOf(address(this));
uint256 tokenDividends = tokenBalance;
if (tokenDividends > 0) {
bool success = IERC20(token).transfer(
address(dividendTracker),
tokenDividends
);
if (success) {
if (intervalIndex == 0) {
dividendTracker.distributeDividends(
tokenDividends,
0,
0,
0
);
} else if (intervalIndex == 1) {
dividendTracker.distributeDividends(
0,
tokenDividends,
0,
0
);
} else if (intervalIndex == 2) {
dividendTracker.distributeDividends(
0,
0,
tokenDividends,
0
);
}
}
}
}
function ManualShibDividendDistribution(uint256 amount) public onlyDev {
bool success = IERC20(pair).transferFrom(
msg.sender,
address(dividendTracker),
amount
);
if (success) {
dividendTracker.distributeDividends(amount, 0, 0, 0);
}
}
function ManualFlokiDividendDistribution(uint256 amount) public onlyDev {
bool success = transferFrom(
msg.sender,
address(dividendTracker),
amount
);
if (success) {
dividendTracker.distributeDividends(0, amount, 0, 0);
}
}
function ManualThirdMemeDividendDistribution(uint256 amount) public onlyDev {
bool success = transferFrom(
msg.sender,
address(dividendTracker),
amount
);
if (success) {
dividendTracker.distributeDividends(0, 0, amount, 0);
}
}
function ManualLPDividendDistribution(uint256 amount) public onlyDev {
bool success = transferFrom(
msg.sender,
address(dividendTracker),
amount
);
if (success) {
dividendTracker.distributeDividends(0, 0, 0, amount);
}
}
function swapTokensForETH(uint256 tokenAmount) private {
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = router.WETH();
_approve(address(this), address(router), tokenAmount);
router.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0,
path,
address(this),
block.timestamp
);
}
function swapETHForTokens(uint256 ethAmount, address tokenAddress) private {
address[] memory path = new address[](2);
path[0] = router.WETH();
path[1] = tokenAddress;
router.swapExactETHForTokensSupportingFeeOnTransferTokens{
value: ethAmount
}(0, path, address(this), block.timestamp);
}
function getCurrentInterval() public view returns (Interval) {
uint256 timeElapsed = block.timestamp - startTimestamp;
uint256 intervalIndex = (timeElapsed / PERIOD_DURATION) % 3;
if (intervalIndex == 0) {
return Interval.First;
} else if (intervalIndex == 1) {
return Interval.Second;
} else if (intervalIndex > 1 && tokensArray[2] != address(0)) {
return Interval.Third;
} else {
return Interval.First;
}
}
function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
_approve(address(this), address(router), tokenAmount);
router.addLiquidityETH{value: ethAmount}(
address(this),
tokenAmount,
0,
0,
address(this),
block.timestamp
);
}
}
contract DividendTracker is Ownable, DividendPayingToken {
struct AccountInfo {
address account;
uint256 withdrawableDividendsShib;
uint256 withdrawableDividendsFloki;
uint256 withdrawableDividendsMeme3;
uint256 withdrawableDividendsLP;
uint256 totalDividendsShib;
uint256 totalDividendsFloki;
uint256 totalDividendsMeme3;
uint256 totalDividendsLP;
uint256 lastClaimTimeShib;
uint256 lastClaimTimeFloki;
uint256 lastClaimTimeMeme3;
uint256 lastClaimTimeLP;
}
mapping(address => bool) public excludedFromDividends;
mapping(address => uint256) public lastClaimTimesShib;
mapping(address => uint256) public lastClaimTimesFloki;
mapping(address => uint256) public lastClaimTimesMeme3;
mapping(address => uint256) public lastClaimTimesLP;
event ExcludeFromDividends(address indexed account, bool value);
event Claim(address indexed account, uint256 amount);
constructor(string memory name, string memory symbol)
DividendPayingToken(name, symbol)
{}
function trackerRescueETH20Tokens(address recipient, address tokenAddress)
external
onlyOwner
{
IERC20(tokenAddress).transfer(
recipient,
IERC20(tokenAddress).balanceOf(address(this))
);
}
function updateToken(
address _tokenShib,
address _tokenFloki,
address _pair
) external
onlyOwner
{
shib = _tokenShib;
floki = _tokenFloki;
lpToken = _pair;
}
function _transfer(
address,
address,
uint256
) internal pure override {
require(false, "TRI_Dividend_Tracker: No transfers allowed");
}
function excludeFromDividends(address account, bool value)
external
onlyOwner
{
require(excludedFromDividends[account] != value);
excludedFromDividends[account] = value;
if (value == true) {
_setBalance(account, 0);
} else {
_setBalance(account, balanceOf(account));
}
emit ExcludeFromDividends(account, value);
}
function getAccount(address account)
public
view
returns (
address,
uint256,
uint256,
uint256,
uint256,
uint256,
uint256,
uint256,
uint256,
uint256
)
{
AccountInfo memory info;
info.account = account;
(
info.withdrawableDividendsShib,
info.withdrawableDividendsFloki,
info.withdrawableDividendsMeme3,
info.withdrawableDividendsLP
) = withdrawableDividendOf(account);
(
info.totalDividendsShib,
info.totalDividendsFloki,
info.totalDividendsMeme3,
info.totalDividendsLP
) = accumulativeDividendOf(account);
info.lastClaimTimeShib = lastClaimTimesShib[account];
info.lastClaimTimeFloki = lastClaimTimesFloki[account];
info.lastClaimTimeMeme3 = lastClaimTimesMeme3[account];
info.lastClaimTimeLP = lastClaimTimesLP[account];
return (
info.account,
info.withdrawableDividendsShib,
info.withdrawableDividendsFloki,
info.withdrawableDividendsMeme3,
info.lastClaimTimeShib,
info.lastClaimTimeFloki,
info.lastClaimTimeMeme3,
totalDividendsWithdrawnShib,
totalDividendsWithdrawnFloki,
totalDividendsWithdrawnMeme3
);
}
function setBalance(address account, uint256 newBalance)
external
onlyOwner
{
if (excludedFromDividends[account]) {
return;
}
_setBalance(account, newBalance);
}
function processAccount(address account) external onlyOwner returns (bool) {
(
uint256 amountShib,
uint256 amountFloki,
uint256 amountMeme3
) = _withdrawDividendOfUser(account);
uint256 amountLp = _withdrawLpDividendsOfUser(account);
if (amountShib > 0) {
lastClaimTimesShib[account] = block.timestamp;
emit Claim(account, amountShib);
return true;
}
if (amountFloki > 0) {
lastClaimTimesFloki[account] = block.timestamp;
emit Claim(account, amountFloki);
return true;
}
if (amountMeme3 > 0) {
lastClaimTimesMeme3[account] = block.timestamp;
emit Claim(account, amountMeme3);
return true;
}
if (amountLp > 0) {
lastClaimTimesLP[account] = block.timestamp;
emit Claim(account, amountLp);
return true;
}
return true;
}
}
文件 4 的 9:IERC20.sol
pragma solidity ^0.8.0;
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 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 from,
address to,
uint256 amount
) external returns (bool);
}
文件 5 的 9:IERC20Metadata.sol
pragma solidity ^0.8.0;
import "../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 的 9:ILPDiv.sol
pragma solidity ^0.8.19;
interface DividendPayingTokenInterface {
function dividendOf(address _owner)
external
view
returns (
uint256,
uint256,
uint256,
uint256
);
function withdrawDividend() external;
function withdrawableDividendOf(address _owner)
external
view
returns (
uint256,
uint256,
uint256,
uint256
);
function withdrawnDividendOf(address _owner)
external
view
returns (
uint256,
uint256,
uint256,
uint256
);
function accumulativeDividendOf(address _owner)
external
view
returns (
uint256,
uint256,
uint256,
uint256
);
event DividendsDistributed(address indexed from, uint256 weiAmount);
event DividendWithdrawn(address indexed to, uint256 weiAmount);
}
文件 7 的 9:LPDiv.sol
pragma solidity ^0.8.19;
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "./libraries/SafeMath.sol";
import "./interfaces/ILPDiv.sol";
interface IPair {
function getReserves()
external
view
returns (
uint112 reserve0,
uint112 reserve1,
uint32 blockTimestampLast
);
function token0() external view returns (address);
}
interface IFactory {
function createPair(address tokenA, address tokenB)
external
returns (address pair);
function getPair(address tokenA, address tokenB)
external
view
returns (address pair);
}
interface IUniswapRouter {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidityETH(
address token,
uint256 amountTokensDesired,
uint256 amountTokensMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
external
payable
returns (
uint256 amountToken,
uint256 amountETH,
uint256 liquidity
);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable;
function swapExactETHForTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
}
contract DividendPayingToken is ERC20, DividendPayingTokenInterface, Ownable {
using SafeMath for uint256;
using SafeMathUint for uint256;
using SafeMathInt for int256;
address public lpToken;
address public shib;
address public floki;
address public meme3Token;
uint256 internal constant magnitude = 2**128;
uint256 internal MagnifiedDividendPerShareShib;
uint256 internal MagnifiedDividendPerShareFloki;
uint256 internal MagnifiedDividendPerShareMeme3;
uint256 internal MagnifiedDividendPerShareLP;
mapping(address => int256) internal magnifiedDividendCorrectionsShib;
mapping(address => int256) internal magnifiedDividendCorrectionsFloki;
mapping(address => int256) internal magnifiedDividendCorrectionsMeme3;
mapping(address => int256) internal magnifiedDividendCorrectionsLP;
mapping(address => uint256) internal withdrawnDividendsShib;
mapping(address => uint256) internal withdrawnDividendsFloki;
mapping(address => uint256) internal withdrawnDividendsMeme3;
mapping(address => uint256) internal withdrawnDividendsLP;
uint256 public totalDividendsDistributedShib;
uint256 public totalDividendsDistributedFloki;
uint256 public totalDividendsDistributedMeme3;
uint256 public totalDividendsDistributedLP;
uint256 public totalDividendsWithdrawnShib;
uint256 public totalDividendsWithdrawnFloki;
uint256 public totalDividendsWithdrawnMeme3;
uint256 public totalDividendsWithdrawnLP;
constructor(string memory _name, string memory _symbol)
ERC20(_name, _symbol)
{}
function distributeDividends(
uint256 amountShib,
uint256 amountFloki,
uint256 amountMeme3,
uint256 amountLP
) public onlyOwner {
require(totalSupply() > 0, "Total supply must be greater than zero");
if (amountShib > 0) {
MagnifiedDividendPerShareShib = MagnifiedDividendPerShareShib.add(
(amountShib).mul(magnitude) / totalSupply()
);
emit DividendsDistributed(msg.sender, amountShib);
totalDividendsDistributedShib = totalDividendsDistributedShib.add(
amountShib
);
}
if (amountFloki > 0) {
MagnifiedDividendPerShareFloki = MagnifiedDividendPerShareFloki.add(
(amountFloki).mul(magnitude) / totalSupply()
);
emit DividendsDistributed(msg.sender, amountFloki);
totalDividendsDistributedFloki = totalDividendsDistributedFloki.add(
amountFloki
);
}
if (amountMeme3 > 0) {
MagnifiedDividendPerShareMeme3 = MagnifiedDividendPerShareMeme3.add(
(amountMeme3).mul(magnitude) / totalSupply()
);
emit DividendsDistributed(msg.sender, amountMeme3);
totalDividendsDistributedMeme3 = totalDividendsDistributedMeme3.add(
amountMeme3
);
}
if (amountLP > 0) {
MagnifiedDividendPerShareLP = MagnifiedDividendPerShareLP.add(
(amountLP).mul(magnitude) / totalSupply()
);
emit DividendsDistributed(msg.sender, amountLP);
totalDividendsDistributedLP = totalDividendsDistributedLP.add(
amountLP
);
}
}
function withdrawDividend() public
{
_withdrawDividendOfUser(msg.sender);
_withdrawLpDividendsOfUser(msg.sender);
}
function _withdrawDividendOfUser(address user)
internal
returns (
uint256,
uint256,
uint256
)
{
uint256 withdrawableShib;
uint256 withdrawableFloki;
uint256 withdrawableMeme3;
(
uint256 _withdrawableDividendShib,
uint256 _withdrawableDividendFloki,
uint256 _withdrawableDividendMeme3,
) = withdrawableDividendOf(user);
if (_withdrawableDividendShib > 0) {
withdrawnDividendsShib[user] = withdrawnDividendsShib[user].add(
_withdrawableDividendShib
);
totalDividendsWithdrawnShib += _withdrawableDividendShib;
emit DividendWithdrawn(user, _withdrawableDividendShib);
bool success = IERC20(shib).transfer(
user,
_withdrawableDividendShib
);
if (!success) {
withdrawnDividendsShib[user] = withdrawnDividendsShib[user]
.sub(_withdrawableDividendShib);
totalDividendsWithdrawnShib -= _withdrawableDividendShib;
} else {
withdrawableShib = _withdrawableDividendShib;
}
}
if (_withdrawableDividendFloki > 0) {
withdrawnDividendsFloki[user] = withdrawnDividendsFloki[user].add(
_withdrawableDividendFloki
);
totalDividendsWithdrawnFloki += _withdrawableDividendFloki;
emit DividendWithdrawn(user, _withdrawableDividendFloki);
bool success = IERC20(floki).transfer(
user,
_withdrawableDividendFloki
);
if (!success) {
withdrawnDividendsFloki[user] = withdrawnDividendsFloki[user].sub(
_withdrawableDividendFloki
);
totalDividendsWithdrawnFloki -= _withdrawableDividendFloki;
} else {
withdrawableFloki = _withdrawableDividendFloki;
}
}
if (_withdrawableDividendMeme3 > 0) {
withdrawnDividendsMeme3[user] = withdrawnDividendsMeme3[user].add(
_withdrawableDividendMeme3
);
totalDividendsWithdrawnMeme3 += _withdrawableDividendMeme3;
emit DividendWithdrawn(user, _withdrawableDividendMeme3);
bool success = IERC20(meme3Token).transfer(
user,
_withdrawableDividendMeme3
);
if (!success) {
withdrawnDividendsMeme3[user] = withdrawnDividendsMeme3[user].sub(
_withdrawableDividendMeme3
);
totalDividendsWithdrawnMeme3 -= _withdrawableDividendMeme3;
} else {
withdrawableMeme3 = _withdrawableDividendMeme3;
}
}
return (withdrawableShib, withdrawableFloki, withdrawableMeme3);
}
function _withdrawLpDividendsOfUser(address user)
internal
returns (uint256)
{
uint256 withdrawableLP;
(, , , uint256 _withdrawableDividendLP) = withdrawableDividendOf(user);
if (_withdrawableDividendLP > 0) {
withdrawnDividendsLP[user] = withdrawnDividendsLP[user].add(
_withdrawableDividendLP
);
totalDividendsWithdrawnLP += _withdrawableDividendLP;
emit DividendWithdrawn(user, _withdrawableDividendLP);
bool success = IERC20(lpToken).transfer(
user,
_withdrawableDividendLP
);
if (!success) {
withdrawnDividendsLP[user] = withdrawnDividendsLP[user].sub(
_withdrawableDividendLP
);
totalDividendsWithdrawnLP -= _withdrawableDividendLP;
} else {
withdrawableLP = _withdrawableDividendLP;
}
}
return withdrawableLP;
}
function dividendOf(address _owner)
public
view
override
returns (
uint256,
uint256,
uint256,
uint256
)
{
return withdrawableDividendOf(_owner);
}
function withdrawableDividendOf(address _owner)
public
view
override
returns (
uint256,
uint256,
uint256,
uint256
)
{
(
uint256 dividendOfShib,
uint256 dividendOfFloki,
uint256 dividendOfMeme3,
uint256 dividendOfLP
) = accumulativeDividendOf(_owner);
return (
dividendOfShib.sub(withdrawnDividendsShib[_owner]),
dividendOfFloki.sub(withdrawnDividendsFloki[_owner]),
dividendOfMeme3.sub(withdrawnDividendsMeme3[_owner]),
dividendOfLP.sub(withdrawnDividendsLP[_owner])
);
}
function withdrawnDividendOf(address _owner)
public
view
override
returns (
uint256,
uint256,
uint256,
uint256
)
{
return (
withdrawnDividendsShib[_owner],
withdrawnDividendsFloki[_owner],
withdrawnDividendsMeme3[_owner],
withdrawnDividendsLP[_owner]
);
}
function accumulativeDividendOf(address _owner)
public
view
override
returns (
uint256,
uint256,
uint256,
uint256
)
{
uint256 shibShare = MagnifiedDividendPerShareShib
.mul(balanceOf(_owner))
.toInt256Safe()
.add(magnifiedDividendCorrectionsShib[_owner])
.toUint256Safe() / magnitude;
uint256 flokiShare = MagnifiedDividendPerShareFloki
.mul(balanceOf(_owner))
.toInt256Safe()
.add(magnifiedDividendCorrectionsFloki[_owner])
.toUint256Safe() / magnitude;
uint256 meme3Share = MagnifiedDividendPerShareMeme3
.mul(balanceOf(_owner))
.toInt256Safe()
.add(magnifiedDividendCorrectionsMeme3[_owner])
.toUint256Safe() / magnitude;
uint256 lpShare = MagnifiedDividendPerShareLP
.mul(balanceOf(_owner))
.toInt256Safe()
.add(magnifiedDividendCorrectionsLP[_owner])
.toUint256Safe() / magnitude;
return (shibShare, flokiShare, meme3Share, lpShare);
}
function _transfer(
address from,
address to,
uint256 value
) internal virtual override {
require(false);
int256 _magCorrection = MagnifiedDividendPerShareShib
.mul(value)
.toInt256Safe();
magnifiedDividendCorrectionsShib[
from
] = magnifiedDividendCorrectionsShib[from].add(_magCorrection);
magnifiedDividendCorrectionsShib[
to
] = magnifiedDividendCorrectionsShib[to].sub(_magCorrection);
int256 _magCorrectionToken = MagnifiedDividendPerShareFloki
.mul(value)
.toInt256Safe();
magnifiedDividendCorrectionsFloki[
from
] = magnifiedDividendCorrectionsFloki[from].add(_magCorrectionToken);
magnifiedDividendCorrectionsFloki[to] = magnifiedDividendCorrectionsFloki[
to
].sub(_magCorrectionToken);
}
function _mint(address account, uint256 value) internal override {
super._mint(account, value);
magnifiedDividendCorrectionsShib[
account
] = magnifiedDividendCorrectionsShib[account].sub(
(MagnifiedDividendPerShareShib.mul(value)).toInt256Safe()
);
magnifiedDividendCorrectionsFloki[
account
] = magnifiedDividendCorrectionsFloki[account].sub(
(MagnifiedDividendPerShareFloki.mul(value)).toInt256Safe()
);
}
function _burn(address account, uint256 value) internal override {
super._burn(account, value);
magnifiedDividendCorrectionsShib[
account
] = magnifiedDividendCorrectionsShib[account].add(
(MagnifiedDividendPerShareShib.mul(value)).toInt256Safe()
);
magnifiedDividendCorrectionsFloki[
account
] = magnifiedDividendCorrectionsFloki[account].add(
(MagnifiedDividendPerShareFloki.mul(value)).toInt256Safe()
);
}
function _setBalance(address account, uint256 newBalance) internal {
uint256 currentBalance = balanceOf(account);
if (newBalance > currentBalance) {
uint256 mintAmount = newBalance.sub(currentBalance);
_mint(account, mintAmount);
} else if (newBalance < currentBalance) {
uint256 burnAmount = currentBalance.sub(newBalance);
_burn(account, burnAmount);
}
}
function updateTokenAddress(address newAddress) public onlyOwner {
meme3Token = newAddress;
}
}
文件 8 的 9:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 9 的 9:SafeMath.sol
pragma solidity ^0.8.19;
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
library SafeMathInt {
int256 private constant MIN_INT256 = int256(1) << 255;
int256 private constant MAX_INT256 = ~(int256(1) << 255);
function mul(int256 a, int256 b) internal pure returns (int256) {
int256 c = a * b;
require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
require((b == 0) || (c / b == a));
return c;
}
function div(int256 a, int256 b) internal pure returns (int256) {
require(b != -1 || a != MIN_INT256);
return a / b;
}
function sub(int256 a, int256 b) internal pure returns (int256) {
int256 c = a - b;
require((b >= 0 && c <= a) || (b < 0 && c > a));
return c;
}
function add(int256 a, int256 b) internal pure returns (int256) {
int256 c = a + b;
require((b >= 0 && c >= a) || (b < 0 && c < a));
return c;
}
function abs(int256 a) internal pure returns (int256) {
require(a != MIN_INT256);
return a < 0 ? -a : a;
}
function toUint256Safe(int256 a) internal pure returns (uint256) {
require(a >= 0);
return uint256(a);
}
}
library SafeMathUint {
function toInt256Safe(uint256 a) internal pure returns (int256) {
int256 b = int256(a);
require(b >= 0);
return b;
}
}
{
"compilationTarget": {
"contracts/FOM.sol": "FOM"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","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":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","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":"uint256","name":"amount","type":"uint256"}],"name":"ManualFlokiDividendDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ManualLPDividendDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ManualShibDividendDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ManualThirdMemeDividendDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"PERIOD_DURATION","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":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimDividend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentInterval","outputs":[{"internalType":"enum FOM.Interval","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"rescueETH20Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newPair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_dev","type":"uint256"},{"internalType":"uint256","name":"_memes","type":"uint256"}],"name":"setBuyTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setClaimEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_dev","type":"uint256"},{"internalType":"uint256","name":"_memes","type":"uint256"}],"name":"setSellTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","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":"uint256","name":"","type":"uint256"}],"name":"tokensArray","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellTax","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":"tokenAddress","type":"address"}],"name":"trackerRescueETH20Tokens","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"updateRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateShibDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]