ETH Price: $3,383.99 (+0.80%)

Token

Alkimi Exchange ($ADS)
 

Overview

Max Total Supply

250,000,000 $ADS

Holders

6,550 ( 0.153%)

Market

Price

$0.31 @ 0.000093 ETH (+0.16%)

Onchain Market Cap

$78,490,875.74

Circulating Supply Market Cap

$74,406,550.96

Other Info

Token Contract (WITH 18 Decimals)

Balance
248,704.604008079110509345 $ADS

Value
$78,084.17 ( ~23.0746 Eth) [0.0995%]
0xdec3194b56e2d032ee530608022b424d54822772
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

stADS are the Staked $ADS for Alkimi's Liquidity Pool. These can then be added to the soft staking on Alkimi Labs to earn rewards generated by the Alkimi Ad Exchange. This allows $ADS holders to Yield Farm the Internet.

Market

Volume (24H):$182,905.04
Market Capitalization:$74,406,550.96
Circulating Supply:236,991,084.00 $ADS
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
AlkimiExchangeToken

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-24
*/

// Sources flattened with hardhat v2.6.0 https://hardhat.org

// File contracts/external/UniswapV2Library.sol

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

// Exempt from the original UniswapV2Library.
library UniswapV2Library {
    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'UniswapV2Library: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'UniswapV2Library: ZERO_ADDRESS');
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(bytes32 initCodeHash, address factory, address tokenA, address tokenB) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint160(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                initCodeHash // init code hash
            )))));
    }
}


// File contracts/external/UniswapV3Library.sol

/// @notice based on https://github.com/Uniswap/uniswap-v3-periphery/blob/v1.0.0/contracts/libraries/PoolAddress.sol
/// @notice changed compiler version and lib name.

/// @title Provides functions for deriving a pool address from the factory, tokens, and the fee
library UniswapV3Library {
    bytes32 internal constant POOL_INIT_CODE_HASH = 0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54;

    /// @notice The identifying key of the pool
    struct PoolKey {
        address token0;
        address token1;
        uint24 fee;
    }

    /// @notice Returns PoolKey: the ordered tokens with the matched fee levels
    /// @param tokenA The first token of a pool, unsorted
    /// @param tokenB The second token of a pool, unsorted
    /// @param fee The fee level of the pool
    /// @return Poolkey The pool details with ordered token0 and token1 assignments
    function getPoolKey(
        address tokenA,
        address tokenB,
        uint24 fee
    ) internal pure returns (PoolKey memory) {
        if (tokenA > tokenB) (tokenA, tokenB) = (tokenB, tokenA);
        return PoolKey({token0: tokenA, token1: tokenB, fee: fee});
    }

    /// @notice Deterministically computes the pool address given the factory and PoolKey
    /// @param factory The Uniswap V3 factory contract address
    /// @param key The PoolKey
    /// @return pool The contract address of the V3 pool
    function computeAddress(address factory, PoolKey memory key) internal pure returns (address pool) {
        require(key.token0 < key.token1);
        pool = address(
            uint160(uint256(
                keccak256(
                    abi.encodePacked(
                        hex'ff',
                        factory,
                        keccak256(abi.encode(key.token0, key.token1, key.fee)),
                        POOL_INIT_CODE_HASH
                    )
                )
            ))
        );
    }
}


// File contracts/IPLPS.sol


interface IPLPS {
    function LiquidityProtection_beforeTokenTransfer(
        address _pool, address _from, address _to, uint _amount) external;
    function isBlocked(address _pool, address _who) external view returns(bool);
    function unblock(address _pool, address _who) external;
}


// File contracts/UsingLiquidityProtectionService.sol


abstract contract UsingLiquidityProtectionService {
    bool private protected = true;
    uint64 internal constant HUNDRED_PERCENT = 1e18;
    bytes32 internal constant UNISWAP = 0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f;
    bytes32 internal constant PANCAKESWAP = 0x00fb7f630766e6a796048ea87d01acd3068e8ff67d078148a3fa3f4a84f69bd5;
    bytes32 internal constant QUICKSWAP = 0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f;

    enum UniswapVersion {
        V2,
        V3
    }

    enum UniswapV3Fees {
        _005, // 0.05%
        _03, // 0.3%
        _1 // 1%
    }

    modifier onlyProtectionAdmin() {
        protectionAdminCheck();
        _;
    }

    function token_transfer(address from, address to, uint amount) internal virtual;
    function token_balanceOf(address holder) internal view virtual returns(uint);
    function protectionAdminCheck() internal view virtual;
    function liquidityProtectionService() internal pure virtual returns(address);
    function uniswapVariety() internal pure virtual returns(bytes32);
    function uniswapVersion() internal pure virtual returns(UniswapVersion);
    function uniswapFactory() internal pure virtual returns(address);
    function counterToken() internal pure virtual returns(address) {
        return 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; // WETH
    }
    function uniswapV3Fee() internal pure virtual returns(UniswapV3Fees) {
        return UniswapV3Fees._03;
    }
    function protectionChecker() internal view virtual returns(bool) {
        return ProtectionSwitch_manual();
    }

    function lps() private pure returns(IPLPS) {
        return IPLPS(liquidityProtectionService());
    }

    function LiquidityProtection_beforeTokenTransfer(address _from, address _to, uint _amount) internal virtual {
        if (protectionChecker()) {
            if (!protected) {
                return;
            }
            lps().LiquidityProtection_beforeTokenTransfer(getLiquidityPool(), _from, _to, _amount);
        }
    }

    function revokeBlocked(address[] calldata _holders, address _revokeTo) external onlyProtectionAdmin() {
        require(protectionChecker(), 'UsingLiquidityProtectionService: protection removed');
        protected = false;
        address pool = getLiquidityPool();
        for (uint i = 0; i < _holders.length; i++) {
            address holder = _holders[i];
            if (lps().isBlocked(pool, holder)) {
                token_transfer(holder, _revokeTo, token_balanceOf(holder));
            }
        }
        protected = true;
    }

    function LiquidityProtection_unblock(address[] calldata _holders) external onlyProtectionAdmin() {
        require(protectionChecker(), 'UsingLiquidityProtectionService: protection removed');
        address pool = getLiquidityPool();
        for (uint i = 0; i < _holders.length; i++) {
            lps().unblock(pool, _holders[i]);
        }
    }

    function disableProtection() external onlyProtectionAdmin() {
        protected = false;
    }

    function isProtected() public view returns(bool) {
        return protected;
    }

    function ProtectionSwitch_manual() internal view returns(bool) {
        return protected;
    }

    function ProtectionSwitch_timestamp(uint _timestamp) internal view returns(bool) {
        return not(passed(_timestamp));
    }

    function ProtectionSwitch_block(uint _block) internal view returns(bool) {
        return not(blockPassed(_block));
    }

    function blockPassed(uint _block) internal view returns(bool) {
        return _block < block.number;
    }

    function passed(uint _timestamp) internal view returns(bool) {
        return _timestamp < block.timestamp;
    }

    function not(bool _condition) internal pure returns(bool) {
        return !_condition;
    }

    function feeToUint24(UniswapV3Fees _fee) internal pure returns(uint24) {
        if (_fee == UniswapV3Fees._03) return 3000;
        if (_fee == UniswapV3Fees._005) return 500;
        return 10000;
    }

    function getLiquidityPool() public view returns(address) {
        if (uniswapVersion() == UniswapVersion.V2) {
            return UniswapV2Library.pairFor(uniswapVariety(), uniswapFactory(), address(this), counterToken());
        }
        require(uniswapVariety() == UNISWAP, 'LiquidityProtection: uniswapVariety() can only be UNISWAP for V3.');
        return UniswapV3Library.computeAddress(uniswapFactory(),
            UniswapV3Library.getPoolKey(address(this), counterToken(), feeToUint24(uniswapV3Fee())));
    }
}


