Я развернул контракт testrpc с токеном ERC20, который имеет следующий конструктор:
pragma solidity ^0.4.4;
import 'zeppelin-solidity/contracts/token/StandardToken.sol';
contract TutorialToken is StandardToken {
string public name = 'TutorialToken';
string public symbol = 'TT';
uint public decimals = 2;
uint public INITIAL_SUPPLY = 12000;
function TotorialToken() {
totalSupply = INITIAL_SUPPLY;
balances[msg.sender] = INITIAL_SUPPLY;
}
}
Насколько я понимаю, контракт будет развернут 0-й учетной записью testrpc. Однако, когда я делаю
TutorialToken.deployed().then(c => c.balanceOf('<0th account addr>').then(b => console.log(b)))
Он отображает
{ [String: '0'] s: 1, e: 0, c: [ 0 ] }
Получается, что на счету нет баланса. Я также не вижу баланс на вкладке «Токен» метамаски. Похоже, для создания учетной записи использовался какой-то другой адрес. Однако я не могу найти какую-либо функцию, чтобы увидеть, кто является создателем контракта (кто был msg.sender
).
Можно ли в консоли трюфеля увидеть, кто является создателем контракта?
Проблема с балансом была из-за опечатки: имя конструктора было TotorialToken
вместо TutorialToken
.
Однако первоначальный вопрос остается в силе: как напечатать владельца контракта?
Чтобы увидеть владельца контракта, я могу сделать что-то вроде этого (спасибо pabloruiz55 за предложение):
address owner;
function TutorialToken() {
owner = msg.sender;
...
}
Это работает. Итак, я думаю, мой вопрос в другом: StandardToken
содержит ли OpenZeppelin owner
поле, к которому можно получить доступ?
Самый простой способ — сохранить владельца/создателя контракта в переменной состояния при развертывании.
pragma solidity ^0.4.8;
contract myContract {
address public owner;
function myContract() {
owner = msg.sender;
}
}
Проверка StandardToken показала следующую иерархию наследования:
ERC20Basic
/ \
ERC20 BasicToken
\ /
StandardToken
Со следующими полями в каждом договоре:
StandardToken:
mapping (address => mapping (address => uint256)) allowed
ERC20:
none
BasicToken:
mapping(address => uint256) balances
ERC20Basic:
uint totalSupply
Для того, чтобы иметь owner
имущественный контракт, необходимо расширить имущественный контракт (спасибо Ismael за подсказку):
contract TutorialToken is StandardToken, Ownable {
...
}
contract TutorialToken is StandardToken, Ownable {
.Это сработало у меня из консоли разработки:
x = TutorialToken.deployed() x.then( i => i.owner().then(console.log))
имя