Chainlink Price Feed – Funktion schlägt fehl, wenn der Preis nicht fest codiert ist, aber korrekt in der Konsole angezeigt wird

Ich stehe vor einer Herausforderung und hoffe auf Anleitung/Hilfe/Unterstützung... Ich habe an der Implementierung des Preis-Feeds gearbeitet. Das Testen vor Ort mit fest codiertem Rückgabepreis funktioniert wie ein Zauber, keine Probleme. Bei Bereitstellung auf Testnet (Rinkeby) mit tatsächlichen Preisabrufdaten wird der Preis in der Konsole so angezeigt, wie er sollte. Wenn ich jedoch eine Funktion verwende, die auf den Preis-Feed angewiesen ist, erhalte ich einen Fehler in Metamask. Wenn ich es mit einem Fehler genehmige (in der Hoffnung zu sehen, was das Problem ist), gibt die Konsole einen Fehler zurück, dass das Gas ausgegangen ist, aber das Gaslimit ist nicht festgelegt (wenn Sie das Gaslimit festlegen, wird kein Fehler in Metamask und angezeigt es geht immer noch das Benzin aus, egal welches Limit Sie einstellen). Jede Hilfe und Einsichten wären sehr willkommen und hier ist ein Code, der Ihnen hilft, mir zu helfen ...

Ich beginne damit, den Preis-Feed im Grunde zu importieren:

interface AggregatorV3Interface {

  function decimals() external view returns (uint8);
  function description() external view returns (string memory);
  function version() external view returns (uint256);

  function getRoundData(uint80 _roundId) external view returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

  function latestRoundData() external view returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

}

Ich habe eine Funktion, wo ich die Daten abrufen kann:

 function getOracleUsdPrice(address token) public view returns (int256, uint256) {
        address oracleAddress = availableOracles[token];
        require(oracleAddress != address(0), "Mp: Token not supported.");

        (, int256 answer, , uint256 updatedAt, ) = AggregatorV3Interface(oracleAddress).latestRoundData();
        return (answer, updatedAt);
        // for local testing ONLY
        // return (100000000, now); //1 for 1 exchange
    }

und dann habe ich eine Funktion, wo ich die Token und Orakel nach Bedarf hinzufügen kann:

function addOracle(address token, address oracle) public onlyOwner{
        availableOracles[token] = oracle;
}

Innerhalb der fehlerhaften Funktion habe ich Folgendes:

function buy(IERC20 token, uint256 tokenId) public payable {
        Offer storage offer = offerDetails[tokenId];  

        // get price conversion
        (int256 currentPrice, uint256 updatedAt) = (getOracleUsdPrice(address (token)));

        // convert USD price to crypto
        uint256 cryptoPrice = offer.price.mul(1 ether).div(uint(currentPrice));

        // transfer funds from buyer
        token.universalTransferFromSenderToThis(cryptoPrice);
        
        // pay the seller
        token.universalTransfer(offer.seller, cryptoPrice);
        
        // transfer token to buyer
        _houseToken.safeTransferFrom(offer.seller, msg.sender, tokenId);

        // remove and emit
        delete offerDetails[tokenId];
        emit MarketTransaction("Token purchased", msg.sender, tokenId);
    }

Die Preisumrechnung erfolgt so, dass der Benutzer, wenn ein Artikel für USD gelistet ist, den USD-Preis sehen, aber dann mit Krypto kaufen kann.

Ich habe überprüft, ob ich die Rinkeby-Adresse sowohl für das Token als auch für die Orakeladresse habe. Die Transaktion schlägt fehl, egal ob ich ETH oder ERC20 verwende. Ich bekomme das gleiche Problem sowohl bei Rinkeby als auch bei Kovan. Wenn ich in beiden Netzwerken mit fest codierten Rücksendenummern (wie ich es in Ganache hatte) erneut bereitstelle, geht es durch. Der Teil, der mich verblüfft, ist, dass ich die gleiche Funktion getOracleUsdPrice() am Frontend verwende (wo Konsole und GUI den korrekten Preis und die richtige Konvertierung anzeigen).

Vielen Dank im Voraus für Ihre Hilfe, und wenn noch etwas fehlt, von dem Sie glauben, dass es nützlich wäre, um eine Hilfestellung zu leisten, lassen Sie es mich bitte wissen. Supper weiß Ihre Hilfe dabei zu schätzen.

Könnten Sie ein Beispiel für ein fehlerhaftes Token und eine Adresse hinzufügen, die Sie verwenden? Auf den ersten Blick sieht es so aus, als würdest du alles richtig machen.
Ich habe mit test ETH und DAI getestet ... die Herausforderung, wie ich in Lösung beschrieben habe, war die Nummer, die ich immer wieder weitergegeben habe, und die aktualisierteAt. Vielen Dank, dass Sie sich die Zeit genommen haben, nachzuschauen und zu antworten.

Antworten (1)

Gelöst! Falls andere auf das gleiche Problem stoßen und keine Antworten finden können, hier ist das Problem.

Es gab zwei Probleme:

  1. Frontend
  2. Vertrag

Frontend: Um die Preise richtig anzuzeigen, habe ich die Konvertierung an Fixed() übergeben und diese Zahl weiterhin an die Kauffunktion weitergegeben. Dadurch wurde ein falscher Betrag an die Funktion gesendet, weshalb sie fehlschlug.

Vertrag: Ich habe den Zeitpunkt verwendet, an dem das Orakel den Preis geliefert hat, um sicherzustellen, dass er aktuell ist. Leider werden die Testnet-Preise nicht so oft aktualisiert, wie wir möchten (abgesehen von ETH). Nachdem ich das auskommentiert und mit dem vollen Preis von Oracle ausgeführt hatte, funktionierte alles.