Token Altitude

 

Overview ERC20

Price
$0.00 @ 0.000000 ETH
Fully Diluted Market Cap
Total Supply:
7,083,360.124465 ALTD

Holders:
5,341 addresses

Transfers:
-

Contract:
0x8929e9dbd2785e3ba16175e596cdd61520fee0d10x8929e9DbD2785e3BA16175E596CDD61520feE0D1

Decimals:
18

Social Profiles:
Not Available, Update ?

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
AltitudeToken

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan.io on 2023-07-07
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.18;
pragma abicoder v2;

/******************************************/
/*           IERC20 starts here           */
/******************************************/

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol

/**
 * @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);
}

/******************************************/
/*           Context starts here          */
/******************************************/

// File: @openzeppelin/contracts/GSN/Context.sol

/*
 * @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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/******************************************/
/*           Ownable starts here          */
/******************************************/

/**
 * @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() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

/******************************************/
/*      IERC20Metadata starts here        */
/******************************************/

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol

/**
 * @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);
}

/******************************************/
/*           ERC20 starts here            */
/******************************************/

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol

/**
 * @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 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 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);
    }

    /** @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);
    }

    /**
     * @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, 0x000000000000000000000000000000000000dEaD, 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 to 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 {}
}

/***************************************************/
/*   ILayerZeroUserApplicationConfig starts here   */
/***************************************************/

interface ILayerZeroUserApplicationConfig {
    // @notice set the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _configType - type of configuration. every messaging library has its own convention.
    // @param _config - configuration in the bytes. can encode arbitrary content.
    function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external;

    // @notice set the send() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setSendVersion(uint16 _version) external;

    // @notice set the lzReceive() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setReceiveVersion(uint16 _version) external;

    // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload
    // @param _srcChainId - the chainId of the source chain
    // @param _srcAddress - the contract address of the source contract at the source chain
    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;
}

/******************************************/
/*     ILayerZeroEndpoint starts here     */
/******************************************/

interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig {
    // @notice send a LayerZero message to the specified address at a LayerZero endpoint.
    // @param _dstChainId - the destination chain identifier
    // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains
    // @param _payload - a custom bytes payload to send to the destination contract
    // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address
    // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction
    // @param _adapterParams - parameters for custom functionality. ie: pay for a specified destination gasAmount, or receive airdropped native gas from the relayer on destination
    function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;

    // @notice used by the messaging library to publish verified payload
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source contract (as bytes) at the source chain
    // @param _dstAddress - the address on destination chain
    // @param _nonce - the unbound message ordering nonce
    // @param _gasLimit - the gas limit for external contract execution
    // @param _payload - verified payload to send to the destination contract
    function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external;

    // @notice get the inboundNonce of a receiver from a source chain which could be EVM or non-EVM chain
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64);

    // @notice get the outboundNonce from this source chain which, consequently, is always an EVM
    // @param _srcAddress - the source chain contract address
    function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64);

    // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery
    // @param _dstChainId - the destination chain identifier
    // @param _userApplication - the user app address on this EVM chain
    // @param _payload - the custom message to send over LayerZero
    // @param _payInZRO - if false, user app pays the protocol fee in native token
    // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain
    function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee);

    // @notice get this Endpoint's immutable source identifier
    function getChainId() external view returns (uint16);

    // @notice the interface to retry failed message on this Endpoint destination
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    // @param _payload - the payload to be retried
    function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external;

    // @notice query if any STORED payload (message blocking) at the endpoint.
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);

    // @notice query if the _libraryAddress is valid for sending msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getSendLibraryAddress(address _userApplication) external view returns (address);

    // @notice query if the _libraryAddress is valid for receiving msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getReceiveLibraryAddress(address _userApplication) external view returns (address);

    // @notice query if the non-reentrancy guard for send() is on
    // @return true if the guard is on. false otherwise
    function isSendingPayload() external view returns (bool);

    // @notice query if the non-reentrancy guard for receive() is on
    // @return true if the guard is on. false otherwise
    function isReceivingPayload() external view returns (bool);

    // @notice get the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _userApplication - the contract address of the user application
    // @param _configType - type of configuration. every messaging library has its own convention.
    function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory);

    // @notice get the send() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getSendVersion(address _userApplication) external view returns (uint16);

    // @notice get the lzReceive() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getReceiveVersion(address _userApplication) external view returns (uint16);
}

/******************************************/
/*     ILayerZeroReceiver starts here     */
/******************************************/

interface ILayerZeroReceiver {
    // @notice LayerZero endpoint will invoke this function to deliver the message on the destination
    // @param _srcChainId - the source endpoint identifier
    // @param _srcAddress - the source sending contract address from the source chain
    // @param _nonce - the ordered message nonce
    // @param _payload - the signed payload is the UA bytes has encoded to be sent
    function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external;
}

/******************************************/
/*   OmnichainFungibleToken starts here   */
/******************************************/

contract OmnichainFungibleToken is ERC20, Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig {
    // the only endpointId these tokens will ever be minted on
    // required: the LayerZero endpoint which is passed in the constructor
    ILayerZeroEndpoint immutable public endpoint;
    // a map of our connected contracts
    mapping(uint16 => bytes) public dstContractLookup;
    // pause the sendTokens()
    bool public paused;
    bool public isMain;

    event Paused(bool isPaused);
    event SendToChain(uint16 dstChainId, bytes to, uint256 qty);
    event ReceiveFromChain(uint16 srcChainId, uint64 nonce, uint256 qty);
    event Mint(address _to, uint256 _amount);
    event Burn(address _from, uint256 _amount);

    constructor(
        string memory _name,
        string memory _symbol,
        address _endpoint,
        uint16 _mainChainId,
        uint256 initialSupplyOnMainEndpoint
    ) ERC20(_name, _symbol) {
        if (ILayerZeroEndpoint(_endpoint).getChainId() == _mainChainId) {
            _mint(msg.sender, initialSupplyOnMainEndpoint);
            isMain = true;
        }
        // set the LayerZero endpoint
        endpoint = ILayerZeroEndpoint(_endpoint);
    }

    function pauseSendTokens(bool _pause) external onlyOwner {
        paused = _pause;
        emit Paused(_pause);
    }

    function setDestination(uint16 _dstChainId, bytes calldata _destinationContractAddress) public onlyOwner {
        dstContractLookup[_dstChainId] = abi.encodePacked(_destinationContractAddress, address(this));
    }

    function chainId() external view returns (uint16){
        return endpoint.getChainId();
    }

    function sendTokens(
        uint16 _dstChainId, // send tokens to this chainId
        bytes calldata _to, // where to deliver the tokens on the destination chain
        uint256 _qty, // how many tokens to send
        address zroPaymentAddress, // ZRO payment address
        bytes calldata adapterParam // txParameters
    ) public payable {
        require(!paused, "OFT: sendTokens() is currently paused");

        // lock if leaving the safe chain, otherwise burn
        if (isMain) {
            // ... transferFrom the tokens to this contract for locking purposes
            _transfer(msg.sender, address(this), _qty);
        } else {
            _burn(msg.sender, _qty);
        }

        // abi.encode() the payload with the values to send
        bytes memory payload = abi.encode(_to, _qty);

        // send LayerZero message
        endpoint.send{value: msg.value}(
            _dstChainId, // destination chainId
            dstContractLookup[_dstChainId], // destination UA address
            payload, // abi.encode()'ed bytes
            payable(msg.sender), // refund address (LayerZero will refund any extra gas back to caller of send()
            zroPaymentAddress, // 'zroPaymentAddress' unused for this mock/example
            adapterParam // 'adapterParameters' unused for this mock/example
        );
        emit SendToChain(_dstChainId, _to, _qty);
    }

    function lzReceive(
        uint16 _srcChainId,
        bytes memory _fromAddress,
        uint64 nonce,
        bytes memory _payload
    ) external override {
        require(msg.sender == address(endpoint)); // boilerplate! lzReceive must be called by the endpoint for security
        require(
            _fromAddress.length == dstContractLookup[_srcChainId].length && keccak256(_fromAddress) == keccak256(dstContractLookup[_srcChainId]),
            "OFT: invalid source sending contract"
        );

        // decode
        (bytes memory _to, uint256 _qty) = abi.decode(_payload, (bytes, uint256));
        address toAddress;
        // load the toAddress from the bytes
        assembly {
            toAddress := mload(add(_to, 20))
        }

        // mint the tokens back into existence, to the receiving address
        if (isMain) {
            _transfer(address(this), toAddress, _qty);
        } else {
            _mint(toAddress, _qty);
        }

        emit ReceiveFromChain(_srcChainId, nonce, _qty);
    }

    function estimateSendTokensFee(uint16 _dstChainId, bool _useZro, bytes calldata txParameters) external view returns (uint256 nativeFee, uint256 zroFee) {
        return endpoint.estimateFees(_dstChainId, address(this), bytes(""), _useZro, txParameters);
    }

    function setConfig(
        uint16 _version,
        uint16 _chainId,
        uint256 _configType,
        bytes calldata _config
    ) external override onlyOwner {
        endpoint.setConfig(_version, _chainId, _configType, _config);
    }

    function setSendVersion(uint16 version) external override onlyOwner {
        endpoint.setSendVersion(version);
    }

    function setReceiveVersion(uint16 version) external override onlyOwner {
        endpoint.setReceiveVersion(version);
    }

    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner {
        endpoint.forceResumeReceive(_srcChainId, _srcAddress);
    }

    function mint(address _to, uint256 _amount) external onlyOwner {
        _mint(_to, _amount);
        emit Mint(_to, _amount);
    }

    function burn(address _from, uint256 _amount) external onlyOwner {
        _burn(_from, _amount);
        emit Burn(_from, _amount);
    }

    function renounceOwnership() public override onlyOwner {}
}

/******************************************/
/*       AltitudeToken starts here        */
/******************************************/

