Fulfill 函数在 Chainlink 函数合约中无法用于调用外部 API

问题描述 投票:0回答:1

现在我正在尝试调用 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;
}

solidity chainlink
1个回答
0
投票

与结果相乘(去除小数)的正确字段是

times
,它需要一个数值。因此,您应该使用
req._addUint
req._addInt

所以,替换这一行:

req.add("multiply", "100000000");

与:

req._addUint("times", 100000000);

注意: 截至目前,从任何 API 获取数据到智能合约中的推荐方法是使用 Chainlink 函数,而不是利用与 Chainlink 节点交互的作业规范和 Operator/Oracle 合约。

© www.soinside.com 2019 - 2024. All rights reserved.