Token Bitcoin

Overview ERC20

Price
$23,181.00 @ 1,141.358936 AVAX (-1.16%)
Fully Diluted Market Cap
Total Supply:
5,977.24963 BTC.b

Holders:
3,886 addresses
Filtered by Token Holder (GMX: Vault)

Balance
1,213.61524725 BTC.b

Value
$28,132,815.05 ( ~1,385,170.6081 AVAX) [20.3039%]
0x9ab2de34a33fb459b538c43f251eb825645e8595
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

Avalanche is the fastest smart contracts platform in the blockchain industry, as measured by time-to-finality.


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

Contract Source Code Verified (Exact Match)

Contract Name:
BridgeToken

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, BSD-3-Clause license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-19
*/

/**
 *Submitted for verification at testnet.snowtrace.io on 2022-05-04
*/

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/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/utils/Context.sol

pragma solidity ^0.8.0;

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

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


pragma solidity ^0.8.0;




/**
 * @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 defaut 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");
        _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");
        _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");
        _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:
     *
     * - `to` 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");
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;

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

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

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

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be 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 { }
}

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

pragma solidity ^0.8.0;

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 currentAllowance = allowance(account, _msgSender());
        require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
        _approve(account, _msgSender(), currentAllowance - amount);
        _burn(account, amount);
    }
}

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

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File: contracts/Roles.sol

pragma solidity ^0.8.0;

library Roles {
    struct Role {
        mapping(address => bool) bearer;
    }

    /**
     * @dev Give an account access to this role.
     */
    function add(Role storage role, address account) internal {
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    /**
     * @dev Remove an account's access to this role.
     */
    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        role.bearer[account] = false;
    }

    /**
     * @dev Check if an account has this role.
     * @return bool
     */
    function has(Role storage role, address account)
        internal
        view
        returns (bool)
    {
        require(account != address(0), "Roles: account is the zero address");
        return role.bearer[account];
    }
}


pragma solidity 0.8.11;


