Контракт не будет развернут (Truffle, React + Redux Box)

Я пытаюсь разработать смарт-контракт, который позволит выполнять действия с несколькими подписями.

Так что если я, например, хочу добавить администратора в AdminStorage, мне потребуется согласие нескольких администраторов. Это точно так же, как подтверждение транзакции кошелька Multisig, но с внешним вызовом метода контракта.

Итак, у меня есть контракт AdminStorage (в Contracts/storage/AdminStorage.sol). Это всего лишь простое хранилище адресов — ничего особенного.

Но вдобавок ко всему у меня есть Multisin (в контрактах/multisig) и MultisigAddAdmin (который расширяет Multisig). Цель этого состоит в том, чтобы добавить все эти мультиподписные свойства к добавлению администратора.

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

Дело в том, что MultisigAddAdmin просто не будет развертываться. Никаких ошибок (типа "Проверьте свой лимит газа" при попытке деплоить и абстрагировать контракт) - ничего. Truffle отлично выполняет миграцию и даже печатает развернутый адрес, но затем я перехожу к консоли Truffle, и MultisigAddAdmin.isDeployed() имеет значение false. И я также не могу получить доступ к развернутому экземпляру из web3.js (в приложении React).

Действия по воспроизведению:

(Вам понадобится NodeJS 7, ПОСЛЕДНИЙ Truffle и testrpc)

  1. Клон https://github.com/IsThisThePayneResidence/personal-solidity-contracts
  2. npm install
  3. truffle compile --all
  4. запустите testrpc (для установки просто введите npm install ethereumjs-testrpc)
  5. truffle deploy
  6. truffle console
  7. (в консоли трюфеля)MultisigAddAdmin.isDeployed()

Пожалуйста помоги!

Ответы (1)

В случае, если кто-то еще испытывает ту же проблему:

Проблема сохранялась при переносе контрактов. Конкретно в 2_deploy_contracts.js.

«Реальный способ» развертывания зависимых контактов, который я всегда вижу в предложениях, не сработал для меня.

Так

deployer.deploy(
    AdminStorage,
    [
      "0x82283F163eddAa01ca22d080873baE2D1681A94f",
      "0x228B4B687be1103b0985c316C6e7CBA93B4CDaBd",
      "0xC73256378982fF9e8aF364fD1b0B8Fbf2786DD45",
      "0xaD392E402Dd3A0c8b7468e3dac063e777d0963Ee"
    ]
  ).then(() => {
    deployer.link(AdminStorage, MultisigAddAdmin);
    console.log(`AdminStorage.address: ${AdminStorage.address}`);
    deployer.deploy(MultisigAddAdmin).then(() => {
      console.log(`MultisigAddAdmin.address: ${MultisigAddAdmin.address}`);
    });
  });

По-видимому, это не тот способ, которым я должен делать инъекцию адреса контракта. Перемещение внедрения в отдельный метод, перемещение развертывания MultisigAddAdmin из обработчика промисов и вызов метода установки в реальном коде решили проблему.

Надеюсь, это поможет кому-то не тратить 4 дня на попытки понять это.