ETH Price: $3,049.62 (+2.91%)
Gas: 1 Gwei

Token

Ignant (IGNANT)
 

Overview

Max Total Supply

74,599,309,000,821.430442454728489444 IGNANT

Holders

79

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
87,157,613,018.518639455782312925 IGNANT

Value
$0.00
0x3d0de7e4599f0f81776c4f46d8101ccfd5a852c6
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
IGNANT

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity Multiple files format)

File 3 of 4: ignant.sol
//ignant.sol
//.___ ._____  .______  .______  .______  _____._
//: __|:_ ___\ :      \ :      \ :      \ \__ _:|
//| : ||   |___|       ||   .   ||       |  |  :|
//|   ||   /  ||   |   ||   :   ||   |   |  |   |
//|   ||. __  ||___|   ||___|   ||___|   |  |   |
//|___| :/ |. |    |___|    |___|    |___|  |___|
//      :   :/                                   
//    
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.4;

import "./SafeMath.sol";
import "./IERC20.sol";
import "./Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations 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, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */

library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


////////////////////////////////////////////////
////////////////////EVENTS/////////////////////
//////////////////////////////////////////////

contract TokenEvents {
    
    //when a user stakes AIG
    event TokenStake(
        address indexed user,
        uint value
    );

    //when a user unstakes AIG
    event TokenUnstake(
        address indexed user,
        uint value
    );
    
    //when a user burns tokens
    event TokenBurn(
        address indexed user,
        uint value
    );
    
}