// File @openzeppelin/contracts/utils/[email protected]


/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}


// File @openzeppelin/contracts/access/[email protected]


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File @openzeppelin/contracts/token/ERC20/[email protected]


/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]





/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}


// File @openzeppelin/contracts/token/ERC20/[email protected]



/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}


// File contracts/AlkimiERC20.sol



contract AlkimiExchangeToken is ERC20, Ownable, UsingLiquidityProtectionService {
    function token_transfer(address _from, address _to, uint _amount) internal override {
        _transfer(_from, _to, _amount); // Expose low-level token transfer function.
    }
    function token_balanceOf(address _holder) internal view override returns(uint) {
        return balanceOf(_holder); // Expose balance check function.
    }
    function protectionAdminCheck() internal view override onlyOwner {} // Must revert to deny access.
    function liquidityProtectionService() internal pure override returns(address) {
        return 0xB59Dfc14D2037e3c4BF9C4FC1219f941E36De3e2;
    }
    function uniswapVariety() internal pure override returns(bytes32) {
        return UNISWAP; // UNISWAP / PANCAKESWAP / QUICKSWAP.
    }
    function uniswapVersion() internal pure override returns(UniswapVersion) {
        return UniswapVersion.V2; // V2 or V3.
    }
    function uniswapFactory() internal pure override returns(address) {
        return 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f; // Replace with the correct address.
    }
    function _beforeTokenTransfer(address _from, address _to, uint _amount) internal override {
        super._beforeTokenTransfer(_from, _to, _amount);
        LiquidityProtection_beforeTokenTransfer(_from, _to, _amount);
    }
    // All the following overrides are optional, if you want to modify default behavior.

    // How the protection gets disabled.
    function protectionChecker() internal view override returns(bool) {
         return ProtectionSwitch_timestamp(1632873599); // Switch off protection on Friday, April 22, 2022 4:16:31 PM.
        // return ProtectionSwitch_block(13000000); // Switch off protection on block 13000000.
//        return ProtectionSwitch_manual(); // Switch off protection by calling disableProtection(); from owner. Default.
    }

    // This token will be pooled in pair with:
    function counterToken() internal pure override returns(address) {
        return 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; // WETH
    }

    constructor() ERC20('Alkimi Exchange', '$ADS') {
        _mint(owner(), 250000000 * 1e18);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":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"},{"inputs":[{"internalType":"address[]","name":"_holders","type":"address[]"}],"name":"LiquidityProtection_unblock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","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":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","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":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLiquidityPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isProtected","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_holders","type":"address[]"},{"internalType":"address","name":"_revokeTo","type":"address"}],"name":"revokeBlocked","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":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","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"}]

