如何在Next.js项目中使用ABI调用ZKSwap的DepositETH方法
问题原因
- 直接报错是因为ethers不存在
utils.parse方法,该方法是你记错了API:- 如果你用的是ethers v5版本,将ETH金额字符串转换为wei单位的方法是
utils.parseEther() - 如果你用的是ethers v6版本,相关方法已经从utils模块迁移到ethers根导出,直接调用
parseEther()即可
- 如果你用的是ethers v5版本,将ETH金额字符串转换为wei单位的方法是
- ABI配置方式非常简单,你已经正确导入了本地的ABI JSON文件,只要该文件内容是官方提供的完整ZKSwap合约ABI数组,直接传给
Contract构造函数的第二个参数即可正常调用合约方法,不需要额外处理。 - 代码还有其他潜在问题:
- 不要在前端代码硬编码钱包私钥,Next.js前端页面的代码会完全暴露给访问用户,私钥会直接泄露,资产有被盗风险,正确做法是调用用户浏览器插件钱包(如MetaMask)的provider获取签名者
- 不要在组件根作用域直接调用
depositETH方法,组件每次渲染都会触发执行,会重复发起交易 - 按钮点击触发
depositETH时没有传入amount参数,会导致数值转换失败
修正后的示例代码(ethers v5版本)
import { Contract, utils, ethers } from 'ethers' import { useState } from 'react' import zkswapABI from '../src/zkswap.ABI.json' const ZK_CONTRACT_ADDRESS = '0x8ECa806Aecc86CE90Da803b080Ca4E3A9b8097ad' export default function Zkswap() { const [signer, setSigner] = useState(null) const [contract, setContract] = useState(null) // 初始化连接用户钱包 const connectWallet = async () => { if (!window.ethereum) return alert('请先安装MetaMask钱包') const provider = new ethers.providers.Web3Provider(window.ethereum) await provider.send("eth_requestAccounts", []) const userSigner = provider.getSigner() setSigner(userSigner) setContract(new Contract(ZK_CONTRACT_ADDRESS, zkswapABI, userSigner)) } async function depositETH(amount) { if (!contract) return alert('请先连接钱包') const tx = await contract.depositETH(await signer.getAddress(), { value: utils.parseEther(amount) }) const receipt = await tx.wait() console.log('交易成功', receipt) return receipt } return ( <div> <section className="h-screen w-4/5 max-w-5xl mx-auto flex items-center justify-center flex-col"> <h1 className="mb-4 text-green-500 text-3xl">sample</h1> <p className="mb-2 text-center"> ZKSwap </p> <button className="btn-blue mb-2" onClick={connectWallet}> 先连接钱包 </button> <button className="btn-blue" onClick={() => depositETH('0.5')}> 存入0.5 ETH</button> </section> </div> ) }
内容的提问来源于stack exchange,提问作者user16697491
相关产品推荐
相关产品推荐

