Ethers.js-编码calldata

接口类Interface

ethers.js的接口类抽象了与以太坊网络上的合约交互所需的ABI编码和解码。ABI(Application Binary Interface)与API类似,是一格式,用于对合约可以处理的各种类型的数据进行编码,以便它们可以交互。
相关函数:
getSighash():获取函数选择器(function selector),参数为函数名或函数签名。

interface.getSighash("balanceOf");
// '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'

encodeDeploy():编码构造器的参数,然后可以附在合约字节码的后面。

interface.encodeDeploy("Wrapped ETH", "WETH");	

encodeFunctionData():编码函数的calldata。

interface.encodeFunctionData("balanceOf", ["0xc778417e063141139fce010982780140aa0cd5ab"]);

decodeFunctionResult():解码函数的返回值。

interface.decodeFunctionResult("balanceOf", resultData)

与Sepolia测试网合约交互

import {
    
     ethers } from "ethers";

const ALCHEMY_API_URL = ";
const provider = new ethers.providers.JsonRpcProvider(ALCHEMY_API_URL)

const privatekey = ""
const wallet = new ethers.Wallet(privatekey,provider)

// WETH的ABI
const abiWETH = [
    "function balanceOf(address) public view returns(uint)",
    "function deposit() public payable",
];
// WETH合约地址(Sepolia测试网)
const addressWETH = '0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9'
// 声明WETH合约
const contractWETH = new ethers.Contract(addressWETH, abiWETH, wallet)

const address = await wallet.getAddress()
// 1. 读取WETH合约的链上信息(WETH abi)
console.log("\n1. 读取WETH余额")
// 编码calldata
const param1 = contractWETH.interface.encodeFunctionData(
    "balanceOf",
    [address]
  );
console.log(`编码结果: ${
      
      param1}`)
// 创建交易
const tx1 = {
    
    
    to: addressWETH,
    data: param1
}
// 发起交易,可读操作(view/pure)可以用 provider.call(tx)
const balanceWETH = await provider.call(tx1)
console.log(`存款前WETH持仓: ${
      
      ethers.utils.formatEther(balanceWETH)}\n`)

// 编码calldata
const param2 = contractWETH.interface.encodeFunctionData(
    "deposit"          
    );
console.log('2.调用desposit()函数,存入0.001ETH')
console.log(`编码结果: ${
      
      param2}`)
// 创建交易
const tx2 = {
    
    
    to: addressWETH,    
    data: param2,
    value: ethers.utils.parseEther("0.001")}
// 发起交易,写入操作需要 wallet.sendTransaction(tx)
const receipt1 = await wallet.sendTransaction(tx2)
// 等待交易上链
await receipt1.wait()
console.log(`交易详情:`)
console.log(receipt1)
const balanceWETH_deposit = await contractWETH.balanceOf(address)
console.log(`存款后WETH持仓: ${
      
      ethers.utils.formatEther(balanceWETH_deposit)}\n`)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Geoffrey_Zhu/article/details/143389954