Author

Topic: Проблема со смартконтрактом (Read 187 times)

jr. member
Activity: 87
Merit: 1
Не до конца понимаю что нужно делать, у вас не будет случайно примера готово такого решения?)

Готовое решение у меня есть, но мне обычно за него платят)

Но я могу Вам помочь самим доделать начатое, если сможете четко сформулировать свои места недопонимания.
newbie
Activity: 43
Merit: 0
Понял что нужно создать контракт токена, затем создать контракт крауд сейла, не понимаю как заставить контракт крауд сейла продавать токены, задать sale agent в крауд сейле и на него отправить токены?)

Для того что бы работать с токеном из другого контракта, необходимо в новом контракте создать контракт с интерфейсами(или сигнатурами функций) вашего токена и в конструктор контракта интерфейсами положить адрес контракта с токенами.
Пример кода "нового" контракта:

Code:
//контракт с сигнатурами функций, ранее выпущенного СК с токенами
contract Token{
    function transfer(address to, uint256 value) public returns (bool);
}

//новый контракт
contract Crowdsale{
    Token public tokens;
    
    //после вызова этой функции, можно обращаться к методам tokens, как к выпущенному контракту
    function init(address myTokens) external {
        tokens = Token(myTokens);
    }
    
    //продает токены с вашего смарт-контракта
    function anotherTransfer(address to, uint256 value) external {
        tokens.transfer(to, value);
    }
    
    // и т.д.
}


Не до конца понимаю что нужно делать, у вас не будет случайно примера готово такого решения?)
jr. member
Activity: 87
Merit: 1
Понял что нужно создать контракт токена, затем создать контракт крауд сейла, не понимаю как заставить контракт крауд сейла продавать токены, задать sale agent в крауд сейле и на него отправить токены?)

Для того что бы работать с токеном из другого контракта, необходимо в новом контракте создать контракт с интерфейсами(или сигнатурами функций) вашего токена и в конструктор контракта интерфейсами положить адрес контракта с токенами.
Пример кода "нового" контракта:

Code:
//контракт с сигнатурами функций, ранее выпущенного СК с токенами
contract Token{
    function transfer(address to, uint256 value) public returns (bool);
}

//новый контракт
contract Crowdsale{
    Token public tokens;
    
    //после вызова этой функции, можно обращаться к методам tokens, как к выпущенному контракту
    function init(address myTokens) external {
        tokens = Token(myTokens);
    }
    
    //продает токены с вашего смарт-контракта
    function anotherTransfer(address to, uint256 value) external {
        tokens.transfer(to, value);
    }
    
    // и т.д.
}
newbie
Activity: 43
Merit: 0

В целом создавать экземпляры контракта в внутри контракта это нормально, т.к. это по сути аналог классов в ооп. В данном случае, рекомендовал бы разнести на два физических. (первый контракт - эмитирует токены, потом создается второй контракт, который "общается" с ним по адресу, через интерфейс).
Но я могу ошибаться, т.к. замысел контракта до конца не понимаю, хотя понятно что это про краудсейл)

Код сложно читать, потому что он не соответствует стандартам "чистого кода", а именно название функций не соответствуют тому, что они делают.

немножко не понимаю как разнести их на 2 физических, типо импортом вызывать?) И что это даст подскажи пожалуйста)

Нет, в плане по отдельности задеплоить, как два разных контракта.

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

Зачем? - соблюдение принципа "разделение ответственности" и к примеру, ситуации, когда токен нужен уже сегодня, а даты проведения ico, ещё не уточнены.


Понял что нужно создать контракт токена, затем создать контракт крауд сейла, не понимаю как заставить контракт крауд сейла продавать токены, задать sale agent в крауд сейле и на него отправить токены?)
jr. member
Activity: 87
Merit: 1

В целом создавать экземпляры контракта в внутри контракта это нормально, т.к. это по сути аналог классов в ооп. В данном случае, рекомендовал бы разнести на два физических. (первый контракт - эмитирует токены, потом создается второй контракт, который "общается" с ним по адресу, через интерфейс).
Но я могу ошибаться, т.к. замысел контракта до конца не понимаю, хотя понятно что это про краудсейл)

Код сложно читать, потому что он не соответствует стандартам "чистого кода", а именно название функций не соответствуют тому, что они делают.

немножко не понимаю как разнести их на 2 физических, типо импортом вызывать?) И что это даст подскажи пожалуйста)

Нет, в плане по отдельности задеплоить, как два разных контракта.

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

Зачем? - соблюдение принципа "разделение ответственности" и к примеру, ситуации, когда токен нужен уже сегодня, а даты проведения ico, ещё не уточнены.

newbie
Activity: 43
Merit: 0

