使用viem与链上智能合约进行交互

文章介绍了viem,一个轻量级且高性能的ethers.js替代品,用于与区块链合约交互。通过示例展示了如何在goerli网络上调用WETH合约,包括读取合约(如获取余额)和写入合约(如执行交易)。文章强调了viem在创建provider、处理ABI以及进行合约操作方面的不同之处。
摘要由CSDN通过智能技术生成

介绍

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涛行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值