Last active
December 6, 2025 15:16
-
-
Save timosarkar/1f1515e6bd563a258dc5b72dc4d0b355 to your computer and use it in GitHub Desktop.
chainlink functions api call on the don
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // 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