Contract Address Details

0xd32b9E96d0E8b46c0DB3f308Ec41BE94B06b13C4

Contract Name
TaxOfficeV2
Creator
0xafa414ā€“714ba5 at 0x11c56cā€“6b6b75
Balance
0 MOVR
Tokens
Fetching tokens...
Transactions
2 Transactions
Transfers
0 Transfers
Gas Used
47,541
Last Balance Update
3132180
Contract name:
TaxOfficeV2




Optimization enabled
true
Compiler version
v0.8.4+commit.c7e474f2




Optimization runs
200
EVM Version
default




Verified at
2022-01-14 15:55:09.675199Z

Constructor Arguments

00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a0000000000000000000000005c2da48241d3be9626dd0c48081c76dbb6d1046e000000000000000000000000aa30ef758139ae4a7f798112902bf6d65612045f

Arg [0] (address) : 0x98878b06940ae243284ca214f92bb71a2b032b8a
Arg [1] (address) : 0x5c2da48241d3be9626dd0c48081c76dbb6d1046e
Arg [2] (address) : 0xaa30ef758139ae4a7f798112902bf6d65612045f

              

Contract source code

// Sources flattened with hardhat v2.8.0 https://hardhat.org
// File @openzeppelin/contracts/utils/math/SafeMath.sol@v4.4.1
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)
pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
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);
}
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
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);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @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) {
return a + b;
}
/**
* @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 a - b;
}
/**
* @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) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting 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 a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting 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) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* 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) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
// File @openzeppelin/contracts/utils/Context.sol@v4.4.1
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File @openzeppelin/contracts/access/Ownable.sol@v4.4.1
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @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);
}
}
// File contracts/owner/Operator.sol
pragma solidity ^0.8.0;
contract Operator is Context, Ownable {
address private _operator;
event OperatorTransferred(address indexed previousOperator, address indexed newOperator);
constructor () {
_operator = _msgSender();
emit OperatorTransferred(address(0), _operator);
}
function operator() public view returns (address) {
return _operator;
}
modifier onlyOperator() {
require(_operator == msg.sender, "operator: caller is not the operator");
_;
}
function isOperator() public view returns (bool) {
return _msgSender() == _operator;
}
function transferOperator(address newOperator_) public onlyOwner {
_transferOperator(newOperator_);
}
function _transferOperator(address newOperator_) internal {
require(newOperator_ != address(0), "operator: zero address given for new operator");
emit OperatorTransferred(address(0), newOperator_);
_operator = newOperator_;
}
}
// File contracts/interfaces/ITaxable.sol
pragma solidity ^0.8.0;
interface ITaxable {
function setTaxTiersTwap(uint8 _index, uint256 _value) external returns (bool);
function setTaxTiersRate(uint8 _index, uint256 _value) external returns (bool);
function enableAutoCalculateTax() external;
function disableAutoCalculateTax() external;
function setTaxCollectorAddress(address _taxCollectorAddress) external;
function isAddressExcluded(address _address) external returns (bool);
function setTaxRate(uint256 _taxRate) external;
function setBurnThreshold(uint256 _burnThreshold) external;
function excludeAddress(address _address) external returns (bool);
function includeAddress(address _address) external returns (bool);
function setAthenaOracle(address _athenaOracle) external;
function setTaxOffice(address _taxOffice) external;
function taxRate() external view returns (uint256);
}
// File contracts/interfaces/IUniswapV2Router.sol
pragma solidity ^0.8.0;
interface IUniswapV2Router {
function factory() external pure returns (address);
function WETH() external pure returns (address);
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 addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
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);
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
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 swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
// File contracts/interfaces/IERC20.sol
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File contracts/TaxOfficeV2.sol
pragma solidity ^0.8.0;
/*
_____ __ .__ _____
/ _ \_/ |_| |__ ____ ____ _____ / \ ____ ____ ____ ___.__.
/ /_\ \ __\ | \_/ __ \ / \\__ \ / \ / \ / _ \ / \_/ __ < | |
/ | \ | | Y \ ___/| | \/ __ \_ / Y ( <_> ) | \ ___/\___ |
\____|__ /__| |___| /\___ >___| (____ / \____|__ /\____/|___| /\___ > ____|
\/ \/ \/ \/ \/ \/ \/ \/\/
http://athena.money
*/
contract TaxOfficeV2 is Operator {
using SafeMath for uint256;
address public athena;
address public wftm;
address public uniRouter;
constructor (address _wftm, address _athena, address _uniRouter) {
wftm = _wftm;
athena = _athena;
uniRouter = _uniRouter;
}
mapping(address => bool) public taxExclusionEnabled;
function setTaxTiersTwap(uint8 _index, uint256 _value) public onlyOperator returns (bool) {
return ITaxable(athena).setTaxTiersTwap(_index, _value);
}
function setTaxTiersRate(uint8 _index, uint256 _value) public onlyOperator returns (bool) {
return ITaxable(athena).setTaxTiersRate(_index, _value);
}
function enableAutoCalculateTax() public onlyOperator {
ITaxable(athena).enableAutoCalculateTax();
}
function disableAutoCalculateTax() public onlyOperator {
ITaxable(athena).disableAutoCalculateTax();
}
function setTaxRate(uint256 _taxRate) public onlyOperator {
ITaxable(athena).setTaxRate(_taxRate);
}
function setBurnThreshold(uint256 _burnThreshold) public onlyOperator {
ITaxable(athena).setBurnThreshold(_burnThreshold);
}
function setTaxCollectorAddress(address _taxCollectorAddress) public onlyOperator {
ITaxable(athena).setTaxCollectorAddress(_taxCollectorAddress);
}
function excludeAddressFromTax(address _address) external onlyOperator returns (bool) {
return _excludeAddressFromTax(_address);
}
function _excludeAddressFromTax(address _address) private returns (bool) {
if (!ITaxable(athena).isAddressExcluded(_address)) {
return ITaxable(athena).excludeAddress(_address);
}
}
function includeAddressInTax(address _address) external onlyOperator returns (bool) {
return _includeAddressInTax(_address);
}
function _includeAddressInTax(address _address) private returns (bool) {
if (ITaxable(athena).isAddressExcluded(_address)) {
return ITaxable(athena).includeAddress(_address);
}
}
function taxRate() external view returns (uint256) {
return ITaxable(athena).taxRate();
}
function addLiquidityTaxFree(
address token,
uint256 amtAthena,
uint256 amtToken,
uint256 amtAthenaMin,
uint256 amtTokenMin
)
external
returns (
uint256,
uint256,
uint256
)
{
require(amtAthena != 0 && amtToken != 0, "amounts can't be 0");
_excludeAddressFromTax(msg.sender);
IERC20(athena).transferFrom(msg.sender, address(this), amtAthena);
IERC20(token).transferFrom(msg.sender, address(this), amtToken);
_approveTokenIfNeeded(athena, uniRouter);
_approveTokenIfNeeded(token, uniRouter);
_includeAddressInTax(msg.sender);
uint256 resultAmtAthena;
uint256 resultAmtToken;
uint256 liquidity;
(resultAmtAthena, resultAmtToken, liquidity) = IUniswapV2Router(uniRouter).addLiquidity(
athena,
token,
amtAthena,
amtToken,
amtAthenaMin,
amtTokenMin,
msg.sender,
block.timestamp
);
if(amtAthena.sub(resultAmtAthena) > 0) {
IERC20(athena).transfer(msg.sender, amtAthena.sub(resultAmtAthena));
}
if(amtToken.sub(resultAmtToken) > 0) {
IERC20(token).transfer(msg.sender, amtToken.sub(resultAmtToken));
}
return (resultAmtAthena, resultAmtToken, liquidity);
}
function addLiquidityETHTaxFree(
uint256 amtAthena,
uint256 amtAthenaMin,
uint256 amtFtmMin
)
external
payable
returns (
uint256,
uint256,
uint256
)
{
require(amtAthena != 0 && msg.value != 0, "amounts can't be 0");
_excludeAddressFromTax(msg.sender);
IERC20(athena).transferFrom(msg.sender, address(this), amtAthena);
_approveTokenIfNeeded(athena, uniRouter);
_includeAddressInTax(msg.sender);
uint256 resultAmtAthena;
uint256 resultAmtFtm;
uint256 liquidity;
(resultAmtAthena, resultAmtFtm, liquidity) = IUniswapV2Router(uniRouter).addLiquidityETH{value: msg.value}(
athena,
amtAthena,
amtAthenaMin,
amtFtmMin,
msg.sender,
block.timestamp
);
if(amtAthena.sub(resultAmtAthena) > 0) {
IERC20(athena).transfer(msg.sender, amtAthena.sub(resultAmtAthena));
}
return (resultAmtAthena, resultAmtFtm, liquidity);
}
function setTaxableAthenaOracle(address _athenaOracle) external onlyOperator {
ITaxable(athena).setAthenaOracle(_athenaOracle);
}
function transferTaxOffice(address _newTaxOffice) external onlyOperator {
ITaxable(athena).setTaxOffice(_newTaxOffice);
}
function taxFreeTransferFrom(
address _sender,
address _recipient,
uint256 _amt
) external {
require(taxExclusionEnabled[msg.sender], "Address not approved for tax free transfers");
_excludeAddressFromTax(_sender);
IERC20(athena).transferFrom(_sender, _recipient, _amt);
_includeAddressInTax(_sender);
}
function setTaxExclusionForAddress(address _address, bool _excluded) external onlyOperator {
taxExclusionEnabled[_address] = _excluded;
}
function _approveTokenIfNeeded(address _token, address _router) private {
if (IERC20(_token).allowance(address(this), _router) == 0) {
IERC20(_token).approve(_router, type(uint256).max);
}
}
}

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_wftm","internalType":"address"},{"type":"address","name":"_athena","internalType":"address"},{"type":"address","name":"_uniRouter","internalType":"address"}]},{"type":"event","name":"OperatorTransferred","inputs":[{"type":"address","name":"previousOperator","internalType":"address","indexed":true},{"type":"address","name":"newOperator","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"payable","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"addLiquidityETHTaxFree","inputs":[{"type":"uint256","name":"amtAthena","internalType":"uint256"},{"type":"uint256","name":"amtAthenaMin","internalType":"uint256"},{"type":"uint256","name":"amtFtmMin","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"addLiquidityTaxFree","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"amtAthena","internalType":"uint256"},{"type":"uint256","name":"amtToken","internalType":"uint256"},{"type":"uint256","name":"amtAthenaMin","internalType":"uint256"},{"type":"uint256","name":"amtTokenMin","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"athena","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"disableAutoCalculateTax","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"enableAutoCalculateTax","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"excludeAddressFromTax","inputs":[{"type":"address","name":"_address","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"includeAddressInTax","inputs":[{"type":"address","name":"_address","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isOperator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"operator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBurnThreshold","inputs":[{"type":"uint256","name":"_burnThreshold","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTaxCollectorAddress","inputs":[{"type":"address","name":"_taxCollectorAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTaxExclusionForAddress","inputs":[{"type":"address","name":"_address","internalType":"address"},{"type":"bool","name":"_excluded","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTaxRate","inputs":[{"type":"uint256","name":"_taxRate","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"setTaxTiersRate","inputs":[{"type":"uint8","name":"_index","internalType":"uint8"},{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"setTaxTiersTwap","inputs":[{"type":"uint8","name":"_index","internalType":"uint8"},{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTaxableAthenaOracle","inputs":[{"type":"address","name":"_athenaOracle","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"taxExclusionEnabled","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"taxFreeTransferFrom","inputs":[{"type":"address","name":"_sender","internalType":"address"},{"type":"address","name":"_recipient","internalType":"address"},{"type":"uint256","name":"_amt","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"taxRate","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOperator","inputs":[{"type":"address","name":"newOperator_","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferTaxOffice","inputs":[{"type":"address","name":"_newTaxOffice","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"uniRouter","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"wftm","inputs":[]}]
            

Deployed ByteCode

0x6080604052600436106101815760003560e01c80638da5cb5b116100d1578063cc722c971161008a578063f1efacf911610064578063f1efacf914610478578063f2fde38b14610498578063f4f45b46146104b8578063ff87fc7c146104d857600080fd5b8063cc722c9714610418578063d1d31a3714610438578063e1d8752e1461045857600080fd5b80638da5cb5b1461035a5780639d6b5f2114610378578063a0e47bf614610398578063b87c5a4a146103b8578063be94f86b146103d8578063c6d69a30146103f857600080fd5b806365bbacd91161013e578063715018a611610118578063715018a6146102d457806373baccc0146102e9578063771a3a1d146103175780637fcd79c71461033a57600080fd5b806365bbacd91461027f57806366206ce91461029457806369356d47146102b457600080fd5b806313762bdc1461018657806319db099d146101cb5780631ae6f44d146101eb57806329605e771461020d5780634456eda21461022d578063570ca7351461024d575b600080fd5b34801561019257600080fd5b506101b66101a13660046116c7565b60056020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b3480156101d757600080fd5b506101b66101e63660046116c7565b6104ed565b3480156101f757600080fd5b5061020b6102063660046116c7565b610534565b005b34801561021957600080fd5b5061020b6102283660046116c7565b6105c1565b34801561023957600080fd5b506001546001600160a01b031633146101b6565b34801561025957600080fd5b506001546001600160a01b03165b6040516001600160a01b0390911681526020016101c2565b34801561028b57600080fd5b5061020b6105f7565b3480156102a057600080fd5b506101b66102af366004611837565b61068b565b3480156102c057600080fd5b5061020b6102cf3660046116c7565b610747565b3480156102e057600080fd5b5061020b6107a3565b6102fc6102f73660046117df565b6107d9565b604080519384526020840192909252908201526060016101c2565b34801561032357600080fd5b5061032c610a54565b6040519081526020016101c2565b34801561034657600080fd5b5061020b61035536600461171c565b610ad6565b34801561036657600080fd5b506000546001600160a01b0316610267565b34801561038457600080fd5b5061020b6103933660046117af565b610b2b565b3480156103a457600080fd5b50600454610267906001600160a01b031681565b3480156103c457600080fd5b506101b66103d3366004611837565b610b86565b3480156103e457600080fd5b506101b66103f33660046116c7565b610bed565b34801561040457600080fd5b5061020b6104133660046117af565b610c23565b34801561042457600080fd5b50600254610267906001600160a01b031681565b34801561044457600080fd5b5061020b6104533660046116c7565b610c7e565b34801561046457600080fd5b5061020b6104733660046116e1565b610cda565b34801561048457600080fd5b506102fc610493366004611752565b610de7565b3480156104a457600080fd5b5061020b6104b33660046116c7565b6111b7565b3480156104c457600080fd5b50600354610267906001600160a01b031681565b3480156104e457600080fd5b5061020b61124f565b6001546000906001600160a01b031633146105235760405162461bcd60e51b815260040161051a906118c0565b60405180910390fd5b61052c826112c9565b90505b919050565b6001546001600160a01b0316331461055e5760405162461bcd60e51b815260040161051a906118c0565b600254604051635be25f6760e01b81526001600160a01b03838116600483015290911690635be25f67906024015b600060405180830381600087803b1580156105a657600080fd5b505af11580156105ba573d6000803e3d6000fd5b5050505050565b6000546001600160a01b031633146105eb5760405162461bcd60e51b815260040161051a9061188b565b6105f4816113ce565b50565b6001546001600160a01b031633146106215760405162461bcd60e51b815260040161051a906118c0565b600260009054906101000a90046001600160a01b03166001600160a01b03166365bbacd96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561067157600080fd5b505af1158015610685573d6000803e3d6000fd5b50505050565b6001546000906001600160a01b031633146106b85760405162461bcd60e51b815260040161051a906118c0565b6002546040516366206ce960e01b815260ff85166004820152602481018490526001600160a01b03909116906366206ce9906044015b602060405180830381600087803b15801561070857600080fd5b505af115801561071c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107409190611793565b9392505050565b6001546001600160a01b031633146107715760405162461bcd60e51b815260040161051a906118c0565b6002546040516369356d4760e01b81526001600160a01b038381166004830152909116906369356d479060240161058c565b6000546001600160a01b031633146107cd5760405162461bcd60e51b815260040161051a9061188b565b6107d76000611492565b565b6000808085158015906107eb57503415155b61082c5760405162461bcd60e51b81526020600482015260126024820152710616d6f756e74732063616e277420626520360741b604482015260640161051a565b610835336114e2565b506002546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061086a90339030908b90600401611867565b602060405180830381600087803b15801561088457600080fd5b505af1158015610898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bc9190611793565b506002546004546108d9916001600160a01b039081169116611598565b6108e2336112c9565b506004805460025460405163f305d71960e01b81526001600160a01b03918216938101939093526024830189905260448301889052606483018790523360848401524260a484015260009283928392169063f305d71990349060c4016060604051808303818588803b15801561095757600080fd5b505af115801561096b573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610990919061180a565b9194509250905060006109a38a856116a4565b1115610a45576002546001600160a01b031663a9059cbb336109c58c876116a4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015610a0b57600080fd5b505af1158015610a1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a439190611793565b505b91989097509095509350505050565b6002546040805163771a3a1d60e01b815290516000926001600160a01b03169163771a3a1d916004808301926020929190829003018186803b158015610a9957600080fd5b505afa158015610aad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad191906117c7565b905090565b6001546001600160a01b03163314610b005760405162461bcd60e51b815260040161051a906118c0565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b6001546001600160a01b03163314610b555760405162461bcd60e51b815260040161051a906118c0565b600254604051639d6b5f2160e01b8152600481018390526001600160a01b0390911690639d6b5f219060240161058c565b6001546000906001600160a01b03163314610bb35760405162461bcd60e51b815260040161051a906118c0565b600254604051635c3e2d2560e11b815260ff85166004820152602481018490526001600160a01b039091169063b87c5a4a906044016106ee565b6001546000906001600160a01b03163314610c1a5760405162461bcd60e51b815260040161051a906118c0565b61052c826114e2565b6001546001600160a01b03163314610c4d5760405162461bcd60e51b815260040161051a906118c0565b600254604051630c6d69a360e41b8152600481018390526001600160a01b039091169063c6d69a309060240161058c565b6001546001600160a01b03163314610ca85760405162461bcd60e51b815260040161051a906118c0565b600254604051631f83ebb560e11b81526001600160a01b03838116600483015290911690633f07d76a9060240161058c565b3360009081526005602052604090205460ff16610d4d5760405162461bcd60e51b815260206004820152602b60248201527f41646472657373206e6f7420617070726f76656420666f72207461782066726560448201526a65207472616e736665727360a81b606482015260840161051a565b610d56836114e2565b506002546040516323b872dd60e01b81526001600160a01b03909116906323b872dd90610d8b90869086908690600401611867565b602060405180830381600087803b158015610da557600080fd5b505af1158015610db9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ddd9190611793565b50610685836112c9565b600080808615801590610df957508515155b610e3a5760405162461bcd60e51b81526020600482015260126024820152710616d6f756e74732063616e277420626520360741b604482015260640161051a565b610e43336114e2565b506002546040516323b872dd60e01b81526001600160a01b03909116906323b872dd90610e7890339030908c90600401611867565b602060405180830381600087803b158015610e9257600080fd5b505af1158015610ea6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eca9190611793565b506040516323b872dd60e01b81526001600160a01b038916906323b872dd90610efb90339030908b90600401611867565b602060405180830381600087803b158015610f1557600080fd5b505af1158015610f29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4d9190611793565b50600254600454610f6a916001600160a01b039081169116611598565b600454610f819089906001600160a01b0316611598565b610f8a336112c9565b506004805460025460405162e8e33760e81b81526001600160a01b03918216938101939093528a81166024840152604483018a9052606483018990526084830188905260a483018790523360c48401524260e484015260009283928392169063e8e337009061010401606060405180830381600087803b15801561100d57600080fd5b505af1158015611021573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611045919061180a565b9194509250905060006110588b856116a4565b11156110fa576002546001600160a01b031663a9059cbb3361107a8d876116a4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156110c057600080fd5b505af11580156110d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f89190611793565b505b60006111068a846116a4565b11156111a6576001600160a01b038b1663a9059cbb336111268c866116a4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561116c57600080fd5b505af1158015611180573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a49190611793565b505b919a90995090975095505050505050565b6000546001600160a01b031633146111e15760405162461bcd60e51b815260040161051a9061188b565b6001600160a01b0381166112465760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161051a565b6105f481611492565b6001546001600160a01b031633146112795760405162461bcd60e51b815260040161051a906118c0565b600260009054906101000a90046001600160a01b03166001600160a01b031663ff87fc7c6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561067157600080fd5b60025460405163ebca1bd960e01b81526001600160a01b038381166004830152600092169063ebca1bd990602401602060405180830381600087803b15801561131157600080fd5b505af1158015611325573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113499190611793565b1561052f576002546040516393995d4b60e01b81526001600160a01b038481166004830152909116906393995d4b906024015b602060405180830381600087803b15801561139657600080fd5b505af11580156113aa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052c9190611793565b6001600160a01b03811661143a5760405162461bcd60e51b815260206004820152602d60248201527f6f70657261746f723a207a65726f206164647265737320676976656e20666f7260448201526c103732bb9037b832b930ba37b960991b606482015260840161051a565b6040516001600160a01b038216906000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60025460405163ebca1bd960e01b81526001600160a01b038381166004830152600092169063ebca1bd990602401602060405180830381600087803b15801561152a57600080fd5b505af115801561153e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115629190611793565b61052f57600254604051631bac736760e11b81526001600160a01b03848116600483015290911690633758e6ce9060240161137c565b604051636eb1769f60e11b81523060048201526001600160a01b03828116602483015283169063dd62ed3e9060440160206040518083038186803b1580156115df57600080fd5b505afa1580156115f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161791906117c7565b6116a05760405163095ea7b360e01b81526001600160a01b038281166004830152600019602483015283169063095ea7b390604401602060405180830381600087803b15801561166657600080fd5b505af115801561167a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169e9190611793565b505b5050565b60006107408284611904565b80356001600160a01b038116811461052f57600080fd5b6000602082840312156116d8578081fd5b610740826116b0565b6000806000606084860312156116f5578182fd5b6116fe846116b0565b925061170c602085016116b0565b9150604084013590509250925092565b6000806040838503121561172e578182fd5b611737836116b0565b9150602083013561174781611927565b809150509250929050565b600080600080600060a08688031215611769578081fd5b611772866116b0565b97602087013597506040870135966060810135965060800135945092505050565b6000602082840312156117a4578081fd5b815161074081611927565b6000602082840312156117c0578081fd5b5035919050565b6000602082840312156117d8578081fd5b5051919050565b6000806000606084860312156117f3578283fd5b505081359360208301359350604090920135919050565b60008060006060848603121561181e578283fd5b8351925060208401519150604084015190509250925092565b60008060408385031215611849578182fd5b823560ff81168114611859578283fd5b946020939093013593505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b60008282101561192257634e487b7160e01b81526011600452602481fd5b500390565b80151581146105f457600080fdfea264697066735822122006f1f7b21f724c75a0e2e33d28aca73d5fd564da21bc1426dbae6c84a809cd4764736f6c63430008040033