介绍
viem是一个由paradigm出品的ethers.js的替代品,相比后者,viem具有更小的软件包和更佳的性能,目前已经被sushiswap、mint.fun等项目采用,由于超高的性能,viem将来一定会成为ethers.js的一大竞争者,由于在CSDN还没有相关文章介绍,因此笔者就简要介绍一下如何利用viem与链上合约进行交互。
交互
本文以调用goerli上的WETH合约为例进行讲解
读合约
在ethers.js 5.0中,我们想要利用自己的rpc url来创建新的provider会采用ethers.providers.JsonRpcProvider()
的方式,而在viem中,会采用下面的方式创建新的provider:
import { createPublicClient, http } from 'viem'
import { goerli } from 'viem/chains'
const client = createPublicClient({
chain: goerli,
transport: http('https://rpc.ankr.com/eth_goerli')
})
特别的,如果不想使用自己的rpc,transport可以省略为transport: http()
。
在ethers.js中,合约的abi可以直接使用human readable ABI,对于开发者来说,可以方便的直接从solidity代码中复制合约声明直接使用。而目前的viem暂时不支持human readable ABI,因此需要在与脚本文件相同文件夹下新建一个abi.js
或者abi.ts
文件,并在其中放入以下代码:
export const generalContract = {
address: '0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6', // goerli 上WETH的合约地址
abi: [] // 这里放入目标合约的ABI
}
然后在主文件中引用该文件:
// javascript
import { generalContract } from './abi.js';
// typescript
import { generalContract } from './abi';
假如要检查某地址的WETH余额,则采用如下方式进行调用:
const balanceOf = await client.readContract({
...generalContract,
functionName: 'balanceOf',
args: ['your address here'],
});
console.log('Balance of:', balanceOf);
其他读合约方法与此相同,如果函数没有参数的话,args
项可以省略。
写合约
写入合约需要有钱包,首先需要创建钱包对象,采用以下方式创建钱包对象:
const walletClient = createWalletClient({
transport: custom(window.ethereum)
})
const [address] = await walletClient.getAddresses()
const account = getAccount(address)
创建合约对象的方式与读合约中的方式相同,调用合约使用以下方式
const request = await client.simulateContract({
...generalContract,
functionName: 'withdraw',
amount,
})
const supply = await walletClient.writeContract(request)
至此我们便完成了使用viem读合约以及写合约