13. Hardhat编写、编译、部署、测试Solidity ERC20合约 - 进阶篇 - sepolia测试网

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. 在线查看信息

sepolia网址

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

相关推荐
小明的小名叫小明2 小时前
Aave协议(2)
架构·区块链·defi
Wnq100722 小时前
去中心化的 CORBA 架构
架构·去中心化·区块链
怪只怪满眼尽是人间烟火2 小时前
部署区块链FISCO BCOS 3.11.0的可视化webase-front
区块链
草原猫3 小时前
DAPP是什么?一文读懂DAPP应用与DAPP开发
区块链·dapp开发
MicroTech20255 小时前
微算法科技(NASDAQ :MLGO)轻量级量子区块链框架:突破扩展性瓶颈的技术革新
科技·区块链
CryptoRzz1 天前
StockTV API 对接全攻略(股票、期货、IPO)
java·javascript·git·web3·区块链·github
hopsky1 天前
以太坊区块链-基础概念
区块链
DICOM医学影像1 天前
6. Hardhat编写、编译、部署、测试Solidity ERC20合约 - 进阶篇 - web3.js调用区块链方法
区块链·智能合约·solidity·以太坊·web3.0·web3.js·hardhat
Sui_Network1 天前
智能体支付时代:Sui 为 AI 构建可验证的金融基础设施
大数据·人工智能·游戏·金融·rpc·区块链·量子计算