Chainlink Fullfill_alarm() 在使用 mocha 进行测试时成功请求发送到 oracle 后不回调

如何解决Chainlink Fullfill_alarm() 在使用 mocha 进行测试时成功请求发送到 oracle 后不回调

我正在尝试按照文档步骤在 kovan fork 网络上使用安全帽测试 Chainlink 警报预言机。

https://docs.chain.link/docs/chainlink-alarm-clock/#:~:text=ala

当我使用 npx hardhat test 测试合约时,它看起来像是向 oracle 发出请求函数,但从未回调fulfill_alarm()。

我想知道这可能是 fork 网络的问题还是我的测试代码的问题。

我使用 Alchemy api 作为 kovan 上 fork 网络的 url。

此外,我在 mocha 中使用超时,以便它可以等待回调执行,但永远不会命中。

一个 it 语句正确执行,但是在第二个语句上,一旦彩票完成(调用 fulfill_alarm()),它应该增加 lotteryId + 1。看起来这个函数永远不会被 chainlink oracle 执行。

甲骨文:0xAA1DC356dc4B18f30C347798FD5379F3D77ABC5b

jobId:'982105d690504c5d9ce374d040c08654'

solidity 代码

    //Starting Oracle Alarm
  function start_new_lottery(uint256 duration) public {
      require(lottery_state == LottERY_STATE.CLOSED,"can't start a n
      lottery_state = LottERY_STATE.OPEN;
      Chainlink.Request memory req = buildChainlinkRequest(jobId,add
      req.addUint("until",block.timestamp + duration);
      sendChainlinkRequestTo(oracle,req,oraclePayment);
       console.log('LINK REQ SEND');
   }

     //Callback Function after Oracle Alarm is Fulfilled
   function fulfill_alarm(bytes32 _requestId) public recordChainlinkFu
       require(lottery_state == LottERY_STATE.OPEN,"The lottery hasn'
       lotteryId = lotteryId + 1;
       console.log('ALARM_FULFILLED');
       pickWinner();
  }

测试代码

const {expect} = require("chai");

const { time } = require("@openzeppelin/test-helpers");

describe("彩票合约",function() {

   //Defining global variables for testing.
   const price_lottery = ethers.BigNumber.from(1);
   let owner;
   let Lottery;
   let lottery;

  before(async function () {
      Lottery = await ethers.getContractFactory("Lottery");
      [owner] = await ethers.getSigners();
      lottery = await Lottery.deploy(
          price_lottery,);

      //Starting new Lottery
      await lottery.start_new_lottery(60);

  });

   it("should start a chainlink alarm to init new lottery",async func

       let lottery_state = await lottery.lottery_state();

       expect(lottery_state).to.equal(0);

       //Initial value
       let lotteryId = await lottery.lotteryId();
      expect(lotteryId).to.equal(1);
  })

  it("increments lotteryID + 1,when chainlink alarm is fulfilled aft

      //Wait until alarm is fulfilled
      function timeout(ms) {
           return new Promise(resolve => setTimeout(resolve,ms));
       }

       await timeout(120000);

       //Expected value
       let lotteryId = await lottery.lotteryId();
       expect(lotteryId).to.equal(2);
   })

})

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?