16. web3.js结合Metemask调用合约方法

测试Solidity ERC20合约 - web3.js结合Metemask调用合约方法

  • [1. 环境配置和合约代码](#1. 环境配置和合约代码)
  • [2. 编写调试代码](#2. 编写调试代码)
  • [3. 测试](#3. 测试)
    • [3.1 MetaMask连接hardhat node](#3.1 MetaMask连接hardhat node)
    • [3.2 MetaMask连接sepolia](#3.2 MetaMask连接sepolia)

系列文章

web3.0-以太坊编程基础

1. Remix编写、编译、部署、测试Solidity ERC20合约 - 基础篇
2. Remix编写、编译、部署、测试Solidity ERC20合约 - 进阶篇
3. Hardhat编写、编译、部署、测试Solidity ERC20合约 - 基础篇
4. web3.js调用合约方法
5. web3.js调用区块链方法
6. web3.js给合约账户同时转以太币和代币
7. JSON-RPC调用合约方法
8. JSON-RPC调用区块链方法
9. JSON-RPC给合约账户同时转以太币和代币
10. sepolia测试网
11. Hardhat编写、编译、部署、测试Solidity ERC20合约 - 总结
12. Go-Ethereum调用区块链方法
13. Go-Ethereum调用合约方法
14. Metamask导入代币,转账ETH,转账代币 - 界面操作
15. Metamask导入代币,转账ETH,转账代币 - 界面显示
16. web3.js结合Metemask调用合约方法

1. 环境配置和合约代码

参考文章12. Hardhat编写、编译、部署、测试Solidity ERC20合约 - 进阶篇 - Metamask导入代币,转账ETH,转账代币

2. 编写调试代码

可连接hardhat node本地网络和sepolia测试网络

vscode创建React项目

clike 复制代码
npx create-react-app metamask

安装web3.js

clike 复制代码
npm install web3

导入合约编译后的abi.json

js代码

clike 复制代码
import ABI from './abi.json';
import Web3 from 'web3';
import { useState } from 'react';

function App() {

    const [account1, setAccount1] = useState('');
    const [web3, setWeb3] = useState(null);
    const [contract, setContract] = useState(null);
    const [balance1_before, setBalance1_before] = useState(0);
    const [balance2_before, setBalance2_before] = useState(0);
    const [balance1_after, setBalance1_after] = useState(0);
    const [balance2_after, setBalance2_after] = useState(0);

    const [name, setName] = useState(0);

    const hardhat_contractAddress = "0x5FbDB2315678afecb367f032d93F642f64180aa3";
    const sepolia_contractAddress = '0x451Dc02Cee616361815253C858Df0a3028c42901';
    const contractAddress = sepolia_contractAddress;
    const account2 = "0xE78Ff27498c9a6Fd8BC3ff8170Ecf9a13ECBE49e";
    const valueMTK = 100 * 10**18;
    
    const loadAccount = async () => {
        
        // metamask是否已安装
        if (!window.ethereum)
            alert("Please install MetaMask to use this dApp!");

        // metamsk中的账户
        const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });
        setAccount1(accounts[0]);

        // 连接metamask
        const web3 = new Web3(window.ethereum);
        setWeb3(web3);

        // 实例化合约
        const contract = await new web3.eth.Contract(ABI, contractAddress);
        setContract(contract);

    }

    const Name = async () => {
        setName(await contract.methods.name().call());
    }

    const Balance_Before = async () => {
        setBalance1_before(await contract.methods.balanceOf(account1).call());
        setBalance2_before(await contract.methods.balanceOf(account2).call());
    }

    const Balance_After = async () => {
        setBalance1_after(await contract.methods.balanceOf(account1).call());
        setBalance2_after(await contract.methods.balanceOf(account2).call());
    }
    

    const Transfer = async () => {
        await contract.methods.transfer(account2, valueMTK).send({ from: account1 });
    }

    return (
        <div>
            <h1>Your Ethereum Account</h1>
            <button onClick={loadAccount}>Load Account</button>
            <p>{account1}</p>
            <p>{account2}</p>
            <button onClick={Name}>Name</button>
            <p>token: {name}</p>
            <button onClick={Balance_Before}>Balance</button>
            <p>balance: {balance1_before}</p>
            <p>balance: {balance2_before}</p>
            <button onClick={Transfer}>Transfer</button>
            <p></p>
            <button onClick={Balance_After}>Balance</button>
            <p>balance: {balance1_after}</p>
            <p>balance: {balance2_after}</p>
        </div>
    );
}


export default App;

3. 测试

3.1 MetaMask连接hardhat node

clike 复制代码
const contractAddress = hardhat_contractAddress;


可以看到Account1账户在合约中的余额是0

3.2 MetaMask连接sepolia

clike 复制代码
const contractAddress = sepolia_contractAddress;


点击Transfer,Metamask确认

转账100MTK.

可以看到Account1账户在合约中的余额是681,Account2是289

系列文章

web3.0-以太坊编程基础

1. Remix编写、编译、部署、测试Solidity ERC20合约 - 基础篇
2. Remix编写、编译、部署、测试Solidity ERC20合约 - 进阶篇
3. Hardhat编写、编译、部署、测试Solidity ERC20合约 - 基础篇
4. web3.js调用合约方法
5. web3.js调用区块链方法
6. web3.js给合约账户同时转以太币和代币
7. JSON-RPC调用合约方法
8. JSON-RPC调用区块链方法
9. JSON-RPC给合约账户同时转以太币和代币
10. sepolia测试网
11. Hardhat编写、编译、部署、测试Solidity ERC20合约 - 总结
12. Go-Ethereum调用区块链方法
13. Go-Ethereum调用合约方法
14. Metamask导入代币,转账ETH,转账代币 - 界面操作
15. Metamask导入代币,转账ETH,转账代币 - 界面显示
16. web3.js结合Metemask调用合约方法

相关推荐
Tattoo_Welkin1 天前
【RWA 机制,ERC-4626,ERC-3643,ERC-7540,ERC-7575,LayerZero】
区块链
魑魅魍魎11 天前
基于全同态加密的逻辑回归心脏病预测示例详解
区块链·逻辑回归·同态加密
软希网分享源码1 天前
中英双语言量化交易投资源码/跟单搬砖区块链交易所源码/前端uniapp纯源码+后端
前端·uni-app·区块链·中英双语言量化交易投资源码
好多大米2 天前
W2D3-Foundry 测试
区块链·solidity
木西2 天前
深度复刻 Sky Protocol:基于 OpenZeppelin V5 与 Solidity 0.8.24 的工程实践
web3·智能合约·solidity
Bczheng12 天前
四.比特币默克尔树(上)
区块链
OxYGC2 天前
[Web3] 一文读懂区块链中的账本类型
web3·区块链
david_lv2 天前
大A,2026年Q1总结
区块链
筱璦2 天前
期货软件开发 - 策略编辑
前端·区块链·交易·期货
Risk Actuary3 天前
侧挂车(Sidecar)与巨灾债券(Cat Bond)
区块链