Я пытаюсь создать договор, и установить его владельца в то же время
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
Я запустил код в ремиксе с соответствующими дополнениями для владельца и 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 (...).
Надеюсь, поможет!
Barrard
transact to ERC721CrowdSale.(fallback) errored: Cannot read property 'length' of undefined
Barrard