Contract 0x648C8Be548F43eca4e482C0801Ebccccfb944931 1

Contract Overview

Balance:
0 Ether
Txn Hash
Method
Block
From
To
Value
0xd9839de5208964ec7b14cee39ed315b8d3929dac1ca2cb630025a67cf136136b0x6080604096703182021-11-19 16:04:07315 days 7 hrs ago0x2a61d3ba5030ef471c74f612962c7367eca3a62d IN  Create: RewardProgramsRegistry0 Ether0.000953521.00000001
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xbcdbecac621de49b0e32cd67211cc076c7c0fc4dbf2bb2ff5f8a5ff4fa003618113314722022-09-06 5:57:1924 days 17 hrs ago 0xbb0f594143208ecd04dc7aae48955902a716f9f7 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
0xe5d81b0d8fa98b41d42f77cc3bb8aaf89c9e0e37aee1c91da47c3680bcab3849101430922022-02-10 11:11:18232 days 12 hrs ago 0xbb0f594143208ecd04dc7aae48955902a716f9f7 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
0xab64e1af79a69536825b15c9f205a0d6a74c9a0f3970eaba6e3aae446f7c7d1b101389282022-02-09 11:33:31233 days 12 hrs ago 0x3129c041b372ee93a5a8756dc4ec6f154d85bc9a 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
0xcea7535511e24cba1bc5bb8f834e42c79bf799eabcdfb36e286d990b01bb98dc101281082022-02-07 14:26:42235 days 9 hrs ago 0xbb0f594143208ecd04dc7aae48955902a716f9f7 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
0xb59fe3476c05dfe9cbc4756333e7e791e720643db211b4e320c1c31357c613ac101279652022-02-07 13:50:57235 days 9 hrs ago 0xbb0f594143208ecd04dc7aae48955902a716f9f7 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
0x72fff67892dc087558c2c676a5007e5f62aeac78182f8d0ad0b0815fd6dda399100702992022-01-28 13:26:51245 days 10 hrs ago 0xbb0f594143208ecd04dc7aae48955902a716f9f7 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
0xbf78838e08c442905748687f2b2977ae2298d78d1ede42775f1666469c591222100059922022-01-17 9:19:13256 days 14 hrs ago 0x2667c7e8731d7314e7c492700ad440f7c3724184 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
0xbf78838e08c442905748687f2b2977ae2298d78d1ede42775f1666469c591222100059922022-01-17 9:19:13256 days 14 hrs ago 0xc21e5e72ffc223f02fc410aaede3084a63963932 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
0x74a4f73ff001785d09d32a150c4fb52e80cb956b35d8e92c6d9f02ed404c816799781162022-01-12 10:49:57261 days 12 hrs ago 0xc21e5e72ffc223f02fc410aaede3084a63963932 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
0x91ab4a9de8129f1e48eecbabeb42bec72fea9f610da8f2ac058fb568ea66910e99719842022-01-11 9:16:06262 days 14 hrs ago 0x3129c041b372ee93a5a8756dc4ec6f154d85bc9a 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
0x518ea5b575b800987b8d755a107a23b732a62b6cc3fc7425a8a0bfba16a29ea899719652022-01-11 9:11:20262 days 14 hrs ago 0x3129c041b372ee93a5a8756dc4ec6f154d85bc9a 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
0xa50462e820709dbba74a8b5b389e0791dd88d1ad9cf5cfcce622318041cb5cb299661102022-01-10 8:46:41263 days 14 hrs ago 0xbb0f594143208ecd04dc7aae48955902a716f9f7 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
0x691f6310bcf10b94a346874f1d92c2de6327aaf0e728b6131216f9d3cf5d061c98924612021-12-28 8:58:22276 days 14 hrs ago 0xbb0f594143208ecd04dc7aae48955902a716f9f7 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
0xa248c096bd8a34237fa0d6312b4e6adc653b065d918ce252244a2458a5f8c2d498924412021-12-28 8:53:22276 days 14 hrs ago 0xc21e5e72ffc223f02fc410aaede3084a63963932 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
0x8e74fc51e0c98a25b674bff42910f5e2926dc1c22ef0b1129ef4fb8b811f6bbd98924322021-12-28 8:51:07276 days 14 hrs ago 0x3129c041b372ee93a5a8756dc4ec6f154d85bc9a 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
0x5b656099d11f2d1204c9a615142e7f14f928684ae3fd8ec0cea44c19603bfed898637982021-12-23 9:30:20281 days 14 hrs ago 0xbb0f594143208ecd04dc7aae48955902a716f9f7 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
0x1ba4215820a86ee5ecb114129f87fe95c3e2dd222d1cc0a33d80ee00d05a3de798464062021-12-20 9:00:55284 days 14 hrs ago 0xbb0f594143208ecd04dc7aae48955902a716f9f7 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
0x9390d60620b79e793742fadb37121fae640371f2ed0e2d2bfabbdf4ded49740e98187042021-12-15 13:32:09289 days 10 hrs ago 0xbb0f594143208ecd04dc7aae48955902a716f9f7 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
0xb1fa3393d74a448cbd20952e53d7ee2b55ce8cb43c1629dfae50117541fb0b8c97490662021-12-03 8:18:57301 days 15 hrs ago 0x2667c7e8731d7314e7c492700ad440f7c3724184 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
0xb1fa3393d74a448cbd20952e53d7ee2b55ce8cb43c1629dfae50117541fb0b8c97490662021-12-03 8:18:57301 days 15 hrs ago 0xc21e5e72ffc223f02fc410aaede3084a63963932 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
0x011c1f8c4b09951be900cf92d987be682dbb603b555f67e031ec0b928bc28e4197490622021-12-03 8:17:57301 days 15 hrs ago 0xbb0f594143208ecd04dc7aae48955902a716f9f7 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
0x011c1f8c4b09951be900cf92d987be682dbb603b555f67e031ec0b928bc28e4197490622021-12-03 8:17:57301 days 15 hrs ago 0xbb0f594143208ecd04dc7aae48955902a716f9f7 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
0xec3b792768e0ef9c0e86710404ed6ad78b7d095bbee34947d9fb44f974a5fb0d97456422021-12-02 18:02:29302 days 5 hrs ago 0xbb0f594143208ecd04dc7aae48955902a716f9f7 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
0xec3b792768e0ef9c0e86710404ed6ad78b7d095bbee34947d9fb44f974a5fb0d97456422021-12-02 18:02:29302 days 5 hrs ago 0xbb0f594143208ecd04dc7aae48955902a716f9f7 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
0x0d53068eff1c3491f4889c95c2ceebe6248a98bfcd3815af3fdd031ca2f4c51097449652021-12-02 15:13:09302 days 8 hrs ago 0xbb0f594143208ecd04dc7aae48955902a716f9f7 0x648c8be548f43eca4e482c0801ebccccfb9449310 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RewardProgramsRegistry

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-19
*/

