Transaction Hash:
Block:
18286877 at Oct-05-2023 09:06:11 PM +UTC
Transaction Fee:
0.000685392438330412 ETH
$1.54
Gas Used:
47,132 Gas / 14.541976541 Gwei
Emitted Events:
88 |
RFK24_Token.Approval( owner=[Sender] 0x502c3a9a93f0f010c3d3cc7520d548ec7f0577af, spender=0x3999D2c5...cabB76d41, value=115792089237316195423570985008687907853269984665640564039457584007913129639935 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x502C3a9A...C7f0577af |
0.426647680275405628 Eth
Nonce: 62
|
0.425962287837075216 Eth
Nonce: 63
| 0.000685392438330412 | ||
0x51e5798D...7Ccb9491F | |||||
0x95222290...5CC4BAfe5
Miner
| (beaverbuild) | 17.43901425923047983 Eth | 17.43929705123047983 Eth | 0.000282792 |
Execution Trace
RFK24_Token.approve( spender=0x3999D2c5207C06BBC5cf8A6bEa52966cabB76d41, amount=115792089237316195423570985008687907853269984665640564039457584007913129639935 ) => ( True )
approve[RFK24_Token (ln:488)]
Approval[RFK24_Token (ln:493)]
// Token: RFK24 // Website: https://www.rfk24.io // TG Channel: https://t.me/RFK24_coin // Twitter Account https://twitter.com/RFK24_coin // SPDX-License-Identifier: MIT pragma solidity ^0.8.10; library SafeMath { function tryAdd( uint256 a, uint256 b ) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } function trySub( uint256 a, uint256 b ) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } function tryMul( uint256 a, uint256 b ) internal pure returns (bool, uint256) { unchecked { // 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } function tryDiv( uint256 a, uint256 b ) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } function tryMod( uint256 a, uint256 b ) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } interface IDexFactory { function createPair( address tokenA, address tokenB ) external returns (address pair); } interface IDexRouter { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity); function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } interface IERC20Extended { function totalSupply() external view returns (uint256); function decimals() external view returns (uint8); function symbol() external view returns (string memory); function name() external view returns (string memory); 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 ); } abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return payable(msg.sender); } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); constructor() { _owner = _msgSender(); emit OwnershipTransferred(address(0), _owner); } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = payable(address(0)); } function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } interface IDividendDistributor { function setShare(address shareholder, uint256 amount) external; function deposit() external payable; function claimDividend(address _user) external; function getPaidEarnings( address shareholder ) external view returns (uint256); function getUnpaidEarnings( address shareholder ) external view returns (uint256); function totalDistributed() external view returns (uint256); } contract DividendDistributor is IDividendDistributor { using SafeMath for uint256; address public token; struct Share { uint256 amount; uint256 totalExcluded; uint256 totalRealised; } address[] public shareholders; mapping(address => uint256) public shareholderIndexes; mapping(address => uint256) public shareholderClaims; mapping(address => Share) public shares; uint256 public totalShares; uint256 public totalDividends; uint256 public totalDistributed; uint256 public dividendsPerShare; uint256 public dividendsPerShareAccuracyFactor = 10 ** 36; uint256 currentIndex; modifier onlyToken() { require(msg.sender == token); _; } constructor() { token = msg.sender; } function setShare( address shareholder, uint256 amount ) external override onlyToken { if (shares[shareholder].amount > 0) { distributeDividend(shareholder); } if (amount > 0 && shares[shareholder].amount == 0) { addShareholder(shareholder); } else if (amount == 0 && shares[shareholder].amount > 0) { removeShareholder(shareholder); } totalShares = totalShares.sub(shares[shareholder].amount).add(amount); shares[shareholder].amount = amount; shares[shareholder].totalExcluded = getCumulativeDividends( shares[shareholder].amount ); } function deposit() external payable override onlyToken { totalDividends = totalDividends.add(msg.value); dividendsPerShare = dividendsPerShare.add( dividendsPerShareAccuracyFactor.mul(msg.value).div(totalShares) ); } function distributeDividend(address shareholder) internal { if (shares[shareholder].amount == 0) { return; } uint256 amount = getUnpaidEarnings(shareholder); if (amount > 0) { totalDistributed = totalDistributed.add(amount); payable(shareholder).transfer(amount); shareholderClaims[shareholder] = block.timestamp; shares[shareholder].totalRealised = shares[shareholder] .totalRealised .add(amount); shares[shareholder].totalExcluded = getCumulativeDividends( shares[shareholder].amount ); } } function claimDividend(address _user) external { distributeDividend(_user); } function getPaidEarnings( address shareholder ) public view returns (uint256) { return shares[shareholder].totalRealised; } function getUnpaidEarnings( address shareholder ) public view returns (uint256) { if (shares[shareholder].amount == 0) { return 0; } uint256 shareholderTotalDividends = getCumulativeDividends( shares[shareholder].amount ); uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded; if (shareholderTotalDividends <= shareholderTotalExcluded) { return 0; } return shareholderTotalDividends.sub(shareholderTotalExcluded); } function getCumulativeDividends( uint256 share ) internal view returns (uint256) { return share.mul(dividendsPerShare).div(dividendsPerShareAccuracyFactor); } function addShareholder(address shareholder) internal { shareholderIndexes[shareholder] = shareholders.length; shareholders.push(shareholder); } function removeShareholder(address shareholder) internal { shareholders[shareholderIndexes[shareholder]] = shareholders[ shareholders.length - 1 ]; shareholderIndexes[ shareholders[shareholders.length - 1] ] = shareholderIndexes[shareholder]; shareholders.pop(); } } // main contract contract RFK24_Token is IERC20Extended, Ownable { using SafeMath for uint256; string private constant _name = "RFK24"; string private constant _symbol = "RFK24"; uint8 private constant _decimals = 9; uint256 private constant _totalSupply = 240_000_000_000 * 10 ** _decimals; DividendDistributor public distributor; IDexRouter public router; address public pair; address public autoLiquidityReceiver; address public marketingFeeReceiver; uint256 _reflectionPercent = 25_00; uint256 _liquidityPercent = 10_00; uint256 _marketingPercent = 65_00; uint256 public totalBuyFee = 5_00; uint256 public totalSellFee = 5_00; uint256 public percentDivider = 100_00; uint256 public maxWalletAmount = (_totalSupply * 2) / 100; uint256 public vultureFee = 99_99; uint256 public vulturingTime = 2 minutes; uint256 public launchedAt; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; mapping(address => bool) private isGood; mapping(address => bool) public isFeeExempt; mapping(address => bool) public isWalletExmpt; mapping(address => bool) public isDividendExempt; uint256 public swapThreshold = (_totalSupply * 5) / 1000; bool public swapEnabled; bool public trading; bool inSwap; modifier swapping() { inSwap = true; _; inSwap = false; } event AutoLiquify(uint256 amountBNB, uint256 amountBOG); constructor() Ownable() { autoLiquidityReceiver = msg.sender; marketingFeeReceiver = 0x8D8a9E2D2E2d4DCa697491d4bdcC308BBc62A281; distributor = new DividendDistributor(); isFeeExempt[autoLiquidityReceiver] = true; isFeeExempt[address(this)] = true; isDividendExempt[address(this)] = true; isGood[autoLiquidityReceiver] = true; isGood[address(this)] = true; isWalletExmpt[autoLiquidityReceiver] = true; isWalletExmpt[address(this)] = true; _balances[address(this)] = _totalSupply; emit Transfer(address(0), address(this), _totalSupply); } receive() external payable {} function totalSupply() external pure override returns (uint256) { return _totalSupply; } function decimals() external pure override returns (uint8) { return _decimals; } function symbol() external pure override returns (string memory) { return _symbol; } function name() external pure override returns (string memory) { return _name; } function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } function allowance( address holder, address spender ) external view override returns (uint256) { return _allowances[holder][spender]; } function approve( address spender, uint256 amount ) public override returns (bool) { _allowances[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function approveMax(address spender) external returns (bool) { return approve(spender, _totalSupply); } function transfer( address recipient, uint256 amount ) external override returns (bool) { return _transferFrom(msg.sender, recipient, amount); } function transferFrom( address sender, address recipient, uint256 amount ) external override returns (bool) { if (_allowances[sender][msg.sender] != _totalSupply) { _allowances[sender][msg.sender] = _allowances[sender][msg.sender] .sub(amount, "Insufficient Allowance"); } return _transferFrom(sender, recipient, amount); } function _transferFrom( address sender, address recipient, uint256 amount ) internal returns (bool) { if (!isGood[sender] && !isGood[recipient]) { // trading disable till launch if (!trading) { require( pair != sender && pair != recipient, "Trading is disable" ); } // anti vultures if ( block.timestamp < launchedAt + vulturingTime && sender != address(router) ) { _balances[sender] = _balances[sender].sub( amount, "Insufficient Balance" ); uint256 feeAmount = amount.mul(vultureFee).div(percentDivider); _balances[recipient] = _balances[recipient].add(amount.sub(feeAmount)); emit Transfer(sender, recipient, amount.sub(feeAmount)); takeFee(sender, feeAmount); return true; } } if (!isWalletExmpt[recipient]) { require( balanceOf(recipient).add(amount) <= maxWalletAmount, "Max Wallet limit exceeds" ); } if (inSwap) { return _basicTransfer(sender, recipient, amount); } if (shouldSwapBack()) { swapBack(); } _balances[sender] = _balances[sender].sub( amount, "Insufficient Balance" ); uint256 amountReceived; if ( isFeeExempt[sender] || isFeeExempt[recipient] || (sender != pair && recipient != pair) ) { amountReceived = amount; } else { uint256 feeAmount; if (sender == pair) { feeAmount = amount.mul(totalBuyFee).div(percentDivider); amountReceived = amount.sub(feeAmount); takeFee(sender, feeAmount); } else { feeAmount = amount.mul(totalSellFee).div(percentDivider); amountReceived = amount.sub(feeAmount); takeFee(sender, feeAmount); } } _balances[recipient] = _balances[recipient].add(amountReceived); emit Transfer(sender, recipient, amountReceived); if (!isDividendExempt[sender]) { try distributor.setShare(sender, _balances[sender]) {} catch {} } if (!isDividendExempt[recipient]) { try distributor.setShare(recipient, _balances[recipient]) {} catch {} } return true; } function _basicTransfer( address sender, address recipient, uint256 amount ) internal returns (bool) { _balances[sender] = _balances[sender].sub( amount, "Insufficient Balance" ); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); return true; } function takeFee(address sender, uint256 feeAmount) internal { _balances[address(this)] = _balances[address(this)].add(feeAmount); emit Transfer(sender, address(this), feeAmount); } function shouldSwapBack() internal view returns (bool) { return msg.sender != pair && !inSwap && swapEnabled && _balances[address(this)] >= swapThreshold; } function swapBack() internal swapping { uint256 amountToLiquify = swapThreshold .mul(_liquidityPercent) .div(percentDivider) .div(2); uint256 amountToSwap = swapThreshold.sub(amountToLiquify); _allowances[address(this)][address(router)] = _totalSupply; address[] memory path = new address[](2); path[0] = address(this); path[1] = router.WETH(); uint256 balanceBefore = address(this).balance; router.swapExactTokensForETHSupportingFeeOnTransferTokens( amountToSwap, 0, path, address(this), block.timestamp ); uint256 amountBNB = address(this).balance.sub(balanceBefore); uint256 feePercentDivider = percentDivider.sub( _liquidityPercent.div(2) ); uint256 amountEthLiquidity = amountBNB .mul(_liquidityPercent) .div(feePercentDivider) .div(2); if (amountToLiquify > 0) { router.addLiquidityETH{value: amountEthLiquidity}( address(this), amountToLiquify, 0, 0, autoLiquidityReceiver, block.timestamp ); emit AutoLiquify(amountEthLiquidity, amountToLiquify); } uint256 amountEthReflection = amountBNB.mul(_reflectionPercent).div( feePercentDivider ); if (amountEthReflection > 0) { try distributor.deposit{value: amountEthReflection}() {} catch {} } if (address(this).balance > 0) { payable(marketingFeeReceiver).transfer(address(this).balance); } } function claimDividend() external { distributor.claimDividend(msg.sender); } function getPaidDividend( address shareholder ) public view returns (uint256) { return distributor.getPaidEarnings(shareholder); } function getUnpaidDividend( address shareholder ) external view returns (uint256) { return distributor.getUnpaidEarnings(shareholder); } function getTotalDistributedDividend() external view returns (uint256) { return distributor.totalDistributed(); } function setIsDividendExempt( address holder, bool exempt ) external onlyOwner { require(holder != address(this) && holder != pair); isDividendExempt[holder] = exempt; if (exempt) { distributor.setShare(holder, 0); } else { distributor.setShare(holder, _balances[holder]); } } function addLp(address _router) external payable onlyOwner { router = IDexRouter(_router); pair = IDexFactory(router.factory()).createPair( address(this), router.WETH() ); isFeeExempt[address(router)] = true; isDividendExempt[pair] = true; isDividendExempt[address(router)] = true; isWalletExmpt[pair] = true; isWalletExmpt[address(router)] = true; _allowances[address(this)][address(router)] = _totalSupply; router.addLiquidityETH{value: msg.value}( address(this), balanceOf(address(this)), 0, 0, owner(), block.timestamp ); IERC20Extended(pair).approve(address(router), type(uint).max); } function enableTrading() external onlyOwner { require(!trading, "Already enabled"); trading = true; swapEnabled = true; launchedAt = block.timestamp; } function removeStuckEth(uint256 amount) external { require(msg.sender == marketingFeeReceiver, "Invalid caller"); payable(marketingFeeReceiver).transfer(amount); } function setIsGood( address[] memory holders, bool exempt ) external onlyOwner { for (uint256 i; i < holders.length; i++) { isGood[holders[i]] = exempt; } } function setFeeReceivers( address _autoLiquidityReceiver, address _marketingFeeReceiver ) external onlyOwner { autoLiquidityReceiver = _autoLiquidityReceiver; marketingFeeReceiver = _marketingFeeReceiver; } function setSwapBackSettings( bool _enabled, uint256 _amount ) external onlyOwner { require(swapThreshold > 0); swapEnabled = _enabled; swapThreshold = _amount; } }