Hardhat编写、编译、部署、测试Solidity ERC20合约 - 进阶篇 - sepolia测试网
- [1. 环境配置和合约代码](#1. 环境配置和合约代码)
- [2. 编写调试代码](#2. 编写调试代码)
- [3. 合约部署到Solidity](#3. 合约部署到Solidity)
- [4. 在线查看信息](#4. 在线查看信息)
系列文章
1. Remix编写、编译、部署、测试Solidity ERC20合约 - 基础篇
2. Remix编写、编译、部署、测试Solidity ERC20合约 - 进阶篇
3. Metamask导入代币,转账ETH,转账代币
4. Hardhat编写、编译、部署、测试Solidity ERC20合约 - 基础篇
5. Hardhat编写、编译、部署、测试Solidity ERC20合约 - 进阶篇 - web3.js调用合约方法
6. Hardhat编写、编译、部署、测试Solidity ERC20合约 - 进阶篇 - web3.js调用区块链方法
7. Hardhat编写、编译、部署、测试Solidity ERC20合约 - 进阶篇 - JSON-RPC调用合约方法
8. Hardhat编写、编译、部署、测试Solidity ERC20合约 - 进阶篇 - JSON-RPC调用区块链方法
9. Hardhat编写、编译、部署、测试Solidity ERC20合约 - 总结
1. 环境配置和合约代码
参考文章12. Hardhat编写、编译、部署、测试Solidity ERC20合约 - 进阶篇 - Metamask导入代币,转账ETH,转账代币
2. 编写调试代码
交易需要私钥签名(部署合约、写操作)
hardhat node中自动生成了10个账号,每个账号有公钥和私钥,所以框架能够获取私钥。sepolia是公网测试节点,不会有账户对应的私钥,所以需要输入私钥。
clike
// 添加账户到 web3(用于自动签名)
const account = web3.eth.accounts.privateKeyToAccount(privateKey);
web3.eth.accounts.wallet.add(account);
web3.eth.defaultAccount = account.address;
整体代码
clike
const { ethers } = require("hardhat");
const { default: Web3 } = require('web3');
const fs = require('fs');
const path = require('path');
// Metamask 账户地址1
var fromAddress = '0xc312c07abEb8246510412a7ce87A295E0ceC5D48'
// Metamask 账户地址2
var toAddress = '0xE78Ff27498c9a6Fd8BC3ff8170Ecf9a13ECBE49e'
// 部署到sepolia网络的合约地址
var contractAddress = '0x451Dc02Cee616361815253C858Df0a3028c42901'
var privateKey = '你自己的私钥';
var valueMTK = 10 * 10**18; // 10 MTK
var valueETH = 1 * 10**15; // 10 Gwei
var url = 'https://ethereum-sepolia-rpc.publicnode.com';
// 部署合约
async function deploy() {
// 获取合约工厂(这里期望存在名为 Token 的合约,位于 contracts/ 下)
// 注意:合约名需与 solidity 文件中合约名一致。
const myContract = await ethers.getContractFactory("MyToken");
const token = await myContract.deploy();
// 等待链上确认
await token.waitForDeployment();
contractAddress = await token.getAddress();
console.log("实际合约地址:", contractAddress);
return contractAddress;
}
// web3js给合约账户转账ETH和MTK
async function web3js_contract_transaction(fromAddress, toAddress) {
const {web3, contract} = await initWeb3();
await readBalance("发送前", fromAddress, toAddress, web3, contract);
// 调用合约中的transferETH_MTK方法,给toAddress转10个MTK和10个ETH
var receipt = await contract.methods.transferETH_MTK(toAddress, valueMTK).send({from: fromAddress, gas: 3000000, value: valueETH});
await readBalance("发送后", fromAddress, toAddress, web3, contract);
}
async function readBalance(prefix, fromAddress, toAddress, web3=null, contract=null) {
if(web3!=null) {
// 查询发送者余额ETH
var balance = await web3.eth.getBalance(fromAddress);
console.log(prefix + "fromAddress ETH:", web3.utils.fromWei(balance, 'ether'));
// 查询接收者余额ETH
var balance = await web3.eth.getBalance(toAddress);
console.log(prefix + "toAddress ETH:", web3.utils.fromWei(balance, 'ether'));
}
if(contract!=null) {
// 查询发送者余额MTK
var balance = await contract.methods.balanceOf(fromAddress).call();
console.log(prefix + "fromAddress MTK:", balance / BigInt(10**18));
// 查询接收者余额MTK
var balance = await contract.methods.balanceOf(toAddress).call();
console.log(prefix + "toAddress MTK:", balance / BigInt(10**18));
}
}
async function initWeb3() {
// 读取编译生成的合约 ABI 文件
const artifact = JSON.parse(fs.readFileSync(path.join(__dirname, '../../artifacts/contracts/MyToken.sol/MyToken.json'), 'utf8'));
const abi = artifact.abi;
// 连接本地区块链节点
const web3 = new Web3(url);
// 添加账户到 web3(用于自动签名)
const account = web3.eth.accounts.privateKeyToAccount(privateKey);
web3.eth.accounts.wallet.add(account);
web3.eth.defaultAccount = account.address;
// web3.js 合约实例
const contract = new web3.eth.Contract(abi, contractAddress);
return {web3, contract};
}
async function main() {
// var contractAddress = await deploy();
console.log("web3js 调用合约方法:");
web3js_contract_transaction(fromAddress, toAddress);
}
main().then();
3. 合约部署到Solidity
hardhat配置文件
clike
require("@nomicfoundation/hardhat-toolbox");
/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
solidity: "0.8.28",
networks: {
hardhat: {
},
localhost: {
url: "http://localhost:8545"
},
sepolia: {
url: "https://ethereum-sepolia-rpc.publicnode.com",
accounts: ["你自己的私钥"],
chainId: 11155111,
}
}
};
hh run ignition\modules\Mytoken.js --network sepolia

4. 在线查看信息

打印输出的信息和Matemask中信息一致

