¿Cómo hacer una llamada asincrónica del oráculo de solidez de ChainLink?

Necesito introducir un punto en mi contrato de Ethereum. Estoy probando este código en Kovan en base a este ejemplo: https://docs.chain.link/docs/make-a-http-get-request/

pragma solidity ^0.6.0;

import "https://raw.githubusercontent.com/smartcontractkit/chainlink/develop/evm-contracts/src/v0.6/ChainlinkClient.sol";

// SPDX-License-Identifier: UNLICENSED

contract ChainlinkExample is ChainlinkClient {
  
    uint256 public price;
    
    address private oracle;
    bytes32 private jobId;
    uint256 private fee;
    
    constructor() public {
        setPublicChainlinkToken();
        oracle = 0x2f90A6D021db21e1B2A077c5a37B3C7E75D15b7e;
        jobId = "29fa9aa13bf1468788b7cc4a500a45b8";
        fee = 0.1 * 10 ** 18; // 0.1 LINK
    }

    function requestEthereumPrice() public returns (bytes32 requestId){
        Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
            req.add("get", "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD");//{"USD":1797.12}
            req.add("path", "USD");
            req.addInt("times", 100);
        return sendChainlinkRequestTo(oracle, request, fee);
    }

    function fulfill(bytes32 _requestId, uint256 _price) public recordChainlinkFulfillment(_requestId){
        price = _price;
    }

}

Todo funciona correctamente, pero la función "requestEthereumPrice()" tarda unos segundos en guardar la variable "precio".

¿Cómo podría llamar a una solicitud, esperar la respuesta y continuar con mis siguientes cálculos de código?

Por ejemplo, ¿cómo puedo solicitar el precio de la API y hacer una operación y devolver el resultado en la misma llamada de función?

No agregue otra pregunta a la misma pregunta en stackoverflow. ¿Puede crear una nueva pregunta titulada "Cómo devolver una llamada API de Chainlink a otro contrato"?

Respuestas (1)

Querría colocar toda su lógica en la función de devolución de llamada, en este caso fulfill.

Por ejemplo, si quisieras acuñar algún token basado en el retorno de una llamada a la API, harías algo como:

function fulfill(bytes32 _requestId, uint256 _price) public recordChainlinkFulfillment(_requestId){
        price = _price;
        mint(price);
        // any other logic here
    }

Las llamadas a la API de Chainlink son asíncronas por naturaleza, por lo que no realiza una llamada a la API y obtiene una respuesta en el mismo bloque.

Necesito llamar a la función "requestEthereumPrice()" desde otro contrato. ¿Cómo puedo devolver el "precio" al contrato principal?
Desearía que la dirección de devolución de llamada fuera el otro contrato. buildChainlinkRequest(jobId, address(this), this.fulfill.selector);cámbielo address(this)por cualquier dirección a la que desee que regrese.
Hola Patrick, lo estoy intentando pero no consigo que funcione de forma sencilla. ¿Podrías guiarme? Gracias. (Mira la sección EDITAR)