В целом создавать экземпляры контракта в внутри контракта это нормально, т.к. это по сути аналог классов в ооп. В данном случае, рекомендовал бы разнести на два физических. (первый контракт - эмитирует токены, потом создается второй контракт, который "общается" с ним по адресу, через интерфейс).
Но я могу ошибаться, т.к. замысел контракта до конца не понимаю, хотя понятно что это про краудсейл)

Код сложно читать, потому что он не соответствует стандартам "чистого кода", а именно название функций не соответствуют тому, что они делают.

немножко не понимаю как разнести их на 2 физических, типо импортом вызывать?) И что это даст подскажи пожалуйста)
jr. member
Activity: 87
Merit: 1

В целом создавать экземпляры контракта в внутри контракта это нормально, т.к. это по сути аналог классов в ооп. В данном случае, рекомендовал бы разнести на два физических. (первый контракт - эмитирует токены, потом создается второй контракт, который "общается" с ним по адресу, через интерфейс).
Но я могу ошибаться, т.к. замысел контракта до конца не понимаю, хотя понятно что это про краудсейл)

Код сложно читать, потому что он не соответствует стандартам "чистого кода", а именно название функций не соответствуют тому, что они делают.
newbie
Activity: 43
Merit: 0

Спасибо, я учту эти моменты. Есть еще один вариант , он стабилен и работает как надо и ремикс не ругается даже ,все зеленое. Cheesy Но он создает смарт контракт внутри смартконтракта! Насколько это плохо/хорошо?

Надо бы код увидеть)

https://gist.github.com/Sexstasy/9dff7ed727e149569fe28677fc050dea

https://rinkeby.etherscan.io/address/0x00a1ffa2b3d00c5888fd6c04bccf3bfca9beaeab#code задеплоин и верифицирован
jr. member
Activity: 87
Merit: 1

Спасибо, я учту эти моменты. Есть еще один вариант , он стабилен и работает как надо и ремикс не ругается даже ,все зеленое. Cheesy Но он создает смарт контракт внутри смартконтракта! Насколько это плохо/хорошо?

Надо бы код увидеть)
newbie
Activity: 43
Merit: 0
Что-то у вас всё в перемешку, не смотря на наследования от OpenZeppelin.

Не погружаясь в код, могу порекомендовать:
  • Как минимум стоит разнести эмиссию токена и краудйсел на два разных (физически) контракта.
  • Ownable - в Crowdsale используется как модификатор, хотя таковым не является. Есть модификатор onlyOwner
  • Эмиссия чего происходит в конструкторе crowdsale? O_o

А токены не переводятся, потому что они привязаны к маппингу не из crowdsale)))
(в transfer обращение к balances[], а в crowdsale переопределяется balanceOf[]; Токены которые дошли до адресата - это к owner'у?)

Рекомендую заказать смарт-контракт у специалистов или хотя бы консультацию.

P.s.  Судя по истории на ethercsan - тренироваться лучше на тестовой сети, типа Rinkeby, Ropsten или с помощью testRPC. + пользоваться IDE для СК (к примеру Remix, или Atom).

Спасибо, я учту эти моменты. Есть еще один вариант , он стабилен и работает как надо и ремикс не ругается даже ,все зеленое. Cheesy Но он создает смарт контракт внутри смартконтракта! Насколько это плохо/хорошо?
jr. member
Activity: 87
Merit: 1
Что-то у вас всё в перемешку, не смотря на наследования от OpenZeppelin.

Не погружаясь в код, могу порекомендовать:
  • Как минимум стоит разнести эмиссию токена и краудйсел на два разных (физически) контракта.
  • Ownable - в Crowdsale используется как модификатор, хотя таковым не является. Есть модификатор onlyOwner
  • Эмиссия чего происходит в конструкторе crowdsale? O_o

А токены не переводятся, потому что они привязаны к маппингу не из crowdsale)))
(в transfer обращение к balances[], а в crowdsale переопределяется balanceOf[]; Токены которые дошли до адресата - это к owner'у?)

Рекомендую заказать смарт-контракт у специалистов или хотя бы консультацию.

P.s.  Судя по истории на ethercsan - тренироваться лучше на тестовой сети, типа Rinkeby, Ropsten или с помощью testRPC. + пользоваться IDE для СК (к примеру Remix, или Atom).
newbie
Activity: 43
Merit: 0
И да, токены доходят до адресата Cheesy
newbie
Activity: 43
Merit: 0
Ссылка на смартконтракт https://gist.github.com/Sexstasy/8e24da988c9fac98b19db0fe2edd3f9c
краудсейл запускается и работает адекватно, НО при попытке отправки купленных токенов на эфирскане выдает ошибку

https://etherscan.io/tx/0xd7ff1ef85b449b68e4363f9f912454fb1bf8a8b492ec4945e4f8585780baa4d4

Просто не осталось мыслей совсем, прошу помогитеWink
Jump to: