Agora estou tentando chamar API externa no Chainlink Function Contract. Criei uma API, testei com o Postman. Funciona bem.
Esta é a resposta da API.
{ "preço": 11192.32 }
E agora estou tentando chamar a API no contrato do chainlink.
Este é o código do contrato.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import {Chainlink, ChainlinkClient} from "@chainlink/contracts/src/v0.8/ChainlinkClient.sol";
import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol";
import {LinkTokenInterface} from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol";
contract RolexPriceConsumer is ChainlinkClient, ConfirmedOwner {
using Chainlink for Chainlink.Request;
uint256 public price;
address private oracle;
bytes32 private jobId;
uint256 private fee;
event RequestPrice(bytes32 indexed requestId, uint256 price);
constructor() ConfirmedOwner(msg.sender) {
_setChainlinkToken(0x779877A7B0D9E8603169DdbD7836e478b4624789);
_setChainlinkOracle(0x6090149792dAAeE9D1D568c9f9a6F6B46AA29eFD);
jobId = "ca98366cc7314957b8c012c72f05aeeb";
fee = 0.1 * 10 ** 18;
}
function requestRolexPrice(
string memory _url
) public returns (bytes32 requestId) {
Chainlink.Request memory req = _buildChainlinkRequest(
jobId,
address(this),
this.fulfill.selector
);
req._add("get", _url);
req._add("multiply", "100000000");
req._add("path", "price");
requestId = _sendChainlinkRequest(req, fee);
}
function fulfill(
bytes32 _requestId,
uint256 _price
) public recordChainlinkFulfillment(_requestId) {
emit RequestPrice(_requestId, _price);
price = _price;
}
function getLatestPrice() public view returns (uint256) {
return price;
}
function withdrawLink() public onlyOwner {
LinkTokenInterface link = LinkTokenInterface(_chainlinkTokenAddress());
require(
link.transfer(msg.sender, link.balanceOf(address(this))),
"Unable to transfer"
);
}
}
Eu implantei esse contrato no Sepolia Testnet, verifiquei. Quando eu implanto esse contrato, a API é chamada. Mas o getlatestPrice retornou 0 no Sepolia Scan.
Acho que a função fulfillment não foi chamada corretamente. Mas não tenho certeza exatamente. Ficaria grato se você me ajudasse.
Eu executei este código
function requestRolexPrice(
string memory _url
) public returns (bytes32) {
Chainlink.Request memory req = _buildChainlinkRequest(
jobId,
address(this),
this.fulfill.selector
);
req.add("get", _url); // Use `add` instead of `_add`
req.add("path", "price"); // Correct method call
req.add("multiply", "100000000");
// Send the request and store the requestId
bytes32 requestId = _sendChainlinkRequest(req, fee);
// Return the requestId
return requestId;
}