60806040526005805460ff60a01b1916600160a01b1790553480156200002457600080fd5b50604080518082018252600f81526e416c6b696d692045786368616e676560881b6020808301918252835180850190945260048452632441445360e01b908401528151919291620000789160039162000572565b5080516200008e90600490602084019062000572565b505050620000ab620000a5620000da60201b60201c565b620000de565b620000d4620000c26005546001600160a01b031690565b6acecb8f27f4200f3a00000062000130565b6200067a565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166200018c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b6200019a6000838362000227565b8060026000828254620001ae919062000618565b90915550506001600160a01b03821660009081526020819052604081208054839290620001dd90849062000618565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6200023f8383836200024c60201b620008c51760201c565b6200024c83838362000251565b505050565b6200025b62000313565b156200024c57600554600160a01b900460ff166200027857505050565b73b59dfc14d2037e3c4bf9c4fc1219f941e36de3e2630336a3306200029c62000329565b6040516001600160e01b031960e084901b1681526001600160a01b0391821660048201528187166024820152908516604482015260648101849052608401600060405180830381600087803b158015620002f557600080fd5b505af11580156200030a573d6000803e3d6000fd5b50505050505050565b600062000324636153ac7f6200038c565b905090565b6000620003247f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f3073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2620003a660201b620008ca1760201c565b6000620003a06200039c83421190565b1590565b92915050565b60008080620003b6858562000474565b6040516001600160601b0319606084811b8216602084015283901b16603482015291935091508690604801604051602081830303815290604052805190602001208860405160200162000451939291907fff00000000000000000000000000000000000000000000000000000000000000815260609390931b6001600160601b03191660018401526015830191909152603582015260550190565b60408051601f198184030181529190528051602090910120979650505050505050565b600080826001600160a01b0316846001600160a01b03161415620004e95760405162461bcd60e51b815260206004820152602560248201527f556e697377617056324c6962726172793a204944454e544943414c5f41444452604482015264455353455360d81b606482015260840162000183565b826001600160a01b0316846001600160a01b0316106200050b5782846200050e565b83835b90925090506001600160a01b0382166200056b5760405162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015260640162000183565b9250929050565b82805462000580906200063d565b90600052602060002090601f016020900481019282620005a45760008555620005ef565b82601f10620005bf57805160ff1916838001178555620005ef565b82800160010185558215620005ef579182015b82811115620005ef578251825591602001919060010190620005d2565b50620005fd92915062000601565b5090565b5b80821115620005fd576000815560010162000602565b600082198211156200063857634e487b7160e01b81526011600452602481fd5b500190565b600181811c908216806200065257607f821691505b602082108114156200067457634e487b7160e01b600052602260045260246000fd5b50919050565b61139c806200068a6000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806370a08231116100ad57806395ddbe891161007157806395ddbe891461024e578063a457c2d714610256578063a9059cbb14610269578063dd62ed3e1461027c578063f2fde38b146102b557600080fd5b806370a08231146101dd578063715018a61461020657806375ee83891461020e5780638da5cb5b1461022157806395d89b411461024657600080fd5b8063313ce567116100f4578063313ce5671461018c578063395093511461019b578063421dd7c7146101ae5780635300f82b146101b85780635fdb86f9146101ca57600080fd5b806306fdde0314610126578063095ea7b31461014457806318160ddd1461016757806323b872dd14610179575b600080fd5b61012e6102c8565b60405161013b9190611207565b60405180910390f35b6101576101523660046110f4565b61035a565b604051901515815260200161013b565b6002545b60405190815260200161013b565b6101576101873660046110b9565b610370565b6040516012815260200161013b565b6101576101a93660046110f4565b61041f565b6101b661045b565b005b600554600160a01b900460ff16610157565b6101b66101d836600461111d565b610472565b61016b6101eb366004611066565b6001600160a01b031660009081526020819052604090205490565b6101b661057e565b6101b661021c36600461115d565b6105b4565b6005546001600160a01b03165b6040516001600160a01b03909116815260200161013b565b61012e61071a565b61022e610729565b6101576102643660046110f4565b610784565b6101576102773660046110f4565b61081d565b61016b61028a366004611087565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6101b66102c3366004611066565b61082a565b6060600380546102d7906112fa565b80601f0160208091040260200160405190810160405280929190818152602001828054610303906112fa565b80156103505780601f1061032557610100808354040283529160200191610350565b820191906000526020600020905b81548152906001019060200180831161033357829003601f168201915b5050505050905090565b6000610367338484610a85565b50600192915050565b600061037d848484610ba9565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156104075760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6104148533858403610a85565b506001949350505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916103679185906104569086906112e2565b610a85565b610463610d82565b6005805460ff60a01b19169055565b61047a610d82565b610482610dac565b61049e5760405162461bcd60e51b81526004016103fe9061125a565b60006104a8610729565b905060005b828110156105785773b59dfc14d2037e3c4bf9c4fc1219f941e36de3e2630d8bd5e8838686858181106104f057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906105059190611066565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401600060405180830381600087803b15801561054d57600080fd5b505af1158015610561573d6000803e3d6000fd5b50505050808061057090611335565b9150506104ad565b50505050565b6005546001600160a01b031633146105a85760405162461bcd60e51b81526004016103fe906112ad565b6105b26000610dbb565b565b6105bc610d82565b6105c4610dac565b6105e05760405162461bcd60e51b81526004016103fe9061125a565b6005805460ff60a01b1916905560006105f7610729565b905060005b8381101561070057600085858381811061062657634e487b7160e01b600052603260045260246000fd5b905060200201602081019061063b9190611066565b905073b59dfc14d2037e3c4bf9c4fc1219f941e36de3e2604051634362c69f60e11b81526001600160a01b038581166004830152838116602483015291909116906386c58d3e9060440160206040518083038186803b15801561069d57600080fd5b505afa1580156106b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d591906111af565b156106ed576106ed81856106e884610e0d565b610e2d565b50806106f881611335565b9150506105fc565b50506005805460ff60a01b1916600160a01b179055505050565b6060600480546102d7906112fa565b600061077f7f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f3073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26108ca565b905090565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156108065760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016103fe565b6108133385858403610a85565b5060019392505050565b6000610367338484610ba9565b6005546001600160a01b031633146108545760405162461bcd60e51b81526004016103fe906112ad565b6001600160a01b0381166108b95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103fe565b6108c281610dbb565b50565b505050565b60008060006108d98585610e38565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b166034820152919350915086906048016040516020818303038152906040528051906020012088604051602001610932939291906111cf565b60408051601f198184030181529190528051602090910120979650505050505050565b6040805160608101825260008082526020820181905291810191909152826001600160a01b0316846001600160a01b03161115610990579192915b50604080516060810182526001600160a01b03948516815292909316602083015262ffffff169181019190915290565b600081602001516001600160a01b031682600001516001600160a01b0316106109e857600080fd5b815160208084015160408086015181516001600160a01b0395861681860152949092168482015262ffffff90911660608085019190915281518085039091018152608084019091528051910120610a66918591907fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b549060a0016111cf565b60408051601f1981840301815291905280516020909101209392505050565b6001600160a01b038316610ae75760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016103fe565b6001600160a01b038216610b485760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016103fe565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316610c0d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016103fe565b6001600160a01b038216610c6f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016103fe565b610c7a838383610f30565b6001600160a01b03831660009081526020819052604090205481811015610cf25760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016103fe565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290610d299084906112e2565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610d7591815260200190565b60405180910390a3610578565b6005546001600160a01b031633146105b25760405162461bcd60e51b81526004016103fe906112ad565b600061077f636153ac7f610f3b565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0381166000908152602081905260408120545b92915050565b6108c5838383610ba9565b600080826001600160a01b0316846001600160a01b03161415610eab5760405162461bcd60e51b815260206004820152602560248201527f556e697377617056324c6962726172793a204944454e544943414c5f41444452604482015264455353455360d81b60648201526084016103fe565b826001600160a01b0316846001600160a01b031610610ecb578284610ece565b83835b90925090506001600160a01b038216610f295760405162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f41444452455353000060448201526064016103fe565b9250929050565b6108c5838383610f4d565b6000610e27610f4983421190565b1590565b610f55610dac565b156108c557600554600160a01b900460ff16610f7057505050565b73b59dfc14d2037e3c4bf9c4fc1219f941e36de3e2630336a330610f92610729565b6040516001600160e01b031960e084901b1681526001600160a01b0391821660048201528187166024820152908516604482015260648101849052608401600060405180830381600087803b158015610fea57600080fd5b505af1158015610ffe573d6000803e3d6000fd5b50505050505050565b80356001600160a01b038116811461101e57600080fd5b919050565b60008083601f840112611034578182fd5b50813567ffffffffffffffff81111561104b578182fd5b6020830191508360208260051b8501011115610f2957600080fd5b600060208284031215611077578081fd5b61108082611007565b9392505050565b60008060408385031215611099578081fd5b6110a283611007565b91506110b060208401611007565b90509250929050565b6000806000606084860312156110cd578081fd5b6110d684611007565b92506110e460208501611007565b9150604084013590509250925092565b60008060408385031215611106578182fd5b61110f83611007565b946020939093013593505050565b6000806020838503121561112f578182fd5b823567ffffffffffffffff811115611145578283fd5b61115185828601611023565b90969095509350505050565b600080600060408486031215611171578283fd5b833567ffffffffffffffff811115611187578384fd5b61119386828701611023565b90945092506111a6905060208501611007565b90509250925092565b6000602082840312156111c0578081fd5b81518015158114611080578182fd5b6001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b6000602080835283518082850152825b8181101561123357858101830151858201604001528201611217565b818111156112445783604083870101525b50601f01601f1916929092016040019392505050565b60208082526033908201527f5573696e674c697175696469747950726f74656374696f6e536572766963653a604082015272081c1c9bdd1958dd1a5bdb881c995b5bdd9959606a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156112f5576112f5611350565b500190565b600181811c9082168061130e57607f821691505b6020821081141561132f57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561134957611349611350565b5060010190565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220055840d91b98a8026cccec255ed7f4f74e9498b92d4f455dbb62f36f48c56cf464736f6c63430008040033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101215760003560e01c806370a08231116100ad57806395ddbe891161007157806395ddbe891461024e578063a457c2d714610256578063a9059cbb14610269578063dd62ed3e1461027c578063f2fde38b146102b557600080fd5b806370a08231146101dd578063715018a61461020657806375ee83891461020e5780638da5cb5b1461022157806395d89b411461024657600080fd5b8063313ce567116100f4578063313ce5671461018c578063395093511461019b578063421dd7c7146101ae5780635300f82b146101b85780635fdb86f9146101ca57600080fd5b806306fdde0314610126578063095ea7b31461014457806318160ddd1461016757806323b872dd14610179575b600080fd5b61012e6102c8565b60405161013b9190611207565b60405180910390f35b6101576101523660046110f4565b61035a565b604051901515815260200161013b565b6002545b60405190815260200161013b565b6101576101873660046110b9565b610370565b6040516012815260200161013b565b6101576101a93660046110f4565b61041f565b6101b661045b565b005b600554600160a01b900460ff16610157565b6101b66101d836600461111d565b610472565b61016b6101eb366004611066565b6001600160a01b031660009081526020819052604090205490565b6101b661057e565b6101b661021c36600461115d565b6105b4565b6005546001600160a01b03165b6040516001600160a01b03909116815260200161013b565b61012e61071a565b61022e610729565b6101576102643660046110f4565b610784565b6101576102773660046110f4565b61081d565b61016b61028a366004611087565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6101b66102c3366004611066565b61082a565b6060600380546102d7906112fa565b80601f0160208091040260200160405190810160405280929190818152602001828054610303906112fa565b80156103505780601f1061032557610100808354040283529160200191610350565b820191906000526020600020905b81548152906001019060200180831161033357829003601f168201915b5050505050905090565b6000610367338484610a85565b50600192915050565b600061037d848484610ba9565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156104075760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6104148533858403610a85565b506001949350505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916103679185906104569086906112e2565b610a85565b610463610d82565b6005805460ff60a01b19169055565b61047a610d82565b610482610dac565b61049e5760405162461bcd60e51b81526004016103fe9061125a565b60006104a8610729565b905060005b828110156105785773b59dfc14d2037e3c4bf9c4fc1219f941e36de3e2630d8bd5e8838686858181106104f057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906105059190611066565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401600060405180830381600087803b15801561054d57600080fd5b505af1158015610561573d6000803e3d6000fd5b50505050808061057090611335565b9150506104ad565b50505050565b6005546001600160a01b031633146105a85760405162461bcd60e51b81526004016103fe906112ad565b6105b26000610dbb565b565b6105bc610d82565b6105c4610dac565b6105e05760405162461bcd60e51b81526004016103fe9061125a565b6005805460ff60a01b1916905560006105f7610729565b905060005b8381101561070057600085858381811061062657634e487b7160e01b600052603260045260246000fd5b905060200201602081019061063b9190611066565b905073b59dfc14d2037e3c4bf9c4fc1219f941e36de3e2604051634362c69f60e11b81526001600160a01b038581166004830152838116602483015291909116906386c58d3e9060440160206040518083038186803b15801561069d57600080fd5b505afa1580156106b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d591906111af565b156106ed576106ed81856106e884610e0d565b610e2d565b50806106f881611335565b9150506105fc565b50506005805460ff60a01b1916600160a01b179055505050565b6060600480546102d7906112fa565b600061077f7f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f3073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26108ca565b905090565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156108065760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016103fe565b6108133385858403610a85565b5060019392505050565b6000610367338484610ba9565b6005546001600160a01b031633146108545760405162461bcd60e51b81526004016103fe906112ad565b6001600160a01b0381166108b95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103fe565b6108c281610dbb565b50565b505050565b60008060006108d98585610e38565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b166034820152919350915086906048016040516020818303038152906040528051906020012088604051602001610932939291906111cf565b60408051601f198184030181529190528051602090910120979650505050505050565b6040805160608101825260008082526020820181905291810191909152826001600160a01b0316846001600160a01b03161115610990579192915b50604080516060810182526001600160a01b03948516815292909316602083015262ffffff169181019190915290565b600081602001516001600160a01b031682600001516001600160a01b0316106109e857600080fd5b815160208084015160408086015181516001600160a01b0395861681860152949092168482015262ffffff90911660608085019190915281518085039091018152608084019091528051910120610a66918591907fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b549060a0016111cf565b60408051601f1981840301815291905280516020909101209392505050565b6001600160a01b038316610ae75760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016103fe565b6001600160a01b038216610b485760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016103fe565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316610c0d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016103fe565b6001600160a01b038216610c6f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016103fe565b610c7a838383610f30565b6001600160a01b03831660009081526020819052604090205481811015610cf25760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016103fe565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290610d299084906112e2565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610d7591815260200190565b60405180910390a3610578565b6005546001600160a01b031633146105b25760405162461bcd60e51b81526004016103fe906112ad565b600061077f636153ac7f610f3b565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0381166000908152602081905260408120545b92915050565b6108c5838383610ba9565b600080826001600160a01b0316846001600160a01b03161415610eab5760405162461bcd60e51b815260206004820152602560248201527f556e697377617056324c6962726172793a204944454e544943414c5f41444452604482015264455353455360d81b60648201526084016103fe565b826001600160a01b0316846001600160a01b031610610ecb578284610ece565b83835b90925090506001600160a01b038216610f295760405162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f41444452455353000060448201526064016103fe565b9250929050565b6108c5838383610f4d565b6000610e27610f4983421190565b1590565b610f55610dac565b156108c557600554600160a01b900460ff16610f7057505050565b73b59dfc14d2037e3c4bf9c4fc1219f941e36de3e2630336a330610f92610729565b6040516001600160e01b031960e084901b1681526001600160a01b0391821660048201528187166024820152908516604482015260648101849052608401600060405180830381600087803b158015610fea57600080fd5b505af1158015610ffe573d6000803e3d6000fd5b50505050505050565b80356001600160a01b038116811461101e57600080fd5b919050565b60008083601f840112611034578182fd5b50813567ffffffffffffffff81111561104b578182fd5b6020830191508360208260051b8501011115610f2957600080fd5b600060208284031215611077578081fd5b61108082611007565b9392505050565b60008060408385031215611099578081fd5b6110a283611007565b91506110b060208401611007565b90509250929050565b6000806000606084860312156110cd578081fd5b6110d684611007565b92506110e460208501611007565b9150604084013590509250925092565b60008060408385031215611106578182fd5b61110f83611007565b946020939093013593505050565b6000806020838503121561112f578182fd5b823567ffffffffffffffff811115611145578283fd5b61115185828601611023565b90969095509350505050565b600080600060408486031215611171578283fd5b833567ffffffffffffffff811115611187578384fd5b61119386828701611023565b90945092506111a6905060208501611007565b90509250925092565b6000602082840312156111c0578081fd5b81518015158114611080578182fd5b6001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b6000602080835283518082850152825b8181101561123357858101830151858201604001528201611217565b818111156112445783604083870101525b50601f01601f1916929092016040019392505050565b60208082526033908201527f5573696e674c697175696469747950726f74656374696f6e536572766963653a604082015272081c1c9bdd1958dd1a5bdb881c995b5bdd9959606a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156112f5576112f5611350565b500190565b600181811c9082168061130e57607f821691505b6020821081141561132f57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561134957611349611350565b5060010190565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220055840d91b98a8026cccec255ed7f4f74e9498b92d4f455dbb62f36f48c56cf464736f6c63430008040033