// SPDX-License-Identifier: MIT AND GPL-3.0
// File: OpenZeppelin/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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: contracts/RewardProgramsRegistry.sol

// SPDX-FileCopyrightText: 2021 Lido <[email protected]>

pragma solidity ^0.8.4;


/// @author psirex
/// @title Registry of allowed reward programs
/// @notice Stores list of addresses with reward programs
contract RewardProgramsRegistry is AccessControl {
    // -------------
    // EVENTS
    // -------------
    event RewardProgramAdded(address indexed _rewardProgram, string _title);
    event RewardProgramRemoved(address indexed _rewardProgram);

    // -------------
    // ROLES
    // -------------
    bytes32 public constant ADD_REWARD_PROGRAM_ROLE = keccak256("ADD_REWARD_PROGRAM_ROLE");
    bytes32 public constant REMOVE_REWARD_PROGRAM_ROLE = keccak256("REMOVE_REWARD_PROGRAM_ROLE");

    // -------------
    // ERRORS
    // -------------
    string private constant ERROR_REWARD_PROGRAM_ALREADY_ADDED = "REWARD_PROGRAM_ALREADY_ADDED";
    string private constant ERROR_REWARD_PROGRAM_NOT_FOUND = "REWARD_PROGRAM_NOT_FOUND";

    // -------------
    // VARIABLES
    // -------------

    /// @dev List of allowed reward program addresses
    address[] public rewardPrograms;

    // Position of the reward program in the `rewardPrograms` array,
    // plus 1 because index 0 means a value is not in the set.
    mapping(address => uint256) private rewardProgramIndices;

    // -------------
    // CONSTRUCTOR
    // -------------

    /// @param _admin Address which will be granted with role DEFAULT_ADMIN_ROLE
    /// @param _addRewardProgramRoleHolders List of addresses which will be
    ///     granted with role ADD_REWARD_PROGRAM_ROLE
    /// @param _removeRewardProgramRoleHolders List of addresses which will
    ///     be granted with role REMOVE_REWARD_PROGRAM_ROLE
    constructor(
        address _admin,
        address[] memory _addRewardProgramRoleHolders,
        address[] memory _removeRewardProgramRoleHolders
    ) {
        _setupRole(DEFAULT_ADMIN_ROLE, _admin);
        for (uint256 i = 0; i < _addRewardProgramRoleHolders.length; i++) {
            _setupRole(ADD_REWARD_PROGRAM_ROLE, _addRewardProgramRoleHolders[i]);
        }
        for (uint256 i = 0; i < _removeRewardProgramRoleHolders.length; i++) {
            _setupRole(REMOVE_REWARD_PROGRAM_ROLE, _removeRewardProgramRoleHolders[i]);
        }
    }

    // -------------
    // EXTERNAL METHODS
    // -------------

    /// @notice Adds address to list of allowed reward programs
    function addRewardProgram(address _rewardProgram, string memory _title)
        external
        onlyRole(ADD_REWARD_PROGRAM_ROLE)
    {
        require(rewardProgramIndices[_rewardProgram] == 0, ERROR_REWARD_PROGRAM_ALREADY_ADDED);

        rewardPrograms.push(_rewardProgram);
        rewardProgramIndices[_rewardProgram] = rewardPrograms.length;
        emit RewardProgramAdded(_rewardProgram, _title);
    }

    /// @notice Removes address from list of allowed reward programs
    /// @dev To delete a reward program from the rewardPrograms 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').
    function removeRewardProgram(address _rewardProgram)
        external
        onlyRole(REMOVE_REWARD_PROGRAM_ROLE)
    {
        uint256 index = _getRewardProgramIndex(_rewardProgram);
        uint256 lastIndex = rewardPrograms.length - 1;

        if (index != lastIndex) {
            address lastRewardProgram = rewardPrograms[lastIndex];
            rewardPrograms[index] = lastRewardProgram;
            rewardProgramIndices[lastRewardProgram] = index + 1;
        }

        rewardPrograms.pop();
        delete rewardProgramIndices[_rewardProgram];
        emit RewardProgramRemoved(_rewardProgram);
    }

    /// @notice Returns if passed address are listed as reward program in the registry
    function isRewardProgram(address _maybeRewardProgram) external view returns (bool) {
        return rewardProgramIndices[_maybeRewardProgram] > 0;
    }

    /// @notice Returns current list of reward programs
    function getRewardPrograms() external view returns (address[] memory) {
        return rewardPrograms;
    }

    // ------------------
    // PRIVATE METHODS
    // ------------------

    function _getRewardProgramIndex(address _evmScriptFactory)
        private
        view
        returns (uint256 _index)
    {
        _index = rewardProgramIndices[_evmScriptFactory];
        require(_index > 0, ERROR_REWARD_PROGRAM_NOT_FOUND);
        _index -= 1;
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address[]","name":"_addRewardProgramRoleHolders","type":"address[]"},{"internalType":"address[]","name":"_removeRewardProgramRoleHolders","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_rewardProgram","type":"address"},{"indexed":false,"internalType":"string","name":"_title","type":"string"}],"name":"RewardProgramAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_rewardProgram","type":"address"}],"name":"RewardProgramRemoved","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"},{"inputs":[],"name":"ADD_REWARD_PROGRAM_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REMOVE_REWARD_PROGRAM_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardProgram","type":"address"},{"internalType":"string","name":"_title","type":"string"}],"name":"addRewardProgram","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRewardPrograms","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","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":"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":"_maybeRewardProgram","type":"address"}],"name":"isRewardProgram","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardProgram","type":"address"}],"name":"removeRewardProgram","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"","type":"uint256"}],"name":"rewardPrograms","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040516200113a3803806200113a833981016040819052620000349162000298565b6200004160008462000118565b60005b8251811015620000b1576200009c7fce8976ec33b30cd0968ffa1fac067b01c7bd61b44d3302fc48791912bdf2ddb68483815181106200008857620000886200033f565b60200260200101516200011860201b60201c565b80620000a88162000315565b91505062000044565b5060005b81518110156200010e57620000f97f9808447c3ccc2f18077679914d53def7c35a274f376c8c109bd2eed3189fe4c68383815181106200008857620000886200033f565b80620001058162000315565b915050620000b5565b505050506200036b565b62000124828262000128565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000124576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620001843390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b80516001600160a01b0381168114620001e057600080fd5b919050565b600082601f830112620001f757600080fd5b815160206001600160401b038083111562000216576200021662000355565b8260051b604051601f19603f830116810181811084821117156200023e576200023e62000355565b604052848152838101925086840182880185018910156200025e57600080fd5b600092505b858310156200028c576200027781620001c8565b84529284019260019290920191840162000263565b50979650505050505050565b600080600060608486031215620002ae57600080fd5b620002b984620001c8565b60208501519093506001600160401b0380821115620002d757600080fd5b620002e587838801620001e5565b93506040860151915080821115620002fc57600080fd5b506200030b86828701620001e5565b9150509250925092565b60006000198214156200033857634e487b7160e01b600052601160045260246000fd5b5060010190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b610dbf806200037b6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063692f5c7e1161008c5780639525581c116100665780639525581c14610224578063a217fddf1461024f578063d547741f14610257578063fa508cef1461026a57600080fd5b8063692f5c7e146101d757806391d14854146101fe578063945233e21461021157600080fd5b806336568abe116100c857806336568abe1461015d5780633dfa0772146101705780635a8d61e2146101975780635e5ed09a146101c257600080fd5b806301ffc9a7146100ef578063248a9ca3146101175780632f2ff15d14610148575b600080fd5b6101026100fd366004610b7d565b61027d565b60405190151581526020015b60405180910390f35b61013a610125366004610b38565b60009081526020819052604090206001015490565b60405190815260200161010e565b61015b610156366004610b51565b6102b4565b005b61015b61016b366004610b51565b6102df565b61013a7f9808447c3ccc2f18077679914d53def7c35a274f376c8c109bd2eed3189fe4c681565b6101aa6101a5366004610b38565b610362565b6040516001600160a01b03909116815260200161010e565b6101ca61038c565b60405161010e9190610c1c565b61013a7fce8976ec33b30cd0968ffa1fac067b01c7bd61b44d3302fc48791912bdf2ddb681565b61010261020c366004610b51565b6103ee565b61015b61021f366004610a5b565b610417565b610102610232366004610a5b565b6001600160a01b0316600090815260026020526040902054151590565b61013a600081565b61015b610265366004610b51565b61057a565b61015b610278366004610a76565b6105a0565b60006001600160e01b03198216637965db0b60e01b14806102ae57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000828152602081905260409020600101546102d081336106d3565b6102da8383610737565b505050565b6001600160a01b03811633146103545760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b61035e82826107bb565b5050565b6001818154811061037257600080fd5b6000918252602090912001546001600160a01b0316905081565b606060018054806020026020016040519081016040528092919081815260200182805480156103e457602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116103c6575b5050505050905090565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b7f9808447c3ccc2f18077679914d53def7c35a274f376c8c109bd2eed3189fe4c661044281336106d3565b600061044d83610820565b600180549192506000916104619190610cd3565b90508082146104fd5760006001828154811061047f5761047f610d5d565b600091825260209091200154600180546001600160a01b0390921692508291859081106104ae576104ae610d5d565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790556104e2836001610c9c565b6001600160a01b039091166000908152600260205260409020555b600180548061050e5761050e610d47565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038616808352600290915260408083208390555190917f87e1027e3dc61d1977f39f0dfe911b66a943946b4ceb39210dee01495621de5291a250505050565b60008281526020819052604090206001015461059681336106d3565b6102da83836107bb565b7fce8976ec33b30cd0968ffa1fac067b01c7bd61b44d3302fc48791912bdf2ddb66105cb81336106d3565b6001600160a01b038316600090815260026020908152604091829020548251808401909352601c83527f5245574152445f50524f4752414d5f414c52454144595f414444454400000000918301919091521561063a5760405162461bcd60e51b815260040161034b9190610c69565b506001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b03861690811790915590546000828152600260205260409081902091909155517f013fd5e99744f7f9582e8b5c8f1d732d17e810e34184af6a72bb75a079a3a616906106c6908590610c69565b60405180910390a2505050565b6106dd82826103ee565b61035e576106f5816001600160a01b0316601461089c565b61070083602061089c565b604051602001610711929190610ba7565b60408051601f198184030181529082905262461bcd60e51b825261034b91600401610c69565b61074182826103ee565b61035e576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556107773390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6107c582826103ee565b1561035e576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b038116600090815260026020908152604091829020548251808401909352601883527f5245574152445f50524f4752414d5f4e4f545f464f554e4400000000000000009183019190915290816108905760405162461bcd60e51b815260040161034b9190610c69565b506102ae600182610cd3565b606060006108ab836002610cb4565b6108b6906002610c9c565b67ffffffffffffffff8111156108ce576108ce610d73565b6040519080825280601f01601f1916602001820160405280156108f8576020820181803683370190505b509050600360fc1b8160008151811061091357610913610d5d565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061094257610942610d5d565b60200101906001600160f81b031916908160001a9053506000610966846002610cb4565b610971906001610c9c565b90505b60018111156109e9576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106109a5576109a5610d5d565b1a60f81b8282815181106109bb576109bb610d5d565b60200101906001600160f81b031916908160001a90535060049490941c936109e281610d1a565b9050610974565b508315610a385760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161034b565b9392505050565b80356001600160a01b0381168114610a5657600080fd5b919050565b600060208284031215610a6d57600080fd5b610a3882610a3f565b60008060408385031215610a8957600080fd5b610a9283610a3f565b9150602083013567ffffffffffffffff80821115610aaf57600080fd5b818501915085601f830112610ac357600080fd5b813581811115610ad557610ad5610d73565b604051601f8201601f19908116603f01168101908382118183101715610afd57610afd610d73565b81604052828152886020848701011115610b1657600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b600060208284031215610b4a57600080fd5b5035919050565b60008060408385031215610b6457600080fd5b82359150610b7460208401610a3f565b90509250929050565b600060208284031215610b8f57600080fd5b81356001600160e01b031981168114610a3857600080fd5b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351610bdf816017850160208801610cea565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351610c10816028840160208801610cea565b01602801949350505050565b6020808252825182820181905260009190848201906040850190845b81811015610c5d5783516001600160a01b031683529284019291840191600101610c38565b50909695505050505050565b6020815260008251806020840152610c88816040850160208701610cea565b601f01601f19169190910160400192915050565b60008219821115610caf57610caf610d31565b500190565b6000816000190483118215151615610cce57610cce610d31565b500290565b600082821015610ce557610ce5610d31565b500390565b60005b83811015610d05578181015183820152602001610ced565b83811115610d14576000848401525b50505050565b600081610d2957610d29610d31565b506000190190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220be717e214a6d4303b3235aa3d972e60575682094ad7df42e968d5a363f7ceb2764736f6c63430008060033000000000000000000000000626dbb4caff499d0f9f37d3a1d8ac2105a61298a000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000626dbb4caff499d0f9f37d3a1d8ac2105a61298a0000000000000000000000002667c7e8731d7314e7c492700ad440f7c37241840000000000000000000000000000000000000000000000000000000000000002000000000000000000000000626dbb4caff499d0f9f37d3a1d8ac2105a61298a0000000000000000000000002667c7e8731d7314e7c492700ad440f7c3724184

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

