GLMR Price: $0.020632 (-2.37%)

Contract

0x89516F590dddF93604DD992846960424dDaD4e1A

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Request Seeds132038512025-11-03 9:00:1283 days ago1762160412IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192348150
Request Seeds131914892025-11-02 9:00:0684 days ago1762074006IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192348150
Request Seeds131789682025-11-01 9:00:1885 days ago1761987618IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192348150
Request Seeds131664992025-10-31 9:00:0686 days ago1761901206IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192348150
Request Seeds131538612025-10-30 9:00:0687 days ago1761814806IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192348150
Request Seeds131412532025-10-29 9:00:1288 days ago1761728412IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192348150
Request Seeds131290992025-10-28 9:00:0689 days ago1761642006IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192348150
Request Seeds131171462025-10-27 9:00:0690 days ago1761555606IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192348150
Request Seeds131049902025-10-26 9:00:0691 days ago1761469206IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192348150
Request Seeds130928502025-10-25 9:00:2492 days ago1761382824IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192348150
Request Seeds130808442025-10-24 9:00:0693 days ago1761296406IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192348150
Request Seeds130687092025-10-23 9:00:0694 days ago1761210006IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192348150
Request Seeds130567372025-10-22 9:00:0695 days ago1761123606IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192348150
Request Seeds130447132025-10-21 9:00:0696 days ago1761037206IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192348150
Request Seeds130328242025-10-20 9:00:0697 days ago1760950806IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192348150
Request Seeds130208172025-10-19 9:00:3698 days ago1760864436IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192348150
Request Seeds130087512025-10-18 9:00:3699 days ago1760778036IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192348150
Request Seeds129968112025-10-17 9:00:30100 days ago1760691630IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192348150
Request Seeds129848042025-10-16 9:00:06101 days ago1760605206IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192348150
Request Seeds129727112025-10-15 9:00:30102 days ago1760518830IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192348150
Request Seeds129604862025-10-14 9:00:06103 days ago1760432406IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192348150
Request Seeds129483522025-10-13 9:00:48104 days ago1760346048IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192336150
Request Seeds129363462025-10-12 9:00:06105 days ago1760259606IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192336150
Request Seeds129242732025-10-11 9:00:06106 days ago1760173206IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192336150
Request Seeds129121572025-10-10 9:00:06107 days ago1760086806IN
0x89516F59...4dDaD4e1A
0 GLMR0.0192336150
View all transactions

View more zero value Internal Transactions in Advanced View mode

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SeedGenerator

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.9;

import "@api3/airnode-protocol/contracts/rrp/requesters/RrpRequesterV0.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";