contract BridgeToken is ERC20Burnable {
    using Roles for Roles.Role;
    using Address for address;

    Roles.Role private bridgeRoles;

    string private constant TOKEN_NAME = "Bitcoin";
    string private constant TOKEN_SYMBOL = "BTC.b";
    uint8 private constant TOKEN_DECIMALS = 8;

    mapping(uint256 => bool) public chainIds;

    event Mint(
        address to,
        uint256 amount,
        address feeAddress,
        uint256 feeAmount,
        bytes32 originTxId,
        uint256 originOutputIndex
    );
    event Unwrap(uint256 amount, uint256 chainId);
    event AddSupportedChainId(uint256 chainId);
    event MigrateBridgeRole(address newBridgeRoleAddress);

    constructor() ERC20(TOKEN_NAME, TOKEN_SYMBOL) {
        bridgeRoles.add(msg.sender);
        chainIds[0] = true;
    }

    function decimals() public pure virtual override returns (uint8) {
        return TOKEN_DECIMALS;
    }

    /**
     * @dev Mint function used by bridge. Optional FeeAddress and FeeAmount parameters used to mint small percentage of transfered assets directly to bridge.
     * @param to Address to mint funds to.
     * @param amount Amount of funds to mint.
     * @param feeAddress Address to mint bridge fees to.
     * @param feeAmount Amount to mint as bridge fees.
     * @param originTxId Transaction ID from external network that triggered this minting.
     * @param originOutputIndex Output index of the originTxId that triggered this minting.
     */
    function mint(
        address to,
        uint256 amount,
        address feeAddress,
        uint256 feeAmount,
        bytes32 originTxId,
        uint256 originOutputIndex
    ) external {
        require(bridgeRoles.has(msg.sender), "Unauthorized.");
        _mint(to, amount);
        if (feeAmount > 0) {
            _mint(feeAddress, feeAmount);
        }
        emit Mint(
            to,
            amount,
            feeAddress,
            feeAmount,
            originTxId,
            originOutputIndex
        );
    }

    /**
     * @dev Add new chainId to list of supported Ids.
     * @param chainId ChainId to add.
     */
    function addSupportedChainId(uint256 chainId) external {
        require(bridgeRoles.has(msg.sender), "Unauthorized.");

        // Check that the chain ID is not the chain this contract is deployed on.
        uint256 currentChainId;
        assembly {
            currentChainId := chainid()
        }
        require(chainId != currentChainId, "Cannot add current chain ID.");

        // Already supported, no-op.
        if (chainIds[chainId]) {
            return;
        }

        chainIds[chainId] = true;
        emit AddSupportedChainId(chainId);
    }

    /**
     * @dev Burns assets and signals bridge to migrate funds to the same address on the provided chainId.
     * @param amount Amount of asset to unwrap.
     * @param chainId ChainId to unwrap or migrate funds to. Only used for multi-network bridge deployment.
     *                Zero by default for bridge deployment with only 2 networks.
     */
    function unwrap(uint256 amount, uint256 chainId) external {
        require(!Address.isContract(msg.sender),"Contract calls not supported.");
        require(chainIds[chainId], "Chain ID not supported.");
        _burn(msg.sender, amount);
        emit Unwrap(amount, chainId);
    }

    /**
     * @dev Provide Bridge Role (Admin Role) to new address.
     * @param newBridgeRoleAddress New bridge role address.
     */
    function migrateBridgeRole(address newBridgeRoleAddress) external {
        require(bridgeRoles.has(msg.sender), "Unauthorized.");
        bridgeRoles.remove(msg.sender);
        bridgeRoles.add(newBridgeRoleAddress);
        emit MigrateBridgeRole(newBridgeRoleAddress);
    }

    function transfer(address to, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        require(
            to != address(this),
            "Transfer to this smart contract is not supported."
        );
        return super.transfer(to, amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"AddSupportedChainId","type":"event"},{"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":"newBridgeRoleAddress","type":"address"}],"name":"MigrateBridgeRole","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"feeAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"originTxId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"originOutputIndex","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"Unwrap","type":"event"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"addSupportedChainId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"chainIds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newBridgeRoleAddress","type":"address"}],"name":"migrateBridgeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"feeAddress","type":"address"},{"internalType":"uint256","name":"feeAmount","type":"uint256"},{"internalType":"bytes32","name":"originTxId","type":"bytes32"},{"internalType":"uint256","name":"originOutputIndex","type":"uint256"}],"name":"mint","outputs":[],"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":"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":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"unwrap","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600781526020017f426974636f696e000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4254432e620000000000000000000000000000000000000000000000000000008152508160039080519060200190620000969291906200027d565b508060049080519060200190620000af9291906200027d565b505050620000cd336005620000ff60201b62000d491790919060201c565b60016006600080815260200190815260200160002060006101000a81548160ff021916908315150217905550620004ad565b620001118282620001b260201b60201c565b1562000154576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200014b906200038e565b60405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000226576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200021d9062000426565b60405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8280546200028b9062000477565b90600052602060002090601f016020900481019282620002af5760008555620002fb565b82601f10620002ca57805160ff1916838001178555620002fb565b82800160010185558215620002fb579182015b82811115620002fa578251825591602001919060010190620002dd565b5b5090506200030a91906200030e565b5090565b5b80821115620003295760008160009055506001016200030f565b5090565b600082825260208201905092915050565b7f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500600082015250565b600062000376601f836200032d565b915062000383826200033e565b602082019050919050565b60006020820190508181036000830152620003a98162000367565b9050919050565b7f526f6c65733a206163636f756e7420697320746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006200040e6022836200032d565b91506200041b82620003b0565b604082019050919050565b600060208201905081810360008301526200044181620003ff565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200049057607f821691505b60208210811415620004a757620004a662000448565b5b50919050565b61273080620004bd6000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c806366de3b36116100a257806395d89b411161007157806395d89b41146102f1578063a457c2d71461030f578063a888d9141461033f578063a9059cbb1461035b578063dd62ed3e1461038b57610116565b806366de3b361461026d5780636e2866711461028957806370a08231146102a557806379cc6790146102d557610116565b806323b872dd116100e957806323b872dd146101b7578063313ce567146101e7578063395093511461020557806342966c68146102355780635d9898d31461025157610116565b806306fdde031461011b578063095ea7b31461013957806318160ddd1461016957806321d9309014610187575b600080fd5b6101236103bb565b60405161013091906117a9565b60405180910390f35b610153600480360381019061014e9190611864565b61044d565b60405161016091906118bf565b60405180910390f35b61017161046b565b60405161017e91906118e9565b60405180910390f35b6101a1600480360381019061019c9190611904565b610475565b6040516101ae91906118bf565b60405180910390f35b6101d160048036038101906101cc9190611931565b610495565b6040516101de91906118bf565b60405180910390f35b6101ef610596565b6040516101fc91906119a0565b60405180910390f35b61021f600480360381019061021a9190611864565b61059f565b60405161022c91906118bf565b60405180910390f35b61024f600480360381019061024a9190611904565b61064b565b005b61026b600480360381019061026691906119bb565b61065f565b005b61028760048036038101906102829190611904565b610714565b005b6102a3600480360381019061029e91906119e8565b610843565b005b6102bf60048036038101906102ba91906119bb565b610933565b6040516102cc91906118e9565b60405180910390f35b6102ef60048036038101906102ea9190611864565b61097b565b005b6102f96109ff565b60405161030691906117a9565b60405180910390f35b61032960048036038101906103249190611864565b610a91565b60405161033691906118bf565b60405180910390f35b61035960048036038101906103549190611a5e565b610b85565b005b61037560048036038101906103709190611864565b610c3f565b60405161038291906118bf565b60405180910390f35b6103a560048036038101906103a09190611aeb565b610cc2565b6040516103b291906118e9565b60405180910390f35b6060600380546103ca90611b5a565b80601f01602080910402602001604051908101604052809291908181526020018280546103f690611b5a565b80156104435780601f1061041857610100808354040283529160200191610443565b820191906000526020600020905b81548152906001019060200180831161042657829003601f168201915b5050505050905090565b600061046161045a610df1565b8484610df9565b6001905092915050565b6000600254905090565b60066020528060005260406000206000915054906101000a900460ff1681565b60006104a2848484610fc4565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006104ed610df1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561056d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056490611bfe565b60405180910390fd5b61058a85610579610df1565b85846105859190611c4d565b610df9565b60019150509392505050565b60006008905090565b60006106416105ac610df1565b8484600160006105ba610df1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461063c9190611c81565b610df9565b6001905092915050565b61065c610656610df1565b82611243565b50565b61067333600561141790919063ffffffff16565b6106b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a990611d23565b60405180910390fd5b6106c63360056114df90919063ffffffff16565b6106da816005610d4990919063ffffffff16565b7f871b00a4e20f8436702d0174eb87d84d7cd1dd5c34d4bb1b4e75438b3398d512816040516107099190611d52565b60405180910390a150565b61072833600561141790919063ffffffff16565b610767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075e90611d23565b60405180910390fd5b6000469050808214156107af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a690611db9565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900460ff16156107db5750610840565b60016006600084815260200190815260200160002060006101000a81548160ff0219169083151502179055507f677e2d9a4ed9201aa86725fef875137fc53876e6b68036b974404762682bd1228260405161083691906118e9565b60405180910390a1505b50565b61084c33611586565b1561088c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088390611e25565b60405180910390fd5b6006600082815260200190815260200160002060009054906101000a900460ff166108ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e390611e91565b60405180910390fd5b6108f63383611243565b7f37a06799a3500428a773d00284aa706101f5ad94dae9ec37e1c3773aa54c33048282604051610927929190611eb1565b60405180910390a15050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600061098e83610989610df1565b610cc2565b9050818110156109d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ca90611f4c565b60405180910390fd5b6109f0836109df610df1565b84846109eb9190611c4d565b610df9565b6109fa8383611243565b505050565b606060048054610a0e90611b5a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3a90611b5a565b8015610a875780601f10610a5c57610100808354040283529160200191610a87565b820191906000526020600020905b815481529060010190602001808311610a6a57829003601f168201915b5050505050905090565b60008060016000610aa0610df1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5490611fde565b60405180910390fd5b610b7a610b68610df1565b858584610b759190611c4d565b610df9565b600191505092915050565b610b9933600561141790919063ffffffff16565b610bd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcf90611d23565b60405180910390fd5b610be28686611599565b6000831115610bf657610bf58484611599565b5b7fc5532043e6f3d77e1c320ff59bd4157ca9075ef59f6b55ceab6c3f7d2f78c9ca868686868686604051610c2f9695949392919061200d565b60405180910390a1505050505050565b60003073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca7906120e0565b60405180910390fd5b610cba83836116ed565b905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610d538282611417565b15610d93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8a9061214c565b60405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e60906121de565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed090612270565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610fb791906118e9565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102b90612302565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109b90612394565b60405180910390fd5b6110af83838361170b565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112c90612426565b60405180910390fd5b81816111419190611c4d565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111d19190611c81565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161123591906118e9565b60405180910390a350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112aa906124b8565b60405180910390fd5b6112bf8260008361170b565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133c9061254a565b60405180910390fd5b81816113519190611c4d565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546113a59190611c4d565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161140a91906118e9565b60405180910390a3505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611488576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147f906125dc565b60405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114e98282611417565b611528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151f9061266e565b60405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611609576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611600906126da565b60405180910390fd5b6116156000838361170b565b80600260008282546116279190611c81565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461167c9190611c81565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116e191906118e9565b60405180910390a35050565b60006117016116fa610df1565b8484610fc4565b6001905092915050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561174a57808201518184015260208101905061172f565b83811115611759576000848401525b50505050565b6000601f19601f8301169050919050565b600061177b82611710565b611785818561171b565b935061179581856020860161172c565b61179e8161175f565b840191505092915050565b600060208201905081810360008301526117c38184611770565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117fb826117d0565b9050919050565b61180b816117f0565b811461181657600080fd5b50565b60008135905061182881611802565b92915050565b6000819050919050565b6118418161182e565b811461184c57600080fd5b50565b60008135905061185e81611838565b92915050565b6000806040838503121561187b5761187a6117cb565b5b600061188985828601611819565b925050602061189a8582860161184f565b9150509250929050565b60008115159050919050565b6118b9816118a4565b82525050565b60006020820190506118d460008301846118b0565b92915050565b6118e38161182e565b82525050565b60006020820190506118fe60008301846118da565b92915050565b60006020828403121561191a576119196117cb565b5b60006119288482850161184f565b91505092915050565b60008060006060848603121561194a576119496117cb565b5b600061195886828701611819565b935050602061196986828701611819565b925050604061197a8682870161184f565b9150509250925092565b600060ff82169050919050565b61199a81611984565b82525050565b60006020820190506119b56000830184611991565b92915050565b6000602082840312156119d1576119d06117cb565b5b60006119df84828501611819565b91505092915050565b600080604083850312156119ff576119fe6117cb565b5b6000611a0d8582860161184f565b9250506020611a1e8582860161184f565b9150509250929050565b6000819050919050565b611a3b81611a28565b8114611a4657600080fd5b50565b600081359050611a5881611a32565b92915050565b60008060008060008060c08789031215611a7b57611a7a6117cb565b5b6000611a8989828a01611819565b9650506020611a9a89828a0161184f565b9550506040611aab89828a01611819565b9450506060611abc89828a0161184f565b9350506080611acd89828a01611a49565b92505060a0611ade89828a0161184f565b9150509295509295509295565b60008060408385031215611b0257611b016117cb565b5b6000611b1085828601611819565b9250506020611b2185828601611819565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611b7257607f821691505b60208210811415611b8657611b85611b2b565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000611be860288361171b565b9150611bf382611b8c565b604082019050919050565b60006020820190508181036000830152611c1781611bdb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611c588261182e565b9150611c638361182e565b925082821015611c7657611c75611c1e565b5b828203905092915050565b6000611c8c8261182e565b9150611c978361182e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611ccc57611ccb611c1e565b5b828201905092915050565b7f556e617574686f72697a65642e00000000000000000000000000000000000000600082015250565b6000611d0d600d8361171b565b9150611d1882611cd7565b602082019050919050565b60006020820190508181036000830152611d3c81611d00565b9050919050565b611d4c816117f0565b82525050565b6000602082019050611d676000830184611d43565b92915050565b7f43616e6e6f74206164642063757272656e7420636861696e2049442e00000000600082015250565b6000611da3601c8361171b565b9150611dae82611d6d565b602082019050919050565b60006020820190508181036000830152611dd281611d96565b9050919050565b7f436f6e74726163742063616c6c73206e6f7420737570706f727465642e000000600082015250565b6000611e0f601d8361171b565b9150611e1a82611dd9565b602082019050919050565b60006020820190508181036000830152611e3e81611e02565b9050919050565b7f436861696e204944206e6f7420737570706f727465642e000000000000000000600082015250565b6000611e7b60178361171b565b9150611e8682611e45565b602082019050919050565b60006020820190508181036000830152611eaa81611e6e565b9050919050565b6000604082019050611ec660008301856118da565b611ed360208301846118da565b9392505050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000611f3660248361171b565b9150611f4182611eda565b604082019050919050565b60006020820190508181036000830152611f6581611f29565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000611fc860258361171b565b9150611fd382611f6c565b604082019050919050565b60006020820190508181036000830152611ff781611fbb565b9050919050565b61200781611a28565b82525050565b600060c0820190506120226000830189611d43565b61202f60208301886118da565b61203c6040830187611d43565b61204960608301866118da565b6120566080830185611ffe565b61206360a08301846118da565b979650505050505050565b7f5472616e7366657220746f207468697320736d61727420636f6e74726163742060008201527f6973206e6f7420737570706f727465642e000000000000000000000000000000602082015250565b60006120ca60318361171b565b91506120d58261206e565b604082019050919050565b600060208201905081810360008301526120f9816120bd565b9050919050565b7f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500600082015250565b6000612136601f8361171b565b915061214182612100565b602082019050919050565b6000602082019050818103600083015261216581612129565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006121c860248361171b565b91506121d38261216c565b604082019050919050565b600060208201905081810360008301526121f7816121bb565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061225a60228361171b565b9150612265826121fe565b604082019050919050565b600060208201905081810360008301526122898161224d565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006122ec60258361171b565b91506122f782612290565b604082019050919050565b6000602082019050818103600083015261231b816122df565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061237e60238361171b565b915061238982612322565b604082019050919050565b600060208201905081810360008301526123ad81612371565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061241060268361171b565b915061241b826123b4565b604082019050919050565b6000602082019050818103600083015261243f81612403565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006124a260218361171b565b91506124ad82612446565b604082019050919050565b600060208201905081810360008301526124d181612495565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061253460228361171b565b915061253f826124d8565b604082019050919050565b6000602082019050818103600083015261256381612527565b9050919050565b7f526f6c65733a206163636f756e7420697320746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006125c660228361171b565b91506125d18261256a565b604082019050919050565b600060208201905081810360008301526125f5816125b9565b9050919050565b7f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b600061265860218361171b565b9150612663826125fc565b604082019050919050565b600060208201905081810360008301526126878161264b565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006126c4601f8361171b565b91506126cf8261268e565b602082019050919050565b600060208201905081810360008301526126f3816126b7565b905091905056fea2646970667358221220a443474ef6b8087fc4d7c33593a460cc94bc729beabddf018bd5137a8aeaac4d64736f6c634300080b0033

