ошибка транзакции solidity, вызываемая функция подлежит оплате, если вы отправляете значение, а отправляемое значение должно быть меньше вашего текущего баланса

Я учусь основательности на ремиксе. Я смотрел обучающее видео на YouTube и застрял, пытаясь заключить 2 контракта. Контракт ERC20Token имеет функцию увеличения остатков. А Mycontract создает и вызывает функцию mint. Я сделал это так же, как и парень на youtube, но при вызове функции buyToken столкнулся с ошибкой. Ошибка говорит

транзакция в MyContract.buyToken с ошибкой: ошибка виртуальной машины: откат.

revert Транзакция была возвращена в исходное состояние.

Примечание. Вызываемая функция подлежит оплате, если вы отправляете значение, а отправляемое значение должно быть меньше вашего текущего баланса. Отладьте транзакцию, чтобы получить дополнительную информацию.

Пожалуйста, помогите мне.

Вот код.

pragma solidity 0.5.1;

contract ERC20Token{
   string public name;
   mapping(address => uint256) public balances;

   function mint() public {
       balances[tx.origin] ++;
  }
}

contract MyContract {
   address payable wallet;
   address public token;


   constructor(address payable _wallet, address _token) public {
    wallet = _wallet;
    token = _token;
}

    

   function buyToken() public payable {
       ERC20Token _token = ERC20Token(address(token)); 
       _token.mint();
       wallet.transfer(msg.value);
    
      }
  }

введите описание изображения здесь


person Baaam Park    schedule 23.04.2020    source источник


Ответы (4)


Вы должны использовать payable в своем конструкторе, как показано ниже:

constructor(address payable _wallet) public payable{
     ...
}
person Murad189    schedule 22.11.2020

Поскольку ваш текущий баланс равен 0. Вы можете попробовать использовать низкоуровневые взаимодействия, чтобы отправить некоторый баланс на адрес контракта. Дай мне знать, если это работает!

введите описание изображения здесь

person True Eye    schedule 09.07.2020
comment
У меня возникла эта проблема, и это не сработает. Я получаю ту же ошибку при развертывании с любым количеством wei или ether. - person LittleBobbyTables; 06.10.2020

Ответ, которого я больше нигде не видел, - это необходимость просто обновить страницу / браузер, если вы используете Remix через браузер.

person Panos Antoniou    schedule 03.06.2021

Проверьте свой баланс с помощью функции balanceOf (), например balanceOf (owner). Потому что токен, который вы создаете, - это ваш баланс, если у вас нет чего-то, вы не можете покупать вещи. Здесь вы укажете смарт-контракт с балансом на основании количества принадлежащих вам токенов. У меня тоже есть ошибка в моем смарт-контракте, и я узнал об этом через день.

Чтобы преодолеть это, сделайте следующее:

  • Добавляйте программы для добавления и вычитания баланса из баланса как покупателя, так и владельца.
  • Если вы хотите дать некоторый баланс начального уровня, чтобы новички начали покупать вещи.
person MAHENDRAN KANAGARAJ    schedule 18.06.2021