ETH Price: $2,477.68 (-0.69%)

Token

Glacis Labs (GLACIS)
 

Overview

Max Total Supply

1,000,000 GLACIS

Holders

8

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
7,627.026075139440533278 GLACIS

Value
$0.00
0xa61d377856ed7c4ed41eaa4f12a10eafeb73da7f
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
GlacisLabs

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 2 of 12: GlacisLabs.sol
/*
 _______  _        _______  _______ _________ _______ 
(  ____ \( \      (  ___  )(  ____ \\__   __/(  ____ \
| (    \/| (      | (   ) || (    \/   ) (   | (    \/
| |      | |      | (___) || |         | |   | (_____ 
| | ____ | |      |  ___  || |         | |   (_____  )
| | \_  )| |      | (   ) || |         | |         ) |
| (___) || (____/\| )   ( || (____/\___) (___/\____) |
(_______)(_______/|/     \|(_______/\_______/\_______)

https://glacislabs.net
https://twitter.com/glacis_labs
*/

import {IGlacisRouterEvents} from "./IGlacisRouter.sol";
import {IXERC20} from "./IXERC20.sol";
import {IXERC20Lockbox} from "./IXERC20Lockbox.sol";

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

 
    function approve(address spender, uint256 amount) external returns (bool);

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

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

// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

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

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

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

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


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;


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;
    }

  
    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:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, 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}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
        
    ) public virtual override returns (bool) {
        
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

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

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, 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;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

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

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

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

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

    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 Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

   
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

pragma solidity ^0.8.9;

contract GlacisLabs is ERC20 {
    constructor() ERC20("Glacis Labs", "GLACIS") {
        _mint(msg.sender, 1000000 * 10 ** decimals());
    }
}

File 1 of 12: GlacisCommons.sol
// SPDX-License-Identifier: Apache-2.0

pragma solidity 0.8.18;

/// @title Glacis Commons
/// @dev Contract for utility functions and structures common to Glacis Client and Infrastructure
contract GlacisCommons {
    struct GlacisData {
        bytes32 messageId;
        uint256 nonce;
        address originalFrom;
        address originalTo;
    }

    struct GlacisTokenData {
        address glacisToken;
        uint256 glacisTokenAmount;
    }

    struct GlacisRoute {
        uint256 fromChainId; // 0 means any chain
        address fromAddress; // 0x00 means any address
        uint8 fromGmpId; // 0 means any GMP
    }

    /// @notice De-serialize a uint8 bitmap to an uint8 array
    /// @param bitmap The bitmap to be de-serialized
    /// @return The de-serialized array
    function _uint8ToUint8Array(
        uint8 bitmap
    ) internal pure returns (uint8[] memory) {
        uint8[] memory result = new uint8[](8);
        uint8 size;
        for (uint8 i = 0; i < 8; i++) {
            // Extract each bit from the uint8 value and store it as a uint8 element in the array
            if ((bitmap >> i) & uint8(1) == uint8(1)) result[size++] = i + 1;
        }
        assembly {
            mstore(result, size)
        }
        return result;
    }

    /// @notice Queries if a bit is ON on a bitmap
    /// @param bitmap The bitmap to be queried
    /// @param bitIndex The bitindex to query
    /// @return True if the bit is on, false otherwise
    function _isBitSet(
        uint8 bitmap,
        uint8 bitIndex
    ) internal pure returns (bool) {
        return (bitmap & (uint8(1) << bitIndex)) != 0;
    }

    /// @notice Set a bit to ON on a bitmap
    /// @param bitmap The bitmap to be modified
    /// @param bitIndex The bitindex to set to 1
    /// @return the modified bitmap with the bit set
    function _setBit(
        uint8 bitmap,
        uint8 bitIndex
    ) internal pure returns (uint8) {
        return bitmap | (uint8(1) << bitIndex);
    }
}

File 3 of 12: IGlacisAccessControlClient.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.18;

interface IGlacisAccessControlClient {
    /// @notice Adds an allowed route for this client
    /// @notice Queries if a route from path GMP+Chain+Address is allowed for this client
    /// @return True if route is allowed, false otherwise
    function isAllowedRoute(
        uint256 fromChainId,
        address fromAddress,
        uint8 fromGmpId,
        bytes memory payload
    ) external view returns (bool);
}

File 4 of 12: IGlacisAdapter.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.18;

/// An interface that defines the GMP modules (adapters) that the GlacisRouter interacts with.
interface IGlacisAdapter {
    /// Determines if a chain is available through this adapter
    /// @param chainId the Glacis chain ID
    /// @return true if the chain is available, false otherwise
    function chainIsAvailable(uint256 chainId) external view returns (bool);

    /// Sends a payload across chains to the destination router.
    /// @param chainId the Glacis chain ID
    /// @param payload the data packet to send across chains
    function sendMessage(
        uint256 chainId,
        address refundAddress,
        bytes calldata payload
    ) external payable;

    error IGlacisAdapter__ChainIsNotAvailable(uint256 toChainId);
}

File 5 of 12: IGlacisClient.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.18;

import {GlacisCommons} from "./GlacisCommons.sol";
import {IGlacisAccessControlClient} from "./IGlacisAccessControlClient.sol";

/// An interface that defines the GMP modules (adapters) that the GlacisRouter interacts with.
abstract contract IGlacisClient is IGlacisAccessControlClient {
    uint256 private immutable DEFAULT_QUORUM;

    constructor(uint256 _defaultQuorum) {
        DEFAULT_QUORUM = _defaultQuorum;
    }

    /// @notice Receives message from GMP(s) through GlacisRouter
    /// @param fromGmpIds IDs of the GMPs that sent this message (that reached quorum requirements)
    /// @param fromChainId Source chain (Glacis chain ID)
    /// @param fromAddress Source address on source chain
    /// @param payload Routed payload
    function receiveMessage(
        uint8[] calldata fromGmpIds,
        uint256 fromChainId,
        address fromAddress,
        bytes calldata payload
    ) external virtual;

    /// @notice The quorum of messages that the contract expects with a specific message
    function getQuorum(
        GlacisCommons.GlacisData memory,
        bytes memory
    ) public view virtual returns (uint256) {
        return DEFAULT_QUORUM;
    }
}

File 6 of 12: IGlacisRouter.sol
// SPDX-License-Identifier: Apache-2.0

pragma solidity 0.8.18;

import {GlacisCommons} from "./GlacisCommons.sol";
import {IMessageDispatcher} from "./IMessageDispatcher.sol";
import {IMessageExecutor} from "./IMessageExecutor.sol";

abstract contract IGlacisRouterEvents is
    GlacisCommons,
    IMessageDispatcher,
    IMessageExecutor
{
    event GlacisAbstractRouter__MessageIdCreated(
        bytes32 indexed messageId,
        address indexed sender,
        uint256 nonce
    );
    event GlacisRouter__ReceivedMessage(
        bytes32 indexed messageId,
        address indexed from,
        uint256 indexed fromChainId,
        address to
    );
    event GlacisRouter__MessageDispatched(
        bytes32 indexed messageId,
        address indexed from,
        uint256 indexed toChainId,
        address to,
        bytes data,
        uint8[] gmps,
        uint256[] fees,
        address refundAddress,
        bool retriable
    );
    event GlacisRouter__MessageRetried(
        bytes32 indexed messageId,
        address indexed from,
        uint256 indexed toChainId,
        address to,
        bytes data,
        uint8[] gmps,
        uint256[] fees,
        address refundAddress
    );
}

interface IGlacisRouter {
    function route(
        uint256 chainId,
        address to,
        bytes memory payload,
        uint8[] memory gmps,
        uint256[] memory fees,
        address refundAddress,
        bool retry
    ) external payable returns (bytes32);

    function routeRetry(
        uint256 chainId,
        address to,
        bytes memory payload,
        uint8[] memory gmp,
        uint256[] memory fees,
        address refundAddress,
        bytes32 messageId,
        uint256 nonce
    ) external payable returns (bytes32);

    function receiveMessage(
        uint256 fromChainId,
        bytes memory glacisPayload
    ) external;
}

File 7 of 12: IGlacisTokenClient.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.18;

import {GlacisCommons} from "./GlacisCommons.sol";
import {IGlacisAccessControlClient} from "./IGlacisAccessControlClient.sol";

/// An interface that defines the GMP modules (adapters) that the GlacisRouter interacts with.
/// Should be paired with the IGlacisClient abstract smart contract.
interface IGlacisTokenClient is IGlacisAccessControlClient {
    /// @notice Receives message from GMP(s) through GlacisRouter
    /// @param fromGmpIds ID of the GMP that sent this message (that reached quorum requirements)
    /// @param fromChainId Source chain (Glacis chain ID)
    /// @param fromAddress Source address on source chain
    /// @param payload Routed payload
    function receiveMessageWithTokens(
        uint8[] memory fromGmpIds,
        uint256 fromChainId,
        address fromAddress,
        bytes calldata payload,
        address token,
        uint256 amount
    ) external;

    /// @notice The quorum of messages that the contract expects with a specific message from the
    ///         token router
    function getQuorum(
        GlacisCommons.GlacisData memory,
        bytes memory,
        address,
        uint256
    ) external view returns (uint256);
}

File 8 of 12: IGlacisTokenMediator.sol
// SPDX-License-Identifier: Apache-2.0

pragma solidity 0.8.18;

import {IMessageDispatcher} from "./IMessageDispatcher.sol";
import {IMessageExecutor} from "./IMessageExecutor.sol";

interface IGlacisTokenMediator is IMessageDispatcher, IMessageExecutor {
    event GlacisTokenMediator__TokensBurnt(
        address from,
        address token,
        uint256 amount
    );
    event GlacisTokenMediator__TokensMinted(
        address to,
        address token,
        uint256 amount
    );

    function route(
        uint256 chainId,
        address to,
        bytes memory payload,
        uint8[] memory gmps,
        uint256[] memory fees,
        address refundAddress,
        bool retry,
        address token,
        uint256 tokenAmount
    ) external payable returns (bytes32);

    function routeRetry(
        uint256 chainId,
        address to,
        bytes memory payload,
        uint8[] memory gmp,
        uint256[] memory fees,
        address refundAddress,
        bytes32 messageId,
        uint256 nonce,
        address token,
        uint256 tokenAmount
    ) external payable returns (bytes32);
}

File 9 of 12: IMessageDispatcher.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.18;

/// An interface as described by EIP-5164. In Glacis' current implementation, messages are not dispatched with the
/// dispatchMessage function, hence its removal. The only adherence now is to the event, which the GlacisRouter will
/// use.
interface IMessageDispatcher {
    /// The MessageDispatched event must be emitted by the MessageDispatcher when an individual message is dispatched.
    event MessageDispatched(
        bytes32 indexed messageId,
        address indexed from,
        uint256 indexed toChainId,
        address to,
        bytes data
    );
}

File 10 of 12: IMessageExecutor.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.18;

interface IMessageExecutor {
    /// MessageIdExecuted must be emitted once a message or message batch has been executed.
    event MessageIdExecuted(
        uint256 indexed fromChainId,
        bytes32 indexed messageId
    );

    /// MessageExecutors must revert if a messageId has already been executed and should emit a
    /// MessageIdAlreadyExecuted custom error.
    error MessageIdAlreadyExecuted(bytes32 messageId);

    /// MessageExecutors must revert if an individual message fails and should emit a MessageFailure custom error.
    error MessageFailure(bytes32 messageId, bytes errorData);

    // This note from EIP-5164 seems repetitive as Axelar and the other chains already do this
    // MessageExecutors MUST append the ABI-packed (messageId, fromChainId, from) to the calldata for each message
    /// being executed. This allows the receiver of the message to verify the cross-chain sender and the chain that the
    /// message is coming from.
}

File 11 of 12: IXERC20.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.18;

interface IXERC20 {
    /**
     * @notice Emits when a lockbox is set
     *
     * @param _lockbox The address of the lockbox
     */

    event LockboxSet(address _lockbox);

    /**
     * @notice Emits when a limit is set
     *
     * @param _mintingLimit The updated minting limit we are setting to the bridge
     * @param _burningLimit The updated burning limit we are setting to the bridge
     * @param _bridge The address of the bridge we are setting the limit too
     */
    event BridgeLimitsSet(
        uint256 _mintingLimit,
        uint256 _burningLimit,
        address indexed _bridge
    );

    /**
     * @notice Reverts when a user with too low of a limit tries to call mint/burn
     */

    error IXERC20_NotHighEnoughLimits();

    /**
     * @notice Reverts when caller is not the factory
     */

    error IXERC20_NotFactory();

    struct Bridge {
        BridgeParameters minterParams;
        BridgeParameters burnerParams;
    }

    struct BridgeParameters {
        uint256 timestamp;
        uint256 ratePerSecond;
        uint256 maxLimit;
        uint256 currentLimit;
    }

    /**
     * @notice Sets the lockbox address
     *
     * @param _lockbox The address of the lockbox
     */

    function setLockbox(address _lockbox) external;

    /**
     * @notice Updates the limits of any bridge
     * @dev Can only be called by the owner
     * @param _mintingLimit The updated minting limit we are setting to the bridge
     * @param _burningLimit The updated burning limit we are setting to the bridge
     * @param _bridge The address of the bridge we are setting the limits too
     */
    function setLimits(
        address _bridge,
        uint256 _mintingLimit,
        uint256 _burningLimit
    ) external;

    /**
     * @notice Returns the max limit of a minter
     *
     * @param _minter The minter we are viewing the limits of
     *  @return _limit The limit the minter has
     */
    function mintingMaxLimitOf(
        address _minter
    ) external view returns (uint256 _limit);

    /**
     * @notice Returns the max limit of a bridge
     *
     * @param _bridge the bridge we are viewing the limits of
     * @return _limit The limit the bridge has
     */

    function burningMaxLimitOf(
        address _bridge
    ) external view returns (uint256 _limit);

    /**
     * @notice Returns the current limit of a minter
     *
     * @param _minter The minter we are viewing the limits of
     * @return _limit The limit the minter has
     */

    function mintingCurrentLimitOf(
        address _minter
    ) external view returns (uint256 _limit);

    /**
     * @notice Returns the current limit of a bridge
     *
     * @param _bridge the bridge we are viewing the limits of
     * @return _limit The limit the bridge has
     */

    function burningCurrentLimitOf(
        address _bridge
    ) external view returns (uint256 _limit);

    /**
     * @notice Mints tokens for a user
     * @dev Can only be called by a minter
     * @param _user The address of the user who needs tokens minted
     * @param _amount The amount of tokens being minted
     */

    function mint(address _user, uint256 _amount) external;

    /**
     * @notice Burns tokens for a user
     * @dev Can only be called by a minter
     * @param _user The address of the user who needs tokens burned
     * @param _amount The amount of tokens being burned
     */

    function burn(address _user, uint256 _amount) external;
}

interface IXERC20GlacisExtension {
    /**
     * @notice Returns a token variant for a specific chainId if it exists.
     *
     * @param chainId The chainId of the token variant.
     */
    function getTokenVariant(uint256 chainId) external view returns (address);

    /**
     * @notice Sets a token variant for a specific chainId.
     *
     * @param chainId The chainId of the token variant.
     * @param variant The address of the token variant.
     */
    function setTokenVariant(uint256 chainId, address variant) external;
}

File 12 of 12: IXERC20Lockbox.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.18;

interface IXERC20Lockbox {
    /**
     * @notice Emitted when tokens are deposited into the lockbox
     */

    event Deposit(address _sender, uint256 _amount);

    /**
     * @notice Emitted when tokens are withdrawn from the lockbox
     */

    event Withdraw(address _sender, uint256 _amount);

    /**
     * @notice Reverts when a user tries to deposit native tokens on a non-native lockbox
     */

    error IXERC20Lockbox_NotNative();

    /**
     * @notice Reverts when a user tries to deposit non-native tokens on a native lockbox
     */

    error IXERC20Lockbox_Native();

    /**
     * @notice Reverts when a user tries to withdraw and the call fails
     */

    error IXERC20Lockbox_WithdrawFailed();

    /**
     * @notice Deposit ERC20 tokens into the lockbox
     *
     * @param _amount The amount of tokens to deposit
     */

    function deposit(uint256 _amount) external;

    /**
     * @notice Deposit ERC20 tokens into the lockbox, and send the XERC20 to a user
     *
     * @param _user The user to send the XERC20 to
     * @param _amount The amount of tokens to deposit
     */

    function depositTo(address _user, uint256 _amount) external;

    /**
     * @notice Deposit the native asset into the lockbox, and send the XERC20 to a user
     *
     * @param _user The user to send the XERC20 to
     */

    function depositNativeTo(address _user) external payable;

    /**
     * @notice Withdraw ERC20 tokens from the lockbox
     *
     * @param _amount The amount of tokens to withdraw
     */

    function withdraw(uint256 _amount) external;

    /**
     * @notice Withdraw ERC20 tokens from the lockbox
     *
     * @param _user The user to withdraw to
     * @param _amount The amount of tokens to withdraw
     */

    function withdrawTo(address _user, uint256 _amount) external;
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600b81526020016a476c61636973204c61627360a81b81525060405180604001604052806006815260200165474c4143495360d01b815250816003908162000066919062000229565b50600462000075828262000229565b505050620000af336200008d620000b560201b60201c565b6200009a90600a6200040a565b620000a990620f424062000422565b620000ba565b62000452565b601290565b6001600160a01b038216620001155760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b80600260008282546200012991906200043c565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001b057607f821691505b602082108103620001d157634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200018057600081815260208120601f850160051c81016020861015620002005750805b601f850160051c820191505b8181101562000221578281556001016200020c565b505050505050565b81516001600160401b0381111562000245576200024562000185565b6200025d816200025684546200019b565b84620001d7565b602080601f8311600181146200029557600084156200027c5750858301515b600019600386901b1c1916600185901b17855562000221565b600085815260208120601f198616915b82811015620002c657888601518255948401946001909101908401620002a5565b5085821015620002e55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200034c578160001904821115620003305762000330620002f5565b808516156200033e57918102915b93841c939080029062000310565b509250929050565b600082620003655750600162000404565b81620003745750600062000404565b81600181146200038d57600281146200039857620003b8565b600191505062000404565b60ff841115620003ac57620003ac620002f5565b50506001821b62000404565b5060208310610133831016604e8410600b8410161715620003dd575081810a62000404565b620003e983836200030b565b8060001904821115620004005762000400620002f5565b0290505b92915050565b60006200041b60ff84168362000354565b9392505050565b8082028115828204841417620004045762000404620002f5565b80820180821115620004045762000404620002f5565b61085280620004626000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461012357806370a082311461013657806395d89b411461015f578063a457c2d714610167578063a9059cbb1461017a578063dd62ed3e1461018d57600080fd5b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100ef57806323b872dd14610101578063313ce56714610114575b600080fd5b6100b66101a0565b6040516100c3919061069c565b60405180910390f35b6100df6100da366004610706565b610232565b60405190151581526020016100c3565b6002545b6040519081526020016100c3565b6100df61010f366004610730565b61024c565b604051601281526020016100c3565b6100df610131366004610706565b610270565b6100f361014436600461076c565b6001600160a01b031660009081526020819052604090205490565b6100b6610292565b6100df610175366004610706565b6102a1565b6100df610188366004610706565b610321565b6100f361019b36600461078e565b61032f565b6060600380546101af906107c1565b80601f01602080910402602001604051908101604052809291908181526020018280546101db906107c1565b80156102285780601f106101fd57610100808354040283529160200191610228565b820191906000526020600020905b81548152906001019060200180831161020b57829003601f168201915b5050505050905090565b60003361024081858561035a565b60019150505b92915050565b60003361025a85828561047e565b6102658585856104f8565b506001949350505050565b600033610240818585610283838361032f565b61028d91906107fb565b61035a565b6060600480546101af906107c1565b600033816102af828661032f565b9050838110156103145760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b610265828686840361035a565b6000336102408185856104f8565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166103bc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161030b565b6001600160a01b03821661041d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161030b565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061048a848461032f565b905060001981146104f257818110156104e55760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161030b565b6104f2848484840361035a565b50505050565b6001600160a01b03831661055c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161030b565b6001600160a01b0382166105be5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161030b565b6001600160a01b038316600090815260208190526040902054818110156106365760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161030b565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36104f2565b600060208083528351808285015260005b818110156106c9578581018301518582016040015282016106ad565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461070157600080fd5b919050565b6000806040838503121561071957600080fd5b610722836106ea565b946020939093013593505050565b60008060006060848603121561074557600080fd5b61074e846106ea565b925061075c602085016106ea565b9150604084013590509250925092565b60006020828403121561077e57600080fd5b610787826106ea565b9392505050565b600080604083850312156107a157600080fd5b6107aa836106ea565b91506107b8602084016106ea565b90509250929050565b600181811c908216806107d557607f821691505b6020821081036107f557634e487b7160e01b600052602260045260246000fd5b50919050565b8082018082111561024657634e487b7160e01b600052601160045260246000fdfea2646970667358221220b09ea8a21907e25777e199a645d1d93aff18e0ee89332fb02b9d961e15134c3e64736f6c63430008120033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461012357806370a082311461013657806395d89b411461015f578063a457c2d714610167578063a9059cbb1461017a578063dd62ed3e1461018d57600080fd5b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100ef57806323b872dd14610101578063313ce56714610114575b600080fd5b6100b66101a0565b6040516100c3919061069c565b60405180910390f35b6100df6100da366004610706565b610232565b60405190151581526020016100c3565b6002545b6040519081526020016100c3565b6100df61010f366004610730565b61024c565b604051601281526020016100c3565b6100df610131366004610706565b610270565b6100f361014436600461076c565b6001600160a01b031660009081526020819052604090205490565b6100b6610292565b6100df610175366004610706565b6102a1565b6100df610188366004610706565b610321565b6100f361019b36600461078e565b61032f565b6060600380546101af906107c1565b80601f01602080910402602001604051908101604052809291908181526020018280546101db906107c1565b80156102285780601f106101fd57610100808354040283529160200191610228565b820191906000526020600020905b81548152906001019060200180831161020b57829003601f168201915b5050505050905090565b60003361024081858561035a565b60019150505b92915050565b60003361025a85828561047e565b6102658585856104f8565b506001949350505050565b600033610240818585610283838361032f565b61028d91906107fb565b61035a565b6060600480546101af906107c1565b600033816102af828661032f565b9050838110156103145760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b610265828686840361035a565b6000336102408185856104f8565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166103bc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161030b565b6001600160a01b03821661041d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161030b565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061048a848461032f565b905060001981146104f257818110156104e55760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161030b565b6104f2848484840361035a565b50505050565b6001600160a01b03831661055c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161030b565b6001600160a01b0382166105be5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161030b565b6001600160a01b038316600090815260208190526040902054818110156106365760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161030b565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36104f2565b600060208083528351808285015260005b818110156106c9578581018301518582016040015282016106ad565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461070157600080fd5b919050565b6000806040838503121561071957600080fd5b610722836106ea565b946020939093013593505050565b60008060006060848603121561074557600080fd5b61074e846106ea565b925061075c602085016106ea565b9150604084013590509250925092565b60006020828403121561077e57600080fd5b610787826106ea565b9392505050565b600080604083850312156107a157600080fd5b6107aa836106ea565b91506107b8602084016106ea565b90509250929050565b600181811c908216806107d557607f821691505b6020821081036107f557634e487b7160e01b600052602260045260246000fd5b50919050565b8082018082111561024657634e487b7160e01b600052601160045260246000fdfea2646970667358221220b09ea8a21907e25777e199a645d1d93aff18e0ee89332fb02b9d961e15134c3e64736f6c63430008120033

Deployed Bytecode Sourcemap

12541:148:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4984:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6718:201;;;;;;:::i;:::-;;:::i;:::-;;;1169:14:12;;1162:22;1144:41;;1132:2;1117:18;6718:201:1;1004:187:12;5477:108:1;5565:12;;5477:108;;;1342:25:12;;;1330:2;1315:18;5477:108:1;1196:177:12;6927:315:1;;;;;;:::i;:::-;;:::i;5319:93::-;;;5402:2;1853:36:12;;1841:2;1826:18;5319:93:1;1711:184:12;7256:238:1;;;;;;:::i;:::-;;:::i;5648:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;5749:18:1;5722:7;5749:18;;;;;;;;;;;;5648:127;5203:104;;;:::i;7508:436::-;;;;;;:::i;:::-;;:::i;5981:203::-;;;;;;:::i;:::-;;:::i;6247:151::-;;;;;;:::i;:::-;;:::i;4984:100::-;5038:13;5071:5;5064:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4984:100;:::o;6718:201::-;6801:4;954:10;6857:32;954:10;6873:7;6882:6;6857:8;:32::i;:::-;6907:4;6900:11;;;6718:201;;;;;:::o;6927:315::-;7068:4;954:10;7136:38;7152:4;954:10;7167:6;7136:15;:38::i;:::-;7185:27;7195:4;7201:2;7205:6;7185:9;:27::i;:::-;-1:-1:-1;7230:4:1;;6927:315;-1:-1:-1;;;;6927:315:1:o;7256:238::-;7344:4;954:10;7400:64;954:10;7416:7;7453:10;7425:25;954:10;7416:7;7425:9;:25::i;:::-;:38;;;;:::i;:::-;7400:8;:64::i;5203:104::-;5259:13;5292:7;5285:14;;;;;:::i;7508:436::-;7601:4;954:10;7601:4;7684:25;954:10;7701:7;7684:9;:25::i;:::-;7657:52;;7748:15;7728:16;:35;;7720:85;;;;-1:-1:-1;;;7720:85:1;;3170:2:12;7720:85:1;;;3152:21:12;3209:2;3189:18;;;3182:30;3248:34;3228:18;;;3221:62;-1:-1:-1;;;3299:18:12;;;3292:35;3344:19;;7720:85:1;;;;;;;;;7841:60;7850:5;7857:7;7885:15;7866:16;:34;7841:8;:60::i;5981:203::-;6060:4;954:10;6116:28;954:10;6133:2;6137:6;6116:9;:28::i;6247:151::-;-1:-1:-1;;;;;6363:18:1;;;6336:7;6363:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;6247:151::o;11113:380::-;-1:-1:-1;;;;;11249:19:1;;11241:68;;;;-1:-1:-1;;;11241:68:1;;3576:2:12;11241:68:1;;;3558:21:12;3615:2;3595:18;;;3588:30;3654:34;3634:18;;;3627:62;-1:-1:-1;;;3705:18:12;;;3698:34;3749:19;;11241:68:1;3374:400:12;11241:68:1;-1:-1:-1;;;;;11328:21:1;;11320:68;;;;-1:-1:-1;;;11320:68:1;;3981:2:12;11320:68:1;;;3963:21:12;4020:2;4000:18;;;3993:30;4059:34;4039:18;;;4032:62;-1:-1:-1;;;4110:18:12;;;4103:32;4152:19;;11320:68:1;3779:398:12;11320:68:1;-1:-1:-1;;;;;11401:18:1;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;11453:32;;1342:25:12;;;11453:32:1;;1315:18:12;11453:32:1;;;;;;;11113:380;;;:::o;11784:453::-;11919:24;11946:25;11956:5;11963:7;11946:9;:25::i;:::-;11919:52;;-1:-1:-1;;11986:16:1;:37;11982:248;;12068:6;12048:16;:26;;12040:68;;;;-1:-1:-1;;;12040:68:1;;4384:2:12;12040:68:1;;;4366:21:12;4423:2;4403:18;;;4396:30;4462:31;4442:18;;;4435:59;4511:18;;12040:68:1;4182:353:12;12040:68:1;12152:51;12161:5;12168:7;12196:6;12177:16;:25;12152:8;:51::i;:::-;11908:329;11784:453;;;:::o;8414:848::-;-1:-1:-1;;;;;8545:18:1;;8537:68;;;;-1:-1:-1;;;8537:68:1;;4742:2:12;8537:68:1;;;4724:21:12;4781:2;4761:18;;;4754:30;4820:34;4800:18;;;4793:62;-1:-1:-1;;;4871:18:12;;;4864:35;4916:19;;8537:68:1;4540:401:12;8537:68:1;-1:-1:-1;;;;;8624:16:1;;8616:64;;;;-1:-1:-1;;;8616:64:1;;5148:2:12;8616:64:1;;;5130:21:12;5187:2;5167:18;;;5160:30;5226:34;5206:18;;;5199:62;-1:-1:-1;;;5277:18:12;;;5270:33;5320:19;;8616:64:1;4946:399:12;8616:64:1;-1:-1:-1;;;;;8774:15:1;;8752:19;8774:15;;;;;;;;;;;8808:21;;;;8800:72;;;;-1:-1:-1;;;8800:72:1;;5552:2:12;8800:72:1;;;5534:21:12;5591:2;5571:18;;;5564:30;5630:34;5610:18;;;5603:62;-1:-1:-1;;;5681:18:12;;;5674:36;5727:19;;8800:72:1;5350:402:12;8800:72:1;-1:-1:-1;;;;;8908:15:1;;;:9;:15;;;;;;;;;;;8926:20;;;8908:38;;9126:13;;;;;;;;;;:23;;;;;;9178:26;;1342:25:12;;;9126:13:1;;9178:26;;1315:18:12;9178:26:1;;;;;;;9217:37;12245:125;14:548:12;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:173::-;635:20;;-1:-1:-1;;;;;684:31:12;;674:42;;664:70;;730:1;727;720:12;664:70;567:173;;;:::o;745:254::-;813:6;821;874:2;862:9;853:7;849:23;845:32;842:52;;;890:1;887;880:12;842:52;913:29;932:9;913:29;:::i;:::-;903:39;989:2;974:18;;;;961:32;;-1:-1:-1;;;745:254:12:o;1378:328::-;1455:6;1463;1471;1524:2;1512:9;1503:7;1499:23;1495:32;1492:52;;;1540:1;1537;1530:12;1492:52;1563:29;1582:9;1563:29;:::i;:::-;1553:39;;1611:38;1645:2;1634:9;1630:18;1611:38;:::i;:::-;1601:48;;1696:2;1685:9;1681:18;1668:32;1658:42;;1378:328;;;;;:::o;1900:186::-;1959:6;2012:2;2000:9;1991:7;1987:23;1983:32;1980:52;;;2028:1;2025;2018:12;1980:52;2051:29;2070:9;2051:29;:::i;:::-;2041:39;1900:186;-1:-1:-1;;;1900:186:12:o;2091:260::-;2159:6;2167;2220:2;2208:9;2199:7;2195:23;2191:32;2188:52;;;2236:1;2233;2226:12;2188:52;2259:29;2278:9;2259:29;:::i;:::-;2249:39;;2307:38;2341:2;2330:9;2326:18;2307:38;:::i;:::-;2297:48;;2091:260;;;;;:::o;2356:380::-;2435:1;2431:12;;;;2478;;;2499:61;;2553:4;2545:6;2541:17;2531:27;;2499:61;2606:2;2598:6;2595:14;2575:18;2572:38;2569:161;;2652:10;2647:3;2643:20;2640:1;2633:31;2687:4;2684:1;2677:15;2715:4;2712:1;2705:15;2569:161;;2356:380;;;:::o;2741:222::-;2806:9;;;2827:10;;;2824:133;;;2879:10;2874:3;2870:20;2867:1;2860:31;2914:4;2911:1;2904:15;2942:4;2939:1;2932:15

Swarm Source

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

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