Skip to content

Instantly share code, notes, and snippets.

@timosarkar
Last active December 6, 2025 15:16
Show Gist options
  • Select an option

  • Save timosarkar/1f1515e6bd563a258dc5b72dc4d0b355 to your computer and use it in GitHub Desktop.

Select an option

Save timosarkar/1f1515e6bd563a258dc5b72dc4d0b355 to your computer and use it in GitHub Desktop.
chainlink functions api call on the don
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {FunctionsClient} from "@chainlink/contracts@1.5.0/src/v0.8/functions/v1_0_0/FunctionsClient.sol";
import {FunctionsRequest} from "@chainlink/contracts@1.5.0/src/v0.8/functions/v1_0_0/libraries/FunctionsRequest.sol";
import {ConfirmedOwner} from "@chainlink/contracts@1.5.0/src/v0.8/shared/access/ConfirmedOwner.sol";
/**
* Request testnet LINK and ETH here: https://faucets.chain.link/
* Find information on LINK Token Contracts and get the latest ETH and LINK faucets here:
* https://docs.chain.link/resources/link-token-contracts/
*/
// Requires a certain amount of LINK to be maintained in the subscription account. Implement a Fee deducted from function request
// then swap the fee amount to LINK and send to subscription account to fulfill the request.
/**
* @title GettingStartedFunctionsConsumer
* @notice This is an example contract to show how to make HTTP requests using Chainlink
* @dev This contract uses hardcoded values and should not be used in production.
*/
contract GettingStartedFunctionsConsumer is FunctionsClient, ConfirmedOwner {
using FunctionsRequest for FunctionsRequest.Request;
// State variables to store the last request ID, response, and error
bytes32 public s_lastRequestId;
bytes public s_lastResponse;
bytes public s_lastError;
// Custom error type
error UnexpectedRequestID(bytes32 requestId);
// Event to log responses
event Response(bytes32 indexed requestId, string character, bytes response, bytes err);
// Router address - Hardcoded for Sepolia
// Check to get the router address for your supported network
// https://docs.chain.link/chainlink-functions/supported-networks
address router = 0xb83E47C2bC239B3bf370bc41e1459A34b41238D0;
// JavaScript source code
// Fetch character name from the Star Wars API.
// Documentation: https://swapi.info/people
string source = "const characterId = args[0];" "const apiResponse = await Functions.makeHttpRequest({"
"url: `https://swapi.info/api/people/${characterId}/`" "});" "if (apiResponse.error) {"
"throw Error('Request failed');" "}" "const { data } = apiResponse;" "return Functions.encodeString(data.name);";
//Callback gas limit
uint32 gasLimit = 300_000;
// donID - Hardcoded for Sepolia
// Check to get the donID for your supported network https://docs.chain.link/chainlink-functions/supported-networks
bytes32 donID = 0x66756e2d657468657265756d2d7365706f6c69612d3100000000000000000000;
// State variable to store the returned character information
string public character;
/**
* @notice Initializes the contract with the Chainlink router address and sets the contract owner
*/
constructor() FunctionsClient(router) ConfirmedOwner(msg.sender) {}
/**
* @notice Sends an HTTP request for character information
* @param subscriptionId The ID for the Chainlink subscription
* @param args The arguments to pass to the HTTP request
* @return requestId The ID of the request
*/
function sendRequest(
uint64 subscriptionId,
string[] calldata args
) external onlyOwner returns (bytes32 requestId) {
FunctionsRequest.Request memory req;
req.initializeRequestForInlineJavaScript(source); // Initialize the request with JS code
if (args.length > 0) req.setArgs(args); // Set the arguments for the request
// Send the request and store the request ID
s_lastRequestId = _sendRequest(req.encodeCBOR(), subscriptionId, gasLimit, donID);
return s_lastRequestId;
}
/**
* @notice Callback function for fulfilling a request
* @param requestId The ID of the request to fulfill
* @param response The HTTP response data
* @param err Any errors from the Functions request
*/
function fulfillRequest(
bytes32 requestId,
bytes memory response,
bytes memory err
) internal override {
if (s_lastRequestId != requestId) {
revert UnexpectedRequestID(requestId); // Check if request IDs match
}
// Update the contract's state variables with the response and any errors
s_lastResponse = response;
character = string(response);
s_lastError = err;
// Emit an event to log the response
emit Response(requestId, character, s_lastResponse, s_lastError);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment