Transaktion wurde während der Vertragsausführung rückgängig gemacht [Rückgängig gemacht]

Ich habe ETH an eine Vertragsadresse gesendet, und die Transaktion ist "fehlgeschlagen" und sagt: Warning! Error encountered during contract execution [Reverted].

Vertragsadresse und Transaktionsfehler hier:

https://rinkeby.etherscan.io/tx/0x28a0a0f7eb8cf863afb4a9a2425648d2d9693e39793f0f9cc01d006374808370

ICO-Token-Vertragscode:-

pragma solidity ^0.4.24;
import "./DappToken.sol";


contract ICOToken is DappToken {

   string public name = 'ICOToken';
   string public symbol = 'ITK';
   uint256 public decimals = 18;
   uint256 public totalSupply;
   address public crowdsaleAddress;
   address public owner;
   uint256 public ICOEndTime = 1541246755;
   uint256 public balance;

   modifier onlyCrowdsale {
      require(msg.sender == crowdsaleAddress);
      _;
   }

   modifier onlyOwner {
      require(msg.sender == owner);
      _;
   }

//   modifier afterCrowdsale {
//  require(now > ICOEndTime || msg.sender == crowdsaleAddress);
//      _;
//  }

   constructor (uint256 _tokenSupply) public DappToken() {
      totalSupply = _tokenSupply;
      balanceOf[msg.sender] = _tokenSupply;
      owner = msg.sender;
   }


   function setCrowdsale(address _crowdsaleAddress) public onlyOwner  {

      require(_crowdsaleAddress != address(0));
      crowdsaleAddress = _crowdsaleAddress;

   }


    function buyTokens(address _receiver, uint256 _amount) public  {

      require(_receiver != address(0));
      require(_amount > 0);
      transfer(_receiver, _amount);


   }

//       /// @notice Override the functions to not allow token transfers until the end of the ICO
//   function transfer(address _to, uint256 _value) public afterCrowdsale returns(bool) {

//       return super.transfer(_to, _value);

//   }


//   /// @notice Override the functions to not allow token transfers until the end of the ICO
//   function transferFrom(address _from, address _to, uint256 _value) public afterCrowdsale returns(bool) {

//       return super.transferFrom(_from, _to, _value);

//   }


//   /// @notice Override the functions to not allow token transfers until the end of the ICO
//   function approve(address _spender, uint256 _value) public afterCrowdsale returns(bool) {

//       return super.approve(_spender, _value);
//   }

//   /// @notice Override the functions to not allow token transfers until the end of the ICO

//   function increaseApproval(address _spender, uint _addedValue) public afterCrowdsale returns(bool success) {

//       return super.increaseApproval(_spender, _addedValue);
//   }

//   /// @notice Override the functions to not allow token transfers until the end of the ICO

//   function decreaseApproval(address _spender, uint _subtractedValue) public afterCrowdsale returns(bool success) {

//       return super.decreaseApproval(_spender, _subtractedValue);
//   }

//   function emergencyExtract() external onlyOwner {

//       owner.transfer(address(this).balance);
//   }

}

Crowdsale-Vertragscode wie folgt:-

    pragma solidity ^0.4.24;
import "./ICOToken.sol";

contract Crowdsale {
   bool public icoCompleted;
   uint256 public icoStartTime = 1538567825; // 3 oct 2018 11.57 AM UTC;
   uint256 public icoEndTime = 1541246755;  // 3 nov 2018 11.57 Am UTC;
   uint256 public tokenRate;
   uint256 public fundingGoal;
   address public owner;
   ICOToken public token;
   uint256 public tokensRaised;
   uint256 public etherRaised;
   uint256 public etherUsed = msg.value;
   uint256 public tokensToBuy;


   modifier whenIcoCompleted {
      require(icoCompleted);
      _;
   }

    modifier onlyOwner {
      require(msg.sender == owner);
      _;
   }

   function () public payable {
       buy();
   }

     constructor(uint256 _tokenRate, address _tokenAddress, uint256 _fundingGoal) public {
      require(icoStartTime != 0 &&
      icoEndTime != 0 &&
      icoStartTime < icoEndTime &&
      _tokenRate != 0 &&
      _tokenAddress != address(0) &&
      _fundingGoal != 0);
      tokenRate = _tokenRate;
      token = ICOToken(_tokenAddress);
      fundingGoal = _fundingGoal;
      owner = msg.sender;
      etherUsed;
      tokensToBuy;
   }

    function buy() public payable {

    //   require(tokensRaised < fundingGoal);
    //   require(now < icoEndTime && now > icoStartTime);

      etherUsed = msg.value;

      tokensToBuy = etherUsed * (10 ** token.decimals()) / 1 ether * tokenRate;

    //   Check if we have reached and exceeded the funding goal to refund the exceeding tokens and ether

    //   if(tokensRaised + tokensToBuy > fundingGoal) {

    //      uint256 exceedingTokens = tokensRaised + tokensToBuy - fundingGoal;
    //      uint256 exceedingEther;

    // //   Convert the exceedingTokens to ether and refund that ether
    //      exceedingEther = exceedingTokens * 1 ether / tokenRate / token.decimals();

    //      msg.sender.transfer(exceedingEther);

    //     //   Change the tokens to buy to the new number
    //      tokensToBuy -= exceedingTokens;

    //     //   Update the counter of ether used
    //      etherUsed -= exceedingEther;

    //   }
      // Send the tokens to the buyer
      token.buyTokens(msg.sender, tokensToBuy);

      // Increase the tokens raised and ether raised state variables
      tokensRaised += tokensToBuy;
      etherRaised += etherUsed;
   }


   function extractEther() public whenIcoCompleted onlyOwner {
       owner.transfer(address(this).balance);
   }

}

Ich habe auch Remix debuggt und festgestellt, dass dieser msg.value nicht in der Etherused-Variablen gespeichert wird, die im Crowdsale Smart Contract verwendet wird, wenn der Endbenutzer den Betrag per Metamask-Wallet bezahlt. Das Token kann also nicht an den Empfänger übertragen werden.

Also wie kann ich dieses Problem lösen?? Bitte hilf mir.

Danke.

Es ist unmöglich zu helfen, ohne einen relevanten Code zu sehen.
Ich habe meine Frage aktualisiert, bitte überprüfen.

Antworten (1)

Es sieht so aus, als ob buy()es beim Ausführen aufgerufen wird token.buyTokens().

buyTokens()ruft wiederum an transfer(). Die überwiegende Mehrheit der Übertragungsfunktionen überprüft vor der Übertragung die Kontostände der Benutzer, daher gehe ich davon aus, dass Ihre Super-Implementierung dies auch tut.

Da der Crowdsale-Vertrag in transfer()Ihrem Vertrag enthalten ist, muss der Crowdsale-Vertrag also genügend Token enthalten, um diese Übertragung durchzuführen, was nicht der Fall zu sein scheint.msg.sender

Ich habe meine Frage erneut aktualisiert, bitte überprüfen. Ich verwende bereits die Fallback-Funktion.
@AnupamJain Meine Antwort wurde aktualisiert.
Hallo Raghav, danke für die Antwort. Wie ich von Token zu Token-Vertrag zu Crowd-Sale-Vertrag übertrage
Wenn ich die Besitzeradresse als Empfängeradresse verwende, wurde die Transaktion erfolgreich durchgeführt. Aber wenn ich von der Adresse auf rinkeby.etherscan.io überprüfe , findet es kein geeignetes Token, also passiert es, weil ich keine Crowsale-Adresse verwende. Wenn nicht, warum findet der Endbenutzer keinen geeigneten Ether. Bitte helfen Sie mir, diese Frage zu lösen.
Hallo Raghav, vielen Dank. Jetzt funktioniert meine Vertragsfunktion einwandfrei. Wenn ich Token an die Krähenverkaufsadresse übertrage. Und dann Ether an die Krähenverkaufsadresse senden. Die Transaktion ist also erfolgreich.