wagmi 2.X(三)

365 阅读1分钟

之前的内容我们完成了与钱包的链接,接下来需要的就是如何把一些功能写入合约。

这里我们实现一个简单的写入合约功能的操作--支付。

首先列出交易前期准备的数据:

合约地址、abi、gas、交易的金额、当前账户是否足够支付、模拟合同判断当前写入合约的功能是否可行

合约地址、abi

合约地址和abi不用多讲,这个根据自己的需求来。

gas

gas费有两种选择,一种是直接使用core中的方法一种是使用getPublicClient间接获取,core很简单直接使用 getGasPrice(config) 完事。

我选择的是使用abi中的方法:

const provider = getPublicClient(config)const gasPrice = await provider.getGasPrice();

交易的金额、当前账户是否足够支付

交易金额很好理解自行定义,是否足够支付则是需要获取账户余额(getBalance是core方法):

const balance = await getBalance(config, {        address: account.address});

最后就是模拟、写入合同了,这个只要配好参数即可,总的代码如下:

async (amount) => {    // 交易金额    const payAmount = Web3.utils.toWei(Web3.utils.toBN(amount).toString(), "ether");    // 实例化    const client = await getWalletClient(config)    // 获取用户信息    const account = client.account;    // 获取账户余额    const balance = await getBalance(config, {        address: account.address    });    // 交易金额    const tokenAmount = amount;    // 获取gas    const provider = getPublicClient(config)    const gasPrice = await provider.getGasPrice();    // 当前abi实例    let contract = await getContract();    if (balance.formatted < tokenAmount) {        return -1;    } else {        try {            // 先模拟合同写入            const { request } = await simulateContract(config, {                address: contract.address,                abi: abi,                functionName: 'swapDIM',                args: [payAmount],
                //因为是升级0.x版本的,所以是在0.x基础上进行升级的                // 最新版本取消了overridesoverrides中的内容直接使用                // overrides: {                from: account.address,                value: Web3.utils.toHex(payAmount),                gasLimit: 500000,                gasPrice: gasPrice                // }            })            // 成功了就直接写入合同,2.x直接返回交易hash            const hash = await writeContract(config, request)            return hash        } catch (err) {            return err;        }    }}