Impossible d’envoyer de l’éther à une fonction payable dans le test unitaire de la truffe

Wenjing

Impossible d’envoyer de l’éther à une fonction payable dans le test unitaire de la truffe


Je débogue un bug survenu lors de mon test de solidité de la truffe. Je peux limiter le problème à une exception survenue dans le modificateur payable.

mon code de contrat:

 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 
   } 
 } 

mon code de test:

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

exception:

       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 ) 

Rob Hitchens B9lab

Êtes-vous sûr (je veux dire, vraiment sûr) que le contrat est déployé à contractAddress et que l’ABI de MyContract décrit correctement?

Ismael

En réalité, ne pas avoir à payer équivaut à require(msg.value == 0) et avoir à payer équivaut à supprimer ce besoin.

mirg

Testez-vous votre code via Solidity? si c’est le cas, le contrat de test pourrait avoir besoin d’un peu d’éther pour effectuer la transaction. Pour ce faire, ajoutez cette uint public initialBalance = 1 ether; dans votre contrat de test. truffleframework.com/docs/getting_started/…

Wenjing

@RobHitchens Oui, je le suis. J’ai une affirmation le confirme. Assert.equal (myToken.ownerOf (0), contractAddress, « le propriétaire est contractAddress »);

Rob Hitchens B9lab

Semble mélangé, mais difficile d’être sûr hors contexte. adresse myToken == adresse du contrat == adresse du propriétaire du contrat. On dirait que vous essayez d’utiliser le jeton ABI pour instancier un contrat à l’adresse du portefeuille du propriétaire. Ce n’est probablement pas là où c’est.

Réponses


 mirg

J’ajoute la réponse depuis son dans les commentaires ci-dessus et pourrait être utile pour quelqu’un.

La transaction a été annulée car le contrat de test n’a pas de solde. Lorsque vous devez tester les transactions de contact via Solidity, l’expéditeur est le contrat de test. Pour permettre au contrat de test d’effectuer des transactions, vous devez définir le solde initial.

  uint public initialBalance = 1 éther;  // ou toute autre valeur

cette propriété doit être ajoutée à votre contrat de test. ref

 

#(une, #à, #de, #la, d’envoyer, dans, fonction, impossible, l’éther, Le, payable, test, truffe, unitaire

 

yahoo

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *