transferFrom ne fonctionne pas

Stijn Bernards

transferFrom ne fonctionne pas


J’essaie de créer un simple contrat airDrop. Mais quoi que je fasse, rien ne semble fonctionner.

J’ai basé mon contrat personnalisé et mon gage des contrats de solidité zeppelin.

Voici le code que j’utilise pour larguer des fonds:

 function  distribute ( 
     uint  _airDropID )   public 
 { 
     for   ( uint  i =   0 ;  i <  airDrops [ _airDropID ]. participantCount ;  i ++)   { 
         TokenDrop ( msg . sender ,  airDrops [ _airDropID ]. participants [ i ],  airDrops [ _airDropID ]. amount ); ERC20 ( token ). transfer ( airDrops [ _airDropID ]. participants [ i ],  airDrops [ _airDropID ]. amount ); 

         //token.mint(airDrops[_airDropID].participants[i], airDrops[_airDropID].amount); 
     } 
 } 

J’ai également essayé de frapper les fonds, mais les deux fonctions entraînent une VM Exception while processing transaction: revert

Ce qui me dit qu’un require () échoue. J’ai essayé de déboguer davantage mon code et il semble que l’adresse msg.sender ait changé pendant la fonction transfer () ou mint ().

C’est le test que j’exécute actuellement.

 let   AirDrop   =  artifacts . require ( "./AirDrop.sol" ); 
 let   GameToken   =  artifacts . require ( "./GameToken.sol" ); 

 //TestData 
 let  gameTokenMarketCap =   1 * 1000 * 1000 * 1000 ; 
 let  amountToMint =   1 * 1000 * 1000 ; 
 let  amountToApprove =   1 * 1000 * 1000 * 1000 * 1000 ; 
 let  amountToDrop =   1000 ; 
 let  airDropParticipants =   2 ; 

 //Expected Test Results 
 let  expectedAirDropID =   0 ; contract ( 'Airdrop' ,   ( accounts )   =>   { 
     let  tokenContract ; 
     let  airDropContract ; 
     let  participantID ; 
     let  dropper =  accounts [ 0 ]; 
     let  receiver =  accounts [ 1 ]; 
     let  receiver2 =  accounts [ 2 ]; 

     /** * Initial setup. * Mint tokens to dropper address and check it. */ before (()   =>   { 
         return   GameToken . new ( gameTokenMarketCap ,  dropper ,   { from :  dropper }). then (( instance )   =>   { tokenContract =  instance ; 

             return   AirDrop . new ( tokenContract . address ,  dropper ,   { from :  dropper }); 
         }). then (( instance )   =>   { airDropContract =  instance ; 

             return  tokenContract . mint ( dropper ,  amountToMint ). then (()   =>   { 
                 return  tokenContract . balanceOf . call ( dropper ); 
             }). then (( balance )   =>   { console . log ( balance . valueOf ()); 
                 assert . equal ( balance . valueOf (),  amountToMint ,   "Token dropper balance should equal minted balance!" ); 
             }); 
         }); 
     }); describe ( 'Creation and Execution' ,   ()   =>   { 
         let  airDropID ; it ( 'Allows creating an airDrop and increments the ID' ,   async   ()   =>   { 
             //Firstly test with .call airDropContract . createAirDrop . call ( airDropParticipants ,  amountToDrop ). then (( airDrop )   =>   { airDropID =  airDrop ; 

                 assert . equal ( airDropID . valueOf (),  expectedAirDropID ,   "AirDrop ID not correctly created!" ); 
             }); 

             //Execute on blockchain 
             await  airDropContract . createAirDrop ( airDropParticipants ,  amountToDrop ); 

             return   true ; 
         }); 

         //Add an participant to the created airDrop it ( 'Allows adding a participant to the AirDrop' ,   ()   =>   { airDropContract . addParticipantToAirDrop . call ( airDropID ,  receiver ). then ( participantID =>   { 
                 assert . equal ( participantID . valueOf (),  expectedAirDropID ,   "Participant ID not correctly created!" ); 
             }); airDropContract . addParticipantToAirDrop ( airDropID ,  receiver ); airDropContract . addParticipantToAirDrop ( airDropID ,  receiver2 ); 

             return   true ; 
         }); it ( 'Allows distributing an airDrop and sends the right amount of credits to both participants' ,   async   ()   =>   { 
             //Distribute and check the airDrop 
             return  airDropContract . distribute ( airDropID ,   { from :  dropper }). then ( success =>   { 
                 return  tokenContract . balanceOf . call ( receiver ); 
             }). then ( balance =>   { 
                 assert . equal ( balance . valueOf (),  amountToDrop ,   "airDrop was not executed correctly." ); 

                 return  tokenContract . balanceOf . call ( receiver2 ); 
             }). then (( balance )   =>   { 
                 assert . equal ( balance . valueOf (),  amountToDrop ,   "airDrop was not executed correctly." ); 

                 return  tokenContract . balanceOf . call ( dropper ); 
             }). then (( balance )   =>   { 
                 assert . equal ( balance . valueOf (),  amountToMint -  amountToDrop *   2 ); 

                 return   true ; 
             }); 
         }); 
     }); 
 }); 

Il s’agit de la fonction défaillante: airDropContract.distribute(airDropID, {from: dropper})

Est-ce que quelqu’un sait pourquoi la valeur de msg.sender change et pourquoi le largage ne fonctionne pas?

Merci d’avance.

Réponses


 Stijn Bernards

Résolu, j’ai dû approuver le contrat pour envoyer des jetons en mon nom.

tokenContract.approve(airDropContract.address, amountToApprove);

 

#pas, fonctionne, ne, transferFrom

 

yahoo

Laisser un commentaire

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