contract AltitudeToken is OmnichainFungibleToken {
    constructor(
        string memory _name,
        string memory _symbol,
        address _endpoint,
        uint16 _mainEndpointId,
        uint256 _initialSupplyOnMainEndpoint
    ) OmnichainFungibleToken(_name, _symbol, _endpoint, _mainEndpointId, _initialSupplyOnMainEndpoint) {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_endpoint","type":"address"},{"internalType":"uint16","name":"_mainEndpointId","type":"uint16"},{"internalType":"uint256","name":"_initialSupplyOnMainEndpoint","type":"uint256"}],"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":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isPaused","type":"bool"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"srcChainId","type":"uint16"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"qty","type":"uint256"}],"name":"ReceiveFromChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"dstChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"to","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"qty","type":"uint256"}],"name":"SendToChain","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":"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":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"chainId","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"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":"uint16","name":"","type":"uint16"}],"name":"dstContractLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endpoint","outputs":[{"internalType":"contract ILayerZeroEndpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bool","name":"_useZro","type":"bool"},{"internalType":"bytes","name":"txParameters","type":"bytes"}],"name":"estimateSendTokensFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"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":[],"name":"isMain","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_fromAddress","type":"bytes"},{"internalType":"uint64","name":"nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"bool","name":"_pause","type":"bool"}],"name":"pauseSendTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_to","type":"bytes"},{"internalType":"uint256","name":"_qty","type":"uint256"},{"internalType":"address","name":"zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"adapterParam","type":"bytes"}],"name":"sendTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_destinationContractAddress","type":"bytes"}],"name":"setDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"version","type":"uint16"}],"name":"setSendVersion","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"}]

