Impossible de créer une instance dans le contrat en raison d’un constructeur surchargé

Téléportation de chèvre

Impossible de créer une instance dans le contrat en raison d’un constructeur surchargé


J’ai deux contrats, TokenContract et DynamicContract . Ce dernier est créé dynamiquement.

Je souhaite appeler une fonction de DynamicContract partir de TokenContract ( receiveApproval ). Selon cette question , ce que je dois faire est le suivant:

 function   ApproveAndCall ( address dynContAddress ,   uint  value ){ 
   DynamicContract  dynamicContractInstance =   DynamicContract ( dynContAddress ); dynamicContractInstance . foo (); 

   return   true ; 
 } 

J’ai import "./DynamicContract.sol"; au début de mon TokenContract.

Le truc, c’est que j’ai déjà un constructeur pour DynamicContract et ça prend un tas de paramètres. Je reçois donc une erreur de compilation indiquant que je n’ai pas les bons paramètres.

J’ai également essayé d’utiliser simplement DynamicContract(dynContAddress).foo() mais j’obtiens le Member "foo" not found or not visible after argument-dependent lookup in address

EDIT: Je devrais peut-être utiliser la function ApproveAndCall(DynamicContract dynContAddress, ...){} au lieu de la function ApproveAndCall(address dynContAddress, ...) si je veux utiliser dynContAddress.foo(){} ? Quelle est la différence?


Je pense que le problème pourrait provenir du fait que les deux fonctions d’appel de contrat de l’autre, donc les deux ont une import "./OtherContract.sol" . Étant donné que l’un doit compiler avant l’autre, il peut y avoir un problème (Solidity n’est pas aussi flexible que d’autres langues).

Serait-ce le problème? Alors comment pourrais-je le résoudre? (Je ne pense pas que le contrat soit trop compliqué, je veux juste payer pour des fonctions en token et les transférer à l’adresse à laquelle elles appartiennent).

EDIT 2 : En fait, je ne pense pas que ce soit le problème parce que lors de l’exécution de la truffle compile , j’obtiens Compiling .contractsDynamicContract.sol... et Compiling .contractsFactory.sol... avant Compiling .contractsToken.sol... qui donne l’erreur. ( member not found or not visible …)

mirg

foo est-il défini comme public? S’il est externe, il peut ne pas fonctionner

Téléportation de chèvre

@mirg Oui, je l’ai simplifié pour l’exemple mais toutes les fonctions que j’appelle en externe sont publiques.

Réponses


 A dessiné

Pour créer un nouveau contrat à partir d’un autre contrat:

une. Si l’éther doit être fourni lors de la construction:

 DynamicContract  dynamicContractInstance =  
      ( new   DynamicContract ). value (< ether to send >)(< param1 >,   <param2> ,   ...); 

b. Si l’éther n’a pas besoin d’être fourni lors de la construction:

 DynamicContract  dynamicContractInstance =  
      new   DynamicContract (< param1 >,   <param2> ,   ...); 

Ensuite, la fonction peut être appelée:

 dynamicContractInstance . foo (); 

Si l’adresse du contrat « dynamique » a déjà été obtenue:

la fonction peut être appelée:

 dynContAddress . foo (); 

Téléportation de chèvre

Je ne sais pas si c’est clair mais le contrat est déjà créé, je veux seulement faire une instance en utilisant l’adresse (que j’ai déjà)

A dessiné

Est-ce que « l’adresse (que j’ai déjà) » = dynContAddress? Si c’est le cas, il n’est pas nécessaire de recréer ou de transtyper le contrat, il est possible d’utiliser dynContAddress.foo (); pour appeler la fonction.

Téléportation de chèvre

Oui, mais comme je l’ai dit dans la dernière partie de ma question, addressThatIAlreadyHave.foo() ne fonctionne pas, je reçois « membre introuvable ou non accessible » (même si c’est public), je ne sais pas pourquoi je , ai-je raté quelque chose?

A dessiné

Ce gist contient le code que j’ai utilisé pour valider la réponse: gist.github.com/fidsteve/87fdd61996dfa04085161aecbc363690

Téléportation de chèvre

Je pense que je connais le problème. Dans ma fonction foo() , il y a tokenContract.transferFrom donc dynContract doit import "./TokenContract.sol" . Mais TokenContract doit également import "./DynamicContract" pour appeler dynContAddress.foo() . Alors peut-être que l’un doit d’abord compiler et que l’autre n’a pas déjà été compilé. Serait-ce possible? Comment résoudre ce problème?

 

#(une, #de, #en, Constructeur, contrat, créer, d’un, dans, impossible, instance, Le, raison, surcharge

 

yahoo

Laisser un commentaire

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