Deployed ByteCode Sourcemap

25652:4189:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6599:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8766:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7719:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25959:40;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9417:422;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26492:105;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10248:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15853:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29241:282;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27849:581;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28804:288;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7890:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16263:332;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6818:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10966:377;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27172:557;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29531:307;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8468:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6599:100;6653:13;6686:5;6679:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6599:100;:::o;8766:169::-;8849:4;8866:39;8875:12;:10;:12::i;:::-;8889:7;8898:6;8866:8;:39::i;:::-;8923:4;8916:11;;8766:169;;;;:::o;7719:108::-;7780:7;7807:12;;7800:19;;7719:108;:::o;25959:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;9417:422::-;9523:4;9540:36;9550:6;9558:9;9569:6;9540:9;:36::i;:::-;9589:24;9616:11;:19;9628:6;9616:19;;;;;;;;;;;;;;;:33;9636:12;:10;:12::i;:::-;9616:33;;;;;;;;;;;;;;;;9589:60;;9688:6;9668:16;:26;;9660:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;9750:57;9759:6;9767:12;:10;:12::i;:::-;9800:6;9781:16;:25;;;;:::i;:::-;9750:8;:57::i;:::-;9827:4;9820:11;;;9417:422;;;;;:::o;26492:105::-;26550:5;25949:1;26568:21;;26492:105;:::o;10248:215::-;10336:4;10353:80;10362:12;:10;:12::i;:::-;10376:7;10422:10;10385:11;:25;10397:12;:10;:12::i;:::-;10385:25;;;;;;;;;;;;;;;:34;10411:7;10385:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;10353:8;:80::i;:::-;10451:4;10444:11;;10248:215;;;;:::o;15853:91::-;15909:27;15915:12;:10;:12::i;:::-;15929:6;15909:5;:27::i;:::-;15853:91;:::o;29241:282::-;29326:27;29342:10;29326:11;:15;;:27;;;;:::i;:::-;29318:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;29382:30;29401:10;29382:11;:18;;:30;;;;:::i;:::-;29423:37;29439:20;29423:11;:15;;:37;;;;:::i;:::-;29476:39;29494:20;29476:39;;;;;;:::i;:::-;;;;;;;;29241:282;:::o;27849:581::-;27923:27;27939:10;27923:11;:15;;:27;;;;:::i;:::-;27915:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;28064:22;28139:9;28121:27;;28188:14;28177:7;:25;;28169:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;28290:8;:17;28299:7;28290:17;;;;;;;;;;;;;;;;;;;;;28286:56;;;28324:7;;;28286:56;28374:4;28354:8;:17;28363:7;28354:17;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;28394:28;28414:7;28394:28;;;;;;:::i;:::-;;;;;;;;27904:526;27849:581;;:::o;28804:288::-;28882:30;28901:10;28882:18;:30::i;:::-;28881:31;28873:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;28964:8;:17;28973:7;28964:17;;;;;;;;;;;;;;;;;;;;;28956:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;29020:25;29026:10;29038:6;29020:5;:25::i;:::-;29061:23;29068:6;29076:7;29061:23;;;;;;;:::i;:::-;;;;;;;;28804:288;;:::o;7890:127::-;7964:7;7991:9;:18;8001:7;7991:18;;;;;;;;;;;;;;;;7984:25;;7890:127;;;:::o;16263:332::-;16340:24;16367:32;16377:7;16386:12;:10;:12::i;:::-;16367:9;:32::i;:::-;16340:59;;16438:6;16418:16;:26;;16410:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;16496:58;16505:7;16514:12;:10;:12::i;:::-;16547:6;16528:16;:25;;;;:::i;:::-;16496:8;:58::i;:::-;16565:22;16571:7;16580:6;16565:5;:22::i;:::-;16329:266;16263:332;;:::o;6818:104::-;6874:13;6907:7;6900:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6818:104;:::o;10966:377::-;11059:4;11076:24;11103:11;:25;11115:12;:10;:12::i;:::-;11103:25;;;;;;;;;;;;;;;:34;11129:7;11103:34;;;;;;;;;;;;;;;;11076:61;;11176:15;11156:16;:35;;11148:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;11244:67;11253:12;:10;:12::i;:::-;11267:7;11295:15;11276:16;:34;;;;:::i;:::-;11244:8;:67::i;:::-;11331:4;11324:11;;;10966:377;;;;:::o;27172:557::-;27389:27;27405:10;27389:11;:15;;:27;;;;:::i;:::-;27381:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;27445:17;27451:2;27455:6;27445:5;:17::i;:::-;27489:1;27477:9;:13;27473:74;;;27507:28;27513:10;27525:9;27507:5;:28::i;:::-;27473:74;27562:159;27581:2;27598:6;27619:10;27644:9;27668:10;27693:17;27562:159;;;;;;;;;;;:::i;:::-;;;;;;;;27172:557;;;;;;:::o;29531:307::-;29646:4;29704;29690:19;;:2;:19;;;;29668:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;29804:26;29819:2;29823:6;29804:14;:26::i;:::-;29797:33;;29531:307;;;;:::o;8468:151::-;8557:7;8584:11;:18;8596:5;8584:18;;;;;;;;;;;;;;;:27;8603:7;8584:27;;;;;;;;;;;;;;;;8577:34;;8468:151;;;;:::o;24843:178::-;24921:18;24925:4;24931:7;24921:3;:18::i;:::-;24920:19;24912:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;25009:4;24986;:11;;:20;24998:7;24986:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;24843:178;;:::o;4188:98::-;4241:7;4268:10;4261:17;;4188:98;:::o;14322:346::-;14441:1;14424:19;;:5;:19;;;;14416:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14522:1;14503:21;;:7;:21;;;;14495:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14606:6;14576:11;:18;14588:5;14576:18;;;;;;;;;;;;;;;:27;14595:7;14576:27;;;;;;;;;;;;;;;:36;;;;14644:7;14628:32;;14637:5;14628:32;;;14653:6;14628:32;;;;;;:::i;:::-;;;;;;;;14322:346;;;:::o;11833:604::-;11957:1;11939:20;;:6;:20;;;;11931:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;12041:1;12020:23;;:9;:23;;;;12012:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;12096:47;12117:6;12125:9;12136:6;12096:20;:47::i;:::-;12156:21;12180:9;:17;12190:6;12180:17;;;;;;;;;;;;;;;;12156:41;;12233:6;12216:13;:23;;12208:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;12329:6;12313:13;:22;;;;:::i;:::-;12293:9;:17;12303:6;12293:17;;;;;;;;;;;;;;;:42;;;;12370:6;12346:9;:20;12356:9;12346:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;12411:9;12394:35;;12403:6;12394:35;;;12422:6;12394:35;;;;;;:::i;:::-;;;;;;;;11920:517;11833:604;;;:::o;13390:494::-;13493:1;13474:21;;:7;:21;;;;13466:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;13546:49;13567:7;13584:1;13588:6;13546:20;:49::i;:::-;13608:22;13633:9;:18;13643:7;13633:18;;;;;;;;;;;;;;;;13608:43;;13688:6;13670:14;:24;;13662:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;13782:6;13765:14;:23;;;;:::i;:::-;13744:9;:18;13754:7;13744:18;;;;;;;;;;;;;;;:44;;;;13815:6;13799:12;;:22;;;;;;;:::i;:::-;;;;;;;;13865:1;13839:37;;13848:7;13839:37;;;13869:6;13839:37;;;;;;:::i;:::-;;;;;;;;13455:429;13390:494;;:::o;25379:235::-;25478:4;25527:1;25508:21;;:7;:21;;;;25500:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25586:4;:11;;:20;25598:7;25586:20;;;;;;;;;;;;;;;;;;;;;;;;;25579:27;;25379:235;;;;:::o;25101:183::-;25181:18;25185:4;25191:7;25181:3;:18::i;:::-;25173:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;25271:5;25248:4;:11;;:20;25260:7;25248:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;25101:183;;:::o;17364:422::-;17424:4;17632:12;17743:7;17731:20;17723:28;;17777:1;17770:4;:8;17763:15;;;17364:422;;;:::o;12719:338::-;12822:1;12803:21;;:7;:21;;;;12795:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;12873:49;12902:1;12906:7;12915:6;12873:20;:49::i;:::-;12951:6;12935:12;;:22;;;;;;;:::i;:::-;;;;;;;;12990:6;12968:9;:18;12978:7;12968:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;13033:7;13012:37;;13029:1;13012:37;;;13042:6;13012:37;;;;;;:::i;:::-;;;;;;;;12719:338;;:::o;8230:175::-;8316:4;8333:42;8343:12;:10;:12::i;:::-;8357:9;8368:6;8333:9;:42::i;:::-;8393:4;8386:11;;8230:175;;;;:::o;15271:92::-;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:307::-;355:1;365:113;379:6;376:1;373:13;365:113;;;464:1;459:3;455:11;449:18;445:1;440:3;436:11;429:39;401:2;398:1;394:10;389:15;;365:113;;;496:6;493:1;490:13;487:101;;;576:1;567:6;562:3;558:16;551:27;487:101;336:258;287:307;;;:::o;600:102::-;641:6;692:2;688:7;683:2;676:5;672:14;668:28;658:38;;600:102;;;:::o;708:364::-;796:3;824:39;857:5;824:39;:::i;:::-;879:71;943:6;938:3;879:71;:::i;:::-;872:78;;959:52;1004:6;999:3;992:4;985:5;981:16;959:52;:::i;:::-;1036:29;1058:6;1036:29;:::i;:::-;1031:3;1027:39;1020:46;;800:272;708:364;;;;:::o;1078:313::-;1191:4;1229:2;1218:9;1214:18;1206:26;;1278:9;1272:4;1268:20;1264:1;1253:9;1249:17;1242:47;1306:78;1379:4;1370:6;1306:78;:::i;:::-;1298:86;;1078:313;;;;:::o;1478:117::-;1587:1;1584;1577:12;1724:126;1761:7;1801:42;1794:5;1790:54;1779:65;;1724:126;;;:::o;1856:96::-;1893:7;1922:24;1940:5;1922:24;:::i;:::-;1911:35;;1856:96;;;:::o;1958:122::-;2031:24;2049:5;2031:24;:::i;:::-;2024:5;2021:35;2011:63;;2070:1;2067;2060:12;2011:63;1958:122;:::o;2086:139::-;2132:5;2170:6;2157:20;2148:29;;2186:33;2213:5;2186:33;:::i;:::-;2086:139;;;;:::o;2231:77::-;2268:7;2297:5;2286:16;;2231:77;;;:::o;2314:122::-;2387:24;2405:5;2387:24;:::i;:::-;2380:5;2377:35;2367:63;;2426:1;2423;2416:12;2367:63;2314:122;:::o;2442:139::-;2488:5;2526:6;2513:20;2504:29;;2542:33;2569:5;2542:33;:::i;:::-;2442:139;;;;:::o;2587:474::-;2655:6;2663;2712:2;2700:9;2691:7;2687:23;2683:32;2680:119;;;2718:79;;:::i;:::-;2680:119;2838:1;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2809:117;2965:2;2991:53;3036:7;3027:6;3016:9;3012:22;2991:53;:::i;:::-;2981:63;;2936:118;2587:474;;;;;:::o;3067:90::-;3101:7;3144:5;3137:13;3130:21;3119:32;;3067:90;;;:::o;3163:109::-;3244:21;3259:5;3244:21;:::i;:::-;3239:3;3232:34;3163:109;;:::o;3278:210::-;3365:4;3403:2;3392:9;3388:18;3380:26;;3416:65;3478:1;3467:9;3463:17;3454:6;3416:65;:::i;:::-;3278:210;;;;:::o;3494:118::-;3581:24;3599:5;3581:24;:::i;:::-;3576:3;3569:37;3494:118;;:::o;3618:222::-;3711:4;3749:2;3738:9;3734:18;3726:26;;3762:71;3830:1;3819:9;3815:17;3806:6;3762:71;:::i;:::-;3618:222;;;;:::o;3846:329::-;3905:6;3954:2;3942:9;3933:7;3929:23;3925:32;3922:119;;;3960:79;;:::i;:::-;3922:119;4080:1;4105:53;4150:7;4141:6;4130:9;4126:22;4105:53;:::i;:::-;4095:63;;4051:117;3846:329;;;;:::o;4181:619::-;4258:6;4266;4274;4323:2;4311:9;4302:7;4298:23;4294:32;4291:119;;;4329:79;;:::i;:::-;4291:119;4449:1;4474:53;4519:7;4510:6;4499:9;4495:22;4474:53;:::i;:::-;4464:63;;4420:117;4576:2;4602:53;4647:7;4638:6;4627:9;4623:22;4602:53;:::i;:::-;4592:63;;4547:118;4704:2;4730:53;4775:7;4766:6;4755:9;4751:22;4730:53;:::i;:::-;4720:63;;4675:118;4181:619;;;;;:::o;4806:86::-;4841:7;4881:4;4874:5;4870:16;4859:27;;4806:86;;;:::o;4898:112::-;4981:22;4997:5;4981:22;:::i;:::-;4976:3;4969:35;4898:112;;:::o;5016:214::-;5105:4;5143:2;5132:9;5128:18;5120:26;;5156:67;5220:1;5209:9;5205:17;5196:6;5156:67;:::i;:::-;5016:214;;;;:::o;5236:329::-;5295:6;5344:2;5332:9;5323:7;5319:23;5315:32;5312:119;;;5350:79;;:::i;:::-;5312:119;5470:1;5495:53;5540:7;5531:6;5520:9;5516:22;5495:53;:::i;:::-;5485:63;;5441:117;5236:329;;;;:::o;5571:474::-;5639:6;5647;5696:2;5684:9;5675:7;5671:23;5667:32;5664:119;;;5702:79;;:::i;:::-;5664:119;5822:1;5847:53;5892:7;5883:6;5872:9;5868:22;5847:53;:::i;:::-;5837:63;;5793:117;5949:2;5975:53;6020:7;6011:6;6000:9;5996:22;5975:53;:::i;:::-;5965:63;;5920:118;5571:474;;;;;:::o;6051:77::-;6088:7;6117:5;6106:16;;6051:77;;;:::o;6134:122::-;6207:24;6225:5;6207:24;:::i;:::-;6200:5;6197:35;6187:63;;6246:1;6243;6236:12;6187:63;6134:122;:::o;6262:139::-;6308:5;6346:6;6333:20;6324:29;;6362:33;6389:5;6362:33;:::i;:::-;6262:139;;;;:::o;6407:1057::-;6511:6;6519;6527;6535;6543;6551;6600:3;6588:9;6579:7;6575:23;6571:33;6568:120;;;6607:79;;:::i;:::-;6568:120;6727:1;6752:53;6797:7;6788:6;6777:9;6773:22;6752:53;:::i;:::-;6742:63;;6698:117;6854:2;6880:53;6925:7;6916:6;6905:9;6901:22;6880:53;:::i;:::-;6870:63;;6825:118;6982:2;7008:53;7053:7;7044:6;7033:9;7029:22;7008:53;:::i;:::-;6998:63;;6953:118;7110:2;7136:53;7181:7;7172:6;7161:9;7157:22;7136:53;:::i;:::-;7126:63;;7081:118;7238:3;7265:53;7310:7;7301:6;7290:9;7286:22;7265:53;:::i;:::-;7255:63;;7209:119;7367:3;7394:53;7439:7;7430:6;7419:9;7415:22;7394:53;:::i;:::-;7384:63;;7338:119;6407:1057;;;;;;;;:::o;7470:474::-;7538:6;7546;7595:2;7583:9;7574:7;7570:23;7566:32;7563:119;;;7601:79;;:::i;:::-;7563:119;7721:1;7746:53;7791:7;7782:6;7771:9;7767:22;7746:53;:::i;:::-;7736:63;;7692:117;7848:2;7874:53;7919:7;7910:6;7899:9;7895:22;7874:53;:::i;:::-;7864:63;;7819:118;7470:474;;;;;:::o;7950:180::-;7998:77;7995:1;7988:88;8095:4;8092:1;8085:15;8119:4;8116:1;8109:15;8136:320;8180:6;8217:1;8211:4;8207:12;8197:22;;8264:1;8258:4;8254:12;8285:18;8275:81;;8341:4;8333:6;8329:17;8319:27;;8275:81;8403:2;8395:6;8392:14;8372:18;8369:38;8366:84;;;8422:18;;:::i;:::-;8366:84;8187:269;8136:320;;;:::o;8462:227::-;8602:34;8598:1;8590:6;8586:14;8579:58;8671:10;8666:2;8658:6;8654:15;8647:35;8462:227;:::o;8695:366::-;8837:3;8858:67;8922:2;8917:3;8858:67;:::i;:::-;8851:74;;8934:93;9023:3;8934:93;:::i;:::-;9052:2;9047:3;9043:12;9036:19;;8695:366;;;:::o;9067:419::-;9233:4;9271:2;9260:9;9256:18;9248:26;;9320:9;9314:4;9310:20;9306:1;9295:9;9291:17;9284:47;9348:131;9474:4;9348:131;:::i;:::-;9340:139;;9067:419;;;:::o;9492:180::-;9540:77;9537:1;9530:88;9637:4;9634:1;9627:15;9661:4;9658:1;9651:15;9678:191;9718:4;9738:20;9756:1;9738:20;:::i;:::-;9733:25;;9772:20;9790:1;9772:20;:::i;:::-;9767:25;;9811:1;9808;9805:8;9802:34;;;9816:18;;:::i;:::-;9802:34;9861:1;9858;9854:9;9846:17;;9678:191;;;;:::o;9875:305::-;9915:3;9934:20;9952:1;9934:20;:::i;:::-;9929:25;;9968:20;9986:1;9968:20;:::i;:::-;9963:25;;10122:1;10054:66;10050:74;10047:1;10044:81;10041:107;;;10128:18;;:::i;:::-;10041:107;10172:1;10169;10165:9;10158:16;;9875:305;;;;:::o;10186:163::-;10326:15;10322:1;10314:6;10310:14;10303:39;10186:163;:::o;10355:366::-;10497:3;10518:67;10582:2;10577:3;10518:67;:::i;:::-;10511:74;;10594:93;10683:3;10594:93;:::i;:::-;10712:2;10707:3;10703:12;10696:19;;10355:366;;;:::o;10727:419::-;10893:4;10931:2;10920:9;10916:18;10908:26;;10980:9;10974:4;10970:20;10966:1;10955:9;10951:17;10944:47;11008:131;11134:4;11008:131;:::i;:::-;11000:139;;10727:419;;;:::o;11152:118::-;11239:24;11257:5;11239:24;:::i;:::-;11234:3;11227:37;11152:118;;:::o;11276:222::-;11369:4;11407:2;11396:9;11392:18;11384:26;;11420:71;11488:1;11477:9;11473:17;11464:6;11420:71;:::i;:::-;11276:222;;;;:::o;11504:178::-;11644:30;11640:1;11632:6;11628:14;11621:54;11504:178;:::o;11688:366::-;11830:3;11851:67;11915:2;11910:3;11851:67;:::i;:::-;11844:74;;11927:93;12016:3;11927:93;:::i;:::-;12045:2;12040:3;12036:12;12029:19;;11688:366;;;:::o;12060:419::-;12226:4;12264:2;12253:9;12249:18;12241:26;;12313:9;12307:4;12303:20;12299:1;12288:9;12284:17;12277:47;12341:131;12467:4;12341:131;:::i;:::-;12333:139;;12060:419;;;:::o;12485:179::-;12625:31;12621:1;12613:6;12609:14;12602:55;12485:179;:::o;12670:366::-;12812:3;12833:67;12897:2;12892:3;12833:67;:::i;:::-;12826:74;;12909:93;12998:3;12909:93;:::i;:::-;13027:2;13022:3;13018:12;13011:19;;12670:366;;;:::o;13042:419::-;13208:4;13246:2;13235:9;13231:18;13223:26;;13295:9;13289:4;13285:20;13281:1;13270:9;13266:17;13259:47;13323:131;13449:4;13323:131;:::i;:::-;13315:139;;13042:419;;;:::o;13467:173::-;13607:25;13603:1;13595:6;13591:14;13584:49;13467:173;:::o;13646:366::-;13788:3;13809:67;13873:2;13868:3;13809:67;:::i;:::-;13802:74;;13885:93;13974:3;13885:93;:::i;:::-;14003:2;13998:3;13994:12;13987:19;;13646:366;;;:::o;14018:419::-;14184:4;14222:2;14211:9;14207:18;14199:26;;14271:9;14265:4;14261:20;14257:1;14246:9;14242:17;14235:47;14299:131;14425:4;14299:131;:::i;:::-;14291:139;;14018:419;;;:::o;14443:332::-;14564:4;14602:2;14591:9;14587:18;14579:26;;14615:71;14683:1;14672:9;14668:17;14659:6;14615:71;:::i;:::-;14696:72;14764:2;14753:9;14749:18;14740:6;14696:72;:::i;:::-;14443:332;;;;;:::o;14781:223::-;14921:34;14917:1;14909:6;14905:14;14898:58;14990:6;14985:2;14977:6;14973:15;14966:31;14781:223;:::o;15010:366::-;15152:3;15173:67;15237:2;15232:3;15173:67;:::i;:::-;15166:74;;15249:93;15338:3;15249:93;:::i;:::-;15367:2;15362:3;15358:12;15351:19;;15010:366;;;:::o;15382:419::-;15548:4;15586:2;15575:9;15571:18;15563:26;;15635:9;15629:4;15625:20;15621:1;15610:9;15606:17;15599:47;15663:131;15789:4;15663:131;:::i;:::-;15655:139;;15382:419;;;:::o;15807:224::-;15947:34;15943:1;15935:6;15931:14;15924:58;16016:7;16011:2;16003:6;15999:15;15992:32;15807:224;:::o;16037:366::-;16179:3;16200:67;16264:2;16259:3;16200:67;:::i;:::-;16193:74;;16276:93;16365:3;16276:93;:::i;:::-;16394:2;16389:3;16385:12;16378:19;;16037:366;;;:::o;16409:419::-;16575:4;16613:2;16602:9;16598:18;16590:26;;16662:9;16656:4;16652:20;16648:1;16637:9;16633:17;16626:47;16690:131;16816:4;16690:131;:::i;:::-;16682:139;;16409:419;;;:::o;16834:118::-;16921:24;16939:5;16921:24;:::i;:::-;16916:3;16909:37;16834:118;;:::o;16958:775::-;17191:4;17229:3;17218:9;17214:19;17206:27;;17243:71;17311:1;17300:9;17296:17;17287:6;17243:71;:::i;:::-;17324:72;17392:2;17381:9;17377:18;17368:6;17324:72;:::i;:::-;17406;17474:2;17463:9;17459:18;17450:6;17406:72;:::i;:::-;17488;17556:2;17545:9;17541:18;17532:6;17488:72;:::i;:::-;17570:73;17638:3;17627:9;17623:19;17614:6;17570:73;:::i;:::-;17653;17721:3;17710:9;17706:19;17697:6;17653:73;:::i;:::-;16958:775;;;;;;;;;:::o;17739:236::-;17879:34;17875:1;17867:6;17863:14;17856:58;17948:19;17943:2;17935:6;17931:15;17924:44;17739:236;:::o;17981:366::-;18123:3;18144:67;18208:2;18203:3;18144:67;:::i;:::-;18137:74;;18220:93;18309:3;18220:93;:::i;:::-;18338:2;18333:3;18329:12;18322:19;;17981:366;;;:::o;18353:419::-;18519:4;18557:2;18546:9;18542:18;18534:26;;18606:9;18600:4;18596:20;18592:1;18581:9;18577:17;18570:47;18634:131;18760:4;18634:131;:::i;:::-;18626:139;;18353:419;;;:::o;18778:181::-;18918:33;18914:1;18906:6;18902:14;18895:57;18778:181;:::o;18965:366::-;19107:3;19128:67;19192:2;19187:3;19128:67;:::i;:::-;19121:74;;19204:93;19293:3;19204:93;:::i;:::-;19322:2;19317:3;19313:12;19306:19;;18965:366;;;:::o;19337:419::-;19503:4;19541:2;19530:9;19526:18;19518:26;;19590:9;19584:4;19580:20;19576:1;19565:9;19561:17;19554:47;19618:131;19744:4;19618:131;:::i;:::-;19610:139;;19337:419;;;:::o;19762:223::-;19902:34;19898:1;19890:6;19886:14;19879:58;19971:6;19966:2;19958:6;19954:15;19947:31;19762:223;:::o;19991:366::-;20133:3;20154:67;20218:2;20213:3;20154:67;:::i;:::-;20147:74;;20230:93;20319:3;20230:93;:::i;:::-;20348:2;20343:3;20339:12;20332:19;;19991:366;;;:::o;20363:419::-;20529:4;20567:2;20556:9;20552:18;20544:26;;20616:9;20610:4;20606:20;20602:1;20591:9;20587:17;20580:47;20644:131;20770:4;20644:131;:::i;:::-;20636:139;;20363:419;;;:::o;20788:221::-;20928:34;20924:1;20916:6;20912:14;20905:58;20997:4;20992:2;20984:6;20980:15;20973:29;20788:221;:::o;21015:366::-;21157:3;21178:67;21242:2;21237:3;21178:67;:::i;:::-;21171:74;;21254:93;21343:3;21254:93;:::i;:::-;21372:2;21367:3;21363:12;21356:19;;21015:366;;;:::o;21387:419::-;21553:4;21591:2;21580:9;21576:18;21568:26;;21640:9;21634:4;21630:20;21626:1;21615:9;21611:17;21604:47;21668:131;21794:4;21668:131;:::i;:::-;21660:139;;21387:419;;;:::o;21812:224::-;21952:34;21948:1;21940:6;21936:14;21929:58;22021:7;22016:2;22008:6;22004:15;21997:32;21812:224;:::o;22042:366::-;22184:3;22205:67;22269:2;22264:3;22205:67;:::i;:::-;22198:74;;22281:93;22370:3;22281:93;:::i;:::-;22399:2;22394:3;22390:12;22383:19;;22042:366;;;:::o;22414:419::-;22580:4;22618:2;22607:9;22603:18;22595:26;;22667:9;22661:4;22657:20;22653:1;22642:9;22638:17;22631:47;22695:131;22821:4;22695:131;:::i;:::-;22687:139;;22414:419;;;:::o;22839:222::-;22979:34;22975:1;22967:6;22963:14;22956:58;23048:5;23043:2;23035:6;23031:15;23024:30;22839:222;:::o;23067:366::-;23209:3;23230:67;23294:2;23289:3;23230:67;:::i;:::-;23223:74;;23306:93;23395:3;23306:93;:::i;:::-;23424:2;23419:3;23415:12;23408:19;;23067:366;;;:::o;23439:419::-;23605:4;23643:2;23632:9;23628:18;23620:26;;23692:9;23686:4;23682:20;23678:1;23667:9;23663:17;23656:47;23720:131;23846:4;23720:131;:::i;:::-;23712:139;;23439:419;;;:::o;23864:225::-;24004:34;24000:1;23992:6;23988:14;23981:58;24073:8;24068:2;24060:6;24056:15;24049:33;23864:225;:::o;24095:366::-;24237:3;24258:67;24322:2;24317:3;24258:67;:::i;:::-;24251:74;;24334:93;24423:3;24334:93;:::i;:::-;24452:2;24447:3;24443:12;24436:19;;24095:366;;;:::o;24467:419::-;24633:4;24671:2;24660:9;24656:18;24648:26;;24720:9;24714:4;24710:20;24706:1;24695:9;24691:17;24684:47;24748:131;24874:4;24748:131;:::i;:::-;24740:139;;24467:419;;;:::o;24892:220::-;25032:34;25028:1;25020:6;25016:14;25009:58;25101:3;25096:2;25088:6;25084:15;25077:28;24892:220;:::o;25118:366::-;25260:3;25281:67;25345:2;25340:3;25281:67;:::i;:::-;25274:74;;25357:93;25446:3;25357:93;:::i;:::-;25475:2;25470:3;25466:12;25459:19;;25118:366;;;:::o;25490:419::-;25656:4;25694:2;25683:9;25679:18;25671:26;;25743:9;25737:4;25733:20;25729:1;25718:9;25714:17;25707:47;25771:131;25897:4;25771:131;:::i;:::-;25763:139;;25490:419;;;:::o;25915:221::-;26055:34;26051:1;26043:6;26039:14;26032:58;26124:4;26119:2;26111:6;26107:15;26100:29;25915:221;:::o;26142:366::-;26284:3;26305:67;26369:2;26364:3;26305:67;:::i;:::-;26298:74;;26381:93;26470:3;26381:93;:::i;:::-;26499:2;26494:3;26490:12;26483:19;;26142:366;;;:::o;26514:419::-;26680:4;26718:2;26707:9;26703:18;26695:26;;26767:9;26761:4;26757:20;26753:1;26742:9;26738:17;26731:47;26795:131;26921:4;26795:131;:::i;:::-;26787:139;;26514:419;;;:::o;26939:221::-;27079:34;27075:1;27067:6;27063:14;27056:58;27148:4;27143:2;27135:6;27131:15;27124:29;26939:221;:::o;27166:366::-;27308:3;27329:67;27393:2;27388:3;27329:67;:::i;:::-;27322:74;;27405:93;27494:3;27405:93;:::i;:::-;27523:2;27518:3;27514:12;27507:19;;27166:366;;;:::o;27538:419::-;27704:4;27742:2;27731:9;27727:18;27719:26;;27791:9;27785:4;27781:20;27777:1;27766:9;27762:17;27755:47;27819:131;27945:4;27819:131;:::i;:::-;27811:139;;27538:419;;;:::o;27963:220::-;28103:34;28099:1;28091:6;28087:14;28080:58;28172:3;28167:2;28159:6;28155:15;28148:28;27963:220;:::o;28189:366::-;28331:3;28352:67;28416:2;28411:3;28352:67;:::i;:::-;28345:74;;28428:93;28517:3;28428:93;:::i;:::-;28546:2;28541:3;28537:12;28530:19;;28189:366;;;:::o;28561:419::-;28727:4;28765:2;28754:9;28750:18;28742:26;;28814:9;28808:4;28804:20;28800:1;28789:9;28785:17;28778:47;28842:131;28968:4;28842:131;:::i;:::-;28834:139;;28561:419;;;:::o;28986:181::-;29126:33;29122:1;29114:6;29110:14;29103:57;28986:181;:::o;29173:366::-;29315:3;29336:67;29400:2;29395:3;29336:67;:::i;:::-;29329:74;;29412:93;29501:3;29412:93;:::i;:::-;29530:2;29525:3;29521:12;29514:19;;29173:366;;;:::o;29545:419::-;29711:4;29749:2;29738:9;29734:18;29726:26;;29798:9;29792:4;29788:20;29784:1;29773:9;29769:17;29762:47;29826:131;29952:4;29826:131;:::i;:::-;29818:139;;29545:419;;;:::o

Swarm Source

ipfs://a443474ef6b8087fc4d7c33593a460cc94bc729beabddf018bd5137a8aeaac4d
Loading