现在我正在尝试调用 Chainlink 函数合约上的外部 API。 我创建了一个 API,并使用 Postman 对其进行了测试。效果很好。
这是API的响应。
{ “价格”:11192.32 }
现在我正在尝试调用chainlink合约中的API。
这是合约代码。
// 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"
);
}
}
我在 Sepolia 测试网上部署了这个合约,并进行了验证。 当我部署此合约时,将调用 API。 但是在Sepolia Scan中getlatestPrice返回0。
我认为fulfill 函数没有被正确调用。但我不太确定。 如果您能帮助我,我将不胜感激。
我运行了这段代码
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;
}
与结果相乘(去除小数)的正确字段是
times
,它需要一个数值。因此,您应该使用 req._addUint
或 req._addInt
。
所以,替换这一行:
req.add("multiply", "100000000");
与:
req._addUint("times", 100000000);
注意: 截至目前,从任何 API 获取数据到智能合约中的推荐方法是使用 Chainlink 函数,而不是利用与 Chainlink 节点交互的作业规范和 Operator/Oracle 合约。