000000000000000000000000626dbb4caff499d0f9f37d3a1d8ac2105a61298a000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000626dbb4caff499d0f9f37d3a1d8ac2105a61298a0000000000000000000000002667c7e8731d7314e7c492700ad440f7c37241840000000000000000000000000000000000000000000000000000000000000002000000000000000000000000626dbb4caff499d0f9f37d3a1d8ac2105a61298a0000000000000000000000002667c7e8731d7314e7c492700ad440f7c3724184

-----Decoded View---------------
Arg [0] : _admin (address): 0x626dbB4caFf499D0f9f37d3a1D8Ac2105A61298A
Arg [1] : _addRewardProgramRoleHolders (address[]): 0x626dbB4caFf499D0f9f37d3a1D8Ac2105A61298A,0x2667c7e8731d7314E7c492700Ad440f7C3724184
Arg [2] : _removeRewardProgramRoleHolders (address[]): 0x626dbB4caFf499D0f9f37d3a1D8Ac2105A61298A,0x2667c7e8731d7314E7c492700Ad440f7C3724184

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000626dbb4caff499d0f9f37d3a1d8ac2105a61298a
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [4] : 000000000000000000000000626dbb4caff499d0f9f37d3a1d8ac2105a61298a
Arg [5] : 0000000000000000000000002667c7e8731d7314e7c492700ad440f7c3724184
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [7] : 000000000000000000000000626dbb4caff499d0f9f37d3a1d8ac2105a61298a
Arg [8] : 0000000000000000000000002667c7e8731d7314e7c492700ad440f7c3724184


