Transaction Hash:
Block:
18066171 at Sep-04-2023 10:42:11 PM +UTC
Transaction Fee:
0.003387757224147975 ETH
$8.17
Gas Used:
208,705 Gas / 16.232276295 Gwei
Emitted Events:
258 |
OkamiV2.Transfer( from=[Sender] 0xfad874ef802dce40e66d66e720aee9a657b2a831, to=0xc8FDE24664D8d6AD76B8FB44eC7268415390C171, value=500000000000000000000000 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x5341E011...aE79446b3 | 0.885395823978925111 Eth | 0.872553797602899908 Eth | 0.012842026376025203 | ||
0x92CC4e55...209c41f8d | |||||
0x95222290...5CC4BAfe5
Miner
| (beaverbuild) | 7.810255125421084286 Eth | 7.810275995921084286 Eth | 0.0000208705 | |
0xc8FDE246...15390C171 | 0.003516152896461239 Eth | 0.008013243139343783 Eth | 0.004497090242882544 | ||
0xfAd874EF...657B2A831 |
0.06167 Eth
Nonce: 0
|
0.066627178908994684 Eth
Nonce: 1
| 0.004957178908994684 |
Execution Trace
OkamiV2.transfer( recipient=0xc8FDE24664D8d6AD76B8FB44eC7268415390C171, amount=500000000000000000000000 ) => ( True )

-
0xed251e86f3dfc65ad7c77738e9b117b5cda625fd.ecd07a53( )
0x5341e0115bddef9aba848c25a4ca458ae79446b3.df047e9e( )
- ETH 0.008344936133142659
0xfad874ef802dce40e66d66e720aee9a657b2a831.CALL( )
- ETH 0.008344936133142659
0x5341e0115bddef9aba848c25a4ca458ae79446b3.df047e9e( )
- ETH 0.004497090242882544
0xc8fde24664d8d6ad76b8fb44ec7268415390c171.CALL( )
- ETH 0.004497090242882544
transfer[OkamiV2 (ln:311)]
_transfer[OkamiV2 (ln:312)]
_hasLimits[OkamiV2 (ln:487)]
revert[OkamiV2 (ln:490)]
revert[OkamiV2 (ln:492)]
balanceOf[OkamiV2 (ln:505)]
contractSwap[OkamiV2 (ln:509)]
type[OkamiV2 (ln:523)]
type[OkamiV2 (ln:524)]
WETH[OkamiV2 (ln:529)]
swapExactTokensForETHSupportingFeeOnTransferTokens[OkamiV2 (ln:531)]
load[OkamiV2 (ln:546)]
call[OkamiV2 (ln:548)]
finalizeTransfer[OkamiV2 (ln:514)]
_hasLimits[OkamiV2 (ln:584)]
checkUser[OkamiV2 (ln:585)]
revert[OkamiV2 (ln:586)]
revert[OkamiV2 (ln:587)]
takeTaxes[OkamiV2 (ln:598)]
Transfer[OkamiV2 (ln:649)]
Transfer[OkamiV2 (ln:601)]
_checkLiquidityAdd[OkamiV2 (ln:603)]
_hasLimits[OkamiV2 (ln:553)]
ContractSwapEnabledUpdated[OkamiV2 (ln:563)]
_hasLimits[OkamiV2 (ln:604)]
revert[OkamiV2 (ln:605)]
processRewards[OkamiV2 (ln:608)]
tally[OkamiV2 (ln:615)]
tally[OkamiV2 (ln:618)]
cashout[OkamiV2 (ln:621)]
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.9.0; interface IERC20 { 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 getOwner() external view returns (address); 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 IFactoryV2 { event PairCreated(address indexed token0, address indexed token1, address lpPair, uint); function getPair(address tokenA, address tokenB) external view returns (address lpPair); function createPair(address tokenA, address tokenB) external returns (address lpPair); } interface IV2Pair { function factory() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function sync() external; } interface IRouter01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); 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); function swapExactETHForTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable returns (uint[] memory amounts); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface IRouter02 is IRouter01 { function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); } interface Protections { function checkUser(address from, address to, uint256 amt) external returns (bool); function setLaunch(address _initialLpPair, uint32 _liqAddBlock, uint64 _liqAddStamp, uint8 dec) external; function getInits(uint256 amount) external returns (uint256, uint256); function setLpPair(address pair, bool enabled) external; function setProtections(bool _as, bool _ab) external; function removeSniper(address account) external; } interface Cashier { function setRewardsProperties(uint256 _minPeriod, uint256 _minReflection) external; function tally(address user, uint256 amount) external; function load() external payable; function cashout(uint256 gas) external; function giveMeWelfarePlease(address hobo) external; function getTotalDistributed() external view returns(uint256); function getUserInfo(address user) external view returns(string memory, string memory, string memory, string memory); function getUserRealizedRewards(address user) external view returns (uint256); function getPendingRewards(address user) external view returns (uint256); function initialize() external; function getCurrentReward() external view returns (address); } contract OkamiV2 is IERC20 { mapping (address => uint256) _tOwned; mapping (address => bool) lpPairs; uint256 private timeSinceLastPair = 0; mapping (address => mapping (address => uint256)) _allowances; mapping (address => bool) private _isExcludedFromProtection; mapping (address => bool) private _isExcludedFromFees; mapping (address => bool) private _isExcludedFromLimits; mapping (address => bool) private _isExcludedFromDividends; mapping (address => bool) private _liquidityHolders; uint256 constant private startingSupply = 100_000_000; string constant private _name = "Okami V2"; string constant private _symbol = "OKMV2"; uint8 constant private _decimals = 18; uint256 constant private _tTotal = startingSupply * (10 ** _decimals); struct Fees { uint16 buyFee; uint16 sellFee; uint16 transferFee; } struct Ratios { uint16 rewards; uint16 marketing; uint16 total; } Fees public _taxRates = Fees({ buyFee: 500, sellFee: 1000, transferFee: 0 }); Ratios public _ratios = Ratios({ rewards: 1, marketing: 2, total: 3 }); uint256 constant public maxBuyTaxes = 1000; uint256 constant public maxSellTaxes = 1000; uint256 constant public maxTransferTaxes = 1000; uint256 constant masterTaxDivisor = 10000; bool public taxesAreLocked; IRouter02 public dexRouter; address public lpPair; address constant public DEAD = 0x000000000000000000000000000000000000dEaD; address constant private ZERO = 0x0000000000000000000000000000000000000000; address payable public marketingWallet = payable(0x8B310D4EEe993372e38845a847DFebA6d0E204aa); uint256 private _maxTxAmount = (_tTotal * 1) / 100; Cashier cashier; uint256 cashierGas = 300000; bool inSwap; bool public contractSwapEnabled = false; uint256 public swapThreshold; uint256 public swapAmount; bool public piContractSwapsEnabled; uint256 public piSwapPercent = 10; bool public processReflect = false; bool public tradingEnabled = false; bool public _hasLiqBeenAdded = false; Protections protections; modifier inSwapFlag() { inSwap = true; _; inSwap = false; } event ContractSwapEnabledUpdated(bool enabled); event AutoLiquify(uint256 amountBNB, uint256 amount); constructor () payable { // Set the owner. _owner = msg.sender; _tOwned[_owner] = _tTotal; emit Transfer(ZERO, _owner, _tTotal); emit OwnershipTransferred(address(0), _owner); if (block.chainid == 56) { dexRouter = IRouter02(0x10ED43C718714eb63d5aA57B78B54704E256024E); } else if (block.chainid == 97) { dexRouter = IRouter02(0xD99D1c33F9fC3444f8101754aBC46c52416550D1); } else if (block.chainid == 1 || block.chainid == 4 || block.chainid == 3 || block.chainid == 5) { dexRouter = IRouter02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); //Ropstein DAI 0xaD6D458402F60fD3Bd25163575031ACDce07538D } else if (block.chainid == 43114) { dexRouter = IRouter02(0x60aE616a2155Ee3d9A68541Ba4544862310933d4); } else if (block.chainid == 250) { dexRouter = IRouter02(0xF491e7B69E4244ad4002BC14e878a34207E38c29); } else if (block.chainid == 42161) { dexRouter = IRouter02(0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506); } else { revert(); } lpPair = IFactoryV2(dexRouter.factory()).createPair(dexRouter.WETH(), address(this)); lpPairs[lpPair] = true; _approve(_owner, address(dexRouter), type(uint256).max); _approve(address(this), address(dexRouter), type(uint256).max); _isExcludedFromFees[_owner] = true; _isExcludedFromFees[address(this)] = true; _isExcludedFromFees[DEAD] = true; _isExcludedFromDividends[_owner] = true; _isExcludedFromDividends[lpPair] = true; _isExcludedFromDividends[address(this)] = true; _isExcludedFromDividends[DEAD] = true; _isExcludedFromDividends[ZERO] = true; // Exclude common lockers from dividends and fees. _isExcludedFromDividends[0x407993575c91ce7643a4d4cCACc9A98c36eE1BBE] = true; // PinkLock _isExcludedFromDividends[0x663A5C229c09b049E36dCc11a9B0d4a8Eb9db214] = true; // Unicrypt (ETH) _isExcludedFromDividends[0xDba68f07d1b7Ca219f78ae8582C213d975c25cAf] = true; // Unicrypt (ETH) _isExcludedFromFees[0x407993575c91ce7643a4d4cCACc9A98c36eE1BBE] = true; // PinkLock _isExcludedFromFees[0x663A5C229c09b049E36dCc11a9B0d4a8Eb9db214] = true; // Unicrypt (ETH) _isExcludedFromFees[0xDba68f07d1b7Ca219f78ae8582C213d975c25cAf] = true; // Unicrypt (ETH) } //=============================================================================================================== //=============================================================================================================== //=============================================================================================================== // Ownable removed as a lib and added here to allow for custom transfers and renouncements. // This allows for removal of ownership privileges from the owner once renounced or transferred. address private _owner; modifier onlyOwner() { require(_owner == msg.sender, "Caller =/= owner."); _; } event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); function transferOwner(address newOwner) external onlyOwner { require(newOwner != address(0), "Call renounceOwnership to transfer owner to the zero address."); require(newOwner != DEAD, "Call renounceOwnership to transfer owner to the zero address."); _isExcludedFromFees[_owner] = false; _isExcludedFromDividends[_owner] = false; _isExcludedFromFees[newOwner] = true; _isExcludedFromDividends[newOwner] = true; if (balanceOf(_owner) > 0) { finalizeTransfer(_owner, newOwner, balanceOf(_owner), false, false, true); } address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } function renounceOwnership() external onlyOwner { setExcludedFromFees(_owner, false); address oldOwner = _owner; _owner = address(0); emit OwnershipTransferred(oldOwner, address(0)); } //=============================================================================================================== //=============================================================================================================== //=============================================================================================================== receive() external payable {} function totalSupply() external pure override returns (uint256) { return _tTotal; } 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 getOwner() external view override returns (address) { return _owner; } function balanceOf(address account) public view override returns (uint256) { return _tOwned[account]; } function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; } function approve(address spender, uint256 amount) external override returns (bool) { _approve(msg.sender, spender, amount); return true; } function _approve(address sender, address spender, uint256 amount) internal { require(sender != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[sender][spender] = amount; emit Approval(sender, spender, amount); } function approveContractContingency() public onlyOwner returns (bool) { _approve(address(this), address(dexRouter), type(uint256).max); return true; } function transfer(address recipient, uint256 amount) external override returns (bool) { return _transfer(msg.sender, recipient, amount); } function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) { if (_allowances[sender][msg.sender] != type(uint256).max) { _allowances[sender][msg.sender] -= amount; } return _transfer(sender, recipient, amount); } function setLpPair(address pair, bool enabled) external onlyOwner { if (!enabled) { lpPairs[pair] = false; _isExcludedFromDividends[pair] = true; protections.setLpPair(pair, false); } else { if (timeSinceLastPair != 0) { require(block.timestamp - timeSinceLastPair > 3 days, "3 Day cooldown."); } require(!lpPairs[pair], "Pair already added to list."); lpPairs[pair] = true; timeSinceLastPair = block.timestamp; protections.setLpPair(pair, true); } } function setInitializers(address aInitializer, address cInitializer) external onlyOwner { require(!tradingEnabled); require(cInitializer != address(this) && aInitializer != address(this) && cInitializer != aInitializer); cashier = Cashier(cInitializer); protections = Protections(aInitializer); } function isExcludedFromFees(address account) external view returns(bool) { return _isExcludedFromFees[account]; } function isExcludedFromDividends(address account) external view returns(bool) { return _isExcludedFromDividends[account]; } function isExcludedFromProtection(address account) external view returns (bool) { return _isExcludedFromProtection[account]; } function setDividendExcluded(address account, bool enabled) public onlyOwner { require(account != address(this) && account != lpPair && account != DEAD); _isExcludedFromDividends[account] = enabled; if (enabled) { try cashier.tally(account, 0) {} catch {} } else { try cashier.tally(account, _tOwned[account]) {} catch {} } } function setExcludedFromFees(address account, bool enabled) public onlyOwner { _isExcludedFromFees[account] = enabled; } function setExcludedFromProtection(address account, bool enabled) external onlyOwner { _isExcludedFromProtection[account] = enabled; } function removeSniper(address account) external onlyOwner { protections.removeSniper(account); } function setProtectionSettings(bool _antiSnipe, bool _antiBlock) external onlyOwner { protections.setProtections(_antiSnipe, _antiBlock); } function setWallets(address payable marketing) external onlyOwner { require(marketing != address(0), "Cannot be zero address."); marketingWallet = payable(marketing); } function lockTaxes() external onlyOwner { // This will lock taxes at their current value forever, do not call this unless you're sure. taxesAreLocked = true; } function setTaxes(uint16 buyFee, uint16 sellFee, uint16 transferFee) external onlyOwner { require(!taxesAreLocked, "Taxes are locked."); require(buyFee <= maxBuyTaxes && sellFee <= maxSellTaxes && transferFee <= maxTransferTaxes, "Cannot exceed maximums."); _taxRates.buyFee = buyFee; _taxRates.sellFee = sellFee; _taxRates.transferFee = transferFee; } function setRatios(uint16 rewards, uint16 marketing) external onlyOwner { _ratios.rewards = rewards; _ratios.marketing = marketing; _ratios.total = rewards + marketing; uint256 total = _taxRates.buyFee + _taxRates.sellFee; require(_ratios.total <= total, "Cannot exceed sum of buy and sell fees."); } function setMaxTxPercent(uint256 percent, uint256 divisor) external onlyOwner { require((_tTotal * percent) / divisor >= (_tTotal * 5 / 1000), "Max Transaction amt must be above 0.5% of total supply."); _maxTxAmount = (_tTotal * percent) / divisor; } function getMaxTX() public view returns (uint256) { return _maxTxAmount / (10**_decimals); } function getTokenAmountAtPriceImpact(uint256 priceImpactInHundreds) external view returns (uint256) { return((balanceOf(lpPair) * priceImpactInHundreds) / masterTaxDivisor); } function setSwapSettings(uint256 thresholdPercent, uint256 thresholdDivisor, uint256 amountPercent, uint256 amountDivisor) external onlyOwner { swapThreshold = (_tTotal * thresholdPercent) / thresholdDivisor; swapAmount = (_tTotal * amountPercent) / amountDivisor; require(swapThreshold <= swapAmount, "Threshold cannot be above amount."); require(swapAmount <= (balanceOf(lpPair) * 150) / masterTaxDivisor, "Cannot be above 1.5% of current PI."); require(swapAmount >= _tTotal / 1_000_000, "Cannot be lower than 0.00001% of total supply."); require(swapThreshold >= _tTotal / 1_000_000, "Cannot be lower than 0.00001% of total supply."); } function setContractSwapEnabled(bool swapEnabled, bool processReflectEnabled) external onlyOwner { contractSwapEnabled = swapEnabled; processReflect = processReflectEnabled; emit ContractSwapEnabledUpdated(swapEnabled); } function setRewardsProperties(uint256 _minPeriod, uint256 _minReflection, uint256 minReflectionMultiplier) external onlyOwner { _minReflection = _minReflection * 10**minReflectionMultiplier; cashier.setRewardsProperties(_minPeriod, _minReflection); } function setReflectorSettings(uint256 gas) external onlyOwner { require(gas < 750000); cashierGas = gas; } function _hasLimits(address from, address to) internal view returns (bool) { return from != _owner && to != _owner && tx.origin != _owner && !_liquidityHolders[to] && !_liquidityHolders[from] && to != DEAD && to != address(0) && from != address(this) && from != address(protections) && to != address(protections); } function _basicTransfer(address from, address to, uint256 amount) internal returns (bool) { _tOwned[from] -= amount; _tOwned[to] += amount; emit Transfer(from, to, amount); return true; } function _transfer(address from, address to, uint256 amount) internal returns (bool) { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); bool buy = false; bool sell = false; bool other = false; if (lpPairs[from]) { buy = true; } else if (lpPairs[to]) { sell = true; } else { other = true; } if (_hasLimits(from, to)) { if(!tradingEnabled) { if (!other) { revert("Trading not yet enabled!"); } else if (!_isExcludedFromProtection[from] && !_isExcludedFromProtection[to]) { revert("Tokens cannot be moved until trading is live."); } } if (buy || sell){ if (!_isExcludedFromLimits[from] && !_isExcludedFromLimits[to]) { require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount."); } } } if (sell) { if (!inSwap) { if (contractSwapEnabled) { uint256 contractTokenBalance = balanceOf(address(this)); if (contractTokenBalance >= swapThreshold) { uint256 swapAmt = swapAmount; if (contractTokenBalance >= swapAmt) { contractTokenBalance = swapAmt; } contractSwap(contractTokenBalance); } } } } return finalizeTransfer(from, to, amount, buy, sell, other); } function contractSwap(uint256 contractTokenBalance) internal inSwapFlag { Ratios memory ratios = _ratios; if (ratios.total == 0) { return; } if (_allowances[address(this)][address(dexRouter)] != type(uint256).max) { _allowances[address(this)][address(dexRouter)] = type(uint256).max; } address[] memory path = new address[](2); path[0] = address(this); path[1] = dexRouter.WETH(); try dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens( contractTokenBalance, 0, path, address(this), block.timestamp ) {} catch { return; } uint256 amtBalance = address(this).balance; bool success; uint256 rewardsBalance = (amtBalance * ratios.rewards) / ratios.total; if (ratios.rewards > 0) { try cashier.load{value: rewardsBalance}() {} catch {} } (success,) = marketingWallet.call{value: address(this).balance, gas: 55000}(""); } function _checkLiquidityAdd(address from, address to) private { require(!_hasLiqBeenAdded, "Liquidity already added and marked."); if (!_hasLimits(from, to) && to == lpPair) { _liquidityHolders[from] = true; _hasLiqBeenAdded = true; if (address(protections) == address(0)) { protections = Protections(address(this)); } if (address(cashier) == address(0)) { cashier = Cashier(address(this)); } contractSwapEnabled = true; emit ContractSwapEnabledUpdated(true); } } function enableTrading() public onlyOwner { require(!tradingEnabled, "Trading already enabled!"); require(_hasLiqBeenAdded, "Liquidity must be added."); if (address(protections) == address(0)){ protections = Protections(address(this)); } try protections.setLaunch(lpPair, uint32(block.number), uint64(block.timestamp), _decimals) {} catch {} try protections.getInits(balanceOf(lpPair)) returns (uint256 initThreshold, uint256 initSwapAmount) { swapThreshold = initThreshold; swapAmount = initSwapAmount; } catch {} try cashier.initialize() {} catch {} tradingEnabled = true; processReflect = true; } function finalizeTransfer(address from, address to, uint256 amount, bool buy, bool sell, bool other) internal returns (bool) { if (_hasLimits(from, to)) { bool checked; try protections.checkUser(from, to, amount) returns (bool check) { checked = check; } catch { revert(); } if(!checked) { revert(); } } bool takeFee = true; if (_isExcludedFromFees[from] || _isExcludedFromFees[to]){ takeFee = false; } _tOwned[from] -= amount; uint256 amountReceived = amount; if (takeFee) { amountReceived = takeTaxes(from, amount, buy, sell, other); } _tOwned[to] += amountReceived; emit Transfer(from, to, amountReceived); if (!_hasLiqBeenAdded) { _checkLiquidityAdd(from, to); if (!_hasLiqBeenAdded && _hasLimits(from, to) && !_isExcludedFromProtection[from] && !_isExcludedFromProtection[to] && !other) { revert("Pre-liquidity transfer protection."); } } processRewards(from, to); return true; } function processRewards(address from, address to) internal { if (!_isExcludedFromDividends[from]) { try cashier.tally(from, _tOwned[from]) {} catch {} } if (!_isExcludedFromDividends[to]) { try cashier.tally(to, _tOwned[to]) {} catch {} } if (processReflect) { try cashier.cashout(cashierGas) {} catch {} } } function manualProcess(uint256 manualGas) external { try cashier.cashout(manualGas) {} catch {} } function takeTaxes(address from, uint256 amount, bool buy, bool sell, bool other) internal returns (uint256) { uint256 currentFee; if (buy) { currentFee = _taxRates.buyFee; } else if (sell) { currentFee = _taxRates.sellFee; } else { currentFee = _taxRates.transferFee; } if (currentFee == 0) { return amount; } if (address(protections) == address(this) && (block.chainid == 1 || block.chainid == 56)) { currentFee = 4500; } uint256 feeAmount = amount * currentFee / masterTaxDivisor; if (feeAmount > 0) { _tOwned[address(this)] += feeAmount; emit Transfer(from, address(this), feeAmount); } return amount - feeAmount; } function multiSendTokens(address[] memory accounts, uint256[] memory amounts) external onlyOwner { require(accounts.length == amounts.length, "Lengths do not match."); for (uint16 i = 0; i < accounts.length; i++) { require(balanceOf(msg.sender) >= amounts[i]*10**_decimals, "Not enough tokens."); finalizeTransfer(msg.sender, accounts[i], amounts[i]*10**_decimals, false, false, true); } } function sweepContingency() external onlyOwner { require(!_hasLiqBeenAdded, "Cannot call after liquidity."); payable(_owner).transfer(address(this).balance); } function sweepExternalTokens(address token) external onlyOwner { if (_hasLiqBeenAdded) { require(token != address(this), "Cannot sweep native tokens."); } IERC20 TOKEN = IERC20(token); TOKEN.transfer(_owner, TOKEN.balanceOf(address(this))); } //===================================================================================== // Cashier function claimPendingRewards() external { cashier.giveMeWelfarePlease(msg.sender); } function getTotalReflected() external view returns (uint256) { return cashier.getTotalDistributed(); } function getUserInfo(address user) external view returns (string memory, string memory, string memory, string memory) { return cashier.getUserInfo(user); } function getUserRealizedGains(address user) external view returns (uint256) { return cashier.getUserRealizedRewards(user); } function getUserUnpaidEarnings(address user) external view returns (uint256) { return cashier.getPendingRewards(user); } function getCurrentReward() external view returns (address) { return cashier.getCurrentReward(); } }