如何解决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'
//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 举报,一经查实,本站将立刻删除。