Не удается передать право собственности на контракт краудсейла при развертывании в трюфеле

Я создал «Токен» и контракт «Краудсейл», как указано в openzeppelin. Ниже приведен мой код развертывания в truffle. Я новичок в кодировании и надежности, связанных с ICO. Вопрос может быть очень простым, но я изо всех сил пытаюсь найти ответ, не могли бы вы помочь?

Вопрос

  1. Я понимаю, что контракт краудсейла должен иметь право собственности на контракт токена. Это правильно?

  2. Если право собственности должно быть передано, как это сделать при развертывании самого себя?

Как передать право собственности на токен-контракт

2_deploy_ico.js

return deployer
.then(() => { 
return deployer.deploy(SampleCrowdsaleToken, "Sample Crowdsale Token","SCT",18);
})
.then(() => { 
console.log("Token Address : ",SampleCrowdsaleToken.address) ;
return deployer.deploy(SampleCrowdsale,openingTime,closingTime,rate,wallet,cap,SampleCrowdsaleToken.address,goal);
}).then(() => { 
console.log("Sale Address : ",SampleCrowdsale.address) ;
// TODO: transfer ownerhship of the token to the crowdsale for minting
// Currently doing that in the UI
SampleCrowdsaleToken.transferOwnership(SampleCrowdsale.address);
console.log("!!! Success !!!") ;

});

Ответы (1)

Должен ли контракт Crowdsale владеть контрактом токена?

Не обязательно . Не требуется, чтобы контракт Crowdsale фактически владел контрактом Token. Вы можете просто отчеканить/перевести токены на контракт Crowdsale, который затем будет нести ответственность за продажу токенов.

Стандартную методологию реализации и развертывания Crowdsale можно найти здесь: https://www.ethereum.org/crowdsale . Это очень хорошая отправная точка для изучения основ архитектуры контрактов ICO.

В любом случае, как вы можете передать право собственности на контракт?

Вероятно, вы вызываете правильный метод в сценарии развертывания. Однако вы не вызываете его для конкретного экземпляра контракта, который вы развернули. Вам нужно использовать что-то вроде

.then((deployedInstance) => deployedInstance.transferOwnership(...));

Сразу после deployer.deploy(...)вызова для вызова развернутого экземпляра. Надеюсь это поможет.

Томас, как создать deployedInstance
На самом деле вы уже создали его ;) это аргумент, который передается в then() после вызова deployer.deploy. Поэтому вам просто нужно поместить слово deployedInstance в пустые скобки третьего оператора then().
в 3-м мы получим возврат от 2-го, тогда верно? Мне нужны оба экземпляра в 3-м тогда
в 3-м мы получим возврат от 2-го, тогда верно? Мне нужны оба экземпляра в 3-м тогда
Да, точно. Если вы хотите сохранить экземпляры в блоках then, лучший способ, вероятно, состоит в том, чтобы объявить переменные let поверх скрипта, а затем назначить развернутые экземпляры этим переменным по ходу дела. Таким образом, вы по-прежнему получаете доступ к экземплярам во всех блоках вашего кода.