之前的内容我们完成了与钱包的链接,接下来需要的就是如何把一些功能写入合约。
这里我们实现一个简单的写入合约功能的操作--支付。
首先列出交易前期准备的数据:
合约地址、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基础上进行升级的 // 最新版本取消了overrides,overrides中的内容直接使用 // 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; } }}