60a06040523480156200001157600080fd5b506040516200281038038062002810833981016040819052620000349162000335565b8484848484848460036200004983826200046b565b5060046200005882826200046b565b50505060006200006d6200016760201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508161ffff16836001600160a01b0316633408e4706040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000125919062000537565b61ffff16036200014b576200013b33826200016b565b6007805461ff0019166101001790555b50506001600160a01b0316608052506200058495505050505050565b3390565b6001600160a01b038216620001c65760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620001da91906200055c565b90915550506001600160a01b03821660009081526020819052604081208054839290620002099084906200055c565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200028057600080fd5b81516001600160401b03808211156200029d576200029d62000258565b604051601f8301601f19908116603f01168101908282118183101715620002c857620002c862000258565b81604052838152602092508683858801011115620002e557600080fd5b600091505b83821015620003095785820183015181830184015290820190620002ea565b600093810190920192909252949350505050565b805161ffff811681146200033057600080fd5b919050565b600080600080600060a086880312156200034e57600080fd5b85516001600160401b03808211156200036657600080fd5b6200037489838a016200026e565b965060208801519150808211156200038b57600080fd5b506200039a888289016200026e565b604088015190955090506001600160a01b0381168114620003ba57600080fd5b9250620003ca606087016200031d565b9150608086015190509295509295909350565b600181811c90821680620003f257607f821691505b6020821081036200041357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200025357600081815260208120601f850160051c81016020861015620004425750805b601f850160051c820191505b8181101562000463578281556001016200044e565b505050505050565b81516001600160401b0381111562000487576200048762000258565b6200049f81620004988454620003dd565b8462000419565b602080601f831160018114620004d75760008415620004be5750858301515b600019600386901b1c1916600185901b17855562000463565b600085815260208120601f198616915b828110156200050857888601518255948401946001909101908401620004e7565b5085821015620005275787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200054a57600080fd5b62000555826200031d565b9392505050565b808201808211156200057e57634e487b7160e01b600052601160045260246000fd5b92915050565b608051612238620005d8600039600081816103880152818161060d0152818161086a0152818161092c01528181610ae801528181610c9a01528181610e6701528181610f0401526110e301526122386000f3fe6080604052600436106101cc5760003560e01c806360f05c7a116100f75780639a8a059211610095578063cbed8b9c11610064578063cbed8b9c1461055c578063dd62ed3e1461057c578063f1878922146105c2578063f2fde38b146105e257600080fd5b80639a8a0592146104d45780639dc29fac146104fc578063a457c2d71461051c578063a9059cbb1461053c57600080fd5b8063715018a6116100d1578063715018a614610457578063738743361461046c5780638da5cb5b146104a157806395d89b41146104bf57600080fd5b806360f05c7a146103e1578063706d8fff1461040157806370a082311461042157600080fd5b80632e15238c1161016f57806342d65a8d1161013e57806342d65a8d1461033c5780635c975abb1461035c5780635e280f1114610376578063604269d1146103c257600080fd5b80632e15238c146102cd578063313ce567146102e057806339509351146102fc57806340c10f191461031c57600080fd5b8063095ea7b3116101ab578063095ea7b31461023e57806310ddb1371461026e57806318160ddd1461028e57806323b872dd146102ad57600080fd5b80621d3567146101d157806306fdde03146101f357806307e0db171461021e575b600080fd5b3480156101dd57600080fd5b506101f16101ec3660046118ac565b610602565b005b3480156101ff57600080fd5b50610208610795565b604051610215919061198c565b60405180910390f35b34801561022a57600080fd5b506101f16102393660046119a6565b610827565b34801561024a57600080fd5b5061025e6102593660046119df565b6108d2565b6040519015158152602001610215565b34801561027a57600080fd5b506101f16102893660046119a6565b6108e9565b34801561029a57600080fd5b506002545b604051908152602001610215565b3480156102b957600080fd5b5061025e6102c8366004611a09565b610963565b6101f16102db366004611a8e565b610a0d565b3480156102ec57600080fd5b5060405160128152602001610215565b34801561030857600080fd5b5061025e6103173660046119df565b610ba2565b34801561032857600080fd5b506101f16103373660046119df565b610bde565b34801561034857600080fd5b506101f1610357366004611b2e565b610c59565b34801561036857600080fd5b5060075461025e9060ff1681565b34801561038257600080fd5b506103aa7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610215565b3480156103ce57600080fd5b5060075461025e90610100900460ff1681565b3480156103ed57600080fd5b506102086103fc3660046119a6565b610d0a565b34801561040d57600080fd5b506101f161041c366004611b2e565b610da4565b34801561042d57600080fd5b5061029f61043c366004611b83565b6001600160a01b031660009081526020819052604090205490565b34801561046357600080fd5b506101f1610e14565b34801561047857600080fd5b5061048c610487366004611bae565b610e40565b60408051928352602083019190915201610215565b3480156104ad57600080fd5b506005546001600160a01b03166103aa565b3480156104cb57600080fd5b50610208610ef1565b3480156104e057600080fd5b506104e9610f00565b60405161ffff9091168152602001610215565b34801561050857600080fd5b506101f16105173660046119df565b610f89565b34801561052857600080fd5b5061025e6105373660046119df565b610ffc565b34801561054857600080fd5b5061025e6105573660046119df565b611095565b34801561056857600080fd5b506101f1610577366004611c11565b6110a2565b34801561058857600080fd5b5061029f610597366004611c84565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156105ce57600080fd5b506101f16105dd366004611cb7565b611159565b3480156105ee57600080fd5b506101f16105fd366004611b83565b6111ca565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461063757600080fd5b61ffff84166000908152600660205260409020805461065590611cd2565b90508351148015610694575061ffff84166000908152600660205260409081902090516106829190611d0c565b60405180910390208380519060200120145b6106f15760405162461bcd60e51b8152602060048201526024808201527f4f46543a20696e76616c696420736f757263652073656e64696e6720636f6e746044820152631c9858dd60e21b60648201526084015b60405180910390fd5b600080828060200190518101906107089190611d82565b601482015160075492945090925090610100900460ff16156107345761072f3082846112b5565b61073e565b61073e8183611484565b6040805161ffff8916815267ffffffffffffffff871660208201529081018390527f831bc68226f8d1f734ffcca73602efc4eca13711402ba1d2cc05ee17bb54f6319060600160405180910390a150505050505050565b6060600380546107a490611cd2565b80601f01602080910402602001604051908101604052809291908181526020018280546107d090611cd2565b801561081d5780601f106107f25761010080835404028352916020019161081d565b820191906000526020600020905b81548152906001019060200180831161080057829003601f168201915b5050505050905090565b6005546001600160a01b031633146108515760405162461bcd60e51b81526004016106e890611e03565b6040516307e0db1760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906307e0db17906024015b600060405180830381600087803b1580156108b757600080fd5b505af11580156108cb573d6000803e3d6000fd5b5050505050565b60006108df338484611563565b5060015b92915050565b6005546001600160a01b031633146109135760405162461bcd60e51b81526004016106e890611e03565b6040516310ddb13760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906310ddb1379060240161089d565b60006109708484846112b5565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156109f55760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016106e8565b610a028533858403611563565b506001949350505050565b60075460ff1615610a6e5760405162461bcd60e51b815260206004820152602560248201527f4f46543a2073656e64546f6b656e7328292069732063757272656e746c792070604482015264185d5cd95960da1b60648201526084016106e8565b600754610100900460ff1615610a8e57610a893330866112b5565b610a98565b610a983385611688565b6000868686604051602001610aaf93929190611e61565b60408051601f1981840301815282825261ffff8b16600090815260066020529190912062c5803160e81b83529092506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163c5803100913491610b29918d91879033908c908c908c90600401611e85565b6000604051808303818588803b158015610b4257600080fd5b505af1158015610b56573d6000803e3d6000fd5b50505050507f664e26797cde1146ddfcb9a5d3f4de61179f9c11b2698599bb09e686f442172b88888888604051610b909493929190611f6c565b60405180910390a15050505050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916108df918590610bd9908690611fb1565b611563565b6005546001600160a01b03163314610c085760405162461bcd60e51b81526004016106e890611e03565b610c128282611484565b604080516001600160a01b0384168152602081018390527f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688591015b60405180910390a15050565b6005546001600160a01b03163314610c835760405162461bcd60e51b81526004016106e890611e03565b6040516342d65a8d60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342d65a8d90610cd390869086908690600401611fc4565b600060405180830381600087803b158015610ced57600080fd5b505af1158015610d01573d6000803e3d6000fd5b50505050505050565b60066020526000908152604090208054610d2390611cd2565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4f90611cd2565b8015610d9c5780601f10610d7157610100808354040283529160200191610d9c565b820191906000526020600020905b815481529060010190602001808311610d7f57829003601f168201915b505050505081565b6005546001600160a01b03163314610dce5760405162461bcd60e51b81526004016106e890611e03565b818130604051602001610de393929190611feb565b60408051601f1981840301815291815261ffff8516600090815260066020522090610e0e908261205f565b50505050565b6005546001600160a01b03163314610e3e5760405162461bcd60e51b81526004016106e890611e03565b565b604080516020810182526000808252915163040a7bb160e41b815282916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916340a7bb1091610ea4918a9130918b908b908b9060040161211f565b6040805180830381865afa158015610ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee49190612175565b9150915094509492505050565b6060600480546107a490611cd2565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633408e4706040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f849190612199565b905090565b6005546001600160a01b03163314610fb35760405162461bcd60e51b81526004016106e890611e03565b610fbd8282611688565b604080516001600160a01b0384168152602081018390527fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59101610c4d565b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101561107e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016106e8565b61108b3385858403611563565b5060019392505050565b60006108df3384846112b5565b6005546001600160a01b031633146110cc5760405162461bcd60e51b81526004016106e890611e03565b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063cbed8b9c9061112090889088908890889088906004016121b6565b600060405180830381600087803b15801561113a57600080fd5b505af115801561114e573d6000803e3d6000fd5b505050505050505050565b6005546001600160a01b031633146111835760405162461bcd60e51b81526004016106e890611e03565b6007805460ff19168215159081179091556040519081527f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd29060200160405180910390a150565b6005546001600160a01b031633146111f45760405162461bcd60e51b81526004016106e890611e03565b6001600160a01b0381166112595760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106e8565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166113195760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016106e8565b6001600160a01b03821661137b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016106e8565b6001600160a01b038316600090815260208190526040902054818110156113f35760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016106e8565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061142a908490611fb1565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161147691815260200190565b60405180910390a350505050565b6001600160a01b0382166114da5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106e8565b80600260008282546114ec9190611fb1565b90915550506001600160a01b03821660009081526020819052604081208054839290611519908490611fb1565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0383166115c55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106e8565b6001600160a01b0382166116265760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106e8565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0382166116e85760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016106e8565b6001600160a01b0382166000908152602081905260409020548181101561175c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016106e8565b6001600160a01b038316600090815260208190526040812083830390556002805484929061178b9084906121ef565b909155505060405182815261dead906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161167b565b505050565b61ffff811681146117e457600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611826576118266117e7565b604052919050565b600067ffffffffffffffff821115611848576118486117e7565b50601f01601f191660200190565b600082601f83011261186757600080fd5b813561187a6118758261182e565b6117fd565b81815284602083860101111561188f57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156118c257600080fd5b84356118cd816117d4565b9350602085013567ffffffffffffffff808211156118ea57600080fd5b6118f688838901611856565b945060408701359150808216821461190d57600080fd5b9092506060860135908082111561192357600080fd5b5061193087828801611856565b91505092959194509250565b60005b8381101561195757818101518382015260200161193f565b50506000910152565b6000815180845261197881602086016020860161193c565b601f01601f19169290920160200192915050565b60208152600061199f6020830184611960565b9392505050565b6000602082840312156119b857600080fd5b813561199f816117d4565b80356001600160a01b03811681146119da57600080fd5b919050565b600080604083850312156119f257600080fd5b6119fb836119c3565b946020939093013593505050565b600080600060608486031215611a1e57600080fd5b611a27846119c3565b9250611a35602085016119c3565b9150604084013590509250925092565b60008083601f840112611a5757600080fd5b50813567ffffffffffffffff811115611a6f57600080fd5b602083019150836020828501011115611a8757600080fd5b9250929050565b600080600080600080600060a0888a031215611aa957600080fd5b8735611ab4816117d4565b9650602088013567ffffffffffffffff80821115611ad157600080fd5b611add8b838c01611a45565b909850965060408a01359550869150611af860608b016119c3565b945060808a0135915080821115611b0e57600080fd5b50611b1b8a828b01611a45565b989b979a50959850939692959293505050565b600080600060408486031215611b4357600080fd5b8335611b4e816117d4565b9250602084013567ffffffffffffffff811115611b6a57600080fd5b611b7686828701611a45565b9497909650939450505050565b600060208284031215611b9557600080fd5b61199f826119c3565b803580151581146119da57600080fd5b60008060008060608587031215611bc457600080fd5b8435611bcf816117d4565b9350611bdd60208601611b9e565b9250604085013567ffffffffffffffff811115611bf957600080fd5b611c0587828801611a45565b95989497509550505050565b600080600080600060808688031215611c2957600080fd5b8535611c34816117d4565b94506020860135611c44816117d4565b935060408601359250606086013567ffffffffffffffff811115611c6757600080fd5b611c7388828901611a45565b969995985093965092949392505050565b60008060408385031215611c9757600080fd5b611ca0836119c3565b9150611cae602084016119c3565b90509250929050565b600060208284031215611cc957600080fd5b61199f82611b9e565b600181811c90821680611ce657607f821691505b602082108103611d0657634e487b7160e01b600052602260045260246000fd5b50919050565b6000808354611d1a81611cd2565b60018281168015611d325760018114611d4757611d76565b60ff1984168752821515830287019450611d76565b8760005260208060002060005b85811015611d6d5781548a820152908401908201611d54565b50505082870194505b50929695505050505050565b60008060408385031215611d9557600080fd5b825167ffffffffffffffff811115611dac57600080fd5b8301601f81018513611dbd57600080fd5b8051611dcb6118758261182e565b818152866020838501011115611de057600080fd5b611df182602083016020860161193c565b60209590950151949694955050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081526000611e75604083018587611e38565b9050826020830152949350505050565b61ffff881681526000602060c08184015260008954611ea381611cd2565b8060c087015260e0600180841660008114611ec55760018114611edf57611f0d565b60ff1985168984015283151560051b890183019550611f0d565b8e6000528660002060005b85811015611f055781548b8201860152908301908801611eea565b8a0184019650505b50505050508381036040850152611f24818a611960565b915050611f3c60608401886001600160a01b03169052565b6001600160a01b038616608084015282810360a0840152611f5e818587611e38565b9a9950505050505050505050565b61ffff85168152606060208201526000611f8a606083018587611e38565b905082604083015295945050505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156108e3576108e3611f9b565b61ffff84168152604060208201526000611fe2604083018486611e38565b95945050505050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b601f8211156117cf57600081815260208120601f850160051c810160208610156120385750805b601f850160051c820191505b8181101561205757828155600101612044565b505050505050565b815167ffffffffffffffff811115612079576120796117e7565b61208d816120878454611cd2565b84612011565b602080601f8311600181146120c257600084156120aa5750858301515b600019600386901b1c1916600185901b178555612057565b600085815260208120601f198616915b828110156120f1578886015182559484019460019091019084016120d2565b508582101561210f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff871681526001600160a01b038616602082015260a06040820181905260009061214d90830187611960565b85151560608401528281036080840152612168818587611e38565b9998505050505050505050565b6000806040838503121561218857600080fd5b505080516020909101519092909150565b6000602082840312156121ab57600080fd5b815161199f816117d4565b600061ffff8088168352808716602084015250846040830152608060608301526121e4608083018486611e38565b979650505050505050565b818103818111156108e3576108e3611f9b56fea264697066735822122021a9973d4e917fbdbd0820b1fce0908d52f1d12f06b5d33c13815e6bf70e810c64736f6c6343000812003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000003c2269811836af69497e5f486a85d7316753cf62000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000000000000000000000000000000000000000000008416c7469747564650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004414c544400000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101cc5760003560e01c806360f05c7a116100f75780639a8a059211610095578063cbed8b9c11610064578063cbed8b9c1461055c578063dd62ed3e1461057c578063f1878922146105c2578063f2fde38b146105e257600080fd5b80639a8a0592146104d45780639dc29fac146104fc578063a457c2d71461051c578063a9059cbb1461053c57600080fd5b8063715018a6116100d1578063715018a614610457578063738743361461046c5780638da5cb5b146104a157806395d89b41146104bf57600080fd5b806360f05c7a146103e1578063706d8fff1461040157806370a082311461042157600080fd5b80632e15238c1161016f57806342d65a8d1161013e57806342d65a8d1461033c5780635c975abb1461035c5780635e280f1114610376578063604269d1146103c257600080fd5b80632e15238c146102cd578063313ce567146102e057806339509351146102fc57806340c10f191461031c57600080fd5b8063095ea7b3116101ab578063095ea7b31461023e57806310ddb1371461026e57806318160ddd1461028e57806323b872dd146102ad57600080fd5b80621d3567146101d157806306fdde03146101f357806307e0db171461021e575b600080fd5b3480156101dd57600080fd5b506101f16101ec3660046118ac565b610602565b005b3480156101ff57600080fd5b50610208610795565b604051610215919061198c565b60405180910390f35b34801561022a57600080fd5b506101f16102393660046119a6565b610827565b34801561024a57600080fd5b5061025e6102593660046119df565b6108d2565b6040519015158152602001610215565b34801561027a57600080fd5b506101f16102893660046119a6565b6108e9565b34801561029a57600080fd5b506002545b604051908152602001610215565b3480156102b957600080fd5b5061025e6102c8366004611a09565b610963565b6101f16102db366004611a8e565b610a0d565b3480156102ec57600080fd5b5060405160128152602001610215565b34801561030857600080fd5b5061025e6103173660046119df565b610ba2565b34801561032857600080fd5b506101f16103373660046119df565b610bde565b34801561034857600080fd5b506101f1610357366004611b2e565b610c59565b34801561036857600080fd5b5060075461025e9060ff1681565b34801561038257600080fd5b506103aa7f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6281565b6040516001600160a01b039091168152602001610215565b3480156103ce57600080fd5b5060075461025e90610100900460ff1681565b3480156103ed57600080fd5b506102086103fc3660046119a6565b610d0a565b34801561040d57600080fd5b506101f161041c366004611b2e565b610da4565b34801561042d57600080fd5b5061029f61043c366004611b83565b6001600160a01b031660009081526020819052604090205490565b34801561046357600080fd5b506101f1610e14565b34801561047857600080fd5b5061048c610487366004611bae565b610e40565b60408051928352602083019190915201610215565b3480156104ad57600080fd5b506005546001600160a01b03166103aa565b3480156104cb57600080fd5b50610208610ef1565b3480156104e057600080fd5b506104e9610f00565b60405161ffff9091168152602001610215565b34801561050857600080fd5b506101f16105173660046119df565b610f89565b34801561052857600080fd5b5061025e6105373660046119df565b610ffc565b34801561054857600080fd5b5061025e6105573660046119df565b611095565b34801561056857600080fd5b506101f1610577366004611c11565b6110a2565b34801561058857600080fd5b5061029f610597366004611c84565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156105ce57600080fd5b506101f16105dd366004611cb7565b611159565b3480156105ee57600080fd5b506101f16105fd366004611b83565b6111ca565b336001600160a01b037f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf62161461063757600080fd5b61ffff84166000908152600660205260409020805461065590611cd2565b90508351148015610694575061ffff84166000908152600660205260409081902090516106829190611d0c565b60405180910390208380519060200120145b6106f15760405162461bcd60e51b8152602060048201526024808201527f4f46543a20696e76616c696420736f757263652073656e64696e6720636f6e746044820152631c9858dd60e21b60648201526084015b60405180910390fd5b600080828060200190518101906107089190611d82565b601482015160075492945090925090610100900460ff16156107345761072f3082846112b5565b61073e565b61073e8183611484565b6040805161ffff8916815267ffffffffffffffff871660208201529081018390527f831bc68226f8d1f734ffcca73602efc4eca13711402ba1d2cc05ee17bb54f6319060600160405180910390a150505050505050565b6060600380546107a490611cd2565b80601f01602080910402602001604051908101604052809291908181526020018280546107d090611cd2565b801561081d5780601f106107f25761010080835404028352916020019161081d565b820191906000526020600020905b81548152906001019060200180831161080057829003601f168201915b5050505050905090565b6005546001600160a01b031633146108515760405162461bcd60e51b81526004016106e890611e03565b6040516307e0db1760e01b815261ffff821660048201527f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf626001600160a01b0316906307e0db17906024015b600060405180830381600087803b1580156108b757600080fd5b505af11580156108cb573d6000803e3d6000fd5b5050505050565b60006108df338484611563565b5060015b92915050565b6005546001600160a01b031633146109135760405162461bcd60e51b81526004016106e890611e03565b6040516310ddb13760e01b815261ffff821660048201527f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf626001600160a01b0316906310ddb1379060240161089d565b60006109708484846112b5565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156109f55760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016106e8565b610a028533858403611563565b506001949350505050565b60075460ff1615610a6e5760405162461bcd60e51b815260206004820152602560248201527f4f46543a2073656e64546f6b656e7328292069732063757272656e746c792070604482015264185d5cd95960da1b60648201526084016106e8565b600754610100900460ff1615610a8e57610a893330866112b5565b610a98565b610a983385611688565b6000868686604051602001610aaf93929190611e61565b60408051601f1981840301815282825261ffff8b16600090815260066020529190912062c5803160e81b83529092506001600160a01b037f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf62169163c5803100913491610b29918d91879033908c908c908c90600401611e85565b6000604051808303818588803b158015610b4257600080fd5b505af1158015610b56573d6000803e3d6000fd5b50505050507f664e26797cde1146ddfcb9a5d3f4de61179f9c11b2698599bb09e686f442172b88888888604051610b909493929190611f6c565b60405180910390a15050505050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916108df918590610bd9908690611fb1565b611563565b6005546001600160a01b03163314610c085760405162461bcd60e51b81526004016106e890611e03565b610c128282611484565b604080516001600160a01b0384168152602081018390527f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688591015b60405180910390a15050565b6005546001600160a01b03163314610c835760405162461bcd60e51b81526004016106e890611e03565b6040516342d65a8d60e01b81526001600160a01b037f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6216906342d65a8d90610cd390869086908690600401611fc4565b600060405180830381600087803b158015610ced57600080fd5b505af1158015610d01573d6000803e3d6000fd5b50505050505050565b60066020526000908152604090208054610d2390611cd2565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4f90611cd2565b8015610d9c5780601f10610d7157610100808354040283529160200191610d9c565b820191906000526020600020905b815481529060010190602001808311610d7f57829003601f168201915b505050505081565b6005546001600160a01b03163314610dce5760405162461bcd60e51b81526004016106e890611e03565b818130604051602001610de393929190611feb565b60408051601f1981840301815291815261ffff8516600090815260066020522090610e0e908261205f565b50505050565b6005546001600160a01b03163314610e3e5760405162461bcd60e51b81526004016106e890611e03565b565b604080516020810182526000808252915163040a7bb160e41b815282916001600160a01b037f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6216916340a7bb1091610ea4918a9130918b908b908b9060040161211f565b6040805180830381865afa158015610ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee49190612175565b9150915094509492505050565b6060600480546107a490611cd2565b60007f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf626001600160a01b0316633408e4706040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f849190612199565b905090565b6005546001600160a01b03163314610fb35760405162461bcd60e51b81526004016106e890611e03565b610fbd8282611688565b604080516001600160a01b0384168152602081018390527fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59101610c4d565b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101561107e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016106e8565b61108b3385858403611563565b5060019392505050565b60006108df3384846112b5565b6005546001600160a01b031633146110cc5760405162461bcd60e51b81526004016106e890611e03565b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf62169063cbed8b9c9061112090889088908890889088906004016121b6565b600060405180830381600087803b15801561113a57600080fd5b505af115801561114e573d6000803e3d6000fd5b505050505050505050565b6005546001600160a01b031633146111835760405162461bcd60e51b81526004016106e890611e03565b6007805460ff19168215159081179091556040519081527f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd29060200160405180910390a150565b6005546001600160a01b031633146111f45760405162461bcd60e51b81526004016106e890611e03565b6001600160a01b0381166112595760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106e8565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166113195760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016106e8565b6001600160a01b03821661137b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016106e8565b6001600160a01b038316600090815260208190526040902054818110156113f35760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016106e8565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061142a908490611fb1565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161147691815260200190565b60405180910390a350505050565b6001600160a01b0382166114da5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106e8565b80600260008282546114ec9190611fb1565b90915550506001600160a01b03821660009081526020819052604081208054839290611519908490611fb1565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0383166115c55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106e8565b6001600160a01b0382166116265760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106e8565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0382166116e85760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016106e8565b6001600160a01b0382166000908152602081905260409020548181101561175c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016106e8565b6001600160a01b038316600090815260208190526040812083830390556002805484929061178b9084906121ef565b909155505060405182815261dead906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161167b565b505050565b61ffff811681146117e457600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611826576118266117e7565b604052919050565b600067ffffffffffffffff821115611848576118486117e7565b50601f01601f191660200190565b600082601f83011261186757600080fd5b813561187a6118758261182e565b6117fd565b81815284602083860101111561188f57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156118c257600080fd5b84356118cd816117d4565b9350602085013567ffffffffffffffff808211156118ea57600080fd5b6118f688838901611856565b945060408701359150808216821461190d57600080fd5b9092506060860135908082111561192357600080fd5b5061193087828801611856565b91505092959194509250565b60005b8381101561195757818101518382015260200161193f565b50506000910152565b6000815180845261197881602086016020860161193c565b601f01601f19169290920160200192915050565b60208152600061199f6020830184611960565b9392505050565b6000602082840312156119b857600080fd5b813561199f816117d4565b80356001600160a01b03811681146119da57600080fd5b919050565b600080604083850312156119f257600080fd5b6119fb836119c3565b946020939093013593505050565b600080600060608486031215611a1e57600080fd5b611a27846119c3565b9250611a35602085016119c3565b9150604084013590509250925092565b60008083601f840112611a5757600080fd5b50813567ffffffffffffffff811115611a6f57600080fd5b602083019150836020828501011115611a8757600080fd5b9250929050565b600080600080600080600060a0888a031215611aa957600080fd5b8735611ab4816117d4565b9650602088013567ffffffffffffffff80821115611ad157600080fd5b611add8b838c01611a45565b909850965060408a01359550869150611af860608b016119c3565b945060808a0135915080821115611b0e57600080fd5b50611b1b8a828b01611a45565b989b979a50959850939692959293505050565b600080600060408486031215611b4357600080fd5b8335611b4e816117d4565b9250602084013567ffffffffffffffff811115611b6a57600080fd5b611b7686828701611a45565b9497909650939450505050565b600060208284031215611b9557600080fd5b61199f826119c3565b803580151581146119da57600080fd5b60008060008060608587031215611bc457600080fd5b8435611bcf816117d4565b9350611bdd60208601611b9e565b9250604085013567ffffffffffffffff811115611bf957600080fd5b611c0587828801611a45565b95989497509550505050565b600080600080600060808688031215611c2957600080fd5b8535611c34816117d4565b94506020860135611c44816117d4565b935060408601359250606086013567ffffffffffffffff811115611c6757600080fd5b611c7388828901611a45565b969995985093965092949392505050565b60008060408385031215611c9757600080fd5b611ca0836119c3565b9150611cae602084016119c3565b90509250929050565b600060208284031215611cc957600080fd5b61199f82611b9e565b600181811c90821680611ce657607f821691505b602082108103611d0657634e487b7160e01b600052602260045260246000fd5b50919050565b6000808354611d1a81611cd2565b60018281168015611d325760018114611d4757611d76565b60ff1984168752821515830287019450611d76565b8760005260208060002060005b85811015611d6d5781548a820152908401908201611d54565b50505082870194505b50929695505050505050565b60008060408385031215611d9557600080fd5b825167ffffffffffffffff811115611dac57600080fd5b8301601f81018513611dbd57600080fd5b8051611dcb6118758261182e565b818152866020838501011115611de057600080fd5b611df182602083016020860161193c565b60209590950151949694955050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081526000611e75604083018587611e38565b9050826020830152949350505050565b61ffff881681526000602060c08184015260008954611ea381611cd2565b8060c087015260e0600180841660008114611ec55760018114611edf57611f0d565b60ff1985168984015283151560051b890183019550611f0d565b8e6000528660002060005b85811015611f055781548b8201860152908301908801611eea565b8a0184019650505b50505050508381036040850152611f24818a611960565b915050611f3c60608401886001600160a01b03169052565b6001600160a01b038616608084015282810360a0840152611f5e818587611e38565b9a9950505050505050505050565b61ffff85168152606060208201526000611f8a606083018587611e38565b905082604083015295945050505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156108e3576108e3611f9b565b61ffff84168152604060208201526000611fe2604083018486611e38565b95945050505050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b601f8211156117cf57600081815260208120601f850160051c810160208610156120385750805b601f850160051c820191505b8181101561205757828155600101612044565b505050505050565b815167ffffffffffffffff811115612079576120796117e7565b61208d816120878454611cd2565b84612011565b602080601f8311600181146120c257600084156120aa5750858301515b600019600386901b1c1916600185901b178555612057565b600085815260208120601f198616915b828110156120f1578886015182559484019460019091019084016120d2565b508582101561210f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff871681526001600160a01b038616602082015260a06040820181905260009061214d90830187611960565b85151560608401528281036080840152612168818587611e38565b9998505050505050505050565b6000806040838503121561218857600080fd5b505080516020909101519092909150565b6000602082840312156121ab57600080fd5b815161199f816117d4565b600061ffff8088168352808716602084015250846040830152608060608301526121e4608083018486611e38565b979650505050505050565b818103818111156108e3576108e3611f9b56fea264697066735822122021a9973d4e917fbdbd0820b1fce0908d52f1d12f06b5d33c13815e6bf70e810c64736f6c63430008120033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000003c2269811836af69497e5f486a85d7316753cf62000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000000000000000000000000000000000000000000008416c7469747564650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004414c544400000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Altitude
Arg [1] : _symbol (string): ALTD
Arg [2] : _endpoint (address): 0x3c2269811836af69497E5F486A85D7316753cf62
Arg [3] : _mainEndpointId (uint16): 1
Arg [4] : _initialSupplyOnMainEndpoint (uint256): 100000000000000000000000000

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000003c2269811836af69497e5f486a85d7316753cf62
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [6] : 416c746974756465000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 414c544400000000000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