//////////////////////////////////////
////////// TOKEN CONTRACT////////
////////////////////////////////////
contract IGNANT is IERC20, TokenEvents {

    using SafeMath for uint256;
    using SafeMath for uint64;
    using SafeMath for uint32;
    using SafeMath for uint16;
    using SafeMath for uint8;

    using SafeERC20 for IGNANT;
    
    
    mapping (address => uint256) private _balances;

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

    //stake setup
    address constant AIGADDRESS = 0x6e9513330fe54AD5a793908dFE5676596394534a;
    uint256 constant internal MINUTESECONDS = 60;
    uint256 constant internal DAYSECONDS = 86400;
    uint256 constant internal MINSTAKEDAYLENGTH = 3;
    uint256 internal deploymentTime;
    uint256 public totalStaked;
    
    //tokenomics
    uint256 internal _totalSupply;
    string public constant name = "Ignant";
    string public constant symbol = "IGNANT";
    uint8 public constant decimals = 18;

    //staker
    bool private sync;
    mapping (address => Staker) public staker;
    
    struct Staker{
        uint256 stakedBalance;
        uint256 stakeStartTimestamp;
        uint256 totalStakingInterest;
        uint256 totalBurnt;
    }
    
    //protects against potential reentrancy
    modifier synchronized {
        require(!sync, "Sync lock");
        sync = true;
        _;
        sync = false;
    }

    constructor() {
    deploymentTime = block.timestamp;
    _mint(msg.sender, 100000000000000000000000000000000);
    }
    
    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() external view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view 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) external override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) external override returns (bool) {
        _approve(msg.sender, 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) external override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance"));
        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) external returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(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) external returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`
     *
     * This is 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 {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

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

    /**
     * @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 {
        require(account != address(0), "ERC20: burn from the zero address");
        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is 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 {
        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 Destroys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See {_burn} and {_approve}.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount, "ERC20: burn amount exceeds allowance"));
    }

    ////////////////////////////////////////////////////////
    /////////////////PUBLIC FACING - IGNANT CONTROL//////////
    //////////////////////////////////////////////////////
    
    
    ////////STAKING FUNCTIONS/////////
    
    //stake AIG tokens to contract and claims any accrued IGNANT interest
    function StakeTokens(uint amt)
        external
        synchronized
    {
        require(amt > 0, "zero input");
        require(IERC20(AIGADDRESS).allowance(msg.sender, address(this)) >= amt, "Error: not approved");//ensure user has approved funds
        require(IERC20(AIGADDRESS).balanceOf(msg.sender) >= amt, "Error: insufficient balance");//ensure user has enough funds
        //claim any accrued interest
        claimInterest();
        //update balances
        staker[msg.sender].stakedBalance = staker[msg.sender].stakedBalance.add(amt);
        totalStaked = totalStaked.add(amt);
        IERC20(AIGADDRESS).transferFrom(msg.sender, address(this), amt);//make transfer
        emit TokenStake(msg.sender, amt);
    }
    
    //unstake AIG tokens from contract and claims any accrued IGNANT interest
    function UnstakeTokens()
        external
        synchronized
    {
        require(staker[msg.sender].stakedBalance > 0,"Error: unsufficient staked balance");//ensure user has enough staked funds
        require(isStakeFinished(msg.sender), "tokens cannot be unstaked yet. min 3 day stake");
        uint amt = staker[msg.sender].stakedBalance;
        //claim any accrued interest
        claimInterest();
        //zero out staking timestamp
        staker[msg.sender].stakeStartTimestamp = 0;
        staker[msg.sender].stakedBalance = 0;
        totalStaked = totalStaked.sub(amt);
        IERC20(AIGADDRESS).transfer(msg.sender, amt);//make transfer
        emit TokenUnstake(msg.sender, amt);
    }
    
    //claim any accrued interest
    function ClaimStakeInterest()
        external
        synchronized
    {
        require(staker[msg.sender].stakedBalance > 0, "you have no staked balance");
        claimInterest();
    }
    
    function claimInterest()
        internal
    {
        //calculate staking interest
        uint256 interest = calcStakingRewards(msg.sender);
        //reset staking timestamp
        staker[msg.sender].stakeStartTimestamp = block.timestamp;
        //mint interest if any
        if(interest > 0){
            _mint(msg.sender, interest);
            staker[msg.sender].totalStakingInterest += interest;
        }
    }

    function BurnIgnant(uint amt)
        external
        synchronized
    {
        require(amt > 0, "value must be greater than 0");
        require(balanceOf(msg.sender) >= amt, "balance too low");
        claimInterest();
        //burn tokens of user
        _burn(msg.sender, amt);
        staker[msg.sender].totalBurnt += amt;
        emit TokenBurn(msg.sender, amt);
    }

    ///////////////////////////////
    ////////VIEW ONLY//////////////
    ///////////////////////////////

    // returns staking rewards in IGNANT based on AIG staked
    function calcStakingRewards(address _user)
        public
        view
        returns(uint)
    {
        // Stake AIG for minimum 10.01% APY paid in IGNANT tokens
        // APY boost adjustments up to a max of 10010% APY via burning of IGNANT.
        // Maximum APY achievable by burning IGNANT diminishes daily for 100 days, from 10,000% to 100% APY.
        uint ignantBurnt = staker[_user].totalBurnt; // Total IGNANT burn
        uint aigStaked = staker[_user].stakedBalance; // Total AIG staked
        uint apyAdjust = 10000; // 10.01% min APY
        uint maxApyAdjust = 10; // 10010% max APY on day 1
        // e.g. day 2 @ ~5000%, day 4 @ ~2500%, day 8 @ ~1250% , day 16 @ ~625%, day 50 @ ~200%, day 75 @ ~133%, day 100 @ ~100%
        uint maxApyAdjustAfterPeriod = 1000;// 100 days after contract deployment, ~100% APY is the highest achievable for all users.

        //has user burnt?
        if(ignantBurnt > 0){
            //has user burnt amount for max APY? 100% of staked balance
            if(ignantBurnt >= aigStaked)
            {
                apyAdjust = maxApyAdjust.add(daysSinceDeployment().mul(10));
                //limit max APY when high inflationary period finished
                if(daysSinceDeployment() >= 100){
                    apyAdjust = maxApyAdjustAfterPeriod;
                }
            }
            else{
                uint burntPercentage = (ignantBurnt.mul(100) / aigStaked);
                uint v = (apyAdjust * burntPercentage) / 100;
                apyAdjust = apyAdjust.sub(v);
                if(apyAdjust < maxApyAdjust.add(daysSinceDeployment().mul(10))){
                    apyAdjust = maxApyAdjust.add(daysSinceDeployment().mul(10));
                    //limit max APY when high inflationary period finished
                    if(daysSinceDeployment() >= 100){
                        apyAdjust = (10000 - v);
                        if(apyAdjust < maxApyAdjustAfterPeriod)
                        {
                            apyAdjust = maxApyAdjustAfterPeriod;
                        }
                    }
                }
            }
        }
        return (aigStaked.mul(minsPastStakeTime(_user)).div(apyAdjust).div(525));
    }

    //returns amount of days elapsed since contract deployment
    function daysSinceDeployment()
        public
        view
        returns(uint)
    {
            return block.timestamp.sub(deploymentTime).div(1 days);
    }

    //returns amount of minutes past since stake start
    function minsPastStakeTime(address _user)
        public
        view
        returns(uint)
    {
        if(staker[_user].stakeStartTimestamp == 0){
            return 0;
        }
        uint minsPast = block.timestamp.sub(staker[_user].stakeStartTimestamp).div(MINUTESECONDS);
        if(minsPast >= 1){
            return minsPast;// returns 0 if under 1 min passed
        }
        else{
            return 0;
        }
    }
    
    //check is stake finished, min 3 days
    function isStakeFinished(address _user)
        public
        view
        returns(bool)
    {
        if(staker[_user].stakeStartTimestamp == 0){
            return false;
        }
        else{
            return staker[_user].stakeStartTimestamp.add((DAYSECONDS).mul(MINSTAKEDAYLENGTH)) <= block.timestamp;
        }
    }

}

File 1 of 4: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.4;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

File 2 of 4: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.4;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

    /**
     * @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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount) external returns (bool);
}

File 4 of 4: SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.4;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TokenBurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TokenStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TokenUnstake","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":"uint256","name":"amt","type":"uint256"}],"name":"BurnIgnant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ClaimStakeInterest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"StakeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"UnstakeTokens","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":[{"internalType":"address","name":"_user","type":"address"}],"name":"calcStakingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"daysSinceDeployment","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":[{"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":[{"internalType":"address","name":"_user","type":"address"}],"name":"isStakeFinished","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"minsPastStakeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"staker","outputs":[{"internalType":"uint256","name":"stakedBalance","type":"uint256"},{"internalType":"uint256","name":"stakeStartTimestamp","type":"uint256"},{"internalType":"uint256","name":"totalStakingInterest","type":"uint256"},{"internalType":"uint256","name":"totalBurnt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}]

60806040523480156200001157600080fd5b504260025562000030336d04ee2d6d415b85acef810000000062000036565b62000171565b806001600160a01b038316620000925760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b620000ae816004546200013760201b62000db41790919060201c565b6004556001600160a01b03831660009081526020818152604090912054620000e191839062000db462000137821b17901c565b6001600160a01b038416600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b60006200014582846200014c565b9392505050565b600082198211156200016c57634e487b7160e01b81526011600452602481fd5b500190565b6115dc80620001816000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c8063817b1cd2116100b8578063a9059cbb1161007c578063a9059cbb146102e3578063d650694c146102f6578063dd62ed3e14610309578063e86f1b5c14610342578063ec33001a1461034a578063f3c756dc1461035d57600080fd5b8063817b1cd21461023a57806382e4eda41461024357806395d89b4114610298578063a457c2d7146102bd578063a5e9411e146102d057600080fd5b80633149432c116100ff5780633149432c146101d957806338a05871146101ec57806339509351146101f65780635bacfe721461020957806370a082311461021157600080fd5b806306fdde031461013c578063095ea7b31461017757806318160ddd1461019a57806323b872dd146101ac578063313ce567146101bf575b600080fd5b610161604051806040016040528060068152602001651259db985b9d60d21b81525081565b60405161016e9190611417565b60405180910390f35b61018a61018536600461139e565b610370565b604051901515815260200161016e565b6004545b60405190815260200161016e565b61018a6101ba366004611363565b610386565b6101c7601281565b60405160ff909116815260200161016e565b61019e6101e7366004611317565b6103ef565b6101f4610524565b005b61018a61020436600461139e565b6105cd565b61019e610603565b61019e61021f366004611317565b6001600160a01b031660009081526020819052604090205490565b61019e60035481565b610278610251366004611317565b60066020526000908152604090208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161016e565b610161604051806040016040528060068152602001651251d390539560d21b81525081565b61018a6102cb36600461139e565b610626565b6101f46102de3660046113e7565b610675565b61018a6102f136600461139e565b6107bf565b61019e610304366004611317565b6107cc565b61019e610317366004611331565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6101f461083b565b61018a610358366004611317565b610a3b565b6101f461036b3660046113e7565b610aa4565b600061037d338484610dc7565b50600192915050565b6000610393848484610eec565b6103e584336103e08560405180606001604052806028815260200161155a602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061106f565b610dc7565b5060019392505050565b6001600160a01b038116600090815260066020526040812060038101549054612710600a6103e884156104f65783851061045a57610440610439600a610433610603565b9061109b565b8390610db4565b9250606461044c610603565b10610455578092505b6104f6565b60008461046887606461109b565b61047291906114a5565b90506000606461048283876114c5565b61048c91906114a5565b905061049885826110a7565b94506104b16104aa600a610433610603565b8590610db4565b8510156104f3576104c86104aa600a610433610603565b945060646104d4610603565b106104f3576104e5816127106114e4565b9450828510156104f3578294505b50505b61051961020d6105138561051361050c8c6107cc565b899061109b565b906110b3565b979650505050505050565b60055460ff16156105505760405162461bcd60e51b81526004016105479061146a565b60405180910390fd5b6005805460ff19166001179055336000908152600660205260409020546105b95760405162461bcd60e51b815260206004820152601a60248201527f796f752068617665206e6f207374616b65642062616c616e63650000000000006044820152606401610547565b6105c16110bf565b6005805460ff19169055565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161037d9185906103e09086610db4565b600061062162015180610513600254426110a790919063ffffffff16565b905090565b600061037d33846103e085604051806060016040528060258152602001611582602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061106f565b60055460ff16156106985760405162461bcd60e51b81526004016105479061146a565b6005805460ff19166001179055806106f25760405162461bcd60e51b815260206004820152601c60248201527f76616c7565206d7573742062652067726561746572207468616e2030000000006044820152606401610547565b336000908152602081905260409020548111156107435760405162461bcd60e51b815260206004820152600f60248201526e62616c616e636520746f6f206c6f7760881b6044820152606401610547565b61074b6110bf565b610755338261111d565b336000908152600660205260408120600301805483929061077790849061148d565b909155505060405181815233907fab85194d35c4ea153d0b51f3a304d1d22cb8023e499a6503fb6c28c5864ae90e906020015b60405180910390a2506005805460ff19169055565b600061037d338484610eec565b6001600160a01b0381166000908152600660205260408120600101546107f457506000919050565b6001600160a01b03821660009081526006602052604081206001015461082290603c906105139042906110a7565b9050600181106108325792915050565b50600092915050565b60055460ff161561085e5760405162461bcd60e51b81526004016105479061146a565b6005805460ff19166001179055336000908152600660205260409020546108d25760405162461bcd60e51b815260206004820152602260248201527f4572726f723a20756e73756666696369656e74207374616b65642062616c616e604482015261636560f01b6064820152608401610547565b6108db33610a3b565b61093e5760405162461bcd60e51b815260206004820152602e60248201527f746f6b656e732063616e6e6f7420626520756e7374616b6564207965742e206d60448201526d696e203320646179207374616b6560901b6064820152608401610547565b336000908152600660205260409020546109566110bf565b336000908152600660205260408120600181018290555560035461097a90826110a7565b60035560405163a9059cbb60e01b815233600482015260248101829052736e9513330fe54ad5a793908dfe5676596394534a9063a9059cbb90604401602060405180830381600087803b1580156109d057600080fd5b505af11580156109e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0891906113c7565b5060405181815233907f43a932fdc9d096891853e1e003cefbdaa5f14e174721aa1f9668616323afa334906020016107aa565b6001600160a01b038116600090815260066020526040812060010154610a6357506000919050565b42610a97610a7562015180600361109b565b6001600160a01b03851660009081526006602052604090206001015490610db4565b111592915050565b919050565b60055460ff1615610ac75760405162461bcd60e51b81526004016105479061146a565b6005805460ff1916600117905580610b0e5760405162461bcd60e51b815260206004820152600a6024820152691e995c9bc81a5b9c1d5d60b21b6044820152606401610547565b604051636eb1769f60e11b81523360048201523060248201528190736e9513330fe54ad5a793908dfe5676596394534a9063dd62ed3e9060440160206040518083038186803b158015610b6057600080fd5b505afa158015610b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9891906113ff565b1015610bdc5760405162461bcd60e51b8152602060048201526013602482015272115c9c9bdc8e881b9bdd08185c1c1c9bdd9959606a1b6044820152606401610547565b6040516370a0823160e01b81523360048201528190736e9513330fe54ad5a793908dfe5676596394534a906370a082319060240160206040518083038186803b158015610c2857600080fd5b505afa158015610c3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6091906113ff565b1015610cae5760405162461bcd60e51b815260206004820152601b60248201527f4572726f723a20696e73756666696369656e742062616c616e636500000000006044820152606401610547565b610cb66110bf565b33600090815260066020526040902054610cd09082610db4565b33600090815260066020526040902055600354610ced9082610db4565b6003556040516323b872dd60e01b815233600482015230602482015260448101829052736e9513330fe54ad5a793908dfe5676596394534a906323b872dd90606401602060405180830381600087803b158015610d4957600080fd5b505af1158015610d5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8191906113c7565b5060405181815233907facf5378a9125b9a91e37c0cad37a66b4b63bc3494776388fc87056260e031576906020016107aa565b6000610dc0828461148d565b9392505050565b6001600160a01b038316610e295760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610547565b6001600160a01b038216610e8a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610547565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316610f505760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610547565b6001600160a01b038216610fb25760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610547565b610fef81604051806060016040528060268152602001611534602691396001600160a01b038616600090815260208190526040902054919061106f565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461101e9082610db4565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610edf565b600081848411156110935760405162461bcd60e51b81526004016105479190611417565b505050900390565b6000610dc082846114c5565b6000610dc082846114e4565b6000610dc082846114a5565b60006110ca336103ef565b336000908152600660205260409020426001909101559050801561111a576110f23382611228565b336000908152600660205260408120600201805483929061111490849061148d565b90915550505b50565b6001600160a01b03821661117d5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610547565b6111ba81604051806060016040528060228152602001611512602291396001600160a01b038516600090815260208190526040902054919061106f565b6001600160a01b0383166000908152602081905260409020556004546111e090826110a7565b6004556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b806001600160a01b03831661127f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610547565b60045461128c9082610db4565b6004556001600160a01b0383166000908152602081905260409020546112b29082610db4565b6001600160a01b038416600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610edf565b80356001600160a01b0381168114610a9f57600080fd5b600060208284031215611328578081fd5b610dc082611300565b60008060408385031215611343578081fd5b61134c83611300565b915061135a60208401611300565b90509250929050565b600080600060608486031215611377578081fd5b61138084611300565b925061138e60208501611300565b9150604084013590509250925092565b600080604083850312156113b0578182fd5b6113b983611300565b946020939093013593505050565b6000602082840312156113d8578081fd5b81518015158114610dc0578182fd5b6000602082840312156113f8578081fd5b5035919050565b600060208284031215611410578081fd5b5051919050565b6000602080835283518082850152825b8181101561144357858101830151858201604001528201611427565b818111156114545783604083870101525b50601f01601f1916929092016040019392505050565b60208082526009908201526853796e63206c6f636b60b81b604082015260600190565b600082198211156114a0576114a06114fb565b500190565b6000826114c057634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156114df576114df6114fb565b500290565b6000828210156114f6576114f66114fb565b500390565b634e487b7160e01b600052601160045260246000fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220964522a67d25664e236fa1e7ec6f91b31357b290ab0d83db97d7b026576a684964736f6c63430008040033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101375760003560e01c8063817b1cd2116100b8578063a9059cbb1161007c578063a9059cbb146102e3578063d650694c146102f6578063dd62ed3e14610309578063e86f1b5c14610342578063ec33001a1461034a578063f3c756dc1461035d57600080fd5b8063817b1cd21461023a57806382e4eda41461024357806395d89b4114610298578063a457c2d7146102bd578063a5e9411e146102d057600080fd5b80633149432c116100ff5780633149432c146101d957806338a05871146101ec57806339509351146101f65780635bacfe721461020957806370a082311461021157600080fd5b806306fdde031461013c578063095ea7b31461017757806318160ddd1461019a57806323b872dd146101ac578063313ce567146101bf575b600080fd5b610161604051806040016040528060068152602001651259db985b9d60d21b81525081565b60405161016e9190611417565b60405180910390f35b61018a61018536600461139e565b610370565b604051901515815260200161016e565b6004545b60405190815260200161016e565b61018a6101ba366004611363565b610386565b6101c7601281565b60405160ff909116815260200161016e565b61019e6101e7366004611317565b6103ef565b6101f4610524565b005b61018a61020436600461139e565b6105cd565b61019e610603565b61019e61021f366004611317565b6001600160a01b031660009081526020819052604090205490565b61019e60035481565b610278610251366004611317565b60066020526000908152604090208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161016e565b610161604051806040016040528060068152602001651251d390539560d21b81525081565b61018a6102cb36600461139e565b610626565b6101f46102de3660046113e7565b610675565b61018a6102f136600461139e565b6107bf565b61019e610304366004611317565b6107cc565b61019e610317366004611331565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6101f461083b565b61018a610358366004611317565b610a3b565b6101f461036b3660046113e7565b610aa4565b600061037d338484610dc7565b50600192915050565b6000610393848484610eec565b6103e584336103e08560405180606001604052806028815260200161155a602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061106f565b610dc7565b5060019392505050565b6001600160a01b038116600090815260066020526040812060038101549054612710600a6103e884156104f65783851061045a57610440610439600a610433610603565b9061109b565b8390610db4565b9250606461044c610603565b10610455578092505b6104f6565b60008461046887606461109b565b61047291906114a5565b90506000606461048283876114c5565b61048c91906114a5565b905061049885826110a7565b94506104b16104aa600a610433610603565b8590610db4565b8510156104f3576104c86104aa600a610433610603565b945060646104d4610603565b106104f3576104e5816127106114e4565b9450828510156104f3578294505b50505b61051961020d6105138561051361050c8c6107cc565b899061109b565b906110b3565b979650505050505050565b60055460ff16156105505760405162461bcd60e51b81526004016105479061146a565b60405180910390fd5b6005805460ff19166001179055336000908152600660205260409020546105b95760405162461bcd60e51b815260206004820152601a60248201527f796f752068617665206e6f207374616b65642062616c616e63650000000000006044820152606401610547565b6105c16110bf565b6005805460ff19169055565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161037d9185906103e09086610db4565b600061062162015180610513600254426110a790919063ffffffff16565b905090565b600061037d33846103e085604051806060016040528060258152602001611582602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061106f565b60055460ff16156106985760405162461bcd60e51b81526004016105479061146a565b6005805460ff19166001179055806106f25760405162461bcd60e51b815260206004820152601c60248201527f76616c7565206d7573742062652067726561746572207468616e2030000000006044820152606401610547565b336000908152602081905260409020548111156107435760405162461bcd60e51b815260206004820152600f60248201526e62616c616e636520746f6f206c6f7760881b6044820152606401610547565b61074b6110bf565b610755338261111d565b336000908152600660205260408120600301805483929061077790849061148d565b909155505060405181815233907fab85194d35c4ea153d0b51f3a304d1d22cb8023e499a6503fb6c28c5864ae90e906020015b60405180910390a2506005805460ff19169055565b600061037d338484610eec565b6001600160a01b0381166000908152600660205260408120600101546107f457506000919050565b6001600160a01b03821660009081526006602052604081206001015461082290603c906105139042906110a7565b9050600181106108325792915050565b50600092915050565b60055460ff161561085e5760405162461bcd60e51b81526004016105479061146a565b6005805460ff19166001179055336000908152600660205260409020546108d25760405162461bcd60e51b815260206004820152602260248201527f4572726f723a20756e73756666696369656e74207374616b65642062616c616e604482015261636560f01b6064820152608401610547565b6108db33610a3b565b61093e5760405162461bcd60e51b815260206004820152602e60248201527f746f6b656e732063616e6e6f7420626520756e7374616b6564207965742e206d60448201526d696e203320646179207374616b6560901b6064820152608401610547565b336000908152600660205260409020546109566110bf565b336000908152600660205260408120600181018290555560035461097a90826110a7565b60035560405163a9059cbb60e01b815233600482015260248101829052736e9513330fe54ad5a793908dfe5676596394534a9063a9059cbb90604401602060405180830381600087803b1580156109d057600080fd5b505af11580156109e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0891906113c7565b5060405181815233907f43a932fdc9d096891853e1e003cefbdaa5f14e174721aa1f9668616323afa334906020016107aa565b6001600160a01b038116600090815260066020526040812060010154610a6357506000919050565b42610a97610a7562015180600361109b565b6001600160a01b03851660009081526006602052604090206001015490610db4565b111592915050565b919050565b60055460ff1615610ac75760405162461bcd60e51b81526004016105479061146a565b6005805460ff1916600117905580610b0e5760405162461bcd60e51b815260206004820152600a6024820152691e995c9bc81a5b9c1d5d60b21b6044820152606401610547565b604051636eb1769f60e11b81523360048201523060248201528190736e9513330fe54ad5a793908dfe5676596394534a9063dd62ed3e9060440160206040518083038186803b158015610b6057600080fd5b505afa158015610b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9891906113ff565b1015610bdc5760405162461bcd60e51b8152602060048201526013602482015272115c9c9bdc8e881b9bdd08185c1c1c9bdd9959606a1b6044820152606401610547565b6040516370a0823160e01b81523360048201528190736e9513330fe54ad5a793908dfe5676596394534a906370a082319060240160206040518083038186803b158015610c2857600080fd5b505afa158015610c3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6091906113ff565b1015610cae5760405162461bcd60e51b815260206004820152601b60248201527f4572726f723a20696e73756666696369656e742062616c616e636500000000006044820152606401610547565b610cb66110bf565b33600090815260066020526040902054610cd09082610db4565b33600090815260066020526040902055600354610ced9082610db4565b6003556040516323b872dd60e01b815233600482015230602482015260448101829052736e9513330fe54ad5a793908dfe5676596394534a906323b872dd90606401602060405180830381600087803b158015610d4957600080fd5b505af1158015610d5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8191906113c7565b5060405181815233907facf5378a9125b9a91e37c0cad37a66b4b63bc3494776388fc87056260e031576906020016107aa565b6000610dc0828461148d565b9392505050565b6001600160a01b038316610e295760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610547565b6001600160a01b038216610e8a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610547565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316610f505760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610547565b6001600160a01b038216610fb25760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610547565b610fef81604051806060016040528060268152602001611534602691396001600160a01b038616600090815260208190526040902054919061106f565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461101e9082610db4565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610edf565b600081848411156110935760405162461bcd60e51b81526004016105479190611417565b505050900390565b6000610dc082846114c5565b6000610dc082846114e4565b6000610dc082846114a5565b60006110ca336103ef565b336000908152600660205260409020426001909101559050801561111a576110f23382611228565b336000908152600660205260408120600201805483929061111490849061148d565b90915550505b50565b6001600160a01b03821661117d5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610547565b6111ba81604051806060016040528060228152602001611512602291396001600160a01b038516600090815260208190526040902054919061106f565b6001600160a01b0383166000908152602081905260409020556004546111e090826110a7565b6004556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b806001600160a01b03831661127f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610547565b60045461128c9082610db4565b6004556001600160a01b0383166000908152602081905260409020546112b29082610db4565b6001600160a01b038416600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610edf565b80356001600160a01b0381168114610a9f57600080fd5b600060208284031215611328578081fd5b610dc082611300565b60008060408385031215611343578081fd5b61134c83611300565b915061135a60208401611300565b90509250929050565b600080600060608486031215611377578081fd5b61138084611300565b925061138e60208501611300565b9150604084013590509250925092565b600080604083850312156113b0578182fd5b6113b983611300565b946020939093013593505050565b6000602082840312156113d8578081fd5b81518015158114610dc0578182fd5b6000602082840312156113f8578081fd5b5035919050565b600060208284031215611410578081fd5b5051919050565b6000602080835283518082850152825b8181101561144357858101830151858201604001528201611427565b818111156114545783604083870101525b50601f01601f1916929092016040019392505050565b60208082526009908201526853796e63206c6f636b60b81b604082015260600190565b600082198211156114a0576114a06114fb565b500190565b6000826114c057634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156114df576114df6114fb565b500290565b6000828210156114f6576114f66114fb565b500390565b634e487b7160e01b600052601160045260246000fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220964522a67d25664e236fa1e7ec6f91b31357b290ab0d83db97d7b026576a684964736f6c63430008040033

Deployed Bytecode Sourcemap

3873:14906:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4646:38;;;;;;;;;;;;;;;-1:-1:-1;;;4646:38:3;;;;;;;;;;;;:::i;:::-;;;;;;;;6431:161;;;;;;:::i;:::-;;:::i;:::-;;;3317:14:4;;3310:22;3292:41;;3280:2;3265:18;6431:161:3;3247:92:4;5412:102:3;5494:12;;5412:102;;;9732:25:4;;;9720:2;9705:18;5412:102:3;9687:76:4;7071:311:3;;;;;;:::i;:::-;;:::i;4738:35::-;;4771:2;4738:35;;;;;10336:4:4;10324:17;;;10306:36;;10294:2;10279:18;4738:35:3;10261:87:4;15369:2263:3;;;;;;:::i;:::-;;:::i;14149:195::-;;;:::i;:::-;;7791:208;;;;;;:::i;:::-;;:::i;17704:166::-;;;:::i;5577:119::-;;;;;;:::i;:::-;-1:-1:-1;;;;;5670:18:3;5643:7;5670:18;;;;;;;;;;;;5577:119;4553:26;;;;;;4820:41;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9999:25:4;;;10055:2;10040:18;;10033:34;;;;10083:18;;;10076:34;10141:2;10126:18;;10119:34;9986:3;9971:19;4820:41:3;9953:206:4;4691:40:3;;;;;;;;;;;;;;;-1:-1:-1;;;4691:40:3;;;;;8502:259;;;;;;:::i;:::-;;:::i;14798:388::-;;;;;;:::i;:::-;;:::i;5909:167::-;;;;;;:::i;:::-;;:::i;17934:447::-;;;;;;:::i;:::-;;:::i;6139:145::-;;;;;;:::i;:::-;-1:-1:-1;;;;;6249:18:3;;;6222:7;6249:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;6139:145;13382:721;;;:::i;18436:338::-;;;;;;:::i;:::-;;:::i;12546:745::-;;;;;;:::i;:::-;;:::i;6431:161::-;6508:4;6525:37;6534:10;6546:7;6555:6;6525:8;:37::i;:::-;-1:-1:-1;6580:4:3;6431:161;;;;:::o;7071:311::-;7171:4;7188:36;7198:6;7206:9;7217:6;7188:9;:36::i;:::-;7235:117;7244:6;7252:10;7264:87;7300:6;7264:87;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7264:19:3;;;;;;:11;:19;;;;;;;;7284:10;7264:31;;;;;;;;;:87;:35;:87::i;:::-;7235:8;:117::i;:::-;-1:-1:-1;7370:4:3;7071:311;;;;;:::o;15369:2263::-;-1:-1:-1;;;;;15760:13:3;;15459:4;15760:13;;;:6;:13;;;;;:24;;;;15833:27;;15908:5;15962:2;16163:4;16299:15;;16296:1246;;16421:9;16406:11;:24;16403:1128;;16476:47;16493:29;16519:2;16493:21;:19;:21::i;:::-;:25;;:29::i;:::-;16476:12;;:16;:47::i;:::-;16464:59;;16642:3;16617:21;:19;:21::i;:::-;:28;16614:110;;16681:23;16669:35;;16614:110;16403:1128;;;16776:20;16823:9;16800:20;:11;16816:3;16800:15;:20::i;:::-;:32;;;;:::i;:::-;16776:57;-1:-1:-1;16852:6:3;16893:3;16862:27;16776:57;16862:9;:27;:::i;:::-;16861:35;;;;:::i;:::-;16852:44;-1:-1:-1;16927:16:3;:9;16852:44;16927:13;:16::i;:::-;16915:28;;16977:47;16994:29;17020:2;16994:21;:19;:21::i;:29::-;16977:12;;:16;:47::i;:::-;16965:9;:59;16962:554;;;17060:47;17077:29;17103:2;17077:21;:19;:21::i;17060:47::-;17048:59;;17234:3;17209:21;:19;:21::i;:::-;:28;17206:291;;17278:9;17286:1;17278:5;:9;:::i;:::-;17265:23;;17330;17318:9;:35;17315:159;;;17423:23;17411:35;;17315:159;16403:1128;;;17560:63;17619:3;17560:54;17604:9;17560:39;17574:24;17592:5;17574:17;:24::i;:::-;17560:9;;:13;:39::i;:::-;:43;;:54::i;:63::-;17552:72;15369:2263;-1:-1:-1;;;;;;;15369:2263:3:o;14149:195::-;5132:4;;;;5131:5;5123:27;;;;-1:-1:-1;;;5123:27:3;;;;;;;:::i;:::-;;;;;;;;;5161:4;:11;;-1:-1:-1;;5161:11:3;5168:4;5161:11;;;14250:10:::1;5161:4:::0;14243:18;;;:6:::1;:18;::::0;;;;:32;14235:75:::1;;;::::0;-1:-1:-1;;;14235:75:3;;5298:2:4;14235:75:3::1;::::0;::::1;5280:21:4::0;5337:2;5317:18;;;5310:30;5376:28;5356:18;;;5349:56;5422:18;;14235:75:3::1;5270:176:4::0;14235:75:3::1;14321:15;:13;:15::i;:::-;5195:4:::0;:12;;-1:-1:-1;;5195:12:3;;;14149:195::o;7791:208::-;7899:10;7873:4;7920:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;7920:32:3;;;;;;;;;;7873:4;;7890:79;;7911:7;;7920:48;;7957:10;7920:36;:48::i;17704:166::-;17782:4;17815:47;17855:6;17815:35;17835:14;;17815:15;:19;;:35;;;;:::i;:47::-;17808:54;;17704:166;:::o;8502:259::-;8589:4;8606:125;8615:10;8627:7;8636:94;8673:15;8636:94;;;;;;;;;;;;;;;;;8648:10;8636:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;8636:32:3;;;;;;;;;;;:94;:36;:94::i;14798:388::-;5132:4;;;;5131:5;5123:27;;;;-1:-1:-1;;;5123:27:3;;;;;;;:::i;:::-;5161:4;:11;;-1:-1:-1;;5161:11:3;5168:4;5161:11;;;14892:7;14884:48:::1;;;::::0;-1:-1:-1;;;14884:48:3;;5997:2:4;14884:48:3::1;::::0;::::1;5979:21:4::0;6036:2;6016:18;;;6009:30;6075;6055:18;;;6048:58;6123:18;;14884:48:3::1;5969:178:4::0;14884:48:3::1;14961:10;5643:7:::0;5670:18;;;;;;;;;;;14976:3;-1:-1:-1;14951:28:3::1;14943:56;;;::::0;-1:-1:-1;;;14943:56:3;;5653:2:4;14943:56:3::1;::::0;::::1;5635:21:4::0;5692:2;5672:18;;;5665:30;-1:-1:-1;;;5711:18:4;;;5704:45;5766:18;;14943:56:3::1;5625:165:4::0;14943:56:3::1;15010:15;:13;:15::i;:::-;15067:22;15073:10;15085:3;15067:5;:22::i;:::-;15107:10;15100:18;::::0;;;:6:::1;:18;::::0;;;;:29:::1;;:36:::0;;15133:3;;15100:18;:36:::1;::::0;15133:3;;15100:36:::1;:::i;:::-;::::0;;;-1:-1:-1;;15152:26:3::1;::::0;9732:25:4;;;15162:10:3::1;::::0;15152:26:::1;::::0;9720:2:4;9705:18;15152:26:3::1;;;;;;;;-1:-1:-1::0;5195:4:3;:12;;-1:-1:-1;;5195:12:3;;;14798:388::o;5909:167::-;5989:4;6006:40;6016:10;6028:9;6039:6;6006:9;:40::i;17934:447::-;-1:-1:-1;;;;;18048:13:3;;18023:4;18048:13;;;:6;:13;;;;;:33;;;18045:77;;-1:-1:-1;18109:1:3;;17934:447;-1:-1:-1;17934:447:3:o;18045:77::-;-1:-1:-1;;;;;18168:13:3;;18132;18168;;;:6;:13;;;;;:33;;;18148:73;;4401:2;;18148:54;;:15;;:19;:54::i;:73::-;18132:89;;18247:1;18235:8;:13;18232:142;;18271:8;17934:447;-1:-1:-1;;17934:447:3:o;18232:142::-;-1:-1:-1;18361:1:3;;17934:447;-1:-1:-1;;17934:447:3:o;13382:721::-;5132:4;;;;5131:5;5123:27;;;;-1:-1:-1;;;5123:27:3;;;;;;;:::i;:::-;5161:4;:11;;-1:-1:-1;;5161:11:3;5168:4;5161:11;;;13478:10:::1;5161:4:::0;13471:18;;;:6:::1;:18;::::0;;;;:32;13463:82:::1;;;::::0;-1:-1:-1;;;13463:82:3;;6769:2:4;13463:82:3::1;::::0;::::1;6751:21:4::0;6808:2;6788:18;;;6781:30;6847:34;6827:18;;;6820:62;-1:-1:-1;;;6898:18:4;;;6891:32;6940:19;;13463:82:3::1;6741:224:4::0;13463:82:3::1;13601:27;13617:10;13601:15;:27::i;:::-;13593:86;;;::::0;-1:-1:-1;;;13593:86:3;;6354:2:4;13593:86:3::1;::::0;::::1;6336:21:4::0;6393:2;6373:18;;;6366:30;6432:34;6412:18;;;6405:62;-1:-1:-1;;;6483:18:4;;;6476:44;6537:19;;13593:86:3::1;6326:236:4::0;13593:86:3::1;13708:10;13690:8;13701:18:::0;;;:6:::1;:18;::::0;;;;:32;13782:15:::1;:13;:15::i;:::-;13853:10;13887:1;13846:18:::0;;;:6:::1;:18;::::0;;;;:38:::1;::::0;::::1;:42:::0;;;13899:36;13960:11:::1;::::0;:20:::1;::::0;13976:3;13960:15:::1;:20::i;:::-;13946:11;:34:::0;13991:44:::1;::::0;-1:-1:-1;;;13991:44:3;;14019:10:::1;13991:44;::::0;::::1;3047:51:4::0;3114:18;;;3107:34;;;4310:42:3::1;::::0;13991:27:::1;::::0;3020:18:4;;13991:44:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;14066:29:3::1;::::0;9732:25:4;;;14079:10:3::1;::::0;14066:29:::1;::::0;9720:2:4;9705:18;14066:29:3::1;9687:76:4::0;18436:338:3;-1:-1:-1;;;;;18548:13:3;;18523:4;18548:13;;;:6;:13;;;;;:33;;;18545:222;;-1:-1:-1;18609:5:3;;18436:338;-1:-1:-1;18436:338:3:o;18545:222::-;18740:15;18662:74;18700:35;4449:5;4507:1;18700:16;:35::i;:::-;-1:-1:-1;;;;;18662:13:3;;;;;;:6;:13;;;;;:33;;;;:37;:74::i;:::-;:93;;;18436:338;-1:-1:-1;;18436:338:3:o;18545:222::-;18436:338;;;:::o;12546:745::-;5132:4;;;;5131:5;5123:27;;;;-1:-1:-1;;;5123:27:3;;;;;;;:::i;:::-;5161:4;:11;;-1:-1:-1;;5161:11:3;5168:4;5161:11;;;12641:7;12633:30:::1;;;::::0;-1:-1:-1;;;12633:30:3;;9089:2:4;12633:30:3::1;::::0;::::1;9071:21:4::0;9128:2;9108:18;;;9101:30;-1:-1:-1;;;9147:18:4;;;9140:40;9197:18;;12633:30:3::1;9061:160:4::0;12633:30:3::1;12682:55;::::0;-1:-1:-1;;;12682:55:3;;12711:10:::1;12682:55;::::0;::::1;2396:34:4::0;12731:4:3::1;2446:18:4::0;;;2439:43;12741:3:3;;4310:42:::1;::::0;12682:28:::1;::::0;2331:18:4;;12682:55:3::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;12674:94;;;::::0;-1:-1:-1;;;12674:94:3;;7528:2:4;12674:94:3::1;::::0;::::1;7510:21:4::0;7567:2;7547:18;;;7540:30;-1:-1:-1;;;7586:18:4;;;7579:49;7645:18;;12674:94:3::1;7500:169:4::0;12674:94:3::1;12819:40;::::0;-1:-1:-1;;;12819:40:3;;12848:10:::1;12819:40;::::0;::::1;2122:51:4::0;12863:3:3;;4310:42:::1;::::0;12819:28:::1;::::0;2095:18:4;;12819:40:3::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;12811:87;;;::::0;-1:-1:-1;;;12811:87:3;;7172:2:4;12811:87:3::1;::::0;::::1;7154:21:4::0;7211:2;7191:18;;;7184:30;7250:29;7230:18;;;7223:57;7297:18;;12811:87:3::1;7144:177:4::0;12811:87:3::1;12977:15;:13;:15::i;:::-;13072:10;13065:18;::::0;;;:6:::1;:18;::::0;;;;:32;:41:::1;::::0;13102:3;13065:36:::1;:41::i;:::-;13037:10;13030:18;::::0;;;:6:::1;:18;::::0;;;;:76;13131:11:::1;::::0;:20:::1;::::0;13147:3;13131:15:::1;:20::i;:::-;13117:11;:34:::0;13162:63:::1;::::0;-1:-1:-1;;;13162:63:3;;13194:10:::1;13162:63;::::0;::::1;2733:34:4::0;13214:4:3::1;2783:18:4::0;;;2776:43;2835:18;;;2828:34;;;4310:42:3::1;::::0;13162:31:::1;::::0;2668:18:4;;13162:63:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;13256:27:3::1;::::0;9732:25:4;;;13267:10:3::1;::::0;13256:27:::1;::::0;9720:2:4;9705:18;13256:27:3::1;9687:76:4::0;2847:98:2;2905:7;2932:5;2936:1;2932;:5;:::i;:::-;2925:12;2847:98;-1:-1:-1;;;2847:98:2:o;11470:336:3:-;-1:-1:-1;;;;;11564:19:3;;11556:68;;;;-1:-1:-1;;;11556:68:3;;8684:2:4;11556:68:3;;;8666:21:4;8723:2;8703:18;;;8696:30;8762:34;8742:18;;;8735:62;-1:-1:-1;;;8813:18:4;;;8806:34;8857:19;;11556:68:3;8656:226:4;11556:68:3;-1:-1:-1;;;;;11643:21:3;;11635:68;;;;-1:-1:-1;;;11635:68:3;;4558:2:4;11635:68:3;;;4540:21:4;4597:2;4577:18;;;4570:30;4636:34;4616:18;;;4609:62;-1:-1:-1;;;4687:18:4;;;4680:32;4729:19;;11635:68:3;4530:224:4;11635:68:3;-1:-1:-1;;;;;11714:18:3;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;11766:32;;9732:25:4;;;11766:32:3;;9705:18:4;11766:32:3;;;;;;;;11470:336;;;:::o;9250:469::-;-1:-1:-1;;;;;9348:20:3;;9340:70;;;;-1:-1:-1;;;9340:70:3;;8278:2:4;9340:70:3;;;8260:21:4;8317:2;8297:18;;;8290:30;8356:34;8336:18;;;8329:62;-1:-1:-1;;;8407:18:4;;;8400:35;8452:19;;9340:70:3;8250:227:4;9340:70:3;-1:-1:-1;;;;;9429:23:3;;9421:71;;;;-1:-1:-1;;;9421:71:3;;4154:2:4;9421:71:3;;;4136:21:4;4193:2;4173:18;;;4166:30;4232:34;4212:18;;;4205:62;-1:-1:-1;;;4283:18:4;;;4276:33;4326:19;;9421:71:3;4126:225:4;9421:71:3;9523;9545:6;9523:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9523:17:3;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;9503:17:3;;;:9;:17;;;;;;;;;;;:91;;;;9628:20;;;;;;;:32;;9653:6;9628:24;:32::i;:::-;-1:-1:-1;;;;;9605:20:3;;;:9;:20;;;;;;;;;;;;:55;;;;9676:35;9732:25:4;;;9605:20:3;;9676:35;;;;;;9705:18:4;9676:35:3;9687:76:4;5126:206:2;5212:7;5273:12;5265:6;;;;5257:29;;;;-1:-1:-1;;;5257:29:2;;;;;;;;:::i;:::-;-1:-1:-1;;;5308:5:2;;;5126:206::o;3585:98::-;3643:7;3670:5;3674:1;3670;:5;:::i;3228:98::-;3286:7;3313:5;3317:1;3313;:5;:::i;3984:98::-;4042:7;4069:5;4073:1;4069;:5;:::i;14356:434:3:-;14453:16;14472:30;14491:10;14472:18;:30::i;:::-;14555:10;14548:18;;;;:6;:18;;;;;14589:15;14548:38;;;;:56;14453:49;-1:-1:-1;14650:12:3;;14647:136;;14678:27;14684:10;14696:8;14678:5;:27::i;:::-;14727:10;14720:18;;;;:6;:18;;;;;:39;;:51;;14763:8;;14720:18;:51;;14763:8;;14720:51;:::i;:::-;;;;-1:-1:-1;;14647:136:3;14356:434;:::o;10684:346::-;-1:-1:-1;;;;;10760:21:3;;10752:67;;;;-1:-1:-1;;;10752:67:3;;7876:2:4;10752:67:3;;;7858:21:4;7915:2;7895:18;;;7888:30;7954:34;7934:18;;;7927:62;-1:-1:-1;;;8005:18:4;;;7998:31;8046:19;;10752:67:3;7848:223:4;10752:67:3;10851:68;10874:6;10851:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10851:18:3;;:9;:18;;;;;;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;10830:18:3;;:9;:18;;;;;;;;;;:89;10945:12;;:24;;10962:6;10945:16;:24::i;:::-;10930:12;:39;10985:37;;9732:25:4;;;11011:1:3;;-1:-1:-1;;;;;10985:37:3;;;;;9720:2:4;9705:18;10985:37:3;;;;;;;10684:346;;:::o;10024:328::-;10106:6;-1:-1:-1;;;;;10131:21:3;;10123:65;;;;-1:-1:-1;;;10123:65:3;;9428:2:4;10123:65:3;;;9410:21:4;9467:2;9447:18;;;9440:30;9506:33;9486:18;;;9479:61;9557:18;;10123:65:3;9400:181:4;10123:65:3;10214:12;;:21;;10231:3;10214:16;:21::i;:::-;10199:12;:36;-1:-1:-1;;;;;10267:18:3;;:9;:18;;;;;;;;;;;:27;;10290:3;10267:22;:27::i;:::-;-1:-1:-1;;;;;10246:18:3;;:9;:18;;;;;;;;;;;:48;;;;10310:34;;9732:25:4;;;10246:18:3;;:9;;10310:34;;9705:18:4;10310:34:3;9687:76:4;14:173;82:20;;-1:-1:-1;;;;;131:31:4;;121:42;;111:2;;177:1;174;167:12;192:196;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;325:6;317;310:22;272:2;353:29;372:9;353:29;:::i;393:270::-;461:6;469;522:2;510:9;501:7;497:23;493:32;490:2;;;543:6;535;528:22;490:2;571:29;590:9;571:29;:::i;:::-;561:39;;619:38;653:2;642:9;638:18;619:38;:::i;:::-;609:48;;480:183;;;;;:::o;668:338::-;745:6;753;761;814:2;802:9;793:7;789:23;785:32;782:2;;;835:6;827;820:22;782:2;863:29;882:9;863:29;:::i;:::-;853:39;;911:38;945:2;934:9;930:18;911:38;:::i;:::-;901:48;;996:2;985:9;981:18;968:32;958:42;;772:234;;;;;:::o;1011:264::-;1079:6;1087;1140:2;1128:9;1119:7;1115:23;1111:32;1108:2;;;1161:6;1153;1146:22;1108:2;1189:29;1208:9;1189:29;:::i;:::-;1179:39;1265:2;1250:18;;;;1237:32;;-1:-1:-1;;;1098:177:4:o;1280:297::-;1347:6;1400:2;1388:9;1379:7;1375:23;1371:32;1368:2;;;1421:6;1413;1406:22;1368:2;1458:9;1452:16;1511:5;1504:13;1497:21;1490:5;1487:32;1477:2;;1538:6;1530;1523:22;1582:190;1641:6;1694:2;1682:9;1673:7;1669:23;1665:32;1662:2;;;1715:6;1707;1700:22;1662:2;-1:-1:-1;1743:23:4;;1652:120;-1:-1:-1;1652:120:4:o;1777:194::-;1847:6;1900:2;1888:9;1879:7;1875:23;1871:32;1868:2;;;1921:6;1913;1906:22;1868:2;-1:-1:-1;1949:16:4;;1858:113;-1:-1:-1;1858:113:4:o;3344:603::-;3456:4;3485:2;3514;3503:9;3496:21;3546:6;3540:13;3589:6;3584:2;3573:9;3569:18;3562:34;3614:4;3627:140;3641:6;3638:1;3635:13;3627:140;;;3736:14;;;3732:23;;3726:30;3702:17;;;3721:2;3698:26;3691:66;3656:10;;3627:140;;;3785:6;3782:1;3779:13;3776:2;;;3855:4;3850:2;3841:6;3830:9;3826:22;3822:31;3815:45;3776:2;-1:-1:-1;3931:2:4;3910:15;-1:-1:-1;;3906:29:4;3891:45;;;;3938:2;3887:54;;3465:482;-1:-1:-1;;;3465:482:4:o;4759:332::-;4961:2;4943:21;;;5000:1;4980:18;;;4973:29;-1:-1:-1;;;5033:2:4;5018:18;;5011:39;5082:2;5067:18;;4933:158::o;10353:128::-;10393:3;10424:1;10420:6;10417:1;10414:13;10411:2;;;10430:18;;:::i;:::-;-1:-1:-1;10466:9:4;;10401:80::o;10486:217::-;10526:1;10552;10542:2;;-1:-1:-1;;;10577:31:4;;10631:4;10628:1;10621:15;10659:4;10584:1;10649:15;10542:2;-1:-1:-1;10688:9:4;;10532:171::o;10708:168::-;10748:7;10814:1;10810;10806:6;10802:14;10799:1;10796:21;10791:1;10784:9;10777:17;10773:45;10770:2;;;10821:18;;:::i;:::-;-1:-1:-1;10861:9:4;;10760:116::o;10881:125::-;10921:4;10949:1;10946;10943:8;10940:2;;;10954:18;;:::i;:::-;-1:-1:-1;10991:9:4;;10930:76::o;11011:127::-;11072:10;11067:3;11063:20;11060:1;11053:31;11103:4;11100:1;11093:15;11127:4;11124:1;11117:15

Swarm Source

ipfs://964522a67d25664e236fa1e7ec6f91b31357b290ab0d83db97d7b026576a6849
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.