contract SeedGenerator is RrpRequesterV0, AccessControl {
    address _owner;

    bytes32 public constant SEED_REQUESTER_ROLE = keccak256("SEED_REQUESTER_ROLE");

    // Airnode
    address public airnode;
    bytes32 public endpointIdUint256;
    bytes32 public endpointIdUint256Array;
    address public sponsorWallet;

    mapping(bytes32 => bool) public expectingRequestWithIdToBeFulfilled;

    bytes32 public latestRequest;

    // Events
    event RequestedUint256(bytes32 indexed requestId);
    event ReceivedUint256(bytes32 indexed requestId, uint256 response);
    event RequestedUint256Array(bytes32 indexed requestId, uint256 size);
    event ReceivedUint256Array(bytes32 indexed requestId, uint256[] response);

    constructor(address _airnodeRrp) RrpRequesterV0(_airnodeRrp) {
        _owner = msg.sender;
        _grantRole(SEED_REQUESTER_ROLE, msg.sender);
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
    }

    /*////////////////////////////////////////////////////////////////
                                U S E R
    ////////////////////////////////////////////////////////////////*/

    function requestSeeds(uint256 numSeeds) external onlyRole(SEED_REQUESTER_ROLE) {
        _makeRequestUint256Array(numSeeds);
    }

    /*////////////////////////////////////////////////////////////////
                            A I R N O D E
    ////////////////////////////////////////////////////////////////*/

    /// @param _airnode Airnode address
    /// @param _endpointIdUint256 Endpoint ID used to request a `uint256`
    /// @param _endpointIdUint256Array Endpoint ID used to request a `uint256[]`
    /// @param _sponsorWallet Sponsor wallet address
    function setRequestParameters(
        address _airnode,
        bytes32 _endpointIdUint256,
        bytes32 _endpointIdUint256Array,
        address _sponsorWallet
    ) external onlyOwner {
        airnode = _airnode;
        endpointIdUint256 = _endpointIdUint256;
        endpointIdUint256Array = _endpointIdUint256Array;
        sponsorWallet = _sponsorWallet;
    }

    /// @notice Requests a `uint256[]`
    /// @param size Size of the requested array
    function _makeRequestUint256Array(uint256 size) private {
        bytes32 requestId = airnodeRrp.makeFullRequest(
            airnode,
            endpointIdUint256Array,
            address(this),
            sponsorWallet,
            address(this),
            this.fulfillUint256Array.selector,
            // Using Airnode ABI to encode the parameters
            abi.encode(bytes32("1u"), bytes32("size"), size)
        );
        expectingRequestWithIdToBeFulfilled[requestId] = true;
        latestRequest = requestId;
        emit RequestedUint256Array(requestId, size);
    }

    /// @notice Called by the Airnode through the AirnodeRrp contract to
    /// fulfill the request
    /// @param requestId Request ID
    /// @param data ABI-encoded response
    function fulfillUint256Array(bytes32 requestId, bytes calldata data)
        external
        onlyAirnodeRrp
    {
        require(
            expectingRequestWithIdToBeFulfilled[requestId],
            "Request ID not recognized."
        );

        expectingRequestWithIdToBeFulfilled[requestId] = false;

        uint256[] memory qrngUint256Array = abi.decode(data, (uint256[]));
        emit ReceivedUint256Array(requestId, qrngUint256Array);
    }

    function destroy() external onlyOwner {
        address payable addr = payable(_owner);
        selfdestruct(addr);
    }

    modifier onlyOwner() {
        require(msg.sender == _owner, "Sender not owner");
        _;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./IAuthorizationUtilsV0.sol";
import "./ITemplateUtilsV0.sol";
import "./IWithdrawalUtilsV0.sol";

interface IAirnodeRrpV0 is
    IAuthorizationUtilsV0,
    ITemplateUtilsV0,
    IWithdrawalUtilsV0
{
    event SetSponsorshipStatus(
        address indexed sponsor,
        address indexed requester,
        bool sponsorshipStatus
    );

    event MadeTemplateRequest(
        address indexed airnode,
        bytes32 indexed requestId,
        uint256 requesterRequestCount,
        uint256 chainId,
        address requester,
        bytes32 templateId,
        address sponsor,
        address sponsorWallet,
        address fulfillAddress,
        bytes4 fulfillFunctionId,
        bytes parameters
    );

    event MadeFullRequest(
        address indexed airnode,
        bytes32 indexed requestId,
        uint256 requesterRequestCount,
        uint256 chainId,
        address requester,
        bytes32 endpointId,
        address sponsor,
        address sponsorWallet,
        address fulfillAddress,
        bytes4 fulfillFunctionId,
        bytes parameters
    );

    event FulfilledRequest(
        address indexed airnode,
        bytes32 indexed requestId,
        bytes data
    );

    event FailedRequest(
        address indexed airnode,
        bytes32 indexed requestId,
        string errorMessage
    );

    function setSponsorshipStatus(address requester, bool sponsorshipStatus)
        external;

    function makeTemplateRequest(
        bytes32 templateId,
        address sponsor,
        address sponsorWallet,
        address fulfillAddress,
        bytes4 fulfillFunctionId,
        bytes calldata parameters
    ) external returns (bytes32 requestId);

    function makeFullRequest(
        address airnode,
        bytes32 endpointId,
        address sponsor,
        address sponsorWallet,
        address fulfillAddress,
        bytes4 fulfillFunctionId,
        bytes calldata parameters
    ) external returns (bytes32 requestId);

    function fulfill(
        bytes32 requestId,
        address airnode,
        address fulfillAddress,
        bytes4 fulfillFunctionId,
        bytes calldata data,
        bytes calldata signature
    ) external returns (bool callSuccess, bytes memory callData);

    function fail(
        bytes32 requestId,
        address airnode,
        address fulfillAddress,
        bytes4 fulfillFunctionId,
        string calldata errorMessage
    ) external;

    function sponsorToRequesterToSponsorshipStatus(
        address sponsor,
        address requester
    ) external view returns (bool sponsorshipStatus);

    function requesterToRequestCountPlusOne(address requester)
        external
        view
        returns (uint256 requestCountPlusOne);

    function requestIsAwaitingFulfillment(bytes32 requestId)
        external
        view
        returns (bool isAwaitingFulfillment);
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IAuthorizationUtilsV0 {
    function checkAuthorizationStatus(
        address[] calldata authorizers,
        address airnode,
        bytes32 requestId,
        bytes32 endpointId,
        address sponsor,
        address requester
    ) external view returns (bool status);

    function checkAuthorizationStatuses(
        address[] calldata authorizers,
        address airnode,
        bytes32[] calldata requestIds,
        bytes32[] calldata endpointIds,
        address[] calldata sponsors,
        address[] calldata requesters
    ) external view returns (bool[] memory statuses);
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface ITemplateUtilsV0 {
    event CreatedTemplate(
        bytes32 indexed templateId,
        address airnode,
        bytes32 endpointId,
        bytes parameters
    );

    function createTemplate(
        address airnode,
        bytes32 endpointId,
        bytes calldata parameters
    ) external returns (bytes32 templateId);

    function getTemplates(bytes32[] calldata templateIds)
        external
        view
        returns (
            address[] memory airnodes,
            bytes32[] memory endpointIds,
            bytes[] memory parameters
        );

    function templates(bytes32 templateId)
        external
        view
        returns (
            address airnode,
            bytes32 endpointId,
            bytes memory parameters
        );
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IWithdrawalUtilsV0 {
    event RequestedWithdrawal(
        address indexed airnode,
        address indexed sponsor,
        bytes32 indexed withdrawalRequestId,
        address sponsorWallet
    );

    event FulfilledWithdrawal(
        address indexed airnode,
        address indexed sponsor,
        bytes32 indexed withdrawalRequestId,
        address sponsorWallet,
        uint256 amount
    );

    function requestWithdrawal(address airnode, address sponsorWallet) external;

    function fulfillWithdrawal(
        bytes32 withdrawalRequestId,
        address airnode,
        address sponsor
    ) external payable;

    function sponsorToWithdrawalRequestCount(address sponsor)
        external
        view
        returns (uint256 withdrawalRequestCount);
}

File 6 of 12 : RrpRequesterV0.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "../interfaces/IAirnodeRrpV0.sol";

/// @title The contract to be inherited to make Airnode RRP requests
contract RrpRequesterV0 {
    IAirnodeRrpV0 public immutable airnodeRrp;

    /// @dev Reverts if the caller is not the Airnode RRP contract.
    /// Use it as a modifier for fulfill and error callback methods, but also
    /// check `requestId`.
    modifier onlyAirnodeRrp() {
        require(msg.sender == address(airnodeRrp), "Caller not Airnode RRP");
        _;
    }

    /// @dev Airnode RRP address is set at deployment and is immutable.
    /// RrpRequester is made its own sponsor by default. RrpRequester can also
    /// be sponsored by others and use these sponsorships while making
    /// requests, i.e., using this default sponsorship is optional.
    /// @param _airnodeRrp Airnode RRP contract address
    constructor(address _airnodeRrp) {
        airnodeRrp = IAirnodeRrpV0(_airnodeRrp);
        IAirnodeRrpV0(_airnodeRrp).setSponsorshipStatus(address(this), true);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/AccessControl.sol)

pragma solidity ^0.8.0;

import "./IAccessControl.sol";
import "../utils/Context.sol";
import "../utils/Strings.sol";
import "../utils/introspection/ERC165.sol";

/**
 * @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 revoked `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}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    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);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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;
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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);
    }
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_airnodeRrp","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"response","type":"uint256"}],"name":"ReceivedUint256","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":false,"internalType":"uint256[]","name":"response","type":"uint256[]"}],"name":"ReceivedUint256Array","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"RequestedUint256","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"size","type":"uint256"}],"name":"RequestedUint256Array","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":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SEED_REQUESTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airnode","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airnodeRrp","outputs":[{"internalType":"contract IAirnodeRrpV0","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"destroy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endpointIdUint256","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endpointIdUint256Array","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"expectingRequestWithIdToBeFulfilled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"fulfillUint256Array","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"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":[],"name":"latestRequest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numSeeds","type":"uint256"}],"name":"requestSeeds","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":"address","name":"_airnode","type":"address"},{"internalType":"bytes32","name":"_endpointIdUint256","type":"bytes32"},{"internalType":"bytes32","name":"_endpointIdUint256Array","type":"bytes32"},{"internalType":"address","name":"_sponsorWallet","type":"address"}],"name":"setRequestParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sponsorWallet","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"}]

60a060405234801561001057600080fd5b506040516110f33803806110f383398101604081905261002f91610188565b6001600160a01b0381166080819052604051632b77c09f60e21b81523060048201526001602482015282919063addf027c90604401600060405180830381600087803b15801561007e57600080fd5b505af1158015610092573d6000803e3d6000fd5b5050600180546001600160a01b031916339081179091556100d893507f3b51b219fa94b06effc63b249d30f8c5d7f5238e92ed9a0c8726f87e9955f0d2925090506100e9565b6100e36000336100e9565b506101b8565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610184576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556101433390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006020828403121561019a57600080fd5b81516001600160a01b03811681146101b157600080fd5b9392505050565b608051610f126101e1600039600081816101ee0152818161032201526107ff0152610f126000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c80637e2f6afc116100ad578063a19954af11610071578063a19954af14610296578063a217fddf1461029f578063a36ff4d8146102a7578063bf90fb4e146102ba578063d547741f146102cd57600080fd5b80637e2f6afc1461022857806383197ef01461024f578063851244f71461025757806391d148541461027a578063a0a3f0801461028d57600080fd5b80632f2ff15d116100f45780632f2ff15d1461019d57806336568abe146101b05780633e602e0b146101c35780635675e4e4146101d657806371bab666146101e957600080fd5b806301ffc9a71461012657806307b9fc571461014e5780630d31d52a14610165578063248a9ca31461017a575b600080fd5b610139610134366004610aa0565b6102e0565b60405190151581526020015b60405180910390f35b61015760035481565b604051908152602001610145565b610178610173366004610aca565b610317565b005b610157610188366004610b46565b60009081526020819052604090206001015490565b6101786101ab366004610b7b565b61044d565b6101786101be366004610b7b565b610478565b6101786101d1366004610b46565b6104f6565b6101786101e4366004610ba7565b61052a565b6102107f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610145565b6101577f3b51b219fa94b06effc63b249d30f8c5d7f5238e92ed9a0c8726f87e9955f0d281565b6101786105b1565b610139610265366004610b46565b60066020526000908152604090205460ff1681565b610139610288366004610b7b565b61060d565b61015760075481565b61015760045481565b610157600081565b600254610210906001600160a01b031681565b600554610210906001600160a01b031681565b6101786102db366004610b7b565b610636565b60006001600160e01b03198216637965db0b60e01b148061031157506301ffc9a760e01b6001600160e01b03198316145b92915050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461038d5760405162461bcd60e51b8152602060048201526016602482015275043616c6c6572206e6f74204169726e6f6465205252560541b60448201526064015b60405180910390fd5b60008381526006602052604090205460ff166103eb5760405162461bcd60e51b815260206004820152601a60248201527f52657175657374204944206e6f74207265636f676e697a65642e0000000000006044820152606401610384565b6000838152600660205260408120805460ff1916905561040d82840184610c03565b9050837f47b5f552f55573ad9b766ef18360830d3e90ecdfbef4c7bea49379a0ce64913c8260405161043f9190610cc1565b60405180910390a250505050565b600082815260208190526040902060010154610469813361065c565b61047383836106c0565b505050565b6001600160a01b03811633146104e85760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610384565b6104f28282610744565b5050565b7f3b51b219fa94b06effc63b249d30f8c5d7f5238e92ed9a0c8726f87e9955f0d2610521813361065c565b6104f2826107a9565b6001546001600160a01b031633146105775760405162461bcd60e51b815260206004820152601060248201526f29b2b73232b9103737ba1037bbb732b960811b6044820152606401610384565b600280546001600160a01b039586166001600160a01b03199182161790915560039390935560049190915560058054919093169116179055565b6001546001600160a01b031633146105fe5760405162461bcd60e51b815260206004820152601060248201526f29b2b73232b9103737ba1037bbb732b960811b6044820152606401610384565b6001546001600160a01b031680ff5b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b600082815260208190526040902060010154610652813361065c565b6104738383610744565b610666828261060d565b6104f25761067e816001600160a01b031660146108fd565b6106898360206108fd565b60405160200161069a929190610d35565b60408051601f198184030181529082905262461bcd60e51b825261038491600401610dd6565b6106ca828261060d565b6104f2576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556107003390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61074e828261060d565b156104f2576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6002546004546005546040805161317560f01b60208201526373697a6560e01b818301526060808201879052825180830390910181526080820192839052636e6be03f60e01b9092526000946001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811695636e6be03f9561084a959383169491933093909116918391630698ea9560e11b91608401610de9565b602060405180830381600087803b15801561086457600080fd5b505af1158015610878573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089c9190610e49565b60008181526006602052604090819020805460ff1916600117905560078290555190915081907f6529de56040715a55618ee5797cd3bc856b65ded8fee01e2a24c8481de9e2aaf906108f19085815260200190565b60405180910390a25050565b6060600061090c836002610e78565b610917906002610e97565b67ffffffffffffffff81111561092f5761092f610bed565b6040519080825280601f01601f191660200182016040528015610959576020820181803683370190505b509050600360fc1b8160008151811061097457610974610eaf565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106109a3576109a3610eaf565b60200101906001600160f81b031916908160001a90535060006109c7846002610e78565b6109d2906001610e97565b90505b6001811115610a4a576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610a0657610a06610eaf565b1a60f81b828281518110610a1c57610a1c610eaf565b60200101906001600160f81b031916908160001a90535060049490941c93610a4381610ec5565b90506109d5565b508315610a995760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610384565b9392505050565b600060208284031215610ab257600080fd5b81356001600160e01b031981168114610a9957600080fd5b600080600060408486031215610adf57600080fd5b83359250602084013567ffffffffffffffff80821115610afe57600080fd5b818601915086601f830112610b1257600080fd5b813581811115610b2157600080fd5b876020828501011115610b3357600080fd5b6020830194508093505050509250925092565b600060208284031215610b5857600080fd5b5035919050565b80356001600160a01b0381168114610b7657600080fd5b919050565b60008060408385031215610b8e57600080fd5b82359150610b9e60208401610b5f565b90509250929050565b60008060008060808587031215610bbd57600080fd5b610bc685610b5f565b93506020850135925060408501359150610be260608601610b5f565b905092959194509250565b634e487b7160e01b600052604160045260246000fd5b60006020808385031215610c1657600080fd5b823567ffffffffffffffff80821115610c2e57600080fd5b818501915085601f830112610c4257600080fd5b813581811115610c5457610c54610bed565b8060051b604051601f19603f83011681018181108582111715610c7957610c79610bed565b604052918252848201925083810185019188831115610c9757600080fd5b938501935b82851015610cb557843584529385019392850192610c9c565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610cf957835183529284019291840191600101610cdd565b50909695505050505050565b60005b83811015610d20578181015183820152602001610d08565b83811115610d2f576000848401525b50505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351610d6d816017850160208801610d05565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351610d9e816028840160208801610d05565b01602801949350505050565b60008151808452610dc2816020860160208601610d05565b601f01601f19169290920160200192915050565b602081526000610a996020830184610daa565b6001600160a01b0388811682526020820188905286811660408301528581166060830152841660808201526001600160e01b0319831660a082015260e060c08201819052600090610e3c90830184610daa565b9998505050505050505050565b600060208284031215610e5b57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615610e9257610e92610e62565b500290565b60008219821115610eaa57610eaa610e62565b500190565b634e487b7160e01b600052603260045260246000fd5b600081610ed457610ed4610e62565b50600019019056fea2646970667358221220c433d71b6b105f704115087e48729ba22e7568ae1536ed98c4c60d283da508cf64736f6c63430008090033000000000000000000000000a0ad79d995ddeeb18a14eaef56a549a04e3aa1bd

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101215760003560e01c80637e2f6afc116100ad578063a19954af11610071578063a19954af14610296578063a217fddf1461029f578063a36ff4d8146102a7578063bf90fb4e146102ba578063d547741f146102cd57600080fd5b80637e2f6afc1461022857806383197ef01461024f578063851244f71461025757806391d148541461027a578063a0a3f0801461028d57600080fd5b80632f2ff15d116100f45780632f2ff15d1461019d57806336568abe146101b05780633e602e0b146101c35780635675e4e4146101d657806371bab666146101e957600080fd5b806301ffc9a71461012657806307b9fc571461014e5780630d31d52a14610165578063248a9ca31461017a575b600080fd5b610139610134366004610aa0565b6102e0565b60405190151581526020015b60405180910390f35b61015760035481565b604051908152602001610145565b610178610173366004610aca565b610317565b005b610157610188366004610b46565b60009081526020819052604090206001015490565b6101786101ab366004610b7b565b61044d565b6101786101be366004610b7b565b610478565b6101786101d1366004610b46565b6104f6565b6101786101e4366004610ba7565b61052a565b6102107f000000000000000000000000a0ad79d995ddeeb18a14eaef56a549a04e3aa1bd81565b6040516001600160a01b039091168152602001610145565b6101577f3b51b219fa94b06effc63b249d30f8c5d7f5238e92ed9a0c8726f87e9955f0d281565b6101786105b1565b610139610265366004610b46565b60066020526000908152604090205460ff1681565b610139610288366004610b7b565b61060d565b61015760075481565b61015760045481565b610157600081565b600254610210906001600160a01b031681565b600554610210906001600160a01b031681565b6101786102db366004610b7b565b610636565b60006001600160e01b03198216637965db0b60e01b148061031157506301ffc9a760e01b6001600160e01b03198316145b92915050565b336001600160a01b037f000000000000000000000000a0ad79d995ddeeb18a14eaef56a549a04e3aa1bd161461038d5760405162461bcd60e51b8152602060048201526016602482015275043616c6c6572206e6f74204169726e6f6465205252560541b60448201526064015b60405180910390fd5b60008381526006602052604090205460ff166103eb5760405162461bcd60e51b815260206004820152601a60248201527f52657175657374204944206e6f74207265636f676e697a65642e0000000000006044820152606401610384565b6000838152600660205260408120805460ff1916905561040d82840184610c03565b9050837f47b5f552f55573ad9b766ef18360830d3e90ecdfbef4c7bea49379a0ce64913c8260405161043f9190610cc1565b60405180910390a250505050565b600082815260208190526040902060010154610469813361065c565b61047383836106c0565b505050565b6001600160a01b03811633146104e85760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610384565b6104f28282610744565b5050565b7f3b51b219fa94b06effc63b249d30f8c5d7f5238e92ed9a0c8726f87e9955f0d2610521813361065c565b6104f2826107a9565b6001546001600160a01b031633146105775760405162461bcd60e51b815260206004820152601060248201526f29b2b73232b9103737ba1037bbb732b960811b6044820152606401610384565b600280546001600160a01b039586166001600160a01b03199182161790915560039390935560049190915560058054919093169116179055565b6001546001600160a01b031633146105fe5760405162461bcd60e51b815260206004820152601060248201526f29b2b73232b9103737ba1037bbb732b960811b6044820152606401610384565b6001546001600160a01b031680ff5b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b600082815260208190526040902060010154610652813361065c565b6104738383610744565b610666828261060d565b6104f25761067e816001600160a01b031660146108fd565b6106898360206108fd565b60405160200161069a929190610d35565b60408051601f198184030181529082905262461bcd60e51b825261038491600401610dd6565b6106ca828261060d565b6104f2576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556107003390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61074e828261060d565b156104f2576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6002546004546005546040805161317560f01b60208201526373697a6560e01b818301526060808201879052825180830390910181526080820192839052636e6be03f60e01b9092526000946001600160a01b037f000000000000000000000000a0ad79d995ddeeb18a14eaef56a549a04e3aa1bd811695636e6be03f9561084a959383169491933093909116918391630698ea9560e11b91608401610de9565b602060405180830381600087803b15801561086457600080fd5b505af1158015610878573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089c9190610e49565b60008181526006602052604090819020805460ff1916600117905560078290555190915081907f6529de56040715a55618ee5797cd3bc856b65ded8fee01e2a24c8481de9e2aaf906108f19085815260200190565b60405180910390a25050565b6060600061090c836002610e78565b610917906002610e97565b67ffffffffffffffff81111561092f5761092f610bed565b6040519080825280601f01601f191660200182016040528015610959576020820181803683370190505b509050600360fc1b8160008151811061097457610974610eaf565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106109a3576109a3610eaf565b60200101906001600160f81b031916908160001a90535060006109c7846002610e78565b6109d2906001610e97565b90505b6001811115610a4a576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610a0657610a06610eaf565b1a60f81b828281518110610a1c57610a1c610eaf565b60200101906001600160f81b031916908160001a90535060049490941c93610a4381610ec5565b90506109d5565b508315610a995760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610384565b9392505050565b600060208284031215610ab257600080fd5b81356001600160e01b031981168114610a9957600080fd5b600080600060408486031215610adf57600080fd5b83359250602084013567ffffffffffffffff80821115610afe57600080fd5b818601915086601f830112610b1257600080fd5b813581811115610b2157600080fd5b876020828501011115610b3357600080fd5b6020830194508093505050509250925092565b600060208284031215610b5857600080fd5b5035919050565b80356001600160a01b0381168114610b7657600080fd5b919050565b60008060408385031215610b8e57600080fd5b82359150610b9e60208401610b5f565b90509250929050565b60008060008060808587031215610bbd57600080fd5b610bc685610b5f565b93506020850135925060408501359150610be260608601610b5f565b905092959194509250565b634e487b7160e01b600052604160045260246000fd5b60006020808385031215610c1657600080fd5b823567ffffffffffffffff80821115610c2e57600080fd5b818501915085601f830112610c4257600080fd5b813581811115610c5457610c54610bed565b8060051b604051601f19603f83011681018181108582111715610c7957610c79610bed565b604052918252848201925083810185019188831115610c9757600080fd5b938501935b82851015610cb557843584529385019392850192610c9c565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610cf957835183529284019291840191600101610cdd565b50909695505050505050565b60005b83811015610d20578181015183820152602001610d08565b83811115610d2f576000848401525b50505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351610d6d816017850160208801610d05565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351610d9e816028840160208801610d05565b01602801949350505050565b60008151808452610dc2816020860160208601610d05565b601f01601f19169290920160200192915050565b602081526000610a996020830184610daa565b6001600160a01b0388811682526020820188905286811660408301528581166060830152841660808201526001600160e01b0319831660a082015260e060c08201819052600090610e3c90830184610daa565b9998505050505050505050565b600060208284031215610e5b57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615610e9257610e92610e62565b500290565b60008219821115610eaa57610eaa610e62565b500190565b634e487b7160e01b600052603260045260246000fd5b600081610ed457610ed4610e62565b50600019019056fea2646970667358221220c433d71b6b105f704115087e48729ba22e7568ae1536ed98c4c60d283da508cf64736f6c63430008090033

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

000000000000000000000000a0ad79d995ddeeb18a14eaef56a549a04e3aa1bd

-----Decoded View---------------
Arg [0] : _airnodeRrp (address): 0xa0AD79D995DdeeB18a14eAef56A549A04e3Aa1Bd

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a0ad79d995ddeeb18a14eaef56a549a04e3aa1bd


Block Transaction Gas Used Reward
view all blocks collator

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

Validator Index Block Amount
View All Withdrawals

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

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