FTM Price: $0.795865 (-1.78%)
Gas: 10 GWei
 

Multichain Info

1 address found via
Transaction Hash
Method
Block
From
To
Value
Approve817604732024-05-28 15:24:412 days ago1716909881IN
DexBrowser: BRO Token
0 FTM0.0009688435.62319773
Transfer811697622024-05-18 13:05:3612 days ago1716037536IN
DexBrowser: BRO Token
0 FTM0.0031368963.82811443
Transfer811197482024-05-17 18:45:3412 days ago1715971534IN
DexBrowser: BRO Token
0 FTM0.00623073110
Transfer808765332024-05-13 14:20:2817 days ago1715610028IN
DexBrowser: BRO Token
0 FTM0.0006565516.96514752
Transfer801603932024-04-29 13:21:0431 days ago1714396864IN
DexBrowser: BRO Token
0 FTM0.0003925210.14578464
Transfer801561632024-04-29 11:10:1431 days ago1714389014IN
DexBrowser: BRO Token
0 FTM0.0010171118.48054603
Approve801249222024-04-28 19:52:0531 days ago1714333925IN
DexBrowser: BRO Token
0 FTM0.0006973228.56482721
Approve800896712024-04-28 0:07:1832 days ago1714262838IN
DexBrowser: BRO Token
0 FTM0.000206978
Approve799761832024-04-25 20:24:0334 days ago1714076643IN
DexBrowser: BRO Token
0 FTM0.0006373913
Transfer799644022024-04-25 16:28:0934 days ago1714062489IN
DexBrowser: BRO Token
0 FTM0.0010180919.63354976
Approve798382642024-04-23 12:55:4537 days ago1713876945IN
DexBrowser: BRO Token
0 FTM0.0010607541
Approve797948552024-04-22 17:38:1537 days ago1713807495IN
DexBrowser: BRO Token
0 FTM0.0009742517.38661461
Approve797844312024-04-22 11:14:3138 days ago1713784471IN
DexBrowser: BRO Token
0 FTM0.0007354515
Approve794678872024-04-16 13:38:4344 days ago1713274723IN
DexBrowser: BRO Token
0 FTM0.0012543826.33649879
Transfer790334442024-04-09 20:45:1550 days ago1712695515IN
DexBrowser: BRO Token
0 FTM0.0043869389.24153476
Transfer789740532024-04-08 22:29:0551 days ago1712615345IN
DexBrowser: BRO Token
0 FTM0.0016548929.21626395
Approve789604552024-04-08 16:18:3351 days ago1712593113IN
DexBrowser: BRO Token
0 FTM0.0024128850.66001782
Transfer788997822024-04-07 14:23:3353 days ago1712499813IN
DexBrowser: BRO Token
0 FTM0.0019639150.72999969
Approve788541372024-04-06 15:40:5054 days ago1712418050IN
DexBrowser: BRO Token
0 FTM0.0046574599.73987403
Approve787155792024-04-04 10:58:0556 days ago1712228285IN
DexBrowser: BRO Token
0 FTM0.000258610
Approve787132092024-04-04 9:20:1256 days ago1712222412IN
DexBrowser: BRO Token
0 FTM0.000587524.06628814
Approve786307292024-04-02 8:56:0858 days ago1712048168IN
DexBrowser: BRO Token
0 FTM0.0011769225.10937817
Approve783793422024-03-28 17:40:5362 days ago1711647653IN
DexBrowser: BRO Token
0 FTM0.00286265117.26436711
Approve783793322024-03-28 17:40:4462 days ago1711647644IN
DexBrowser: BRO Token
0 FTM0.00286125117.26436711
Approve782124582024-03-26 11:02:5465 days ago1711450974IN
DexBrowser: BRO Token
0 FTM0.0018809840.2814213
View all transactions

Latest 1 internal transaction

Parent Transaction Hash Block From To Value
213307502021-11-07 9:22:39935 days ago1636276959  Contract Creation0 FTM
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ERC20Pauser

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at ftmscan.com on 2021-11-07
*/

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol



pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastvalue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastvalue;
                // Update the index for the moved value
                set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol



pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

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



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/access/IAccessControl.sol



pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

// File: @openzeppelin/contracts/access/IAccessControlEnumerable.sol



pragma solidity ^0.8.0;


/**
 * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
 */
interface IAccessControlEnumerable is IAccessControl {
    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) external view returns (address);

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) external view returns (uint256);
}

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



pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

// File: @openzeppelin/contracts/security/Pausable.sol



pragma solidity ^0.8.0;


/**
 * @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 Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

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

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        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: @openzeppelin/contracts/token/ERC20/ERC20.sol



pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin 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}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * 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:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _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;
        }
        _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 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: @openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol



pragma solidity ^0.8.0;



/**
 * @dev ERC20 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC20Pausable is ERC20, Pausable {
    /**
     * @dev See {ERC20-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, amount);

        require(!paused(), "ERC20Pausable: token transfer while paused");
    }
}

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



pragma solidity ^0.8.0;



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

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

// File: @openzeppelin/contracts/access/AccessControl.sol



pragma solidity ^0.8.0;





/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: @openzeppelin/contracts/access/AccessControlEnumerable.sol



pragma solidity ^0.8.0;




/**
 * @dev Extension of {AccessControl} that allows enumerating the members of each role.
 */
abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) public view override returns (address) {
        return _roleMembers[role].at(index);
    }

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) public view override returns (uint256) {
        return _roleMembers[role].length();
    }

    /**
     * @dev Overload {grantRole} to track enumerable memberships
     */
    function grantRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) {
        super.grantRole(role, account);
        _roleMembers[role].add(account);
    }

    /**
     * @dev Overload {revokeRole} to track enumerable memberships
     */
    function revokeRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) {
        super.revokeRole(role, account);
        _roleMembers[role].remove(account);
    }

    /**
     * @dev Overload {renounceRole} to track enumerable memberships
     */
    function renounceRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) {
        super.renounceRole(role, account);
        _roleMembers[role].remove(account);
    }

    /**
     * @dev Overload {_setupRole} to track enumerable memberships
     */
    function _setupRole(bytes32 role, address account) internal virtual override {
        super._setupRole(role, account);
        _roleMembers[role].add(account);
    }
}

// File: contracts/ERC20Pauser.sol

// contracts/ERC20Pauser.sol


pragma solidity ^0.8.0;





contract ERC20Pauser is Context, AccessControlEnumerable, ERC20Burnable, ERC20Pausable {
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");

    /**
     * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the
     * account that deploys the contract.
     *
     * See {ERC20-constructor}.
     */
    constructor(
        string memory name,
        string memory symbol,
        uint256 totalSupply,
        address multisig
    )
        ERC20(name, symbol)
    {
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());

        _setupRole(MINTER_ROLE, _msgSender());
        _setupRole(PAUSER_ROLE, _msgSender());

        super._mint(multisig, totalSupply);
    }

    /**
     * @dev Pauses all token transfers.
     *
     * See {ERC20Pausable} and {Pausable-_pause}.
     *
     * Requirements:
     *
     * - the caller must have the `PAUSER_ROLE`.
     */
    function pause() public virtual {
        require(hasRole(PAUSER_ROLE, _msgSender()), "pauser role to pause");
        _pause();
    }

    /**
     * @dev Unpauses all token transfers.
     *
     * See {ERC20Pausable} and {Pausable-_unpause}.
     *
     * Requirements:
     *
     * - the caller must have the `PAUSER_ROLE`.
     */
    function unpause() public virtual {
        require(hasRole(PAUSER_ROLE, _msgSender()), "pauser role to unpause");
        _unpause();
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override(ERC20, ERC20Pausable) {
        super._beforeTokenTransfer(from, to, amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"address","name":"multisig","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200215d3803806200215d833981016040819052620000349162000528565b8351849084906200004d906005906020850190620003d7565b50805162000063906006906020840190620003d7565b50506007805460ff19169055506200008660006200008062000105565b62000109565b620000b57f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66200008062000105565b620000e47f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6200008062000105565b620000fb81836200014c60201b620008651760201c565b50505050620006bb565b3390565b6200012082826200022e60201b620009311760201c565b6000828152600160209081526040909120620001479183906200093b6200023a821b17901c565b505050565b6001600160a01b0382166200017e5760405162461bcd60e51b81526004016200017590620005b9565b60405180910390fd5b6200018c600083836200025a565b8060046000828254620001a0919062000643565b90915550506001600160a01b03821660009081526002602052604081208054839290620001cf90849062000643565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620002149085906200063a565b60405180910390a36200022a6000838362000147565b5050565b6200022a828262000272565b600062000251836001600160a01b038416620002fc565b90505b92915050565b620001478383836200034b60201b620009501760201c565b6200027e82826200038d565b6200022a576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002b862000105565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60006200030a8383620003b6565b620003425750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000254565b50600062000254565b620003638383836200014760201b620005401760201c565b6200036d620003ce565b15620001475760405162461bcd60e51b81526004016200017590620005f0565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60009081526001919091016020526040902054151590565b60075460ff1690565b828054620003e59062000668565b90600052602060002090601f01602090048101928262000409576000855562000454565b82601f106200042457805160ff191683800117855562000454565b8280016001018555821562000454579182015b828111156200045457825182559160200191906001019062000437565b506200046292915062000466565b5090565b5b8082111562000462576000815560010162000467565b600082601f8301126200048e578081fd5b81516001600160401b0380821115620004ab57620004ab620006a5565b6040516020601f8401601f1916820181018381118382101715620004d357620004d3620006a5565b6040528382528584018101871015620004ea578485fd5b8492505b838310156200050d5785830181015182840182015291820191620004ee565b838311156200051e57848185840101525b5095945050505050565b600080600080608085870312156200053e578384fd5b84516001600160401b038082111562000555578586fd5b62000563888389016200047d565b9550602087015191508082111562000579578485fd5b5062000588878288016200047d565b60408701516060880151919550935090506001600160a01b0381168114620005ae578182fd5b939692955090935050565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b6020808252602a908201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686040820152691a5b19481c185d5cd95960b21b606082015260800190565b90815260200190565b600082198211156200066357634e487b7160e01b81526011600452602481fd5b500190565b6002810460018216806200067d57607f821691505b602082108114156200069f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b611a9280620006cb6000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c806370a08231116100f9578063a457c2d711610097578063d539139311610071578063d539139314610357578063d547741f1461035f578063dd62ed3e14610372578063e63ab1e914610385576101a9565b8063a457c2d71461031e578063a9059cbb14610331578063ca15c87314610344576101a9565b80639010d07c116100d35780639010d07c146102db57806391d14854146102fb57806395d89b411461030e578063a217fddf14610316576101a9565b806370a08231146102ad57806379cc6790146102c05780638456cb59146102d3576101a9565b80632f2ff15d11610166578063395093511161014057806339509351146102775780633f4ba83a1461028a57806342966c68146102925780635c975abb146102a5576101a9565b80632f2ff15d1461023a578063313ce5671461024f57806336568abe14610264576101a9565b806301ffc9a7146101ae57806306fdde03146101d7578063095ea7b3146101ec57806318160ddd146101ff57806323b872dd14610214578063248a9ca314610227575b600080fd5b6101c16101bc366004611411565b61038d565b6040516101ce91906114c2565b60405180910390f35b6101df6103ba565b6040516101ce91906114d6565b6101c16101fa36600461138d565b61044c565b61020761046a565b6040516101ce91906114cd565b6101c1610222366004611352565b610470565b6102076102353660046113b6565b610509565b61024d6102483660046113ce565b61051e565b005b610257610545565b6040516101ce919061196c565b61024d6102723660046113ce565b61054a565b6101c161028536600461138d565b61056c565b61024d6105c0565b61024d6102a03660046113b6565b610612565b6101c1610626565b6102076102bb366004611306565b61062f565b61024d6102ce36600461138d565b61064a565b61024d610698565b6102ee6102e93660046113f0565b6106e8565b6040516101ce91906114ae565b6101c16103093660046113ce565b610707565b6101df610730565b61020761073f565b6101c161032c36600461138d565b610744565b6101c161033f36600461138d565b6107bd565b6102076103523660046113b6565b6107d1565b6102076107e8565b61024d61036d3660046113ce565b61080c565b610207610380366004611320565b610816565b610207610841565b60006001600160e01b03198216635a05180f60e01b14806103b257506103b282610980565b90505b919050565b6060600580546103c990611a0b565b80601f01602080910402602001604051908101604052809291908181526020018280546103f590611a0b565b80156104425780601f1061041757610100808354040283529160200191610442565b820191906000526020600020905b81548152906001019060200180831161042557829003601f168201915b5050505050905090565b60006104606104596109a5565b84846109a9565b5060015b92915050565b60045490565b600061047d848484610a5d565b6001600160a01b03841660009081526003602052604081208161049e6109a5565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828110156104ea5760405162461bcd60e51b81526004016104e1906116d1565b60405180910390fd5b6104fe856104f66109a5565b8584036109a9565b506001949350505050565b60009081526020819052604090206001015490565b6105288282610b87565b6000828152600160205260409020610540908261093b565b505050565b601290565b6105548282610bab565b60008281526001602052604090206105409082610bed565b60006104606105796109a5565b8484600360006105876109a5565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546105bb919061197a565b6109a9565b6105ec7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6103096109a5565b6106085760405162461bcd60e51b81526004016104e190611827565b610610610c02565b565b61062361061d6109a5565b82610c70565b50565b60075460ff1690565b6001600160a01b031660009081526002602052604090205490565b6000610658836103806109a5565b90508181101561067a5760405162461bcd60e51b81526004016104e190611719565b61068e836106866109a5565b8484036109a9565b6105408383610c70565b6106c47f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6103096109a5565b6106e05760405162461bcd60e51b81526004016104e190611679565b610610610d61565b60008281526001602052604081206107009083610dbc565b9392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600680546103c990611a0b565b600081565b600080600360006107536109a5565b6001600160a01b039081168252602080830193909352604091820160009081209188168152925290205490508281101561079f5760405162461bcd60e51b81526004016104e190611857565b6107b36107aa6109a5565b858584036109a9565b5060019392505050565b60006104606107ca6109a5565b8484610a5d565b60008181526001602052604081206103b290610dc8565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6105548282610dd3565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6001600160a01b03821661088b5760405162461bcd60e51b81526004016104e1906118eb565b61089760008383610df2565b80600460008282546108a9919061197a565b90915550506001600160a01b038216600090815260026020526040812080548392906108d690849061197a565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906109199085906114cd565b60405180910390a361092d60008383610540565b5050565b61092d8282610dfd565b6000610700836001600160a01b038416610e82565b61095b838383610540565b610963610626565b156105405760405162461bcd60e51b81526004016104e190611922565b60006001600160e01b03198216637965db0b60e01b14806103b257506103b282610ecc565b3390565b6001600160a01b0383166109cf5760405162461bcd60e51b81526004016104e1906117e3565b6001600160a01b0382166109f55760405162461bcd60e51b81526004016104e1906115f1565b6001600160a01b0380841660008181526003602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610a509085906114cd565b60405180910390a3505050565b6001600160a01b038316610a835760405162461bcd60e51b81526004016104e19061179e565b6001600160a01b038216610aa95760405162461bcd60e51b81526004016104e19061153e565b610ab4838383610df2565b6001600160a01b03831660009081526002602052604090205481811015610aed5760405162461bcd60e51b81526004016104e190611633565b6001600160a01b03808516600090815260026020526040808220858503905591851681529081208054849290610b2490849061197a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610b6e91906114cd565b60405180910390a3610b81848484610540565b50505050565b610b9082610509565b610ba181610b9c6109a5565b610ee5565b6105408383610dfd565b610bb36109a5565b6001600160a01b0316816001600160a01b031614610be35760405162461bcd60e51b81526004016104e19061189c565b61092d8282610f49565b6000610700836001600160a01b038416610fcc565b610c0a610626565b610c265760405162461bcd60e51b81526004016104e190611581565b6007805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610c596109a5565b604051610c6691906114ae565b60405180910390a1565b6001600160a01b038216610c965760405162461bcd60e51b81526004016104e19061175d565b610ca282600083610df2565b6001600160a01b03821660009081526002602052604090205481811015610cdb5760405162461bcd60e51b81526004016104e1906115af565b6001600160a01b0383166000908152600260205260408120838303905560048054849290610d0a9084906119b1565b90915550506040516000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610d4d9086906114cd565b60405180910390a361054083600084610540565b610d69610626565b15610d865760405162461bcd60e51b81526004016104e1906116a7565b6007805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610c596109a5565b600061070083836110e9565b60006103b282611121565b610ddc82610509565b610de881610b9c6109a5565b6105408383610f49565b610540838383610950565b610e078282610707565b61092d576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610e3e6109a5565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000610e8e8383611125565b610ec457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610464565b506000610464565b6001600160e01b031981166301ffc9a760e01b14919050565b610eef8282610707565b61092d57610f07816001600160a01b0316601461113d565b610f1283602061113d565b604051602001610f23929190611439565b60408051601f198184030181529082905262461bcd60e51b82526104e1916004016114d6565b610f538282610707565b1561092d576000828152602081815260408083206001600160a01b03851684529091529020805460ff19169055610f886109a5565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b600081815260018301602052604081205480156110df576000610ff06001836119b1565b8554909150600090611004906001906119b1565b905081811461108557600086600001828154811061103257634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061106357634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b85548690806110a457634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610464565b6000915050610464565b600082600001828154811061110e57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b5490565b60009081526001919091016020526040902054151590565b6060600061114c836002611992565b61115790600261197a565b67ffffffffffffffff81111561117d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156111a7576020820181803683370190505b509050600360fc1b816000815181106111d057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061120d57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506000611231846002611992565b61123c90600161197a565b90505b60018111156112d0576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061127e57634e487b7160e01b600052603260045260246000fd5b1a60f81b8282815181106112a257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c936112c9816119f4565b905061123f565b5083156107005760405162461bcd60e51b81526004016104e190611509565b80356001600160a01b03811681146103b557600080fd5b600060208284031215611317578081fd5b610700826112ef565b60008060408385031215611332578081fd5b61133b836112ef565b9150611349602084016112ef565b90509250929050565b600080600060608486031215611366578081fd5b61136f846112ef565b925061137d602085016112ef565b9150604084013590509250925092565b6000806040838503121561139f578182fd5b6113a8836112ef565b946020939093013593505050565b6000602082840312156113c7578081fd5b5035919050565b600080604083850312156113e0578182fd5b82359150611349602084016112ef565b60008060408385031215611402578182fd5b50508035926020909101359150565b600060208284031215611422578081fd5b81356001600160e01b031981168114610700578182fd5b60007f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000825283516114718160178501602088016119c8565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516114a28160288401602088016119c8565b01602801949350505050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b60006020825282518060208401526114f58160408501602087016119c8565b601f01601f19169190910160400192915050565b6020808252818101527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604082015260600190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526022908201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604082015261636560f01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526014908201527370617573657220726f6c6520746f20706175736560601b604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616040820152676c6c6f77616e636560c01b606082015260800190565b60208082526024908201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604082015263616e636560e01b606082015260800190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526016908201527570617573657220726f6c6520746f20756e706175736560501b604082015260600190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201526e103937b632b9903337b91039b2b63360891b606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b6020808252602a908201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686040820152691a5b19481c185d5cd95960b21b606082015260800190565b60ff91909116815260200190565b6000821982111561198d5761198d611a46565b500190565b60008160001904831182151516156119ac576119ac611a46565b500290565b6000828210156119c3576119c3611a46565b500390565b60005b838110156119e35781810151838201526020016119cb565b83811115610b815750506000910152565b600081611a0357611a03611a46565b506000190190565b600281046001821680611a1f57607f821691505b60208210811415611a4057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fdfea264697066735822122039ce1fe800d7924c0f4ced0d2e6da2ffd9c8350c604d32317f88c2706fc071a964736f6c63430008000033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000019d971e4fe8401e74000000000000000000000000000000abbbdc5ada7ab9c61e044328aa62285a223bc252000000000000000000000000000000000000000000000000000000000000000a44657842726f7773657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000342524f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101a95760003560e01c806370a08231116100f9578063a457c2d711610097578063d539139311610071578063d539139314610357578063d547741f1461035f578063dd62ed3e14610372578063e63ab1e914610385576101a9565b8063a457c2d71461031e578063a9059cbb14610331578063ca15c87314610344576101a9565b80639010d07c116100d35780639010d07c146102db57806391d14854146102fb57806395d89b411461030e578063a217fddf14610316576101a9565b806370a08231146102ad57806379cc6790146102c05780638456cb59146102d3576101a9565b80632f2ff15d11610166578063395093511161014057806339509351146102775780633f4ba83a1461028a57806342966c68146102925780635c975abb146102a5576101a9565b80632f2ff15d1461023a578063313ce5671461024f57806336568abe14610264576101a9565b806301ffc9a7146101ae57806306fdde03146101d7578063095ea7b3146101ec57806318160ddd146101ff57806323b872dd14610214578063248a9ca314610227575b600080fd5b6101c16101bc366004611411565b61038d565b6040516101ce91906114c2565b60405180910390f35b6101df6103ba565b6040516101ce91906114d6565b6101c16101fa36600461138d565b61044c565b61020761046a565b6040516101ce91906114cd565b6101c1610222366004611352565b610470565b6102076102353660046113b6565b610509565b61024d6102483660046113ce565b61051e565b005b610257610545565b6040516101ce919061196c565b61024d6102723660046113ce565b61054a565b6101c161028536600461138d565b61056c565b61024d6105c0565b61024d6102a03660046113b6565b610612565b6101c1610626565b6102076102bb366004611306565b61062f565b61024d6102ce36600461138d565b61064a565b61024d610698565b6102ee6102e93660046113f0565b6106e8565b6040516101ce91906114ae565b6101c16103093660046113ce565b610707565b6101df610730565b61020761073f565b6101c161032c36600461138d565b610744565b6101c161033f36600461138d565b6107bd565b6102076103523660046113b6565b6107d1565b6102076107e8565b61024d61036d3660046113ce565b61080c565b610207610380366004611320565b610816565b610207610841565b60006001600160e01b03198216635a05180f60e01b14806103b257506103b282610980565b90505b919050565b6060600580546103c990611a0b565b80601f01602080910402602001604051908101604052809291908181526020018280546103f590611a0b565b80156104425780601f1061041757610100808354040283529160200191610442565b820191906000526020600020905b81548152906001019060200180831161042557829003601f168201915b5050505050905090565b60006104606104596109a5565b84846109a9565b5060015b92915050565b60045490565b600061047d848484610a5d565b6001600160a01b03841660009081526003602052604081208161049e6109a5565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828110156104ea5760405162461bcd60e51b81526004016104e1906116d1565b60405180910390fd5b6104fe856104f66109a5565b8584036109a9565b506001949350505050565b60009081526020819052604090206001015490565b6105288282610b87565b6000828152600160205260409020610540908261093b565b505050565b601290565b6105548282610bab565b60008281526001602052604090206105409082610bed565b60006104606105796109a5565b8484600360006105876109a5565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546105bb919061197a565b6109a9565b6105ec7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6103096109a5565b6106085760405162461bcd60e51b81526004016104e190611827565b610610610c02565b565b61062361061d6109a5565b82610c70565b50565b60075460ff1690565b6001600160a01b031660009081526002602052604090205490565b6000610658836103806109a5565b90508181101561067a5760405162461bcd60e51b81526004016104e190611719565b61068e836106866109a5565b8484036109a9565b6105408383610c70565b6106c47f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6103096109a5565b6106e05760405162461bcd60e51b81526004016104e190611679565b610610610d61565b60008281526001602052604081206107009083610dbc565b9392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600680546103c990611a0b565b600081565b600080600360006107536109a5565b6001600160a01b039081168252602080830193909352604091820160009081209188168152925290205490508281101561079f5760405162461bcd60e51b81526004016104e190611857565b6107b36107aa6109a5565b858584036109a9565b5060019392505050565b60006104606107ca6109a5565b8484610a5d565b60008181526001602052604081206103b290610dc8565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6105548282610dd3565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6001600160a01b03821661088b5760405162461bcd60e51b81526004016104e1906118eb565b61089760008383610df2565b80600460008282546108a9919061197a565b90915550506001600160a01b038216600090815260026020526040812080548392906108d690849061197a565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906109199085906114cd565b60405180910390a361092d60008383610540565b5050565b61092d8282610dfd565b6000610700836001600160a01b038416610e82565b61095b838383610540565b610963610626565b156105405760405162461bcd60e51b81526004016104e190611922565b60006001600160e01b03198216637965db0b60e01b14806103b257506103b282610ecc565b3390565b6001600160a01b0383166109cf5760405162461bcd60e51b81526004016104e1906117e3565b6001600160a01b0382166109f55760405162461bcd60e51b81526004016104e1906115f1565b6001600160a01b0380841660008181526003602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610a509085906114cd565b60405180910390a3505050565b6001600160a01b038316610a835760405162461bcd60e51b81526004016104e19061179e565b6001600160a01b038216610aa95760405162461bcd60e51b81526004016104e19061153e565b610ab4838383610df2565b6001600160a01b03831660009081526002602052604090205481811015610aed5760405162461bcd60e51b81526004016104e190611633565b6001600160a01b03808516600090815260026020526040808220858503905591851681529081208054849290610b2490849061197a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610b6e91906114cd565b60405180910390a3610b81848484610540565b50505050565b610b9082610509565b610ba181610b9c6109a5565b610ee5565b6105408383610dfd565b610bb36109a5565b6001600160a01b0316816001600160a01b031614610be35760405162461bcd60e51b81526004016104e19061189c565b61092d8282610f49565b6000610700836001600160a01b038416610fcc565b610c0a610626565b610c265760405162461bcd60e51b81526004016104e190611581565b6007805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610c596109a5565b604051610c6691906114ae565b60405180910390a1565b6001600160a01b038216610c965760405162461bcd60e51b81526004016104e19061175d565b610ca282600083610df2565b6001600160a01b03821660009081526002602052604090205481811015610cdb5760405162461bcd60e51b81526004016104e1906115af565b6001600160a01b0383166000908152600260205260408120838303905560048054849290610d0a9084906119b1565b90915550506040516000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610d4d9086906114cd565b60405180910390a361054083600084610540565b610d69610626565b15610d865760405162461bcd60e51b81526004016104e1906116a7565b6007805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610c596109a5565b600061070083836110e9565b60006103b282611121565b610ddc82610509565b610de881610b9c6109a5565b6105408383610f49565b610540838383610950565b610e078282610707565b61092d576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610e3e6109a5565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000610e8e8383611125565b610ec457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610464565b506000610464565b6001600160e01b031981166301ffc9a760e01b14919050565b610eef8282610707565b61092d57610f07816001600160a01b0316601461113d565b610f1283602061113d565b604051602001610f23929190611439565b60408051601f198184030181529082905262461bcd60e51b82526104e1916004016114d6565b610f538282610707565b1561092d576000828152602081815260408083206001600160a01b03851684529091529020805460ff19169055610f886109a5565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b600081815260018301602052604081205480156110df576000610ff06001836119b1565b8554909150600090611004906001906119b1565b905081811461108557600086600001828154811061103257634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061106357634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b85548690806110a457634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610464565b6000915050610464565b600082600001828154811061110e57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b5490565b60009081526001919091016020526040902054151590565b6060600061114c836002611992565b61115790600261197a565b67ffffffffffffffff81111561117d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156111a7576020820181803683370190505b509050600360fc1b816000815181106111d057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061120d57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506000611231846002611992565b61123c90600161197a565b90505b60018111156112d0576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061127e57634e487b7160e01b600052603260045260246000fd5b1a60f81b8282815181106112a257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c936112c9816119f4565b905061123f565b5083156107005760405162461bcd60e51b81526004016104e190611509565b80356001600160a01b03811681146103b557600080fd5b600060208284031215611317578081fd5b610700826112ef565b60008060408385031215611332578081fd5b61133b836112ef565b9150611349602084016112ef565b90509250929050565b600080600060608486031215611366578081fd5b61136f846112ef565b925061137d602085016112ef565b9150604084013590509250925092565b6000806040838503121561139f578182fd5b6113a8836112ef565b946020939093013593505050565b6000602082840312156113c7578081fd5b5035919050565b600080604083850312156113e0578182fd5b82359150611349602084016112ef565b60008060408385031215611402578182fd5b50508035926020909101359150565b600060208284031215611422578081fd5b81356001600160e01b031981168114610700578182fd5b60007f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000825283516114718160178501602088016119c8565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516114a28160288401602088016119c8565b01602801949350505050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b60006020825282518060208401526114f58160408501602087016119c8565b601f01601f19169190910160400192915050565b6020808252818101527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604082015260600190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526022908201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604082015261636560f01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526014908201527370617573657220726f6c6520746f20706175736560601b604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616040820152676c6c6f77616e636560c01b606082015260800190565b60208082526024908201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604082015263616e636560e01b606082015260800190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526016908201527570617573657220726f6c6520746f20756e706175736560501b604082015260600190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201526e103937b632b9903337b91039b2b63360891b606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b6020808252602a908201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686040820152691a5b19481c185d5cd95960b21b606082015260800190565b60ff91909116815260200190565b6000821982111561198d5761198d611a46565b500190565b60008160001904831182151516156119ac576119ac611a46565b500290565b6000828210156119c3576119c3611a46565b500390565b60005b838110156119e35781810151838201526020016119cb565b83811115610b815750506000910152565b600081611a0357611a03611a46565b506000190190565b600281046001821680611a1f57607f821691505b60208210811415611a4057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fdfea264697066735822122039ce1fe800d7924c0f4ced0d2e6da2ffd9c8350c604d32317f88c2706fc071a964736f6c63430008000033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000019d971e4fe8401e74000000000000000000000000000000abbbdc5ada7ab9c61e044328aa62285a223bc252000000000000000000000000000000000000000000000000000000000000000a44657842726f7773657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000342524f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): DexBrowser
Arg [1] : symbol (string): BRO
Arg [2] : totalSupply (uint256): 500000000000000000000000000
Arg [3] : multisig (address): 0xABbbDC5Ada7AB9C61e044328aa62285A223BC252

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000019d971e4fe8401e74000000
Arg [3] : 000000000000000000000000abbbdc5ada7ab9c61e044328aa62285a223bc252
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [5] : 44657842726f7773657200000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 42524f0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

51496:1701:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48972:214;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29233:100;;;:::i;:::-;;;;;;;:::i;31400:169::-;;;;;;:::i;:::-;;:::i;30353:108::-;;;:::i;:::-;;;;;;;:::i;32051:492::-;;;;;;:::i;:::-;;:::i;45268:123::-;;;;;;:::i;:::-;;:::i;50330:196::-;;;;;;:::i;:::-;;:::i;:::-;;30195:93;;;:::i;:::-;;;;;;;:::i;50915:205::-;;;;;;:::i;:::-;;:::i;32952:215::-;;;;;;:::i;:::-;;:::i;52860:143::-;;;:::i;40557:91::-;;;;;;:::i;:::-;;:::i;25974:86::-;;;:::i;30524:127::-;;;;;;:::i;:::-;;:::i;40967:368::-;;;;;;:::i;:::-;;:::i;52505:137::-;;;:::i;49785:145::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;44153:139::-;;;;;;:::i;:::-;;:::i;29452:104::-;;;:::i;43244:49::-;;;:::i;33670:413::-;;;;;;:::i;:::-;;:::i;30864:175::-;;;;;;:::i;:::-;;:::i;50104:134::-;;;;;;:::i;:::-;;:::i;51590:62::-;;;:::i;50619:201::-;;;;;;:::i;:::-;;:::i;31102:151::-;;;;;;:::i;:::-;;:::i;51659:62::-;;;:::i;48972:214::-;49057:4;-1:-1:-1;;;;;;49081:57:0;;-1:-1:-1;;;49081:57:0;;:97;;;49142:36;49166:11;49142:23;:36::i;:::-;49074:104;;48972:214;;;;:::o;29233:100::-;29287:13;29320:5;29313:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29233:100;:::o;31400:169::-;31483:4;31500:39;31509:12;:10;:12::i;:::-;31523:7;31532:6;31500:8;:39::i;:::-;-1:-1:-1;31557:4:0;31400:169;;;;;:::o;30353:108::-;30441:12;;30353:108;:::o;32051:492::-;32191:4;32208:36;32218:6;32226:9;32237:6;32208:9;:36::i;:::-;-1:-1:-1;;;;;32284:19:0;;32257:24;32284:19;;;:11;:19;;;;;32257:24;32304:12;:10;:12::i;:::-;-1:-1:-1;;;;;32284:33:0;-1:-1:-1;;;;;32284:33:0;;;;;;;;;;;;;32257:60;;32356:6;32336:16;:26;;32328:79;;;;-1:-1:-1;;;32328:79:0;;;;;;;:::i;:::-;;;;;;;;;32443:57;32452:6;32460:12;:10;:12::i;:::-;32493:6;32474:16;:25;32443:8;:57::i;:::-;-1:-1:-1;32531:4:0;;32051:492;-1:-1:-1;;;;32051:492:0:o;45268:123::-;45334:7;45361:12;;;;;;;;;;:22;;;;45268:123::o;50330:196::-;50446:30;50462:4;50468:7;50446:15;:30::i;:::-;50487:18;;;;:12;:18;;;;;:31;;50510:7;50487:22;:31::i;:::-;;50330:196;;:::o;30195:93::-;30278:2;30195:93;:::o;50915:205::-;51034:33;51053:4;51059:7;51034:18;:33::i;:::-;51078:18;;;;:12;:18;;;;;:34;;51104:7;51078:25;:34::i;32952:215::-;33040:4;33057:80;33066:12;:10;:12::i;:::-;33080:7;33126:10;33089:11;:25;33101:12;:10;:12::i;:::-;-1:-1:-1;;;;;33089:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;33089:25:0;;;:34;;;;;;;;;;:47;;;;:::i;:::-;33057:8;:80::i;52860:143::-;52913:34;51697:24;52934:12;:10;:12::i;52913:34::-;52905:69;;;;-1:-1:-1;;;52905:69:0;;;;;;;:::i;:::-;52985:10;:8;:10::i;:::-;52860:143::o;40557:91::-;40613:27;40619:12;:10;:12::i;:::-;40633:6;40613:5;:27::i;:::-;40557:91;:::o;25974:86::-;26045:7;;;;25974:86;:::o;30524:127::-;-1:-1:-1;;;;;30625:18:0;30598:7;30625:18;;;:9;:18;;;;;;;30524:127::o;40967:368::-;41044:24;41071:32;41081:7;41090:12;:10;:12::i;41071:32::-;41044:59;;41142:6;41122:16;:26;;41114:75;;;;-1:-1:-1;;;41114:75:0;;;;;;;:::i;:::-;41225:58;41234:7;41243:12;:10;:12::i;:::-;41276:6;41257:16;:25;41225:8;:58::i;:::-;41305:22;41311:7;41320:6;41305:5;:22::i;52505:137::-;52556:34;51697:24;52577:12;:10;:12::i;52556:34::-;52548:67;;;;-1:-1:-1;;;52548:67:0;;;;;;;:::i;:::-;52626:8;:6;:8::i;49785:145::-;49867:7;49894:18;;;:12;:18;;;;;:28;;49916:5;49894:21;:28::i;:::-;49887:35;49785:145;-1:-1:-1;;;49785:145:0:o;44153:139::-;44231:4;44255:12;;;;;;;;;;;-1:-1:-1;;;;;44255:29:0;;;;;;;;;;;;;;;44153:139::o;29452:104::-;29508:13;29541:7;29534:14;;;;;:::i;43244:49::-;43289:4;43244:49;:::o;33670:413::-;33763:4;33780:24;33807:11;:25;33819:12;:10;:12::i;:::-;-1:-1:-1;;;;;33807:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;33807:25:0;;;:34;;;;;;;;;;;-1:-1:-1;33860:35:0;;;;33852:85;;;;-1:-1:-1;;;33852:85:0;;;;;;;:::i;:::-;33973:67;33982:12;:10;:12::i;:::-;33996:7;34024:15;34005:16;:34;33973:8;:67::i;:::-;-1:-1:-1;34071:4:0;;33670:413;-1:-1:-1;;;33670:413:0:o;30864:175::-;30950:4;30967:42;30977:12;:10;:12::i;:::-;30991:9;31002:6;30967:9;:42::i;50104:134::-;50176:7;50203:18;;;:12;:18;;;;;:27;;:25;:27::i;51590:62::-;51628:24;51590:62;:::o;50619:201::-;50736:31;50753:4;50759:7;50736:16;:31::i;31102:151::-;-1:-1:-1;;;;;31218:18:0;;;31191:7;31218:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;31102:151::o;51659:62::-;51697:24;51659:62;:::o;35593:399::-;-1:-1:-1;;;;;35677:21:0;;35669:65;;;;-1:-1:-1;;;35669:65:0;;;;;;;:::i;:::-;35747:49;35776:1;35780:7;35789:6;35747:20;:49::i;:::-;35825:6;35809:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;35842:18:0;;;;;;:9;:18;;;;;:28;;35864:6;;35842:18;:28;;35864:6;;35842:28;:::i;:::-;;;;-1:-1:-1;;35886:37:0;;-1:-1:-1;;;;;35886:37:0;;;35903:1;;35886:37;;;;35916:6;;35886:37;:::i;:::-;;;;;;;;35936:48;35964:1;35968:7;35977:6;35936:19;:48::i;:::-;35593:399;;:::o;47502:112::-;47581:25;47592:4;47598:7;47581:10;:25::i;11298:152::-;11368:4;11392:50;11397:3;-1:-1:-1;;;;;11417:23:0;;11392:4;:50::i;39787:272::-;39930:44;39957:4;39963:2;39967:6;39930:26;:44::i;:::-;39996:8;:6;:8::i;:::-;39995:9;39987:64;;;;-1:-1:-1;;;39987:64:0;;;;;;;:::i;43857:204::-;43942:4;-1:-1:-1;;;;;;43966:47:0;;-1:-1:-1;;;43966:47:0;;:87;;;44017:36;44041:11;44017:23;:36::i;24686:98::-;24766:10;24686:98;:::o;37354:380::-;-1:-1:-1;;;;;37490:19:0;;37482:68;;;;-1:-1:-1;;;37482:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37569:21:0;;37561:68;;;;-1:-1:-1;;;37561:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37642:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;37694:32;;;;;37672:6;;37694:32;:::i;:::-;;;;;;;;37354:380;;;:::o;34573:733::-;-1:-1:-1;;;;;34713:20:0;;34705:70;;;;-1:-1:-1;;;34705:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34794:23:0;;34786:71;;;;-1:-1:-1;;;34786:71:0;;;;;;;:::i;:::-;34870:47;34891:6;34899:9;34910:6;34870:20;:47::i;:::-;-1:-1:-1;;;;;34954:17:0;;34930:21;34954:17;;;:9;:17;;;;;;34990:23;;;;34982:74;;;;-1:-1:-1;;;34982:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35092:17:0;;;;;;;:9;:17;;;;;;35112:22;;;35092:42;;35156:20;;;;;;;;:30;;35128:6;;35092:17;35156:30;;35128:6;;35156:30;:::i;:::-;;;;;;;;35221:9;-1:-1:-1;;;;;35204:35:0;35213:6;-1:-1:-1;;;;;35204:35:0;;35232:6;35204:35;;;;;;:::i;:::-;;;;;;;;35252:46;35272:6;35280:9;35291:6;35252:19;:46::i;:::-;34573:733;;;;:::o;45653:147::-;45736:18;45749:4;45736:12;:18::i;:::-;43735:30;43746:4;43752:12;:10;:12::i;:::-;43735:10;:30::i;:::-;45767:25:::1;45778:4;45784:7;45767:10;:25::i;46701:218::-:0;46808:12;:10;:12::i;:::-;-1:-1:-1;;;;;46797:23:0;:7;-1:-1:-1;;;;;46797:23:0;;46789:83;;;;-1:-1:-1;;;46789:83:0;;;;;;;:::i;:::-;46885:26;46897:4;46903:7;46885:11;:26::i;11626:158::-;11699:4;11723:53;11731:3;-1:-1:-1;;;;;11751:23:0;;11723:7;:53::i;27033:120::-;26577:8;:6;:8::i;:::-;26569:41;;;;-1:-1:-1;;;26569:41:0;;;;;;;:::i;:::-;27092:7:::1;:15:::0;;-1:-1:-1;;27092:15:0::1;::::0;;27123:22:::1;27132:12;:10;:12::i;:::-;27123:22;;;;;;:::i;:::-;;;;;;;;27033:120::o:0;36325:591::-;-1:-1:-1;;;;;36409:21:0;;36401:67;;;;-1:-1:-1;;;36401:67:0;;;;;;;:::i;:::-;36481:49;36502:7;36519:1;36523:6;36481:20;:49::i;:::-;-1:-1:-1;;;;;36568:18:0;;36543:22;36568:18;;;:9;:18;;;;;;36605:24;;;;36597:71;;;;-1:-1:-1;;;36597:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36704:18:0;;;;;;:9;:18;;;;;36725:23;;;36704:44;;36770:12;:22;;36742:6;;36704:18;36770:22;;36742:6;;36770:22;:::i;:::-;;;;-1:-1:-1;;36810:37:0;;36836:1;;-1:-1:-1;;;;;36810:37:0;;;;;;;36840:6;;36810:37;:::i;:::-;;;;;;;;36860:48;36880:7;36897:1;36901:6;36860:19;:48::i;26774:118::-;26300:8;:6;:8::i;:::-;26299:9;26291:38;;;;-1:-1:-1;;;26291:38:0;;;;;;;:::i;:::-;26834:7:::1;:14:::0;;-1:-1:-1;;26834:14:0::1;26844:4;26834:14;::::0;;26864:20:::1;26871:12;:10;:12::i;12594:158::-:0;12668:7;12719:22;12723:3;12735:5;12719:3;:22::i;12123:117::-;12186:7;12213:19;12221:3;12213:7;:19::i;46045:149::-;46129:18;46142:4;46129:12;:18::i;:::-;43735:30;43746:4;43752:12;:10;:12::i;43735:30::-;46160:26:::1;46172:4;46178:7;46160:11;:26::i;53011:183::-:0;53142:44;53169:4;53175:2;53179:6;53142:26;:44::i;48005:229::-;48080:22;48088:4;48094:7;48080;:22::i;:::-;48075:152;;48119:6;:12;;;;;;;;;;;-1:-1:-1;;;;;48119:29:0;;;;;;;;;:36;;-1:-1:-1;;48119:36:0;48151:4;48119:36;;;48202:12;:10;:12::i;:::-;-1:-1:-1;;;;;48175:40:0;48193:7;-1:-1:-1;;;;;48175:40:0;48187:4;48175:40;;;;;;;;;;48005:229;;:::o;5213:414::-;5276:4;5298:21;5308:3;5313:5;5298:9;:21::i;:::-;5293:327;;-1:-1:-1;5336:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;5519:18;;5497:19;;;:12;;;:19;;;;;;:40;;;;5552:11;;5293:327;-1:-1:-1;5603:5:0;5596:12;;17650:157;-1:-1:-1;;;;;;17759:40:0;;-1:-1:-1;;;17759:40:0;17650:157;;;:::o;44582:497::-;44663:22;44671:4;44677:7;44663;:22::i;:::-;44658:414;;44851:41;44879:7;-1:-1:-1;;;;;44851:41:0;44889:2;44851:19;:41::i;:::-;44965:38;44993:4;45000:2;44965:19;:38::i;:::-;44756:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;44756:270:0;;;;;;;;;;-1:-1:-1;;;44702:358:0;;;;;;;:::i;48242:230::-;48317:22;48325:4;48331:7;48317;:22::i;:::-;48313:152;;;48388:5;48356:12;;;;;;;;;;;-1:-1:-1;;;;;48356:29:0;;;;;;;;;:37;;-1:-1:-1;;48356:37:0;;;48440:12;:10;:12::i;:::-;-1:-1:-1;;;;;48413:40:0;48431:7;-1:-1:-1;;;;;48413:40:0;48425:4;48413:40;;;;;;;;;;48242:230;;:::o;5803:1420::-;5869:4;6008:19;;;:12;;;:19;;;;;;6044:15;;6040:1176;;6419:21;6443:14;6456:1;6443:10;:14;:::i;:::-;6492:18;;6419:38;;-1:-1:-1;6472:17:0;;6492:22;;6513:1;;6492:22;:::i;:::-;6472:42;;6548:13;6535:9;:26;6531:405;;6582:17;6602:3;:11;;6614:9;6602:22;;;;;;-1:-1:-1;;;6602:22:0;;;;;;;;;;;;;;;;;6582:42;;6756:9;6727:3;:11;;6739:13;6727:26;;;;;;-1:-1:-1;;;6727:26:0;;;;;;;;;;;;;;;;;;;;:38;;;;6841:23;;;:12;;;:23;;;;;:36;;;6531:405;7017:17;;:3;;:17;;;-1:-1:-1;;;7017:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;7112:3;:12;;:19;7125:5;7112:19;;;;;;;;;;;7105:26;;;7155:4;7148:11;;;;;;;6040:1176;7199:5;7192:12;;;;;7987:120;8054:7;8081:3;:11;;8093:5;8081:18;;;;;;-1:-1:-1;;;8081:18:0;;;;;;;;;;;;;;;;;8074:25;;7987:120;;;;:::o;7524:109::-;7607:18;;7524:109::o;7309:129::-;7382:4;7406:19;;;:12;;;;;:19;;;;;;:24;;;7309:129::o;19426:451::-;19501:13;19527:19;19559:10;19563:6;19559:1;:10;:::i;:::-;:14;;19572:1;19559:14;:::i;:::-;19549:25;;;;;;-1:-1:-1;;;19549:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19549:25:0;;19527:47;;-1:-1:-1;;;19585:6:0;19592:1;19585:9;;;;;;-1:-1:-1;;;19585:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;19585:15:0;;;;;;;;;-1:-1:-1;;;19611:6:0;19618:1;19611:9;;;;;;-1:-1:-1;;;19611:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;19611:15:0;;;;;;;;-1:-1:-1;19642:9:0;19654:10;19658:6;19654:1;:10;:::i;:::-;:14;;19667:1;19654:14;:::i;:::-;19642:26;;19637:135;19674:1;19670;:5;19637:135;;;-1:-1:-1;;;19722:5:0;19730:3;19722:11;19709:25;;;;;-1:-1:-1;;;19709:25:0;;;;;;;;;;;;19697:6;19704:1;19697:9;;;;;;-1:-1:-1;;;19697:9:0;;;;;;;;;;;;:37;-1:-1:-1;;;;;19697:37:0;;;;;;;;-1:-1:-1;19759:1:0;19749:11;;;;;19677:3;;;:::i;:::-;;;19637:135;;;-1:-1:-1;19790:10:0;;19782:55;;;;-1:-1:-1;;;19782:55:0;;;;;;;:::i;14:175:1:-;84:20;;-1:-1:-1;;;;;133:31:1;;123:42;;113:2;;179:1;176;169:12;194:198;;306:2;294:9;285:7;281:23;277:32;274:2;;;327:6;319;312:22;274:2;355:31;376:9;355:31;:::i;397:274::-;;;526:2;514:9;505:7;501:23;497:32;494:2;;;547:6;539;532:22;494:2;575:31;596:9;575:31;:::i;:::-;565:41;;625:40;661:2;650:9;646:18;625:40;:::i;:::-;615:50;;484:187;;;;;:::o;676:342::-;;;;822:2;810:9;801:7;797:23;793:32;790:2;;;843:6;835;828:22;790:2;871:31;892:9;871:31;:::i;:::-;861:41;;921:40;957:2;946:9;942:18;921:40;:::i;:::-;911:50;;1008:2;997:9;993:18;980:32;970:42;;780:238;;;;;:::o;1023:266::-;;;1152:2;1140:9;1131:7;1127:23;1123:32;1120:2;;;1173:6;1165;1158:22;1120:2;1201:31;1222:9;1201:31;:::i;:::-;1191:41;1279:2;1264:18;;;;1251:32;;-1:-1:-1;;;1110:179:1:o;1294:190::-;;1406:2;1394:9;1385:7;1381:23;1377:32;1374:2;;;1427:6;1419;1412:22;1374:2;-1:-1:-1;1455:23:1;;1364:120;-1:-1:-1;1364:120:1:o;1489:266::-;;;1618:2;1606:9;1597:7;1593:23;1589:32;1586:2;;;1639:6;1631;1624:22;1586:2;1680:9;1667:23;1657:33;;1709:40;1745:2;1734:9;1730:18;1709:40;:::i;1760:258::-;;;1889:2;1877:9;1868:7;1864:23;1860:32;1857:2;;;1910:6;1902;1895:22;1857:2;-1:-1:-1;;1938:23:1;;;2008:2;1993:18;;;1980:32;;-1:-1:-1;1847:171:1:o;2023:306::-;;2134:2;2122:9;2113:7;2109:23;2105:32;2102:2;;;2155:6;2147;2140:22;2102:2;2186:23;;-1:-1:-1;;;;;;2238:32:1;;2228:43;;2218:2;;2290:6;2282;2275:22;2529:786;;2940:25;2935:3;2928:38;2995:6;2989:13;3011:62;3066:6;3061:2;3056:3;3052:12;3045:4;3037:6;3033:17;3011:62;:::i;:::-;-1:-1:-1;;;3132:2:1;3092:16;;;3124:11;;;3117:40;3182:13;;3204:63;3182:13;3253:2;3245:11;;3238:4;3226:17;;3204:63;:::i;:::-;3287:17;3306:2;3283:26;;2918:397;-1:-1:-1;;;;2918:397:1:o;3320:203::-;-1:-1:-1;;;;;3484:32:1;;;;3466:51;;3454:2;3439:18;;3421:102::o;3528:187::-;3693:14;;3686:22;3668:41;;3656:2;3641:18;;3623:92::o;3720:177::-;3866:25;;;3854:2;3839:18;;3821:76::o;3902:383::-;;4051:2;4040:9;4033:21;4083:6;4077:13;4126:6;4121:2;4110:9;4106:18;4099:34;4142:66;4201:6;4196:2;4185:9;4181:18;4176:2;4168:6;4164:15;4142:66;:::i;:::-;4269:2;4248:15;-1:-1:-1;;4244:29:1;4229:45;;;;4276:2;4225:54;;4023:262;-1:-1:-1;;4023:262:1:o;4290:356::-;4492:2;4474:21;;;4511:18;;;4504:30;4570:34;4565:2;4550:18;;4543:62;4637:2;4622:18;;4464:182::o;4651:399::-;4853:2;4835:21;;;4892:2;4872:18;;;4865:30;4931:34;4926:2;4911:18;;4904:62;-1:-1:-1;;;4997:2:1;4982:18;;4975:33;5040:3;5025:19;;4825:225::o;5055:344::-;5257:2;5239:21;;;5296:2;5276:18;;;5269:30;-1:-1:-1;;;5330:2:1;5315:18;;5308:50;5390:2;5375:18;;5229:170::o;5404:398::-;5606:2;5588:21;;;5645:2;5625:18;;;5618:30;5684:34;5679:2;5664:18;;5657:62;-1:-1:-1;;;5750:2:1;5735:18;;5728:32;5792:3;5777:19;;5578:224::o;5807:398::-;6009:2;5991:21;;;6048:2;6028:18;;;6021:30;6087:34;6082:2;6067:18;;6060:62;-1:-1:-1;;;6153:2:1;6138:18;;6131:32;6195:3;6180:19;;5981:224::o;6210:402::-;6412:2;6394:21;;;6451:2;6431:18;;;6424:30;6490:34;6485:2;6470:18;;6463:62;-1:-1:-1;;;6556:2:1;6541:18;;6534:36;6602:3;6587:19;;6384:228::o;6617:344::-;6819:2;6801:21;;;6858:2;6838:18;;;6831:30;-1:-1:-1;;;6892:2:1;6877:18;;6870:50;6952:2;6937:18;;6791:170::o;6966:340::-;7168:2;7150:21;;;7207:2;7187:18;;;7180:30;-1:-1:-1;;;7241:2:1;7226:18;;7219:46;7297:2;7282:18;;7140:166::o;7311:404::-;7513:2;7495:21;;;7552:2;7532:18;;;7525:30;7591:34;7586:2;7571:18;;7564:62;-1:-1:-1;;;7657:2:1;7642:18;;7635:38;7705:3;7690:19;;7485:230::o;7720:400::-;7922:2;7904:21;;;7961:2;7941:18;;;7934:30;8000:34;7995:2;7980:18;;7973:62;-1:-1:-1;;;8066:2:1;8051:18;;8044:34;8110:3;8095:19;;7894:226::o;8125:397::-;8327:2;8309:21;;;8366:2;8346:18;;;8339:30;8405:34;8400:2;8385:18;;8378:62;-1:-1:-1;;;8471:2:1;8456:18;;8449:31;8512:3;8497:19;;8299:223::o;8527:401::-;8729:2;8711:21;;;8768:2;8748:18;;;8741:30;8807:34;8802:2;8787:18;;8780:62;-1:-1:-1;;;8873:2:1;8858:18;;8851:35;8918:3;8903:19;;8701:227::o;8933:400::-;9135:2;9117:21;;;9174:2;9154:18;;;9147:30;9213:34;9208:2;9193:18;;9186:62;-1:-1:-1;;;9279:2:1;9264:18;;9257:34;9323:3;9308:19;;9107:226::o;9338:346::-;9540:2;9522:21;;;9579:2;9559:18;;;9552:30;-1:-1:-1;;;9613:2:1;9598:18;;9591:52;9675:2;9660:18;;9512:172::o;9689:401::-;9891:2;9873:21;;;9930:2;9910:18;;;9903:30;9969:34;9964:2;9949:18;;9942:62;-1:-1:-1;;;10035:2:1;10020:18;;10013:35;10080:3;10065:19;;9863:227::o;10095:411::-;10297:2;10279:21;;;10336:2;10316:18;;;10309:30;10375:34;10370:2;10355:18;;10348:62;-1:-1:-1;;;10441:2:1;10426:18;;10419:45;10496:3;10481:19;;10269:237::o;10511:355::-;10713:2;10695:21;;;10752:2;10732:18;;;10725:30;10791:33;10786:2;10771:18;;10764:61;10857:2;10842:18;;10685:181::o;10871:406::-;11073:2;11055:21;;;11112:2;11092:18;;;11085:30;11151:34;11146:2;11131:18;;11124:62;-1:-1:-1;;;11217:2:1;11202:18;;11195:40;11267:3;11252:19;;11045:232::o;11464:184::-;11636:4;11624:17;;;;11606:36;;11594:2;11579:18;;11561:87::o;11653:128::-;;11724:1;11720:6;11717:1;11714:13;11711:2;;;11730:18;;:::i;:::-;-1:-1:-1;11766:9:1;;11701:80::o;11786:168::-;;11892:1;11888;11884:6;11880:14;11877:1;11874:21;11869:1;11862:9;11855:17;11851:45;11848:2;;;11899:18;;:::i;:::-;-1:-1:-1;11939:9:1;;11838:116::o;11959:125::-;;12027:1;12024;12021:8;12018:2;;;12032:18;;:::i;:::-;-1:-1:-1;12069:9:1;;12008:76::o;12089:258::-;12161:1;12171:113;12185:6;12182:1;12179:13;12171:113;;;12261:11;;;12255:18;12242:11;;;12235:39;12207:2;12200:10;12171:113;;;12302:6;12299:1;12296:13;12293:2;;;-1:-1:-1;;12337:1:1;12319:16;;12312:27;12142:205::o;12352:136::-;;12419:5;12409:2;;12428:18;;:::i;:::-;-1:-1:-1;;;12464:18:1;;12399:89::o;12493:380::-;12578:1;12568:12;;12625:1;12615:12;;;12636:2;;12690:4;12682:6;12678:17;12668:27;;12636:2;12743;12735:6;12732:14;12712:18;12709:38;12706:2;;;12789:10;12784:3;12780:20;12777:1;12770:31;12824:4;12821:1;12814:15;12852:4;12849:1;12842:15;12706:2;;12548:325;;;:::o;12878:127::-;12939:10;12934:3;12930:20;12927:1;12920:31;12970:4;12967:1;12960:15;12994:4;12991:1;12984:15

Swarm Source

ipfs://39ce1fe800d7924c0f4ced0d2e6da2ffd9c8350c604d32317f88c2706fc071a9

Block Transaction Gas Used Reward
view all blocks ##produced##

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

OVERVIEW

Dexbrowser is a Web3 data aggregator on Fantom Opera.

Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ 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.