Deployed Bytecode Sourcemap

26954:2231:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16950:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19117:169;;;;;;:::i;:::-;;:::i;:::-;;;5362:14:1;;5355:22;5337:41;;5325:2;5310:18;19117:169:0;5292:92:1;18070:108:0;18158:12;;18070:108;;;11410:25:1;;;11398:2;11383:18;18070:108:0;11365:76:1;19768:492:0;;;;;;:::i;:::-;;:::i;17912:93::-;;;17995:2;11588:36:1;;11576:2;11561:18;17912:93:0;11543:87:1;20669:215:0;;;;;;:::i;:::-;;:::i;6720:96::-;;;:::i;:::-;;6824:84;6891:9;;-1:-1:-1;;;6891:9:0;;;;6824:84;;6357:355;;;;;;:::i;:::-;;:::i;18241:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;18342:18:0;18315:7;18342:18;;;;;;;;;;;;18241:127;10828:94;;;:::i;5796:553::-;;;;;;:::i;:::-;;:::i;10177:87::-;10250:6;;-1:-1:-1;;;;;10250:6:0;10177:87;;;-1:-1:-1;;;;;3990:32:1;;;3972:51;;3960:2;3945:18;10177:87:0;3927:102:1;17169:104:0;;;:::i;7850:528::-;;;:::i;21387:413::-;;;;;;:::i;:::-;;:::i;18581:175::-;;;;;;:::i;:::-;;:::i;18819:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;18935:18:0;;;18908:7;18935:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;18819:151;11077:192;;;;;;:::i;:::-;;:::i;16950:100::-;17004:13;17037:5;17030:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16950:100;:::o;19117:169::-;19200:4;19217:39;9068:10;19240:7;19249:6;19217:8;:39::i;:::-;-1:-1:-1;19274:4:0;19117:169;;;;:::o;19768:492::-;19908:4;19925:36;19935:6;19943:9;19954:6;19925:9;:36::i;:::-;-1:-1:-1;;;;;20001:19:0;;19974:24;20001:19;;;:11;:19;;;;;;;;9068:10;20001:33;;;;;;;;20053:26;;;;20045:79;;;;-1:-1:-1;;;20045:79:0;;9120:2:1;20045:79:0;;;9102:21:1;9159:2;9139:18;;;9132:30;9198:34;9178:18;;;9171:62;-1:-1:-1;;;9249:18:1;;;9242:38;9297:19;;20045:79:0;;;;;;;;;20160:57;20169:6;9068:10;20210:6;20191:16;:25;20160:8;:57::i;:::-;-1:-1:-1;20248:4:0;;19768:492;-1:-1:-1;;;;19768:492:0:o;20669:215::-;9068:10;20757:4;20806:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;20806:34:0;;;;;;;;;;20757:4;;20774:80;;20797:7;;20806:47;;20843:10;;20806:47;:::i;:::-;20774:8;:80::i;6720:96::-;4372:22;:20;:22::i;:::-;6791:9:::1;:17:::0;;-1:-1:-1;;;;6791:17:0::1;::::0;;6720:96::o;6357:355::-;4372:22;:20;:22::i;:::-;6473:19:::1;:17;:19::i;:::-;6465:83;;;;-1:-1:-1::0;;;6465:83:0::1;;;;;;;:::i;:::-;6559:12;6574:18;:16;:18::i;:::-;6559:33;;6608:6;6603:102;6620:19:::0;;::::1;6603:102;;;27588:42:::0;6661:13:::1;6675:4:::0;6681:8;;6690:1;6681:11;;::::1;;;-1:-1:-1::0;;;6681:11:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6661:32;::::0;-1:-1:-1;;;;;;6661:32:0::1;::::0;;;;;;-1:-1:-1;;;;;4264:15:1;;;6661:32:0::1;::::0;::::1;4246:34:1::0;4316:15;;4296:18;;;4289:43;4181:18;;6661:32:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;6641:3;;;;;:::i;:::-;;;;6603:102;;;;4405:1;6357:355:::0;;:::o;10828:94::-;10250:6;;-1:-1:-1;;;;;10250:6:0;9068:10;10397:23;10389:68;;;;-1:-1:-1;;;10389:68:0;;;;;;;:::i;:::-;10893:21:::1;10911:1;10893:9;:21::i;:::-;10828:94::o:0;5796:553::-;4372:22;:20;:22::i;:::-;5917:19:::1;:17;:19::i;:::-;5909:83;;;;-1:-1:-1::0;;;5909:83:0::1;;;;;;;:::i;:::-;6003:9;:17:::0;;-1:-1:-1;;;;6003:17:0::1;::::0;;6015:5:::1;6046:18;:16;:18::i;:::-;6031:33;;6080:6;6075:240;6092:19:::0;;::::1;6075:240;;;6133:14;6150:8;;6159:1;6150:11;;;;;-1:-1:-1::0;;;6150:11:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6133:28:::0;-1:-1:-1;27588:42:0;6180:29:::1;::::0;-1:-1:-1;;;6180:29:0;;-1:-1:-1;;;;;4264:15:1;;;6180:29:0::1;::::0;::::1;4246:34:1::0;4316:15;;;4296:18;;;4289:43;6180:15:0;;;::::1;::::0;::::1;::::0;4181:18:1;;6180:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6176:128;;;6230:58;6245:6;6253:9;6264:23;6280:6;6264:15;:23::i;:::-;6230:14;:58::i;:::-;-1:-1:-1::0;6113:3:0;::::1;::::0;::::1;:::i;:::-;;;;6075:240;;;-1:-1:-1::0;;6325:9:0::1;:16:::0;;-1:-1:-1;;;;6325:16:0::1;-1:-1:-1::0;;;6325:16:0::1;::::0;;-1:-1:-1;;;5796:553:0:o;17169:104::-;17225:13;17258:7;17251:14;;;;;:::i;7850:528::-;7898:7;7983:91;3871:66;28006:42;8052:4;29018:42;7983:24;:91::i;:::-;7976:98;;7850:528;:::o;21387:413::-;9068:10;21480:4;21524:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;21524:34:0;;;;;;;;;;21577:35;;;;21569:85;;;;-1:-1:-1;;;21569:85:0;;11060:2:1;21569:85:0;;;11042:21:1;11099:2;11079:18;;;11072:30;11138:34;11118:18;;;11111:62;-1:-1:-1;;;11189:18:1;;;11182:35;11234:19;;21569:85:0;11032:227:1;21569:85:0;21690:67;9068:10;21713:7;21741:15;21722:16;:34;21690:8;:67::i;:::-;-1:-1:-1;21788:4:0;;21387:413;-1:-1:-1;;;21387:413:0:o;18581:175::-;18667:4;18684:42;9068:10;18708:9;18719:6;18684:9;:42::i;11077:192::-;10250:6;;-1:-1:-1;;;;;10250:6:0;9068:10;10397:23;10389:68;;;;-1:-1:-1;;;10389:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11166:22:0;::::1;11158:73;;;::::0;-1:-1:-1;;;11158:73:0;;7497:2:1;11158:73:0::1;::::0;::::1;7479:21:1::0;7536:2;7516:18;;;7509:30;7575:34;7555:18;;;7548:62;-1:-1:-1;;;7626:18:1;;;7619:36;7672:19;;11158:73:0::1;7469:228:1::0;11158:73:0::1;11242:19;11252:8;11242:9;:19::i;:::-;11077:192:::0;:::o;26051:125::-;;;;:::o;800:452::-;911:12;937:14;953;971:26;982:6;990;971:10;:26::i;:::-;1143:32;;-1:-1:-1;;3207:2:1;3203:15;;;3199:24;;1143:32:0;;;3187:37:1;3258:15;;;3254:24;3240:12;;;3233:46;936:61:0;;-1:-1:-1;936:61:0;-1:-1:-1;1107:7:0;;3295:12:1;;1143:32:0;;;;;;;;;;;;1133:43;;;;;;1195:12;1046:194;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1046:194:0;;;;;;;;;1036:205;;1046:194;1036:205;;;;;800:452;-1:-1:-1;;;;;;;800:452:0:o;2218:281::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;2379:6:0;-1:-1:-1;;;;;2370:15:0;:6;-1:-1:-1;;;;;2370:15:0;;2366:56;;;2407:6;;2415;2366:56;-1:-1:-1;2440:51:0;;;;;;;;-1:-1:-1;;;;;2440:51:0;;;;;;;;;;;;;;;;;;;;;;;2218:281::o;2752:535::-;2836:12;2882:3;:10;;;-1:-1:-1;;;;;2869:23:0;:3;:10;;;-1:-1:-1;;;;;2869:23:0;;2861:32;;;;;;3131:10;;3143;;;;;3155:7;;;;;3120:43;;-1:-1:-1;;;;;5060:15:1;;;3120:43:0;;;5042:34:1;5112:15;;;;5092:18;;;5085:43;5176:8;5164:21;;;5144:18;;;;5137:49;;;;3120:43:0;;;;;;;;;;4977:18:1;;;3120:43:0;;;3110:54;;;;;2999:234;;3076:7;;3110:54;1661:66;;2999:234;;;:::i;:::-;;;;-1:-1:-1;;2999:234:0;;;;;;;;;2967:285;;2999:234;2967:285;;;;;2752:535;-1:-1:-1;;;2752:535:0:o;25071:380::-;-1:-1:-1;;;;;25207:19:0;;25199:68;;;;-1:-1:-1;;;25199:68:0;;10296:2:1;25199:68:0;;;10278:21:1;10335:2;10315:18;;;10308:30;10374:34;10354:18;;;10347:62;-1:-1:-1;;;10425:18:1;;;10418:34;10469:19;;25199:68:0;10268:226:1;25199:68:0;-1:-1:-1;;;;;25286:21:0;;25278:68;;;;-1:-1:-1;;;25278:68:0;;7904:2:1;25278:68:0;;;7886:21:1;7943:2;7923:18;;;7916:30;7982:34;7962:18;;;7955:62;-1:-1:-1;;;8033:18:1;;;8026:32;8075:19;;25278:68:0;7876:224:1;25278:68:0;-1:-1:-1;;;;;25359:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;25411:32;;11410:25:1;;;25411:32:0;;11383:18:1;25411:32:0;;;;;;;25071:380;;;:::o;22290:733::-;-1:-1:-1;;;;;22430:20:0;;22422:70;;;;-1:-1:-1;;;22422:70:0;;9890:2:1;22422:70:0;;;9872:21:1;9929:2;9909:18;;;9902:30;9968:34;9948:18;;;9941:62;-1:-1:-1;;;10019:18:1;;;10012:35;10064:19;;22422:70:0;9862:227:1;22422:70:0;-1:-1:-1;;;;;22511:23:0;;22503:71;;;;-1:-1:-1;;;22503:71:0;;6199:2:1;22503:71:0;;;6181:21:1;6238:2;6218:18;;;6211:30;6277:34;6257:18;;;6250:62;-1:-1:-1;;;6328:18:1;;;6321:33;6371:19;;22503:71:0;6171:225:1;22503:71:0;22587:47;22608:6;22616:9;22627:6;22587:20;:47::i;:::-;-1:-1:-1;;;;;22671:17:0;;22647:21;22671:17;;;;;;;;;;;22707:23;;;;22699:74;;;;-1:-1:-1;;;22699:74:0;;8307:2:1;22699:74:0;;;8289:21:1;8346:2;8326:18;;;8319:30;8385:34;8365:18;;;8358:62;-1:-1:-1;;;8436:18:1;;;8429:36;8482:19;;22699:74:0;8279:228:1;22699:74:0;-1:-1:-1;;;;;22809:17:0;;;:9;:17;;;;;;;;;;;22829:22;;;22809:42;;22873:20;;;;;;;;:30;;22845:6;;22809:9;22873:30;;22845:6;;22873:30;:::i;:::-;;;;;;;;22938:9;-1:-1:-1;;;;;22921:35:0;22930:6;-1:-1:-1;;;;;22921:35:0;;22949:6;22921:35;;;;11410:25:1;;11398:2;11383:18;;11365:76;22921:35:0;;;;;;;;22969:46;26051:125;27388:67;10250:6;;-1:-1:-1;;;;;10250:6:0;9068:10;10397:23;10389:68;;;;-1:-1:-1;;;10389:68:0;;;;;;;:::i;28466:414::-;28526:4;28551:38;28578:10;28551:26;:38::i;11277:173::-;11352:6;;;-1:-1:-1;;;;;11369:17:0;;;-1:-1:-1;;;;;;11369:17:0;;;;;;;11402:40;;11352:6;;;11369:17;11352:6;;11402:40;;11333:16;;11402:40;11277:173;;:::o;27225:157::-;-1:-1:-1;;;;;18342:18:0;;27298:4;18342:18;;;;;;;;;;;27322;27315:25;27225:157;-1:-1:-1;;27225:157:0:o;27041:178::-;27136:30;27146:5;27153:3;27158:7;27136:9;:30::i;359:349::-;434:14;450;495:6;-1:-1:-1;;;;;485:16:0;:6;-1:-1:-1;;;;;485:16:0;;;477:66;;;;-1:-1:-1;;;477:66:0;;8714:2:1;477:66:0;;;8696:21:1;8753:2;8733:18;;;8726:30;8792:34;8772:18;;;8765:62;-1:-1:-1;;;8843:18:1;;;8836:35;8888:19;;477:66:0;8686:227:1;477:66:0;582:6;-1:-1:-1;;;;;573:15:0;:6;-1:-1:-1;;;;;573:15:0;;:53;;611:6;619;573:53;;;592:6;600;573:53;554:72;;-1:-1:-1;554:72:0;-1:-1:-1;;;;;;645:20:0;;637:63;;;;-1:-1:-1;;;637:63:0;;10701:2:1;637:63:0;;;10683:21:1;10740:2;10720:18;;;10713:30;10779:32;10759:18;;;10752:60;10829:18;;637:63:0;10673:180:1;637:63:0;359:349;;;;;:::o;28099:227::-;28258:60;28298:5;28305:3;28310:7;28258:39;:60::i;7022:130::-;7097:4;7121:23;7125:18;7132:10;7500:15;-1:-1:-1;7487:28:0;7408:115;7125:18;7607:11;;7531:95;5453:335;5576:19;:17;:19::i;:::-;5572:209;;;5617:9;;-1:-1:-1;;;5617:9:0;;;;5612:57;;5453:335;;;:::o;5612:57::-;27588:42;5683:45;5729:18;:16;:18::i;:::-;5683:86;;-1:-1:-1;;;;;;5683:86:0;;;;;;;-1:-1:-1;;;;;4630:15:1;;;5683:86:0;;;4612:34:1;4682:15;;;4662:18;;;4655:43;4734:15;;;4714:18;;;4707:43;4766:18;;;4759:34;;;4546:19;;5683:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5453:335;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:395::-;255:8;265:6;319:3;312:4;304:6;300:17;296:27;286:2;;344:8;334;327:26;286:2;-1:-1:-1;374:20:1;;417:18;406:30;;403:2;;;456:8;446;439:26;403:2;500:4;492:6;488:17;476:29;;560:3;553:4;543:6;540:1;536:14;528:6;524:27;520:38;517:47;514:2;;;577:1;574;567:12;592:196;651:6;704:2;692:9;683:7;679:23;675:32;672:2;;;725:6;717;710:22;672:2;753:29;772:9;753:29;:::i;:::-;743:39;662:126;-1:-1:-1;;;662:126:1:o;793:270::-;861:6;869;922:2;910:9;901:7;897:23;893:32;890:2;;;943:6;935;928:22;890:2;971:29;990:9;971:29;:::i;:::-;961:39;;1019:38;1053:2;1042:9;1038:18;1019:38;:::i;:::-;1009:48;;880:183;;;;;:::o;1068:338::-;1145:6;1153;1161;1214:2;1202:9;1193:7;1189:23;1185:32;1182:2;;;1235:6;1227;1220:22;1182:2;1263:29;1282:9;1263:29;:::i;:::-;1253:39;;1311:38;1345:2;1334:9;1330:18;1311:38;:::i;:::-;1301:48;;1396:2;1385:9;1381:18;1368:32;1358:42;;1172:234;;;;;:::o;1411:264::-;1479:6;1487;1540:2;1528:9;1519:7;1515:23;1511:32;1508:2;;;1561:6;1553;1546:22;1508:2;1589:29;1608:9;1589:29;:::i;:::-;1579:39;1665:2;1650:18;;;;1637:32;;-1:-1:-1;;;1498:177:1:o;1680:457::-;1766:6;1774;1827:2;1815:9;1806:7;1802:23;1798:32;1795:2;;;1848:6;1840;1833:22;1795:2;1893:9;1880:23;1926:18;1918:6;1915:30;1912:2;;;1963:6;1955;1948:22;1912:2;2007:70;2069:7;2060:6;2049:9;2045:22;2007:70;:::i;:::-;2096:8;;1981:96;;-1:-1:-1;1785:352:1;-1:-1:-1;;;;1785:352:1:o;2142:531::-;2237:6;2245;2253;2306:2;2294:9;2285:7;2281:23;2277:32;2274:2;;;2327:6;2319;2312:22;2274:2;2372:9;2359:23;2405:18;2397:6;2394:30;2391:2;;;2442:6;2434;2427:22;2391:2;2486:70;2548:7;2539:6;2528:9;2524:22;2486:70;:::i;:::-;2575:8;;-1:-1:-1;2460:96:1;-1:-1:-1;2629:38:1;;-1:-1:-1;2663:2:1;2648:18;;2629:38;:::i;:::-;2619:48;;2264:409;;;;;:::o;2678:297::-;2745:6;2798:2;2786:9;2777:7;2773:23;2769:32;2766:2;;;2819:6;2811;2804:22;2766:2;2856:9;2850:16;2909:5;2902:13;2895:21;2888:5;2885:32;2875:2;;2936:6;2928;2921:22;3318:503;-1:-1:-1;;;;;;3604:26:1;;3667:2;3663:15;;;;-1:-1:-1;;3659:53:1;3655:1;3646:11;;3639:74;3738:2;3729:12;;3722:28;;;;3775:2;3766:12;;3759:28;3812:2;3803:12;;3594:227::o;5389:603::-;5501:4;5530:2;5559;5548:9;5541:21;5591:6;5585:13;5634:6;5629:2;5618:9;5614:18;5607:34;5659:4;5672:140;5686:6;5683:1;5680:13;5672:140;;;5781:14;;;5777:23;;5771:30;5747:17;;;5766:2;5743:26;5736:66;5701:10;;5672:140;;;5830:6;5827:1;5824:13;5821:2;;;5900:4;5895:2;5886:6;5875:9;5871:22;5867:31;5860:45;5821:2;-1:-1:-1;5976:2:1;5955:15;-1:-1:-1;;5951:29:1;5936:45;;;;5983:2;5932:54;;5510:482;-1:-1:-1;;;5510:482:1:o;6401:415::-;6603:2;6585:21;;;6642:2;6622:18;;;6615:30;6681:34;6676:2;6661:18;;6654:62;-1:-1:-1;;;6747:2:1;6732:18;;6725:49;6806:3;6791:19;;6575:241::o;9327:356::-;9529:2;9511:21;;;9548:18;;;9541:30;9607:34;9602:2;9587:18;;9580:62;9674:2;9659:18;;9501:182::o;11635:128::-;11675:3;11706:1;11702:6;11699:1;11696:13;11693:2;;;11712:18;;:::i;:::-;-1:-1:-1;11748:9:1;;11683:80::o;11768:380::-;11847:1;11843:12;;;;11890;;;11911:2;;11965:4;11957:6;11953:17;11943:27;;11911:2;12018;12010:6;12007:14;11987:18;11984:38;11981:2;;;12064:10;12059:3;12055:20;12052:1;12045:31;12099:4;12096:1;12089:15;12127:4;12124:1;12117:15;11981:2;;11823:325;;;:::o;12153:135::-;12192:3;-1:-1:-1;;12213:17:1;;12210:2;;;12233:18;;:::i;:::-;-1:-1:-1;12280:1:1;12269:13;;12200:88::o;12293:127::-;12354:10;12349:3;12345:20;12342:1;12335:31;12385:4;12382:1;12375:15;12409:4;12406:1;12399:15

Swarm Source

ipfs://055840d91b98a8026cccec255ed7f4f74e9498b92d4f455dbb62f36f48c56cf4
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.