Работая с будильником Chainlink , мой fulfill()
метод, кажется, никогда не вызывается. Таким образом, для примера с документами (ниже) votingLive
никогда не возвращается значение false по истечении времени. Все остальное работает, и я дошел до этого момента с оракулами ринкеби и кована в ремиксе и локально с той же проблемой.
Задержка по времени не добавляется, и функция не выполняется.
pragma solidity ^0.6.0;
import "@chainlink/contracts/src/v0.6/ChainlinkClient.sol";
contract ChainlinkTimedVote is ChainlinkClient
{
uint private oraclePayment;
address private oracle;
bytes32 private jobId;
uint private yesCount;
uint private noCount;
bool private votingLive;
mapping(address => bool) public voters;
//only the contract owner should be able to start voting
address payable owner;
modifier onlyOwner {
require(msg.sender == owner);
_;
}
constructor() public {
setPublicChainlinkToken();
owner = msg.sender;
oraclePayment = 0.1 * 10 ** 18; // 0.1 LINK
//Rinkeby alarm oracle
oracle = 0x7AFe1118Ea78C1eae84ca8feE5C65Bc76CcF879e;
jobId = "4fff47c3982b4babba6a7dd694c9b204";
//initialize votes
yesCount = 0;
noCount = 0;
votingLive = false;
}
function startVote(uint voteMinutes) public onlyOwner {
Chainlink.Request memory req = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
req.addUint("until", now + voteMinutes * 1 minutes);
//Start voting window then submit request to sleep for $voteMinutes
votingLive = true;
sendChainlinkRequestTo(oracle, req, oraclePayment);
}
//Callback for startVote request
function fulfill(bytes32 _requestId) public recordChainlinkFulfillment(_requestId) {
//$voteMinutes minutes have elapsed, stop voting
votingLive = false;
}
//Increments appropriate vote counter if voting is live
function vote(bool voteCast) public {
require(!voters[msg.sender], "already Voted!");
//if voting is live and address hasn't voted yet, count vote
if(voteCast) {yesCount++;}
if(!voteCast) {noCount++;}
//address has voted, mark them as such
voters[msg.sender] = true;
}
//Outputs current vote counts
function getVotes() public view returns (uint yesVotes, uint noVotes) {
return(yesCount, noCount);
}
function isVotingLive() public view returns (bool) {
return votingLive;
}
//Lets user know if their vote has been counted
function haveYouVoted() public view returns (bool) {
return voters[msg.sender];
}
}
Может я неправильно строю запрос?
Chainlink.Request memory req = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
req.addUint("until", now + voteMinutes * 1 minutes);
листать
votingLive = true;
sendChainlinkRequestTo(oracle, req, oraclePayment);
к
sendChainlinkRequestTo(oracle, req, oraclePayment);
votingLive = true;
Я также замечаю, что задержка по времени не добавляется.
Похоже, что может быть проблема с узлами в текущих документах Chainlink. Вместо этого попробуйте этот узел (на Коване) и задание:
Адрес Оракула = 0xAA1DC356dc4B18f30C347798FD5379F3D77ABC5b
идентификатор задания = 982105d690504c5d9ce374d040c08654
Для справки в будущем я искал похожие вакансии на market.link: https://market.link/search/all?network=42&search=Alarm%20Clock .
Документы будут обновлены.
Чужая планета
Патрик Коллинз
votinglive
значение true? Просто чтобы убедиться, что вы получаете ответ?