У меня есть функция, которая динамически создает контракт ERC20 на вызов функции в другом контракте следующим образом:
function createDao ( string _tokenName ) public payable { tokenNumberIndex = safeAdd ( tokenNumberIndex , 1 );
string memory _tokenSymbol = bytes32ToString ( uintToBytes ( tokenNumberIndex )); address _tokenAddress =
( new REP ). value ( msg . value )( _tokenSymbol , _tokenName ); erc20SymbolAddresses [ _tokenSymbol ] = _tokenAddress ; proposalIndex = safeAdd ( proposalIndex , 1 ); emit NewProposalCreated ( proposalIndex ); newProposalInternal ( proposalIndex , _tokenSymbol , _tokenName , _tokenName , msg . sender , msg . value );
}
Я уверен, что следующий код выполняется правильно:
address _tokenAddress =
( new REP ). value ( msg . value )( _tokenSymbol , _tokenName ); erc20SymbolAddresses [ _tokenSymbol ] = _tokenAddress ;
Однако erc20SymbolAddresses
дает адрес 0
для всех возможных символов токена. Сколько времени занимает создание репутации? Как я узнаю, что создание не удастся?
Код контракта REP следующий:
contract REP is ERC20Interface , SafeMath {
string public symbol ;
string public name ; uint8 public decimals ;
uint public _totalSupply ; mapping ( address => uint ) balances ; mapping ( address => mapping ( address => uint )) allowed ;
constructor ( string _tokenSymbol , string _name ) public payable { symbol = _tokenSymbol ; name = _name ; decimals = 18 ; _totalSupply = msg . value ; balances [ msg . sender ] = _totalSupply ; emit Transfer ( address ( 0 ), msg . sender , _totalSupply );
}
..........
..........
}
Что мне здесь не хватает?
Я подозреваю, что вы называете параметры неправильными, попробуйте использовать и не включать свойство msg.value
, я не вижу выгоды от включения его в ваш конкретный контракт.
address _tokenAddress = ( new REP ( _tokenSymbol , _tokenName );
Есть несколько эталонных трюфельных коробок, которые вы также можете проверить на фабриках erc20, таких как EIP20Factory.