ETH Price: $1,886.32 (+1.08%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer From220267692025-03-11 23:00:4715 hrs ago1741734047IN
Tiamonds: TOTO Token
0 ETH0.000243954.39271347
Approve220224972025-03-11 8:40:2329 hrs ago1741682423IN
Tiamonds: TOTO Token
0 ETH0.000121442.57350454
Transfer220191992025-03-10 21:37:2340 hrs ago1741642643IN
Tiamonds: TOTO Token
0 ETH0.000163353.44900994
Approve220178222025-03-10 17:00:2345 hrs ago1741626023IN
Tiamonds: TOTO Token
0 ETH0.000043561.6111682
Approve220178222025-03-10 17:00:2345 hrs ago1741626023IN
Tiamonds: TOTO Token
0 ETH0.000075621.6111682
Transfer220176712025-03-10 16:29:4745 hrs ago1741624187IN
Tiamonds: TOTO Token
0 ETH0.000090552.99359587
Transfer220176532025-03-10 16:25:5945 hrs ago1741623959IN
Tiamonds: TOTO Token
0 ETH0.000123292.36362323
Approve220172142025-03-10 14:57:3547 hrs ago1741618655IN
Tiamonds: TOTO Token
0 ETH0.000380918.07155039
Transfer220171722025-03-10 14:49:1147 hrs ago1741618151IN
Tiamonds: TOTO Token
0 ETH0.000373067.1536682
Approve220163982025-03-10 12:13:112 days ago1741608791IN
Tiamonds: TOTO Token
0 ETH0.000068511.46184024
Approve220156522025-03-10 9:43:232 days ago1741599803IN
Tiamonds: TOTO Token
0 ETH0.000083181.76259728
Approve220116412025-03-09 20:17:112 days ago1741551431IN
Tiamonds: TOTO Token
0 ETH0.000127872.72841477
Approve220064912025-03-09 3:00:353 days ago1741489235IN
Tiamonds: TOTO Token
0 ETH0.000072181.53007876
Transfer219967132025-03-07 18:13:114 days ago1741371191IN
Tiamonds: TOTO Token
0 ETH0.000054891.15942168
Transfer219951732025-03-07 13:02:355 days ago1741352555IN
Tiamonds: TOTO Token
0 ETH0.000058531.12271421
Approve219904522025-03-06 21:12:355 days ago1741295555IN
Tiamonds: TOTO Token
0 ETH0.000129822.75093167
Approve219903852025-03-06 20:59:115 days ago1741294751IN
Tiamonds: TOTO Token
0 ETH0.000127842.70562067
Approve219902672025-03-06 20:35:235 days ago1741293323IN
Tiamonds: TOTO Token
0 ETH0.000125462.65859272
Approve219902452025-03-06 20:30:595 days ago1741293059IN
Tiamonds: TOTO Token
0 ETH0.000126652.6838324
Approve219901782025-03-06 20:17:235 days ago1741292243IN
Tiamonds: TOTO Token
0 ETH0.000131962.7962385
Transfer219888852025-03-06 15:56:475 days ago1741276607IN
Tiamonds: TOTO Token
0 ETH0.000062182.05585331
Transfer219887602025-03-06 15:31:355 days ago1741275095IN
Tiamonds: TOTO Token
0 ETH0.000063082.08540143
Transfer219886992025-03-06 15:19:235 days ago1741274363IN
Tiamonds: TOTO Token
0 ETH0.000065652.16941253
Transfer219885062025-03-06 14:40:235 days ago1741272023IN
Tiamonds: TOTO Token
0 ETH0.000093093.07737123
Transfer219884422025-03-06 14:27:355 days ago1741271255IN
Tiamonds: TOTO Token
0 ETH0.000054921.81573548
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TOTO

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 1 of 12: TotoToken.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.0;

import {ERC20} from "./ERC20.sol";
import {TOTOAdmin} from "./TotoAdmin.sol";

/**
 * @title TOTO
 * @notice Implementation of the TOTO Token
 *
 * Token details:
 * - Name: TOTO Token
 * - Symbol: TOTO
 * - Decimals: 9
 * - Maximum Supply: 1 billion tokens (1,000,000,000 * 10^9 units)
 *
 * Key Features:
 * - Maximum Token Cap: The total token supply is permanently capped at 1 billion tokens.
 * - Pausing Mechanism: The owner, via inherited functionality from the TOTOAdmin contract,
 *   can pause or unpause minting and burning of tokens.
 * - Permissioned Minting and Burning: Only addresses with the required permissions
 *   (`minter` or `burner` roles) can execute mint or burn operations.
 */
contract TOTO is ERC20, TOTOAdmin {
    /**
     * @dev The maximum limit to the token supply
     */
    uint256 public immutable MAX_SUPPLY;

    /**
     * @dev Initialize the maximum supply cap to 1 billion
     */
    constructor() ERC20("TOTO Token", "TOTO") {
        uint256 maxSupply = 1_000_000_000;
        MAX_SUPPLY = maxSupply * (10 ** decimals());
    }

    /**
     * @dev Overrides the decimals function to return 9 decimals.
     */
    function decimals() public pure override returns (uint8) {
        return 9;
    }

    /**
     * @dev Mints new tokens to a specified address.
     *
     * Requirements:
     * - The contract must not be paused.
     * - The caller must have the minting permission.
     * - The resulting total supply must not exceed the `MAX_SUPPLY`.
     *
     * @param to The address to receive the newly minted tokens.
     * @param amount The number of tokens to mint (in smallest units).
     */
    function mint(address to, uint256 amount) external whenNotPaused {
        require(
            hasMintPermission(_msgSender()),
            "TOTO: must have minter role to mint"
        );
        require(
            totalSupply() + amount <= MAX_SUPPLY,
            "TOTO: Exceeds max supply"
        );
        _mint(to, amount);
    }

    /**
     * @dev Burns a specified amount of tokens from the caller's account.
     *
     * Requirements:
     * - The contract must not be paused.
     * - The caller must have the required burning permission.
     * - The caller's account must have at least the amount of tokens to be burned.
     *
     * @param amount The number of tokens to burn (in smallest units).
     */
    function burn(uint256 amount) external whenNotPaused {
        require(
            hasBurnPermission(_msgSender()),
            "TOTO: must have burner role to burn"
        );
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Override the function to always update allowance amount.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal override {
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= amount, "ERC20: insufficient allowance");
        unchecked {
            _approve(owner, spender, currentAllowance - amount);
        }
    }
}

File 2 of 12: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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;
        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");

        (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");

        (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");

        (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");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 3 of 12: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (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) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

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

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./IERC20Metadata.sol";
import "./Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead 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}.
     *
     * 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 default value returned by this function, unless
     * it's 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:
     *
     * - `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;
    }

    /**
     * @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}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    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;
    }

    /**
     * @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) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, 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) {
        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);
    }

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

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

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

File 5 of 12: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.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);

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

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

File 6 of 12: IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";

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

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

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

File 7 of 12: ITotoToken.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

interface ITOTO {
    // ========== ERC-20 Metadata ==========

    /**
     * @notice Returns the maximum allowed token supply that can ever exist.
     */
    function MAX_SUPPLY() external view returns (uint256);

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

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

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

    // ========== ERC-20 functionalities ==========

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

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

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

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

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

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

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

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

    /**
     * @notice Atomically increases the allowance granted to `spender` by the caller.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(
        address spender,
        uint256 addedValue
    ) external returns (bool);

    /**
     * @notice Atomically decreases the allowance granted to `spender` by the caller.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) external returns (bool);

    /**
     * @notice Mints new tokens to a specified address.
     *
     * Requirements:
     * - The contract must not be paused.
     * - The caller must have the minting permission.
     * - The resulting total supply must not exceed the `MAX_SUPPLY`.
     *
     * @param to The address to receive the newly minted tokens.
     * @param amount The number of tokens to mint (in smallest units).
     */
    function mint(address to, uint256 amount) external;

    /**
     * @dev Burns a specified amount of tokens from the caller's account.
     *
     * Requirements:
     * - The contract must not be paused.
     * - The caller must have the required burning permission.
     * - The caller's account must have at least the amount of tokens to be burned.
     *
     * @param amount The number of tokens to burn (in smallest units).
     */
    function burn(uint256 amount) external;

    // ========== TOTO Admin: Pausable etc. ==========

    /**
     * @notice Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @notice Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    /**
     * @notice Returns true if the contract is paused, and false otherwise.
     */
    function paused() external returns (bool);

    /**
     * @notice Emitted when the owner is updated
     */
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    /**
     * @notice Returns the address of the current owner.
     */
    function owner() external returns (address);

    /**
     * @notice Returns true if the specified account has permission to mint tokens.
     */
    function hasMintPermission(address _account) external view returns (bool);

    /**
     * @notice Returns true if the specified account has permission to burn tokens.
     */
    function hasBurnPermission(address _account) external view returns (bool);

    /**
     * @notice Returns true if the specified account has both
     * the permissions of minting and burning.
     */
    function hasBothMintAndBurnPermission(
        address _account
    ) external view returns (bool);
}

File 8 of 12: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 9 of 12: Ownable2Step.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)

pragma solidity ^0.8.0;

import "./Ownable.sol";

/**
 * @dev Contract module which provides access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership} and {acceptOwnership}.
 *
 * This module is used through inheritance. It will make available all functions
 * from parent (Ownable).
 */
abstract contract Ownable2Step is Ownable {
    address private _pendingOwner;

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

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

    /**
     * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual override onlyOwner {
        _pendingOwner = newOwner;
        emit OwnershipTransferStarted(owner(), newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual override {
        delete _pendingOwner;
        super._transferOwnership(newOwner);
    }

    /**
     * @dev The new owner accepts the ownership transfer.
     */
    function acceptOwnership() public virtual {
        address sender = _msgSender();
        require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner");
        _transferOwnership(sender);
    }
}

File 10 of 12: Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 11 of 12: SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

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

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

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

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 12 of 12: TotoAdmin.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

import {Ownable2Step} from "./Ownable2Step.sol";
import {Pausable} from "./Pausable.sol";

/**
 * @title TOTOAdmin
 * @notice Admin management and related functionalities for TOTO Token
 * - The owner is targeted to be set / upgraded to a multi-sig wallet
 *   for enhanced security
 * - Minting and Burning permissions will be granted to the Swapper contract
 *   and cross-chain bridging contracts
 *
 * - Token contract can be paused, unpaused by the owner
 * - Owner can grant/revoke permissions to/from an account to mint and burn tokens
 * - Owner can be updated using 2 steps, as implemented by Openzeppelin's Ownable2Step
 */
abstract contract TOTOAdmin is Ownable2Step, Pausable {
    bytes32 internal constant MINTER_ROLE = keccak256("MINTER_ROLE");
    bytes32 internal constant BURNER_ROLE = keccak256("BURNER_ROLE");
    bytes32 internal constant MINTER_AND_BURNER_ROLE =
        keccak256("MINTER_AND_BURNER_ROLE");

    mapping(address => bytes32) internal minterBurnerRole;

    event RoleUpdated(
        address indexed caller,
        address indexed grantedAccount,
        bytes32 grantedRole
    );

    /**
     * @dev Don't renounce ownership
     */
    function renounceOwnership() public view override onlyOwner {
        require(false, "Can't renounce ownership");
    }

    /**
     * @dev Pauses the contract. Only owner can call.
     */
    function pause() external onlyOwner {
        _pause();
    }

    /**
     * @dev Unpauses the contract. Only owner can call.
     */
    function unpause() external onlyOwner {
        _unpause();
    }

    /**
     * @dev Grant an account permission to mint tokens.
     * If the account had burn permission, it gets revoked.
     * Only callable by the current owner.
     */
    function grantMintOnlyPermission(address _account) external onlyOwner {
        _setMintBurnRole(_account, MINTER_ROLE);
    }

    /**
     * @dev Grant an account permission to burn tokens.
     * If the account had mint permission, it gets revoked.
     * Only callable by the current owner.
     */
    function grantBurnOnlyPermission(address _account) external onlyOwner {
        _setMintBurnRole(_account, BURNER_ROLE);
    }

    /**
     * @dev Grant an account permission to mint as well as to burn tokens.
     * Only callable by the current owner.
     */
    function grantMintAndBurnPermission(address _account) external onlyOwner {
        _setMintBurnRole(_account, MINTER_AND_BURNER_ROLE);
    }

    /**
     * @dev Revoke mint and/or burn permission(s) from an account.
     * Only callable by the current owner.
     */
    function revokeMintOrBurnPermission(address _account) external onlyOwner {
        _setMintBurnRole(_account, bytes32(0));
    }

    /**
     * @dev Returns true if the specified account has permission to mint tokens.
     */
    function hasMintPermission(address _account) public view returns (bool) {
        return (minterBurnerRole[_account] == MINTER_AND_BURNER_ROLE ||
            minterBurnerRole[_account] == MINTER_ROLE);
    }

    /**
     * @dev Returns true if the specified account has permission to burn tokens.
     */
    function hasBurnPermission(address _account) public view returns (bool) {
        return (minterBurnerRole[_account] == MINTER_AND_BURNER_ROLE ||
            minterBurnerRole[_account] == BURNER_ROLE);
    }

    /**
     * @dev Returns true if the specified account has both
     * the permissions of minting and burning.
     */
    function hasBothMintAndBurnPermission(
        address _account
    ) public view returns (bool) {
        return minterBurnerRole[_account] == MINTER_AND_BURNER_ROLE;
    }

    /**
     * @dev Internal function to set any specified role for an account.
     */
    function _setMintBurnRole(address _account, bytes32 _role) internal {
        minterBurnerRole[_account] = _role;
        emit RoleUpdated(_msgSender(), _account, _role);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"grantedAccount","type":"address"},{"indexed":false,"internalType":"bytes32","name":"grantedRole","type":"bytes32"}],"name":"RoleUpdated","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":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","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":[],"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":"_account","type":"address"}],"name":"grantBurnOnlyPermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"grantMintAndBurnPermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"grantMintOnlyPermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"hasBothMintAndBurnPermission","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"hasBurnPermission","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"hasMintPermission","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"revokeMintOrBurnPermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040523480156200001157600080fd5b506040518060400160405280600a81526020017f544f544f20546f6b656e000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f544f544f0000000000000000000000000000000000000000000000000000000081525081600390805190602001906200009692919062000244565b508060049080519060200190620000af92919062000244565b505050620000d2620000c66200012f60201b60201c565b6200013760201b60201c565b6000600660146101000a81548160ff0219169083151502179055506000633b9aca009050620001066200017560201b60201c565b600a6200011491906200034f565b816200012191906200048c565b6080818152505050620005a5565b600033905090565b600660006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905562000172816200017e60201b62000f001760201c565b50565b60006009905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002529062000504565b90600052602060002090601f016020900481019282620002765760008555620002c2565b82601f106200029157805160ff1916838001178555620002c2565b82800160010185558215620002c2579182015b82811115620002c1578251825591602001919060010190620002a4565b5b509050620002d19190620002d5565b5090565b5b80821115620002f0576000816000905550600101620002d6565b5090565b6000808291508390505b600185111562000346578086048111156200031e576200031d6200053a565b5b60018516156200032e5780820291505b80810290506200033e8562000598565b9450620002fe565b94509492505050565b60006200035c82620004ed565b91506200036983620004f7565b9250620003987fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620003a0565b905092915050565b600082620003b2576001905062000485565b81620003c2576000905062000485565b8160018114620003db5760028114620003e6576200041c565b600191505062000485565b60ff841115620003fb57620003fa6200053a565b5b8360020a9150848211156200041557620004146200053a565b5b5062000485565b5060208310610133831016604e8410600b8410161715620004565782820a90508381111562000450576200044f6200053a565b5b62000485565b620004658484846001620002f4565b925090508184048111156200047f576200047e6200053a565b5b81810290505b9392505050565b60006200049982620004ed565b9150620004a683620004ed565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620004e257620004e16200053a565b5b828202905092915050565b6000819050919050565b600060ff82169050919050565b600060028204905060018216806200051d57607f821691505b6020821081141562000534576200053362000569565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60008160011c9050919050565b60805161273b620005c86000396000818161072901526107ed015261273b6000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063715018a611610104578063a9059cbb116100a2578063e30c397811610071578063e30c39781461050a578063f2fde38b14610528578063f3ee4ae814610544578063fb35a24a14610560576101cf565b8063a9059cbb14610472578063c218d3f5146104a2578063cc16cd29146104be578063dd62ed3e146104da576101cf565b80638da5cb5b116100de5780638da5cb5b146103d657806392133cde146103f457806395d89b4114610424578063a457c2d714610442576101cf565b8063715018a6146103b857806379ba5097146103c25780638456cb59146103cc576101cf565b806332cb6b0c1161017157806340c10f191161014b57806340c10f191461033257806342966c681461034e5780635c975abb1461036a57806370a0823114610388576101cf565b806332cb6b0c146102da57806339509351146102f85780633f4ba83a14610328576101cf565b806323b872dd116101ad57806323b872dd146102405780632de274dc14610270578063313ce5671461028c57806332c45954146102aa576101cf565b806306fdde03146101d4578063095ea7b3146101f257806318160ddd14610222575b600080fd5b6101dc610590565b6040516101e9919061229a565b60405180910390f35b61020c60048036038101906102079190611b3e565b610622565b6040516102199190612264565b60405180910390f35b61022a610645565b60405161023791906124fc565b60405180910390f35b61025a60048036038101906102559190611aef565b61064f565b6040516102679190612264565b60405180910390f35b61028a60048036038101906102859190611a8a565b61067e565b005b6102946106b3565b6040516102a19190612517565b60405180910390f35b6102c460048036038101906102bf9190611a8a565b6106bc565b6040516102d19190612264565b60405180910390f35b6102e2610727565b6040516102ef91906124fc565b60405180910390f35b610312600480360381019061030d9190611b3e565b61074b565b60405161031f9190612264565b60405180910390f35b610330610782565b005b61034c60048036038101906103479190611b3e565b610794565b005b61036860048036038101906103639190611b7a565b61086e565b005b6103726108d9565b60405161037f9190612264565b60405180910390f35b6103a2600480360381019061039d9190611a8a565b6108f0565b6040516103af91906124fc565b60405180910390f35b6103c0610938565b005b6103ca610983565b005b6103d4610a10565b005b6103de610a22565b6040516103eb9190612249565b60405180910390f35b61040e60048036038101906104099190611a8a565b610a4c565b60405161041b9190612264565b60405180910390f35b61042c610b20565b604051610439919061229a565b60405180910390f35b61045c60048036038101906104579190611b3e565b610bb2565b6040516104699190612264565b60405180910390f35b61048c60048036038101906104879190611b3e565b610c29565b6040516104999190612264565b60405180910390f35b6104bc60048036038101906104b79190611a8a565b610c4c565b005b6104d860048036038101906104d39190611a8a565b610c64565b005b6104f460048036038101906104ef9190611ab3565b610c99565b60405161050191906124fc565b60405180910390f35b610512610d20565b60405161051f9190612249565b60405180910390f35b610542600480360381019061053d9190611a8a565b610d4a565b005b61055e60048036038101906105599190611a8a565b610df7565b005b61057a60048036038101906105759190611a8a565b610e2c565b6040516105879190612264565b60405180910390f35b60606003805461059f90612636565b80601f01602080910402602001604051908101604052809291908181526020018280546105cb90612636565b80156106185780601f106105ed57610100808354040283529160200191610618565b820191906000526020600020905b8154815290600101906020018083116105fb57829003601f168201915b5050505050905090565b60008061062d610fc6565b905061063a818585610fce565b600191505092915050565b6000600254905090565b60008061065a610fc6565b9050610667858285611199565b6106728585856111fd565b60019150509392505050565b610686611475565b6106b0817f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8486114f3565b50565b60006009905090565b60007f553c15132cdbfb2f7255bedd79fb0e91b615777da29e2ed768297cd19eef47b0600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054149050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080610756610fc6565b90506107778185856107688589610c99565b610772919061254e565b610fce565b600191505092915050565b61078a611475565b6107926115a7565b565b61079c61160a565b6107ac6107a7610fc6565b610a4c565b6107eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e2906123bc565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081610815610645565b61081f919061254e565b1115610860576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108579061249c565b60405180910390fd5b61086a8282611654565b5050565b61087661160a565b610886610881610fc6565b610e2c565b6108c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108bc906123fc565b60405180910390fd5b6108d66108d0610fc6565b826117ab565b50565b6000600660149054906101000a900460ff16905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610940611475565b6000610981576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109789061247c565b60405180910390fd5b565b600061098d610fc6565b90508073ffffffffffffffffffffffffffffffffffffffff166109ae610d20565b73ffffffffffffffffffffffffffffffffffffffff1614610a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fb9061231c565b60405180910390fd5b610a0d81611979565b50565b610a18611475565b610a206119aa565b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f553c15132cdbfb2f7255bedd79fb0e91b615777da29e2ed768297cd19eef47b0600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541480610b1957507f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b9050919050565b606060048054610b2f90612636565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5b90612636565b8015610ba85780601f10610b7d57610100808354040283529160200191610ba8565b820191906000526020600020905b815481529060010190602001808311610b8b57829003601f168201915b5050505050905090565b600080610bbd610fc6565b90506000610bcb8286610c99565b905083811015610c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c07906124bc565b60405180910390fd5b610c1d8286868403610fce565b60019250505092915050565b600080610c34610fc6565b9050610c418185856111fd565b600191505092915050565b610c54611475565b610c61816000801b6114f3565b50565b610c6c611475565b610c96817f553c15132cdbfb2f7255bedd79fb0e91b615777da29e2ed768297cd19eef47b06114f3565b50565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610d52611475565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16610db2610a22565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610dff611475565b610e29817f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66114f3565b50565b60007f553c15132cdbfb2f7255bedd79fb0e91b615777da29e2ed768297cd19eef47b0600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541480610ef957507f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b9050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561103e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110359061245c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a59061233c565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161118c91906124fc565b60405180910390a3505050565b60006111a58484610c99565b9050818110156111ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e19061235c565b60405180910390fd5b6111f78484848403610fce565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561126d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112649061243c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d4906122bc565b60405180910390fd5b6112e8838383611a0d565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561136e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113659061237c565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161145c91906124fc565b60405180910390a361146f848484611a12565b50505050565b61147d610fc6565b73ffffffffffffffffffffffffffffffffffffffff1661149b610a22565b73ffffffffffffffffffffffffffffffffffffffff16146114f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e8906123dc565b60405180910390fd5b565b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16611556610fc6565b73ffffffffffffffffffffffffffffffffffffffff167fd28d432cd3cb121b26fcde65ca5044c180251288d4541912260743531d91398a8360405161159b919061227f565b60405180910390a35050565b6115af611a17565b6000600660146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6115f3610fc6565b6040516116009190612249565b60405180910390a1565b6116126108d9565b15611652576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116499061239c565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bb906124dc565b60405180910390fd5b6116d060008383611a0d565b80600260008282546116e2919061254e565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161179391906124fc565b60405180910390a36117a760008383611a12565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561181b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118129061241c565b60405180910390fd5b61182782600083611a0d565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156118ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a4906122fc565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161196091906124fc565b60405180910390a361197483600084611a12565b505050565b600660006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556119a781610f00565b50565b6119b261160a565b6001600660146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586119f6610fc6565b604051611a039190612249565b60405180910390a1565b505050565b505050565b611a1f6108d9565b611a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a55906122dc565b60405180910390fd5b565b600081359050611a6f816126d7565b92915050565b600081359050611a84816126ee565b92915050565b600060208284031215611a9c57600080fd5b6000611aaa84828501611a60565b91505092915050565b60008060408385031215611ac657600080fd5b6000611ad485828601611a60565b9250506020611ae585828601611a60565b9150509250929050565b600080600060608486031215611b0457600080fd5b6000611b1286828701611a60565b9350506020611b2386828701611a60565b9250506040611b3486828701611a75565b9150509250925092565b60008060408385031215611b5157600080fd5b6000611b5f85828601611a60565b9250506020611b7085828601611a75565b9150509250929050565b600060208284031215611b8c57600080fd5b6000611b9a84828501611a75565b91505092915050565b611bac816125a4565b82525050565b611bbb816125b6565b82525050565b611bca816125c2565b82525050565b6000611bdb82612532565b611be5818561253d565b9350611bf5818560208601612603565b611bfe816126c6565b840191505092915050565b6000611c1660238361253d565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611c7c60148361253d565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000611cbc60228361253d565b91507f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008301527f63650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611d2260298361253d565b91507f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060008301527f6e6577206f776e657200000000000000000000000000000000000000000000006020830152604082019050919050565b6000611d8860228361253d565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611dee601d8361253d565b91507f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006000830152602082019050919050565b6000611e2e60268361253d565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611e9460108361253d565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b6000611ed460238361253d565b91507f544f544f3a206d7573742068617665206d696e74657220726f6c6520746f206d60008301527f696e7400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611f3a60208361253d565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000611f7a60238361253d565b91507f544f544f3a206d7573742068617665206275726e657220726f6c6520746f206260008301527f75726e00000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611fe060218361253d565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061204660258361253d565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006120ac60248361253d565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061211260188361253d565b91507f43616e27742072656e6f756e6365206f776e65727368697000000000000000006000830152602082019050919050565b600061215260188361253d565b91507f544f544f3a2045786365656473206d617820737570706c7900000000000000006000830152602082019050919050565b600061219260258361253d565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006121f8601f8361253d565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b612234816125ec565b82525050565b612243816125f6565b82525050565b600060208201905061225e6000830184611ba3565b92915050565b60006020820190506122796000830184611bb2565b92915050565b60006020820190506122946000830184611bc1565b92915050565b600060208201905081810360008301526122b48184611bd0565b905092915050565b600060208201905081810360008301526122d581611c09565b9050919050565b600060208201905081810360008301526122f581611c6f565b9050919050565b6000602082019050818103600083015261231581611caf565b9050919050565b6000602082019050818103600083015261233581611d15565b9050919050565b6000602082019050818103600083015261235581611d7b565b9050919050565b6000602082019050818103600083015261237581611de1565b9050919050565b6000602082019050818103600083015261239581611e21565b9050919050565b600060208201905081810360008301526123b581611e87565b9050919050565b600060208201905081810360008301526123d581611ec7565b9050919050565b600060208201905081810360008301526123f581611f2d565b9050919050565b6000602082019050818103600083015261241581611f6d565b9050919050565b6000602082019050818103600083015261243581611fd3565b9050919050565b6000602082019050818103600083015261245581612039565b9050919050565b600060208201905081810360008301526124758161209f565b9050919050565b6000602082019050818103600083015261249581612105565b9050919050565b600060208201905081810360008301526124b581612145565b9050919050565b600060208201905081810360008301526124d581612185565b9050919050565b600060208201905081810360008301526124f5816121eb565b9050919050565b6000602082019050612511600083018461222b565b92915050565b600060208201905061252c600083018461223a565b92915050565b600081519050919050565b600082825260208201905092915050565b6000612559826125ec565b9150612564836125ec565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561259957612598612668565b5b828201905092915050565b60006125af826125cc565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015612621578082015181840152602081019050612606565b83811115612630576000848401525b50505050565b6000600282049050600182168061264e57607f821691505b6020821081141561266257612661612697565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b6126e0816125a4565b81146126eb57600080fd5b50565b6126f7816125ec565b811461270257600080fd5b5056fea26469706673582212208002a11f105c90c27da3666e7ba02e988febadba8ca663e306d3df35a812ce8864736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063715018a611610104578063a9059cbb116100a2578063e30c397811610071578063e30c39781461050a578063f2fde38b14610528578063f3ee4ae814610544578063fb35a24a14610560576101cf565b8063a9059cbb14610472578063c218d3f5146104a2578063cc16cd29146104be578063dd62ed3e146104da576101cf565b80638da5cb5b116100de5780638da5cb5b146103d657806392133cde146103f457806395d89b4114610424578063a457c2d714610442576101cf565b8063715018a6146103b857806379ba5097146103c25780638456cb59146103cc576101cf565b806332cb6b0c1161017157806340c10f191161014b57806340c10f191461033257806342966c681461034e5780635c975abb1461036a57806370a0823114610388576101cf565b806332cb6b0c146102da57806339509351146102f85780633f4ba83a14610328576101cf565b806323b872dd116101ad57806323b872dd146102405780632de274dc14610270578063313ce5671461028c57806332c45954146102aa576101cf565b806306fdde03146101d4578063095ea7b3146101f257806318160ddd14610222575b600080fd5b6101dc610590565b6040516101e9919061229a565b60405180910390f35b61020c60048036038101906102079190611b3e565b610622565b6040516102199190612264565b60405180910390f35b61022a610645565b60405161023791906124fc565b60405180910390f35b61025a60048036038101906102559190611aef565b61064f565b6040516102679190612264565b60405180910390f35b61028a60048036038101906102859190611a8a565b61067e565b005b6102946106b3565b6040516102a19190612517565b60405180910390f35b6102c460048036038101906102bf9190611a8a565b6106bc565b6040516102d19190612264565b60405180910390f35b6102e2610727565b6040516102ef91906124fc565b60405180910390f35b610312600480360381019061030d9190611b3e565b61074b565b60405161031f9190612264565b60405180910390f35b610330610782565b005b61034c60048036038101906103479190611b3e565b610794565b005b61036860048036038101906103639190611b7a565b61086e565b005b6103726108d9565b60405161037f9190612264565b60405180910390f35b6103a2600480360381019061039d9190611a8a565b6108f0565b6040516103af91906124fc565b60405180910390f35b6103c0610938565b005b6103ca610983565b005b6103d4610a10565b005b6103de610a22565b6040516103eb9190612249565b60405180910390f35b61040e60048036038101906104099190611a8a565b610a4c565b60405161041b9190612264565b60405180910390f35b61042c610b20565b604051610439919061229a565b60405180910390f35b61045c60048036038101906104579190611b3e565b610bb2565b6040516104699190612264565b60405180910390f35b61048c60048036038101906104879190611b3e565b610c29565b6040516104999190612264565b60405180910390f35b6104bc60048036038101906104b79190611a8a565b610c4c565b005b6104d860048036038101906104d39190611a8a565b610c64565b005b6104f460048036038101906104ef9190611ab3565b610c99565b60405161050191906124fc565b60405180910390f35b610512610d20565b60405161051f9190612249565b60405180910390f35b610542600480360381019061053d9190611a8a565b610d4a565b005b61055e60048036038101906105599190611a8a565b610df7565b005b61057a60048036038101906105759190611a8a565b610e2c565b6040516105879190612264565b60405180910390f35b60606003805461059f90612636565b80601f01602080910402602001604051908101604052809291908181526020018280546105cb90612636565b80156106185780601f106105ed57610100808354040283529160200191610618565b820191906000526020600020905b8154815290600101906020018083116105fb57829003601f168201915b5050505050905090565b60008061062d610fc6565b905061063a818585610fce565b600191505092915050565b6000600254905090565b60008061065a610fc6565b9050610667858285611199565b6106728585856111fd565b60019150509392505050565b610686611475565b6106b0817f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8486114f3565b50565b60006009905090565b60007f553c15132cdbfb2f7255bedd79fb0e91b615777da29e2ed768297cd19eef47b0600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054149050919050565b7f0000000000000000000000000000000000000000000000000de0b6b3a764000081565b600080610756610fc6565b90506107778185856107688589610c99565b610772919061254e565b610fce565b600191505092915050565b61078a611475565b6107926115a7565b565b61079c61160a565b6107ac6107a7610fc6565b610a4c565b6107eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e2906123bc565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000de0b6b3a764000081610815610645565b61081f919061254e565b1115610860576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108579061249c565b60405180910390fd5b61086a8282611654565b5050565b61087661160a565b610886610881610fc6565b610e2c565b6108c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108bc906123fc565b60405180910390fd5b6108d66108d0610fc6565b826117ab565b50565b6000600660149054906101000a900460ff16905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610940611475565b6000610981576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109789061247c565b60405180910390fd5b565b600061098d610fc6565b90508073ffffffffffffffffffffffffffffffffffffffff166109ae610d20565b73ffffffffffffffffffffffffffffffffffffffff1614610a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fb9061231c565b60405180910390fd5b610a0d81611979565b50565b610a18611475565b610a206119aa565b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f553c15132cdbfb2f7255bedd79fb0e91b615777da29e2ed768297cd19eef47b0600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541480610b1957507f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b9050919050565b606060048054610b2f90612636565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5b90612636565b8015610ba85780601f10610b7d57610100808354040283529160200191610ba8565b820191906000526020600020905b815481529060010190602001808311610b8b57829003601f168201915b5050505050905090565b600080610bbd610fc6565b90506000610bcb8286610c99565b905083811015610c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c07906124bc565b60405180910390fd5b610c1d8286868403610fce565b60019250505092915050565b600080610c34610fc6565b9050610c418185856111fd565b600191505092915050565b610c54611475565b610c61816000801b6114f3565b50565b610c6c611475565b610c96817f553c15132cdbfb2f7255bedd79fb0e91b615777da29e2ed768297cd19eef47b06114f3565b50565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610d52611475565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16610db2610a22565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610dff611475565b610e29817f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66114f3565b50565b60007f553c15132cdbfb2f7255bedd79fb0e91b615777da29e2ed768297cd19eef47b0600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541480610ef957507f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b9050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561103e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110359061245c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a59061233c565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161118c91906124fc565b60405180910390a3505050565b60006111a58484610c99565b9050818110156111ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e19061235c565b60405180910390fd5b6111f78484848403610fce565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561126d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112649061243c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d4906122bc565b60405180910390fd5b6112e8838383611a0d565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561136e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113659061237c565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161145c91906124fc565b60405180910390a361146f848484611a12565b50505050565b61147d610fc6565b73ffffffffffffffffffffffffffffffffffffffff1661149b610a22565b73ffffffffffffffffffffffffffffffffffffffff16146114f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e8906123dc565b60405180910390fd5b565b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16611556610fc6565b73ffffffffffffffffffffffffffffffffffffffff167fd28d432cd3cb121b26fcde65ca5044c180251288d4541912260743531d91398a8360405161159b919061227f565b60405180910390a35050565b6115af611a17565b6000600660146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6115f3610fc6565b6040516116009190612249565b60405180910390a1565b6116126108d9565b15611652576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116499061239c565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bb906124dc565b60405180910390fd5b6116d060008383611a0d565b80600260008282546116e2919061254e565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161179391906124fc565b60405180910390a36117a760008383611a12565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561181b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118129061241c565b60405180910390fd5b61182782600083611a0d565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156118ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a4906122fc565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161196091906124fc565b60405180910390a361197483600084611a12565b505050565b600660006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556119a781610f00565b50565b6119b261160a565b6001600660146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586119f6610fc6565b604051611a039190612249565b60405180910390a1565b505050565b505050565b611a1f6108d9565b611a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a55906122dc565b60405180910390fd5b565b600081359050611a6f816126d7565b92915050565b600081359050611a84816126ee565b92915050565b600060208284031215611a9c57600080fd5b6000611aaa84828501611a60565b91505092915050565b60008060408385031215611ac657600080fd5b6000611ad485828601611a60565b9250506020611ae585828601611a60565b9150509250929050565b600080600060608486031215611b0457600080fd5b6000611b1286828701611a60565b9350506020611b2386828701611a60565b9250506040611b3486828701611a75565b9150509250925092565b60008060408385031215611b5157600080fd5b6000611b5f85828601611a60565b9250506020611b7085828601611a75565b9150509250929050565b600060208284031215611b8c57600080fd5b6000611b9a84828501611a75565b91505092915050565b611bac816125a4565b82525050565b611bbb816125b6565b82525050565b611bca816125c2565b82525050565b6000611bdb82612532565b611be5818561253d565b9350611bf5818560208601612603565b611bfe816126c6565b840191505092915050565b6000611c1660238361253d565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611c7c60148361253d565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000611cbc60228361253d565b91507f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008301527f63650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611d2260298361253d565b91507f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060008301527f6e6577206f776e657200000000000000000000000000000000000000000000006020830152604082019050919050565b6000611d8860228361253d565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611dee601d8361253d565b91507f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006000830152602082019050919050565b6000611e2e60268361253d565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611e9460108361253d565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b6000611ed460238361253d565b91507f544f544f3a206d7573742068617665206d696e74657220726f6c6520746f206d60008301527f696e7400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611f3a60208361253d565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000611f7a60238361253d565b91507f544f544f3a206d7573742068617665206275726e657220726f6c6520746f206260008301527f75726e00000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611fe060218361253d565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061204660258361253d565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006120ac60248361253d565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061211260188361253d565b91507f43616e27742072656e6f756e6365206f776e65727368697000000000000000006000830152602082019050919050565b600061215260188361253d565b91507f544f544f3a2045786365656473206d617820737570706c7900000000000000006000830152602082019050919050565b600061219260258361253d565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006121f8601f8361253d565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b612234816125ec565b82525050565b612243816125f6565b82525050565b600060208201905061225e6000830184611ba3565b92915050565b60006020820190506122796000830184611bb2565b92915050565b60006020820190506122946000830184611bc1565b92915050565b600060208201905081810360008301526122b48184611bd0565b905092915050565b600060208201905081810360008301526122d581611c09565b9050919050565b600060208201905081810360008301526122f581611c6f565b9050919050565b6000602082019050818103600083015261231581611caf565b9050919050565b6000602082019050818103600083015261233581611d15565b9050919050565b6000602082019050818103600083015261235581611d7b565b9050919050565b6000602082019050818103600083015261237581611de1565b9050919050565b6000602082019050818103600083015261239581611e21565b9050919050565b600060208201905081810360008301526123b581611e87565b9050919050565b600060208201905081810360008301526123d581611ec7565b9050919050565b600060208201905081810360008301526123f581611f2d565b9050919050565b6000602082019050818103600083015261241581611f6d565b9050919050565b6000602082019050818103600083015261243581611fd3565b9050919050565b6000602082019050818103600083015261245581612039565b9050919050565b600060208201905081810360008301526124758161209f565b9050919050565b6000602082019050818103600083015261249581612105565b9050919050565b600060208201905081810360008301526124b581612145565b9050919050565b600060208201905081810360008301526124d581612185565b9050919050565b600060208201905081810360008301526124f5816121eb565b9050919050565b6000602082019050612511600083018461222b565b92915050565b600060208201905061252c600083018461223a565b92915050565b600081519050919050565b600082825260208201905092915050565b6000612559826125ec565b9150612564836125ec565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561259957612598612668565b5b828201905092915050565b60006125af826125cc565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015612621578082015181840152602081019050612606565b83811115612630576000848401525b50505050565b6000600282049050600182168061264e57607f821691505b6020821081141561266257612661612697565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b6126e0816125a4565b81146126eb57600080fd5b50565b6126f7816125ec565b811461270257600080fd5b5056fea26469706673582212208002a11f105c90c27da3666e7ba02e988febadba8ca663e306d3df35a812ce8864736f6c63430008000033

Deployed Bytecode Sourcemap

768:2437:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2137:98:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4423:197;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3234:106;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5182:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2130:126:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1224:82:11;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3544:173:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;874:35:11;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5833:234:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1577:65:10;;;:::i;:::-;;1718:339:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2448:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1608:84:8;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3398:125:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1243:119:10;;;:::i;:::-;;1734:212:7;;;:::i;:::-;;1438:61:10;;;:::i;:::-;;1194:85:6;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2899:207:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2348:102:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6554:427;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3719:189;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2668:128:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2396:140;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3966:149:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;847:99:7;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1139:178;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1823:126:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3209:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2137:98:2;2191:13;2223:5;2216:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2137:98;:::o;4423:197::-;4506:4;4522:13;4538:12;:10;:12::i;:::-;4522:28;;4560:32;4569:5;4576:7;4585:6;4560:8;:32::i;:::-;4609:4;4602:11;;;4423:197;;;;:::o;3234:106::-;3295:7;3321:12;;3314:19;;3234:106;:::o;5182:256::-;5279:4;5295:15;5313:12;:10;:12::i;:::-;5295:30;;5335:38;5351:4;5357:7;5366:6;5335:15;:38::i;:::-;5383:27;5393:4;5399:2;5403:6;5383:9;:27::i;:::-;5427:4;5420:11;;;5182:256;;;;;:::o;2130:126:10:-;1087:13:6;:11;:13::i;:::-;2210:39:10::1;2227:8;868:24;2210:16;:39::i;:::-;2130:126:::0;:::o;1224:82:11:-;1274:5;1298:1;1291:8;;1224:82;:::o;3544:173:10:-;3635:4;957:35;3658:16;:26;3675:8;3658:26;;;;;;;;;;;;;;;;:52;3651:59;;3544:173;;;:::o;874:35:11:-;;;:::o;5833:234:2:-;5921:4;5937:13;5953:12;:10;:12::i;:::-;5937:28;;5975:64;5984:5;5991:7;6028:10;6000:25;6010:5;6017:7;6000:9;:25::i;:::-;:38;;;;:::i;:::-;5975:8;:64::i;:::-;6056:4;6049:11;;;5833:234;;;;:::o;1577:65:10:-;1087:13:6;:11;:13::i;:::-;1625:10:10::1;:8;:10::i;:::-;1577:65::o:0;1718:339:11:-;1232:19:8;:17;:19::i;:::-;1814:31:11::1;1832:12;:10;:12::i;:::-;1814:17;:31::i;:::-;1793:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;1963:10;1953:6;1937:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;1916:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;2033:17;2039:2;2043:6;2033:5;:17::i;:::-;1718:339:::0;;:::o;2448:220::-;1232:19:8;:17;:19::i;:::-;2532:31:11::1;2550:12;:10;:12::i;:::-;2532:17;:31::i;:::-;2511:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;2634:27;2640:12;:10;:12::i;:::-;2654:6;2634:5;:27::i;:::-;2448:220:::0;:::o;1608:84:8:-;1655:4;1678:7;;;;;;;;;;;1671:14;;1608:84;:::o;3398:125:2:-;3472:7;3498:9;:18;3508:7;3498:18;;;;;;;;;;;;;;;;3491:25;;3398:125;;;:::o;1243:119:10:-;1087:13:6;:11;:13::i;:::-;1321:5:10::1;1313:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;1243:119::o:0;1734:212:7:-;1786:14;1803:12;:10;:12::i;:::-;1786:29;;1851:6;1833:24;;:14;:12;:14::i;:::-;:24;;;1825:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;1913:26;1932:6;1913:18;:26::i;:::-;1734:212;:::o;1438:61:10:-;1087:13:6;:11;:13::i;:::-;1484:8:10::1;:6;:8::i;:::-;1438:61::o:0;1194:85:6:-;1240:7;1266:6;;;;;;;;;;;1259:13;;1194:85;:::o;2899:207:10:-;2965:4;957:35;2989:16;:26;3006:8;2989:26;;;;;;;;;;;;;;;;:52;:109;;;;798:24;3057:16;:26;3074:8;3057:26;;;;;;;;;;;;;;;;:41;2989:109;2981:118;;2899:207;;;:::o;2348:102:2:-;2404:13;2436:7;2429:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2348:102;:::o;6554:427::-;6647:4;6663:13;6679:12;:10;:12::i;:::-;6663:28;;6701:24;6728:25;6738:5;6745:7;6728:9;:25::i;:::-;6701:52;;6791:15;6771:16;:35;;6763:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;6882:60;6891:5;6898:7;6926:15;6907:16;:34;6882:8;:60::i;:::-;6970:4;6963:11;;;;6554:427;;;;:::o;3719:189::-;3798:4;3814:13;3830:12;:10;:12::i;:::-;3814:28;;3852;3862:5;3869:2;3873:6;3852:9;:28::i;:::-;3897:4;3890:11;;;3719:189;;;;:::o;2668:128:10:-;1087:13:6;:11;:13::i;:::-;2751:38:10::1;2768:8;2786:1;2778:10:::0;::::1;2751:16;:38::i;:::-;2668:128:::0;:::o;2396:140::-;1087:13:6;:11;:13::i;:::-;2479:50:10::1;2496:8;957:35;2479:16;:50::i;:::-;2396:140:::0;:::o;3966:149:2:-;4055:7;4081:11;:18;4093:5;4081:18;;;;;;;;;;;;;;;:27;4100:7;4081:27;;;;;;;;;;;;;;;;4074:34;;3966:149;;;;:::o;847:99:7:-;900:7;926:13;;;;;;;;;;;919:20;;847:99;:::o;1139:178::-;1087:13:6;:11;:13::i;:::-;1244:8:7::1;1228:13;;:24;;;;;;;;;;;;;;;;;;1301:8;1267:43;;1292:7;:5;:7::i;:::-;1267:43;;;;;;;;;;;;1139:178:::0;:::o;1823:126:10:-;1087:13:6;:11;:13::i;:::-;1903:39:10::1;1920:8;798:24;1903:16;:39::i;:::-;1823:126:::0;:::o;3209:207::-;3275:4;957:35;3299:16;:26;3316:8;3299:26;;;;;;;;;;;;;;;;:52;:109;;;;868:24;3367:16;:26;3384:8;3367:26;;;;;;;;;;;;;;;;:41;3299:109;3291:118;;3209:207;;;:::o;2419:187:6:-;2492:16;2511:6;;;;;;;;;;;2492:25;;2536:8;2527:6;;:17;;;;;;;;;;;;;;;;;;2590:8;2559:40;;2580:8;2559:40;;;;;;;;;;;;2419:187;;:::o;655:96:1:-;708:7;734:10;727:17;;655:96;:::o;10436:340:2:-;10554:1;10537:19;;:5;:19;;;;10529:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10634:1;10615:21;;:7;:21;;;;10607:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10716:6;10686:11;:18;10698:5;10686:18;;;;;;;;;;;;;;;:27;10705:7;10686:27;;;;;;;;;;;;;;;:36;;;;10753:7;10737:32;;10746:5;10737:32;;;10762:6;10737:32;;;;;;:::i;:::-;;;;;;;;10436:340;;;:::o;2840:363:11:-;2971:24;2998:25;3008:5;3015:7;2998:9;:25::i;:::-;2971:52;;3061:6;3041:16;:26;;3033:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3135:51;3144:5;3151:7;3179:6;3160:16;:25;3135:8;:51::i;:::-;2840:363;;;;:::o;7435:788:2:-;7547:1;7531:18;;:4;:18;;;;7523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7623:1;7609:16;;:2;:16;;;;7601:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;7676:38;7697:4;7703:2;7707:6;7676:20;:38::i;:::-;7725:19;7747:9;:15;7757:4;7747:15;;;;;;;;;;;;;;;;7725:37;;7795:6;7780:11;:21;;7772:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;7910:6;7896:11;:20;7878:9;:15;7888:4;7878:15;;;;;;;;;;;;;;;:38;;;;8110:6;8093:9;:13;8103:2;8093:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;8157:2;8142:26;;8151:4;8142:26;;;8161:6;8142:26;;;;;;:::i;:::-;;;;;;;;8179:37;8199:4;8205:2;8209:6;8179:19;:37::i;:::-;7435:788;;;;:::o;1352:130:6:-;1426:12;:10;:12::i;:::-;1415:23;;:7;:5;:7::i;:::-;:23;;;1407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1352:130::o;3811:176:10:-;3918:5;3889:16;:26;3906:8;3889:26;;;;;;;;;;;;;;;:34;;;;3964:8;3938:42;;3950:12;:10;:12::i;:::-;3938:42;;;3974:5;3938:42;;;;;;:::i;:::-;;;;;;;;3811:176;;:::o;2426:117:8:-;1479:16;:14;:16::i;:::-;2494:5:::1;2484:7;;:15;;;;;;;;;;;;;;;;;;2514:22;2523:12;:10;:12::i;:::-;2514:22;;;;;;:::i;:::-;;;;;;;;2426:117::o:0;1760:106::-;1830:8;:6;:8::i;:::-;1829:9;1821:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;1760:106::o;8499:535:2:-;8601:1;8582:21;;:7;:21;;;;8574:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;8650:49;8679:1;8683:7;8692:6;8650:20;:49::i;:::-;8726:6;8710:12;;:22;;;;;;;:::i;:::-;;;;;;;;8900:6;8878:9;:18;8888:7;8878:18;;;;;;;;;;;;;;;;:28;;;;;;;;;;;8952:7;8931:37;;8948:1;8931:37;;;8961:6;8931:37;;;;;;:::i;:::-;;;;;;;;8979:48;9007:1;9011:7;9020:6;8979:19;:48::i;:::-;8499:535;;:::o;9354:659::-;9456:1;9437:21;;:7;:21;;;;9429:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;9507:49;9528:7;9545:1;9549:6;9507:20;:49::i;:::-;9567:22;9592:9;:18;9602:7;9592:18;;;;;;;;;;;;;;;;9567:43;;9646:6;9628:14;:24;;9620:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;9763:6;9746:14;:23;9725:9;:18;9735:7;9725:18;;;;;;;;;;;;;;;:44;;;;9878:6;9862:12;;:22;;;;;;;;;;;9936:1;9910:37;;9919:7;9910:37;;;9940:6;9910:37;;;;;;:::i;:::-;;;;;;;;9958:48;9978:7;9995:1;9999:6;9958:19;:48::i;:::-;9354:659;;;:::o;1501:153:7:-;1590:13;;1583:20;;;;;;;;;;;1613:34;1638:8;1613:24;:34::i;:::-;1501:153;:::o;2179:115:8:-;1232:19;:17;:19::i;:::-;2248:4:::1;2238:7;;:14;;;;;;;;;;;;;;;;;;2267:20;2274:12;:10;:12::i;:::-;2267:20;;;;;;:::i;:::-;;;;;;;;2179:115::o:0;12052:91:2:-;;;;:::o;12731:90::-;;;;:::o;1938:106:8:-;2004:8;:6;:8::i;:::-;1996:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;1938:106::o;7:139:12:-;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:139::-;;236:6;223:20;214:29;;252:33;279:5;252:33;:::i;:::-;204:87;;;;:::o;297:262::-;;405:2;393:9;384:7;380:23;376:32;373:2;;;421:1;418;411:12;373:2;464:1;489:53;534:7;525:6;514:9;510:22;489:53;:::i;:::-;479:63;;435:117;363:196;;;;:::o;565:407::-;;;690:2;678:9;669:7;665:23;661:32;658:2;;;706:1;703;696:12;658:2;749:1;774:53;819:7;810:6;799:9;795:22;774:53;:::i;:::-;764:63;;720:117;876:2;902:53;947:7;938:6;927:9;923:22;902:53;:::i;:::-;892:63;;847:118;648:324;;;;;:::o;978:552::-;;;;1120:2;1108:9;1099:7;1095:23;1091:32;1088:2;;;1136:1;1133;1126:12;1088:2;1179:1;1204:53;1249:7;1240:6;1229:9;1225:22;1204:53;:::i;:::-;1194:63;;1150:117;1306:2;1332:53;1377:7;1368:6;1357:9;1353:22;1332:53;:::i;:::-;1322:63;;1277:118;1434:2;1460:53;1505:7;1496:6;1485:9;1481:22;1460:53;:::i;:::-;1450:63;;1405:118;1078:452;;;;;:::o;1536:407::-;;;1661:2;1649:9;1640:7;1636:23;1632:32;1629:2;;;1677:1;1674;1667:12;1629:2;1720:1;1745:53;1790:7;1781:6;1770:9;1766:22;1745:53;:::i;:::-;1735:63;;1691:117;1847:2;1873:53;1918:7;1909:6;1898:9;1894:22;1873:53;:::i;:::-;1863:63;;1818:118;1619:324;;;;;:::o;1949:262::-;;2057:2;2045:9;2036:7;2032:23;2028:32;2025:2;;;2073:1;2070;2063:12;2025:2;2116:1;2141:53;2186:7;2177:6;2166:9;2162:22;2141:53;:::i;:::-;2131:63;;2087:117;2015:196;;;;:::o;2217:118::-;2304:24;2322:5;2304:24;:::i;:::-;2299:3;2292:37;2282:53;;:::o;2341:109::-;2422:21;2437:5;2422:21;:::i;:::-;2417:3;2410:34;2400:50;;:::o;2456:118::-;2543:24;2561:5;2543:24;:::i;:::-;2538:3;2531:37;2521:53;;:::o;2580:364::-;;2696:39;2729:5;2696:39;:::i;:::-;2751:71;2815:6;2810:3;2751:71;:::i;:::-;2744:78;;2831:52;2876:6;2871:3;2864:4;2857:5;2853:16;2831:52;:::i;:::-;2908:29;2930:6;2908:29;:::i;:::-;2903:3;2899:39;2892:46;;2672:272;;;;;:::o;2950:367::-;;3113:67;3177:2;3172:3;3113:67;:::i;:::-;3106:74;;3210:34;3206:1;3201:3;3197:11;3190:55;3276:5;3271:2;3266:3;3262:12;3255:27;3308:2;3303:3;3299:12;3292:19;;3096:221;;;:::o;3323:318::-;;3486:67;3550:2;3545:3;3486:67;:::i;:::-;3479:74;;3583:22;3579:1;3574:3;3570:11;3563:43;3632:2;3627:3;3623:12;3616:19;;3469:172;;;:::o;3647:366::-;;3810:67;3874:2;3869:3;3810:67;:::i;:::-;3803:74;;3907:34;3903:1;3898:3;3894:11;3887:55;3973:4;3968:2;3963:3;3959:12;3952:26;4004:2;3999:3;3995:12;3988:19;;3793:220;;;:::o;4019:373::-;;4182:67;4246:2;4241:3;4182:67;:::i;:::-;4175:74;;4279:34;4275:1;4270:3;4266:11;4259:55;4345:11;4340:2;4335:3;4331:12;4324:33;4383:2;4378:3;4374:12;4367:19;;4165:227;;;:::o;4398:366::-;;4561:67;4625:2;4620:3;4561:67;:::i;:::-;4554:74;;4658:34;4654:1;4649:3;4645:11;4638:55;4724:4;4719:2;4714:3;4710:12;4703:26;4755:2;4750:3;4746:12;4739:19;;4544:220;;;:::o;4770:327::-;;4933:67;4997:2;4992:3;4933:67;:::i;:::-;4926:74;;5030:31;5026:1;5021:3;5017:11;5010:52;5088:2;5083:3;5079:12;5072:19;;4916:181;;;:::o;5103:370::-;;5266:67;5330:2;5325:3;5266:67;:::i;:::-;5259:74;;5363:34;5359:1;5354:3;5350:11;5343:55;5429:8;5424:2;5419:3;5415:12;5408:30;5464:2;5459:3;5455:12;5448:19;;5249:224;;;:::o;5479:314::-;;5642:67;5706:2;5701:3;5642:67;:::i;:::-;5635:74;;5739:18;5735:1;5730:3;5726:11;5719:39;5784:2;5779:3;5775:12;5768:19;;5625:168;;;:::o;5799:367::-;;5962:67;6026:2;6021:3;5962:67;:::i;:::-;5955:74;;6059:34;6055:1;6050:3;6046:11;6039:55;6125:5;6120:2;6115:3;6111:12;6104:27;6157:2;6152:3;6148:12;6141:19;;5945:221;;;:::o;6172:330::-;;6335:67;6399:2;6394:3;6335:67;:::i;:::-;6328:74;;6432:34;6428:1;6423:3;6419:11;6412:55;6493:2;6488:3;6484:12;6477:19;;6318:184;;;:::o;6508:367::-;;6671:67;6735:2;6730:3;6671:67;:::i;:::-;6664:74;;6768:34;6764:1;6759:3;6755:11;6748:55;6834:5;6829:2;6824:3;6820:12;6813:27;6866:2;6861:3;6857:12;6850:19;;6654:221;;;:::o;6881:365::-;;7044:67;7108:2;7103:3;7044:67;:::i;:::-;7037:74;;7141:34;7137:1;7132:3;7128:11;7121:55;7207:3;7202:2;7197:3;7193:12;7186:25;7237:2;7232:3;7228:12;7221:19;;7027:219;;;:::o;7252:369::-;;7415:67;7479:2;7474:3;7415:67;:::i;:::-;7408:74;;7512:34;7508:1;7503:3;7499:11;7492:55;7578:7;7573:2;7568:3;7564:12;7557:29;7612:2;7607:3;7603:12;7596:19;;7398:223;;;:::o;7627:368::-;;7790:67;7854:2;7849:3;7790:67;:::i;:::-;7783:74;;7887:34;7883:1;7878:3;7874:11;7867:55;7953:6;7948:2;7943:3;7939:12;7932:28;7986:2;7981:3;7977:12;7970:19;;7773:222;;;:::o;8001:322::-;;8164:67;8228:2;8223:3;8164:67;:::i;:::-;8157:74;;8261:26;8257:1;8252:3;8248:11;8241:47;8314:2;8309:3;8305:12;8298:19;;8147:176;;;:::o;8329:322::-;;8492:67;8556:2;8551:3;8492:67;:::i;:::-;8485:74;;8589:26;8585:1;8580:3;8576:11;8569:47;8642:2;8637:3;8633:12;8626:19;;8475:176;;;:::o;8657:369::-;;8820:67;8884:2;8879:3;8820:67;:::i;:::-;8813:74;;8917:34;8913:1;8908:3;8904:11;8897:55;8983:7;8978:2;8973:3;8969:12;8962:29;9017:2;9012:3;9008:12;9001:19;;8803:223;;;:::o;9032:329::-;;9195:67;9259:2;9254:3;9195:67;:::i;:::-;9188:74;;9292:33;9288:1;9283:3;9279:11;9272:54;9352:2;9347:3;9343:12;9336:19;;9178:183;;;:::o;9367:118::-;9454:24;9472:5;9454:24;:::i;:::-;9449:3;9442:37;9432:53;;:::o;9491:112::-;9574:22;9590:5;9574:22;:::i;:::-;9569:3;9562:35;9552:51;;:::o;9609:222::-;;9740:2;9729:9;9725:18;9717:26;;9753:71;9821:1;9810:9;9806:17;9797:6;9753:71;:::i;:::-;9707:124;;;;:::o;9837:210::-;;9962:2;9951:9;9947:18;9939:26;;9975:65;10037:1;10026:9;10022:17;10013:6;9975:65;:::i;:::-;9929:118;;;;:::o;10053:222::-;;10184:2;10173:9;10169:18;10161:26;;10197:71;10265:1;10254:9;10250:17;10241:6;10197:71;:::i;:::-;10151:124;;;;:::o;10281:313::-;;10432:2;10421:9;10417:18;10409:26;;10481:9;10475:4;10471:20;10467:1;10456:9;10452:17;10445:47;10509:78;10582:4;10573:6;10509:78;:::i;:::-;10501:86;;10399:195;;;;:::o;10600:419::-;;10804:2;10793:9;10789:18;10781:26;;10853:9;10847:4;10843:20;10839:1;10828:9;10824:17;10817:47;10881:131;11007:4;10881:131;:::i;:::-;10873:139;;10771:248;;;:::o;11025:419::-;;11229:2;11218:9;11214:18;11206:26;;11278:9;11272:4;11268:20;11264:1;11253:9;11249:17;11242:47;11306:131;11432:4;11306:131;:::i;:::-;11298:139;;11196:248;;;:::o;11450:419::-;;11654:2;11643:9;11639:18;11631:26;;11703:9;11697:4;11693:20;11689:1;11678:9;11674:17;11667:47;11731:131;11857:4;11731:131;:::i;:::-;11723:139;;11621:248;;;:::o;11875:419::-;;12079:2;12068:9;12064:18;12056:26;;12128:9;12122:4;12118:20;12114:1;12103:9;12099:17;12092:47;12156:131;12282:4;12156:131;:::i;:::-;12148:139;;12046:248;;;:::o;12300:419::-;;12504:2;12493:9;12489:18;12481:26;;12553:9;12547:4;12543:20;12539:1;12528:9;12524:17;12517:47;12581:131;12707:4;12581:131;:::i;:::-;12573:139;;12471:248;;;:::o;12725:419::-;;12929:2;12918:9;12914:18;12906:26;;12978:9;12972:4;12968:20;12964:1;12953:9;12949:17;12942:47;13006:131;13132:4;13006:131;:::i;:::-;12998:139;;12896:248;;;:::o;13150:419::-;;13354:2;13343:9;13339:18;13331:26;;13403:9;13397:4;13393:20;13389:1;13378:9;13374:17;13367:47;13431:131;13557:4;13431:131;:::i;:::-;13423:139;;13321:248;;;:::o;13575:419::-;;13779:2;13768:9;13764:18;13756:26;;13828:9;13822:4;13818:20;13814:1;13803:9;13799:17;13792:47;13856:131;13982:4;13856:131;:::i;:::-;13848:139;;13746:248;;;:::o;14000:419::-;;14204:2;14193:9;14189:18;14181:26;;14253:9;14247:4;14243:20;14239:1;14228:9;14224:17;14217:47;14281:131;14407:4;14281:131;:::i;:::-;14273:139;;14171:248;;;:::o;14425:419::-;;14629:2;14618:9;14614:18;14606:26;;14678:9;14672:4;14668:20;14664:1;14653:9;14649:17;14642:47;14706:131;14832:4;14706:131;:::i;:::-;14698:139;;14596:248;;;:::o;14850:419::-;;15054:2;15043:9;15039:18;15031:26;;15103:9;15097:4;15093:20;15089:1;15078:9;15074:17;15067:47;15131:131;15257:4;15131:131;:::i;:::-;15123:139;;15021:248;;;:::o;15275:419::-;;15479:2;15468:9;15464:18;15456:26;;15528:9;15522:4;15518:20;15514:1;15503:9;15499:17;15492:47;15556:131;15682:4;15556:131;:::i;:::-;15548:139;;15446:248;;;:::o;15700:419::-;;15904:2;15893:9;15889:18;15881:26;;15953:9;15947:4;15943:20;15939:1;15928:9;15924:17;15917:47;15981:131;16107:4;15981:131;:::i;:::-;15973:139;;15871:248;;;:::o;16125:419::-;;16329:2;16318:9;16314:18;16306:26;;16378:9;16372:4;16368:20;16364:1;16353:9;16349:17;16342:47;16406:131;16532:4;16406:131;:::i;:::-;16398:139;;16296:248;;;:::o;16550:419::-;;16754:2;16743:9;16739:18;16731:26;;16803:9;16797:4;16793:20;16789:1;16778:9;16774:17;16767:47;16831:131;16957:4;16831:131;:::i;:::-;16823:139;;16721:248;;;:::o;16975:419::-;;17179:2;17168:9;17164:18;17156:26;;17228:9;17222:4;17218:20;17214:1;17203:9;17199:17;17192:47;17256:131;17382:4;17256:131;:::i;:::-;17248:139;;17146:248;;;:::o;17400:419::-;;17604:2;17593:9;17589:18;17581:26;;17653:9;17647:4;17643:20;17639:1;17628:9;17624:17;17617:47;17681:131;17807:4;17681:131;:::i;:::-;17673:139;;17571:248;;;:::o;17825:419::-;;18029:2;18018:9;18014:18;18006:26;;18078:9;18072:4;18068:20;18064:1;18053:9;18049:17;18042:47;18106:131;18232:4;18106:131;:::i;:::-;18098:139;;17996:248;;;:::o;18250:222::-;;18381:2;18370:9;18366:18;18358:26;;18394:71;18462:1;18451:9;18447:17;18438:6;18394:71;:::i;:::-;18348:124;;;;:::o;18478:214::-;;18605:2;18594:9;18590:18;18582:26;;18618:67;18682:1;18671:9;18667:17;18658:6;18618:67;:::i;:::-;18572:120;;;;:::o;18698:99::-;;18784:5;18778:12;18768:22;;18757:40;;;:::o;18803:169::-;;18921:6;18916:3;18909:19;18961:4;18956:3;18952:14;18937:29;;18899:73;;;;:::o;18978:305::-;;19037:20;19055:1;19037:20;:::i;:::-;19032:25;;19071:20;19089:1;19071:20;:::i;:::-;19066:25;;19225:1;19157:66;19153:74;19150:1;19147:81;19144:2;;;19231:18;;:::i;:::-;19144:2;19275:1;19272;19268:9;19261:16;;19022:261;;;;:::o;19289:96::-;;19355:24;19373:5;19355:24;:::i;:::-;19344:35;;19334:51;;;:::o;19391:90::-;;19468:5;19461:13;19454:21;19443:32;;19433:48;;;:::o;19487:77::-;;19553:5;19542:16;;19532:32;;;:::o;19570:126::-;;19647:42;19640:5;19636:54;19625:65;;19615:81;;;:::o;19702:77::-;;19768:5;19757:16;;19747:32;;;:::o;19785:86::-;;19860:4;19853:5;19849:16;19838:27;;19828:43;;;:::o;19877:307::-;19945:1;19955:113;19969:6;19966:1;19963:13;19955:113;;;20054:1;20049:3;20045:11;20039:18;20035:1;20030:3;20026:11;20019:39;19991:2;19988:1;19984:10;19979:15;;19955:113;;;20086:6;20083:1;20080:13;20077:2;;;20166:1;20157:6;20152:3;20148:16;20141:27;20077:2;19926:258;;;;:::o;20190:320::-;;20271:1;20265:4;20261:12;20251:22;;20318:1;20312:4;20308:12;20339:18;20329:2;;20395:4;20387:6;20383:17;20373:27;;20329:2;20457;20449:6;20446:14;20426:18;20423:38;20420:2;;;20476:18;;:::i;:::-;20420:2;20241:269;;;;:::o;20516:180::-;20564:77;20561:1;20554:88;20661:4;20658:1;20651:15;20685:4;20682:1;20675:15;20702:180;20750:77;20747:1;20740:88;20847:4;20844:1;20837:15;20871:4;20868:1;20861:15;20888:102;;20980:2;20976:7;20971:2;20964:5;20960:14;20956:28;20946:38;;20936:54;;;:::o;20996:122::-;21069:24;21087:5;21069:24;:::i;:::-;21062:5;21059:35;21049:2;;21108:1;21105;21098:12;21049:2;21039:79;:::o;21124:122::-;21197:24;21215:5;21197:24;:::i;:::-;21190:5;21187:35;21177:2;;21236:1;21233;21226:12;21177:2;21167:79;:::o

Swarm Source

ipfs://8002a11f105c90c27da3666e7ba02e988febadba8ca663e306d3df35a812ce88

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

Tiamonds is a Web3 marketplace for tokenized RWA’s like diamonds, gold, lithium & more. These asset-backed NFTs enable secure trading, ownership, and storage with blockchain transparency, authenticated & verified by LCX, and insured vaults—offering a seamless, hassle-free investment experience.

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.