rinkeby のイーサで hardhat を使用して、ローカル チェーンリンク ノードに要求を取得するスマート コントラクトをテストしています。ノード ダッシュボードで、要求が満たされていることを確認できます。
2 番目のフルフィルメント トランザクションが確認されるのを待つテストを書くのに苦労しています。
SmartContractKit/chainlink リポジトリ テストで同様のテストが見られます
it("logs the data given to it by the oracle", async () => {
const tx = await oc.connect(roles.oracleNode).fulfillOracleRequest(...convertFufillParams(request, response));
const receipt = await tx.wait();
assert.equal(2, receipt?.logs?.length);
const log = receipt?.logs?.[1];
assert.equal(log?.topics[2], response);
});
これが実行されたトランザクションをまったく待機することを確認できません。この関数が呼び出す consumer.sol には、発行されるイベント RequestFulfilled がありますが、このテストがリッスンしているようには見えません。
私が見つけた別の例、Ocean Protocol request testは、リクエスト ID、アクセサー、およびリクエスト ID が見つかるまでポーリングするテストの while ループのマッピングを作成することによってこれを実現します。
it("create a request and send to Chainlink", async () => {
let tx = await ocean.createRequest(jobId, url, path, times);
request = h.decodeRunRequest(tx.receipt.rawLogs[3]);
console.log("request has been sent. request id :=" + request.id)
let data = 0
let timer = 0
while(data == 0){
data = await ocean.getRequestResult(request.id)
if(data != 0) {
console.log("Request is fulfilled. data := " + data)
}
wait(1000)
timer = timer + 1
console.log("waiting for " + timer + " second")
}
});
これは理にかなっており、それがどのように機能するかがわかります。ただし、より最適な方法が必要であると思われる場合は、マッピングとアクセサーの作成を避けたいと思います。