Comment envoyer Ether à un contrat avec succès?

29A

Comment envoyer Ether à un contrat avec succès?


Nouveau dans Solidity …

J’étudie comment déposer de l’ éther dans un contrat intelligent en définissant un paramètre dans une fonction. Sur la base de la valeur reçue par la fonction, l’expéditeur msg est capable d’envoyer une quantité prédéterminée d’Ether.

L’idée est que si une valeur de 1 à 3 est fournie, 24, 12 ou 6 Ether sont envoyés de l’expéditeur msg à l’adresse du contrat. J’ai mis z = j pour vérifier que la valeur a été reçue par la fonction. La variable t est la valeur de Wei et est définie sur msg.value. Il semble que msg.value soit correctement défini car la valeur de t est mise à jour en fonction de la valeur d’entrée fournie.

Le problème que je rencontre est que l’éther n’est pas transféré lorsque la fonction est appelée. Des conseils utiles seraient les plus appréciés.

J’utilise Remix et j’ai confirmé que tous les comptes ont été déverrouillés.

Voici la source …

  pragma solidity ^ 0.4 . 18 ; contract ETHTEST2 { mapping ( address =>  uint256 )   public  deposits ;   //depost uint256 public  z ; uint256 public  t ; 

     function  sendETHtoContract ( uint256 j )   public  payable {    //msg.sender & msg.value test - Work in Progress 

         if   ( j ==   1 ){ z =  j ; msg . value ==  t ; t =   24000000000000000000  wei ; address ( this ). transfer ( msg . value ); 
             return ; 
         } 

         if   ( j ==   2 ){ z =  j ; t =   12000000000000000000  wei ; address ( this ). transfer ( msg . value ); 
             return ; 
         } 

         if   ( j ==   3 ){ z =  j ; t =   6000000000000000000  wei ; address ( this ). transfer ( msg . value ); 
             return ; 
         } 

         if   ( j >= 4   ||  j <   0 ){    //works revert (); 
             return ; 
         } 

     } 

     function  getBalance ()   public  view returns ( uint256 )   { 
         return  address ( this ). balance ; 
     } 

     function ()   public  payable { 
     // this function enables the contract to receive funds 
     } 

 } 

Réponses


 AnAllergyToAnalogy

Un contrat ne peut pas extraire de force l’ETH d’une adresse de portefeuille, si vous voulez verser de l’éther dans un contrat, vous devez définir la « valeur » de la transaction lors de l’appel d’une fonction (ou simplement envoyer l’ETH à l’adresse du contrat si la fonction de secours est le permet).

L’utilisation du transfer transférera du contrat vers une autre adresse, donc avec l’ address(this).transfer(msg.value) , le contrat prend simplement l’ETH fourni par le msg.sender et le transmet à lui-même.

 function  sendETHtoContract ( uint256 j )   public  payable { 
     //msg.value is the amount of wei that the msg.sender sent with this transaction. 
     //If the transaction doesn't fail, then the contract now has this ETH. 
 } 

29A

Merci AnAllergyToAnalogy pour la clarification concernant le transfert. J’ai une question concernant « si vous voulez verser de l’éther dans un contrat, vous devez définir la » valeur « de la transaction ». Est-ce que msg.value est la « valeur » qui doit être définie ou existe-t-il une autre « valeur » que je dois rechercher. Si msg.value est correct, dois-je le régler correctement?

AnAllergyToAnalogy

Oui, msg.value est la valeur envoyée avec la transaction. Mais cela ne peut pas être fixé par le contrat, seulement lu par lui. Ceci est défini par l’expéditeur. Dans Remix, c’est en haut à droite de l’écran lorsque l’onglet « Exécuter » est sélectionné.

29A

Merci encore d’avoir aidé à comprendre AnAllergyToAnalogy, je l’apprécie. Je me demandais à quoi servait ce paramètre ‘Value’ dans Remix;)

 

#à, avec, comment, contrat, envoyer, Ether, succès, un

 

yahoo

Laisser un commentaire

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