文章目录
- 介绍
- 交互
- 读合约
- 写合约
介绍
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}
然后在主文件中引用该文件:
// javascriptimport { generalContract } from './abi.js';// typescriptimport { 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读合约以及写合约