现在,我正在尝试在 Chainlink Function Contract 上调用外部 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 Testnet上部署了这个合约,并验证了它。当我部署这个合约时,API被调用。但是Sepolia Scan中的getlatestPrice返回了0。
我认为 finish 函数调用不正确。但我不太确定。如果您能帮助我,我将不胜感激。
我运行了这个代码
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
。因此,替换此行:
和:
注意:到目前为止,将数据从任何 API 提取到智能合约中的推荐方法是使用Chainlink 函数,而不是使用与 Chainlink 节点交互的 Job Specs 和 Operator/Oracle 合约。