Skip to content

Instantly share code, notes, and snippets.

@tarik0
Created June 7, 2024 15:11
Show Gist options
  • Save tarik0/1f6ce4264c9ff59b74cc278743e016b8 to your computer and use it in GitHub Desktop.
Save tarik0/1f6ce4264c9ff59b74cc278743e016b8 to your computer and use it in GitHub Desktop.

API3 Fulfillment Tenderly Simulations

The requests are made with this contract.

// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.9;

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

contract MockedRequester {
    address internal _airnodeRrp;
    address internal _airnode;
    address internal _sponsorWallet;
    bytes32 internal _endpointIdUint256;

    event Requested(bytes32 requestId);

    constructor() {}

    function setSettings(
        address airnodeRrp,
        address airnode,
        address sponsorWallet,
        bytes32 endpointIdUint256
    ) external {
        _airnodeRrp = airnodeRrp;
        _airnode = airnode;
        _sponsorWallet = sponsorWallet;
        _endpointIdUint256 = endpointIdUint256;

        IAirnodeRrpV0(_airnodeRrp)
            .setSponsorshipStatus(address(this), true);
    }

    ///
    /// Request
    ///

    struct Request {
        uint256 fromId;
        uint256 toId;
        uint256 timestamp;
    }

    mapping(bytes32 => Request) private _expectedRequests;

    bytes private constant _PARAMS = hex"31730000000000000000000000000000000000000000000000000000000000005f6d696e436f6e6669726d6174696f6e730000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000";

    function requestUint256(uint256 tokenIdCount, bytes4 selector) external {
        bytes32 requestId = IAirnodeRrpV0(
            _airnodeRrp
        ).makeFullRequest(
            _airnode,
            _endpointIdUint256,
            address(this),
            _sponsorWallet,
            address(this),
            selector,
            _PARAMS
        );

        _expectedRequests[requestId] = Request(0, tokenIdCount, block.timestamp);
        emit Requested(requestId);
    }

    ///
    /// Response
    ///

    struct Response {
        uint256 rawSeed;
        uint256 timestamp;
    }

    mapping(bytes32 => Response) private _requestToResponse;
    uint256 private _totalProbability;

    function fulfillUint256(bytes32 requestId, bytes calldata data) external {
        // validate request
        Request memory seedRequest = _expectedRequests[requestId];
        require(msg.sender == _airnodeRrp);

        // decode seed
        uint256 rawSeed = abi.decode(data, (uint256));

        // set request's response
        _requestToResponse[requestId] = Response(rawSeed, seedRequest.timestamp);

        // iterate over token ids
        uint256 change = 0;
        for (uint256 i = seedRequest.fromId; i < seedRequest.toId; i++) {
            change += (rawSeed ^ i) % type(uint32).max;
        }
        _totalProbability += change;

        delete _expectedRequests[requestId];
    }

    function fulfillUint256Empty(bytes32, bytes calldata) external {
        // do nothing
    }
}

Airnode RRP Fulfillment (9K Token Count)

https://dashboard.tenderly.co/tarik0/project/simulator/b046f35c-54ab-4403-b1cc-b95a1d900933/gas-usage

image

Empty Fulfillment (9K Token Count)

https://dashboard.tenderly.co/tarik0/project/simulator/1aba6ced-b0a2-4ab5-98e3-bae78d0f4a55/gas-usage

image

Dry Run Fulfillment (9K Token Count)

https://dashboard.tenderly.co/tarik0/project/simulator/bee086c4-f22e-445b-99d3-4ec3423e7191/gas-usage

image

Direct Fulfillment (9K Token Count)

https://dashboard.tenderly.co/tarik0/project/simulator/ce59411e-2aaa-427d-b05e-1eb97c8097ff/gas-usage

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment