【问题标题】:How to mock Chainlink/oracle API responses on hardhat如何在安全帽上模拟 Chainlink/oracle API 响应
【发布时间】:2022-01-21 03:04:44
【问题描述】:

在安全帽入门套件中,单元测试会检查您是否可以发出 api 请求。但它实际上并没有满足要求。在任务中,它请求卷数据,但没有显示如何满足请求。

通过查看 mockOracle 的代码,我发现了这个函数。

const r = await mockOracle.fulfillOracleRequest(requestId, data)

我不知道如何使数据成为我想要的样子。例如,当我传递以下数据时,它会返回巨大的接缝随机数 24516769870864860957297836120308737325622166553046088662895407649136392011776。

const data = ethers.utils.formatBytes32String("64")

如何使用传递给fulfillOracleRequest 的数据模拟api 响应?另外,因为我在 chainlink 入门套件中找不到任何这样的例子,所以这甚至是在本地安全帽网络上执行此操作的正确方法吗?

【问题讨论】:

    标签: chainlink


    【解决方案1】:

    MockOracle contract 中的 fulfillOracleRequest 函数采用 bytes32 参数作为响应,因此您需要对其进行正确编码。这就是您可以模拟作为APIConsumer Unit Test 一部分的响应的方式:

    let mockResponse = '777'
    const responseBytes = ethers.utils.formatBytes32String(mockResponse)
    const r = await mockOracle.fulfillOracleRequest(requestId, responseBytes)
    

    要回答您的第二个问题,是的,当使用未集成到 Chainlink 预言机的本地链时,这是正确的做法。实际上有一个open issue 来为单元测试实现这些。如果您愿意,请随时接受!

    【讨论】:

    • 感谢您的回复!我尝试了代码,但是当我 console.log(responseBytes) 时,我得到 0x0000000000000000000000000000000000000000000000000000000000000000。之后我请求了数量,但我从合同中得到了BigNumber { value: "0" }。我还尝试将 777 作为字符串。响应字节为 0x3737370...0,BigNumber 值为 24974762856691535979668219084573578457621369693330343344309437594103489495040。
    • 我认为该字符串实际上应该用引号'777'括起来,我会更新我的答案。至于你奇怪的结果,嗯,这是出乎意料的。这是我们发送的字节字段,但消费合约最终会占用一个 uint。也许看看官方测试如何与 MockOracle 合约交互并尝试模仿它。 github.com/smartcontractkit/chainlink/blob/develop/contracts/…
    猜你喜欢
    • 2021-11-15
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 2015-06-07
    • 2014-04-14
    相关资源
    最近更新 更多