Web3js

Mint _msgSender() 在部署契約上

  • August 1, 2022

我開始使用solidity,我正在使用具有以下功能的web3部署我的智能合約:

   deployContract(args) {
   var web3 = <MY-WEB3-PROVIDER>;
   var privateKey = <MY-PRIVATE-KEY>;

   return new Promise(function (resolve, reject) {

       const file = fs.readFileSync('./contracts/Dummy.json').toString();
       var output = JSON.parse(file);
       var ABI = output.abi;
       var bytecode = output.bytecode;
       
       const contract = new web3.eth.Contract(ABI);

       var deployData = contract
       .deploy({
           data: bytecode,
           arguments: args
       })
       .encodeABI();

       var txData = {
           data: deployData
       }

       var estimatedGas = contract
       .deploy({
           data: bytecode,
           arguments: args
       })
       .estimateGas()
       .then(function(gas) {
           txData.gas = web3.utils.toHex(3000000);
           web3.eth.accounts.signTransaction(txData, privateKey)
           .then((signed) => {
               web3.eth.sendSignedTransaction(signed.rawTransaction)
               .on("receipt", (receipt) => {
                   resolve(receipt.contractAddress);
               })
           });
       })

   });
}

到目前為止,它執行良好,直到我嘗試部署一個 ERC20 代幣合約,該合約應該為消息發送者提供代幣的初始供應,由於某種原因,它將零地址視為消息發送者,因此交易失敗。

這是契約:

//SPDX-License-Identifier: MIT
pragma solidity >=0.6.2;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract GoldToken is ERC20, Ownable, Whitelist {
 string public TOKEN_NAME = "Gold Token";
 string public TOKEN_SYMBOL = "GLD";

 uint256 private constant TOTAL_SUPPLY = 50000;

 constructor()ERC20(TOKEN_NAME, TOKEN_SYMBOL) {
   _mint(_msgSender(), TOTAL_SUPPLY);
 }

 function mint(address to, uint256 amount) public onlyOwner {
   _mint(to, amount);
 }
}

有趣的是,該合約的部署在 Remix 上完美執行(使用 Remix VM 或使用 Injected Provider 來使用 Metamask 並將合約部署到我從 nodejs 使用的同一個測試網),這讓我覺得我錯過了關於部署過程的一些東西

我在這裡幾乎沒有想法,如果有人能給我一個可能導致此問題或解決方法的想法,我將不勝感激。提前謝謝各位!

是的,代幣在技術上是憑空創造的。在主網上,它被視為來自零地址。

在這種情況下,您需要做的是向建構子添加一個輸入參數,例如:

constructor()ERC20(TOKEN_NAME, TOKEN_SYMBOL, address payable _initialPayWallet) {
   _mint(_initialPayWallet, TOTAL_SUPPLY);
 }

那應該行得通。

引用自:https://ethereum.stackexchange.com/questions/132799