Deployed ByteCode Sourcemap

15297:4392:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10415:204;;;;;;:::i;:::-;;:::i;:::-;;;4131:14:1;;4124:22;4106:41;;4094:2;4079:18;10415:204:0;;;;;;;;11826:123;;;;;;:::i;:::-;11892:7;11919:12;;;;;;;;;;:22;;;;11826:123;;;;4304:25:1;;;4292:2;4277:18;11826:123:0;4259:76:1;12211:147:0;;;;;;:::i;:::-;;:::i;:::-;;13259:218;;;;;;:::i;:::-;;:::i;15708:92::-;;15761:39;15708:92;;16177:31;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3259:32:1;;;3241:51;;3229:2;3214:18;16177:31:0;3196:102:1;19208:110:0;;;:::i;:::-;;;;;;;:::i;15615:86::-;;15665:36;15615:86;;10711:139;;;;;;:::i;:::-;;:::i;18265:628::-;;;;;;:::i;:::-;;:::i;18989:154::-;;;;;;:::i;:::-;-1:-1:-1;;;;;19090:41:0;19066:4;19090:41;;;:20;:41;;;;;;:45;;;18989:154;9802:49;;9847:4;9802:49;;12603:149;;;;;;:::i;:::-;;:::i;17545:420::-;;;;;;:::i;:::-;;:::i;10415:204::-;10500:4;-1:-1:-1;;;;;;10524:47:0;;-1:-1:-1;;;10524:47:0;;:87;;-1:-1:-1;;;;;;;;;;7819:40:0;;;10575:36;10517:94;10415:204;-1:-1:-1;;10415:204:0:o;12211:147::-;11892:7;11919:12;;;;;;;;;;:22;;;10293:30;10304:4;3781:10;10293;:30::i;:::-;12325:25:::1;12336:4;12342:7;12325:10;:25::i;:::-;12211:147:::0;;;:::o;13259:218::-;-1:-1:-1;;;;;13355:23:0;;3781:10;13355:23;13347:83;;;;-1:-1:-1;;;13347:83:0;;5291:2:1;13347:83:0;;;5273:21:1;5330:2;5310:18;;;5303:30;5369:34;5349:18;;;5342:62;-1:-1:-1;;;5420:18:1;;;5413:45;5475:19;;13347:83:0;;;;;;;;;13443:26;13455:4;13461:7;13443:11;:26::i;:::-;13259:218;;:::o;16177:31::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16177:31:0;;-1:-1:-1;16177:31:0;:::o;19208:110::-;19260:16;19296:14;19289:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19289:21:0;;;;;;;;;;;;;;;;;;;;;;;19208:110;:::o;10711:139::-;10789:4;10813:12;;;;;;;;;;;-1:-1:-1;;;;;10813:29:0;;;;;;;;;;;;;;;10711:139::o;18265:628::-;15761:39;10293:30;15761:39;3781:10;10293;:30::i;:::-;18398:13:::1;18414:38;18437:14;18414:22;:38::i;:::-;18507:1;18483:21:::0;;18398:54;;-1:-1:-1;18463:17:0::1;::::0;18483:25:::1;::::0;18507:1;18483:25:::1;:::i;:::-;18463:45;;18534:9;18525:5;:18;18521:226;;18560:25;18588:14;18603:9;18588:25;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;18628:21;;-1:-1:-1;;;;;18588:25:0;;::::1;::::0;-1:-1:-1;18588:25:0;;18643:5;;18628:21;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:41:::0;;-1:-1:-1;;;;;;18628:41:0::1;-1:-1:-1::0;;;;;18628:41:0;;;::::1;::::0;;;::::1;::::0;;18726:9:::1;:5:::0;-1:-1:-1;18726:9:0::1;:::i;:::-;-1:-1:-1::0;;;;;18684:39:0;;::::1;;::::0;;;:20:::1;:39;::::0;;;;:51;18521:226:::1;18759:14;:20;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;-1:-1:-1;;18759:20:0;;;;;-1:-1:-1;;;;;;18759:20:0::1;::::0;;;;;;;;-1:-1:-1;;;;;18797:36:0;::::1;::::0;;;:20:::1;:36:::0;;;;;;;18790:43;;;18849:36;18797;;18849::::1;::::0;::::1;18387:506;;18265:628:::0;;:::o;12603:149::-;11892:7;11919:12;;;;;;;;;;:22;;;10293:30;10304:4;3781:10;10293;:30::i;:::-;12718:26:::1;12730:4;12736:7;12718:11;:26::i;17545:420::-:0;15665:36;10293:30;15665:36;3781:10;10293;:30::i;:::-;-1:-1:-1;;;;;17702:36:0;::::1;;::::0;;;:20:::1;:36;::::0;;;;;;;;;17745:34;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;17702:41;17694:86:::1;;;;-1:-1:-1::0;;;17694:86:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;17793:14:0::1;:35:::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;;;17793:35:0::1;-1:-1:-1::0;;;;;17793:35:0;::::1;::::0;;::::1;::::0;;;17878:21;;-1:-1:-1;17839:36:0;;;:20:::1;17793:35;17839:36:::0;;;;;;:60;;;;17915:42;::::1;::::0;::::1;::::0;17950:6;;17915:42:::1;:::i;:::-;;;;;;;;17545:420:::0;;;:::o;11140:497::-;11221:22;11229:4;11235:7;11221;:22::i;:::-;11216:414;;11409:41;11437:7;-1:-1:-1;;;;;11409:41:0;11447:2;11409:19;:41::i;:::-;11523:38;11551:4;11558:2;11523:19;:38::i;:::-;11314:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;11314:270:0;;;;;;;;;;-1:-1:-1;;;11260:358:0;;;;;;;:::i;14563:229::-;14638:22;14646:4;14652:7;14638;:22::i;:::-;14633:152;;14677:6;:12;;;;;;;;;;;-1:-1:-1;;;;;14677:29:0;;;;;;;;;:36;;-1:-1:-1;;14677:36:0;14709:4;14677:36;;;14760:12;3781:10;;3701:98;14760:12;-1:-1:-1;;;;;14733:40:0;14751:7;-1:-1:-1;;;;;14733:40:0;14745:4;14733:40;;;;;;;;;;14563:229;;:::o;14800:230::-;14875:22;14883:4;14889:7;14875;:22::i;:::-;14871:152;;;14946:5;14914:12;;;;;;;;;;;-1:-1:-1;;;;;14914:29:0;;;;;;;;;;:37;;-1:-1:-1;;14914:37:0;;;14971:40;3781:10;;14914:12;;14971:40;;14946:5;14971:40;14800:230;;:::o;19406:280::-;-1:-1:-1;;;;;19555:39:0;;19514:14;19555:39;;;:20;:39;;;;;;;;;;19625:30;;;;;;;;;;;;;;;;;;;19555:39;19613:10;19605:51;;;;-1:-1:-1;;;19605:51:0;;;;;;;;:::i;:::-;-1:-1:-1;19667:11:0;19677:1;19667:11;;:::i;5553:451::-;5628:13;5654:19;5686:10;5690:6;5686:1;:10;:::i;:::-;:14;;5699:1;5686:14;:::i;:::-;5676:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5676:25:0;;5654:47;;-1:-1:-1;;;5712:6:0;5719:1;5712:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;5712:15:0;;;;;;;;;-1:-1:-1;;;5738:6:0;5745:1;5738:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;5738:15:0;;;;;;;;-1:-1:-1;5769:9:0;5781:10;5785:6;5781:1;:10;:::i;:::-;:14;;5794:1;5781:14;:::i;:::-;5769:26;;5764:135;5801:1;5797;:5;5764:135;;;-1:-1:-1;;;5849:5:0;5857:3;5849:11;5836:25;;;;;;;:::i;:::-;;;;5824:6;5831:1;5824:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;5824:37:0;;;;;;;;-1:-1:-1;5886:1:0;5876:11;;;;;5804:3;;;:::i;:::-;;;5764:135;;;-1:-1:-1;5917:10:0;;5909:55;;;;-1:-1:-1;;;5909:55:0;;4930:2:1;5909:55:0;;;4912:21:1;;;4949:18;;;4942:30;5008:34;4988:18;;;4981:62;5060:18;;5909:55:0;4902:182:1;5909:55:0;5989:6;5553:451;-1:-1:-1;;;5553:451:0:o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;320:1;317;310:12;272:2;343:29;362:9;343:29;:::i;383:996::-;461:6;469;522:2;510:9;501:7;497:23;493:32;490:2;;;538:1;535;528:12;490:2;561:29;580:9;561:29;:::i;:::-;551:39;;641:2;630:9;626:18;613:32;664:18;705:2;697:6;694:14;691:2;;;721:1;718;711:12;691:2;759:6;748:9;744:22;734:32;;804:7;797:4;793:2;789:13;785:27;775:2;;826:1;823;816:12;775:2;862;849:16;884:2;880;877:10;874:2;;;890:18;;:::i;:::-;965:2;959:9;933:2;1019:13;;-1:-1:-1;;1015:22:1;;;1039:2;1011:31;1007:40;995:53;;;1063:18;;;1083:22;;;1060:46;1057:2;;;1109:18;;:::i;:::-;1149:10;1145:2;1138:22;1184:2;1176:6;1169:18;1224:7;1219:2;1214;1210;1206:11;1202:20;1199:33;1196:2;;;1245:1;1242;1235:12;1196:2;1301;1296;1292;1288:11;1283:2;1275:6;1271:15;1258:46;1346:1;1341:2;1336;1328:6;1324:15;1320:24;1313:35;1367:6;1357:16;;;;;;;480:899;;;;;:::o;1384:180::-;1443:6;1496:2;1484:9;1475:7;1471:23;1467:32;1464:2;;;1512:1;1509;1502:12;1464:2;-1:-1:-1;1535:23:1;;1454:110;-1:-1:-1;1454:110:1:o;1569:254::-;1637:6;1645;1698:2;1686:9;1677:7;1673:23;1669:32;1666:2;;;1714:1;1711;1704:12;1666:2;1750:9;1737:23;1727:33;;1779:38;1813:2;1802:9;1798:18;1779:38;:::i;:::-;1769:48;;1656:167;;;;;:::o;1828:286::-;1886:6;1939:2;1927:9;1918:7;1914:23;1910:32;1907:2;;;1955:1;1952;1945:12;1907:2;1981:23;;-1:-1:-1;;;;;;2033:32:1;;2023:43;;2013:2;;2080:1;2077;2070:12;2304:786;2715:25;2710:3;2703:38;2685:3;2770:6;2764:13;2786:62;2841:6;2836:2;2831:3;2827:12;2820:4;2812:6;2808:17;2786:62;:::i;:::-;-1:-1:-1;;;2907:2:1;2867:16;;;2899:11;;;2892:40;2957:13;;2979:63;2957:13;3028:2;3020:11;;3013:4;3001:17;;2979:63;:::i;:::-;3062:17;3081:2;3058:26;;2693:397;-1:-1:-1;;;;2693:397:1:o;3303:658::-;3474:2;3526:21;;;3596:13;;3499:18;;;3618:22;;;3445:4;;3474:2;3697:15;;;;3671:2;3656:18;;;3445:4;3740:195;3754:6;3751:1;3748:13;3740:195;;;3819:13;;-1:-1:-1;;;;;3815:39:1;3803:52;;3910:15;;;;3875:12;;;;3851:1;3769:9;3740:195;;;-1:-1:-1;3952:3:1;;3454:507;-1:-1:-1;;;;;;3454:507:1:o;4340:383::-;4489:2;4478:9;4471:21;4452:4;4521:6;4515:13;4564:6;4559:2;4548:9;4544:18;4537:34;4580:66;4639:6;4634:2;4623:9;4619:18;4614:2;4606:6;4602:15;4580:66;:::i;:::-;4707:2;4686:15;-1:-1:-1;;4682:29:1;4667:45;;;;4714:2;4663:54;;4461:262;-1:-1:-1;;4461:262:1:o;5505:128::-;5545:3;5576:1;5572:6;5569:1;5566:13;5563:2;;;5582:18;;:::i;:::-;-1:-1:-1;5618:9:1;;5553:80::o;5638:168::-;5678:7;5744:1;5740;5736:6;5732:14;5729:1;5726:21;5721:1;5714:9;5707:17;5703:45;5700:2;;;5751:18;;:::i;:::-;-1:-1:-1;5791:9:1;;5690:116::o;5811:125::-;5851:4;5879:1;5876;5873:8;5870:2;;;5884:18;;:::i;:::-;-1:-1:-1;5921:9:1;;5860:76::o;5941:258::-;6013:1;6023:113;6037:6;6034:1;6031:13;6023:113;;;6113:11;;;6107:18;6094:11;;;6087:39;6059:2;6052:10;6023:113;;;6154:6;6151:1;6148:13;6145:2;;;6189:1;6180:6;6175:3;6171:16;6164:27;6145:2;;5994:205;;;:::o;6204:136::-;6243:3;6271:5;6261:2;;6280:18;;:::i;:::-;-1:-1:-1;;;6316:18:1;;6251:89::o;6345:127::-;6406:10;6401:3;6397:20;6394:1;6387:31;6437:4;6434:1;6427:15;6461:4;6458:1;6451:15;6477:127;6538:10;6533:3;6529:20;6526:1;6519:31;6569:4;6566:1;6559:15;6593:4;6590:1;6583:15;6609:127;6670:10;6665:3;6661:20;6658:1;6651:31;6701:4;6698:1;6691:15;6725:4;6722:1;6715:15;6741:127;6802:10;6797:3;6793:20;6790:1;6783:31;6833:4;6830:1;6823:15;6857:4;6854:1;6847:15

Swarm Source

ipfs://be717e214a6d4303b3235aa3d972e60575682094ad7df42e968d5a363f7ceb27
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading

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.