Не удается отправить эфир платной функции в юнит-тесте трюфеля.

Я устраняю ошибку, возникшую в моем тесте на прочность трюфелей. Я могу сузить проблему до исключения, произошедшего в модификаторе payable.

мой код контракта:

import "zeppelin-solidity/contracts/token/ERC721/ERC721Token.sol";

contract MyToken is ERC721Token { 
  function MyToken() ERC721Token(NAME, SYMB) public payable {
  }
  function purchase(uint256 _tokenId) public payable {
    // all the code in this function is commented out when I do the test
  }
}

мой тестовый код:

MyToken myToken = MyToken(contractAddress);
myToken.purchase.value(1000000000000000000).gas(1000000000000000000)(0);

исключение:

     Error: VM Exception while processing transaction: revert
  at Object.InvalidResponse (/usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/errors.js:38:1)
  at /usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/requestmanager.js:86:1
  at /usr/local/lib/node_modules/truffle/build/webpack:/~/truffle-provider/wrapper.js:134:1
  at XMLHttpRequest.request.onreadystatechange (/usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/httpprovider.js:128:1)
  at XMLHttpRequestEventTarget.dispatchEvent (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:64:1)
  at XMLHttpRequest._setReadyState (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:354:1)
  at XMLHttpRequest._onHttpResponseEnd (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:509:1)
  at IncomingMessage.<anonymous> (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:469:1)
  at endReadableNT (_stream_readable.js:1101:12)
  at process._tickCallback (internal/process/next_tick.js:114:19)
Вы уверены (я имею в виду, действительно уверены), что контракт развернут contractAddressи его ABI MyContractправильно описывает?
На самом деле отсутствие кредиторской задолженности эквивалентно require(msg.value == 0), а наличие кредиторской задолженности эквивалентно удалению этого требования.
Вы тестируете свой код через Solidity? если это так, тестовому контракту может потребоваться некоторое количество эфира для совершения транзакции. Для этого добавьте это uint public initialBalance = 1 ether;в свой контракт на тестирование. truffleframework.com/docs/getting_started/…
@RobHitchens Да, я. У меня есть утверждение подтверждающее это. Assert.equal(myToken.ownerOf(0), contractAddress, "владелец является contractAddress");
Кажется перепутанным, но трудно быть уверенным вне контекста. адрес myToken == адрес контракта == адрес владельца контракта. Похоже на попытку использовать токен ABI для создания экземпляра контракта по адресу кошелька владельца. Это, вероятно, не там, где это.
@mirg uint public initialBalance = 1 эфир; на самом деле работает! Спасибо!

Ответы (1)

Я добавляю ответ, так как он находится в комментариях выше и может быть кому-то полезен.

Транзакция была отменена, так как контракт на тестирование не имеет баланса. Когда вам нужно протестировать контактные транзакции через Solidity, отправителем является тестовый контракт. Чтобы разрешить тестовому контракту совершать транзакции, вам необходимо установить начальный баланс.

uint public initialBalance = 1 эфир; // или любое другое значение

это свойство должно быть добавлено в ваш контракт на тестирование. ссылка