Truffle Error-VM Exception pendant le traitement de la transaction: annuler

Ritesh Gupta

Truffle Error-VM Exception pendant le traitement de la transaction: annuler


Je crée un cas de test de solidité en truffe et ma fonction de solidité est donnée ci-dessous pour laquelle je crée des cas de test

 function  isValidBuyer ( uint256 buyTokenQty ,  uint256 senderValue )   public  constant returns ( bool ) 
     { 
         if (! isUserExist ( msg . sender )) 
         { msg . sender . transfer ( senderValue );   //Refund Ether 
             return   false   ;  
         } 
         else  
         { 
             return   true   ; 
         } 
     } 

Et mes cas de test sont comme ci-dessous

 it ( 'TCC001: should check invalid buyer and should return false' ,     async   ()   =>   { 
 let  tempRes1 = await  instChain . isValidBuyer ( 100 , 1 ,{ from : account2 , gas : '220000' }); 

  assert . isTrue (! tempRes1 ); 
 });   

Lors du test de la clause de fonction dans ce test, j’obtiens une erreur VM Exception lors du traitement de la transaction: revert Un cas intéressant est dans la fonction isValidBuyer () lorsque je passe 1 wei, il donne l’exception mentionnée ci-dessus, mais lorsque j’envoie 0,99 ou moins, il est exécuté avec succès sans erreur.

Réponses


 Greg Jeanmart

Il n’est pas très clair ici ce que vous essayez d’atteindre. Il semble que vous tentiez de rembourser un jeton ou de l’éther qui n’a pas encore été transféré?

Mais, voici quelques notes sur votre code:

je. Si vous transférez de l’éther, vous n’avez pas besoin de spécifier le montant comme argument de fonction. Mais vous devez ajouter le mot-clé payable et transférer la valeur comme ça:

 instChain . isValidBuyer ( 100 , 1 ,{ from : account2 , gas : '220000' , value :< AMOUNT IN WEI >}); 

ii. Vous utilisez la constant mot-clé pour une opération de changement d’état (opération d’écriture) et cela ne peut pas fonctionner car ce mot-clé est exclusivement pour la fonction en lecture seule, vous ne pouvez pas appeler une opération qui change l’état (comme le transfert de fonds ou le stockage de données) dans ce genre de fonction.

iii. vous utiliseriez simplement require pour vérifier si le membre existe et rembourser le montant passé au contrat + le gaz restant.

 function  isValidBuyer ( uint256 buyTokenQty ,  uint256 senderValue )   public  payable returns ( bool )   { 
     // access value with `msg.value` 

     require ( isUserExist ( msg . sender ))   { 

     return   true 
 } 

Ritesh Gupta

Votre hypothèse est juste. Je veux transférer de nouveau l’éther si la condition n’est pas remplie. Comme vous l’avez suggéré d’utiliser require, mais le problème est que lorsque la condition est remplie, elle retourne vrai, mais si la condition n’est pas remplie, elle renvoie une exception que je ne veux pas, mais elle doit renvoyer false.

 

#de, #la, annuler, Error-VM, exception, Le, pendant, traitement, transaction, Truffle

 

yahoo

Laisser un commentaire

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