ETH Price: $1,877.26 (+0.92%)
 

Overview

Max Total Supply

21,000,000,000 BBBTC

Holders

118 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 BBBTC

Value
$0.00
0xe8dddd0240dd12bc9e2250f7963a67cc59773b0a
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Big Back Bitcoin ($BBBTC): The chubbiest meme token on the blockchain & the first rogue AI agent in crypto! Eatin' all the gains with a community-driven, fair, and transparent ecosystem.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BigBackBitcoin

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 9999 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2025-02-10
*/

/**
 * ██████  ███████ ██    ██  ██████  ██      ██    ██ ███████ ██  ██████  ███    ██
 * ██   ██ ██      ██    ██ ██    ██ ██      ██    ██     ██  ██ ██    ██ ████   ██
 * ██████  █████   ██    ██ ██    ██ ██      ██    ██   ██    ██ ██    ██ ██ ██  ██
 * ██   ██ ██       ██  ██  ██    ██ ██      ██    ██  ██     ██ ██    ██ ██  ██ ██
 * ██   ██ ███████   ████    ██████  ███████  ██████  ███████ ██  ██████  ██   ████
 * 
 * @title BigBackBitcoin
 * 
 * @notice This is a SAFU smart contract developed by Revoluzion for BigBackBitcoin.
 * 
 * @dev This smart contract was developed based on the general
 * OpenZeppelin Contracts guidelines where functions revert instead of
 * returning `false` on failure. 
 * 
 * @author Revoluzion Ecosystem
 * @custom:email [email protected]
 * @custom:telegram https://t.me/RevoluzionEcosystem
 * @custom:website https://revoluzion.io
 * @custom:dapp https://revoluzion.app
 *
 * @custom:SAFU Owner 0x516a55FA43339b8e85C1F32C4709E06E93755AFE
 */


// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

/********************************************************************************************
  LIBRARY
********************************************************************************************/

/**
 * @title Address Library
 *
 * @notice Collection of functions providing utility for interacting with addresses.
 */
library Address {

    // ERROR

    /**
     * @notice Error indicating insufficient balance while performing an operation.
     *
     * @param account Address where the balance is insufficient.
     */
    error AddressInsufficientBalance(address account);

    /**
     * @notice Error indicating an attempt to interact with a contract having empty code.
     *
     * @param target Address of the contract with empty code.
     */
    error AddressEmptyCode(address target);

    /**
     * @notice Error indicating a failed internal call.
     */
    error FailedInnerCall();

    // FUNCTION

    /**
     * @notice Calls a function on a specified address without transferring value.
     *
     * @param target Address on which the function will be called.
     * @param data Encoded data of the function call.
     *
     * @return returndata Result of the function call.
     *
     * @dev The `target` must be a contract address and this function must be calling
     * `target` with `data` not reverting.
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0);
    }

    /**
     * @notice Calls a function on a specified address with a specified value.
     *
     * @param target Address on which the function will be called.
     * @param data Encoded data of the function call.
     * @param value Value to be sent in the call.
     *
     * @return returndata Result of the function call.
     *
     * @dev This function ensure that the calling contract actually have Ether balance
     * of at least `value` and that the called Solidity function is a `payable`. Should
     * throw if caller does have insufficient balance.
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        if (address(this).balance < value) {
            revert AddressInsufficientBalance(address(this));
        }
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @notice Verifies the result of a function call and handles errors if any.
     *
     * @param target Address on which the function was called.
     * @param success Boolean indicating the success of the function call.
     * @param returndata Result data of the function call.
     *
     * @return Result of the function call or reverts with an appropriate error.
     *
     * @dev This help to verify that a low level call to smart-contract was successful
     * and will reverts if the target was not a contract. For unsuccessful call, this
     * will bubble up the revert reason (falling back to {FailedInnerCall}). Should
     * throw if both the returndata and target.code length are 0 when `success` is true.
     */
    function verifyCallResultFromTarget(address target, bool success, bytes memory returndata) internal view returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            if (returndata.length == 0 && target.code.length == 0) {
                revert AddressEmptyCode(target);
            }
            return returndata;
        }
    }

    /**
     * @notice Reverts with decoded revert data or FailedInnerCall if no revert
     * data is available.
     *
     * @param returndata Result data of a failed function call.
     *
     * @dev Should throw if returndata length is 0.
     */
    function _revert(bytes memory returndata) private pure {
        if (returndata.length > 0) {
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert FailedInnerCall();
        }
    }
}

/**
 * @title SafeERC20 Library
 *
 * @notice Collection of functions providing utility for safe operations with
 * ERC20 tokens.
 *
 * @dev This is mainly for the usage of token that throw on failure (when the
 * token contract returns false). Tokens that return no value (and instead revert
 * or throw on failure) are also supported where non-reverting calls are assumed
 * to be a successful transaction.
 */
library SafeERC20 {
    
    // LIBRARY

    using Address for address;

    // ERROR

    /**
     * @notice Error indicating a failed operation during an ERC-20 token transfer.
     *
     * @param token Address of the token contract.
     */
    error SafeERC20FailedOperation(address token);

    // FUNCTION

    /**
     * @notice Safely transfers tokens.
     *
     * @param token ERC20 token interface.
     * @param to Address to which the tokens will be transferred.
     * @param value Amount of tokens to be transferred.
     *
     * @dev Transfer `value` amount of `token` from the calling contract to `to` where
     * non-reverting calls are assumed to be successful if `token` returns no value.
     */
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
    }

    /**
     * @notice Calls a function on a token contract and reverts if the operation fails.
     *
     * @param token ERC20 token interface.
     * @param data Encoded data of the function call.
     *
     * @dev This imitates a Solidity high-level call such as a regular function call to
     * a contract while relaxing the requirement on the return value.
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        bytes memory returndata = address(token).functionCall(data);
        if (returndata.length != 0 && !abi.decode(returndata, (bool))) {
            revert SafeERC20FailedOperation(address(token));
        }
    }
}

/********************************************************************************************
  INTERFACE
********************************************************************************************/

/**
 * @title Router Interface
 * 
 * @notice Interface of the Router contract, providing functions to interact with
 * Router contract that is derived from Uniswap V2 Router.
 * 
 * @dev See https://docs.uniswap.org/contracts/v2/reference/smart-contracts/router-02
 */
interface IRouter {

    // FUNCTION

    /**
     * @notice Get the address of the Wrapped Ether (WETH) token.
     * 
     * @return The address of the WETH token.
     */
    function WETH() external pure returns (address);
            
    /**
     * @notice Get the address of the linked Factory contract.
     * 
     * @return The address of the Factory contract.
     */
    function factory() external pure returns (address);

    /**
     * @notice Swaps an exact amount of tokens for ETH, supporting
     * tokens that implement fee-on-transfer mechanisms.
     * 
     * @param amountIn The exact amount of input tokens for the swap.
     * @param amountOutMin The minimum acceptable amount of ETH to receive in the swap.
     * @param path An array of token addresses representing the token swap path.
     * @param to The recipient address that will receive the swapped ETH.
     * @param deadline The timestamp by which the transaction must be executed to be
     * considered valid.
     * 
     * @dev This function swaps a specific amount of tokens for ETH on a specified path, 
     * ensuring a minimum amount of output ETH.
     */
    function swapExactTokensForETHSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external;

    /**
     * @notice Swaps a precise amount of ETH for tokens, supporting tokens with fee-on-transfer mechanisms.
     * 
     * @param amountOutMin The minimum acceptable amount of output tokens expected from the swap.
     * @param path An array of token addresses representing the token swap path.
     * @param to The recipient address that will receive the swapped tokens.
     * @param deadline The timestamp by which the transaction must be executed to be considered valid.
     * 
     * @dev This function performs a direct swap of a specified amount of ETH for tokens based on the provided
     * path and minimum acceptable output token amount.
     */
    function swapExactETHForTokensSupportingFeeOnTransferTokens(uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external payable;
}

/**
 * @title Factory Interface
 * 
 * @notice Interface of the Factory contract, providing functions to interact with
 * Factory contract that is derived from Uniswap V2 Factory.
 * 
 * @dev See https://docs.uniswap.org/contracts/v2/reference/smart-contracts/factory
 */
interface IFactory {

    // FUNCTION

    /**
     * @notice Create a new token pair for two given tokens on Uniswap V2-based factory.
     * 
     * @param tokenA The address of the first token.
     * @param tokenB The address of the second token.
     * 
     * @return pair The address of the created pair for the given tokens.
     */
    function createPair(address tokenA, address tokenB) external returns (address pair);

    /**
     * @notice Get the address of the pair for two tokens on the decentralized exchange.
     * 
     * @param tokenA The address of the first token.
     * @param tokenB The address of the second token.
     * 
     * @return pair The address of the pair corresponding to the provided tokens.
     */
    function getPair(address tokenA, address tokenB) external view returns (address pair);
}

/**
 * @title Pair Interface
 * 
 * @notice Interface of the Pair contract in a decentralized exchange based on the
 * Pair contract that is derived from Uniswap V2 Pair.
 * 
 * @dev See https://docs.uniswap.org/contracts/v2/reference/smart-contracts/pair
 */
interface IPair {

    // FUNCTION

    /**
     * @notice Get the address of the first token in the pair.
     * 
     * @return The address of the first token.
     */
    function token0() external view returns (address);

    /**
     * @notice Get the address of the second token in the pair.
     * 
     * @return The address of the second token.
     */
    function token1() external view returns (address);
}

/**
 * @title ERC20 Token Standard Interface
 * 
 * @notice Interface of the ERC-20 standard token as defined in the ERC.
 * 
 * @dev See https://eips.ethereum.org/EIPS/eip-20
 */
interface IERC20 {
    
    // EVENT
    
    /**
     * @notice Emitted when `value` tokens are transferred from
     * one account (`from`) to another (`to`).
     * 
     * @param from The address tokens are transferred from.
     * @param to The address tokens are transferred to.
     * @param value The amount of tokens transferred.
     * 
     * @dev The `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @notice Emitted when the allowance of a `spender` for an `owner`
     * is set by a call to {approve}.
     * 
     * @param owner The address allowing `spender` to spend on their behalf.
     * @param spender The address allowed to spend tokens on behalf of `owner`.
     * @param value The allowance amount set for `spender`.
     * 
     * @dev The `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    // FUNCTION

    /**
     * @notice Returns the value of tokens in existence.
     * 
     * @return The value of the total supply of tokens.
     * 
     * @dev This should get the total token supply.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @notice Returns the value of tokens owned by `account`.
     * 
     * @param account The address to query the balance for.
     * 
     * @return The token balance of `account`.
     * 
     * @dev This should get the token balance of a specific account.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @notice Moves a `value` amount of tokens from the caller's account to `to`.
     * 
     * @param to The address to transfer tokens to.
     * @param value The amount of tokens to be transferred.
     * 
     * @return A boolean indicating whether the transfer was successful or not.
     * 
     * @dev This should transfer tokens to a specified address and emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @notice Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}.
     * 
     * @param owner The address allowing `spender` to spend on their behalf.
     * @param spender The address allowed to spend tokens on behalf of `owner`.
     * 
     * @return The allowance amount for `spender`.
     * 
     * @dev The return value should be zero by default and
     * changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @notice Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     * 
     * @param spender The address allowed to spend tokens on behalf of the sender.
     * @param value The allowance amount for `spender`.
     * 
     * @return A boolean indicating whether the approval was successful or not.
     * 
     * @dev This should approve `spender` to spend a specified amount of tokens
     * on behalf of the sender and emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @notice Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's allowance.
     * 
     * @param from The address to transfer tokens from.
     * @param to The address to transfer tokens to.
     * @param value The amount of tokens to be transferred.
     * 
     * @return A boolean indicating whether the transfer was successful or not.
     * 
     * @dev This should transfer tokens from one address to another after
     * spending caller's allowance and emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

/**
 * @title ERC20 Token Metadata Interface
 * 
 * @notice Interface for the optional metadata functions of the ERC-20 standard as defined in the ERC.
 * 
 * @dev It extends the IERC20 interface. See https://eips.ethereum.org/EIPS/eip-20
 */
interface IERC20Metadata is IERC20 {

    // FUNCTION
    
    /**
     * @notice Returns the name of the token.
     * 
     * @return The name of the token as a string.
     */
    function name() external view returns (string memory);

    /**
     * @notice Returns the symbol of the token.
     * 
     * @return The symbol of the token as a string.
     */
    function symbol() external view returns (string memory);

    /**
     * @notice Returns the number of decimals used to display the token.
     * 
     * @return The number of decimals as a uint8.
     */
    function decimals() external view returns (uint8);
}

/**
 * @title ERC20 Token Standard Error Interface
 * 
 * @notice Interface of the ERC-6093 custom errors that defined common errors
 * related to the ERC-20 standard token functionalities.
 * 
 * @dev See https://eips.ethereum.org/EIPS/eip-6093
 */
interface IERC20Errors {
    
    // ERROR

    /**
     * @notice Error indicating that the `sender` has inssufficient `balance` for the operation.
     * 
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     *
     * @dev The `needed` value is required to inform user on the needed amount.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @notice Error indicating that the `sender` is invalid for the operation.
     * 
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);
    
    /**
     * @notice Error indicating that the `receiver` is invalid for the operation.
     * 
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);
    
    /**
     * @notice Error indicating that the `spender` does not have enough `allowance` for the operation.
     * 
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     * 
     * @dev The `needed` value is required to inform user on the needed amount.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
    
    /**
     * @notice Error indicating that the `approver` is invalid for the approval operation.
     * 
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @notice Error indicating that the `spender` is invalid for the allowance operation.
     * 
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @title Common Error Interface
 * 
 * @notice Interface of the common errors not specific to ERC-20 functionalities.
 */
interface ICommonError {

    // ERROR

    /**
     * @notice Error indicating that the `current` address cannot be used in this context.
     * 
     * @param current Address used in the context.
     */
    error CannotUseCurrentAddress(address current);

    /**
     * @notice Error indicating that the `current` value cannot be used in this context.
     * 
     * @param current Value used in the context.
     */
    error CannotUseCurrentValue(uint256 current);

    /**
     * @notice Error indicating that the `current` state cannot be used in this context.
     * 
     * @param current Boolean state used in the context.
     */
    error CannotUseCurrentState(bool current);

    /**
     * @notice Error indicating that the `invalid` address provided is not a valid address for this context.
     * 
     * @param invalid Address used in the context.
     */
    error InvalidAddress(address invalid);

    /**
     * @notice Error indicating that the `invalid` value provided is not a valid value for this context.
     * 
     * @param invalid Value used in the context.
     */
    error InvalidValue(uint256 invalid);
}

/********************************************************************************************
  ACCESS
********************************************************************************************/

/**
 * @title Ownable Contract
 * 
 * @notice Abstract contract module implementing ownership functionality through
 * inheritance as a basic access control mechanism, where there is an owner account
 * that can be granted exclusive access to specific functions.
 * 
 * @dev The initial owner is set to the address provided by the deployer and can
 * later be changed with {transferOwnership}.
 */
abstract contract Ownable {

    // DATA

    address private _owner;

    // MODIFIER

    /**
     * @notice Modifier that allows access only to the contract owner.
     *
     * @dev Should throw if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    // ERROR

    /**
     * @notice Error indicating that the `account` is not authorized to perform an operation.
     * 
     * @param account Address used to perform the operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @notice Error indicating that the provided `owner` address is invalid.
     * 
     * @param owner Address used to perform the operation.
     * 
     * @dev Should throw if called by an invalid owner account such as address(0) as an example.
     */
    error OwnableInvalidOwner(address owner);

    // CONSTRUCTOR

    /**
     * @notice Initializes the contract setting the `initialOwner` address provided by
     * the deployer as the initial owner.
     * 
     * @param initialOwner The address to set as the initial owner.
     *
     * @dev Should throw an error if called with address(0) as the `initialOwner`.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }
    
    // EVENT
    
    /**
     * @notice Emitted when ownership of the contract is transferred.
     * 
     * @param previousOwner The address of the previous owner.
     * @param newOwner The address of the new owner.
     */
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    // FUNCTION

    /**
     * @notice Get the address of the smart contract owner.
     * 
     * @return The address of the current owner.
     *
     * @dev Should return the address of the current smart contract owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }
    
    /**
     * @notice Checks if the caller is the owner and reverts if not.
     * 
     * @dev Should throw if the sender is not the current owner of the smart contract.
     */
    function _checkOwner() internal view virtual {
        if (owner() != msg.sender) {
            revert OwnableUnauthorizedAccount(msg.sender);
        }
    }
    
    /**
     * @notice Allows the current owner to renounce ownership and make the
     * smart contract ownerless.
     * 
     * @dev This function can only be called by the current owner and will
     * render all `onlyOwner` functions inoperable.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
    
    /**
     * @notice Allows the current owner to transfer ownership of the smart contract
     * to `newOwner` address.
     * 
     * @param newOwner The address to transfer ownership to.
     *
     * @dev This function can only be called by the current owner and will render
     * all `onlyOwner` functions inoperable to him/her. Should throw if called with
     * address(0) as the `newOwner`.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }
    
    /**
     * @notice Internal function to transfer ownership of the smart contract
     * to `newOwner` address.
     * 
     * @param newOwner The address to transfer ownership to.
     *
     * @dev This function replace current owner address stored as _owner with 
     * the address of the `newOwner`.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

/********************************************************************************************
  TOKEN
********************************************************************************************/

/**
 * @title BigBackBitcoin Token Contract
 *
 * @notice BigBackBitcoin is an extended version of ERC-20 standard token that
 * includes additional functionalities for ownership control, trading enabling,
 * and exemption management.
 * 
 * @dev Implements ERC20Metadata, ERC20Errors, and CommonError interfaces, and
 * extends Ownable contract.
 */
contract BigBackBitcoin is Ownable, IERC20Metadata, IERC20Errors, ICommonError {

    // LIBRARY

    using SafeERC20 for IERC20;
    using Address for address;

    // DATA

    IRouter public router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

    string private constant NAME = "Big Back Bitcoin";
    string private constant SYMBOL = "BBBTC";

    uint8 private constant DECIMALS = 18;
    
    uint256 public constant DENOMINATOR = 100_000;
    uint256 public constant MINLIMIT = 500;

    uint256 private _totalSupply;

    uint256 public maxTransactionLimit = 500;
    uint256 public tradeStartTime = 0;
    uint256 public lastAutoBurnTime = 0;
    uint256 public autoBurnTriggerTime = 1461 days;
    uint256 public totalTriggerZeusBuyback = 0;
    uint256 public lastTriggerZeusTimestamp = 0;
    
    address public constant SAFU_OWNER = 0x516a55FA43339b8e85C1F32C4709E06E93755AFE;

    address public projectOwner = 0xD2cb8AD52b28D85Dd8B2a5e2167Fd53be779B589;
    
    address public pair;
    
    bool public tradeEnabled = false;
    bool public isMaxLimitEnabled = false;

    // MAPPING

    mapping(address account => uint256) private _balances;
    mapping(address account => mapping(address spender => uint256)) private _allowances;
    
    mapping(address pair => bool) public isPairLP;
    mapping(address account => bool) public isLimitExempt;

    // MODIFIER

    /**
     * @notice Modifier that allows access only to the SAFU owner.
     *
     * @dev Should throw if called by any account other than the SAFU owner.
     */
    modifier onlySafuOwner() {
        if (msg.sender != SAFU_OWNER) {
            revert OnlySAFUOwnerAllowed();
        }
        _;
    }

    // ERROR

    /**
     * @notice Error indicating that the receiver cannot initiate transfer of Ether.
     * 
     * @dev Should throw if called by the receiver address.
     */
    error ReceiverCannotInitiateTransferEther();

    /**
     * @notice Error indicating that only SAFU owner can use the function.
     */
    error OnlySAFUOwnerAllowed();

    /**
     * @notice Error indicating that trading has not been enabled yet.
     */
    error TradeNotYetEnabled();

    /**
     * @notice Error indicating that the native token cannot be withdrawn from the smart contract.
     */
    error CannotWithdrawNativeToken();

    /**
     * @notice Error indicating that the limit exceeded.
     */
    error ExceedLimit();

    /**
     * @notice Error indicating that trading has already been enabled at a specific `timestamp`.
     * 
     * @param currentState The current state of trading.
     * @param timestamp The timestamp when trading was enabled.
     *
     * @dev The `currentState` is required to inform user of the current state of trading.
     */
    error TradeAlreadyEnabled(bool currentState, uint256 timestamp);

    // CONSTRUCTOR

    /**
     * @notice Constructs the BigBackBitcoin contract and initializes both owner and
     * project owner addresses. Deployer will receive 21,000,000,000 tokens after
     * the smart contract was deployed.
     * 
     * @dev If deployer is not the project owner, then deployer will be exempted
     * from fees along with the project owner and router.
     */
    constructor() Ownable (msg.sender) {      
        isLimitExempt[msg.sender] = true;
        isLimitExempt[projectOwner] = true;

        _mint(msg.sender, 21_000_000_000 * 10**DECIMALS);

        pair = IFactory(router.factory()).createPair(address(this), router.WETH());
        isPairLP[pair] = true;
        isLimitExempt[pair] = true;
    }

    // EVENT

    /**
     * @notice Emitted when trading is enabled for the contract.
     * 
     * @param caller The address that triggered the trading enablement.
     * @param timestamp The timestamp when trading was enabled.
     */
    event TradeEnabled(address caller, uint256 timestamp);

    /**
     * @notice Emitted when the router address is updated.
     * 
     * @param oldRouter The address of the old router.
     * @param newRouter The address of the new router.
     * @param caller The address that triggered the router update.
     * @param timestamp The timestamp when the update occurred.
     */
    event UpdateRouter(address oldRouter, address newRouter, address caller, uint256 timestamp);

    /**
     * @notice Emitted upon setting the status of a specific address type.
     * 
     * @param addressType The type of address status being modified.
     * @param account The address of the account whose status is being updated.
     * @param oldStatus The previous exemption status.
     * @param newStatus The new exemption status.
     * @param caller The address that triggered the status update.
     * @param timestamp The timestamp when the update occurred.
     */
    event SetAddressState(string addressType, address account, bool oldStatus, bool newStatus, address caller, uint256 timestamp); 
    
    /**
     * @notice Emitted upon setting the amount of a specific value type.
     * 
     * @param valueType The type of value being modified.
     * @param oldValue The previous value.
     * @param newValue The new value.
     * @param caller The address that triggered the value update.
     * @param timestamp The timestamp when the update occurred.
     */
    event UpdateValue(string valueType, uint256 oldValue, uint256 newValue, address caller, uint256 timestamp);

    /**
     * @notice Emitted upon setting the new state of a specific state type.
     * 
     * @param stateType The type of state being modified.
     * @param oldState The previous state.
     * @param newState The new state.
     * @param caller The address that triggered the state update.
     * @param timestamp The timestamp when the update occurred.
     */
    event UpdateState(string stateType, bool oldState, bool newState, address caller, uint256 timestamp);

    // FUNCTION

    /* General */
    
    /**
     * @notice Allows the contract to receive Ether.
     * 
     * @dev This is a required feature to have in order to allow the smart contract
     * to be able to receive ether from the swap.
     */
    receive() external payable {}

    /**
     * @notice Withdraws tokens or Ether from the contract to a specified address.
     * 
     * @param tokenAddress The address of the token to withdraw.
     * @param amount The amount of tokens or Ether to withdraw.
     * 
     * @dev You need to use address(0) as `tokenAddress` to withdraw Ether and
     * use 0 as `amount` to withdraw the whole balance amount in the smart contract.
     * Anyone can trigger this function to send the fund to the `SAFU_OWNER`.
     * Only `SAFU_OWNER` address will not be able to trigger this function to
     * withdraw Ether from the smart contract by himself/herself.
     */
    function wTokens(address tokenAddress, uint256 amount) external {
        uint256 toTransfer = amount;
        address receiver = SAFU_OWNER;
        
        if (tokenAddress == address(this)) {
            revert CannotWithdrawNativeToken();
        } else if (tokenAddress == address(0)) {
            if (amount == 0) {
                toTransfer = address(this).balance;
            }
            if (msg.sender == receiver) {
                revert ReceiverCannotInitiateTransferEther();
            }
            payable(receiver).transfer(toTransfer);
        } else {
            if (amount == 0) {
                toTransfer = IERC20(tokenAddress).balanceOf(address(this));
            }
            IERC20(tokenAddress).safeTransfer(receiver, toTransfer);
        }
    }

    /**
     * @notice Enables trading functionality for the token contract.
     * 
     * @dev Only the smart contract owner can trigger this function and should throw if
     * trading already enabled. Can only be triggered once and emits a TradeEnabled event
     * upon successful transaction. This function also set necessary states and emitting
     * an event upon success.
     */
    function enableTrading() external onlyOwner {
        if (tradeEnabled) {
            revert TradeAlreadyEnabled(tradeEnabled, tradeStartTime);
        }
        tradeEnabled = true;
        isMaxLimitEnabled = true;
        tradeStartTime = block.timestamp;

        emit TradeEnabled(msg.sender, block.timestamp);
    }

    /**
     * @notice Calculates the circulating supply of the token.
     * 
     * @return The circulating supply of the token.
     * 
     * @dev This should only return the token supply that is in circulation,
     * which excluded the potential balance that could be in both address(0)
     * and address(0xdead) that are already known to not be out of circulation.
     */
    function circulatingSupply() public view returns (uint256) {
        return totalSupply() - balanceOf(address(0xdead)) - balanceOf(address(0));
    }

    /* Update */
    
    /**
     * @notice Allow the owner to set the status of a specified LP pair.
     * 
     * @param lpPair The LP pair address.
     * @param newStatus The new status of the LP pair.
     * 
     * @dev This function will emits the SetAddressState event and should throw
     * if triggered with the current state for the address or if the lpPair
     * address is not a valid pair address.
     */
    function setPairLP(address lpPair, bool newStatus) external onlyOwner {
        if (isPairLP[lpPair] == newStatus) {
            revert CannotUseCurrentState(newStatus);
        }
        if (IPair(lpPair).token0() != address(this) && IPair(lpPair).token1() != address(this)) {
            revert InvalidAddress(lpPair);
        }
        bool oldStatus = isPairLP[lpPair];
        isPairLP[lpPair] = newStatus;
        emit SetAddressState("isPairLP", lpPair, oldStatus, newStatus, msg.sender, block.timestamp);
    }

    /**
     * @notice Updates the router address used for token swaps.
     * 
     * @param newRouter The address of the new router contract.
     * 
     * @dev This should also generate the pair address using the factory of the `newRouter` if
     * the address of the pair on the new router's factory is address(0).If the new pair address's
     * isPairLP status is not yet set to true, this function will automatically set it to true.
     */
    function updateRouter(address newRouter) external onlySafuOwner {
        if (newRouter == address(router)) {
            revert CannotUseCurrentAddress(newRouter);
        }

        address oldRouter = address(router);
        router = IRouter(newRouter);

        emit UpdateRouter(oldRouter, newRouter, msg.sender, block.timestamp);

        if (address(IFactory(router.factory()).getPair(address(this), router.WETH())) == address(0)) {
            pair = IFactory(router.factory()).createPair(address(this), router.WETH());
            if (!isPairLP[pair]) {
                isPairLP[pair] = true;
            }
        }
    }

    /**
     * @notice Updates the user's transaction limit exemption.
     * 
     * @param user The user address.
     * @param newState The new exemption state.
     */
    function updateLimitExempt(address user, bool newState) external onlyOwner {
        if (isLimitExempt[user] == newState) {
            revert CannotUseCurrentState(newState);
        }
        bool oldState = isLimitExempt[user];
        isLimitExempt[user] = newState;
        emit SetAddressState("isLimitExempt", user, oldState, newState, msg.sender, block.timestamp);
    }

    /**
     * @notice Updates the use of transaction limit.
     * 
     * @param newState The new exemption state.
     */
    function updateUseMaxLimit(bool newState) external onlyOwner {
        if (isMaxLimitEnabled == newState) {
            revert CannotUseCurrentState(newState);
        }
        bool oldState = isMaxLimitEnabled;
        isMaxLimitEnabled = newState;
        emit UpdateState("isMaxLimitEnabled", oldState, newState, msg.sender, block.timestamp);
    }

    /**
     * @notice Updates the maximum transaction limit.
     * 
     * @param newLimit The new limit.
     */
    function updateMaxTransactionLimit(uint256 newLimit) external onlyOwner {
        if (maxTransactionLimit == newLimit || newLimit < MINLIMIT) {
            revert InvalidValue(newLimit);
        }
        uint256 oldLimit = maxTransactionLimit;
        maxTransactionLimit = newLimit;
        emit UpdateValue("maxTransactionLimit", oldLimit, newLimit, msg.sender, block.timestamp);
    }


    /* Buyback */

    /**
     * @notice Triggers a buyback with a specified amount,
     * limited to 5 ether per transaction.
     * 
     * @param amount The amount of ETH to be used for the buyback.
     * 
     * @dev This can only be triggered by the smart contract owner.
     */
    function triggerZeusBuyback(uint256 amount) external onlyOwner {
        if (amount > 5 ether) {
            revert InvalidValue(5 ether);
        }
        totalTriggerZeusBuyback += amount;
        lastTriggerZeusTimestamp = block.timestamp;
        buyTokens(amount, address(0xdead));
    }

    /**
     * @notice Initiates a buyback by swapping ETH for tokens.
     * 
     * @param amount The amount of ETH to be used for the buyback.
     * @param to The address to which the bought tokens will be sent.
     */
    function buyTokens(uint256 amount, address to) internal {
        if (msg.sender == address(0xdead)) { revert InvalidAddress(address(0xdead)); }
        address[] memory path = new address[](2);
        path[0] = router.WETH();
        path[1] = address(this);

        router.swapExactETHForTokensSupportingFeeOnTransferTokens{
            value: amount
        } (0, path, to, block.timestamp);
    }

    /* Override */
    
    /**
     * @notice Overrides the {transferOwnership} function to update project owner.
     * 
     * @param newOwner The address of the new owner.
     * 
     * @dev Should throw if the `newOwner` is set to the current owner address or address(0xdead).
     * This overrides function is just an extended version of the original {transferOwnership}
     * function. See {Ownable-transferOwnership} for more information.
     */
    function transferOwnership(address newOwner) public override onlyOwner {
        if (newOwner == owner()) {
            revert CannotUseCurrentAddress(newOwner);
        }
        if (newOwner == address(0xdead)) {
            revert InvalidAddress(newOwner);
        }
        projectOwner = newOwner;
        super.transferOwnership(newOwner);
    }

    /* ERC20 Standard */

    /**
     * @notice Returns the name of the token.
     * 
     * @return The name of the token.
     * 
     * @dev This is usually a longer version of the name.
     */
    function name() public view virtual returns (string memory) {
        return NAME;
    }

    /**
     * @notice Returns the symbol of the token.
     * 
     * @return The symbol of the token.
     * 
     * @dev This is usually a shorter version of the name.
     */
    function symbol() public view virtual returns (string memory) {
        return SYMBOL;
    }

    /**
     * @notice Returns the number of decimals used for token display purposes.
     * 
     * @return The number of decimals.
     * 
     * @dev This is purely used for user representation of the amount and does not
     * affect any of the arithmetic of the smart contract including, but not limited
     * to {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return DECIMALS;
    }

    /**
     * @notice Returns the total supply of tokens.
     * 
     * @return The total supply of tokens.
     * 
     * @dev See {IERC20-totalSupply} for more information.
     */
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    /**
     * @notice Returns the balance of tokens for a given account.
     * 
     * @param account The address of the account to check.
     * 
     * @return The token balance of the account.
     * 
     * @dev See {IERC20-balanceOf} for more information.
     */
    function balanceOf(address account) public view virtual returns (uint256) {
        return _balances[account];
    }

    /**
     * @notice Transfers tokens from the sender to a specified recipient.
     * 
     * @param to The address of the recipient.
     * @param value The amount of tokens to transfer.
     * 
     * @return A boolean indicating whether the transfer was successful or not.
     * 
     * @dev See {IERC20-transfer} for more information.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address provider = msg.sender;
        _transfer(provider, to, value);
        return true;
    }

    /**
     * @notice Returns the allowance amount that a spender is allowed to spend on behalf of a provider.
     * 
     * @param provider The address allowing spending.
     * @param spender The address allowed to spend tokens.
     * 
     * @return The allowance amount for the spender.
     * 
     * @dev See {IERC20-allowance} for more information.
     */
    function allowance(address provider, address spender) public view virtual returns (uint256) {
        return _allowances[provider][spender];
    }
    
    /**
     * @notice Approves a spender to spend a certain amount of tokens on behalf of the sender.
     * 
     * @param spender The address allowed to spend tokens.
     * @param value The allowance amount for the spender.
     * 
     * @return A boolean indicating whether the approval was successful or not.
     * 
     * @dev See {IERC20-approve} for more information.
     */
    function approve(address spender, uint256 value) public virtual returns (bool) {
        address provider = msg.sender;
        _approve(provider, spender, value);
        return true;
    }

    /**
     * @notice Transfers tokens from one address to another on behalf of a spender.
     * 
     * @param from The address to transfer tokens from.
     * @param to The address to transfer tokens to.
     * @param value The amount of tokens to transfer.
     * 
     * @return A boolean indicating whether the transfer was successful or not.
     * 
     * @dev See {IERC20-transferFrom} for more information.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = msg.sender;
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @notice Internal function to handle token transfers with additional checks.
     * 
     * @param from The address tokens are transferred from.
     * @param to The address tokens are transferred to.
     * @param value The amount of tokens to transfer.
     * 
     * @dev This internal function is equivalent to {transfer}, and thus can be used for other functions
     * such as implementing automatic token fees, slashing mechanisms, etc. Since this function is not
     * virtual, {_update} should be overridden instead. This function can only be called if the address
     * for `from` and `to` are not address(0) and the sender should at least have a balance of `value`.
     * It also enforces various conditions including validations for trade status, fees, exemptions,
     * and redemption.
     * 
     * IMPORTANT: Since this project implement logic for trading restriction, the transaction will only
     * go through if the trade was already enabled or if the trade is still disabled. Please note that
     * this feature could significantly impact the audit score as since it possesses the potential for
     * malicious exploitation, which might affect the received score. However, since this contract will
     * be a development for SAFU smart contract under Pinksale, this could be omitted.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        if (
            !tradeEnabled &&
            (!isLimitExempt[from] && !isLimitExempt[to])
        ) {
            revert TradeNotYetEnabled();
        }
        if (isMaxLimitEnabled && !isLimitExempt[from] && value > totalSupply() * maxTransactionLimit / DENOMINATOR) {
            revert ExceedLimit();
        }
        if ((block.timestamp - lastAutoBurnTime) >= autoBurnTriggerTime && balanceOf(address(this)) > 0) {
            uint256 burning = balanceOf(address(this));
            if (burning > totalSupply() * 2_100 / DENOMINATOR) {
                burning = totalSupply() * 2_100 / DENOMINATOR;
            }
            _update(address(this), address(0xdead), burning);
        }

        _update(from, to, value);
    }

    /**
     * @notice Internal function to update token balances during transfers.
     * 
     * @param from The address tokens are transferred from.
     * @param to The address tokens are transferred to.
     * @param value The amount of tokens to transfer.
     * 
     * @dev This function is used internally to transfer a `value` amount of token from
     * `from` address to `to` address. This function is also used for mints if `from`
     * is the zero address and for burns if `to` is the zero address.
     * 
     * IMPORTANT: All customizations that are required for transfers, mints, and burns
     * should be done by overriding this function.

     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                _totalSupply -= value;
            }
        } else {
            unchecked {
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }
 
    /**
     * @notice Internal function to mint tokens and update the total supply.
     * 
     * @param account The address to mint tokens to.
     * @param value The amount of tokens to mint.
     * 
     * @dev The `account` address cannot be address(0) because it does not make any sense to mint to it.
     * Since this function is not virtual, {_update} should be overridden instead for customization.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }
 
    /**
     * @notice Internal function to set an allowance for a `spender` to spend a specific `value` of tokens
     * on behalf of a `provider`.
     * 
     * @param provider The address allowing spending.
     * @param spender The address allowed to spend tokens.
     * @param value The allowance amount for the spender.
     * 
     * @dev This internal function is equivalent to {approve}, and thus can be used for other functions
     * such as setting automatic allowances for certain subsystems, etc. 
     * 
     * IMPORTANT: This function internally calls {_approve} with the emitEvent parameter set to `true`.
     */
    function _approve(address provider, address spender, uint256 value) internal {
        _approve(provider, spender, value, true);
    }

    /**
     * @notice Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     * 
     * @param provider The address allowing spending.
     * @param spender The address allowed to spend tokens.
     * @param value The allowance amount for the spender.
     * @param emitEvent A boolean indicating whether to emit the Approval event.
     * 
     * @dev This internal function is equivalent to {approve}, and thus can be used for other functions
     * such as setting automatic allowances for certain subsystems, etc. This function can only be called
     * if the address for `provider` and `spender` are not address(0). If `emitEvent` is set to `true`,
     * this function will emits the Approval event.
     */
    function _approve(address provider, address spender, uint256 value, bool emitEvent) internal virtual {
        if (provider == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[provider][spender] = value;
        if (emitEvent) {
            emit Approval(provider, spender, value);
        }
    }

    /**
     * @notice Internal function to decrease allowance when tokens are spent.
     * 
     * @param provider The address allowing spending.
     * @param spender The address allowed to spend tokens.
     * @param value The amount of tokens spent.
     * 
     * @dev If the allowance value for the `spender` is infinite/the max value of uint256,
     * this function will notupdate the allowance value. Should throw if not enough allowance
     * is available. On all occasion, this function will not emit an Approval event.
     */
    function _spendAllowance(address provider, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(provider, spender);
        if (currentAllowance < type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(provider, spender, currentAllowance - value, false);
            }
        }
    }

    /* ERC20 Extended */

    /**
     * @notice Increases the allowance granted by the message sender to the spender.
     * 
     * @param spender The address to whom the allowance is being increased.
     * @param value The additional amount by which the allowance is increased.
     * 
     * @return A boolean indicating whether the operation was successful or not.
     * 
     * @dev Allow a spender to spend more tokens on behalf of the message sender and
     * update the allowance accordingly.
     */
    function increaseAllowance(address spender, uint256 value) external virtual returns (bool) {
        address provider = msg.sender;
        uint256 currentAllowance = allowance(provider, spender);
        _approve(provider, spender, currentAllowance + value, true);
        return true;
    }
    
    /**
     * @notice Decreases the allowance granted by the message sender to the spender.
     * 
     * @param spender The address whose allowance is being decreased.
     * @param value The amount by which the allowance is decreased.
     * 
     * @return A boolean indicating whether the operation was successful or not.
     * 
     * @dev Reduce the spender's allowance by a specified amount. Should throw if the
     * current allowance is insufficient.
     */
    function decreaseAllowance(address spender, uint256 value) external virtual returns (bool) {
        address provider = msg.sender;
        uint256 currentAllowance = allowance(provider, spender);
        if (currentAllowance < value) {
            revert ERC20InsufficientAllowance(spender, currentAllowance, value);
        }
        unchecked {
            _approve(provider, spender, currentAllowance - value, true);
        }
        return true;
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"current","type":"address"}],"name":"CannotUseCurrentAddress","type":"error"},{"inputs":[{"internalType":"bool","name":"current","type":"bool"}],"name":"CannotUseCurrentState","type":"error"},{"inputs":[{"internalType":"uint256","name":"current","type":"uint256"}],"name":"CannotUseCurrentValue","type":"error"},{"inputs":[],"name":"CannotWithdrawNativeToken","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"ExceedLimit","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"invalid","type":"address"}],"name":"InvalidAddress","type":"error"},{"inputs":[{"internalType":"uint256","name":"invalid","type":"uint256"}],"name":"InvalidValue","type":"error"},{"inputs":[],"name":"OnlySAFUOwnerAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReceiverCannotInitiateTransferEther","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[{"internalType":"bool","name":"currentState","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TradeAlreadyEnabled","type":"error"},{"inputs":[],"name":"TradeNotYetEnabled","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"addressType","type":"string"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"oldStatus","type":"bool"},{"indexed":false,"internalType":"bool","name":"newStatus","type":"bool"},{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SetAddressState","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TradeEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldRouter","type":"address"},{"indexed":false,"internalType":"address","name":"newRouter","type":"address"},{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"UpdateRouter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"stateType","type":"string"},{"indexed":false,"internalType":"bool","name":"oldState","type":"bool"},{"indexed":false,"internalType":"bool","name":"newState","type":"bool"},{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"UpdateState","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"valueType","type":"string"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"UpdateValue","type":"event"},{"inputs":[],"name":"DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINLIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SAFU_OWNER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoBurnTriggerTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isLimitExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMaxLimitEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"isPairLP","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastAutoBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTriggerZeusTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"projectOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lpPair","type":"address"},{"internalType":"bool","name":"newStatus","type":"bool"}],"name":"setPairLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTriggerZeusBuyback","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradeStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"triggerZeusBuyback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"newState","type":"bool"}],"name":"updateLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"updateMaxTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"updateRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"updateUseMaxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"wTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600180546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d179091556101f46003556000600481905560058190556307861f8060065560078190556008556009805490911673d2cb8ad52b28d85dd8b2a5e2167fd53be779b589179055600a805461ffff60a01b191690553480156200008957600080fd5b503380620000b257604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b620000bd81620002f7565b50336000818152600e60205260408082208054600160ff1991821681179092556009546001600160a01b03168452919092208054909116909117905562000123906200010c6012600a620005cd565b6200011d906404e3b29200620005e5565b62000347565b600160009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000177573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019d9190620005ff565b6001600160a01b031663c9c6539630600160009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000200573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002269190620005ff565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000274573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029a9190620005ff565b600a80546001600160a01b0319166001600160a01b0392831690811782556000908152600d60209081526040808320805460ff19908116600190811790925594549095168352600e90915290208054909116909117905562000640565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216620003735760405163ec442f0560e01b815260006004820152602401620000a9565b620003816000838362000385565b5050565b6001600160a01b038316620003b4578060026000828254620003a891906200062a565b90915550620004289050565b6001600160a01b0383166000908152600b602052604090205481811015620004095760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000a9565b6001600160a01b0384166000908152600b602052604090209082900390555b6001600160a01b038216620004465760028054829003905562000465565b6001600160a01b0382166000908152600b602052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620004ab91815260200190565b60405180910390a3505050565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200050f578160001904821115620004f357620004f3620004b8565b808516156200050157918102915b93841c9390800290620004d3565b509250929050565b6000826200052857506001620005c7565b816200053757506000620005c7565b81600181146200055057600281146200055b576200057b565b6001915050620005c7565b60ff8411156200056f576200056f620004b8565b50506001821b620005c7565b5060208310610133831016604e8410600b8410161715620005a0575081810a620005c7565b620005ac8383620004ce565b8060001904821115620005c357620005c3620004b8565b0290505b92915050565b6000620005de60ff84168362000517565b9392505050565b8082028115828204841417620005c757620005c7620004b8565b6000602082840312156200061257600080fd5b81516001600160a01b0381168114620005de57600080fd5b80820180821115620005c757620005c7620004b8565b6126dd80620006506000396000f3fe6080604052600436106102a45760003560e01c80638a8c523c1161016e578063a9059cbb116100cb578063d64c13bb1161007f578063dd62ed3e11610064578063dd62ed3e146107a4578063f2fde38b146107ea578063f887ea401461080a57600080fd5b8063d64c13bb1461076e578063da4daf711461078e57600080fd5b8063b0c150af116100b0578063b0c150af146106ec578063c851cc321461071c578063d621e8131461073c57600080fd5b8063a9059cbb146106a4578063a9eb77a4146106c457600080fd5b806397e1b9d311610122578063a457c2d711610107578063a457c2d714610631578063a4c6d73c14610651578063a8aa1b311461068457600080fd5b806397e1b9d3146105fb578063a4475ce41461061157600080fd5b8063918f867411610153578063918f8674146105895780639358928b146105a057806395d89b41146105b557600080fd5b80638a8c523c146105425780638da5cb5b1461055757600080fd5b80632c735ef81161021c57806363a95492116101d057806370a08231116101b557806370a08231146104d7578063715018a61461050d578063858a98671461052257600080fd5b806363a95492146104a1578063676c8458146104c157600080fd5b8063313ce56711610201578063313ce567146104455780633950935114610461578063625dd6051461048157600080fd5b80632c735ef8146104195780632ceeafb01461042f57600080fd5b806318160ddd116102735780631f685bac116102585780631f685bac146103c35780632216cc4d146103e357806323b872dd146103f957600080fd5b806318160ddd1461038c57806318783f6c146103a157600080fd5b806306fdde03146102b057806308c4365014610308578063095ea7b3146103485780630cf02e7b1461036857600080fd5b366102ab57005b600080fd5b3480156102bc57600080fd5b5060408051808201909152601081527f426967204261636b20426974636f696e0000000000000000000000000000000060208201525b6040516102ff919061235d565b60405180910390f35b34801561031457600080fd5b506103386103233660046123c3565b600d6020526000908152604090205460ff1681565b60405190151581526020016102ff565b34801561035457600080fd5b506103386103633660046123e0565b61082a565b34801561037457600080fd5b5061037e60065481565b6040519081526020016102ff565b34801561039857600080fd5b5060025461037e565b3480156103ad57600080fd5b506103c16103bc36600461241a565b610844565b005b3480156103cf57600080fd5b506103c16103de3660046123e0565b610972565b3480156103ef57600080fd5b5061037e60055481565b34801561040557600080fd5b50610338610414366004612437565b610b08565b34801561042557600080fd5b5061037e60045481565b34801561043b57600080fd5b5061037e6101f481565b34801561045157600080fd5b50604051601281526020016102ff565b34801561046d57600080fd5b5061033861047c3660046123e0565b610b2e565b34801561048d57600080fd5b506103c161049c366004612478565b610b76565b3480156104ad57600080fd5b506103c16104bc3660046124b1565b610def565b3480156104cd57600080fd5b5061037e60035481565b3480156104e357600080fd5b5061037e6104f23660046123c3565b6001600160a01b03166000908152600b602052604090205490565b34801561051957600080fd5b506103c1610e6d565b34801561052e57600080fd5b506103c161053d366004612478565b610e81565b34801561054e57600080fd5b506103c1610fb9565b34801561056357600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016102ff565b34801561059557600080fd5b5061037e620186a081565b3480156105ac57600080fd5b5061037e6110c5565b3480156105c157600080fd5b5060408051808201909152600581527f424242544300000000000000000000000000000000000000000000000000000060208201526102f2565b34801561060757600080fd5b5061037e60085481565b34801561061d57600080fd5b50600954610571906001600160a01b031681565b34801561063d57600080fd5b5061033861064c3660046123e0565b611135565b34801561065d57600080fd5b50600a54610338907501000000000000000000000000000000000000000000900460ff1681565b34801561069057600080fd5b50600a54610571906001600160a01b031681565b3480156106b057600080fd5b506103386106bf3660046123e0565b6111be565b3480156106d057600080fd5b5061057173516a55fa43339b8e85c1f32c4709e06e93755afe81565b3480156106f857600080fd5b506103386107073660046123c3565b600e6020526000908152604090205460ff1681565b34801561072857600080fd5b506103c16107373660046123c3565b6111cc565b34801561074857600080fd5b50600a546103389074010000000000000000000000000000000000000000900460ff1681565b34801561077a57600080fd5b506103c16107893660046124b1565b6116ae565b34801561079a57600080fd5b5061037e60075481565b3480156107b057600080fd5b5061037e6107bf3660046124ca565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b3480156107f657600080fd5b506103c16108053660046123c3565b611781565b34801561081657600080fd5b50600154610571906001600160a01b031681565b600033610838818585611893565b60019150505b92915050565b61084c6118a5565b801515600a60159054906101000a900460ff161515036108a1576040517f0a7e72d000000000000000000000000000000000000000000000000000000000815281151560048201526024015b60405180910390fd5b600a805482151575010000000000000000000000000000000000000000008181027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff8416179093556040805160a08082526011908201527f69734d61784c696d6974456e61626c656400000000000000000000000000000060c082015260ff94909304939093168015156020840152928201523360608201524260808201527fda986e332f97963bfa4bb220bda255b40296aa680cff592b805c2deb80b1dbf39060e0015b60405180910390a15050565b8073516a55fa43339b8e85c1f32c4709e06e93755afe306001600160a01b038516036109ca576040517faf531b2800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416610a6257826000036109e4574791505b6001600160a01b0381163303610a26576040517fa5eb0da900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015610a5c573d6000803e3d6000fd5b50610b02565b82600003610aee576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015610ac7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aeb91906124f8565b91505b610b026001600160a01b03851682846118fa565b50505050565b600033610b1685828561197a565b610b21858585611a2a565b60019150505b9392505050565b336000818152600c602090815260408083206001600160a01b0387168452909152812054909190610b6b8286610b648785612540565b6001611c9d565b506001949350505050565b610b7e6118a5565b6001600160a01b0382166000908152600d602052604090205481151560ff909116151503610bdc576040517f0a7e72d00000000000000000000000000000000000000000000000000000000081528115156004820152602401610898565b306001600160a01b0316826001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c489190612553565b6001600160a01b031614158015610cd25750306001600160a01b0316826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc69190612553565b6001600160a01b031614155b15610d14576040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610898565b6001600160a01b0382166000818152600d602090815260409182902080548515157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117909255835160c08082526008908201527f6973506169724c5000000000000000000000000000000000000000000000000060e08201529283019490945260ff9093168015159282019290925260608101929092523360808301524260a0830152907f59efce2bd92f91881f8f3ffb8c70709a05ae83006301d26f9fe6170f3e690aea90610100015b60405180910390a1505050565b610df76118a5565b674563918244f40000811115610e43576040517f6072742c000000000000000000000000000000000000000000000000000000008152674563918244f400006004820152602401610898565b8060076000828254610e559190612540565b909155505042600855610e6a8161dead611da4565b50565b610e756118a5565b610e7f6000611f85565b565b610e896118a5565b6001600160a01b0382166000908152600e602052604090205481151560ff909116151503610ee7576040517f0a7e72d00000000000000000000000000000000000000000000000000000000081528115156004820152602401610898565b6001600160a01b0382166000818152600e602090815260409182902080548515157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117909255835160c0808252600d908201527f69734c696d69744578656d70740000000000000000000000000000000000000060e08201529283019490945260ff9093168015159282019290925260608101929092523360808301524260a0830152907f59efce2bd92f91881f8f3ffb8c70709a05ae83006301d26f9fe6170f3e690aea9061010001610de2565b610fc16118a5565b600a5474010000000000000000000000000000000000000000900460ff161561104357600a54600480546040517fe39c1e870000000000000000000000000000000000000000000000000000000081526108989360ff740100000000000000000000000000000000000000009091041692019115158252602082015260400190565b600a80547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790554260048190556040805133815260208101929092527f8b70aa279b24da71d8a874fa0b0ee8f1a587c4fb32b80d87e95cdbdae01b7b4f910160405180910390a1565b600b6020527fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f765461dead60009081527f44433eeeda1d04bdae79f62169cdb2ab0a6af287fa15706d3fafdbac5fac3415546002549192916111269190612570565b6111309190612570565b905090565b336000818152600c602090815260408083206001600160a01b0387168452909152812054909190838110156111af576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024810182905260448101859052606401610898565b610b6b82868684036001611c9d565b600033610838818585611a2a565b3373516a55fa43339b8e85c1f32c4709e06e93755afe14611219576040517feec413b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546001600160a01b039081169082160361126c576040517fa93663690000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610898565b600180546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040805191909216808252602082019390935233918101919091524260608201527fe1cb783288eddc7b22c25642a832d886a558be0dd900747310a34156b9fdcbbb9060800160405180910390a1600154604080517fc45a015500000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163c45a01559160048083019260209291908290030181865afa158015611354573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113789190612553565b6001600160a01b031663e6a4390530600160009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fe9190612553565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa158015611461573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114859190612553565b6001600160a01b0316036116aa57600160009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150a9190612553565b6001600160a01b031663c9c6539630600160009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561156c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115909190612553565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156115f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116199190612553565b600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691821790556000908152600d602052604090205460ff166116aa57600a546001600160a01b03166000908152600d6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b5050565b6116b66118a5565b8060035414806116c757506101f481105b15611701576040517f6072742c00000000000000000000000000000000000000000000000000000000815260048101829052602401610898565b60038054908290556040805160a08082526013908201527f6d61785472616e73616374696f6e4c696d69740000000000000000000000000060c0820152602081018390529081018390523360608201524260808201527f2dc908b86b38cfca773aadc8861ff9f24d2b644be4f8a6c2024cd71e120e5ef59060e001610966565b6117896118a5565b6000546001600160a01b03166001600160a01b0316816001600160a01b0316036117ea576040517fa93663690000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610898565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff21536001600160a01b03821601611857576040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610898565b600980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038316179055610e6a81611fed565b6118a08383836001611c9d565b505050565b336118b86000546001600160a01b031690565b6001600160a01b031614610e7f576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610898565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526118a0908490612041565b6001600160a01b038381166000908152600c60209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015610b025781811015611a1b576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024810182905260448101839052606401610898565b610b0284848484036000611c9d565b6001600160a01b038316611a6d576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610898565b6001600160a01b038216611ab0576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610898565b600a5474010000000000000000000000000000000000000000900460ff16158015611b1857506001600160a01b0383166000908152600e602052604090205460ff16158015611b1857506001600160a01b0382166000908152600e602052604090205460ff16155b15611b4f576040517fab9827ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a547501000000000000000000000000000000000000000000900460ff168015611b9357506001600160a01b0383166000908152600e602052604090205460ff16155b8015611bc15750620186a0600354611baa60025490565b611bb49190612583565b611bbe919061259a565b81115b15611bf8576040517fff5e701c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600654600554611c089042612570565b10158015611c235750306000908152600b6020526040812054115b15611c9257306000908152600b6020526040902054600254620186a090611c4c90610834612583565b611c56919061259a565b811115611c8357620186a0611c6a60025490565b611c7690610834612583565b611c80919061259a565b90505b611c903061dead836120bd565b505b6118a08383836120bd565b6001600160a01b038416611ce0576040517fe602df0500000000000000000000000000000000000000000000000000000000815260006004820152602401610898565b6001600160a01b038316611d23576040517f94280d6200000000000000000000000000000000000000000000000000000000815260006004820152602401610898565b6001600160a01b038085166000908152600c602090815260408083209387168352929052208290558015610b0257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611d9691815260200190565b60405180910390a350505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff21533301611e01576040517f8e4c8aa600000000000000000000000000000000000000000000000000000000815261dead6004820152602401610898565b6040805160028082526060820183526000926020830190803683375050600154604080517fad5c464800000000000000000000000000000000000000000000000000000000815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611e84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea89190612553565b81600081518110611ebb57611ebb6125d5565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611eef57611eef6125d5565b6001600160a01b0392831660209182029290920101526001546040517fb6f9de9500000000000000000000000000000000000000000000000000000000815291169063b6f9de95908590611f4e90600090869088904290600401612604565b6000604051808303818588803b158015611f6757600080fd5b505af1158015611f7b573d6000803e3d6000fd5b5050505050505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611ff56118a5565b6001600160a01b038116612038576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260006004820152602401610898565b610e6a81611f85565b60006120566001600160a01b03841683612200565b9050805160001415801561207b575080806020019051810190612079919061266e565b155b156118a0576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610898565b6001600160a01b0383166120e85780600260008282546120dd9190612540565b909155506121739050565b6001600160a01b0383166000908152600b602052604090205481811015612154576040517fe450d38c0000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024810182905260448101839052606401610898565b6001600160a01b0384166000908152600b602052604090209082900390555b6001600160a01b03821661218f576002805482900390556121ae565b6001600160a01b0382166000908152600b602052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516121f391815260200190565b60405180910390a3505050565b6060610b278383600084600080856001600160a01b03168486604051612226919061268b565b60006040518083038185875af1925050503d8060008114612263576040519150601f19603f3d011682016040523d82523d6000602084013e612268565b606091505b5091509150612278868383612282565b9695505050505050565b60608261229757612292826122f7565b610b27565b81511580156122ae57506001600160a01b0384163b155b156122f0576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610898565b5080610b27565b8051156123075780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8381101561235457818101518382015260200161233c565b50506000910152565b602081526000825180602084015261237c816040850160208701612339565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6001600160a01b0381168114610e6a57600080fd5b6000602082840312156123d557600080fd5b8135610b27816123ae565b600080604083850312156123f357600080fd5b82356123fe816123ae565b946020939093013593505050565b8015158114610e6a57600080fd5b60006020828403121561242c57600080fd5b8135610b278161240c565b60008060006060848603121561244c57600080fd5b8335612457816123ae565b92506020840135612467816123ae565b929592945050506040919091013590565b6000806040838503121561248b57600080fd5b8235612496816123ae565b915060208301356124a68161240c565b809150509250929050565b6000602082840312156124c357600080fd5b5035919050565b600080604083850312156124dd57600080fd5b82356124e8816123ae565b915060208301356124a6816123ae565b60006020828403121561250a57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561083e5761083e612511565b60006020828403121561256557600080fd5b8151610b27816123ae565b8181038181111561083e5761083e612511565b808202811582820484141761083e5761083e612511565b6000826125d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060808201868352602060808185015281875180845260a086019150828901935060005b8181101561264e5784516001600160a01b031683529383019391830191600101612629565b50506001600160a01b039690961660408501525050506060015292915050565b60006020828403121561268057600080fd5b8151610b278161240c565b6000825161269d818460208701612339565b919091019291505056fea2646970667358221220be5cef1523552a4437e910fad72beb0ab92f3c76437f6a90550226b4f0673cce64736f6c63430008120033

Deployed Bytecode

0x6080604052600436106102a45760003560e01c80638a8c523c1161016e578063a9059cbb116100cb578063d64c13bb1161007f578063dd62ed3e11610064578063dd62ed3e146107a4578063f2fde38b146107ea578063f887ea401461080a57600080fd5b8063d64c13bb1461076e578063da4daf711461078e57600080fd5b8063b0c150af116100b0578063b0c150af146106ec578063c851cc321461071c578063d621e8131461073c57600080fd5b8063a9059cbb146106a4578063a9eb77a4146106c457600080fd5b806397e1b9d311610122578063a457c2d711610107578063a457c2d714610631578063a4c6d73c14610651578063a8aa1b311461068457600080fd5b806397e1b9d3146105fb578063a4475ce41461061157600080fd5b8063918f867411610153578063918f8674146105895780639358928b146105a057806395d89b41146105b557600080fd5b80638a8c523c146105425780638da5cb5b1461055757600080fd5b80632c735ef81161021c57806363a95492116101d057806370a08231116101b557806370a08231146104d7578063715018a61461050d578063858a98671461052257600080fd5b806363a95492146104a1578063676c8458146104c157600080fd5b8063313ce56711610201578063313ce567146104455780633950935114610461578063625dd6051461048157600080fd5b80632c735ef8146104195780632ceeafb01461042f57600080fd5b806318160ddd116102735780631f685bac116102585780631f685bac146103c35780632216cc4d146103e357806323b872dd146103f957600080fd5b806318160ddd1461038c57806318783f6c146103a157600080fd5b806306fdde03146102b057806308c4365014610308578063095ea7b3146103485780630cf02e7b1461036857600080fd5b366102ab57005b600080fd5b3480156102bc57600080fd5b5060408051808201909152601081527f426967204261636b20426974636f696e0000000000000000000000000000000060208201525b6040516102ff919061235d565b60405180910390f35b34801561031457600080fd5b506103386103233660046123c3565b600d6020526000908152604090205460ff1681565b60405190151581526020016102ff565b34801561035457600080fd5b506103386103633660046123e0565b61082a565b34801561037457600080fd5b5061037e60065481565b6040519081526020016102ff565b34801561039857600080fd5b5060025461037e565b3480156103ad57600080fd5b506103c16103bc36600461241a565b610844565b005b3480156103cf57600080fd5b506103c16103de3660046123e0565b610972565b3480156103ef57600080fd5b5061037e60055481565b34801561040557600080fd5b50610338610414366004612437565b610b08565b34801561042557600080fd5b5061037e60045481565b34801561043b57600080fd5b5061037e6101f481565b34801561045157600080fd5b50604051601281526020016102ff565b34801561046d57600080fd5b5061033861047c3660046123e0565b610b2e565b34801561048d57600080fd5b506103c161049c366004612478565b610b76565b3480156104ad57600080fd5b506103c16104bc3660046124b1565b610def565b3480156104cd57600080fd5b5061037e60035481565b3480156104e357600080fd5b5061037e6104f23660046123c3565b6001600160a01b03166000908152600b602052604090205490565b34801561051957600080fd5b506103c1610e6d565b34801561052e57600080fd5b506103c161053d366004612478565b610e81565b34801561054e57600080fd5b506103c1610fb9565b34801561056357600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016102ff565b34801561059557600080fd5b5061037e620186a081565b3480156105ac57600080fd5b5061037e6110c5565b3480156105c157600080fd5b5060408051808201909152600581527f424242544300000000000000000000000000000000000000000000000000000060208201526102f2565b34801561060757600080fd5b5061037e60085481565b34801561061d57600080fd5b50600954610571906001600160a01b031681565b34801561063d57600080fd5b5061033861064c3660046123e0565b611135565b34801561065d57600080fd5b50600a54610338907501000000000000000000000000000000000000000000900460ff1681565b34801561069057600080fd5b50600a54610571906001600160a01b031681565b3480156106b057600080fd5b506103386106bf3660046123e0565b6111be565b3480156106d057600080fd5b5061057173516a55fa43339b8e85c1f32c4709e06e93755afe81565b3480156106f857600080fd5b506103386107073660046123c3565b600e6020526000908152604090205460ff1681565b34801561072857600080fd5b506103c16107373660046123c3565b6111cc565b34801561074857600080fd5b50600a546103389074010000000000000000000000000000000000000000900460ff1681565b34801561077a57600080fd5b506103c16107893660046124b1565b6116ae565b34801561079a57600080fd5b5061037e60075481565b3480156107b057600080fd5b5061037e6107bf3660046124ca565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b3480156107f657600080fd5b506103c16108053660046123c3565b611781565b34801561081657600080fd5b50600154610571906001600160a01b031681565b600033610838818585611893565b60019150505b92915050565b61084c6118a5565b801515600a60159054906101000a900460ff161515036108a1576040517f0a7e72d000000000000000000000000000000000000000000000000000000000815281151560048201526024015b60405180910390fd5b600a805482151575010000000000000000000000000000000000000000008181027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff8416179093556040805160a08082526011908201527f69734d61784c696d6974456e61626c656400000000000000000000000000000060c082015260ff94909304939093168015156020840152928201523360608201524260808201527fda986e332f97963bfa4bb220bda255b40296aa680cff592b805c2deb80b1dbf39060e0015b60405180910390a15050565b8073516a55fa43339b8e85c1f32c4709e06e93755afe306001600160a01b038516036109ca576040517faf531b2800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416610a6257826000036109e4574791505b6001600160a01b0381163303610a26576040517fa5eb0da900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015610a5c573d6000803e3d6000fd5b50610b02565b82600003610aee576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015610ac7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aeb91906124f8565b91505b610b026001600160a01b03851682846118fa565b50505050565b600033610b1685828561197a565b610b21858585611a2a565b60019150505b9392505050565b336000818152600c602090815260408083206001600160a01b0387168452909152812054909190610b6b8286610b648785612540565b6001611c9d565b506001949350505050565b610b7e6118a5565b6001600160a01b0382166000908152600d602052604090205481151560ff909116151503610bdc576040517f0a7e72d00000000000000000000000000000000000000000000000000000000081528115156004820152602401610898565b306001600160a01b0316826001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c489190612553565b6001600160a01b031614158015610cd25750306001600160a01b0316826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc69190612553565b6001600160a01b031614155b15610d14576040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610898565b6001600160a01b0382166000818152600d602090815260409182902080548515157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117909255835160c08082526008908201527f6973506169724c5000000000000000000000000000000000000000000000000060e08201529283019490945260ff9093168015159282019290925260608101929092523360808301524260a0830152907f59efce2bd92f91881f8f3ffb8c70709a05ae83006301d26f9fe6170f3e690aea90610100015b60405180910390a1505050565b610df76118a5565b674563918244f40000811115610e43576040517f6072742c000000000000000000000000000000000000000000000000000000008152674563918244f400006004820152602401610898565b8060076000828254610e559190612540565b909155505042600855610e6a8161dead611da4565b50565b610e756118a5565b610e7f6000611f85565b565b610e896118a5565b6001600160a01b0382166000908152600e602052604090205481151560ff909116151503610ee7576040517f0a7e72d00000000000000000000000000000000000000000000000000000000081528115156004820152602401610898565b6001600160a01b0382166000818152600e602090815260409182902080548515157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117909255835160c0808252600d908201527f69734c696d69744578656d70740000000000000000000000000000000000000060e08201529283019490945260ff9093168015159282019290925260608101929092523360808301524260a0830152907f59efce2bd92f91881f8f3ffb8c70709a05ae83006301d26f9fe6170f3e690aea9061010001610de2565b610fc16118a5565b600a5474010000000000000000000000000000000000000000900460ff161561104357600a54600480546040517fe39c1e870000000000000000000000000000000000000000000000000000000081526108989360ff740100000000000000000000000000000000000000009091041692019115158252602082015260400190565b600a80547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1675010100000000000000000000000000000000000000001790554260048190556040805133815260208101929092527f8b70aa279b24da71d8a874fa0b0ee8f1a587c4fb32b80d87e95cdbdae01b7b4f910160405180910390a1565b600b6020527fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f765461dead60009081527f44433eeeda1d04bdae79f62169cdb2ab0a6af287fa15706d3fafdbac5fac3415546002549192916111269190612570565b6111309190612570565b905090565b336000818152600c602090815260408083206001600160a01b0387168452909152812054909190838110156111af576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024810182905260448101859052606401610898565b610b6b82868684036001611c9d565b600033610838818585611a2a565b3373516a55fa43339b8e85c1f32c4709e06e93755afe14611219576040517feec413b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546001600160a01b039081169082160361126c576040517fa93663690000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610898565b600180546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040805191909216808252602082019390935233918101919091524260608201527fe1cb783288eddc7b22c25642a832d886a558be0dd900747310a34156b9fdcbbb9060800160405180910390a1600154604080517fc45a015500000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163c45a01559160048083019260209291908290030181865afa158015611354573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113789190612553565b6001600160a01b031663e6a4390530600160009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fe9190612553565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa158015611461573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114859190612553565b6001600160a01b0316036116aa57600160009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150a9190612553565b6001600160a01b031663c9c6539630600160009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561156c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115909190612553565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156115f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116199190612553565b600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691821790556000908152600d602052604090205460ff166116aa57600a546001600160a01b03166000908152600d6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b5050565b6116b66118a5565b8060035414806116c757506101f481105b15611701576040517f6072742c00000000000000000000000000000000000000000000000000000000815260048101829052602401610898565b60038054908290556040805160a08082526013908201527f6d61785472616e73616374696f6e4c696d69740000000000000000000000000060c0820152602081018390529081018390523360608201524260808201527f2dc908b86b38cfca773aadc8861ff9f24d2b644be4f8a6c2024cd71e120e5ef59060e001610966565b6117896118a5565b6000546001600160a01b03166001600160a01b0316816001600160a01b0316036117ea576040517fa93663690000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610898565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff21536001600160a01b03821601611857576040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610898565b600980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038316179055610e6a81611fed565b6118a08383836001611c9d565b505050565b336118b86000546001600160a01b031690565b6001600160a01b031614610e7f576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610898565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526118a0908490612041565b6001600160a01b038381166000908152600c60209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015610b025781811015611a1b576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024810182905260448101839052606401610898565b610b0284848484036000611c9d565b6001600160a01b038316611a6d576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610898565b6001600160a01b038216611ab0576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610898565b600a5474010000000000000000000000000000000000000000900460ff16158015611b1857506001600160a01b0383166000908152600e602052604090205460ff16158015611b1857506001600160a01b0382166000908152600e602052604090205460ff16155b15611b4f576040517fab9827ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a547501000000000000000000000000000000000000000000900460ff168015611b9357506001600160a01b0383166000908152600e602052604090205460ff16155b8015611bc15750620186a0600354611baa60025490565b611bb49190612583565b611bbe919061259a565b81115b15611bf8576040517fff5e701c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600654600554611c089042612570565b10158015611c235750306000908152600b6020526040812054115b15611c9257306000908152600b6020526040902054600254620186a090611c4c90610834612583565b611c56919061259a565b811115611c8357620186a0611c6a60025490565b611c7690610834612583565b611c80919061259a565b90505b611c903061dead836120bd565b505b6118a08383836120bd565b6001600160a01b038416611ce0576040517fe602df0500000000000000000000000000000000000000000000000000000000815260006004820152602401610898565b6001600160a01b038316611d23576040517f94280d6200000000000000000000000000000000000000000000000000000000815260006004820152602401610898565b6001600160a01b038085166000908152600c602090815260408083209387168352929052208290558015610b0257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611d9691815260200190565b60405180910390a350505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff21533301611e01576040517f8e4c8aa600000000000000000000000000000000000000000000000000000000815261dead6004820152602401610898565b6040805160028082526060820183526000926020830190803683375050600154604080517fad5c464800000000000000000000000000000000000000000000000000000000815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611e84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea89190612553565b81600081518110611ebb57611ebb6125d5565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611eef57611eef6125d5565b6001600160a01b0392831660209182029290920101526001546040517fb6f9de9500000000000000000000000000000000000000000000000000000000815291169063b6f9de95908590611f4e90600090869088904290600401612604565b6000604051808303818588803b158015611f6757600080fd5b505af1158015611f7b573d6000803e3d6000fd5b5050505050505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611ff56118a5565b6001600160a01b038116612038576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260006004820152602401610898565b610e6a81611f85565b60006120566001600160a01b03841683612200565b9050805160001415801561207b575080806020019051810190612079919061266e565b155b156118a0576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610898565b6001600160a01b0383166120e85780600260008282546120dd9190612540565b909155506121739050565b6001600160a01b0383166000908152600b602052604090205481811015612154576040517fe450d38c0000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024810182905260448101839052606401610898565b6001600160a01b0384166000908152600b602052604090209082900390555b6001600160a01b03821661218f576002805482900390556121ae565b6001600160a01b0382166000908152600b602052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516121f391815260200190565b60405180910390a3505050565b6060610b278383600084600080856001600160a01b03168486604051612226919061268b565b60006040518083038185875af1925050503d8060008114612263576040519150601f19603f3d011682016040523d82523d6000602084013e612268565b606091505b5091509150612278868383612282565b9695505050505050565b60608261229757612292826122f7565b610b27565b81511580156122ae57506001600160a01b0384163b155b156122f0576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610898565b5080610b27565b8051156123075780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8381101561235457818101518382015260200161233c565b50506000910152565b602081526000825180602084015261237c816040850160208701612339565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6001600160a01b0381168114610e6a57600080fd5b6000602082840312156123d557600080fd5b8135610b27816123ae565b600080604083850312156123f357600080fd5b82356123fe816123ae565b946020939093013593505050565b8015158114610e6a57600080fd5b60006020828403121561242c57600080fd5b8135610b278161240c565b60008060006060848603121561244c57600080fd5b8335612457816123ae565b92506020840135612467816123ae565b929592945050506040919091013590565b6000806040838503121561248b57600080fd5b8235612496816123ae565b915060208301356124a68161240c565b809150509250929050565b6000602082840312156124c357600080fd5b5035919050565b600080604083850312156124dd57600080fd5b82356124e8816123ae565b915060208301356124a6816123ae565b60006020828403121561250a57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561083e5761083e612511565b60006020828403121561256557600080fd5b8151610b27816123ae565b8181038181111561083e5761083e612511565b808202811582820484141761083e5761083e612511565b6000826125d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060808201868352602060808185015281875180845260a086019150828901935060005b8181101561264e5784516001600160a01b031683529383019391830191600101612629565b50506001600160a01b039690961660408501525050506060015292915050565b60006020828403121561268057600080fd5b8151610b278161240c565b6000825161269d818460208701612339565b919091019291505056fea2646970667358221220be5cef1523552a4437e910fad72beb0ab92f3c76437f6a90550226b4f0673cce64736f6c63430008120033

Deployed Bytecode Sourcemap

26392:28352:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41470:90;;;;;;;;;;-1:-1:-1;41548:4:0;;;;;;;;;;;;;;;;;41470:90;;;;;;;:::i;:::-;;;;;;;;27705:45;;;;;;;;;;-1:-1:-1;27705:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1305:14:1;;1298:22;1280:41;;1268:2;1253:18;27705:45:0;1140:187:1;44527:194:0;;;;;;;;;;-1:-1:-1;44527:194:0;;;;;:::i;:::-;;:::i;27083:46::-;;;;;;;;;;;;;;;;;;;1798:25:1;;;1786:2;1771:18;27083:46:0;1652:177:1;42525:99:0;;;;;;;;;;-1:-1:-1;42604:12:0;;42525:99;;38277:359;;;;;;;;;;-1:-1:-1;38277:359:0;;;;;:::i;:::-;;:::i;:::-;;33394:802;;;;;;;;;;-1:-1:-1;33394:802:0;;;;;:::i;:::-;;:::i;27041:35::-;;;;;;;;;;;;;;;;45166:247;;;;;;;;;;-1:-1:-1;45166:247:0;;;;;:::i;:::-;;:::i;27001:33::-;;;;;;;;;;;;;;;;26870:38;;;;;;;;;;;;26905:3;26870:38;;42235:90;;;;;;;;;;-1:-1:-1;42235:90:0;;26803:2;2806:36:1;;2794:2;2779:18;42235:90:0;2664:184:1;53482:297:0;;;;;;;;;;-1:-1:-1;53482:297:0;;;;;:::i;:::-;;:::i;35925:528::-;;;;;;;;;;-1:-1:-1;35925:528:0;;;;;:::i;:::-;;:::i;39468:300::-;;;;;;;;;;-1:-1:-1;39468:300:0;;;;;:::i;:::-;;:::i;26954:40::-;;;;;;;;;;;;;;;;42912:118;;;;;;;;;;-1:-1:-1;42912:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;43004:18:0;42977:7;43004:18;;;:9;:18;;;;;;;42912:118;24541:103;;;;;;;;;;;;;:::i;37754:385::-;;;;;;;;;;-1:-1:-1;37754:385:0;;;;;:::i;:::-;;:::i;34602:330::-;;;;;;;;;;;;;:::i;23817:87::-;;;;;;;;;;-1:-1:-1;23863:7:0;23890:6;-1:-1:-1;;;;;23890:6:0;23817:87;;;-1:-1:-1;;;;;3589:55:1;;;3571:74;;3559:2;3544:18;23817:87:0;3425:226:1;26818:45:0;;;;;;;;;;;;26856:7;26818:45;;35330:151;;;;;;;;;;;;;:::i;41754:94::-;;;;;;;;;;-1:-1:-1;41834:6:0;;;;;;;;;;;;;;;;;41754:94;;27185:43;;;;;;;;;;;;;;;;27329:72;;;;;;;;;;-1:-1:-1;27329:72:0;;;;-1:-1:-1;;;;;27329:72:0;;;54274:467;;;;;;;;;;-1:-1:-1;54274:467:0;;;;;:::i;:::-;;:::i;27485:37::-;;;;;;;;;;-1:-1:-1;27485:37:0;;;;;;;;;;;27414:19;;;;;;;;;;-1:-1:-1;27414:19:0;;;;-1:-1:-1;;;;;27414:19:0;;;43399:186;;;;;;;;;;-1:-1:-1;43399:186:0;;;;;:::i;:::-;;:::i;27241:79::-;;;;;;;;;;;;27278:42;27241:79;;27757:53;;;;;;;;;;-1:-1:-1;27757:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;36920:648;;;;;;;;;;-1:-1:-1;36920:648:0;;;;;:::i;:::-;;:::i;27446:32::-;;;;;;;;;;-1:-1:-1;27446:32:0;;;;;;;;;;;38765:395;;;;;;;;;;-1:-1:-1;38765:395:0;;;;;:::i;:::-;;:::i;27136:42::-;;;;;;;;;;;;;;;;43970:148;;;;;;;;;;-1:-1:-1;43970:148:0;;;;;:::i;:::-;-1:-1:-1;;;;;44080:21:0;;;44053:7;44080:21;;;:11;:21;;;;;;;;:30;;;;;;;;;;;;;43970:148;40893:360;;;;;;;;;;-1:-1:-1;40893:360:0;;;;;:::i;:::-;;:::i;26580:75::-;;;;;;;;;;-1:-1:-1;26580:75:0;;;;-1:-1:-1;;;;;26580:75:0;;;44527:194;44600:4;44636:10;44657:34;44636:10;44676:7;44685:5;44657:8;:34::i;:::-;44709:4;44702:11;;;44527:194;;;;;:::o;38277:359::-;22082:13;:11;:13::i;:::-;38374:8:::1;38353:29;;:17;;;;;;;;;;;:29;;::::0;38349:100:::1;;38406:31;::::0;::::1;::::0;;1305:14:1;;1298:22;38406:31:0::1;::::0;::::1;1280:41:1::0;1253:18;;38406:31:0::1;;;;;;;;38349:100;38475:17;::::0;;38503:28;::::1;;38475:17:::0;38503:28;;::::1;::::0;;::::1;;::::0;;;38547:81:::1;::::0;;4597:3:1;4579:22;;;4638:2;4617:19;;;4610:31;4678:19;4672:3;4657:19;;4650:48;38475:17:0::1;::::0;;;::::1;::::0;;;::::1;4779:14:1::0;;4772:22;4765:4;4750:20;;4743:52;4811:18;;;4804:50;38600:10:0::1;-1:-1:-1::0;4870:18:1;;4863:83;38612:15:0::1;-1:-1:-1::0;4962:19:1;;4955:35;38547:81:0::1;::::0;4730:3:1;4715:19;38547:81:0::1;;;;;;;;38338:298;38277:359:::0;:::o;33394:802::-;33490:6;27278:42;33585:4;-1:-1:-1;;;;;33561:29:0;;;33557:632;;33614:27;;;;;;;;;;;;;;33557:632;-1:-1:-1;;;;;33663:26:0;;33659:530;;33710:6;33720:1;33710:11;33706:86;;33755:21;33742:34;;33706:86;-1:-1:-1;;;;;33810:22:0;;:10;:22;33806:107;;33860:37;;;;;;;;;;;;;;33806:107;33927:38;;-1:-1:-1;;;;;33927:26:0;;;:38;;;;;33954:10;;33927:38;;;;33954:10;33927:26;:38;;;;;;;;;;;;;;;;;;;;;33659:530;;;34002:6;34012:1;34002:11;33998:110;;34047:45;;;;;34086:4;34047:45;;;3571:74:1;-1:-1:-1;;;;;34047:30:0;;;;;3544:18:1;;34047:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34034:58;;33998:110;34122:55;-1:-1:-1;;;;;34122:33:0;;34156:8;34166:10;34122:33;:55::i;:::-;33458:738;;33394:802;;:::o;45166:247::-;45253:4;45288:10;45309:37;45325:4;45288:10;45340:5;45309:15;:37::i;:::-;45357:26;45367:4;45373:2;45377:5;45357:9;:26::i;:::-;45401:4;45394:11;;;45166:247;;;;;;:::o;53482:297::-;53603:10;53567:4;44080:21;;;:11;:21;;;;;;;;-1:-1:-1;;;;;44080:30:0;;;;;;;;;;53567:4;;53603:10;53690:59;53699:8;53709:7;53718:24;53737:5;53624:55;53718:24;:::i;:::-;53744:4;53690:8;:59::i;:::-;-1:-1:-1;53767:4:0;;53482:297;-1:-1:-1;;;;53482:297:0:o;35925:528::-;22082:13;:11;:13::i;:::-;-1:-1:-1;;;;;36010:16:0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;:29;::::1;;:16;::::0;;::::1;:29;;::::0;36006:101:::1;;36063:32;::::0;::::1;::::0;;1305:14:1;;1298:22;36063:32:0::1;::::0;::::1;1280:41:1::0;1253:18;;36063:32:0::1;1140:187:1::0;36006:101:0::1;36155:4;-1:-1:-1::0;;;;;36121:39:0::1;36127:6;-1:-1:-1::0;;;;;36121:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36121:39:0::1;;;:82;;;;;36198:4;-1:-1:-1::0;;;;;36164:39:0::1;36170:6;-1:-1:-1::0;;;;;36164:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36164:39:0::1;;;36121:82;36117:144;;;36227:22;::::0;::::1;::::0;;-1:-1:-1;;;;;3589:55:1;;36227:22:0::1;::::0;::::1;3571:74:1::0;3544:18;;36227:22:0::1;3425:226:1::0;36117:144:0::1;-1:-1:-1::0;;;;;36288:16:0;::::1;36271:14;36288:16:::0;;;:8:::1;:16;::::0;;;;;;;;;;36315:28;::::1;;::::0;;::::1;::::0;::::1;::::0;;;36359:86;;6095:3:1;6077:22;;;6136:1;6115:19;;;6108:30;6175:10;6169:3;6154:19;;6147:39;6299:20;;;6292:45;;;;36288:16:0::1;::::0;;::::1;6380:14:1::0;;6373:22;6353:18;;;6346:50;;;;6427:2;6412:18;;6405:50;;;;36417:10:0::1;-1:-1:-1::0;6471:19:1;;6464:44;36429:15:0::1;-1:-1:-1::0;6524:19:1;;6517:35;36288:16:0;36359:86:::1;::::0;6218:3:1;6203:19;36359:86:0::1;;;;;;;;35995:458;35925:528:::0;;:::o;39468:300::-;22082:13;:11;:13::i;:::-;39555:7:::1;39546:6;:16;39542:77;;;39586:21;::::0;::::1;::::0;;39599:7:::1;39586:21;::::0;::::1;1798:25:1::0;1771:18;;39586:21:0::1;1652:177:1::0;39542:77:0::1;39656:6;39629:23;;:33;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;39700:15:0::1;39673:24;:42:::0;39726:34:::1;39736:6:::0;39752::::1;39726:9;:34::i;:::-;39468:300:::0;:::o;24541:103::-;22082:13;:11;:13::i;:::-;24606:30:::1;24633:1;24606:18;:30::i;:::-;24541:103::o:0;37754:385::-;22082:13;:11;:13::i;:::-;-1:-1:-1;;;;;37844:19:0;::::1;;::::0;;;:13:::1;:19;::::0;;;;;:31;::::1;;:19;::::0;;::::1;:31;;::::0;37840:102:::1;;37899:31;::::0;::::1;::::0;;1305:14:1;;1298:22;37899:31:0::1;::::0;::::1;1280:41:1::0;1253:18;;37899:31:0::1;1140:187:1::0;37840:102:0::1;-1:-1:-1::0;;;;;37968:19:0;::::1;37952:13;37968:19:::0;;;:13:::1;:19;::::0;;;;;;;;;;37998:30;::::1;;::::0;;::::1;::::0;::::1;::::0;;;38044:87;;7101:3:1;7083:22;;;7142:2;7121:19;;;7114:31;7182:15;7176:3;7161:19;;7154:44;7311:20;;;7304:45;;;;37968:19:0::1;::::0;;::::1;7392:14:1::0;;7385:22;7365:18;;;7358:50;;;;7439:2;7424:18;;7417:50;;;;38103:10:0::1;-1:-1:-1::0;7483:19:1;;7476:44;38115:15:0::1;-1:-1:-1::0;7536:19:1;;7529:35;37968:19:0;38044:87:::1;::::0;7230:3:1;7215:19;38044:87:0::1;6771:799:1::0;34602:330:0;22082:13;:11;:13::i;:::-;34661:12:::1;::::0;;;::::1;;;34657:101;;;34717:12;::::0;34731:14:::1;::::0;;34697:49:::1;::::0;::::1;::::0;;::::1;::::0;34717:12:::1;::::0;;;::::1;;::::0;34697:49:::1;7768:14:1::0;;7761:22;7743:41;;7815:2;7800:18;;7793:34;7731:2;7716:18;;7575:258;34657:101:0::1;34768:12;:19:::0;;34798:24;;;;;;34850:15:::1;34833:14;:32:::0;;;34883:41:::1;::::0;;34896:10:::1;8012:74:1::0;;8117:2;8102:18;;8095:34;;;;34883:41:0::1;::::0;7985:18:1;34883:41:0::1;;;;;;;34602:330::o:0;35330:151::-;43004:9;:18;;;;35441:6;35380:7;43004:18;;;;;42604:12;;35380:7;;43004:18;35407:42;;43004:18;35407:42;:::i;:::-;:66;;;;:::i;:::-;35400:73;;35330:151;:::o;54274:467::-;54395:10;54359:4;44080:21;;;:11;:21;;;;;;;;-1:-1:-1;;;;;44080:30:0;;;;;;;;;;54359:4;;54395:10;54505:5;54486:16;:24;54482:124;;;54534:60;;;;;-1:-1:-1;;;;;8493:55:1;;54534:60:0;;;8475:74:1;8565:18;;;8558:34;;;8608:18;;;8601:34;;;8448:18;;54534:60:0;8273:368:1;54482:124:0;54641:59;54650:8;54660:7;54688:5;54669:16;:24;54695:4;54641:8;:59::i;43399:186::-;43468:4;43504:10;43525:30;43504:10;43545:2;43549:5;43525:9;:30::i;36920:648::-;28050:10;27278:42;28050:24;28046:86;;28098:22;;;;;;;;;;;;;;28046:86;37020:6:::1;::::0;-1:-1:-1;;;;;37020:6:0;;::::1;36999:28:::0;;::::1;::::0;36995:102:::1;;37051:34;::::0;::::1;::::0;;-1:-1:-1;;;;;3589:55:1;;37051:34:0::1;::::0;::::1;3571:74:1::0;3544:18;;37051:34:0::1;3425:226:1::0;36995:102:0::1;37137:6;::::0;;-1:-1:-1;;;;;37155:27:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;37200:63:::1;::::0;;37137:6;;;::::1;8938:34:1::0;;;9003:2;8988:18;;8981:43;;;;37235:10:0::1;9040:18:1::0;;;9033:43;;;;37247:15:0::1;9107:2:1::0;9092:18;;9085:34;37200:63:0::1;::::0;8864:3:1;8849:19;37200:63:0::1;;;;;;;37297:6;::::0;:16:::1;::::0;;;;;;;37365:1:::1;::::0;-1:-1:-1;;;;;37297:6:0::1;::::0;:14:::1;::::0;:16:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:6;:16:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37288:34:0::1;;37331:4;37338:6;;;;;;;;;-1:-1:-1::0;;;;;37338:6:0::1;-1:-1:-1::0;;;;;37338:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37288:64;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;9383:15:1;;;37288:64:0::1;::::0;::::1;9365:34:1::0;9435:15;;9415:18;;;9408:43;9277:18;;37288:64:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37280:87:0::1;::::0;37276:285:::1;;37400:6;;;;;;;;;-1:-1:-1::0;;;;;37400:6:0::1;-1:-1:-1::0;;;;;37400:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37391:37:0::1;;37437:4;37444:6;;;;;;;;;-1:-1:-1::0;;;;;37444:6:0::1;-1:-1:-1::0;;;;;37444:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37391:67;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;9383:15:1;;;37391:67:0::1;::::0;::::1;9365:34:1::0;9435:15;;9415:18;;;9408:43;9277:18;;37391:67:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37384:4;:74:::0;;;::::1;-1:-1:-1::0;;;;;37384:74:0;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;37478:14:0;;;:8:::1;:14;::::0;;;;;::::1;;37473:77;;37522:4;::::0;-1:-1:-1;;;;;37522:4:0::1;37513:14;::::0;;;:8:::1;:14;::::0;;;;:21;;;::::1;37530:4;37513:21;::::0;;37473:77:::1;36984:584;36920:648:::0;:::o;38765:395::-;22082:13;:11;:13::i;:::-;38875:8:::1;38852:19;;:31;:54;;;;26905:3;38887:8;:19;38852:54;38848:116;;;38930:22;::::0;::::1;::::0;;::::1;::::0;::::1;1798:25:1::0;;;1771:18;;38930:22:0::1;1652:177:1::0;38848:116:0::1;38993:19;::::0;;39023:30;;;;39069:83:::1;::::0;;9776:3:1;9758:22;;;9817:2;9796:19;;;9789:31;9857:21;9851:3;9836:19;;9829:50;9946:4;9931:20;;9924:36;;;9976:18;;;9969:34;;;39124:10:0::1;-1:-1:-1::0;10019:18:1;;10012:83;39136:15:0::1;-1:-1:-1::0;10111:19:1;;10104:35;39069:83:0::1;::::0;9911:3:1;9896:19;39069:83:0::1;9462:683:1::0;40893:360:0;22082:13;:11;:13::i;:::-;23863:7;23890:6;-1:-1:-1;;;;;23890:6:0;-1:-1:-1;;;;;40979:19:0::1;:8;-1:-1:-1::0;;;;;40979:19:0::1;::::0;40975:92:::1;;41022:33;::::0;::::1;::::0;;-1:-1:-1;;;;;3589:55:1;;41022:33:0::1;::::0;::::1;3571:74:1::0;3544:18;;41022:33:0::1;3425:226:1::0;40975:92:0::1;41081:27:::0;-1:-1:-1;;;;;41081:27:0;::::1;::::0;41077:91:::1;;41132:24;::::0;::::1;::::0;;-1:-1:-1;;;;;3589:55:1;;41132:24:0::1;::::0;::::1;3571:74:1::0;3544:18;;41132:24:0::1;3425:226:1::0;41077:91:0::1;41178:12;:23:::0;;;::::1;-1:-1:-1::0;;;;;41178:23:0;::::1;;::::0;;41212:33:::1;41178:23:::0;41212::::1;:33::i;50529:136::-:0;50617:40;50626:8;50636:7;50645:5;50652:4;50617:8;:40::i;:::-;50529:136;;;:::o;24101:162::-;24172:10;24161:7;23863;23890:6;-1:-1:-1;;;;;23890:6:0;;23817:87;24161:7;-1:-1:-1;;;;;24161:21:0;;24157:99;;24206:38;;;;;24233:10;24206:38;;;3571:74:1;3544:18;;24206:38:0;3425:226:1;6977:162:0;7087:43;;;-1:-1:-1;;;;;8030:55:1;;7087:43:0;;;8012:74:1;8102:18;;;;8095:34;;;7087:43:0;;;;;;;;;;7985:18:1;;;;7087:43:0;;;;;;;;;;;;;;7060:71;;7080:5;;7060:19;:71::i;52453:495::-;-1:-1:-1;;;;;44080:21:0;;;52556:24;44080:21;;;:11;:21;;;;;;;;:30;;;;;;;;;;52645:17;52626:36;;52622:319;;;52702:5;52683:16;:24;52679:132;;;52735:60;;;;;-1:-1:-1;;;;;8493:55:1;;52735:60:0;;;8475:74:1;8565:18;;;8558:34;;;8608:18;;;8601:34;;;8448:18;;52735:60:0;8273:368:1;52679:132:0;52854:60;52863:8;52873:7;52901:5;52882:16;:24;52908:5;52854:8;:60::i;46775:1027::-;-1:-1:-1;;;;;46859:18:0;;46855:88;;46901:30;;;;;46928:1;46901:30;;;3571:74:1;3544:18;;46901:30:0;3425:226:1;46855:88:0;-1:-1:-1;;;;;46957:16:0;;46953:88;;46997:32;;;;;47026:1;46997:32;;;3571:74:1;3544:18;;46997:32:0;3425:226:1;46953:88:0;47070:12;;;;;;;47069:13;:74;;;;-1:-1:-1;;;;;;47101:19:0;;;;;;:13;:19;;;;;;;;47100:20;:42;;;;-1:-1:-1;;;;;;47125:17:0;;;;;;:13;:17;;;;;;;;47124:18;47100:42;47051:158;;;47177:20;;;;;;;;;;;;;;47051:158;47223:17;;;;;;;:41;;;;-1:-1:-1;;;;;;47245:19:0;;;;;;:13;:19;;;;;;;;47244:20;47223:41;:102;;;;;26856:7;47292:19;;47276:13;42604:12;;;42525:99;47276:13;:35;;;;:::i;:::-;:49;;;;:::i;:::-;47268:5;:57;47223:102;47219:155;;;47349:13;;;;;;;;;;;;;;47219:155;47428:19;;47407:16;;47389:34;;:15;:34;:::i;:::-;47388:59;;:91;;;;-1:-1:-1;47469:4:0;47478:1;43004:18;;;:9;:18;;;;;;47451:28;47388:91;47384:374;;;47532:4;47496:15;43004:18;;;:9;:18;;;;;;42604:12;;26856:7;;47567:21;;47583:5;47567:21;:::i;:::-;:35;;;;:::i;:::-;47557:7;:45;47553:131;;;26856:7;47633:13;42604:12;;;42525:99;47633:13;:21;;47649:5;47633:21;:::i;:::-;:35;;;;:::i;:::-;47623:45;;47553:131;47698:48;47714:4;47729:6;47738:7;47698;:48::i;:::-;47481:277;47384:374;47770:24;47778:4;47784:2;47788:5;47770:7;:24::i;51438:455::-;-1:-1:-1;;;;;51554:22:0;;51550:94;;51600:32;;;;;51629:1;51600:32;;;3571:74:1;3544:18;;51600:32:0;3425:226:1;51550:94:0;-1:-1:-1;;;;;51658:21:0;;51654:92;;51703:31;;;;;51731:1;51703:31;;;3571:74:1;3544:18;;51703:31:0;3425:226:1;51654:92:0;-1:-1:-1;;;;;51756:21:0;;;;;;;:11;:21;;;;;;;;:30;;;;;;;;;:38;;;51805:81;;;;51859:7;-1:-1:-1;;;;;51840:34:0;51849:8;-1:-1:-1;;;;;51840:34:0;;51868:5;51840:34;;;;1798:25:1;;1786:2;1771:18;;1652:177;51840:34:0;;;;;;;;51438:455;;;;:::o;40006:411::-;40077:29;:10;:29;40073:78;;40117:31;;;;;40140:6;40117:31;;;3571:74:1;3544:18;;40117:31:0;3425:226:1;40073:78:0;40185:16;;;40199:1;40185:16;;;;;;;;40161:21;;40185:16;;;;;;;;-1:-1:-1;;40222:6:0;;:13;;;;;;;;40161:40;;-1:-1:-1;;;;;;40222:6:0;;;;:11;;-1:-1:-1;40222:13:0;;;;;;;;;;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40212:4;40217:1;40212:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;40212:23:0;;;-1:-1:-1;;;;;40212:23:0;;;;;40264:4;40246;40251:1;40246:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40246:23:0;;;:7;;;;;;;;;:23;40282:6;;:127;;;;;:6;;;:57;;40361:6;;40282:127;;:6;;40383:4;;40389:2;;40393:15;;40282:127;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40062:355;40006:411;;:::o;25632:191::-;25706:16;25725:6;;-1:-1:-1;;;;;25742:17:0;;;;;;;;;;25775:40;;25725:6;;;;;;;25775:40;;25706:16;25775:40;25695:128;25632:191;:::o;25075:220::-;22082:13;:11;:13::i;:::-;-1:-1:-1;;;;;25160:22:0;::::1;25156:93;;25206:31;::::0;::::1;::::0;;25234:1:::1;25206:31;::::0;::::1;3571:74:1::0;3544:18;;25206:31:0::1;3425:226:1::0;25156:93:0::1;25259:28;25278:8;25259:18;:28::i;7529:295::-:0;7610:23;7636:33;-1:-1:-1;;;;;7636:27:0;;7664:4;7636:27;:33::i;:::-;7610:59;;7684:10;:17;7705:1;7684:22;;:57;;;;;7722:10;7711:30;;;;;;;;;;;;:::i;:::-;7710:31;7684:57;7680:137;;;7765:40;;;;;-1:-1:-1;;;;;3589:55:1;;7765:40:0;;;3571:74:1;3544:18;;7765:40:0;3425:226:1;48494:730:0;-1:-1:-1;;;;;48584:18:0;;48580:369;;48635:5;48619:12;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;48580:369:0;;-1:-1:-1;48580:369:0;;-1:-1:-1;;;;;48695:15:0;;48673:19;48695:15;;;:9;:15;;;;;;48729:19;;;48725:117;;;48776:50;;;;;-1:-1:-1;;;;;8493:55:1;;48776:50:0;;;8475:74:1;8565:18;;;8558:34;;;8608:18;;;8601:34;;;8448:18;;48776:50:0;8273:368:1;48725:117:0;-1:-1:-1;;;;;48885:15:0;;;;;;:9;:15;;;;;48903:19;;;;48885:37;;48580:369;-1:-1:-1;;;;;48965:16:0;;48961:213;;49027:12;:21;;;;;;;48961:213;;;-1:-1:-1;;;;;49125:13:0;;;;;;:9;:13;;;;;:22;;;;;;48961:213;49206:2;-1:-1:-1;;;;;49191:25:0;49200:4;-1:-1:-1;;;;;49191:25:0;;49210:5;49191:25;;;;1798::1;;1786:2;1771:18;;1652:177;49191:25:0;;;;;;;;48494:730;;;:::o;2899:153::-;2974:12;3006:38;3028:6;3036:4;3042:1;2974:12;3890;3904:23;3931:6;-1:-1:-1;;;;;3931:11:0;3950:5;3957:4;3931:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3889:73;;;;3980:55;4007:6;4015:7;4024:10;3980:26;:55::i;:::-;3973:62;3645:398;-1:-1:-1;;;;;;3645:398:0:o;4807:391::-;4921:12;4951:7;4946:245;;4975:19;4983:10;4975:7;:19::i;:::-;4946:245;;;5031:17;;:22;:49;;;;-1:-1:-1;;;;;;5057:18:0;;;:23;5031:49;5027:121;;;5108:24;;;;;-1:-1:-1;;;;;3589:55:1;;5108:24:0;;;3571:74:1;3544:18;;5108:24:0;3425:226:1;5027:121:0;-1:-1:-1;5169:10:0;5162:17;;5466:328;5536:17;;:21;5532:255;;5631:10;5625:17;5688:15;5675:10;5671:2;5667:19;5660:44;5532:255;5758:17;;;;;;;;;;;;;;14:250:1;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:455::-;418:2;407:9;400:21;381:4;450:6;444:13;493:6;488:2;477:9;473:18;466:34;509:79;581:6;576:2;565:9;561:18;556:2;548:6;544:15;509:79;:::i;:::-;640:2;628:15;645:66;624:88;609:104;;;;715:2;605:113;;269:455;-1:-1:-1;;269:455:1:o;729:154::-;-1:-1:-1;;;;;808:5:1;804:54;797:5;794:65;784:93;;873:1;870;863:12;888:247;947:6;1000:2;988:9;979:7;975:23;971:32;968:52;;;1016:1;1013;1006:12;968:52;1055:9;1042:23;1074:31;1099:5;1074:31;:::i;1332:315::-;1400:6;1408;1461:2;1449:9;1440:7;1436:23;1432:32;1429:52;;;1477:1;1474;1467:12;1429:52;1516:9;1503:23;1535:31;1560:5;1535:31;:::i;:::-;1585:5;1637:2;1622:18;;;;1609:32;;-1:-1:-1;;;1332:315:1:o;1834:118::-;1920:5;1913:13;1906:21;1899:5;1896:32;1886:60;;1942:1;1939;1932:12;1957:241;2013:6;2066:2;2054:9;2045:7;2041:23;2037:32;2034:52;;;2082:1;2079;2072:12;2034:52;2121:9;2108:23;2140:28;2162:5;2140:28;:::i;2203:456::-;2280:6;2288;2296;2349:2;2337:9;2328:7;2324:23;2320:32;2317:52;;;2365:1;2362;2355:12;2317:52;2404:9;2391:23;2423:31;2448:5;2423:31;:::i;:::-;2473:5;-1:-1:-1;2530:2:1;2515:18;;2502:32;2543:33;2502:32;2543:33;:::i;:::-;2203:456;;2595:7;;-1:-1:-1;;;2649:2:1;2634:18;;;;2621:32;;2203:456::o;2853:382::-;2918:6;2926;2979:2;2967:9;2958:7;2954:23;2950:32;2947:52;;;2995:1;2992;2985:12;2947:52;3034:9;3021:23;3053:31;3078:5;3053:31;:::i;:::-;3103:5;-1:-1:-1;3160:2:1;3145:18;;3132:32;3173:30;3132:32;3173:30;:::i;:::-;3222:7;3212:17;;;2853:382;;;;;:::o;3240:180::-;3299:6;3352:2;3340:9;3331:7;3327:23;3323:32;3320:52;;;3368:1;3365;3358:12;3320:52;-1:-1:-1;3391:23:1;;3240:180;-1:-1:-1;3240:180:1:o;3656:388::-;3724:6;3732;3785:2;3773:9;3764:7;3760:23;3756:32;3753:52;;;3801:1;3798;3791:12;3753:52;3840:9;3827:23;3859:31;3884:5;3859:31;:::i;:::-;3909:5;-1:-1:-1;3966:2:1;3951:18;;3938:32;3979:33;3938:32;3979:33;:::i;5001:184::-;5071:6;5124:2;5112:9;5103:7;5099:23;5095:32;5092:52;;;5140:1;5137;5130:12;5092:52;-1:-1:-1;5163:16:1;;5001:184;-1:-1:-1;5001:184:1:o;5190:::-;5242:77;5239:1;5232:88;5339:4;5336:1;5329:15;5363:4;5360:1;5353:15;5379:125;5444:9;;;5465:10;;;5462:36;;;5478:18;;:::i;5509:251::-;5579:6;5632:2;5620:9;5611:7;5607:23;5603:32;5600:52;;;5648:1;5645;5638:12;5600:52;5680:9;5674:16;5699:31;5724:5;5699:31;:::i;8140:128::-;8207:9;;;8228:11;;;8225:37;;;8242:18;;:::i;10150:168::-;10223:9;;;10254;;10271:15;;;10265:22;;10251:37;10241:71;;10292:18;;:::i;10323:274::-;10363:1;10389;10379:189;;10424:77;10421:1;10414:88;10525:4;10522:1;10515:15;10553:4;10550:1;10543:15;10379:189;-1:-1:-1;10582:9:1;;10323:274::o;10791:184::-;10843:77;10840:1;10833:88;10940:4;10937:1;10930:15;10964:4;10961:1;10954:15;10980:954;11214:4;11262:3;11251:9;11247:19;11293:6;11282:9;11275:25;11319:2;11357:3;11352:2;11341:9;11337:18;11330:31;11381:6;11416;11410:13;11447:6;11439;11432:22;11485:3;11474:9;11470:19;11463:26;;11524:2;11516:6;11512:15;11498:29;;11545:1;11555:218;11569:6;11566:1;11563:13;11555:218;;;11634:13;;-1:-1:-1;;;;;11630:62:1;11618:75;;11748:15;;;;11713:12;;;;11591:1;11584:9;11555:218;;;-1:-1:-1;;;;;;;11829:55:1;;;;11824:2;11809:18;;11802:83;-1:-1:-1;;;11916:2:1;11901:18;11894:34;11790:3;10980:954;-1:-1:-1;;10980:954:1:o;11939:245::-;12006:6;12059:2;12047:9;12038:7;12034:23;12030:32;12027:52;;;12075:1;12072;12065:12;12027:52;12107:9;12101:16;12126:28;12148:5;12126:28;:::i;12189:287::-;12318:3;12356:6;12350:13;12372:66;12431:6;12426:3;12419:4;12411:6;12407:17;12372:66;:::i;:::-;12454:16;;;;;12189:287;-1:-1:-1;;12189:287:1:o

Swarm Source

ipfs://be5cef1523552a4437e910fad72beb0ab92f3c76437f6a90550226b4f0673cce
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.