【发布时间】:2021-12-19 04:12:53
【问题描述】:
我已经在 Ropsten 测试网上部署了一个 ERC20 代币,有两个版本。
V1 是一个简单的未经代理的 ERC20 代币,如下所示:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MyToken is ERC20, Ownable {
constructor() ERC20("MyToken", "MTK") {}
function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}
}
我可以使用 web3 与这个合约交互:
const Web3 = require('web3');
const MyToken = require('./build/contracts/MyToken.json');
const HDWalletProvider = require('@truffle/hdwallet-provider');
const provider = new HDWalletProvider(process.env.ACCOUNT_SECRET, process.env.INFURA_URL);
const web3 = new Web3(provider);
const contract = new web3.eth.Contract(MyToken.abi, process.env.CONTRACT_ADDRESS);
例如,这是一个检索合约所有者的调用:
await contract.methods.owner().call();
另一方面,V2 是一个 UUPS 可升级合约,如下所示:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
contract MyToken is Initializable, ERC20Upgradeable, OwnableUpgradeable, UUPSUpgradeable {
/// @custom:oz-upgrades-unsafe-allow constructor
constructor() initializer {}
function initialize() initializer public {
__ERC20_init("MyToken", "MTK");
__Ownable_init();
__UUPSUpgradeable_init();
}
function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}
function _authorizeUpgrade(address newImplementation)
internal
onlyOwner
override
{}
}
为了使用相同的 web3 nodejs 代码与 V2 交互,我尝试将 build/abi 以及 process.env.CONTRACT_ADDRESS 从 V1 的地址更新到 V2 的地址。但是,每当我使用相同的代码检索所有者时,它总是返回零地址。
我认为呼叫应该被代理或其他什么,但我不知道如何并且我找不到关于此的资源(文档/教程)。不胜感激。
编辑:
更多信息
-
合约 V1 和 V2 是从 wizard.openzeppelin.com 生成的。没有任何修改。
-
V2 通过了获取所有者、符号和名称松露测试。
【问题讨论】:
标签: solidity smartcontracts web3 erc20