{"author":{"address":null,"user":"https://learnblockchain.cn/people/18158"},"content":{"body":"# 前言\r\n\r\n\u003e 本文通过Ethersjs库实现和智能合约的交互全流程流程；\r\n\r\n# 工具\r\n\r\n1.  前端项目引入ethersjs库\r\n2.  给浏览器安装一个钱包插件例如：MetaMask\r\n3.  openzeppelin库编写合约\r\n\r\n# 合约部分\r\n\r\n#### 合约\r\n\r\n    // SPDX-License-Identifier: MIT\r\n    pragma solidity ^0.8.20;\r\n\r\n    import \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\r\n\r\n    contract MyToken1 is ERC20 {\r\n        constructor() ERC20(\"Mock Token\", \"MTK\") {\r\n            _mint(msg.sender, 1000000 * 10 ** decimals());\r\n        }\r\n    }\r\n    # 编译\r\n    # npx hardhat compile\r\n\r\n#### 部署\r\n\r\n    module.exports = async  ({getNamedAccounts,deployments})=\u003e{\r\n        const getNamedAccount = (await getNamedAccounts()).firstAccount;\r\n        // const getNamedAccount = (await getNamedAccounts()).secondAccount;\r\n        console.log('getNamedAccount',getNamedAccount)\r\n        const TokenName = \"ETHToken\";\r\n        const TokenSymbol = \"ETH\";\r\n        const {deploy,log} = deployments;\r\n        const TokenC=await deploy(\"MyToken1\",{\r\n            from:getNamedAccount,\r\n            args: [],//参数\r\n            log: true,\r\n        })\r\n        // await hre.run(\"verify:verify\", {\r\n        //     address: TokenC.address,\r\n        //     constructorArguments: [TokenName, TokenSymbol],\r\n        //     });\r\n        console.log('合约地址1',TokenC.address)\r\n    }\r\n    module.exports.tags = [\"all\", \"token1\"];\r\n    # 部署\r\n    # npx hardhat deploy\r\n\r\n#### 测试\r\n\r\n    const {ethers,getNamedAccounts,deployments} = require(\"hardhat\");\r\n    const { assert,expect } = require(\"chai\");\r\n    describe(\"token\", function() {\r\n        let Token1;\r\n        let owner,addr1,addr2;\r\n        beforeEach(async function(){\r\n            await deployments.fixture([\"token1\"]);\r\n            [owner,addr1,addr2]=await ethers.getSigners();\r\n            // firstAccount = (await getNamedAccounts()).firstAccount;\r\n            const Token1Deployment = await deployments.get(\"MyToken1\");\r\n            Token1 = await ethers.getContractAt(\"MyToken1\",Token1Deployment.address);//已经部署的合约交互\r\n        });\r\n        describe(\"测试\",function(){\r\n            it(\"测试\",async function(){\r\n                console.log('名字：',await Token1.name())\r\n                console.log('符号：',await Token1.symbol())\r\n                console.log('decimals：',await Token1.decimals())\r\n                console.log('totalSupply：',await Token1.totalSupply())\r\n                console.log(\"owner的额度：\",await Token1.balanceOf(owner.address))\r\n                transfer = await Token1.transfer(addr1.address,100)\r\n                console.log('转账余额：',await Token1.balanceOf(addr1.address))\r\n                console.log('授权：',await Token1.approve(addr1.address,500))\r\n                console.log('授权额度：',await Token1.connect(addr1).transferFrom(owner.address,addr2.address,200))\r\n                console.log('addr2的额度：',await Token1.balanceOf(addr2.address))\r\n                console.log('addr1的额度：',await Token1.balanceOf(addr1.address))\r\n            \r\n            }) \r\n        })\r\n\r\n    })\r\n    # 测试\r\n    # npx hardhat test ./test/xxx.js\r\n\r\n# 前端部分\r\n\r\n#### 把部署的合约生成的abi的json文件导入项目中\r\n\r\n    # 代码\r\n    import { ethers ,JsonRpcProvider,BrowserProvider} from \"ethers\";\r\n    import React,{useEffect, useState} from \"react\";\r\n    import tokenABI from '../json/MyToken1.json';//代币合约json文件获取abi\r\n    const initFn = async () =\u003e {\r\n        const provider = new BrowserProvider(window.ethereum);//浏览器端\r\n        // 读取钱包地址\r\n    const accounts = await provider.send(\"eth_requestAccounts\", []);\r\n    const account = accounts[0]//获取余额\r\n    const balance = await provider.getBalance(account)// 读取chainid\r\n    const { chainId } = await provider.getNetwork()\r\n    // console.log(await provider.getNetwork())\r\n    // console.log(await provider.getBlockNumber())\r\n    // console.log(await provider.getTransactionCount('0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266'))\r\n    // console.log(await provider.getFeeData())\r\n    // console.log(await provider.getBlock(0))\r\n    // console.log(await provider.getCode(\"0xc778417e063141139fce010982780140aa0cd5ab\"))\r\n    const signer =await provider.getSigner();//获取signer\r\n        // console.log('signer',signer)\r\n    let info={\r\n        chainid:chainId.toString(),\r\n        balance:ethers.formatUnits(balance),\r\n        account:account,\r\n        signer:signer\r\n\r\n    }\r\n    return info\r\n\r\n    }\r\n    let {chainid,balance,account,signer}=await initFn()\r\n    let account0='0x5D5Cfb244eD2fEA3138cbA5E6DdC11c8b6D92dD7'//钱包地址0\r\n    let acccout1='0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266'//钱包地址1\r\n    let acccout2=`0x70997970C51812dc3A010C7d01b50e0d17dc79C8`//钱包地址2\r\n    let BalanceValue\r\n    let ContractAddress='0x8A791620dd6260079BF849Dc5567aDC3F2FdC318';//mtk合约地址\r\n    let ContractData=new ethers.Contract(ContractAddress,tokenABI.abi,signer);//合约实例\r\n\r\n\r\n    function  Header() {\r\n        let [chainidv,setChainid]=useState('');//链id\r\n        let [balancev,setBalance]=useState('');//钱包余额\r\n        let [accountv,setAccount]=useState('');//钱包地址\r\n        let [signerv,setSigner]=useState('');//签名\r\n        let [txv,setTxv]=useState('');//实例\r\n\r\n        //代币\r\n        let [name,setName]=useState('');//MTK代币名称\r\n        let [symbol,setSymbol]=useState('');//MTK代币符号\r\n        let [totalSupply,setTotalSupply]=useState('');//MTK代币总供应量\r\n        let [balanceOf,setBalanceOf]=useState('');//MTK代币余额\r\n        let [address1,setAddress1]=useState('');//MTK代币地址1\r\n        let [address2,setAddress2]=useState('');//MTK代币地址2\r\n        //转账方法\r\n    const transfer=async ()=\u003e{\r\n      const provider = new ethers.BrowserProvider(window.ethereum);//浏览器端\r\n      // const provider = new ethers.JsonRpcProvider();//浏览器端\r\n      const value = ethers.parseEther('100'); \r\n      const signer =await provider.getSigner()\r\n      const tx = await signer.sendTransaction({\r\n            to: account0,\r\n            value: value//转换100eth\r\n      })\r\n      console.log(tx)\r\n\r\n      if(tx){\r\n        await tx.wait();\r\n        console.log('转账成功')\r\n       let Balance=await provider.getBalance(account0)\r\n       BalanceValue=ethers.formatUnits(Balance)\r\n       localStorage.setItem('BalanceValue',BalanceValue)\r\n       setTxv(BalanceValue)\r\n\r\n      }else{\r\n        console.log('失败')\r\n      }\r\n      \r\n\r\n    }\r\n    //读取MTK合约信息\r\n    const getContractInfo=async ()=\u003e{\r\n      setName(await ContractData.name())\r\n      setSymbol(await ContractData.symbol())\r\n      let totalSupply=ethers.formatUnits(await ContractData.totalSupply())\r\n      setTotalSupply(totalSupply)\r\n    }\r\n    //转账MYK代币合约\r\n    const mtktransfer=async ()=\u003e{\r\n      console.log('转账',await ContractData.transfer(acccout2,ethers.parseEther('100')))\r\n      let addr1=ethers.formatUnits(await ContractData.balanceOf(acccout1))\r\n      console.log('address',addr1)\r\n      let addr2=ethers.formatUnits(await ContractData.balanceOf(acccout2))\r\n      setAddress1(addr1) \r\n      setAddress2(addr2)\r\n      console.log('address',addr2)\r\n    }\r\n          useEffect(()=\u003e{\r\n            setChainid(chainid)\r\n            setBalance(balance)\r\n            setAccount(account)\r\n            setSigner(signer)\r\n            \r\n          },[accountv])\r\n          useEffect(()=\u003e{\r\n            setTxv(BalanceValue)\r\n            // console.log(BalanceValue)\r\n            // console.log(txv)\r\n          },[txv])\r\n        return (\u003c\u003e\r\n                {\r\n                 window.ethereum===undefined?\u003cdiv style={{color:'red'}}\u003e\r\n                 请按照要求安装metamask\r\n                 \u003c/div\u003e :\u003cdiv style={{padding:'10px'}}\u003e\r\n                    \u003ch4 style={{fontSize:'20px',lineHeight:'40px',fontWeight:'bold'}}\u003e钱包信息\u003c/h4\u003e\r\n                    \u003cp\u003e\u003cstrong\u003echainid\u003c/strong\u003e: {chainidv}\u003c/p\u003e\r\n                    \u003cp\u003e\u003cstrong\u003e钱包余额:\u003c/strong\u003e {balancev} ETH\u003c/p\u003e\r\n                    \u003cp\u003e\u003cstrong\u003e钱包地址:\u003c/strong\u003e {accountv}\u003c/p\u003e\r\n                    \u003cp\u003e\u003cstrong\u003esigneraddress:\u003c/strong\u003e {signerv.address}\u003c/p\u003e\r\n                    \u003cp\u003e\u003cstrong\u003e账号：\u003c/strong\u003e{account0}\u003cbr/\u003e\u003cstrong\u003e转账余额：\u003c/strong\u003e{txv || localStorage.getItem('BalanceValue')}\u003c/p\u003e\r\n                    \u003cbutton onClick={transfer} style={{background:'#065ae6cf',color:'#fff',padding:'10px 20px',borderRadius:'5px',margin:'10px 0'}}\u003e转账按钮\u003c/button\u003e\r\n\r\n                    \u003cdiv\u003e\r\n                      \u003ch1 style={{fontWeight:'bold',fontSize:'20px',margin:\"10px 0\"}}\u003e合约信息面板\u003c/h1\u003e\r\n                      \u003cp\u003e\u003cstrong\u003e代币名：\u003c/strong\u003e{name}\u003c/p\u003e\r\n                      \u003cp\u003e\u003cstrong\u003e代币符号：\u003c/strong\u003e{ symbol}\u003c/p\u003e\r\n                      \u003cp\u003e\u003cstrong\u003e代币总供应量：\u003c/strong\u003e{ totalSupply} MTK\u003c/p\u003e\r\n                      \u003cbutton onClick={getContractInfo} style={{background:'#065ae6cf',color:'#fff',padding:'10px 20px',borderRadius:'5px',margin:'10px 0'}}\u003e读取信息\u003c/button\u003e\r\n                      \u003cp\u003e\u003cstrong\u003eaddress1余额：\u003c/strong\u003e{  address1} MTK\u003c/p\u003e\r\n                      \u003cp\u003e\u003cstrong\u003eaddress2余额：\u003c/strong\u003e{  address2} MTK\u003c/p\u003e\r\n                      \u003cbutton onClick={mtktransfer} style={{background:'#065ae6cf',color:'#fff',padding:'10px 20px',borderRadius:'5px',margin:'10px 0'}}\u003e转账\u003c/button\u003e\r\n                    \u003c/div\u003e\r\n                  \u003c/div\u003e\r\n\r\n                }\r\n                \u003c/\u003e)\r\n    }\r\n    export default Header;\r\n\r\n#### 预览效果\r\n\r\n![屏幕截图 2025-03-03 214102.png](https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/1a47e48c361b45f5b815ca8710633cf9~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5pyo6KW_:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMjQzNjE3MzQ5Njg0NTU0OSJ9\u0026rk3s=f64ab15b\u0026x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018\u0026x-orig-expires=1741756151\u0026x-orig-sign=hCk0vAktniEl9maz0qm4v9PRboY%3D)\r\n\r\n# 钱包设置\r\n\r\n**钱包插件添加自定义网络**\u003cbr/\u003e\r\n\r\n1.  启动本地节点获取账户节点\r\n\r\n\u003c!----\u003e\r\n\r\n    # 会获取到20个账户，每个账户中有10000 ETH\r\n    npx hardhat node//获取节点账号\r\n\r\n如图所示\r\n\r\n![屏幕截图 2025-03-03 174703.png](https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/ea076932f5844ecebbb495d8858ffa86~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5pyo6KW_:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMjQzNjE3MzQ5Njg0NTU0OSJ9\u0026rk3s=f64ab15b\u0026x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018\u0026x-orig-expires=1741756151\u0026x-orig-sign=QXCHP%2F4T3de8SkBbS3uNzfCELYc%3D)\r\n2\\. 添加自定网络 \u003cbr\u003e\r\n**步骤如下**\r\n\r\n![屏幕截图 2025-03-03 175539.png](https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/842ffe3dfb294ffca8811e6deaa8e200~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5pyo6KW_:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMjQzNjE3MzQ5Njg0NTU0OSJ9\u0026rk3s=f64ab15b\u0026x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018\u0026x-orig-expires=1741756151\u0026x-orig-sign=xfPlruKtv0AVdqYDPG%2FZj%2Bwp39Y%3D)\r\n\r\n![屏幕截图 2025-03-03 175234.png](https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/64d58b3ef8254208a92e4e7659606bb2~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5pyo6KW_:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMjQzNjE3MzQ5Njg0NTU0OSJ9\u0026rk3s=f64ab15b\u0026x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018\u0026x-orig-expires=1741756151\u0026x-orig-sign=%2Fnq7hXm6d4NY41p5zU7WV0N5bLQ%3D)\r\n\r\n![屏幕截图 2025-03-03 180118.png](https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/1aaa85d60e7b407ca177844260c29726~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5pyo6KW_:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMjQzNjE3MzQ5Njg0NTU0OSJ9\u0026rk3s=f64ab15b\u0026x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018\u0026x-orig-expires=1741756151\u0026x-orig-sign=DNrtgHFxdKRp0dh7NUQr1YWT5jE%3D)\r\n\r\n#### 自定义网络说明：网络名为:LY URL:127.0.0.1:8545 链ID: 31337 货币符号: ETH\u003cbr\u003e\r\n\r\n#### 把本地账号导入到自定义网络中:\r\n\r\n![屏幕截图 2025-03-03 180844.png](https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/9bd14f359f594466be0e4cdfefe8ea46~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5pyo6KW_:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMjQzNjE3MzQ5Njg0NTU0OSJ9\u0026rk3s=f64ab15b\u0026x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018\u0026x-orig-expires=1741756151\u0026x-orig-sign=5ffwZRaDkEDXD3ZYBgXFLAJ1Fic%3D)\r\n\r\n![屏幕截图 2025-03-03 180944.png](https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/11647c44b23d4fbd87018dd6201df11a~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5pyo6KW_:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMjQzNjE3MzQ5Njg0NTU0OSJ9\u0026rk3s=f64ab15b\u0026x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018\u0026x-orig-expires=1741756151\u0026x-orig-sign=5FFDjnds%2Fkx4GBk5plr3edw4XL4%3D)\r\n\r\n**把本地节点的私有粘贴到输入框中导入成功后可以获取一个含有10000ETH的账号**\r\n![屏幕截图 2025-03-03 181016.png](https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/e09979e1ec424c25bfaccdd5eb44e6b5~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5pyo6KW_:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMjQzNjE3MzQ5Njg0NTU0OSJ9\u0026rk3s=f64ab15b\u0026x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018\u0026x-orig-expires=1741756151\u0026x-orig-sign=JhqS2SZivF4ZrSN4zzgYE79LCh8%3D)\r\n\r\n### 在钱包插件中导入合约\r\n\r\n*   本地部署合约获取合约地址\r\n\r\n\u003c!----\u003e\r\n\r\n    npx hardhat deploy\r\n\r\n![屏幕截图 2025-03-03 192912.png](https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/3c485acd023546a6b321400209ef1ba0~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5pyo6KW_:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMjQzNjE3MzQ5Njg0NTU0OSJ9\u0026rk3s=f64ab15b\u0026x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018\u0026x-orig-expires=1741756151\u0026x-orig-sign=RNQxWXeSArETCiRrC8LnWCuMSYY%3D)\r\n\r\n![屏幕截图 2025-03-03 193017.png](https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/b54dd8655c0441e8807162ae7ee0e4ec~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5pyo6KW_:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMjQzNjE3MzQ5Njg0NTU0OSJ9\u0026rk3s=f64ab15b\u0026x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018\u0026x-orig-expires=1741756151\u0026x-orig-sign=9%2BqeST4DFok%2Bdmk3OFL5Z13Z6IQ%3D)\r\n\r\n![屏幕截图 2025-03-03 193025.png](https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/2d24e48a90a04e5fbee7afa5568b9f72~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5pyo6KW_:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMjQzNjE3MzQ5Njg0NTU0OSJ9\u0026rk3s=f64ab15b\u0026x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018\u0026x-orig-expires=1741756151\u0026x-orig-sign=9uJ0eKudJtf0V%2BZ5iqIos0cdbyM%3D)\r\n\r\n![屏幕截图 2025-03-03 193109.png](https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/404d4c68508a4522854c7a778a8e3ea5~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5pyo6KW_:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMjQzNjE3MzQ5Njg0NTU0OSJ9\u0026rk3s=f64ab15b\u0026x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018\u0026x-orig-expires=1741756151\u0026x-orig-sign=T5dHH2M8KLkrTmoC7sAwa41oQNU%3D)\r\n\r\n# 合约交互\r\n\r\n**说明**：主要通过`ethers中的Contract实现合约的交互`\r\n\r\n```\r\nimport { ethers ,JsonRpcProvider,BrowserProvider} from \"ethers\";\r\nimport tokenABI from '../json/MyToken1.json';//代币合约json文件获取abi\r\nconst provider = new BrowserProvider(window.ethereum);//浏览器端\r\nconst signer =await provider.getSigner();//获取signer 合约可读写\r\nlet ContractAddress='0x8A791620dd6260079BF849Dc5567aDC3F2FdC318';//mtk合约地址\r\nlet ContractData=new ethers.Contract(ContractAddress,tokenABI.abi,signer);//合约实例\r\n//通过合约实例实现合约交互\r\n//例如\r\n\r\nlet name await ContractData.name()//获取代币的name\r\n\r\n```\r\n\r\n#### 点击转账按钮和合约交互\r\n\r\n![点击2025-03-03 214102.png](https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/323b41ed92e945cab8b1d39a63115535~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5pyo6KW_:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMjQzNjE3MzQ5Njg0NTU0OSJ9\u0026rk3s=f64ab15b\u0026x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018\u0026x-orig-expires=1741756151\u0026x-orig-sign=BaRvLzMB1LGn1EcWaOu4Ob%2FQ0BQ%3D)\r\n\r\n#### 调起钱包：账号2向账号3转了100MTK\r\n\r\n![屏幕截图 2025-03-03 214931.png](https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/170f5a422abe47c591846b98fa959e0f~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5pyo6KW_:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMjQzNjE3MzQ5Njg0NTU0OSJ9\u0026rk3s=f64ab15b\u0026x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018\u0026x-orig-expires=1741756151\u0026x-orig-sign=eDoHYLBuCEY6lc6%2FhL6zCTsQrgs%3D)\r\n\r\n#### 点击确定按钮 在钱包插件或界面查看两个账户的余额\r\n\r\n![屏幕截图 2025-03-03 214956.png](https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/d51d0ecb605445c1bd80adb77090d82a~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5pyo6KW_:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMjQzNjE3MzQ5Njg0NTU0OSJ9\u0026rk3s=f64ab15b\u0026x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018\u0026x-orig-expires=1741756151\u0026x-orig-sign=7WSZblLQXuM6h%2Fdw%2Bxk72i5l1uM%3D)\r\n\r\n![转账余额2025-03-03 214102.png](https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/ac9be6e135bd46c78bf2e89c7170e574~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5pyo6KW_:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMjQzNjE3MzQ5Njg0NTU0OSJ9\u0026rk3s=f64ab15b\u0026x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018\u0026x-orig-expires=1741756151\u0026x-orig-sign=k3OPz121OwAHXUbvClylfBiB%2FhI%3D)\r\n\r\n# 总结\r\n\r\n以上就是简单的通过ethers和智能合约的交互全部流程，本地测试需要启动本地节点 npx hardhat node，编译部署合约，获取合约地址和abijson文件，把abi文件导入前端项目用来实现合约的交互；","title":"通过Ethers.js 库进行合约交互"},"history":null,"timestamp":1741151435,"version":1}