32305:347:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29773:1059;;;;;;;;;;-1:-1:-1;29773:1059:0;;;;;:::i;:::-;;:::i;:::-;;9391:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31365:119;;;;;;;;;;-1:-1:-1;31365:119:0;;;;;:::i;:::-;;:::i;11558:169::-;;;;;;;;;;-1:-1:-1;11558:169:0;;;;;:::i;:::-;;:::i;:::-;;;3656:14:1;;3649:22;3631:41;;3619:2;3604:18;11558:169:0;3491:187:1;31492:125:0;;;;;;;;;;-1:-1:-1;31492:125:0;;;;;:::i;:::-;;:::i;10511:108::-;;;;;;;;;;-1:-1:-1;10599:12:0;;10511:108;;;3829:25:1;;;3817:2;3802:18;10511:108:0;3683:177:1;12209:492:0;;;;;;;;;;-1:-1:-1;12209:492:0;;;;;:::i;:::-;;:::i;28346:1419::-;;;;;;:::i;:::-;;:::i;10353:93::-;;;;;;;;;;-1:-1:-1;10353:93:0;;10436:2;5691:36:1;;5679:2;5664:18;10353:93:0;5549:184:1;13110:215:0;;;;;;;;;;-1:-1:-1;13110:215:0;;;;;:::i;:::-;;:::i;31809:135::-;;;;;;;;;;-1:-1:-1;31809:135:0;;;;;:::i;:::-;;:::i;31625:176::-;;;;;;;;;;-1:-1:-1;31625:176:0;;;;;:::i;:::-;;:::i;27075:18::-;;;;;;;;;;-1:-1:-1;27075:18:0;;;;;;;;26896:44;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6475:32:1;;;6457:51;;6445:2;6430:18;26896:44:0;6285:229:1;27100:18:0;;;;;;;;;;-1:-1:-1;27100:18:0;;;;;;;;;;;26988:49;;;;;;;;;;-1:-1:-1;26988:49:0;;;;;:::i;:::-;;:::i;28017:217::-;;;;;;;;;;-1:-1:-1;28017:217:0;;;;;:::i;:::-;;:::i;10682:127::-;;;;;;;;;;-1:-1:-1;10682:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;10783:18:0;10756:7;10783:18;;;;;;;;;;;;10682:127;32101:57;;;;;;;;;;;;;:::i;30840:261::-;;;;;;;;;;-1:-1:-1;30840:261:0;;;;;:::i;:::-;;:::i;:::-;;;;7887:25:1;;;7943:2;7928:18;;7921:34;;;;7860:18;30840:261:0;7713:248:1;5257:87:0;;;;;;;;;;-1:-1:-1;5330:6:0;;-1:-1:-1;;;;;5330:6:0;5257:87;;9610:104;;;;;;;;;;;;;:::i;28242:96::-;;;;;;;;;;;;;:::i;:::-;;;8457:6:1;8445:19;;;8427:38;;8415:2;8400:18;28242:96:0;8283:188:1;31952:141:0;;;;;;;;;;-1:-1:-1;31952:141:0;;;;;:::i;:::-;;:::i;13828:413::-;;;;;;;;;;-1:-1:-1;13828:413:0;;;;;:::i;:::-;;:::i;11022:175::-;;;;;;;;;;-1:-1:-1;11022:175:0;;;;;:::i;:::-;;:::i;31109:248::-;;;;;;;;;;-1:-1:-1;31109:248:0;;;;;:::i;:::-;;:::i;11260:151::-;;;;;;;;;;-1:-1:-1;11260:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;11376:18:0;;;11349:7;11376:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11260:151;27888:121;;;;;;;;;;-1:-1:-1;27888:121:0;;;;;:::i;:::-;;:::i;6211:244::-;;;;;;;;;;-1:-1:-1;6211:244:0;;;;;:::i;:::-;;:::i;29773:1059::-;29956:10;-1:-1:-1;;;;;29978:8:0;29956:31;;29948:40;;;;;;30114:30;;;;;;;:17;:30;;;;;:37;;;;;:::i;:::-;;;30091:12;:19;:60;:132;;;;-1:-1:-1;30192:30:0;;;;;;;:17;:30;;;;;;;30182:41;;;;30192:30;30182:41;:::i;:::-;;;;;;;;30165:12;30155:23;;;;;;:68;30091:132;30069:218;;;;-1:-1:-1;;;30069:218:0;;11238:2:1;30069:218:0;;;11220:21:1;11277:2;11257:18;;;11250:30;11316:34;11296:18;;;11289:62;-1:-1:-1;;;11367:18:1;;;11360:34;11411:19;;30069:218:0;;;;;;;;;30320:16;30338:12;30365:8;30354:38;;;;;;;;;;;;:::i;:::-;30529:2;30520:12;;30514:19;30634:6;;30520:12;;-1:-1:-1;30319:73:0;;-1:-1:-1;30514:19:0;30634:6;;;;;30630:135;;;30657:41;30675:4;30682:9;30693:4;30657:9;:41::i;:::-;30630:135;;;30731:22;30737:9;30748:4;30731:5;:22::i;:::-;30782:42;;;12390:6:1;12378:19;;12360:38;;12446:18;12434:31;;12429:2;12414:18;;12407:59;12482:18;;;12475:34;;;30782:42:0;;12348:2:1;12333:18;30782:42:0;;;;;;;29937:895;;;29773:1059;;;;:::o;9391:100::-;9445:13;9478:5;9471:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9391:100;:::o;31365:119::-;5330:6;;-1:-1:-1;;;;;5330:6:0;3840:10;5477:23;5469:68;;;;-1:-1:-1;;;5469:68:0;;;;;;;:::i;:::-;31444:32:::1;::::0;-1:-1:-1;;;31444:32:0;;8457:6:1;8445:19;;31444:32:0::1;::::0;::::1;8427:38:1::0;31444:8:0::1;-1:-1:-1::0;;;;;31444:23:0::1;::::0;::::1;::::0;8400:18:1;;31444:32:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31365:119:::0;:::o;11558:169::-;11641:4;11658:39;3840:10;11681:7;11690:6;11658:8;:39::i;:::-;-1:-1:-1;11715:4:0;11558:169;;;;;:::o;31492:125::-;5330:6;;-1:-1:-1;;;;;5330:6:0;3840:10;5477:23;5469:68;;;;-1:-1:-1;;;5469:68:0;;;;;;;:::i;:::-;31574:35:::1;::::0;-1:-1:-1;;;31574:35:0;;8457:6:1;8445:19;;31574:35:0::1;::::0;::::1;8427:38:1::0;31574:8:0::1;-1:-1:-1::0;;;;;31574:26:0::1;::::0;::::1;::::0;8400:18:1;;31574:35:0::1;8283:188:1::0;12209:492:0;12349:4;12366:36;12376:6;12384:9;12395:6;12366:9;:36::i;:::-;-1:-1:-1;;;;;12442:19:0;;12415:24;12442:19;;;:11;:19;;;;;;;;3840:10;12442:33;;;;;;;;12494:26;;;;12486:79;;;;-1:-1:-1;;;12486:79:0;;13083:2:1;12486:79:0;;;13065:21:1;13122:2;13102:18;;;13095:30;13161:34;13141:18;;;13134:62;-1:-1:-1;;;13212:18:1;;;13205:38;13260:19;;12486:79:0;12881:404:1;12486:79:0;12601:57;12610:6;3840:10;12651:6;12632:16;:25;12601:8;:57::i;:::-;-1:-1:-1;12689:4:0;;12209:492;-1:-1:-1;;;;12209:492:0:o;28346:1419::-;28716:6;;;;28715:7;28707:57;;;;-1:-1:-1;;;28707:57:0;;13492:2:1;28707:57:0;;;13474:21:1;13531:2;13511:18;;;13504:30;13570:34;13550:18;;;13543:62;-1:-1:-1;;;13621:18:1;;;13614:35;13666:19;;28707:57:0;13290:401:1;28707:57:0;28840:6;;;;;;;28836:219;;;28945:42;28955:10;28975:4;28982;28945:9;:42::i;:::-;28836:219;;;29020:23;29026:10;29038:4;29020:5;:23::i;:::-;29128:20;29162:3;;29167:4;29151:21;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;29151:21:0;;;;;;;;;29315:30;;;;;;;:17;29151:21;29315:30;;;;;-1:-1:-1;;;29220:486:0;;29151:21;;-1:-1:-1;;;;;;29220:8:0;:13;;;;29241:9;;29220:486;;29266:11;;29151:21;;29441:10;;29547:17;;29631:12;;;;29220:486;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29722:35;29734:11;29747:3;;29752:4;29722:35;;;;;;;;;:::i;:::-;;;;;;;;28696:1069;28346:1419;;;;;;;:::o;13110:215::-;3840:10;13198:4;13247:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13247:34:0;;;;;;;;;;13198:4;;13215:80;;13238:7;;13247:47;;13284:10;;13247:47;:::i;:::-;13215:8;:80::i;31809:135::-;5330:6;;-1:-1:-1;;;;;5330:6:0;3840:10;5477:23;5469:68;;;;-1:-1:-1;;;5469:68:0;;;;;;;:::i;:::-;31883:19:::1;31889:3;31894:7;31883:5;:19::i;:::-;31918:18;::::0;;-1:-1:-1;;;;;16694:32:1;;16676:51;;16758:2;16743:18;;16736:34;;;31918:18:0::1;::::0;16649::1;31918::0::1;;;;;;;;31809:135:::0;;:::o;31625:176::-;5330:6;;-1:-1:-1;;;;;5330:6:0;3840:10;5477:23;5469:68;;;;-1:-1:-1;;;5469:68:0;;;;;;;:::i;:::-;31740:53:::1;::::0;-1:-1:-1;;;31740:53:0;;-1:-1:-1;;;;;31740:8:0::1;:27;::::0;::::1;::::0;:53:::1;::::0;31768:11;;31781;;;;31740:53:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31625:176:::0;;;:::o;26988:49::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28017:217::-;5330:6;;-1:-1:-1;;;;;5330:6:0;3840:10;5477:23;5469:68;;;;-1:-1:-1;;;5469:68:0;;;;;;;:::i;:::-;28183:27:::1;;28220:4;28166:60;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;28166:60:0;;::::1;::::0;;;;;;28133:30:::1;::::0;::::1;;::::0;;;:17:::1;28166:60;28133:30:::0;;;:93:::1;::::0;:30;:93:::1;:::i;:::-;;28017:217:::0;;;:::o;32101:57::-;5330:6;;-1:-1:-1;;;;;5330:6:0;3840:10;5477:23;5469:68;;;;-1:-1:-1;;;5469:68:0;;;;;;;:::i;:::-;32101:57::o;30840:261::-;31060:9;;;;;;;;30957:17;31060:9;;;31010:83;;-1:-1:-1;;;31010:83:0;;30957:17;;-1:-1:-1;;;;;31010:8:0;:21;;;;:83;;31032:11;;31053:4;;31071:7;;31080:12;;;;31010:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31003:90;;;;30840:261;;;;;;;:::o;9610:104::-;9666:13;9699:7;9692:14;;;;;:::i;28242:96::-;28284:6;28309:8;-1:-1:-1;;;;;28309:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28302:28;;28242:96;:::o;31952:141::-;5330:6;;-1:-1:-1;;;;;5330:6:0;3840:10;5477:23;5469:68;;;;-1:-1:-1;;;5469:68:0;;;;;;;:::i;:::-;32028:21:::1;32034:5;32041:7;32028:5;:21::i;:::-;32065:20;::::0;;-1:-1:-1;;;;;16694:32:1;;16676:51;;16758:2;16743:18;;16736:34;;;32065:20:0::1;::::0;16649:18:1;32065:20:0::1;16502:274:1::0;13828:413:0;3840:10;13921:4;13965:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13965:34:0;;;;;;;;;;14018:35;;;;14010:85;;;;-1:-1:-1;;;14010:85:0;;20929:2:1;14010:85:0;;;20911:21:1;20968:2;20948:18;;;20941:30;21007:34;20987:18;;;20980:62;-1:-1:-1;;;21058:18:1;;;21051:35;21103:19;;14010:85:0;20727:401:1;14010:85:0;14131:67;3840:10;14154:7;14182:15;14163:16;:34;14131:8;:67::i;:::-;-1:-1:-1;14229:4:0;;13828:413;-1:-1:-1;;;13828:413:0:o;11022:175::-;11108:4;11125:42;3840:10;11149:9;11160:6;11125:9;:42::i;31109:248::-;5330:6;;-1:-1:-1;;;;;5330:6:0;3840:10;5477:23;5469:68;;;;-1:-1:-1;;;5469:68:0;;;;;;;:::i;:::-;31289:60:::1;::::0;-1:-1:-1;;;31289:60:0;;-1:-1:-1;;;;;31289:8:0::1;:18;::::0;::::1;::::0;:60:::1;::::0;31308:8;;31318;;31328:11;;31341:7;;;;31289:60:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31109:248:::0;;;;;:::o;27888:121::-;5330:6;;-1:-1:-1;;;;;5330:6:0;3840:10;5477:23;5469:68;;;;-1:-1:-1;;;5469:68:0;;;;;;;:::i;:::-;27956:6:::1;:15:::0;;-1:-1:-1;;27956:15:0::1;::::0;::::1;;::::0;;::::1;::::0;;;27987:14:::1;::::0;3631:41:1;;;27987:14:0::1;::::0;3619:2:1;3604:18;27987:14:0::1;;;;;;;27888:121:::0;:::o;6211:244::-;5330:6;;-1:-1:-1;;;;;5330:6:0;3840:10;5477:23;5469:68;;;;-1:-1:-1;;;5469:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6300:22:0;::::1;6292:73;;;::::0;-1:-1:-1;;;6292:73:0;;21838:2:1;6292:73:0::1;::::0;::::1;21820:21:1::0;21877:2;21857:18;;;21850:30;21916:34;21896:18;;;21889:62;-1:-1:-1;;;21967:18:1;;;21960:36;22013:19;;6292:73:0::1;21636:402:1::0;6292:73:0::1;6402:6;::::0;6381:38:::1;::::0;-1:-1:-1;;;;;6381:38:0;;::::1;::::0;6402:6:::1;::::0;6381:38:::1;::::0;6402:6:::1;::::0;6381:38:::1;6430:6;:17:::0;;-1:-1:-1;;;;;;6430:17:0::1;-1:-1:-1::0;;;;;6430:17:0;;;::::1;::::0;;;::::1;::::0;;6211:244::o;14731:674::-;-1:-1:-1;;;;;14871:20:0;;14863:70;;;;-1:-1:-1;;;14863:70:0;;22245:2:1;14863:70:0;;;22227:21:1;22284:2;22264:18;;;22257:30;22323:34;22303:18;;;22296:62;-1:-1:-1;;;22374:18:1;;;22367:35;22419:19;;14863:70:0;22043:401:1;14863:70:0;-1:-1:-1;;;;;14952:23:0;;14944:71;;;;-1:-1:-1;;;14944:71:0;;22651:2:1;14944:71:0;;;22633:21:1;22690:2;22670:18;;;22663:30;22729:34;22709:18;;;22702:62;-1:-1:-1;;;22780:18:1;;;22773:33;22823:19;;14944:71:0;22449:399:1;14944:71:0;-1:-1:-1;;;;;15112:17:0;;15088:21;15112:17;;;;;;;;;;;15148:23;;;;15140:74;;;;-1:-1:-1;;;15140:74:0;;23055:2:1;15140:74:0;;;23037:21:1;23094:2;23074:18;;;23067:30;23133:34;23113:18;;;23106:62;-1:-1:-1;;;23184:18:1;;;23177:36;23230:19;;15140:74:0;22853:402:1;15140:74:0;-1:-1:-1;;;;;15250:17:0;;;:9;:17;;;;;;;;;;;15270:22;;;15250:42;;15314:20;;;;;;;;:30;;15286:6;;15250:9;15314:30;;15286:6;;15314:30;:::i;:::-;;;;;;;;15379:9;-1:-1:-1;;;;;15362:35:0;15371:6;-1:-1:-1;;;;;15362:35:0;;15390:6;15362:35;;;;3829:25:1;;3817:2;3802:18;;3683:177;15362:35:0;;;;;;;;14852:553;14731:674;;;:::o;15692:338::-;-1:-1:-1;;;;;15776:21:0;;15768:65;;;;-1:-1:-1;;;15768:65:0;;23462:2:1;15768:65:0;;;23444:21:1;23501:2;23481:18;;;23474:30;23540:33;23520:18;;;23513:61;23591:18;;15768:65:0;23260:355:1;15768:65:0;15924:6;15908:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;15941:18:0;;:9;:18;;;;;;;;;;:28;;15963:6;;15941:9;:28;;15963:6;;15941:28;:::i;:::-;;;;-1:-1:-1;;15985:37:0;;3829:25:1;;;-1:-1:-1;;;;;15985:37:0;;;16002:1;;15985:37;;3817:2:1;3802:18;15985:37:0;;;;;;;15692:338;;:::o;17363:380::-;-1:-1:-1;;;;;17499:19:0;;17491:68;;;;-1:-1:-1;;;17491:68:0;;23822:2:1;17491:68:0;;;23804:21:1;23861:2;23841:18;;;23834:30;23900:34;23880:18;;;23873:62;-1:-1:-1;;;23951:18:1;;;23944:34;23995:19;;17491:68:0;23620:400:1;17491:68:0;-1:-1:-1;;;;;17578:21:0;;17570:68;;;;-1:-1:-1;;;17570:68:0;;24227:2:1;17570:68:0;;;24209:21:1;24266:2;24246:18;;;24239:30;24305:34;24285:18;;;24278:62;-1:-1:-1;;;24356:18:1;;;24349:32;24398:19;;17570:68:0;24025:398:1;17570:68:0;-1:-1:-1;;;;;17651:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17703:32;;3829:25:1;;;17703:32:0;;3802:18:1;17703:32:0;;;;;;;;17363:380;;;:::o;16363:562::-;-1:-1:-1;;;;;16447:21:0;;16439:67;;;;-1:-1:-1;;;16439:67:0;;24630:2:1;16439:67:0;;;24612:21:1;24669:2;24649:18;;;24642:30;24708:34;24688:18;;;24681:62;-1:-1:-1;;;24759:18:1;;;24752:31;24800:19;;16439:67:0;24428:397:1;16439:67:0;-1:-1:-1;;;;;16606:18:0;;16581:22;16606:18;;;;;;;;;;;16643:24;;;;16635:71;;;;-1:-1:-1;;;16635:71:0;;25032:2:1;16635:71:0;;;25014:21:1;25071:2;25051:18;;;25044:30;25110:34;25090:18;;;25083:62;-1:-1:-1;;;25161:18:1;;;25154:32;25203:19;;16635:71:0;24830:398:1;16635:71:0;-1:-1:-1;;;;;16742:18:0;;:9;:18;;;;;;;;;;16763:23;;;16742:44;;16808:12;:22;;16780:6;;16742:9;16808:22;;16780:6;;16808:22;:::i;:::-;;;;-1:-1:-1;;16848:69:0;;3829:25:1;;;16866:42:0;;-1:-1:-1;;;;;16848:69:0;;;;;3817:2:1;3802:18;16848:69:0;3683:177:1;18346:125:0;;;;:::o;14:117:1:-;99:6;92:5;88:18;81:5;78:29;68:57;;121:1;118;111:12;68:57;14:117;:::o;136:127::-;197:10;192:3;188:20;185:1;178:31;228:4;225:1;218:15;252:4;249:1;242:15;268:275;339:2;333:9;404:2;385:13;;-1:-1:-1;;381:27:1;369:40;;439:18;424:34;;460:22;;;421:62;418:88;;;486:18;;:::i;:::-;522:2;515:22;268:275;;-1:-1:-1;268:275:1:o;548:186::-;596:4;629:18;621:6;618:30;615:56;;;651:18;;:::i;:::-;-1:-1:-1;717:2:1;696:15;-1:-1:-1;;692:29:1;723:4;688:40;;548:186::o;739:462::-;781:5;834:3;827:4;819:6;815:17;811:27;801:55;;852:1;849;842:12;801:55;888:6;875:20;919:48;935:31;963:2;935:31;:::i;:::-;919:48;:::i;:::-;992:2;983:7;976:19;1038:3;1031:4;1026:2;1018:6;1014:15;1010:26;1007:35;1004:55;;;1055:1;1052;1045:12;1004:55;1120:2;1113:4;1105:6;1101:17;1094:4;1085:7;1081:18;1068:55;1168:1;1143:16;;;1161:4;1139:27;1132:38;;;;1147:7;739:462;-1:-1:-1;;;739:462:1:o;1206:837::-;1308:6;1316;1324;1332;1385:3;1373:9;1364:7;1360:23;1356:33;1353:53;;;1402:1;1399;1392:12;1353:53;1441:9;1428:23;1460:30;1484:5;1460:30;:::i;:::-;1509:5;-1:-1:-1;1565:2:1;1550:18;;1537:32;1588:18;1618:14;;;1615:34;;;1645:1;1642;1635:12;1615:34;1668:49;1709:7;1700:6;1689:9;1685:22;1668:49;:::i;:::-;1658:59;;1769:2;1758:9;1754:18;1741:32;1726:47;;1817:2;1808:7;1804:16;1795:7;1792:29;1782:57;;1835:1;1832;1825:12;1782:57;1858:7;;-1:-1:-1;1918:2:1;1903:18;;1890:32;;1934:16;;;1931:36;;;1963:1;1960;1953:12;1931:36;;1986:51;2029:7;2018:8;2007:9;2003:24;1986:51;:::i;:::-;1976:61;;;1206:837;;;;;;;:::o;2048:250::-;2133:1;2143:113;2157:6;2154:1;2151:13;2143:113;;;2233:11;;;2227:18;2214:11;;;2207:39;2179:2;2172:10;2143:113;;;-1:-1:-1;;2290:1:1;2272:16;;2265:27;2048:250::o;2303:271::-;2345:3;2383:5;2377:12;2410:6;2405:3;2398:19;2426:76;2495:6;2488:4;2483:3;2479:14;2472:4;2465:5;2461:16;2426:76;:::i;:::-;2556:2;2535:15;-1:-1:-1;;2531:29:1;2522:39;;;;2563:4;2518:50;;2303:271;-1:-1:-1;;2303:271:1:o;2579:220::-;2728:2;2717:9;2710:21;2691:4;2748:45;2789:2;2778:9;2774:18;2766:6;2748:45;:::i;:::-;2740:53;2579:220;-1:-1:-1;;;2579:220:1:o;2804:245::-;2862:6;2915:2;2903:9;2894:7;2890:23;2886:32;2883:52;;;2931:1;2928;2921:12;2883:52;2970:9;2957:23;2989:30;3013:5;2989:30;:::i;3054:173::-;3122:20;;-1:-1:-1;;;;;3171:31:1;;3161:42;;3151:70;;3217:1;3214;3207:12;3151:70;3054:173;;;:::o;3232:254::-;3300:6;3308;3361:2;3349:9;3340:7;3336:23;3332:32;3329:52;;;3377:1;3374;3367:12;3329:52;3400:29;3419:9;3400:29;:::i;:::-;3390:39;3476:2;3461:18;;;;3448:32;;-1:-1:-1;;;3232:254:1:o;3865:328::-;3942:6;3950;3958;4011:2;3999:9;3990:7;3986:23;3982:32;3979:52;;;4027:1;4024;4017:12;3979:52;4050:29;4069:9;4050:29;:::i;:::-;4040:39;;4098:38;4132:2;4121:9;4117:18;4098:38;:::i;:::-;4088:48;;4183:2;4172:9;4168:18;4155:32;4145:42;;3865:328;;;;;:::o;4198:347::-;4249:8;4259:6;4313:3;4306:4;4298:6;4294:17;4290:27;4280:55;;4331:1;4328;4321:12;4280:55;-1:-1:-1;4354:20:1;;4397:18;4386:30;;4383:50;;;4429:1;4426;4419:12;4383:50;4466:4;4458:6;4454:17;4442:29;;4518:3;4511:4;4502:6;4494;4490:19;4486:30;4483:39;4480:59;;;4535:1;4532;4525:12;4480:59;4198:347;;;;;:::o;4550:994::-;4666:6;4674;4682;4690;4698;4706;4714;4767:3;4755:9;4746:7;4742:23;4738:33;4735:53;;;4784:1;4781;4774:12;4735:53;4823:9;4810:23;4842:30;4866:5;4842:30;:::i;:::-;4891:5;-1:-1:-1;4947:2:1;4932:18;;4919:32;4970:18;5000:14;;;4997:34;;;5027:1;5024;5017:12;4997:34;5066:58;5116:7;5107:6;5096:9;5092:22;5066:58;:::i;:::-;5143:8;;-1:-1:-1;5040:84:1;-1:-1:-1;5225:2:1;5210:18;;5197:32;;-1:-1:-1;5040:84:1;;-1:-1:-1;5248:38:1;5282:2;5267:18;;5248:38;:::i;:::-;5238:48;;5339:3;5328:9;5324:19;5311:33;5295:49;;5369:2;5359:8;5356:16;5353:36;;;5385:1;5382;5375:12;5353:36;;5424:60;5476:7;5465:8;5454:9;5450:24;5424:60;:::i;:::-;4550:994;;;;-1:-1:-1;4550:994:1;;-1:-1:-1;4550:994:1;;;;5398:86;;-1:-1:-1;;;4550:994:1:o;5738:542::-;5816:6;5824;5832;5885:2;5873:9;5864:7;5860:23;5856:32;5853:52;;;5901:1;5898;5891:12;5853:52;5940:9;5927:23;5959:30;5983:5;5959:30;:::i;:::-;6008:5;-1:-1:-1;6064:2:1;6049:18;;6036:32;6091:18;6080:30;;6077:50;;;6123:1;6120;6113:12;6077:50;6162:58;6212:7;6203:6;6192:9;6188:22;6162:58;:::i;:::-;5738:542;;6239:8;;-1:-1:-1;6136:84:1;;-1:-1:-1;;;;5738:542:1:o;6742:186::-;6801:6;6854:2;6842:9;6833:7;6829:23;6825:32;6822:52;;;6870:1;6867;6860:12;6822:52;6893:29;6912:9;6893:29;:::i;6933:160::-;6998:20;;7054:13;;7047:21;7037:32;;7027:60;;7083:1;7080;7073:12;7098:610;7182:6;7190;7198;7206;7259:2;7247:9;7238:7;7234:23;7230:32;7227:52;;;7275:1;7272;7265:12;7227:52;7314:9;7301:23;7333:30;7357:5;7333:30;:::i;:::-;7382:5;-1:-1:-1;7406:35:1;7437:2;7422:18;;7406:35;:::i;:::-;7396:45;;7492:2;7481:9;7477:18;7464:32;7519:18;7511:6;7508:30;7505:50;;;7551:1;7548;7541:12;7505:50;7590:58;7640:7;7631:6;7620:9;7616:22;7590:58;:::i;:::-;7098:610;;;;-1:-1:-1;7667:8:1;-1:-1:-1;;;;7098:610:1:o;8476:750::-;8571:6;8579;8587;8595;8603;8656:3;8644:9;8635:7;8631:23;8627:33;8624:53;;;8673:1;8670;8663:12;8624:53;8712:9;8699:23;8731:30;8755:5;8731:30;:::i;:::-;8780:5;-1:-1:-1;8837:2:1;8822:18;;8809:32;8850;8809;8850;:::i;:::-;8901:7;-1:-1:-1;8955:2:1;8940:18;;8927:32;;-1:-1:-1;9010:2:1;8995:18;;8982:32;9037:18;9026:30;;9023:50;;;9069:1;9066;9059:12;9023:50;9108:58;9158:7;9149:6;9138:9;9134:22;9108:58;:::i;:::-;8476:750;;;;-1:-1:-1;8476:750:1;;-1:-1:-1;9185:8:1;;9082:84;8476:750;-1:-1:-1;;;8476:750:1:o;9231:260::-;9299:6;9307;9360:2;9348:9;9339:7;9335:23;9331:32;9328:52;;;9376:1;9373;9366:12;9328:52;9399:29;9418:9;9399:29;:::i;:::-;9389:39;;9447:38;9481:2;9470:9;9466:18;9447:38;:::i;:::-;9437:48;;9231:260;;;;;:::o;9496:180::-;9552:6;9605:2;9593:9;9584:7;9580:23;9576:32;9573:52;;;9621:1;9618;9611:12;9573:52;9644:26;9660:9;9644:26;:::i;9681:380::-;9760:1;9756:12;;;;9803;;;9824:61;;9878:4;9870:6;9866:17;9856:27;;9824:61;9931:2;9923:6;9920:14;9900:18;9897:38;9894:161;;9977:10;9972:3;9968:20;9965:1;9958:31;10012:4;10009:1;10002:15;10040:4;10037:1;10030:15;9894:161;;9681:380;;;:::o;10191:840::-;10317:3;10346:1;10379:6;10373:13;10409:36;10435:9;10409:36;:::i;:::-;10464:1;10481:18;;;10508:133;;;;10655:1;10650:356;;;;10474:532;;10508:133;-1:-1:-1;;10541:24:1;;10529:37;;10614:14;;10607:22;10595:35;;10586:45;;;-1:-1:-1;10508:133:1;;10650:356;10681:6;10678:1;10671:17;10711:4;10756:2;10753:1;10743:16;10781:1;10795:165;10809:6;10806:1;10803:13;10795:165;;;10887:14;;10874:11;;;10867:35;10930:16;;;;10824:10;;10795:165;;;10799:3;;;10989:6;10984:3;10980:16;10973:23;;10474:532;-1:-1:-1;11022:3:1;;10191:840;-1:-1:-1;;;;;;10191:840:1:o;11441:716::-;11529:6;11537;11590:2;11578:9;11569:7;11565:23;11561:32;11558:52;;;11606:1;11603;11596:12;11558:52;11639:9;11633:16;11672:18;11664:6;11661:30;11658:50;;;11704:1;11701;11694:12;11658:50;11727:22;;11780:4;11772:13;;11768:27;-1:-1:-1;11758:55:1;;11809:1;11806;11799:12;11758:55;11838:2;11832:9;11863:48;11879:31;11907:2;11879:31;:::i;11863:48::-;11934:2;11927:5;11920:17;11976:7;11969:4;11964:2;11960;11956:11;11952:22;11949:35;11946:55;;;11997:1;11994;11987:12;11946:55;12010:71;12078:2;12071:4;12064:5;12060:16;12053:4;12049:2;12045:13;12010:71;:::i;:::-;12145:4;12130:20;;;;12124:27;12100:5;;12124:27;;-1:-1:-1;;;;;11441:716:1:o;12520:356::-;12722:2;12704:21;;;12741:18;;;12734:30;12800:34;12795:2;12780:18;;12773:62;12867:2;12852:18;;12520:356::o;13696:266::-;13784:6;13779:3;13772:19;13836:6;13829:5;13822:4;13817:3;13813:14;13800:43;-1:-1:-1;13888:1:1;13863:16;;;13881:4;13859:27;;;13852:38;;;;13944:2;13923:15;;;-1:-1:-1;;13919:29:1;13910:39;;;13906:50;;13696:266::o;13967:315::-;14152:2;14141:9;14134:21;14115:4;14172:61;14229:2;14218:9;14214:18;14206:6;14198;14172:61;:::i;:::-;14164:69;;14269:6;14264:2;14253:9;14249:18;14242:34;13967:315;;;;;;:::o;14287:1546::-;14643:6;14635;14631:19;14620:9;14613:38;14594:4;14670:2;14708:3;14703:2;14692:9;14688:18;14681:31;14732:1;14765:6;14759:13;14795:36;14821:9;14795:36;:::i;:::-;14868:6;14862:3;14851:9;14847:19;14840:35;14894:3;14916:1;14948:2;14937:9;14933:18;14965:1;14960:158;;;;15132:1;15127:354;;;;14926:555;;14960:158;-1:-1:-1;;15008:24:1;;14988:18;;;14981:52;15086:14;;15079:22;15076:1;15072:30;15057:46;;15053:55;;;-1:-1:-1;14960:158:1;;15127:354;15158:6;15155:1;15148:17;15206:2;15203:1;15193:16;15231:1;15245:180;15259:6;15256:1;15253:13;15245:180;;;15352:14;;15328:17;;;15324:26;;15317:50;15395:16;;;;15274:10;;15245:180;;;15449:17;;15445:26;;;-1:-1:-1;;14926:555:1;;;;;;15526:9;15521:3;15517:19;15512:2;15501:9;15497:18;15490:47;15560:30;15586:3;15578:6;15560:30;:::i;:::-;15546:44;;;15599:46;15641:2;15630:9;15626:18;15618:6;-1:-1:-1;;;;;8032:31:1;8020:44;;7966:104;15599:46;-1:-1:-1;;;;;8032:31:1;;15696:3;15681:19;;8020:44;15750:9;15742:6;15738:22;15732:3;15721:9;15717:19;15710:51;15778:49;15820:6;15812;15804;15778:49;:::i;:::-;15770:57;14287:1546;-1:-1:-1;;;;;;;;;;14287:1546:1:o;15838:397::-;16061:6;16053;16049:19;16038:9;16031:38;16105:2;16100;16089:9;16085:18;16078:30;16012:4;16125:61;16182:2;16171:9;16167:18;16159:6;16151;16125:61;:::i;:::-;16117:69;;16222:6;16217:2;16206:9;16202:18;16195:34;15838:397;;;;;;;:::o;16240:127::-;16301:10;16296:3;16292:20;16289:1;16282:31;16332:4;16329:1;16322:15;16356:4;16353:1;16346:15;16372:125;16437:9;;;16458:10;;;16455:36;;;16471:18;;:::i;16781:326::-;16976:6;16968;16964:19;16953:9;16946:38;17020:2;17015;17004:9;17000:18;16993:30;16927:4;17040:61;17097:2;17086:9;17082:18;17074:6;17066;17040:61;:::i;:::-;17032:69;16781:326;-1:-1:-1;;;;;16781:326:1:o;17112:360::-;17323:6;17315;17310:3;17297:33;17393:2;17389:15;;;;-1:-1:-1;;17385:53:1;17349:16;;17374:65;;;17463:2;17455:11;;17112:360;-1:-1:-1;17112:360:1:o;17477:544::-;17578:2;17573:3;17570:11;17567:448;;;17614:1;17639:5;17635:2;17628:17;17684:4;17680:2;17670:19;17754:2;17742:10;17738:19;17735:1;17731:27;17725:4;17721:38;17790:4;17778:10;17775:20;17772:47;;;-1:-1:-1;17813:4:1;17772:47;17868:2;17863:3;17859:12;17856:1;17852:20;17846:4;17842:31;17832:41;;17923:82;17941:2;17934:5;17931:13;17923:82;;;17986:17;;;17967:1;17956:13;17923:82;;;17927:3;;;17477:544;;;:::o;18197:1348::-;18321:3;18315:10;18348:18;18340:6;18337:30;18334:56;;;18370:18;;:::i;:::-;18399:96;18488:6;18448:38;18480:4;18474:11;18448:38;:::i;:::-;18442:4;18399:96;:::i;:::-;18550:4;;18614:2;18603:14;;18631:1;18626:662;;;;19332:1;19349:6;19346:89;;;-1:-1:-1;19401:19:1;;;19395:26;19346:89;-1:-1:-1;;18154:1:1;18150:11;;;18146:24;18142:29;18132:40;18178:1;18174:11;;;18129:57;19448:81;;18596:943;;18626:662;10138:1;10131:14;;;10175:4;10162:18;;-1:-1:-1;;18662:20:1;;;18779:236;18793:7;18790:1;18787:14;18779:236;;;18882:19;;;18876:26;18861:42;;18974:27;;;;18942:1;18930:14;;;;18809:19;;18779:236;;;18783:3;19043:6;19034:7;19031:19;19028:201;;;19104:19;;;19098:26;-1:-1:-1;;19187:1:1;19183:14;;;19199:3;19179:24;19175:37;19171:42;19156:58;19141:74;;19028:201;-1:-1:-1;;;;;19275:1:1;19259:14;;;19255:22;19242:36;;-1:-1:-1;18197:1348:1:o;19550:668::-;19841:6;19829:19;;19811:38;;-1:-1:-1;;;;;19885:32:1;;19880:2;19865:18;;19858:60;19905:3;19949:2;19934:18;;19927:31;;;-1:-1:-1;;19981:46:1;;20007:19;;19999:6;19981:46;:::i;:::-;20077:6;20070:14;20063:22;20058:2;20047:9;20043:18;20036:50;20135:9;20127:6;20123:22;20117:3;20106:9;20102:19;20095:51;20163:49;20205:6;20197;20189;20163:49;:::i;:::-;20155:57;19550:668;-1:-1:-1;;;;;;;;;19550:668:1:o;20223:245::-;20302:6;20310;20363:2;20351:9;20342:7;20338:23;20334:32;20331:52;;;20379:1;20376;20369:12;20331:52;-1:-1:-1;;20402:16:1;;20458:2;20443:18;;;20437:25;20402:16;;20437:25;;-1:-1:-1;20223:245:1:o;20473:249::-;20542:6;20595:2;20583:9;20574:7;20570:23;20566:32;20563:52;;;20611:1;20608;20601:12;20563:52;20643:9;20637:16;20662:30;20686:5;20662:30;:::i;21133:498::-;21333:4;21362:6;21407:2;21399:6;21395:15;21384:9;21377:34;21459:2;21451:6;21447:15;21442:2;21431:9;21427:18;21420:43;;21499:6;21494:2;21483:9;21479:18;21472:34;21542:3;21537:2;21526:9;21522:18;21515:31;21563:62;21620:3;21609:9;21605:19;21597:6;21589;21563:62;:::i;:::-;21555:70;21133:498;-1:-1:-1;;;;;;;21133:498:1:o;25233:128::-;25300:9;;;25321:11;;;25318:37;;;25335:18;;:::i

Metadata Hash

ipfs://21a9973d4e917fbdbd0820b1fce0908d52f1d12f06b5d33c13815e6bf70e810c
Loading