// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
struct LaunchTokenConfig {
string name;
string symbol;
uint256 totalSupply;
uint256 mintCountMax;
uint256 mintOnceBNB;
uint256[5] buyFees;
uint256[5] sellFees;
address rewardToken;
address mintToken;
address fundReceiver;
uint256 dividendThreshold;
uint256 weightPeriodMinutes;
}
interface IERC20 {
function decimals() external view returns (uint256);
function symbol() external view returns (string memory);
function name() external view returns (string memory);
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);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
}
interface ISwapRouter {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);
function addLiquidityETH(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
external
payable
returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
function removeLiquidityETH(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
) external returns (uint256 amountToken, uint256 amountETH);
function removeLiquidity(
address tokenA,
address tokenB,
uint256 liquidity,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
) external returns (uint256 amountA, uint256 amountB);
}
interface ISwapFactory {
function createPair(
address tokenA,
address tokenB
) external returns (address pair);
function getPair(
address tokenA,
address tokenB
) external view returns (address pair);
}
interface IUniswapV3Factory {
function getPool(
address tokenA,
address tokenB,
uint24 fee
) external view returns (address pool);
}
interface IUniswapV3Pool {
function liquidity() external view returns (uint128);
}
interface IUniswapV3SwapRouter {
struct ExactInputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 amountIn;
uint256 amountOutMinimum;
uint160 sqrtPriceLimitX96;
}
function exactInputSingle(
ExactInputSingleParams calldata params
) external payable returns (uint256 amountOut);
}
abstract contract Ownable {
address internal _owner;
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
constructor() {
address msgSender = msg.sender;
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view returns (address) {
return _owner;
}
modifier onlyOwner() {
require(_owner == msg.sender, "!owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0xdead));
_owner = address(0xdead);
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "new is 0");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
contract TokenDistributor is Ownable{
constructor() {
}
function claim(address to,uint256 amount) external onlyOwner payable {
(bool success, ) = payable(to).call{value: amount, gas: 300000}("");
require(success, "claim failed");
}
receive() external payable {}
}
interface ISwapPair {
function getReserves()
external
view
returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function token0() external view returns (address);
function balanceOf(address account) external view returns (uint256);
function totalSupply() external view returns (uint256);
}
interface ILaunchVault {
function creator() external view returns (address);
function recordMint(address account, uint256 amount) external;
function markLaunched() external;
function burnToken(address erc20) external;
function refundMint(address account, uint256 amount, address lpToken, address payToken) external returns (uint256);
}
contract Smiley is IERC20, Ownable {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
address public fundAddress;
string private _name;
string private _symbol;
uint256 private _decimals;
uint256 private _tTotal;
uint256 private _tTotalLP;
ISwapRouter public _swapRouter;
address public currency;
address public mintToken;
address public fundReceiver;
mapping(address => bool) public _swapPairList;
bool private inSwap;
uint256 private constant MAX = ~uint256(0);
address private constant ROBINHOOD_V2_ROUTER = 0x89e5DB8B5aA49aA85AC63f691524311AEB649eba;
address private constant ROBINHOOD_V3_SWAP_ROUTER = 0xCaf681a66D020601342297493863E78C959E5cb2;
address private constant ROBINHOOD_V3_FACTORY = 0x1f7d7550B1b028f7571E69A784071F0205FD2EfA;
address private constant ROBINHOOD_WETH = 0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73;
address private constant ROBINHOOD_USDG = 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168;
TokenDistributor public _tokenDistributor;
ETHBackDividendTracker public dividendTracker;
uint256 public _buyFundFee;
uint256 public _buyLPFee;
uint256 public _buyRewardFee;
uint256 public _buyHoldRewardFee;
uint256 public buy_burnFee;
uint256 public _sellFundFee;
uint256 public _sellLPFee;
uint256 public _sellRewardFee;
uint256 public _sellHoldRewardFee;
uint256 public sell_burnFee;
uint256 public _allBuyFee;
uint256 public _allSellFee;
address private feeReceiver;
address private constant PLATFORM_TAX_WALLET = 0x6db0eaaE3E6A7edc7D838A787c0a3366A53a220e;
bool currencyIsEth;
address public ETH;
uint256 public startTradeBlock;
address public _mainPair;
address[] public dividendTaxWallets;
uint256 public currentDividendTaxWalletIndex;
uint256 public constant dividendTaxFee = 2000;
modifier lockTheSwap() {
inSwap = true;
_;
inSwap = false;
}
bool public enableOffTrade;
address[] public rewardPath;
bool private _isMinting;
uint256 public airdropNumbs = 2;
event SendDividends(uint256 tokensSwapped, uint256 amount);
event ProcessedDividendTracker(
uint256 iterations,
uint256 claims,
uint256 lastProcessedIndex,
bool indexed automatic,
uint256 gas,
address indexed processor
);
constructor(
LaunchTokenConfig memory config,
address vaultAddress_,
address platformTaxWallet_
) {
require(bytes(config.name).length > 0, "empty name");
require(bytes(config.symbol).length > 0, "empty symbol");
require(config.totalSupply > 0, "empty supply");
require(config.mintCountMax > 0, "empty mint count");
require(config.mintOnceBNB > 0, "empty mint price");
require(platformTaxWallet_ != address(0), "platform is 0");
launchCreatedAt = block.timestamp;
dividendTaxWallets.push(PLATFORM_TAX_WALLET);
fundAddress = vaultAddress_;
feeReceiver = PLATFORM_TAX_WALLET;
_name = config.name;
_symbol = config.symbol;
if(config.totalSupply<=1e12)
{
_decimals = 18;
}
else
{
_decimals = 0;
}
uint256 total = config.totalSupply * 10 **_decimals;
_tTotal = total;
require(total<= 1e30,"Amount to much");
_tTotalLP = total;
mintToken = config.mintToken;
currency = config.mintToken == address(0)
? ROBINHOOD_WETH
: config.mintToken;
fundReceiver = config.fundReceiver == address(0) ? platformTaxWallet_ : config.fundReceiver;
ISwapRouter swapRouter = ISwapRouter(ROBINHOOD_V2_ROUTER);
ETH = config.rewardToken == address(0)
? ROBINHOOD_USDG
: config.rewardToken;
enableOffTrade = true;
currencyIsEth = config.mintToken == address(0);
rewardPath = [address(this), currency];
IERC20(currency).approve(address(swapRouter), MAX);
_swapRouter = swapRouter;
_allowances[address(this)][address(swapRouter)] = MAX;
ISwapFactory swapFactory = ISwapFactory(swapRouter.factory());
address swapPair = swapFactory.createPair(address(this), currency);
_mainPair = swapPair;
_swapPairList[swapPair] = true;
_buyFundFee = config.buyFees[0];
_buyLPFee = config.buyFees[1];
_buyRewardFee = config.buyFees[2];
_buyHoldRewardFee = config.buyFees[3];
buy_burnFee = config.buyFees[4];
_sellFundFee = config.sellFees[0];
_sellLPFee = config.sellFees[1];
_sellRewardFee = config.sellFees[2];
_sellHoldRewardFee = config.sellFees[3];
sell_burnFee = config.sellFees[4];
_allBuyFee = _buyFundFee + _buyLPFee + _buyRewardFee + _buyHoldRewardFee + buy_burnFee;
_allSellFee = _sellFundFee + _sellLPFee + _sellRewardFee + _sellHoldRewardFee + sell_burnFee;
require(_allBuyFee <= 1000 && _allSellFee <= 1000,"fee too high");
address ReceiveAddress = address(this);
_balances[ReceiveAddress] = _tTotalLP;
emit Transfer(address(0), ReceiveAddress, _tTotal);
_allowances[ReceiveAddress][address(swapRouter)] = MAX;
Mint_Count_Max = config.mintCountMax;
Mint_Once_BNB = config.mintOnceBNB;
_tokenDistributor = new TokenDistributor();
uint256 mushHoldNum = config.dividendThreshold > 0
? _normalizeConfiguredTokenAmount(config.dividendThreshold)
: 1 * 10 ** _decimals;
dividendTracker = new ETHBackDividendTracker(
mushHoldNum,
ETH
);
dividendTracker.excludeFromDividends(address(dividendTracker));
dividendTracker.excludeFromDividends(address(this));
dividendTracker.excludeFromDividends(address(_mainPair));
dividendTracker.excludeFromDividends(address(0xdead));
dividendTracker.excludeFromDividends(address(swapRouter));
if (ETH != ROBINHOOD_WETH) {
require(rewardHasETHPool(ETH), "dividend token not eth pool");
}
}
function _normalizeConfiguredTokenAmount(uint256 amount) private view returns (uint256) {
if (amount == 0 || _decimals == 18) {
return amount;
}
uint256 scale = 10 ** (18 - _decimals);
if (amount < scale / 10) {
return amount;
}
return (amount + scale - 1) / scale;
}
function setLaunchVault(address vaultAddress_) external onlyOwner {
require(vaultAddress_ != address(0), "vault is 0");
require(fundAddress == address(0), "vault set");
fundAddress = vaultAddress_;
}
function _hasAnyTax() private view returns (bool) {
return (_allBuyFee +_allSellFee > 0);
}
function symbol() external view override returns (string memory) {
return _symbol;
}
function name() external view override returns (string memory) {
return _name;
}
function totalSupply() public view override returns (uint256) {
return _tTotal;
}
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
function transfer(
address recipient,
uint256 amount
) public override returns (bool) {
_transfer(msg.sender, recipient, amount);
return true;
}
function allowance(
address owner,
address spender
) public view override returns (uint256) {
return _allowances[owner][spender];
}
function approve(
address spender,
uint256 amount
) public override returns (bool) {
_approve(msg.sender, spender, amount);
return true;
}
function transferFrom(
address sender,
address recipient,
uint256 amount
) public override returns (bool) {
if (_allowances[sender][msg.sender] != MAX) {
_allowances[sender][msg.sender] =
_allowances[sender][msg.sender] -
amount;
}
_transfer(sender, recipient, amount);
return true;
}
function _approve(address owner, address spender, uint256 amount) private {
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _basicTransfer(
address sender,
address recipient,
uint256 amount
) internal returns (bool) {
_balances[sender] -= amount;
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
return true;
}
function decimals() external view override returns (uint256) {
return _decimals;
}
function ethHasWBNBPool(address token) public view returns (bool) {
return rewardHasETHPool(token);
}
function rewardHasETHPool(address token) public view returns (bool) {
return _hasV2ETHPool(token) || _bestV3PoolFee(token) > 0;
}
function _hasV2ETHPool(address token) private view returns (bool) {
ISwapFactory factory = ISwapFactory(_swapRouter.factory());
address pair = factory.getPair(token, ROBINHOOD_WETH);
if (pair != address(0)) {
return IERC20(ROBINHOOD_WETH).balanceOf(pair) > 0;
}
return false;
}
function _bestV3PoolFee(address token) private view returns (uint24) {
uint24 fee = _v3PoolFeeIfLiquid(token, 500);
if (fee > 0) return fee;
fee = _v3PoolFeeIfLiquid(token, 3000);
if (fee > 0) return fee;
return _v3PoolFeeIfLiquid(token, 10000);
}
function _v3PoolFeeIfLiquid(address token, uint24 fee) private view returns (uint24) {
address pool = IUniswapV3Factory(ROBINHOOD_V3_FACTORY).getPool(token, ROBINHOOD_WETH, fee);
if (pool == address(0)) return 0;
try IUniswapV3Pool(pool).liquidity() returns (uint128 liquidity) {
return liquidity > 0 ? fee : 0;
} catch {
return 0;
}
}
bool public isAddV2;
bool public isRemoveV2;
function _isAddLiquidity() internal view returns (bool isAdd) {
ISwapPair mainPair = ISwapPair(_mainPair);
(uint r0, uint256 r1, ) = mainPair.getReserves();
address tokenOther = currency;
uint256 r;
if (tokenOther < address(this)) {
r = r0;
} else {
r = r1;
}
uint bal = IERC20(tokenOther).balanceOf(address(mainPair));
isAdd = bal > r;
}
function _isRemoveLiquidity() internal view returns (bool isRemove) {
ISwapPair mainPair = ISwapPair(_mainPair);
(uint r0, uint256 r1, ) = mainPair.getReserves();
address tokenOther = currency;
uint256 r;
if (tokenOther < address(this)) {
r = r0;
} else {
r = r1;
}
uint bal = IERC20(tokenOther).balanceOf(address(mainPair));
isRemove = r >= bal;
}
function _transfer(address from, address to, uint256 amount) private {
uint256 balance = balanceOf(from);
require(balance >= amount, "balanceNotEnough");
if(_isMinting)
{
_basicTransfer(from, to, amount);
return ;
}
if(startTradeBlock == 0)
{
if (
(_swapPairList[from] && (to == fundAddress || to == address(_swapRouter))) ||
(from == address(_swapRouter) && to == fundAddress) ||
(from == fundAddress && to == address(this))
) {
_basicTransfer(from, to, amount);
return;
}
require(false, "not add lp");
}
bool takeFee;
bool isSell;
bool isRemove;
bool isAdd;
if (_swapPairList[to]) {
isAdd = _isAddLiquidity();
isAddV2 = isAdd;
} else if (_swapPairList[from]) {
isRemove = _isRemoveLiquidity();
isRemoveV2 = isRemove;
}
bool hasTax = _hasAnyTax();
if (
airdropNumbs > 0 && amount > airdropNumbs && startTradeBlock > 0 && !inSwap
) {
address ad;
for (uint256 i = 0; i < airdropNumbs; i++) {
ad = address(
uint160(
uint256(
keccak256(
abi.encodePacked(i, amount, block.timestamp)
)
)
)
);
_basicTransfer(from, ad, 1);
}
amount -= airdropNumbs * 1;
}
if (_swapPairList[from] || _swapPairList[to]) {
if (true) {
if (enableOffTrade) {
bool star = startTradeBlock > 0;
require(star,"pausing");
}
if (hasTax && _swapPairList[to]) {
if (!inSwap && !isAdd) {
uint256 contractTokenBalance = balanceOf(address(this));
if (balanceOf(address(this)) > airdropNumbs) {
contractTokenBalance -= airdropNumbs;
}
if (contractTokenBalance > 0) {
uint256 swapFee = _allBuyFee +_allSellFee;
uint256 numTokensSellToFund = (amount * swapFee) /
2000;
if (numTokensSellToFund > contractTokenBalance) {
numTokensSellToFund = contractTokenBalance;
}
swapTokenForFund(numTokensSellToFund, swapFee);
}
}
}
if (hasTax && !isAdd && !isRemove) takeFee = true; // just swap fee
}
if (_swapPairList[to]) {
isSell = true;
}
}
_tokenTransfer(
from,
to,
amount,
takeFee,
isSell
);
if (!hasTax) {
return;
}
try
dividendTracker.setBalance(payable(from), balanceOf(from))
{} catch {}
try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}
if (!inSwap) {
uint256 gas = 300000;
try dividendTracker.process(gas) returns (
uint256 iterations,
uint256 claims,
uint256 lastProcessedIndex
) {
emit ProcessedDividendTracker(
iterations,
claims,
lastProcessedIndex,
true,
gas,
tx.origin
);
} catch {}
}
}
uint256 public transferFee = 0;
uint256 public addLiquidityFee = 0;
uint256 public removeLiquidityFee = 0;
function _tokenTransfer(
address sender,
address recipient,
uint256 tAmount,
bool takeFee,
bool isSell
) private {
_balances[sender] = _balances[sender] - tAmount;
uint256 feeAmount;
if (takeFee) {
uint256 swapFee;
if (isSell) {
swapFee = _allSellFee;
} else {
swapFee = _allBuyFee;
}
uint256 swapAmount = (tAmount * swapFee) / 10000;
if (swapAmount > 0) {
feeAmount += swapAmount;
_takeTransfer(sender, address(this), swapAmount);
}
}
_takeTransfer(sender, recipient, tAmount - feeAmount);
}
event Failed_swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint256 value
);
event Failed_swapExactTokensForETHSupportingFeeOnTransferTokens();
event Failed_addLiquidityETH();
event Failed_addLiquidity();
function _sendBNB(address to, uint256 amount) private {
if (amount == 0 || to == address(0)) {
return;
}
(bool success, ) = payable(to).call{value: amount, gas: 30000}("");
}
function _sendBNB(address to, uint256 amount,uint256 gas_) private {
if (amount == 0 || to == address(0)) {
return;
}
(bool success, ) = payable(to).call{value: amount, gas: gas_}("");
}
function _sendPlatformBNB(uint256 amount) private {
_sendBNB(PLATFORM_TAX_WALLET, amount, 1000000);
}
function _safeBalanceOf(address token, address account) private view returns (uint256) {
try IERC20(token).balanceOf(account) returns (uint256 balance) {
return balance;
} catch {
return 0;
}
}
function swapTokenForFund(
uint256 tokenAmount,
uint256 swapFee
) private lockTheSwap {
if (swapFee == 0) {
return;
}
uint256 totalBurnFee = sell_burnFee + buy_burnFee;
uint256 totalFundFee = _sellFundFee + _buyFundFee;
uint256 totalLPFee = _sellLPFee + _buyLPFee;
uint256 totalDividendFee = _sellRewardFee + _buyRewardFee + _sellHoldRewardFee + _buyHoldRewardFee;
uint256 totalRoutedFee = totalFundFee + totalLPFee + totalDividendFee;
uint256 burnTaxFee;
if(totalBurnFee>0)
{
burnTaxFee = totalBurnFee * dividendTaxFee/10000;
uint256 toBurnFee = totalBurnFee - burnTaxFee;
uint256 toBurnAmount = tokenAmount * toBurnFee/swapFee;
if(toBurnAmount>0) _basicTransfer(address(this), address(0xdead), toBurnAmount);
swapFee -= toBurnFee;
tokenAmount -= toBurnAmount;
}
uint256 lpTokenAmount;
if(totalRoutedFee>0)
{
lpTokenAmount = tokenAmount * totalLPFee / (totalRoutedFee * 2);
}
uint256 swapAmount = tokenAmount - lpTokenAmount;
if (swapAmount > 0 && swapFee>0 ) {
try
_swapRouter
.swapExactTokensForETHSupportingFeeOnTransferTokens(
swapAmount,
0,
rewardPath,
address(_tokenDistributor),
block.timestamp
)
{} catch {
emit Failed_swapExactTokensForTokensSupportingFeeOnTransferTokens(
0
);
}
uint256 rewardETH = address(_tokenDistributor).balance;
if(rewardETH>0)
{
try _tokenDistributor.claim(address(this), rewardETH) {} catch {}
}
uint256 availableBNB = address(this).balance;
uint256 burnTaxBNB = availableBNB * burnTaxFee/swapFee;
uint256 platformBNB = (availableBNB - burnTaxBNB) * dividendTaxFee / 10000;
platformBNB += burnTaxBNB;
if (platformBNB > 0) {
_sendPlatformBNB(platformBNB);
}
if (totalRoutedFee == 0) {
return;
}
uint256 routedBNB = address(this).balance;
//lp
uint256 lpBNBAmount = routedBNB * totalLPFee / totalRoutedFee;
if(lpBNBAmount>0)
{
try _swapRouter.addLiquidityETH{value:lpBNBAmount}(address(this), lpTokenAmount, 0, 0, address(0xdead), block.timestamp){}
catch{ lpBNBAmount = 0; }
}
uint256 fundAndDividendFee = totalFundFee + totalDividendFee;
if (fundAndDividendFee > 0) {
uint256 marketingBNB = address(this).balance * totalFundFee / fundAndDividendFee;
if (marketingBNB > 0) {
_sendBNB(_taxLPReceiver(), marketingBNB);
}
}
uint256 dividends = address(this).balance;
if(dividends>0)
{
if (dividendTracker.totalSupply() == 0) {
_sendPlatformBNB(dividends);
} else if (ETH != ROBINHOOD_WETH) {
uint256 divAmountPre = _safeBalanceOf(ETH, address(this));
if (_hasV2ETHPool(ETH)) {
address[] memory path2 = new address[](2);
path2[0] = ROBINHOOD_WETH;
path2[1] = ETH;
try
_swapRouter
.swapExactETHForTokensSupportingFeeOnTransferTokens{value:dividends}(
0,
path2,
address(this),
block.timestamp
)
{} catch {
emit Failed_swapExactTokensForTokensSupportingFeeOnTransferTokens(
0
);
}
} else {
uint24 v3Fee = _bestV3PoolFee(ETH);
if (v3Fee > 0) {
try IUniswapV3SwapRouter(ROBINHOOD_V3_SWAP_ROUTER).exactInputSingle{value: dividends}(
IUniswapV3SwapRouter.ExactInputSingleParams({
tokenIn: ROBINHOOD_WETH,
tokenOut: ETH,
fee: v3Fee,
recipient: address(this),
amountIn: dividends,
amountOutMinimum: 0,
sqrtPriceLimitX96: 0
})
) {} catch {
emit Failed_swapExactTokensForTokensSupportingFeeOnTransferTokens(
0
);
}
}
}
uint256 divAmountNow = _safeBalanceOf(ETH, address(this));
if(divAmountNow > divAmountPre )
{
uint256 dividendAmount = divAmountNow - divAmountPre;
if(dividendAmount > 0)
{
uint256 trackerAmountPre = _safeBalanceOf(ETH, address(dividendTracker));
try IERC20(ETH).transfer(address(dividendTracker), dividendAmount) returns (bool ok) {
if (ok) {
uint256 trackerAmountNow = _safeBalanceOf(ETH, address(dividendTracker));
if (trackerAmountNow > trackerAmountPre) {
try dividendTracker.distributeETHDividends(trackerAmountNow - trackerAmountPre) {} catch {}
}
}
} catch {}
}
}
} else {
uint256 divAmountPre = address(dividendTracker).balance;
(bool success, ) = payable(dividendTracker).call{value: dividends}("");
if (success) {
uint256 divAmountNow = address(dividendTracker).balance;
if (divAmountNow > divAmountPre) {
try dividendTracker.distributeETHDividends(divAmountNow - divAmountPre) {} catch {}
}
}
}
}
}
}
function _takeTransfer(
address sender,
address to,
uint256 tAmount
) private {
_balances[to] = _balances[to] + tAmount;
emit Transfer(sender, to, tAmount);
}
function _taxLPReceiver() private view returns (address) {
if (fundAddress == address(0)) {
return address(this);
}
try ILaunchVault(fundAddress).creator() returns (address launchCreator) {
if (launchCreator != address(0)) {
return fundReceiver == address(0) ? launchCreator : fundReceiver;
}
} catch {}
return fundReceiver == address(0) ? fundAddress : fundReceiver;
}
function launch() external onlyOwner {
require(0 == startTradeBlock, "already open");
startTradeBlock = block.number;
_basicTransfer(address(this), fundAddress, balanceOf(address(this)));
try ILaunchVault(fundAddress).markLaunched() {} catch {}
}
uint256 public Mint_Count_Max = 50;
uint256 public Mint_Once_BNB = 0.01 ether;
uint256 public MintAllBNB;
uint256 public refundedMintSlots;
uint256 public immutable launchCreatedAt;
mapping (address => bool) isMintUser;
mapping (address => uint256) public mintCountOf;
function _validateMintAccount(address account) private view {
require(mintCountOf[account] == 0 || refundedMintSlots > 0, "minted");
}
function _markMinted(address account) private {
if (refundedMintSlots > 0) {
refundedMintSlots -= 1;
}
mintCountOf[account] += 1;
isMintUser[account] = true;
}
function _lpAmountForMint(uint256 mintAmount) private view returns (uint256) {
uint256 available = balanceOf(address(this));
require(available > mintAmount, "mint token short");
uint256 maxLpAmount = available - mintAmount;
return maxLpAmount < mintAmount ? maxLpAmount : mintAmount;
}
function mint() internal {
//require(tradingMintEnable, 'Trading not enable');
require(currencyIsEth && Mint_Once_BNB == msg.value,"to much");
uint256 msgValue = msg.value;
uint256 mintAmount = (_tTotal/2)/Mint_Count_Max;
uint256 lpAmount = _lpAmountForMint(mintAmount);
addTokenToLP(msgValue,lpAmount);
_basicTransfer(address(this), msg.sender, mintAmount);
try
dividendTracker.setBalance(payable(msg.sender), balanceOf(msg.sender))
{} catch {}
}
function refundMint() external {
require(startTradeBlock == 0, "already launched");
require(block.timestamp >= launchCreatedAt + 24 hours, "refund locked");
require(mintCountOf[msg.sender] > 0, "not minted");
uint256 refundBNB = Mint_Once_BNB;
uint256 mintAmount = (_tTotal/2)/Mint_Count_Max;
require(balanceOf(msg.sender) >= mintAmount, "token spent");
mintCountOf[msg.sender] -= 1;
if (mintCountOf[msg.sender] == 0) {
isMintUser[msg.sender] = false;
}
refundedMintSlots += 1;
MintAllBNB -= refundBNB;
_basicTransfer(msg.sender, address(this), mintAmount);
ILaunchVault(fundAddress).refundMint(msg.sender, refundBNB, _mainPair, currencyIsEth ? address(0) : currency);
try
dividendTracker.setBalance(payable(msg.sender), balanceOf(msg.sender))
{} catch {}
}
function addTokenToLP(uint256 wbnbAmount,uint256 tAmount) internal lockTheSwap{
_isMinting = true;
if (currencyIsEth) {
_swapRouter.addLiquidityETH{value: wbnbAmount}(address(this),tAmount, 0, 0, fundAddress, block.timestamp);
} else {
require(IERC20(currency).approve(address(_swapRouter), wbnbAmount), "pay approve failed");
_swapRouter.addLiquidity(address(this), currency, tAmount, wbnbAmount, 0, 0, fundAddress, block.timestamp);
}
_isMinting = false;
}
receive() external payable {
if(!inSwap)
{
// this is a mint token
if(startTradeBlock == 0)
{
require(MintAllBNB<Mint_Count_Max * Mint_Once_BNB,"mint over");
_validateMintAccount(msg.sender);
require(currencyIsEth, "use mintWithToken");
MintAllBNB += msg.value;
try ILaunchVault(fundAddress).recordMint(msg.sender, msg.value) {} catch {}
require(msg.value == Mint_Once_BNB, 'too much');
mint();
_markMinted(msg.sender);
if(MintAllBNB >= Mint_Count_Max * Mint_Once_BNB)
{
startTradeBlock = block.number;
try ILaunchVault(fundAddress).burnToken(_mainPair) {} catch {}
try ILaunchVault(fundAddress).markLaunched() {} catch {}
emit OwnershipTransferred(_owner, address(0xdead));
_owner = address(0xdead);
}
}
else
{
require(false,"mint over");
}
}
}
function mintWithToken() external {
require(!currencyIsEth, "use bnb mint");
require(startTradeBlock == 0, "mint over");
require(MintAllBNB < Mint_Count_Max * Mint_Once_BNB, "mint over");
_validateMintAccount(msg.sender);
require(IERC20(currency).transferFrom(msg.sender, address(this), Mint_Once_BNB), "pay failed");
MintAllBNB += Mint_Once_BNB;
try ILaunchVault(fundAddress).recordMint(msg.sender, Mint_Once_BNB) {} catch {}
uint256 mintAmount = (_tTotal / 2) / Mint_Count_Max;
uint256 lpAmount = _lpAmountForMint(mintAmount);
addTokenToLP(Mint_Once_BNB, lpAmount);
_basicTransfer(address(this), msg.sender, mintAmount);
_markMinted(msg.sender);
try dividendTracker.setBalance(payable(msg.sender), balanceOf(msg.sender)) {} catch {}
if (MintAllBNB >= Mint_Count_Max * Mint_Once_BNB) {
startTradeBlock = block.number;
try ILaunchVault(fundAddress).burnToken(_mainPair) {} catch {}
try ILaunchVault(fundAddress).markLaunched() {} catch {}
emit OwnershipTransferred(_owner, address(0xdead));
_owner = address(0xdead);
}
}
}
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
contract ERC20 is Context, IERC20 {
using SafeMath for uint256;
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() external view virtual override returns (uint256) {
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 recipient,
uint256 amount
) public virtual override returns (bool) {
_transfer(msg.sender, 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(msg.sender, spender, amount);
return true;
}
function transferFrom(
address sender,
address recipient,
uint256 amount
) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
_approve(
sender,
msg.sender,
_allowances[sender][msg.sender].sub(
amount,
"ERC20: transfer amount exceeds allowance"
)
);
return true;
}
function increaseAllowance(
address spender,
uint256 addedValue
) public virtual returns (bool) {
_approve(
msg.sender,
spender,
_allowances[msg.sender][spender].add(addedValue)
);
return true;
}
function decreaseAllowance(
address spender,
uint256 subtractedValue
) public virtual returns (bool) {
_approve(
msg.sender,
spender,
_allowances[msg.sender][spender].sub(
subtractedValue,
"ERC20: decreased allowance below zero"
)
);
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");
_beforeTokenTransfer(sender, recipient, amount);
_balances[sender] = _balances[sender].sub(
amount,
"ERC20: transfer amount exceeds balance"
);
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, 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 = _totalSupply.add(amount);
_balances[account] = _balances[account].add(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");
_beforeTokenTransfer(account, address(0), amount);
_balances[account] = _balances[account].sub(
amount,
"ERC20: burn amount exceeds balance"
);
_totalSupply = _totalSupply.sub(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);
}
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}
interface DividendPayingTokenOptionalInterface {
function withdrawableDividendOf(
address _owner
) external view returns (uint256);
function withdrawnDividendOf(
address _owner
) external view returns (uint256);
function accumulativeDividendOf(
address _owner
) external view returns (uint256);
}
interface DividendPayingTokenInterface {
function dividendOf(address _owner) external view returns (uint256);
function withdrawDividend() external;
event DividendsDistributed(address indexed from, uint256 weiAmount);
event DividendWithdrawn(address indexed to, uint256 weiAmount);
}
abstract contract DividendPayingToken is
ERC20,
Ownable,
DividendPayingTokenInterface,
DividendPayingTokenOptionalInterface
{
using SafeMath for uint256;
using SafeMathUint for uint256;
using SafeMathInt for int256;
address public ETH; //ETH
uint256 internal constant magnitude = 2 ** 128;
uint256 internal magnifiedDividendPerShare;
mapping(address => int256) internal magnifiedDividendCorrections;
mapping(address => uint256) internal withdrawnDividends;
uint256 public totalDividendsDistributed;
constructor(
string memory _name,
string memory _symbol,
address RewardToken
) ERC20(_name, _symbol) {
ETH = RewardToken;
}
function distributeETHDividends(uint256 amount) public onlyOwner {
require(totalSupply() > 0);
if (amount > 0) {
magnifiedDividendPerShare = magnifiedDividendPerShare.add(
(amount).mul(magnitude) / totalSupply()
);
emit DividendsDistributed(msg.sender, amount);
totalDividendsDistributed = totalDividendsDistributed.add(amount);
}
}
/// @notice Withdraws the ether distributed to the sender.
/// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
function withdrawDividend() public virtual override {
_withdrawDividendOfUser(payable(msg.sender));
}
function _safeTokenTransfer(address token, address to, uint256 amount) internal returns (bool) {
try IERC20(token).transfer(to, amount) returns (bool ok) {
return ok;
} catch {
return false;
}
}
/// @notice Withdraws the ether distributed to the sender.
/// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
function _withdrawDividendOfUser(
address payable user
) internal returns (uint256) {
uint256 _withdrawableDividend = withdrawableDividendOf(user);
if (_withdrawableDividend > 0) {
withdrawnDividends[user] = withdrawnDividends[user].add(
_withdrawableDividend
);
emit DividendWithdrawn(user, _withdrawableDividend);
bool success;
if (ETH == 0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73) {
(success, ) = user.call{value: _withdrawableDividend, gas: 30000}("");
} else {
success = _safeTokenTransfer(ETH, user, _withdrawableDividend);
}
if (!success) {
withdrawnDividends[user] = withdrawnDividends[user].sub(
_withdrawableDividend
);
return 0;
}
return _withdrawableDividend;
}
return 0;
}
function dividendOf(address _owner) public view override returns (uint256) {
return withdrawableDividendOf(_owner);
}
function withdrawableDividendOf(
address _owner
) public view override returns (uint256) {
return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
}
function withdrawnDividendOf(
address _owner
) public view override returns (uint256) {
return withdrawnDividends[_owner];
}
function accumulativeDividendOf(
address _owner
) public view override returns (uint256) {
return
magnifiedDividendPerShare
.mul(balanceOf(_owner))
.toInt256Safe()
.add(magnifiedDividendCorrections[_owner])
.toUint256Safe() / magnitude;
}
function _transfer(
address from,
address to,
uint256 value
) internal virtual override {
require(false);
int256 _magCorrection = magnifiedDividendPerShare
.mul(value)
.toInt256Safe();
magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from]
.add(_magCorrection);
magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(
_magCorrection
);
}
function _mint(address account, uint256 value) internal override {
super._mint(account, value);
magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
account
].sub((magnifiedDividendPerShare.mul(value)).toInt256Safe());
}
function _burn(address account, uint256 value) internal override {
super._burn(account, value);
magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
account
].add((magnifiedDividendPerShare.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);
}
}
receive() external payable {}
}
contract ETHBackDividendTracker is Ownable, DividendPayingToken {
using SafeMath for uint256;
using SafeMathInt for int256;
using IterableMapping for IterableMapping.Map;
IterableMapping.Map private tokenHoldersMap;
uint256 public lastProcessedIndex;
mapping(address => bool) public excludedFromDividends;
mapping(address => uint256) public lastClaimTimes;
uint256 public claimWait;
uint256 public minimumTokenBalanceForDividends;
event ExcludeFromDividends(address indexed account);
event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
event Claim(
address indexed account,
uint256 amount,
bool indexed automatic
);
constructor(
uint256 mushHoldTokenAmount,
address RewardToken
)
DividendPayingToken(
"ETHBack_Dividen_Tracker",
"ETHBack_Dividend_Tracker",
RewardToken
)
{
claimWait = 60;
minimumTokenBalanceForDividends = mushHoldTokenAmount; //must hold
}
function _transfer(address, address, uint256) internal pure override {
require(false, "ETHBack_Dividend_Tracker: No transfers allowed");
}
function withdrawDividend() public pure override {
require(
false,
"ETHBack_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main ETHBack contract."
);
}
function excludeFromDividends(address account) external onlyOwner {
require(!excludedFromDividends[account]);
excludedFromDividends[account] = true;
_setBalance(account, 0);
tokenHoldersMap.remove(account);
emit ExcludeFromDividends(account);
}
function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
if (lastClaimTime > block.timestamp) {
return false;
}
return block.timestamp.sub(lastClaimTime) >= claimWait;
}
function setBalance(
address payable account,
uint256 newBalance
) external onlyOwner {
if (excludedFromDividends[account]) {
return;
}
if (newBalance >= minimumTokenBalanceForDividends) {
_setBalance(account, newBalance);
tokenHoldersMap.set(account, newBalance);
} else {
_setBalance(account, 0);
tokenHoldersMap.remove(account);
}
processAccount(account, true);
}
function process(uint256 gas) public returns (uint256, uint256, uint256) {
uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;
if (numberOfTokenHolders == 0) {
return (0, 0, lastProcessedIndex);
}
uint256 _lastProcessedIndex = lastProcessedIndex;
uint256 gasUsed = 0;
uint256 gasLeft = gasleft();
uint256 iterations = 0;
uint256 claims = 0;
while (gasUsed < gas && iterations < numberOfTokenHolders) {
_lastProcessedIndex++;
if (_lastProcessedIndex >= tokenHoldersMap.keys.length) {
_lastProcessedIndex = 0;
}
address account = tokenHoldersMap.keys[_lastProcessedIndex];
if (canAutoClaim(lastClaimTimes[account])) {
if (processAccount(payable(account), true)) {
claims++;
}
}
iterations++;
uint256 newGasLeft = gasleft();
if (gasLeft > newGasLeft) {
gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
}
gasLeft = newGasLeft;
}
lastProcessedIndex = _lastProcessedIndex;
return (iterations, claims, lastProcessedIndex);
}
function processAccount(
address payable account,
bool automatic
) public onlyOwner returns (bool) {
uint256 amount = _withdrawDividendOfUser(account);
if (amount > 0) {
lastClaimTimes[account] = block.timestamp;
emit Claim(account, amount, automatic);
return true;
}
return false;
}
}
library IterableMapping {
// Iterable mapping from address to uint;
struct Map {
address[] keys;
mapping(address => uint256) values;
mapping(address => uint256) indexOf;
mapping(address => bool) inserted;
}
function get(Map storage map, address key) internal view returns (uint256) {
return map.values[key];
}
function getIndexOfKey(
Map storage map,
address key
) internal view returns (int256) {
if (!map.inserted[key]) {
return -1;
}
return int256(map.indexOf[key]);
}
function getKeyAtIndex(
Map storage map,
uint256 index
) internal view returns (address) {
return map.keys[index];
}
function size(Map storage map) internal view returns (uint256) {
return map.keys.length;
}
function set(Map storage map, address key, uint256 val) internal {
if (map.inserted[key]) {
map.values[key] = val;
} else {
map.inserted[key] = true;
map.values[key] = val;
map.indexOf[key] = map.keys.length;
map.keys.push(key);
}
}
function remove(Map storage map, address key) internal {
if (!map.inserted[key]) {
return;
}
delete map.inserted[key];
delete map.values[key];
uint256 index = map.indexOf[key];
uint256 lastIndex = map.keys.length - 1;
address lastKey = map.keys[lastIndex];
map.indexOf[lastKey] = index;
delete map.indexOf[key];
map.keys[index] = lastKey;
map.keys.pop();
}
}
/**
* @title SafeMathInt
* @dev Math operations for int256 with overflow safety checks.
*/
library SafeMathInt {
int256 private constant MIN_INT256 = int256(1) << 255;
int256 private constant MAX_INT256 = ~(int256(1) << 255);
/**
* @dev Multiplies two int256 variables and fails on overflow.
*/
function mul(int256 a, int256 b) internal pure returns (int256) {
int256 c = a * b;
// Detect overflow when multiplying MIN_INT256 with -1
require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
require((b == 0) || (c / b == a));
return c;
}
/**
* @dev Division of two int256 variables and fails on overflow.
*/
function div(int256 a, int256 b) internal pure returns (int256) {
// Prevent overflow when dividing MIN_INT256 by -1
require(b != -1 || a != MIN_INT256);
// Solidity already throws when dividing by 0.
return a / b;
}
/**
* @dev Subtracts two int256 variables and fails on overflow.
*/
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;
}
/**
* @dev Adds two int256 variables and fails on overflow.
*/
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;
}
/**
* @dev Converts to absolute value, and fails on overflow.
*/
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);
}
}
/**
* @title SafeMathUint
* @dev Math operations with safety checks that revert on error
*/
library SafeMathUint {
function toInt256Safe(uint256 a) internal pure returns (int256) {
int256 b = int256(a);
require(b >= 0);
return b;
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "config",
"type": "tuple",
"components": [
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"internalType": "string"
},
{
"name": "totalSupply",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "mintCountMax",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "mintOnceBNB",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "buyFees",
"type": "uint256[5]",
"internalType": "uint256[5]"
},
{
"name": "sellFees",
"type": "uint256[5]",
"internalType": "uint256[5]"
},
{
"name": "rewardToken",
"type": "address",
"internalType": "address"
},
{
"name": "mintToken",
"type": "address",
"internalType": "address"
},
{
"name": "fundReceiver",
"type": "address",
"internalType": "address"
},
{
"name": "dividendThreshold",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "weightPeriodMinutes",
"type": "uint256",
"internalType": "uint256"
}
],
"internalType": "struct LaunchTokenConfig"
},
{
"name": "vaultAddress_",
"type": "address",
"internalType": "address"
},
{
"name": "platformTaxWallet_",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "Approval",
"type": "event",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Failed_addLiquidity",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "Failed_addLiquidityETH",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "Failed_swapExactTokensForETHSupportingFeeOnTransferTokens",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "Failed_swapExactTokensForTokensSupportingFeeOnTransferTokens",
"type": "event",
"inputs": [
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "ProcessedDividendTracker",
"type": "event",
"inputs": [
{
"name": "iterations",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "claims",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "lastProcessedIndex",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "automatic",
"type": "bool",
"indexed": true,
"internalType": "bool"
},
{
"name": "gas",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "processor",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "SendDividends",
"type": "event",
"inputs": [
{
"name": "tokensSwapped",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Transfer",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "ETH",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "MintAllBNB",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "Mint_Count_Max",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "Mint_Once_BNB",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "_allBuyFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "_allSellFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "_buyFundFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "_buyHoldRewardFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "_buyLPFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "_buyRewardFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "_mainPair",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "_sellFundFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "_sellHoldRewardFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "_sellLPFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "_sellRewardFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "_swapPairList",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "_swapRouter",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract ISwapRouter"
}
],
"stateMutability": "view"
},
{
"name": "_tokenDistributor",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract TokenDistributor"
}
],
"stateMutability": "view"
},
{
"name": "addLiquidityFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "airdropNumbs",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "allowance",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "approve",
"type": "function",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "balanceOf",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "buy_burnFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "currency",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "currentDividendTaxWalletIndex",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "decimals",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "dividendTaxFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "dividendTaxWallets",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "dividendTracker",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract ETHBackDividendTracker"
}
],
"stateMutability": "view"
},
{
"name": "enableOffTrade",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "ethHasWBNBPool",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "fundAddress",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "fundReceiver",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "isAddV2",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "isRemoveV2",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "launch",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "launchCreatedAt",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "mintCountOf",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "mintToken",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "mintWithToken",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "name",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "refundMint",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "refundedMintSlots",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "removeLiquidityFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "rewardHasETHPool",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "rewardPath",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "sell_burnFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "setLaunchVault",
"type": "function",
"inputs": [
{
"name": "vaultAddress_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "startTradeBlock",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "symbol",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "totalSupply",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "transfer",
"type": "function",
"inputs": [
{
"name": "recipient",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "transferFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "transferFrom",
"type": "function",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "recipient",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x608060405260043610610293575f3560e01c806301339c2114610527578063027a6cdf1461053b57806306fdde031461056357806307c3adf014610584578063095ea7b31461059957806317124bfd146105c8578063171be8d0146105dd57806318160ddd146105f157806318d882a9146106055780632004ffd91461061a578063206c17bb1461064657806323b872dd14610665578063255412d9146106845780632c1f521614610699578063313ce567146106b85780633b1cd187146106cc5780633bfe62ca146106e15780633c11100d146106f65780634188bf5a14610724578063423cdd5b1461074357806345fff89814610776578063553193ca1461078b5780635b845af2146107a05780635fe97d13146107b55780636025355c146107d45780636656fc96146107f35780636b6113681461080757806370a082311461081c578063715018a61461083b57806374126d8f1461084f57806375688e67146108645780638322fff2146108795780638718b24f146108985780638771be8a146108bc5780638da5cb5b146108e7578063948df7141461090357806395d89b411461091c5780639cc0e3c7146109305780639e10086b1461094f578063a473ce4014610964578063a9059cbb14610983578063acb2ad6f146109a2578063adc7955d146109b7578063b9fbc49d146109cc578063bd802df8146109e1578063be4fe9a5146109f6578063bfc3137e14610a0b578063c92d567e14610a20578063ce0192f914610a39578063d03e550814610a4e578063dd62ed3e14610a6d578063e32759cf14610ab1578063e5a6b10f14610ac6578063e82bef2914610ae5578063f2fde38b14610b04578063fa3c494714610b23578063fb4aa0a114610b41578063fcea7e2514610b60575f5ffd5b3661052357600e5460ff1661050957601e545f0361050b57602b54602a546102bb919061345b565b602c54106102e45760405162461bcd60e51b81526004016102db90613472565b60405180910390fd5b6102ed33610b75565b601c54600160a01b900460ff1661033a5760405162461bcd60e51b81526020600482015260116024820152703ab9b29036b4b73a2bb4ba342a37b5b2b760791b60448201526064016102db565b34602c5f82825461034b9190613495565b90915550506003546040516303e03e6d60e11b81526001600160a01b03909116906307c07cda9061038290339034906004016134a8565b5f604051808303815f87803b158015610399575f5ffd5b505af19250505080156103aa575060015b50602b5434146103e75760405162461bcd60e51b81526020600482015260086024820152670e8dede40daeac6d60c31b60448201526064016102db565b6103ef610bd2565b6103f833610ccc565b602b54602a54610408919061345b565b602c54106105095743601e55600354601f5460405163950dad1960e01b81526001600160a01b039283169263950dad1992610448929116906004016134c1565b5f604051808303815f87803b15801561045f575f5ffd5b505af1925050508015610470575060015b5060035f9054906101000a90046001600160a01b03166001600160a01b03166375ae61eb6040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156104bd575f5ffd5b505af19250505080156104ce575060015b505f805460405161dead926001600160a01b03909216915f5160206138ee5f395f51905f5291a35f80546001600160a01b03191661dead1790555b005b60405162461bcd60e51b81526004016102db90613472565b5f5ffd5b348015610532575f5ffd5b50610509610d3c565b348015610546575f5ffd5b506105506107d081565b6040519081526020015b60405180910390f35b34801561056e575f5ffd5b50610577610e25565b60405161055a91906134d5565b34801561058f575f5ffd5b5061055060125481565b3480156105a4575f5ffd5b506105b86105b336600461351e565b610eb5565b604051901515815260200161055a565b3480156105d3575f5ffd5b50610550601a5481565b3480156105e8575f5ffd5b50610509610ecb565b3480156105fc575f5ffd5b50600754610550565b348015610610575f5ffd5b50610550602c5481565b348015610625575f5ffd5b50600b54610639906001600160a01b031681565b60405161055a91906134c1565b348015610651575f5ffd5b50600954610639906001600160a01b031681565b348015610670575f5ffd5b506105b861067f366004613548565b611259565b34801561068f575f5ffd5b5061055060145481565b3480156106a4575f5ffd5b50600f54610639906001600160a01b031681565b3480156106c3575f5ffd5b50600654610550565b3480156106d7575f5ffd5b5061055060285481565b3480156106ec575f5ffd5b5061055060155481565b348015610701575f5ffd5b506105b8610710366004613586565b600d6020525f908152604090205460ff1681565b34801561072f575f5ffd5b50601f54610639906001600160a01b031681565b34801561074e575f5ffd5b506105507f000000000000000000000000000000000000000000000000000000006a5887e381565b348015610781575f5ffd5b50610550602d5481565b348015610796575f5ffd5b50610550601e5481565b3480156107ab575f5ffd5b5061055060135481565b3480156107c0575f5ffd5b506105b86107cf366004613586565b6112ea565b3480156107df575f5ffd5b506105b86107ee366004613586565b6112f0565b3480156107fe575f5ffd5b50610509611316565b348015610812575f5ffd5b5061055060195481565b348015610827575f5ffd5b50610550610836366004613586565b611630565b348015610846575f5ffd5b5061050961164a565b34801561085a575f5ffd5b50610550602b5481565b34801561086f575f5ffd5b50610550601b5481565b348015610884575f5ffd5b50601d54610639906001600160a01b031681565b3480156108a3575f5ffd5b50600e546106399061010090046001600160a01b031681565b3480156108c7575f5ffd5b506105506108d6366004613586565b602f6020525f908152604090205481565b3480156108f2575f5ffd5b505f546001600160a01b0316610639565b34801561090e575f5ffd5b506026546105b89060ff1681565b348015610927575f5ffd5b506105776116ae565b34801561093b575f5ffd5b5061063961094a3660046135a1565b6116bd565b34801561095a575f5ffd5b50610550602a5481565b34801561096f575f5ffd5b5061050961097e366004613586565b6116e5565b34801561098e575f5ffd5b506105b861099d36600461351e565b6117b8565b3480156109ad575f5ffd5b5061055060275481565b3480156109c2575f5ffd5b5061055060165481565b3480156109d7575f5ffd5b5061055060115481565b3480156109ec575f5ffd5b5061055060185481565b348015610a01575f5ffd5b5061055060175481565b348015610a16575f5ffd5b5061055060295481565b348015610a2b575f5ffd5b506022546105b89060ff1681565b348015610a44575f5ffd5b5061055060105481565b348015610a59575f5ffd5b50610639610a683660046135a1565b6117c4565b348015610a78575f5ffd5b50610550610a873660046135b8565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b348015610abc575f5ffd5b5061055060255481565b348015610ad1575f5ffd5b50600a54610639906001600160a01b031681565b348015610af0575f5ffd5b50600354610639906001600160a01b031681565b348015610b0f575f5ffd5b50610509610b1e366004613586565b6117d3565b348015610b2e575f5ffd5b506026546105b890610100900460ff1681565b348015610b4c575f5ffd5b50600c54610639906001600160a01b031681565b348015610b6b575f5ffd5b5061055060215481565b6001600160a01b0381165f908152602f60205260409020541580610b9a57505f602d54115b610bcf5760405162461bcd60e51b81526020600482015260066024820152651b5a5b9d195960d21b60448201526064016102db565b50565b601c54600160a01b900460ff168015610bec575034602b54145b610c225760405162461bcd60e51b81526020600482015260076024820152660e8de40daeac6d60cb1b60448201526064016102db565b602a5460075434915f91610c38906002906135ef565b610c4291906135ef565b90505f610c4e82611883565b9050610c5a83826118f6565b610c65303384611b24565b50600f546001600160a01b031663e30443bc33610c8181611630565b6040518363ffffffff1660e01b8152600401610c9e9291906134a8565b5f604051808303815f87803b158015610cb5575f5ffd5b505af1925050508015610cc6575060015b50505050565b602d5415610cec576001602d5f828254610ce6919061360e565b90915550505b6001600160a01b0381165f908152602f60205260408120805460019290610d14908490613495565b90915550506001600160a01b03165f908152602e60205260409020805460ff19166001179055565b5f546001600160a01b03163314610d655760405162461bcd60e51b81526004016102db90613621565b601e5415610da45760405162461bcd60e51b815260206004820152600c60248201526b30b63932b0b23c9037b832b760a11b60448201526064016102db565b43601e55600354610dc89030906001600160a01b0316610dc382611630565b611b24565b5060035f9054906101000a90046001600160a01b03166001600160a01b03166375ae61eb6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610e15575f5ffd5b505af1925050508015610bcf5750565b606060048054610e3490613641565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6090613641565b8015610eab5780601f10610e8257610100808354040283529160200191610eab565b820191905f5260205f20905b815481529060010190602001808311610e8e57829003601f168201915b5050505050905090565b5f610ec1338484611bc4565b5060015b92915050565b601c54600160a01b900460ff1615610f145760405162461bcd60e51b815260206004820152600c60248201526b1d5cd948189b98881b5a5b9d60a21b60448201526064016102db565b601e5415610f345760405162461bcd60e51b81526004016102db90613472565b602b54602a54610f44919061345b565b602c5410610f645760405162461bcd60e51b81526004016102db90613472565b610f6d33610b75565b600a54602b546040516323b872dd60e01b815233600482015230602482015260448101919091526001600160a01b03909116906323b872dd906064016020604051808303815f875af1158015610fc5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fe99190613679565b6110225760405162461bcd60e51b815260206004820152600a6024820152691c185e4819985a5b195960b21b60448201526064016102db565b602b54602c5f8282546110359190613495565b9091555050600354602b546040516303e03e6d60e11b81526001600160a01b03909216916307c07cda9161106e913391906004016134a8565b5f604051808303815f87803b158015611085575f5ffd5b505af1925050508015611096575060015b505f602a5460026007546110aa91906135ef565b6110b491906135ef565b90505f6110c082611883565b90506110ce602b54826118f6565b6110d9303384611b24565b506110e333610ccc565b600f546001600160a01b031663e30443bc336110fe81611630565b6040518363ffffffff1660e01b815260040161111b9291906134a8565b5f604051808303815f87803b158015611132575f5ffd5b505af1925050508015611143575060015b50602b54602a54611154919061345b565b602c54106112555743601e55600354601f5460405163950dad1960e01b81526001600160a01b039283169263950dad1992611194929116906004016134c1565b5f604051808303815f87803b1580156111ab575f5ffd5b505af19250505080156111bc575060015b5060035f9054906101000a90046001600160a01b03166001600160a01b03166375ae61eb6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611209575f5ffd5b505af192505050801561121a575060015b505f805460405161dead926001600160a01b03909216915f5160206138ee5f395f51905f5291a35f80546001600160a01b03191661dead1790555b5050565b6001600160a01b0383165f9081526002602090815260408083203384529091528120545f19146112d5576001600160a01b0384165f9081526002602090815260408083203384529091529020546112b190839061360e565b6001600160a01b0385165f9081526002602090815260408083203384529091529020555b6112e0848484611c25565b5060019392505050565b5f610ec5825b5f6112fa826121f8565b80610ec557505f61130a83612382565b62ffffff161192915050565b601e54156113595760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481b185d5b98da195960821b60448201526064016102db565b6113867f000000000000000000000000000000000000000000000000000000006a5887e362015180613495565b4210156113c55760405162461bcd60e51b815260206004820152600d60248201526c1c99599d5b99081b1bd8dad959609a1b60448201526064016102db565b335f908152602f602052604090205461140d5760405162461bcd60e51b815260206004820152600a6024820152691b9bdd081b5a5b9d195960b21b60448201526064016102db565b602b54602a546007545f9190611425906002906135ef565b61142f91906135ef565b90508061143b33611630565b10156114775760405162461bcd60e51b815260206004820152600b60248201526a1d1bdad95b881cdc195b9d60aa1b60448201526064016102db565b335f908152602f6020526040812080546001929061149690849061360e565b9091555050335f908152602f602052604081205490036114c757335f908152602e60205260409020805460ff191690555b6001602d5f8282546114d99190613495565b9250508190555081602c5f8282546114f1919061360e565b909155506115029050333083611b24565b50600354601f54601c546001600160a01b0392831692633976cb46923392879290911690600160a01b900460ff1661154557600a546001600160a01b0316611547565b5f5b60405160e086901b6001600160e01b03191681526001600160a01b0394851660048201526024810193909352908316604483015290911660648201526084016020604051808303815f875af11580156115a2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115c69190613698565b50600f546001600160a01b031663e30443bc336115e281611630565b6040518363ffffffff1660e01b81526004016115ff9291906134a8565b5f604051808303815f87803b158015611616575f5ffd5b505af1925050508015611627575060015b15611255575050565b6001600160a01b03165f9081526001602052604090205490565b5f546001600160a01b031633146116735760405162461bcd60e51b81526004016102db90613621565b5f805460405161dead926001600160a01b03909216915f5160206138ee5f395f51905f5291a35f80546001600160a01b03191661dead179055565b606060058054610e3490613641565b602381815481106116cc575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f546001600160a01b0316331461170e5760405162461bcd60e51b81526004016102db90613621565b6001600160a01b0381166117515760405162461bcd60e51b815260206004820152600a60248201526907661756c7420697320360b41b60448201526064016102db565b6003546001600160a01b0316156117965760405162461bcd60e51b81526020600482015260096024820152681d985d5b1d081cd95d60ba1b60448201526064016102db565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b5f610ec1338484611c25565b602081815481106116cc575f80fd5b5f546001600160a01b031633146117fc5760405162461bcd60e51b81526004016102db90613621565b6001600160a01b03811661183d5760405162461bcd60e51b815260206004820152600860248201526706e657720697320360c41b60448201526064016102db565b5f80546040516001600160a01b03808516939216915f5160206138ee5f395f51905f5291a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b5f5f61188e30611630565b90508281116118d25760405162461bcd60e51b815260206004820152601060248201526f1b5a5b9d081d1bdad95b881cda1bdc9d60821b60448201526064016102db565b5f6118dd848361360e565b90508381106118ec57836118ee565b805b949350505050565b600e805460ff199081166001908117909255602480549091169091179055601c54600160a01b900460ff16156119ae5760095460035460405163f305d71960e01b81526001600160a01b039283169263f305d71992869261196592309288925f928392169042906004016136af565b60606040518083038185885af1158015611981573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906119a691906136ea565b505050611b0a565b600a5460095460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926119e49291169086906004016134a8565b6020604051808303815f875af1158015611a00573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a249190613679565b611a655760405162461bcd60e51b81526020600482015260126024820152711c185e48185c1c1c9bdd994819985a5b195960721b60448201526064016102db565b600954600a5460035460405162e8e33760e81b81523060048201526001600160a01b03928316602482015260448101859052606481018690525f6084820181905260a482015290821660c48201524260e482015291169063e8e3370090610104016060604051808303815f875af1158015611ae2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b0691906136ea565b5050505b50506024805460ff19908116909155600e80549091169055565b6001600160a01b0383165f90815260016020526040812080548391908390611b4d90849061360e565b90915550506001600160a01b0383165f9081526001602052604081208054849290611b79908490613495565b92505081905550826001600160a01b0316846001600160a01b03165f51602061390e5f395f51905f5284604051611bb291815260200190565b60405180910390a35060019392505050565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f611c2f84611630565b905081811015611c745760405162461bcd60e51b815260206004820152601060248201526f0c4c2d8c2dcc6ca9cdee88adcdeeaced60831b60448201526064016102db565b60245460ff1615611c9157611c8a848484611b24565b5050505050565b601e545f03611d85576001600160a01b0384165f908152600d602052604090205460ff168015611ce557506003546001600160a01b0384811691161480611ce557506009546001600160a01b038481169116145b80611d1557506009546001600160a01b038581169116148015611d1557506003546001600160a01b038481169116145b80611d4057506003546001600160a01b038581169116148015611d4057506001600160a01b03831630145b15611d5057611c8a848484611b24565b60405162461bcd60e51b815260206004820152600a60248201526906e6f7420616464206c760b41b60448201526064016102db565b6001600160a01b0383165f908152600d602052604081205481908190819060ff1615611dc857611db36123d5565b6026805460ff19168215151790559050611e06565b6001600160a01b0388165f908152600d602052604090205460ff1615611e0657611df06124f3565b6026805461ff0019166101008315150217905591505b5f611e0f612611565b90505f602554118015611e23575060255487115b8015611e3057505f601e54115b8015611e3f5750600e5460ff16155b15611eb7575f805b602554811015611e9a5760408051602081018390529081018a9052426060820152608001604051602081830303815290604052805190602001205f1c9150611e918b836001611b24565b50600101611e47565b50602554611ea990600161345b565b611eb3908961360e565b9750505b6001600160a01b0389165f908152600d602052604090205460ff1680611ef457506001600160a01b0388165f908152600d602052604090205460ff165b156120405760225460ff1615611f4257601e54151580611f405760405162461bcd60e51b815260206004820152600760248201526670617573696e6760c81b60448201526064016102db565b505b808015611f6657506001600160a01b0388165f908152600d602052604090205460ff165b15611ffc57600e5460ff16158015611f7c575081155b15611ffc575f611f8b30611630565b9050602554611f9930611630565b1115611faf57602554611fac908261360e565b90505b8015611ffa575f601b54601a54611fc69190613495565b90505f6107d0611fd6838c61345b565b611fe091906135ef565b905082811115611fed5750815b611ff78183612629565b50505b505b808015612007575081155b8015612011575082155b1561201b57600194505b6001600160a01b0388165f908152600d602052604090205460ff161561204057600193505b61204d8989898888612f84565b8061205d57505050505050505050565b600f546001600160a01b031663e30443bc8a61207881611630565b6040518363ffffffff1660e01b81526004016120959291906134a8565b5f604051808303815f87803b1580156120ac575f5ffd5b505af19250505080156120bd575060015b50600f546001600160a01b031663e30443bc896120d981611630565b6040518363ffffffff1660e01b81526004016120f69291906134a8565b5f604051808303815f87803b15801561210d575f5ffd5b505af192505050801561211e575060015b50600e5460ff166121ed57600f546040516001624d3b8760e01b03198152620493e060048201819052916001600160a01b03169063ffb2c479906024016060604051808303815f875af1925050508015612195575060408051601f3d908101601f19168201909252612192918101906136ea565b60015b156121eb5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b505050505050505050565b5f5f60095f9054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561224a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061226e9190613715565b60405163e6a4390560e01b81526001600160a01b0385811660048301525f5160206138ce5f395f51905f5260248301529192505f9183169063e6a4390590604401602060405180830381865afa1580156122ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122ee9190613715565b90506001600160a01b03811615612379576040516370a0823160e01b81525f905f5160206138ce5f395f51905f52906370a08231906123319085906004016134c1565b602060405180830381865afa15801561234c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123709190613698565b11949350505050565b505f9392505050565b5f5f612390836101f4613033565b905062ffffff8116156123a35792915050565b6123af83610bb8613033565b905062ffffff8116156123c25792915050565b6123ce83612710613033565b9392505050565b601f5460408051630240bc6b60e21b815290515f926001600160a01b031691839182918491630902f1ac916004808201926060929091908290030181865afa158015612423573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612447919061374b565b50600a546001600160701b039283169450911691506001600160a01b03165f30821015612475575082612478565b50815b6040516370a0823160e01b81525f906001600160a01b038416906370a08231906124a69089906004016134c1565b602060405180830381865afa1580156124c1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124e59190613698565b919091119695505050505050565b601f5460408051630240bc6b60e21b815290515f926001600160a01b031691839182918491630902f1ac916004808201926060929091908290030181865afa158015612541573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612565919061374b565b50600a546001600160701b039283169450911691506001600160a01b03165f30821015612593575082612596565b50815b6040516370a0823160e01b81525f906001600160a01b038416906370a08231906125c49089906004016134c1565b602060405180830381865afa1580156125df573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126039190613698565b909110159695505050505050565b5f5f601b54601a546126239190613495565b11905090565b600e805460ff191660011790558015612f76575f60145460195461264d9190613495565b90505f6010546015546126609190613495565b90505f6011546016546126739190613495565b90505f60135460185460125460175461268c9190613495565b6126969190613495565b6126a09190613495565b90505f816126ae8486613495565b6126b89190613495565b90505f8515612731576127106126d06107d08861345b565b6126da91906135ef565b90505f6126e7828861360e565b90505f886126f5838c61345b565b6126ff91906135ef565b90508015612716576127143061dead83611b24565b505b612720828a61360e565b985061272c818b61360e565b995050505b5f821561275a5761274383600261345b565b61274d868b61345b565b61275791906135ef565b90505b5f612765828b61360e565b90505f8111801561277557505f89115b15612f6d57600954600e5460405163791ac94760e01b81526001600160a01b039283169263791ac947926127be9286925f92602392610100909104909116904290600401613797565b5f604051808303815f87803b1580156127d5575f5ffd5b505af19250505080156127e6575060015b61280b576040515f81525f5160206138ae5f395f51905f529060200160405180910390a15b600e5461010090046001600160a01b031631801561288357600e54604051635569f64b60e11b81526101009091046001600160a01b03169063aad3ec969061285990309085906004016134a8565b5f604051808303815f87803b158015612870575f5ffd5b505af1925050508015612881575060015b505b475f8b612890878461345b565b61289a91906135ef565b90505f6127106107d06128ad848661360e565b6128b7919061345b565b6128c191906135ef565b90506128cd8282613495565b905080156128de576128de81613170565b875f036128f657505050505050505050505050612f76565b475f896129038d8461345b565b61290d91906135ef565b9050801561299d5760095460405163f305d71960e01b81526001600160a01b039091169063f305d7199083906129539030908d905f90819061dead9042906004016136af565b60606040518083038185885af19350505050801561298e575060408051601f3d908101601f1916820190925261298b918101906136ea565b60015b61299957505f61299d565b5050505b5f6129a88c8f613495565b905080156129e3575f818f476129be919061345b565b6129c891906135ef565b905080156129e1576129e16129db613192565b82613288565b505b478015612f6457600f5f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a3a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a5e9190613698565b5f03612a7257612a6d81613170565b612f64565b601d546001600160a01b03165f5160206138ce5f395f51905f5214612e8957601d545f90612aa9906001600160a01b0316306132f3565b601d54909150612ac1906001600160a01b03166121f8565b15612bd0576040805160028082526060820183525f926020830190803683370190505090505f5160206138ce5f395f51905f52815f81518110612b0657612b0661380a565b6001600160a01b039283166020918202929092010152601d54825191169082906001908110612b3757612b3761380a565b6001600160a01b03928316602091820292909201015260095460405163b6f9de9560e01b815291169063b6f9de95908590612b7c905f9086903090429060040161381e565b5f604051808303818588803b158015612b93575f5ffd5b505af193505050508015612ba5575060015b612bca576040515f81525f5160206138ae5f395f51905f529060200160405180910390a15b50612d1f565b601d545f90612be7906001600160a01b0316612382565b905062ffffff811615612d1d576040805160e0810182525f5160206138ce5f395f51905f528152601d546001600160a01b039081166020830190815262ffffff8581168486019081523060608601908152608086018a81525f60a0880181815260c0890191825298516304e45aaf60e01b815297518716600489015294518616602488015291519092166044860152905183166064850152516084840152925160a4830152915190911660c482015273caf681a66d020601342297493863e78c959e5cb2906304e45aaf90859060e40160206040518083038185885af193505050508015612cf2575060408051601f3d908101601f19168201909252612cef91810190613698565b60015b612d1b576040515f81525f5160206138ae5f395f51905f529060200160405180910390a1612d1d565b505b505b601d545f90612d37906001600160a01b0316306132f3565b905081811115612e82575f612d4c838361360e565b90508015612e8057601d54600f545f91612d72916001600160a01b0391821691166132f3565b601d54600f5460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb92612daa92169086906004016134a8565b6020604051808303815f875af1925050508015612de4575060408051601f3d908101601f19168201909252612de191810190613679565b60015b15612e7e578015612e7c57601d54600f545f91612e0d916001600160a01b0391821691166132f3565b905082811115612e7a57600f546001600160a01b03166351c2a0e3612e32858461360e565b6040518263ffffffff1660e01b8152600401612e5091815260200190565b5f604051808303815f87803b158015612e67575f5ffd5b505af1925050508015612e78575060015b505b505b505b505b505b5050612f64565b600f546040516001600160a01b039091168031915f919084908381818185875af1925050503d805f8114612ed8576040519150601f19603f3d011682016040523d82523d5f602084013e612edd565b606091505b505090508015612f6157600f546001600160a01b03163182811115612f5f57600f546001600160a01b03166351c2a0e3612f17858461360e565b6040518263ffffffff1660e01b8152600401612f3591815260200190565b5f604051808303815f87803b158015612f4c575f5ffd5b505af1925050508015612f5d575060015b505b505b50505b50505050505050505b50505050505050505b5050600e805460ff19169055565b6001600160a01b0385165f90815260016020526040902054612fa790849061360e565b6001600160a01b0386165f908152600160205260408120919091558215613017575f8215612fd85750601b54612fdd565b50601a545b5f612710612feb838861345b565b612ff591906135ef565b90508015613014576130078184613495565b925061301488308361336c565b50505b61302b8686613026848861360e565b61336c565b505050505050565b604051630b4c774160e11b81526001600160a01b03831660048201525f5160206138ce5f395f51905f52602482015262ffffff821660448201525f908190731f7d7550b1b028f7571e69a784071f0205fd2efa90631698ee8290606401602060405180830381865afa1580156130ab573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130cf9190613715565b90506001600160a01b0381166130e8575f915050610ec5565b806001600160a01b0316631a6865026040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613142575060408051601f3d908101601f1916820190925261313f91810190613887565b60015b61314f575f915050610ec5565b5f816001600160801b031611613165575f613167565b835b92505050610ec5565b610bcf736db0eaae3e6a7edc7d838a787c0a3366a53a220e82620f42406133cf565b6003545f906001600160a01b03166131a957503090565b60035f9054906101000a90046001600160a01b03166001600160a01b03166302d05d3f6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613217575060408051601f3d908101601f1916820190925261321491810190613715565b60015b15613257576001600160a01b0381161561325557600c546001600160a01b03161561324d57600c546001600160a01b031661324f565b805b91505090565b505b600c546001600160a01b0316156132785750600c546001600160a01b031690565b506003546001600160a01b031690565b80158061329c57506001600160a01b038216155b156132a5575050565b5f826001600160a01b031682617530906040515f60405180830381858888f193505050503d805f811461302b576040519150601f19603f3d011682016040523d82523d5f602084013e61302b565b6040516370a0823160e01b81525f906001600160a01b038416906370a08231906133219085906004016134c1565b602060405180830381865afa92505050801561335a575060408051601f3d908101601f1916820190925261335791810190613698565b60015b61336557505f610ec5565b9050610ec5565b6001600160a01b0382165f9081526001602052604090205461338f908290613495565b6001600160a01b038084165f8181526001602052604090819020939093559151908516905f51602061390e5f395f51905f5290611c189085815260200190565b8115806133e357506001600160a01b038316155b156133ed57505050565b5f836001600160a01b03168383906040515f60405180830381858888f193505050503d805f8114613439576040519150601f19603f3d011682016040523d82523d5f602084013e61343e565b606091505b50505050505050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610ec557610ec5613447565b60208082526009908201526836b4b73a1037bb32b960b91b604082015260600190565b80820180821115610ec557610ec5613447565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0391909116815260200190565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b0381168114610bcf575f5ffd5b5f5f6040838503121561352f575f5ffd5b823561353a8161350a565b946020939093013593505050565b5f5f5f6060848603121561355a575f5ffd5b83356135658161350a565b925060208401356135758161350a565b929592945050506040919091013590565b5f60208284031215613596575f5ffd5b81356123ce8161350a565b5f602082840312156135b1575f5ffd5b5035919050565b5f5f604083850312156135c9575f5ffd5b82356135d48161350a565b915060208301356135e48161350a565b809150509250929050565b5f8261360957634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115610ec557610ec5613447565b60208082526006908201526510b7bbb732b960d11b604082015260600190565b600181811c9082168061365557607f821691505b60208210810361367357634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215613689575f5ffd5b815180151581146123ce575f5ffd5b5f602082840312156136a8575f5ffd5b5051919050565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b5f5f5f606084860312156136fc575f5ffd5b5050815160208301516040909301519094929350919050565b5f60208284031215613725575f5ffd5b81516123ce8161350a565b80516001600160701b0381168114613746575f5ffd5b919050565b5f5f5f6060848603121561375d575f5ffd5b61376684613730565b925061377460208501613730565b9150604084015163ffffffff8116811461378c575f5ffd5b809150509250925092565b5f60a0820187835286602084015260a0604084015280865480835260c085019150875f5260205f2092505f5b818110156137ea5783546001600160a01b03168352600193840193602090930192016137c3565b50506001600160a01b039590951660608401525050608001529392505050565b634e487b7160e01b5f52603260045260245ffd5b5f608082018683526080602084015280865180835260a0850191506020880192505f5b818110156138685783516001600160a01b0316835260209384019390920191600101613841565b50506001600160a01b0395909516604084015250506060015292915050565b5f60208284031215613897575f5ffd5b81516001600160801b03811681146123ce575f5ffdfe6c37756e80daba6f4df0d5bfa6cddadfe23601acc1a27dc8d4aa427de91467880000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad738be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212207c623e8c079a9b0d70b9b483a46984cd0a51ffef9c9b42108d3353bb37e03ae964736f6c63430008210033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| DIH | 1 | $0.0000102 | $0 | |
| 测试 (测试--1) | 测试--1 | 158.065737 | — | — |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xa893d6…f93905 | 11 days agoThu, 06 Aug 2026 16:04:30 UTC | 0xc86433…8a98 | [0] 0x000000000000…00000001 [1] 0x000000000000…9ebabd8c data: 0x000000000000000000…000493e0 |
| 0xa893d6…f93905 | 11 days agoThu, 06 Aug 2026 16:04:30 UTC | Transfer | [0] 0x000000000000…3a82dbfd [1] 0x000000000000…aa4c7ba2 data: 0x000000000000000000…a0f8d18f |
| 0xa893d6…f93905 | 11 days agoThu, 06 Aug 2026 16:04:30 UTC | Transfer | [0] 0x000000000000…3a82dbfd [1] 0x000000000000…714b5555 data: 0x000000000000000000…83a8af63 |
| 0xa893d6…f93905 | 11 days agoThu, 06 Aug 2026 16:04:30 UTC | Transfer | [0] 0x000000000000…3a82dbfd [1] 0x000000000000…90dfbd16 data: 0x000000000000000000…00000001 |
| 0xa893d6…f93905 | 11 days agoThu, 06 Aug 2026 16:04:30 UTC | Transfer | [0] 0x000000000000…3a82dbfd [1] 0x000000000000…39c0b2a2 data: 0x000000000000000000…00000001 |
| 0x5f096a…4cc48e | 32 days agoThu, 16 Jul 2026 07:30:00 UTC | Approval | [0] 0x000000000000…5d942506 [1] 0x000000000000…73ab8a37 data: 0xffffffffffffffffff…ffffffff |
| 0x28315e…3eb484 | 32 days agoThu, 16 Jul 2026 07:30:00 UTC | 0xc86433…8a98 | [0] 0x000000000000…00000001 [1] 0x000000000000…5d942506 data: 0x000000000000000000…000493e0 |
| 0x28315e…3eb484 | 32 days agoThu, 16 Jul 2026 07:30:00 UTC | Transfer | [0] 0x000000000000…3a82dbfd [1] 0x000000000000…5d942506 data: 0x000000000000000000…7b38746e |
| 0x28315e…3eb484 | 32 days agoThu, 16 Jul 2026 07:30:00 UTC | Transfer | [0] 0x000000000000…3a82dbfd [1] 0x000000000000…714b5555 data: 0x000000000000000000…f9411613 |
| 0x28315e…3eb484 | 32 days agoThu, 16 Jul 2026 07:30:00 UTC | Transfer | [0] 0x000000000000…3a82dbfd [1] 0x000000000000…456a0ddf data: 0x000000000000000000…00000001 |
| 0x28315e…3eb484 | 32 days agoThu, 16 Jul 2026 07:30:00 UTC | Transfer | [0] 0x000000000000…3a82dbfd [1] 0x000000000000…0e845dc1 data: 0x000000000000000000…00000001 |
| 0x5a6dcf…ac8b45 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | 0xc86433…8a98 | [0] 0x000000000000…00000001 [1] 0x000000000000…76626621 data: 0x000000000000000000…000493e0 |
| 0x5a6dcf…ac8b45 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | Transfer | [0] 0x000000000000…76626621 [1] 0x000000000000…3a82dbfd data: 0x000000000000000000…b67e0ad2 |
| 0x5a6dcf…ac8b45 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | Transfer | [0] 0x000000000000…76626621 [1] 0x000000000000…714b5555 data: 0x000000000000000000…20092d33 |
| 0x5a6dcf…ac8b45 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | Transfer | [0] 0x000000000000…714b5555 [1] 0x000000000000…3a82dbfd data: 0x000000000000000000…f271106d |
| 0x5a6dcf…ac8b45 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | Transfer | [0] 0x000000000000…714b5555 [1] 0x000000000000…714b5555 data: 0x000000000000000000…96037f30 |
| 0x5a6dcf…ac8b45 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | Transfer | [0] 0x000000000000…714b5555 [1] 0x000000000000…3a82dbfd data: 0x000000000000000000…19821743 |
| 0x5a6dcf…ac8b45 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | Transfer | [0] 0x000000000000…714b5555 [1] 0x000000000000…714b5555 data: 0x000000000000000000…f63b7234 |
| 0x5a6dcf…ac8b45 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | Transfer | [0] 0x000000000000…714b5555 [1] 0x000000000000…0000dead data: 0x000000000000000000…87ab5018 |
| 0x5a6dcf…ac8b45 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | Transfer | [0] 0x000000000000…76626621 [1] 0x000000000000…363fd9da data: 0x000000000000000000…00000001 |
| 0x5a6dcf…ac8b45 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | Transfer | [0] 0x000000000000…76626621 [1] 0x000000000000…e2b47d0b data: 0x000000000000000000…00000001 |
| 0x032af6…df2214 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | Approval | [0] 0x000000000000…76626621 [1] 0x000000000000…262c40dc data: 0xffffffffffffffffff…ffffffff |
| 0x086592…6a4aa7 | 32 days agoThu, 16 Jul 2026 07:29:16 UTC | 0xc86433…8a98 | [0] 0x000000000000…00000001 [1] 0x000000000000…8bb46978 data: 0x000000000000000000…000493e0 |
| 0x086592…6a4aa7 | 32 days agoThu, 16 Jul 2026 07:29:16 UTC | Transfer | [0] 0x000000000000…8bb46978 [1] 0x000000000000…3a82dbfd data: 0x000000000000000000…fa0a65d7 |
| 0x086592…6a4aa7 | 32 days agoThu, 16 Jul 2026 07:29:16 UTC | Transfer | [0] 0x000000000000…8bb46978 [1] 0x000000000000…714b5555 data: 0x000000000000000000…0d02f5f4 |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x5f096a…4cc48e | Approve | 11,078,313 | 32 days agoThu, 16 Jul 2026 07:30:00 UTC | 0x7028…2506 | IN | 测试 | $0.000 ETH | 0.00000301 | |
| 0x032af6…df2214 | Approve | 11,077,891 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | 0xedea…6621 | IN | 测试 | $0.000 ETH | 0.00000298 | |
| 0x834017…04f3cc | Approve | 11,077,870 | 32 days agoThu, 16 Jul 2026 07:29:16 UTC | 0xc4a2…6978 | IN | 测试 | $0.000 ETH | 0.00000296 | |
| 0xf172c8…a93a56 | Approve | 11,077,718 | 32 days agoThu, 16 Jul 2026 07:29:01 UTC | 0xedea…6621 | IN | 测试 | $0.000 ETH | 0.00000170 | |
| 0xc69dee…e6f8c4 | Approve | 11,077,712 | 32 days agoThu, 16 Jul 2026 07:29:00 UTC | 0xedea…6621 | IN | 测试 | $0.000 ETH | 0.00000298 | |
| 0x6f4560…f1a11f | Transfer | 11,077,556 | 32 days agoThu, 16 Jul 2026 07:28:44 UTC | 0xc4a2…6978 | IN | 测试 | $0.190.0001 ETH | 0.00004110 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xa893d69a…f93905 | Transfer | 29,477,977 | 11 days agoThu, 06 Aug 2026 16:04:30 UTC | 0x3549…dbfd | IN | 0xc379…5555 | 2.820441 测试--1 | 测试 (测试--1) | |
| 0x1f443f54…34748c | Transfer | 18,539,887 | 24 days agoFri, 24 Jul 2026 23:21:33 UTC | 0xcaf7…5d11 | IN | 0xc379…5555 | $0.001 DIH | ||
| 0x28315e9f…3eb484 | Transfer | 11,078,309 | 32 days agoThu, 16 Jul 2026 07:30:00 UTC | 0x3549…dbfd | IN | 0xc379…5555 | 76.159417 测试--1 | 测试 (测试--1) | |
| 0x5a6dcf46…ac8b45 | Transfer | 11,077,891 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | 0xedea…6621 | IN | 0xc379…5555 | 72.832965 测试--1 | 测试 (测试--1) | |
| 0x5a6dcf46…ac8b45 | Transfer | 11,077,891 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | 0xc379…5555 | OUT | 0x14e8…3956 | $0.000.000669 USDG | Global Dollar (USDG) | |
| 0x5a6dcf46…ac8b45 | Transfer | 11,077,891 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | 0x8803…1c4d | IN | 0xc379…5555 | $0.000.000669 USDG | Global Dollar (USDG) | |
| 0x5a6dcf46…ac8b45 | Transfer | 11,077,891 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | 0xc379…5555 | OUT | 0x3549…dbfd | 11.232084 测试--1 | 测试 (测试--1) | |
| 0x5a6dcf46…ac8b45 | Transfer | 11,077,891 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | 0xc379…5555 | OUT | 0xc379…5555 | 0.347384 测试--1 | 测试 (测试--1) | |
| 0x5a6dcf46…ac8b45 | Transfer | 11,077,891 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | 0xc379…5555 | OUT | 0x3549…dbfd | 190.945443 测试--1 | 测试 (测试--1) | |
| 0x5a6dcf46…ac8b45 | Transfer | 11,077,891 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | 0xc379…5555 | OUT | 0xc379…5555 | 5.905529 测试--1 | 测试 (测试--1) | |
| 0x5a6dcf46…ac8b45 | Transfer | 11,077,891 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | 0xc379…5555 | OUT | 0x0000…dead | 18.124386 测试--1 | 测试 (测试--1) | |
| 0x0865921c…6a4aa7 | Transfer | 11,077,870 | 32 days agoThu, 16 Jul 2026 07:29:16 UTC | 0xc4a2…6978 | IN | 0xc379…5555 | 222.421805 测试--1 | 测试 (测试--1) | |
| 0x0865921c…6a4aa7 | Transfer | 11,077,870 | 32 days agoThu, 16 Jul 2026 07:29:16 UTC | 0xc379…5555 | OUT | 0x14e8…3956 | $20.8020.730538 USDG | Global Dollar (USDG) | |
| 0x0865921c…6a4aa7 | Transfer | 11,077,870 | 32 days agoThu, 16 Jul 2026 07:29:16 UTC | 0x8803…1c4d | IN | 0xc379…5555 | $20.8020.730538 USDG | Global Dollar (USDG) | |
| 0x0865921c…6a4aa7 | Transfer | 11,077,870 | 32 days agoThu, 16 Jul 2026 07:29:16 UTC | 0xc379…5555 | OUT | 0x3549…dbfd | 7.424132 测试--1 | 测试 (测试--1) | |
| 0x0865921c…6a4aa7 | Transfer | 11,077,870 | 32 days agoThu, 16 Jul 2026 07:29:16 UTC | 0xc379…5555 | OUT | 0xc379…5555 | 0.229612 测试--1 | 测试 (测试--1) | |
| 0x0865921c…6a4aa7 | Transfer | 11,077,870 | 32 days agoThu, 16 Jul 2026 07:29:16 UTC | 0xc379…5555 | OUT | 0x3549…dbfd | 126.210256 测试--1 | 测试 (测试--1) | |
| 0x0865921c…6a4aa7 | Transfer | 11,077,870 | 32 days agoThu, 16 Jul 2026 07:29:16 UTC | 0xc379…5555 | OUT | 0xc379…5555 | 3.903410 测试--1 | 测试 (测试--1) | |
| 0x0865921c…6a4aa7 | Transfer | 11,077,870 | 32 days agoThu, 16 Jul 2026 07:29:16 UTC | 0xc379…5555 | OUT | 0x0000…dead | 11.979774 测试--1 | 测试 (测试--1) | |
| 0xc8ac69e4…81b9d6 | Transfer | 11,077,709 | 32 days agoThu, 16 Jul 2026 07:29:00 UTC | 0x3549…dbfd | IN | 0xc379…5555 | 75.085531 测试--1 | 测试 (测试--1) | |
| 0xb38f3033…998481 | Transfer | 11,077,704 | 32 days agoThu, 16 Jul 2026 07:28:59 UTC | 0x3549…dbfd | IN | 0xc379…5555 | 74.661655 测试--1 | 测试 (测试--1) | |
| 0x6f4560bf…f1a11f | Transfer | 11,077,556 | 32 days agoThu, 16 Jul 2026 07:28:44 UTC | 0xc379…5555 | OUT | 0xc4a2…6978 | 5,000 测试--1 | 测试 (测试--1) | |
| 0x6f4560bf…f1a11f | Transfer | 11,077,556 | 32 days agoThu, 16 Jul 2026 07:28:44 UTC | 0xc379…5555 | OUT | 0x3549…dbfd | 5,000 测试--1 | 测试 (测试--1) | |
| 0x756bf68c…ceb764 | Transfer | 11,076,826 | 32 days agoThu, 16 Jul 2026 07:27:31 UTC | 0x0000…0000 | IN | 0xc379…5555 | 10,000 测试--1 | 测试 (测试--1) |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 11,077,891 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | 0x5a6dcf…ac8b45 | CALL | swap | 0xc379…5555 | OUT | 0x89e5…9eba | 0.00000 ETH |
| 11,077,891 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | 0x5a6dcf…ac8b45 | CALL | swap | 0xc379…5555 | OUT | 0xc4a2…6978 | 0.00000 ETH |
| 11,077,891 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | 0x5a6dcf…ac8b45 | CALL | swap | 0x89e5…9eba | IN | 0xc379…5555 | 0.00000 ETH |
| 11,077,891 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | 0x5a6dcf…ac8b45 | CALL | swap | 0xc379…5555 | OUT | 0x89e5…9eba | 0.00000 ETH |
| 11,077,891 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | 0x5a6dcf…ac8b45 | CALL | swap | 0xc379…5555 | OUT | 0x6db0…220e | 0.00000 ETH |
| 11,077,891 | 32 days agoThu, 16 Jul 2026 07:29:18 UTC | 0x5a6dcf…ac8b45 | CALL | swap | 0xac5f…d42f | IN | 0xc379…5555 | 0.00000 ETH |
| 11,077,870 | 32 days agoThu, 16 Jul 2026 07:29:16 UTC | 0x086592…6a4aa7 | CALL | 0x27772d13 | 0xc379…5555 | OUT | 0x89e5…9eba | 0.01087 ETH |
| 11,077,870 | 32 days agoThu, 16 Jul 2026 07:29:16 UTC | 0x086592…6a4aa7 | CALL | 0x27772d13 | 0xc379…5555 | OUT | 0xc4a2…6978 | 0.03262 ETH |
| 11,077,870 | 32 days agoThu, 16 Jul 2026 07:29:16 UTC | 0x086592…6a4aa7 | CALL | 0x27772d13 | 0x89e5…9eba | IN | 0xc379…5555 | 0.00464 ETH |
| 11,077,870 | 32 days agoThu, 16 Jul 2026 07:29:16 UTC | 0x086592…6a4aa7 | CALL | 0x27772d13 | 0xc379…5555 | OUT | 0x89e5…9eba | 0.00485 ETH |
| 11,077,870 | 32 days agoThu, 16 Jul 2026 07:29:16 UTC | 0x086592…6a4aa7 | CALL | 0x27772d13 | 0xc379…5555 | OUT | 0x6db0…220e | 0.01214 ETH |
| 11,077,870 | 32 days agoThu, 16 Jul 2026 07:29:16 UTC | 0x086592…6a4aa7 | CALL | 0x27772d13 | 0xac5f…d42f | IN | 0xc379…5555 | 0.05585 ETH |
| 11,077,556 | 32 days agoThu, 16 Jul 2026 07:28:44 UTC | 0x6f4560…f1a11f | CALL | Transfer | 0xc379…5555 | OUT | 0x89e5…9eba | 0.0001 ETH |
| 11,076,826 | 32 days agoThu, 16 Jul 2026 07:27:31 UTC | 0x756bf6…ceb764 | CREATE | 0xc1b346b5 | 0xc379…5555 | OUT | 0x14e8…3956 | 0 ETH |
| 11,076,826 | 32 days agoThu, 16 Jul 2026 07:27:31 UTC | 0x756bf6…ceb764 | CREATE | 0xc1b346b5 | 0xc379…5555 | OUT | 0xac5f…d42f | 0 ETH |
| 11,076,826 | 32 days agoThu, 16 Jul 2026 07:27:31 UTC | 0x756bf6…ceb764 | CREATE2 | 0xc1b346b5 | 0x7720…ff8d | IN | 0xc379…5555 | 0 ETH |