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?
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.
buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
cámbielo address(this)
por cualquier dirección a la que desee que regrese.
patricio collins