文章目录

  • 介绍
  • 交互
    • 读合约
    • 写合约

介绍

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读合约以及写合约