Como passar o argumento para o seletor Chainlink?

Nov 30 2020

Eu tenho um mapeamento com chaves inteiras e valores de estrutura.

mapping (int => Client) public customers;

Cada cliente tem seu próprio argumento de prova que estou tentando atualizar com uma chamada de API Chainlink. Aqui está minha estrutura.

struct Client {
    int id,
    bool proof;
}

Aqui está como eu solicito uma chamada API get

   function checkProof(string memory JobLocation, bytes32 JOBID) public {

      Chainlink.Request memory req = buildChainlinkRequest(JOBID, address(this), this.fulfill.selector);

      req.add("get",JobLocation);

      req.add("path", "proof");

      sendChainlinkRequestTo(ORACLE_ADDRESS, req, ORACLE_PAYMENT);
}

E esta função aciona a seguinte função

     function fulfill(bytes32 _requestId, bool _isProofCorrect, unit val) public recordChainlinkFulfillment(_requestId){
            customers[1].proof = _isProofCorrect;  
}

Como posso atualizar o argumento de prova do meu Construto usando o ID do cliente. Por exemplo:

customers[<customer_id>].proof = _isProofCorrect;

Respostas

1 PatrickCollins Nov 30 2020 at 22:17

Para todas as chamadas da API Chainlink , o fulfilmétodo leva apenas 2 argumentos.

  • bytes32 _requestIdO requestIdda chamada da API Chainlink.
  • <type> _dataO _dataque está sendo retornado pela chamada da API Chainlink.

Isso significa que você não pode passar 3 parâmetros.

O que isso significa é que você pode mapear requestIdseu valor de acordo com o seu valor , e ele se parecerá com isso.

mapping (bytes32 => uint) public requestMapping;

function checkProof(string memory JobLocation, bytes32 JOBID) public {

      Chainlink.Request memory req = buildChainlinkRequest(JOBID, address(this), this.fulfill.selector);
      req.add("get", JobLocation);
      req.add("path", "proof");
      bytes32 requestId = sendChainlinkRequestTo(ORACLE_ADDRESS, req, ORACLE_PAYMENT);
      requestMapping[requestId] = customerId;
}

     function fulfill(bytes32 _requestId, bool _isProofCorrect, unit val) public recordChainlinkFulfillment(_requestId){
            uint256 value = requestMapping[_requestId]
            customers[value].proof = _isProofCorrect;  
}