Avalanche Fuji Testnet

Contract

0x19a8085537078e7847a332A76ABaDD5b02B1e736

Overview

AVAX Balance

Avalanche C-Chain LogoAvalanche C-Chain LogoAvalanche C-Chain Logo0 AVAX

Token Holdings

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Grant Role384967692025-03-10 13:59:298 days ago1741615169IN
0x19a80855...b02B1e736
0 AVAX0.0125415500
Grant Role384967062025-03-10 13:56:238 days ago1741614983IN
0x19a80855...b02B1e736
0 AVAX0.0125415500
Grant Role384966732025-03-10 13:55:018 days ago1741614901IN
0x19a80855...b02B1e736
0 AVAX0.0125415500
Grant Role384966492025-03-10 13:54:038 days ago1741614843IN
0x19a80855...b02B1e736
0 AVAX0.0125415500
Grant Role384962912025-03-10 13:39:378 days ago1741613977IN
0x19a80855...b02B1e736
0 AVAX0.0125415500
Grant Role370350582024-12-08 15:51:54100 days ago1733673114IN
0x19a80855...b02B1e736
0 AVAX0.000099231
Grant Role370350532024-12-08 15:51:38100 days ago1733673098IN
0x19a80855...b02B1e736
0 AVAX0.000099231
Grant Role370350512024-12-08 15:51:30100 days ago1733673090IN
0x19a80855...b02B1e736
0 AVAX0.000099231
Grant Role370350462024-12-08 15:51:15100 days ago1733673075IN
0x19a80855...b02B1e736
0 AVAX0.000099231
Grant Role370350452024-12-08 15:51:08100 days ago1733673068IN
0x19a80855...b02B1e736
0 AVAX0.000099231
Grant Role370350242024-12-08 15:50:02100 days ago1733673002IN
0x19a80855...b02B1e736
0 AVAX0.000099231
Grant Role370350182024-12-08 15:49:38100 days ago1733672978IN
0x19a80855...b02B1e736
0 AVAX0.000099231
Grant Role370350172024-12-08 15:49:31100 days ago1733672971IN
0x19a80855...b02B1e736
0 AVAX0.000099231
Grant Role370350092024-12-08 15:49:12100 days ago1733672952IN
0x19a80855...b02B1e736
0 AVAX0.000099231
Grant Role370349842024-12-08 15:47:45100 days ago1733672865IN
0x19a80855...b02B1e736
0 AVAX0.000099231
Grant Role370349822024-12-08 15:47:38100 days ago1733672858IN
0x19a80855...b02B1e736
0 AVAX0.000099231
Grant Role370349772024-12-08 15:47:13100 days ago1733672833IN
0x19a80855...b02B1e736
0 AVAX0.000099231
Grant Role370349682024-12-08 15:46:47100 days ago1733672807IN
0x19a80855...b02B1e736
0 AVAX0.000099231
Grant Role370349542024-12-08 15:46:09100 days ago1733672769IN
0x19a80855...b02B1e736
0 AVAX0.000099231
Grant Role370349462024-12-08 15:45:27100 days ago1733672727IN
0x19a80855...b02B1e736
0 AVAX0.000099231
Grant Role370349332024-12-08 15:44:38100 days ago1733672678IN
0x19a80855...b02B1e736
0 AVAX0.000099231
Grant Role370349322024-12-08 15:44:30100 days ago1733672670IN
0x19a80855...b02B1e736
0 AVAX0.000099231
Grant Role370349282024-12-08 15:44:06100 days ago1733672646IN
0x19a80855...b02B1e736
0 AVAX0.000099231
Grant Role370349242024-12-08 15:43:48100 days ago1733672628IN
0x19a80855...b02B1e736
0 AVAX0.000099231
Grant Role370349202024-12-08 15:43:20100 days ago1733672600IN
0x19a80855...b02B1e736
0 AVAX0.000099231

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
386828132025-03-18 22:11:101 hr ago1742335870
0x19a80855...b02B1e736
0 AVAX
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RoleStore

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 10 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 5 : RoleStore.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import "../utils/EnumerableValues.sol";
import "./Role.sol";
import "../error/Errors.sol";

/**
 * @title RoleStore
 * @dev Stores roles and their members.
 */
