Как развернуть контракт с помощью метамаски и обратного вызова?

Я пытаюсь развернуть новый контракт с метамаской (в моем внешнем приложении javascript). Проблема в том, что, когда квитанция возвращается, адрес «не определен», так как, я полагаю, транзакция еще не заминирована, и поэтому адрес еще не существует. Результат развертывания:

Contract {_eth: Eth, transactionHash: 
"0x9e3866f52f274874d96bf60932c03d9849ccdb2cef97c010d6b84c5b529768de", 
 address: undefined, abi: Array(22)}
 abi:(22) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
 address: undefined
 transactionHash :"0x9e3866f52f274874d96bf60932c03d9849ccdb2cef97c010d6b84c5b529768de"
 _eth: Eth {_requestManager: RequestManager, getBalance: ƒ, getStorageAt: ƒ, getCode: ƒ, getBlock: ƒ, …}
 __proto__:Object

Более того, если я попытаюсь получить доступ к miningсостоянию на _eth > miningвыходе:

[Exception: Error: The MetaMask Web3 object does not support synchronous methods like eth_mining without a callback parameter. See https://github.com/MetaMask/faq/blob/master/DEVELOPERS.md#dizzy-all-async

Код Javascript:

deployContent = (name, author, genre, cost) => {
  return new Promise((succ, rej) => {
   this.web3.eth.contract(Content.abi).new(name, author, genre, cost, {gas: 400000}, 
    (err, res) => {if(!err)succ(res); else rej(err);});
  })
}

deployAndPublish = async (name, author, genre, cost) => {
    let contRes = await this.deployContent(name, author, genre, cost);
    console.log(contRes);
    console.log(contRes.address);
    // I need the address here in order to push it into an array
}

Есть идеи, как дождаться адреса?

Ответы (1)

вы всегда можете использовать прослушиватель событий для этого. вот правильный пример: https://medium.com/@marcusmolchany/the-easisest-way-to-deploy-smart-contracts-on-ethereum-65f69ac9a627

Вы также можете использовать Remix для развертывания вашего контракта.
Проблема в том, что параметры конструктора считываются из UI
Более того, я не могу смотреть мероприятие, если не знаю адреса...
о, я понимаю, что вы имеете в виду. Вы можете получить хэш транзакции и адрес контракта после развертывания с помощью функций web3js.
Да, я получаю квитанцию ​​о транзакции, но адрес не определен (еще не добыт)
web3js.readthedocs.io/en/1.0/web3-eth-contract.html#deploy , а вот еще один пример взаимодействия и того, как это делается. скажите, пожалуйста, какой фреймворк вы используете, и если вы разрабатываете API с помощью node и web3, то вы можете использовать solcjs для компиляции и развертывания!
Я разрабатываю интерфейс с реакцией, который работает в браузере с использованием инъекции метамаски. Версия web3 0.20
У меня были похожие проблемы, когда я начинал несколько месяцев назад, и документы web3js очень полезны, но я настоятельно рекомендую вам проверить другие проекты на GitHub, чтобы найти ноу-хау ответы. Пожалуйста, проверьте эту ссылку ответа