Web3js
Mint _msgSender() 在部署契約上
我開始使用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); }
那應該行得通。