contract RoleStore {
    using EnumerableSet for EnumerableSet.AddressSet;
    using EnumerableSet for EnumerableSet.Bytes32Set;
    using EnumerableValues for EnumerableSet.AddressSet;
    using EnumerableValues for EnumerableSet.Bytes32Set;

    EnumerableSet.Bytes32Set internal roles;
    mapping(bytes32 => EnumerableSet.AddressSet) internal roleMembers;
    // checking if an account has a role is a frequently used function
    // roleCache helps to save gas by offering a more efficient lookup
    // vs calling roleMembers[key].contains(account)
    mapping(address => mapping (bytes32 => bool)) roleCache;

    modifier onlyRoleAdmin() {
        if (!hasRole(msg.sender, Role.ROLE_ADMIN)) {
            revert Errors.Unauthorized(msg.sender, "ROLE_ADMIN");
        }
        _;
    }

    constructor() {
        _grantRole(msg.sender, Role.ROLE_ADMIN);
    }

    /**
     * @dev Grants the specified role to the given account.
     *
     * @param account The address of the account.
     * @param roleKey The key of the role to grant.
     */
    function grantRole(address account, bytes32 roleKey) external onlyRoleAdmin {
        _grantRole(account, roleKey);
    }

    /**
     * @dev Revokes the specified role from the given account.
     *
     * @param account The address of the account.
     * @param roleKey The key of the role to revoke.
     */
    function revokeRole(address account, bytes32 roleKey) external onlyRoleAdmin {
        _revokeRole(account, roleKey);
    }

    /**
     * @dev Returns true if the given account has the specified role.
     *
     * @param account The address of the account.
     * @param roleKey The key of the role.
     * @return True if the account has the role, false otherwise.
     */
    function hasRole(address account, bytes32 roleKey) public view returns (bool) {
        return roleCache[account][roleKey];
    }

    /**
     * @dev Returns the number of roles stored in the contract.
     *
     * @return The number of roles.
     */
    function getRoleCount() external view returns (uint256) {
        return roles.length();
    }

    /**
     * @dev Returns the keys of the roles stored in the contract.
     *
     * @param start The starting index of the range of roles to return.
     * @param end The ending index of the range of roles to return.
     * @return The keys of the roles.
     */
    function getRoles(uint256 start, uint256 end) external view returns (bytes32[] memory) {
        return roles.valuesAt(start, end);
    }

    /**
     * @dev Returns the number of members of the specified role.
     *
     * @param roleKey The key of the role.
     * @return The number of members of the role.
     */
    function getRoleMemberCount(bytes32 roleKey) external view returns (uint256) {
        return roleMembers[roleKey].length();
    }

    /**
     * @dev Returns the members of the specified role.
     *
     * @param roleKey The key of the role.
     * @param start the start index, the value for this index will be included.
     * @param end the end index, the value for this index will not be included.
     * @return The members of the role.
     */
    function getRoleMembers(bytes32 roleKey, uint256 start, uint256 end) external view returns (address[] memory) {
        return roleMembers[roleKey].valuesAt(start, end);
    }

    function _grantRole(address account, bytes32 roleKey) internal {
        roles.add(roleKey);
        roleMembers[roleKey].add(account);
        roleCache[account][roleKey] = true;
    }

    function _revokeRole(address account, bytes32 roleKey) internal {
        roleMembers[roleKey].remove(account);
        roleCache[account][roleKey] = false;

        if (roleMembers[roleKey].length() == 0) {
            if (roleKey == Role.ROLE_ADMIN) {
                revert Errors.ThereMustBeAtLeastOneRoleAdmin();
            }
            if (roleKey == Role.TIMELOCK_MULTISIG) {
                revert Errors.ThereMustBeAtLeastOneTimelockMultiSig();
            }
        }
    }
}

File 2 of 5 : EnumerableSet.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (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.
 *
 * [WARNING]
 * ====
 *  Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable.
 *  See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
 *
 *  In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet.
 * ====
 */
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;

        /// @solidity memory-safe-assembly
        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;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

File 3 of 5 : Errors.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity ^0.8.0;

library Errors {
    // AdlUtils errors
    error InvalidSizeDeltaForAdl(uint256 sizeDeltaUsd, uint256 positionSizeInUsd);
    error AdlNotEnabled();

    // Bank errors
    error SelfTransferNotSupported(address receiver);
    error InvalidNativeTokenSender(address msgSender);

    // CallbackUtils errors
    error MaxCallbackGasLimitExceeded(uint256 callbackGasLimit, uint256 maxCallbackGasLimit);

    // Config errors
    error InvalidBaseKey(bytes32 baseKey);
    error InvalidFeeFactor(bytes32 baseKey, uint256 value);

    // Timelock errors
    error ActionAlreadySignalled();
    error ActionNotSignalled();
    error SignalTimeNotYetPassed(uint256 signalTime);
    error InvalidTimelockDelay(uint256 timelockDelay);
    error MaxTimelockDelayExceeded(uint256 timelockDelay);
    error InvalidFeeReceiver(address receiver);
    error InvalidOracleSigner(address receiver);

    // DepositStoreUtils errors
    error DepositNotFound(bytes32 key);

    // DepositUtils errors
    error EmptyDeposit();
    error EmptyDepositAmounts();

    // ExecuteDepositUtils errors
    error MinMarketTokens(uint256 received, uint256 expected);
    error EmptyDepositAmountsAfterSwap();
    error InvalidPoolValueForDeposit(int256 poolValue);
    error InvalidSwapOutputToken(address outputToken, address expectedOutputToken);

    // AdlHandler errors
    error AdlNotRequired(int256 pnlToPoolFactor, uint256 maxPnlFactorForAdl);
    error InvalidAdl(int256 nextPnlToPoolFactor, int256 pnlToPoolFactor);
    error PnlOvercorrected(int256 nextPnlToPoolFactor, uint256 minPnlFactorForAdl);

    // ExchangeUtils errors
    error RequestNotYetCancellable(uint256 requestAge, uint256 requestExpirationAge, string requestType);

    // OrderHandler errors
    error OrderNotUpdatable(uint256 orderType);
    error InvalidKeeperForFrozenOrder(address keeper);

    // FeatureUtils errors
    error DisabledFeature(bytes32 key);

    // FeeHandler errors
    error InvalidClaimFeesInput(uint256 marketsLength, uint256 tokensLength);

    // GasUtils errors
    error InsufficientExecutionFee(uint256 minExecutionFee, uint256 executionFee);
    error InsufficientWntAmountForExecutionFee(uint256 wntAmount, uint256 executionFee);
    error InsufficientExecutionGas(uint256 startingGas, uint256 minHandleErrorGas);

    // MarketFactory errors
    error MarketAlreadyExists(bytes32 salt, address existingMarketAddress);

    // MarketStoreUtils errors
    error MarketNotFound(address key);

    // MarketUtils errors
    error EmptyMarket();
    error DisabledMarket(address market);
    error MaxSwapPathLengthExceeded(uint256 swapPathLengh, uint256 maxSwapPathLength);
    error InsufficientPoolAmount(uint256 poolAmount, uint256 amount);
    error InsufficientReserve(uint256 reservedUsd, uint256 maxReservedUsd);
    error UnableToGetOppositeToken(address inputToken, address market);
    error UnexpectedTokenForVirtualInventory(address token, address market);
    error EmptyMarketTokenSupply();
    error InvalidSwapMarket(address market);
    error UnableToGetCachedTokenPrice(address token, address market);
    error CollateralAlreadyClaimed(uint256 adjustedClaimableAmount, uint256 claimedAmount);
    error OpenInterestCannotBeUpdatedForSwapOnlyMarket(address market);
    error MaxOpenInterestExceeded(uint256 openInterest, uint256 maxOpenInterest);
    error MaxPoolAmountExceeded(uint256 poolAmount, uint256 maxPoolAmount);
    error UnexpectedBorrowingFactor(uint256 positionBorrowingFactor, uint256 cumulativeBorrowingFactor);
    error UnableToGetBorrowingFactorEmptyPoolUsd();
    error UnableToGetFundingFactorEmptyOpenInterest();
    error InvalidPositionMarket(address market);
    error InvalidCollateralTokenForMarket(address market, address token);
    error PnlFactorExceededForLongs(int256 pnlToPoolFactor, uint256 maxPnlFactor);
    error PnlFactorExceededForShorts(int256 pnlToPoolFactor, uint256 maxPnlFactor);
    error InvalidUiFeeFactor(uint256 uiFeeFactor, uint256 maxUiFeeFactor);
    error EmptyAddressInMarketTokenBalanceValidation(address market, address token);
    error InvalidMarketTokenBalance(address market, address token, uint256 balance, uint256 expectedMinBalance);
    error InvalidMarketTokenBalanceForCollateralAmount(address market, address token, uint256 balance, uint256 collateralAmount);
    error InvalidMarketTokenBalanceForClaimableFunding(address market, address token, uint256 balance, uint256 claimableFundingFeeAmount);
    error UnexpectedPoolValue(int256 poolValue);

    // Oracle errors
    error EmptySigner(uint256 signerIndex);
    error InvalidBlockNumber(uint256 minOracleBlockNumber, uint256 currentBlockNumber);
    error InvalidMinMaxBlockNumber(uint256 minOracleBlockNumber, uint256 maxOracleBlockNumber);
    error MaxPriceAgeExceeded(uint256 oracleTimestamp, uint256 currentTimestamp);
    error MinOracleSigners(uint256 oracleSigners, uint256 minOracleSigners);
    error MaxOracleSigners(uint256 oracleSigners, uint256 maxOracleSigners);
    error BlockNumbersNotSorted(uint256 minOracleBlockNumber, uint256 prevMinOracleBlockNumber);
    error MinPricesNotSorted(address token, uint256 price, uint256 prevPrice);
    error MaxPricesNotSorted(address token, uint256 price, uint256 prevPrice);
    error EmptyPriceFeedMultiplier(address token);
    error InvalidFeedPrice(address token, int256 price);
    error PriceFeedNotUpdated(address token, uint256 timestamp, uint256 heartbeatDuration);
    error MaxSignerIndex(uint256 signerIndex, uint256 maxSignerIndex);
    error InvalidOraclePrice(address token);
    error InvalidSignerMinMaxPrice(uint256 minPrice, uint256 maxPrice);
    error InvalidMedianMinMaxPrice(uint256 minPrice, uint256 maxPrice);
    error DuplicateTokenPrice(address token);
    error NonEmptyTokensWithPrices(uint256 tokensWithPricesLength);
    error EmptyPriceFeed(address token);
    error PriceAlreadySet(address token, uint256 minPrice, uint256 maxPrice);
    error MaxRefPriceDeviationExceeded(
        address token,
        uint256 price,
        uint256 refPrice,
        uint256 maxRefPriceDeviationFactor
    );

    // OracleModule errors
    error InvalidPrimaryPricesForSimulation(uint256 primaryTokensLength, uint256 primaryPricesLength);
    error EndOfOracleSimulation();

    // OracleUtils errors
    error EmptyCompactedPrice(uint256 index);
    error EmptyCompactedBlockNumber(uint256 index);
    error EmptyCompactedTimestamp(uint256 index);
    error InvalidSignature(address recoveredSigner, address expectedSigner);

    error EmptyPrimaryPrice(address token);

    error OracleBlockNumbersAreSmallerThanRequired(uint256[] oracleBlockNumbers, uint256 expectedBlockNumber);
    error OracleBlockNumberNotWithinRange(
        uint256[] minOracleBlockNumbers,
        uint256[] maxOracleBlockNumbers,
        uint256 blockNumber
    );

    // BaseOrderUtils errors
    error EmptyOrder();
    error UnsupportedOrderType();
    error InvalidOrderPrices(
        uint256 primaryPriceMin,
        uint256 primaryPriceMax,
        uint256 triggerPrice,
        uint256 orderType
    );
    error PriceImpactLargerThanOrderSize(int256 priceImpactUsd, uint256 sizeDeltaUsd);
    error NegativeExecutionPrice(int256 executionPrice, uint256 price, uint256 positionSizeInUsd, int256 priceImpactUsd, uint256 sizeDeltaUsd);
    error OrderNotFulfillableAtAcceptablePrice(uint256 price, uint256 acceptablePrice);

    // IncreaseOrderUtils errors
    error UnexpectedPositionState();

    // OrderUtils errors
    error OrderTypeCannotBeCreated(uint256 orderType);
    error OrderAlreadyFrozen();

    // OrderStoreUtils errors
    error OrderNotFound(bytes32 key);

    // SwapOrderUtils errors
    error UnexpectedMarket();

    // DecreasePositionCollateralUtils errors
    error InsufficientFundsToPayForCosts(uint256 remainingCostUsd, string step);
    error InvalidOutputToken(address tokenOut, address expectedTokenOut);

    // DecreasePositionUtils errors
    error InvalidDecreaseOrderSize(uint256 sizeDeltaUsd, uint256 positionSizeInUsd);
    error UnableToWithdrawCollateral(int256 estimatedRemainingCollateralUsd);
    error InvalidDecreasePositionSwapType(uint256 decreasePositionSwapType);
    error PositionShouldNotBeLiquidated();

    // IncreasePositionUtils errors
    error InsufficientCollateralAmount(uint256 collateralAmount, int256 collateralDeltaAmount);
    error InsufficientCollateralUsd(int256 remainingCollateralUsd);
    error NegativeSizeDeltaInTokens(uint256 baseSizeDeltaInTokens, int256 priceImpactAmount);

    // PositionStoreUtils errors
    error PositionNotFound(bytes32 key);

    // PositionUtils errors
    error LiquidatablePosition(string reason);
    error EmptyPosition();
    error InvalidPositionSizeValues(uint256 sizeInUsd, uint256 sizeInTokens);
    error MinPositionSize(uint256 positionSizeInUsd, uint256 minPositionSizeUsd);

    // PositionPricingUtils errors
    error UsdDeltaExceedsLongOpenInterest(int256 usdDelta, uint256 longOpenInterest);
    error UsdDeltaExceedsShortOpenInterest(int256 usdDelta, uint256 shortOpenInterest);

    // SwapPricingUtils errors
    error UsdDeltaExceedsPoolValue(int256 usdDelta, uint256 poolUsd);

    // RoleModule errors
    error Unauthorized(address msgSender, string role);

    // RoleStore errors
    error ThereMustBeAtLeastOneRoleAdmin();
    error ThereMustBeAtLeastOneTimelockMultiSig();

    // ExchangeRouter errors
    error InvalidClaimFundingFeesInput(uint256 marketsLength, uint256 tokensLength);
    error InvalidClaimCollateralInput(uint256 marketsLength, uint256 tokensLength, uint256 timeKeysLength);
    error InvalidClaimAffiliateRewardsInput(uint256 marketsLength, uint256 tokensLength);
    error InvalidClaimUiFeesInput(uint256 marketsLength, uint256 tokensLength);

    // SwapUtils errors
    error InvalidTokenIn(address tokenIn, address market);
    error InsufficientOutputAmount(uint256 outputAmount, uint256 minOutputAmount);
    error InsufficientSwapOutputAmount(uint256 outputAmount, uint256 minOutputAmount);
    error DuplicatedMarketInSwapPath(address market);
    error SwapPriceImpactExceedsAmountIn(uint256 amountAfterFees, int256 negativeImpactAmount);

    // TokenUtils errors
    error EmptyTokenTranferGasLimit(address token);
    error TokenTransferError(address token, address receiver, uint256 amount);
    error EmptyHoldingAddress();

    // AccountUtils errors
    error EmptyAccount();
    error EmptyReceiver();

    // Array errors
    error CompactedArrayOutOfBounds(
        uint256[] compactedValues,
        uint256 index,
        uint256 slotIndex,
        string label
    );

    error ArrayOutOfBoundsUint256(
        uint256[] values,
        uint256 index,
        string label
    );

    error ArrayOutOfBoundsBytes(
        bytes[] values,
        uint256 index,
        string label
    );

    // WithdrawalStoreUtils errors
    error WithdrawalNotFound(bytes32 key);

    // WithdrawalUtils errors
    error EmptyWithdrawal();
    error EmptyWithdrawalAmount();
    error MinLongTokens(uint256 received, uint256 expected);
    error MinShortTokens(uint256 received, uint256 expected);
    error InsufficientMarketTokens(uint256 balance, uint256 expected);
    error InsufficientWntAmount(uint256 wntAmount, uint256 executionFee);
    error InvalidPoolValueForWithdrawal(int256 poolValue);

    // Uint256Mask errors
    error MaskIndexOutOfBounds(uint256 index, string label);
    error DuplicatedIndex(uint256 index, string label);
}

File 4 of 5 : Role.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity ^0.8.0;

/**
 * @title Role
 * @dev Library for role keys
 */
library Role {
    /**
     * @dev The ROLE_ADMIN role.
     */
    bytes32 public constant ROLE_ADMIN = keccak256(abi.encode("ROLE_ADMIN"));

    /**
     * @dev The TIMELOCK_ADMIN role.
     */
    bytes32 public constant TIMELOCK_ADMIN = keccak256(abi.encode("TIMELOCK_ADMIN"));

    /**
     * @dev The TIMELOCK_MULTISIG role.
     */
    bytes32 public constant TIMELOCK_MULTISIG = keccak256(abi.encode("TIMELOCK_MULTISIG"));

    /**
     * @dev The CONFIG_KEEPER role.
     */
    bytes32 public constant CONFIG_KEEPER = keccak256(abi.encode("CONFIG_KEEPER"));

    /**
     * @dev The CONTROLLER role.
     */
    bytes32 public constant CONTROLLER = keccak256(abi.encode("CONTROLLER"));

    /**
     * @dev The ROUTER_PLUGIN role.
     */
    bytes32 public constant ROUTER_PLUGIN = keccak256(abi.encode("ROUTER_PLUGIN"));

    /**
     * @dev The MARKET_KEEPER role.
     */
    bytes32 public constant MARKET_KEEPER = keccak256(abi.encode("MARKET_KEEPER"));

    /**
     * @dev The FEE_KEEPER role.
     */
    bytes32 public constant FEE_KEEPER = keccak256(abi.encode("FEE_KEEPER"));

    /**
     * @dev The ORDER_KEEPER role.
     */
    bytes32 public constant ORDER_KEEPER = keccak256(abi.encode("ORDER_KEEPER"));

    /**
     * @dev The FROZEN_ORDER_KEEPER role.
     */
    bytes32 public constant FROZEN_ORDER_KEEPER = keccak256(abi.encode("FROZEN_ORDER_KEEPER"));

    /**
     * @dev The PRICING_KEEPER role.
     */
    bytes32 public constant PRICING_KEEPER = keccak256(abi.encode("PRICING_KEEPER"));
    /**
     * @dev The LIQUIDATION_KEEPER role.
     */
    bytes32 public constant LIQUIDATION_KEEPER = keccak256(abi.encode("LIQUIDATION_KEEPER"));
    /**
     * @dev The ADL_KEEPER role.
     */
    bytes32 public constant ADL_KEEPER = keccak256(abi.encode("ADL_KEEPER"));
}

File 5 of 5 : EnumerableValues.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";

/**
 * @title EnumerableValues
 * @dev Library to extend the EnumerableSet library with functions to get
 * valuesAt for a range
 */
library EnumerableValues {
    using EnumerableSet for EnumerableSet.Bytes32Set;
    using EnumerableSet for EnumerableSet.AddressSet;
    using EnumerableSet for EnumerableSet.UintSet;

    /**
     * Returns an array of bytes32 values from the given set, starting at the given
     * start index and ending before the given end index.
     *
     * @param set The set to get the values from.
     * @param start The starting index.
     * @param end The ending index.
     * @return An array of bytes32 values.
     */
    function valuesAt(EnumerableSet.Bytes32Set storage set, uint256 start, uint256 end) internal view returns (bytes32[] memory) {
        uint256 max = set.length();
        if (end > max) { end = max; }

        bytes32[] memory items = new bytes32[](end - start);
        for (uint256 i = start; i < end; i++) {
            items[i - start] = set.at(i);
        }

        return items;
    }


    /**
     * Returns an array of address values from the given set, starting at the given
     * start index and ending before the given end index.
     *
     * @param set The set to get the values from.
     * @param start The starting index.
     * @param end The ending index.
     * @return An array of address values.
     */
    function valuesAt(EnumerableSet.AddressSet storage set, uint256 start, uint256 end) internal view returns (address[] memory) {
        uint256 max = set.length();
        if (end > max) { end = max; }

        address[] memory items = new address[](end - start);
        for (uint256 i = start; i < end; i++) {
            items[i - start] = set.at(i);
        }

        return items;
    }


    /**
     * Returns an array of uint256 values from the given set, starting at the given
     * start index and ending before the given end index, the item at the end index will not be returned.
     *
     * @param set The set to get the values from.
     * @param start The starting index (inclusive, item at the start index will be returned).
     * @param end The ending index (exclusive, item at the end index will not be returned).
     * @return An array of uint256 values.
     */
    function valuesAt(EnumerableSet.UintSet storage set, uint256 start, uint256 end) internal view returns (uint256[] memory) {
        if (start >= set.length()) {
            return new uint256[](0);
        }

        uint256 max = set.length();
        if (end > max) { end = max; }

        uint256[] memory items = new uint256[](end - start);
        for (uint256 i = start; i < end; i++) {
            items[i - start] = set.at(i);
        }

        return items;
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 10,
    "details": {
      "constantOptimizer": true
    }
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {}
}

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ThereMustBeAtLeastOneRoleAdmin","type":"error"},{"inputs":[],"name":"ThereMustBeAtLeastOneTimelockMultiSig","type":"error"},{"inputs":[{"internalType":"address","name":"msgSender","type":"address"},{"internalType":"string","name":"role","type":"string"}],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"getRoleCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"roleKey","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"roleKey","type":"bytes32"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getRoleMembers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getRoles","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"roleKey","type":"bytes32"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"roleKey","type":"bytes32"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"roleKey","type":"bytes32"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b5061006433604051602001610043906020808252600a90820152692927a622afa0a226a4a760b11b604082015260600190565b6040516020818303038152906040528051906020012061006960201b60201c565b61014c565b6100818160006100d760201b61025d1790919060201c565b5060008181526002602090815260409091206100a69184906102696100ec821b17901c565b506001600160a01b03909116600090815260036020908152604080832093835292905220805460ff19166001179055565b60006100e383836100fd565b90505b92915050565b60006100e3836001600160a01b0384165b6000818152600183016020526040812054610144575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556100e6565b5060006100e6565b6109268061015b6000396000f3fe608060405234801561001057600080fd5b506004361061006d5760003560e01c8063208dd1ff146100725780632a861f5714610087578063821c1898146100b057806383d33319146100d0578063ab2742dc146100e6578063ac4ab3fb146100f9578063ca15c8731461011c575b600080fd5b6100856100803660046106f6565b61012f565b005b61009a61009536600461072e565b610193565b6040516100a7919061075a565b60405180910390f35b6100c36100be3660046107a7565b6101b7565b6040516100a791906107c9565b6100d86101ce565b6040519081526020016100a7565b6100856100f43660046106f6565b6101df565b61010c6101073660046106f6565b61021b565b60405190151581526020016100a7565b6100d861012a366004610801565b610246565b61015d3360405160200161014290610837565b6040516020818303038152906040528051906020012061021b565b610185573360405163a35b150b60e01b815260040161017c9190610849565b60405180910390fd5b61018f828261027e565b5050565b60008381526002602052604090206060906101af908484610387565b949350505050565b60606101c560008484610454565b90505b92915050565b60006101da600061050a565b905090565b6101f23360405160200161014290610837565b610211573360405163a35b150b60e01b815260040161017c9190610849565b61018f8282610514565b6001600160a01b03919091166000908152600360209081526040808320938352929052205460ff1690565b60008181526002602052604081206101c89061050a565b60006101c58383610569565b60006101c5836001600160a01b038416610569565b600081815260026020526040902061029690836105b8565b506001600160a01b03821660009081526003602090815260408083208484528252808320805460ff19169055600290915290206102d29061050a565b60000361018f576040516020016102e890610837565b60405160208183030381529060405280519060200120810361031d57604051635bc1e44560e11b815260040160405180910390fd5b6040516020016103529060208082526011908201527054494d454c4f434b5f4d554c544953494760781b604082015260600190565b60405160208183030381529060405280519060200120810361018f57604051630282b5b760e41b815260040160405180910390fd5b606060006103948561050a565b9050808311156103a2578092505b60006103ae8585610882565b6001600160401b038111156103c5576103c5610895565b6040519080825280602002602001820160405280156103ee578160200160208202803683370190505b509050845b8481101561044a5761040587826105cd565b826104108884610882565b81518110610420576104206108ab565b6001600160a01b039092166020928302919091019091015280610442816108c1565b9150506103f3565b5095945050505050565b606060006104618561050a565b90508083111561046f578092505b600061047b8585610882565b6001600160401b0381111561049257610492610895565b6040519080825280602002602001820160405280156104bb578160200160208202803683370190505b509050845b8481101561044a576104d287826105cd565b826104dd8884610882565b815181106104ed576104ed6108ab565b602090810291909101015280610502816108c1565b9150506104c0565b60006101c8825490565b61051f60008261025d565b5060008181526002602052604090206105389083610269565b506001600160a01b03909116600090815260036020908152604080832093835292905220805460ff19166001179055565b60008181526001830160205260408120546105b0575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556101c8565b5060006101c8565b60006101c5836001600160a01b0384166105d9565b60006101c583836106cc565b600081815260018301602052604081205480156106c25760006105fd600183610882565b855490915060009061061190600190610882565b9050818114610676576000866000018281548110610631576106316108ab565b9060005260206000200154905080876000018481548110610654576106546108ab565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610687576106876108da565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506101c8565b60009150506101c8565b60008260000182815481106106e3576106e36108ab565b9060005260206000200154905092915050565b6000806040838503121561070957600080fd5b82356001600160a01b038116811461072057600080fd5b946020939093013593505050565b60008060006060848603121561074357600080fd5b505081359360208301359350604090920135919050565b6020808252825182820181905260009190848201906040850190845b8181101561079b5783516001600160a01b031683529284019291840191600101610776565b50909695505050505050565b600080604083850312156107ba57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b8181101561079b578351835292840192918401916001016107e5565b60006020828403121561081357600080fd5b5035919050565b600a8152692927a622afa0a226a4a760b11b602082015260400190565b6020815260006101c86020830161081a565b6001600160a01b03821681526040602082018190526000906101c590830161081a565b634e487b7160e01b600052601160045260246000fd5b818103818111156101c8576101c861086c565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000600182016108d3576108d361086c565b5060010190565b634e487b7160e01b600052603160045260246000fdfea264697066735822122003e3776d4334d260b8378e5387427395061ea0a35dc326569107bb98d6b426f664736f6c63430008120033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061006d5760003560e01c8063208dd1ff146100725780632a861f5714610087578063821c1898146100b057806383d33319146100d0578063ab2742dc146100e6578063ac4ab3fb146100f9578063ca15c8731461011c575b600080fd5b6100856100803660046106f6565b61012f565b005b61009a61009536600461072e565b610193565b6040516100a7919061075a565b60405180910390f35b6100c36100be3660046107a7565b6101b7565b6040516100a791906107c9565b6100d86101ce565b6040519081526020016100a7565b6100856100f43660046106f6565b6101df565b61010c6101073660046106f6565b61021b565b60405190151581526020016100a7565b6100d861012a366004610801565b610246565b61015d3360405160200161014290610837565b6040516020818303038152906040528051906020012061021b565b610185573360405163a35b150b60e01b815260040161017c9190610849565b60405180910390fd5b61018f828261027e565b5050565b60008381526002602052604090206060906101af908484610387565b949350505050565b60606101c560008484610454565b90505b92915050565b60006101da600061050a565b905090565b6101f23360405160200161014290610837565b610211573360405163a35b150b60e01b815260040161017c9190610849565b61018f8282610514565b6001600160a01b03919091166000908152600360209081526040808320938352929052205460ff1690565b60008181526002602052604081206101c89061050a565b60006101c58383610569565b60006101c5836001600160a01b038416610569565b600081815260026020526040902061029690836105b8565b506001600160a01b03821660009081526003602090815260408083208484528252808320805460ff19169055600290915290206102d29061050a565b60000361018f576040516020016102e890610837565b60405160208183030381529060405280519060200120810361031d57604051635bc1e44560e11b815260040160405180910390fd5b6040516020016103529060208082526011908201527054494d454c4f434b5f4d554c544953494760781b604082015260600190565b60405160208183030381529060405280519060200120810361018f57604051630282b5b760e41b815260040160405180910390fd5b606060006103948561050a565b9050808311156103a2578092505b60006103ae8585610882565b6001600160401b038111156103c5576103c5610895565b6040519080825280602002602001820160405280156103ee578160200160208202803683370190505b509050845b8481101561044a5761040587826105cd565b826104108884610882565b81518110610420576104206108ab565b6001600160a01b039092166020928302919091019091015280610442816108c1565b9150506103f3565b5095945050505050565b606060006104618561050a565b90508083111561046f578092505b600061047b8585610882565b6001600160401b0381111561049257610492610895565b6040519080825280602002602001820160405280156104bb578160200160208202803683370190505b509050845b8481101561044a576104d287826105cd565b826104dd8884610882565b815181106104ed576104ed6108ab565b602090810291909101015280610502816108c1565b9150506104c0565b60006101c8825490565b61051f60008261025d565b5060008181526002602052604090206105389083610269565b506001600160a01b03909116600090815260036020908152604080832093835292905220805460ff19166001179055565b60008181526001830160205260408120546105b0575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556101c8565b5060006101c8565b60006101c5836001600160a01b0384166105d9565b60006101c583836106cc565b600081815260018301602052604081205480156106c25760006105fd600183610882565b855490915060009061061190600190610882565b9050818114610676576000866000018281548110610631576106316108ab565b9060005260206000200154905080876000018481548110610654576106546108ab565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610687576106876108da565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506101c8565b60009150506101c8565b60008260000182815481106106e3576106e36108ab565b9060005260206000200154905092915050565b6000806040838503121561070957600080fd5b82356001600160a01b038116811461072057600080fd5b946020939093013593505050565b60008060006060848603121561074357600080fd5b505081359360208301359350604090920135919050565b6020808252825182820181905260009190848201906040850190845b8181101561079b5783516001600160a01b031683529284019291840191600101610776565b50909695505050505050565b600080604083850312156107ba57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b8181101561079b578351835292840192918401916001016107e5565b60006020828403121561081357600080fd5b5035919050565b600a8152692927a622afa0a226a4a760b11b602082015260400190565b6020815260006101c86020830161081a565b6001600160a01b03821681526040602082018190526000906101c590830161081a565b634e487b7160e01b600052601160045260246000fd5b818103818111156101c8576101c861086c565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000600182016108d3576108d361086c565b5060010190565b634e487b7160e01b600052603160045260246000fdfea264697066735822122003e3776d4334d260b8378e5387427395061ea0a35dc326569107bb98d6b426f664736f6c63430008120033

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

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
Loading...
Loading
[ 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.