Передача права собственности на контракт в конструктор

Я пытаюсь создать договор, и установить его владельца в то же время

 contract ERC721CrowdSale is   Ownable   {   ...   } //contract is in the same file and has access to methods contract CS_Creator is   Ownable { ERC721CrowdSale _cs ; 

   function  create_crowdsale ( string  _name ,  address _wallet ,  uint256 _token_goal )  onlyOwner returns ( address ){ address _new_crowdsale =   new  ERC721CrowdSale ( _name ,  _wallet ,  _token_goal ); transfer_CS_ownership ( _new_crowdsale ,  _wallet ); 
       return  _new_crowdsale ; 
   } 

   function  transfer_CS_ownership ( address _new_crowdsale ,  address _wallet )    internal   { _cs =  ERC721CrowdSale ( _new_crowdsale ); _cs . transferOwnership ( _wallet ); 
   } 
 } 

это создает краудсейл, но в ремиксе я получаю сообщение об ошибке, когда я пробую любые методы на краудсейле

transact to ERC721CrowdSale.(fallback) errored: Cannot read property 'length' of undefined

Мне просто нужен удобный способ передать право собственности на краудсейл по адресу кошелька. Прямо сейчас они все принадлежат CS_Creator

Ответы (1)

Я запустил код в ремиксе с соответствующими дополнениями для владельца и ERC721CrowdSale, и ваш код работал нормально. Я лишь слегка изменил ваш контракт, чтобы получить значение текущего владельца краудсейла, возвращаемое функцией create_crowdsale (...).

 pragma solidity ^ 0.4 . 19 ; contract Ownable   { address public  owner ; 

     function   Ownable ()   public   { owner =  msg . sender ; 
     } modifier onlyOwner { 
         require ( msg . sender ==  owner ); _ ; 
     } 

     function  transferOwnership ( address _newOwner )   public  onlyOwner { owner =  _newOwner ; 
     } 
 } contract ERC721CrowdSale is   Ownable   { 

     string   public  name ; address public  wallet ; uint256 public  token_goal ; 

     function  ERC721CrowdSale ( string  _name ,  address _wallet ,  uint256 _token_goal )   public   { name =  _name ; wallet =  _wallet ; token_goal =  _token_goal ; 
     } 
     //... 

 } contract CS_Creator is   Ownable { ERC721CrowdSale _cs ; 

   function  create_crowdsale ( string  _name ,  address _wallet ,  uint256 _token_goal )  onlyOwner returns ( address ,  address ){ address _new_crowdsale =   new  ERC721CrowdSale ( _name ,  _wallet ,  _token_goal ); transfer_CS_ownership ( _new_crowdsale ,  _wallet ); 
       return   ( _new_crowdsale ,  get_CS_ownership ( _new_crowdsale )); 
   } 

   function  transfer_CS_ownership ( address _new_crowdsale ,  address _wallet )    internal   { _cs =  ERC721CrowdSale ( _new_crowdsale ); _cs . transferOwnership ( _wallet ); 
   } 

   function  get_CS_ownership ( address _crowdsale )   public  returns ( address )   { 
       return  ERC721CrowdSale ( _crowdsale ). owner (); 
   } 
 } 

В качестве возвращаемого значения для владельца краудсейла я получаю значение для адреса кошелька.

Я мог представить, что вы фактически создали контракт ERC721CrowdSale в remix, а затем проверяли, изменился ли адрес владельца после развертывания CS_Creator. Если так: в этом случае вы создаете новый экземпляр контракта ERC721CrowdSale с функцией create_crowdsale (...), которая, следовательно, полностью независима от другого контракта ERC721CrowdSale, который вы развернули раньше. Однако адрес владельца изменяется только в экземпляре, созданном функцией create_crowdsale (...).

Надеюсь, поможет!

Таким образом, у меня все работает, пока я не создаю Crowdsale «по адресу» и нажимаю на любую из функций (с ремикс-интерфейсом), и я получаю сообщение об ошибке transact to ERC721CrowdSale.(fallback) errored: Cannot read property 'length' of undefined
Ну, на самом деле это работало в тестовой сети Rinkeby, в отличие от JVM. Радости работы с новыми технологиями. Потратил много часов, играя с этим кодом, только чтобы понять, что он не сломан.