Transaction Hash:
Block:
21472863 at Dec-24-2024 02:16:11 PM +UTC
Transaction Fee:
0.001508569306325084 ETH
$2.83
Gas Used:
120,514 Gas / 12.517793006 Gwei
Emitted Events:
278 |
TIA.Transfer( from=[Sender] 0x76a8fd56548c7a65f6cad0acfac8f778ccca4f99, to=0x6dae95E36624F9ecFa005eF40d05aEc98833B1bf, value=45000000000000 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x76A8fd56...8cCcA4F99 |
0.004014798903466288 Eth
Nonce: 2
|
0.002506229597141204 Eth
Nonce: 3
| 0.001508569306325084 | ||
0x824E35f7...54E17Ea26 | |||||
0x95222290...5CC4BAfe5
Miner
| (beaverbuild) | 9.12184972227816213 Eth | 9.121986677590662708 Eth | 0.000136955312500578 |
Execution Trace
TIA.transfer( recipient=0x6dae95E36624F9ecFa005eF40d05aEc98833B1bf, amount=50000000000000 ) => ( True )
transfer[TIA (ln:794)]
_transfer[TIA (ln:799)]
_transferFromExcluded[TIA (ln:981)]
_getValues[TIA (ln:1049)]
_getTValues[TIA (ln:1111)]
_getRate[TIA (ln:1112)]
_getCurrentSupply[TIA (ln:1163)]
div[TIA (ln:1164)]
_getRValues[TIA (ln:1117)]
sub[TIA (ln:1050)]
sub[TIA (ln:1051)]
add[TIA (ln:1052)]
_reflectFee[TIA (ln:1053)]
_reBalanceFee[TIA (ln:1054)]
_burnFee[TIA (ln:1055)]
Transfer[TIA (ln:1056)]
_transferToExcluded[TIA (ln:983)]
_getValues[TIA (ln:1028)]
_getTValues[TIA (ln:1111)]
_getRate[TIA (ln:1112)]
_getCurrentSupply[TIA (ln:1163)]
div[TIA (ln:1164)]
_getRValues[TIA (ln:1117)]
sub[TIA (ln:1029)]
add[TIA (ln:1030)]
add[TIA (ln:1031)]
_reflectFee[TIA (ln:1032)]
_reBalanceFee[TIA (ln:1033)]
_burnFee[TIA (ln:1034)]
Transfer[TIA (ln:1035)]
_transferBothExcluded[TIA (ln:985)]
_getValues[TIA (ln:1070)]
_getTValues[TIA (ln:1111)]
_getRate[TIA (ln:1112)]
_getCurrentSupply[TIA (ln:1163)]
div[TIA (ln:1164)]
_getRValues[TIA (ln:1117)]
sub[TIA (ln:1071)]
sub[TIA (ln:1072)]
add[TIA (ln:1073)]
add[TIA (ln:1074)]
_reflectFee[TIA (ln:1075)]
_reBalanceFee[TIA (ln:1076)]
_burnFee[TIA (ln:1077)]
Transfer[TIA (ln:1078)]
_transferStandard[TIA (ln:987)]
_getValues[TIA (ln:1008)]
_getTValues[TIA (ln:1111)]
_getRate[TIA (ln:1112)]
_getCurrentSupply[TIA (ln:1163)]
div[TIA (ln:1164)]
_getRValues[TIA (ln:1117)]
sub[TIA (ln:1009)]
add[TIA (ln:1010)]
_reflectFee[TIA (ln:1011)]
_reBalanceFee[TIA (ln:1012)]
_burnFee[TIA (ln:1013)]
Transfer[TIA (ln:1014)]
_msgSender[TIA (ln:799)]
// SPDX-License-Identifier: Unlicensed // Inspired by https://reflect.finance/ pragma solidity 0.8.0; 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) { return msg.data; } } library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue( address target, bytes memory data, uint256 weiValue, string memory errorMessage ) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: weiValue}( data ); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } interface IERC20 { 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 ); } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); 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 removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } contract TIA is Context, IERC20, Ownable, ReentrancyGuard { using SafeMath for uint256; using Address for address; struct Fees { uint256 reflectFee; uint256 rebalanceFee; uint256 burnFee; } address private TiamondsAddress; address private immutable LCX; IUniswapV2Router02 public immutable UniswapV2Router; // IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); mapping(address => uint256) private _rOwned; mapping(address => uint256) private _tOwned; mapping(address => mapping(address => uint256)) private _allowances; mapping(address => bool) private _isExcludedFromFee; mapping(address => bool) private _isExcluded; address[] private _excluded; address private constant deadWallet = 0x000000000000000000000000000000000000dEaD; uint256 private constant MAX = ~uint256(0); uint256 private constant _tTotal = 1.01e18; uint256 private _rTotal = (MAX - (MAX % _tTotal)); uint256 private _tFeeTotal; string private constant _name = "Tia Token"; string private constant _symbol = "TIA"; uint8 private constant _decimals = 9; uint256 private _reflectionFee = 50; uint256 private _rebalancingFee = 25; uint256 private _burningFee = 25; event RebalanceAndBurn(uint256, uint256, uint256); event SetTiamondsAddress(address); event ApproveTiamondsAddress(address, address, uint256); event ExcludeAccount(address); event IncludeAccount(address); event ChangeReflectionFee(uint256); event ChangeReBalancingFee(uint256); event ChangeBurnFee(uint256); event ExcludeFromFee(address); event IncludeInFee(address); constructor(address _lcxAddress, address _uniswapV2Address) { require(_lcxAddress != address(0), "Address should not be zero address"); require(_uniswapV2Address != address(0), "Address should not be zero address"); LCX = _lcxAddress; UniswapV2Router = IUniswapV2Router02(_uniswapV2Address); _rOwned[owner()] = _rTotal; _isExcludedFromFee[owner()] = true; _isExcludedFromFee[address(this)] = true; _isExcludedFromFee[_uniswapV2Address] = true; emit Transfer(address(0), owner(), _tTotal); } function name() external pure returns (string memory) { return _name; } function symbol() external pure returns (string memory) { return _symbol; } function decimals() external pure returns (uint8) { return _decimals; } function totalSupply() external pure override returns (uint256) { return _tTotal; } function balanceOf(address account) public view override returns (uint256) { if (_isExcluded[account]) return _tOwned[account]; return tokenFromReflection(_rOwned[account]); } function transfer(address recipient, uint256 amount) external override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) external view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) external override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function setTiamondsAddress(address _tiamonds) external onlyOwner { require(_tiamonds != address(0), "Address should not be zero address"); TiamondsAddress = address(_tiamonds); emit SetTiamondsAddress(_tiamonds); } function approveTiamondSC() external onlyOwner returns (bool) { _approve(msg.sender, TiamondsAddress, _tTotal); emit ApproveTiamondsAddress(msg.sender, TiamondsAddress, _tTotal); return true; } function transferFrom( address sender, address recipient, uint256 amount ) external override returns (bool) { _transfer(sender, recipient, amount); _approve( sender, _msgSender(), _allowances[sender][_msgSender()].sub( amount, "ERC20: transfer amount exceeds allowance" ) ); return true; } function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue) ); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender].sub( subtractedValue, "ERC20: decreased allowance below zero" ) ); return true; } function isExcluded(address account) external view returns (bool) { return _isExcluded[account]; } function totalFees() external view returns (uint256) { return _tFeeTotal; } function reflect(uint256 tAmount) external { address sender = _msgSender(); require( !_isExcluded[sender], "Excluded addresses cannot call this function" ); (uint256 rAmount, , , , ) = _getValues(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rTotal = _rTotal.sub(rAmount); _tFeeTotal = _tFeeTotal.add(tAmount); } function reflectionFromToken(uint256 tAmount, bool deductTransferFee) external view returns (uint256) { require(tAmount <= _tTotal, "Amount must be less than supply"); if (!deductTransferFee) { (uint256 rAmount, , , , ) = _getValues(tAmount); return rAmount; } else { (, uint256 rTransferAmount, , , ) = _getValues(tAmount); return rTransferAmount; } } function tokenFromReflection(uint256 rAmount) public view returns (uint256) { require( rAmount <= _rTotal, "Amount must be less than total reflections" ); uint256 currentRate = _getRate(); return rAmount.div(currentRate); } function excludeAccount(address account) external onlyOwner { require(!_isExcluded[account], "Account is already excluded"); if (_rOwned[account] > 0) { _tOwned[account] = tokenFromReflection(_rOwned[account]); } _isExcluded[account] = true; _excluded.push(account); emit ExcludeAccount(account); } function includeAccount(address account) external onlyOwner { require(_isExcluded[account], "Account is not excluded"); for (uint256 i = 0; i < _excluded.length; i++) { if (_excluded[i] == account) { _excluded[i] = _excluded[_excluded.length - 1]; _tOwned[account] = 0; _isExcluded[account] = false; _excluded.pop(); break; } } emit IncludeAccount(account); } function _approve( address owner, address spender, uint256 amount ) private { 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 _transfer( address sender, address recipient, uint256 amount ) private { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); uint256 currentReflectionFee = _reflectionFee; uint256 currentRebalancingFee = _rebalancingFee; uint256 currentBurningFee = _burningFee; if (_isExcludedFromFee[sender] || _isExcludedFromFee[recipient]) { _reflectionFee = 0; _rebalancingFee = 0; _burningFee = 0; } if (_isExcluded[sender] && !_isExcluded[recipient]) { _transferFromExcluded(sender, recipient, amount); } else if (!_isExcluded[sender] && _isExcluded[recipient]) { _transferToExcluded(sender, recipient, amount); } else if (_isExcluded[sender] && _isExcluded[recipient]) { _transferBothExcluded(sender, recipient, amount); } else { _transferStandard(sender, recipient, amount); } if (_isExcludedFromFee[sender] || _isExcludedFromFee[recipient]) { _reflectionFee = currentReflectionFee; _rebalancingFee = currentRebalancingFee; _burningFee = currentBurningFee; } } function _transferStandard( address sender, address recipient, uint256 tAmount ) private { ( uint256 rAmount, uint256 rTransferAmount, Fees memory rFees, uint256 tTransferAmount, Fees memory tFees ) = _getValues(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _reflectFee(rFees.reflectFee, tFees.reflectFee); _reBalanceFee(rFees.rebalanceFee, tFees.rebalanceFee); _burnFee(rFees.burnFee, tFees.burnFee); emit Transfer(sender, recipient, tTransferAmount); } function _transferToExcluded( address sender, address recipient, uint256 tAmount ) private { ( uint256 rAmount, uint256 rTransferAmount, Fees memory rFees, uint256 tTransferAmount, Fees memory tFees ) = _getValues(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _reflectFee(rFees.reflectFee, tFees.reflectFee); _reBalanceFee(rFees.rebalanceFee, tFees.rebalanceFee); _burnFee(rFees.burnFee, tFees.burnFee); emit Transfer(sender, recipient, tTransferAmount); } function _transferFromExcluded( address sender, address recipient, uint256 tAmount ) private { ( uint256 rAmount, uint256 rTransferAmount, Fees memory rFees, uint256 tTransferAmount, Fees memory tFees ) = _getValues(tAmount); _tOwned[sender] = _tOwned[sender].sub(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _reflectFee(rFees.reflectFee, tFees.reflectFee); _reBalanceFee(rFees.rebalanceFee, tFees.rebalanceFee); _burnFee(rFees.burnFee, tFees.burnFee); emit Transfer(sender, recipient, tTransferAmount); } function _transferBothExcluded( address sender, address recipient, uint256 tAmount ) private { ( uint256 rAmount, uint256 rTransferAmount, Fees memory rFees, uint256 tTransferAmount, Fees memory tFees ) = _getValues(tAmount); _tOwned[sender] = _tOwned[sender].sub(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _reflectFee(rFees.reflectFee, tFees.reflectFee); _reBalanceFee(rFees.rebalanceFee, tFees.rebalanceFee); _burnFee(rFees.burnFee, tFees.burnFee); emit Transfer(sender, recipient, tTransferAmount); } function _reflectFee(uint256 rReflectFee, uint256 tReflectFee) private { _rTotal = _rTotal.sub(rReflectFee); _tFeeTotal = _tFeeTotal.add(tReflectFee); } function _reBalanceFee(uint256 rRebalanceFee, uint256 tRebalanceFee) private { _rOwned[address(this)] = _rOwned[address(this)].add(rRebalanceFee); if (_isExcluded[address(this)]) _tOwned[address(this)] = _tOwned[address(this)].add(tRebalanceFee); } function _burnFee(uint256 rBurnFee, uint256 tBurnFee) private { _rOwned[address(this)] = _rOwned[address(this)].add(rBurnFee); if (_isExcluded[address(this)]) _tOwned[address(this)] = _tOwned[address(this)].add(tBurnFee); } function _getValues(uint256 tAmount) private view returns ( uint256, uint256, Fees memory, uint256, Fees memory ) { (uint256 tTransferAmount, Fees memory tFees) = _getTValues(tAmount); uint256 currentRate = _getRate(); ( uint256 rAmount, uint256 rTransferAmount, Fees memory rFees ) = _getRValues(tAmount, tFees, currentRate); return (rAmount, rTransferAmount, rFees, tTransferAmount, tFees); } function _getTValues(uint256 tAmount) private view returns (uint256, Fees memory) { Fees memory tFees; tFees.reflectFee = tAmount.mul(_reflectionFee).div(1000); tFees.rebalanceFee = tAmount.mul(_rebalancingFee).div(1000); tFees.burnFee = tAmount.mul(_burningFee).div(1000); uint256 tTransferAmount = tAmount .sub(tFees.reflectFee) .sub(tFees.rebalanceFee) .sub(tFees.burnFee); return (tTransferAmount, tFees); } function _getRValues( uint256 tAmount, Fees memory tFees, uint256 currentRate ) private pure returns ( uint256, uint256, Fees memory ) { Fees memory rFees; uint256 rAmount = tAmount.mul(currentRate); rFees.reflectFee = tFees.reflectFee.mul(currentRate); rFees.rebalanceFee = tFees.rebalanceFee.mul(currentRate); rFees.burnFee = tFees.burnFee.mul(currentRate); uint256 rTransferAmount = rAmount .sub(rFees.reflectFee) .sub(rFees.rebalanceFee) .sub(rFees.burnFee); return (rAmount, rTransferAmount, rFees); } function _getRate() private view returns (uint256) { (uint256 rSupply, uint256 tSupply) = _getCurrentSupply(); return rSupply.div(tSupply); } function _getCurrentSupply() private view returns (uint256, uint256) { uint256 rSupply = _rTotal; uint256 tSupply = _tTotal; for (uint256 i = 0; i < _excluded.length; i++) { if ( _rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply ) return (_rTotal, _tTotal); rSupply = rSupply.sub(_rOwned[_excluded[i]]); tSupply = tSupply.sub(_tOwned[_excluded[i]]); } if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal); return (rSupply, tSupply); } function reflectionFee() external view returns (uint256) { return _reflectionFee; } function changeReflectionFee(uint256 _newFee) external onlyOwner returns (bool) { _reflectionFee = _newFee; emit ChangeReflectionFee(_newFee); return true; } function rebalancingFee() external view returns (uint256) { return _rebalancingFee; } function changeReBalancingFee(uint256 _newFee) external onlyOwner returns (bool) { _rebalancingFee = _newFee; emit ChangeReBalancingFee(_newFee); return true; } function burningFee() external view returns (uint256) { return _burningFee; } function changeBurnFee(uint256 _newFee) external onlyOwner returns (bool) { _burningFee = _newFee; emit ChangeBurnFee(_newFee); return true; } function excludeFromFee(address account) external onlyOwner returns (bool) { require(account != address(0), "ERC20: account is the zero address"); _isExcludedFromFee[account] = true; emit ExcludeFromFee(account); return true; } function includeInFee(address account) external onlyOwner returns (bool) { require(account != address(0), "ERC20: account is the zero address"); _isExcludedFromFee[account] = false; emit IncludeInFee(account); return true; } function rebalanceAndBurn() external nonReentrant returns (bool) { uint256 balanceInContract = balanceOf(address(this)); uint256 rebalanceAmount = balanceInContract.mul( _rebalancingFee).div(_rebalancingFee.add(_burningFee)); uint256 burnAmount = balanceInContract.mul( _burningFee).div(_rebalancingFee.add(_burningFee)); emit RebalanceAndBurn(balanceInContract, rebalanceAmount, burnAmount); _swap(rebalanceAmount); _burn(burnAmount); return true; } function _swap(uint256 rebalanceAmount) internal { address[] memory path = new address[](2); path[0] = address(this); path[1] = LCX; _approve(address(this), address(UniswapV2Router), rebalanceAmount); UniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens( rebalanceAmount, 0, // Accept any amount path, owner(), block.timestamp ); } function _burn(uint256 burnAmount) internal { _transfer(address(this), deadWallet, burnAmount); emit Transfer(address(this), deadWallet, burnAmount); } }