Skip to main content

viem 合约交互API

alt text

实际上,encodeAbiParametersencodePackedgetAbiItem 主要用于准备和处理与合约交互的数据,而 parseAbiparseAbiItemparseAbiParameterparseAbiParameters 主要用于解析和处理 ABI(应用二进制接口)定义。它们的具体用途如下:

用于准备和处理与合约交互的数据

  1. encodeAbiParameters

    • 用途:将函数调用的参数编码为 ABI 格式,以便发送到智能合约。
    • 示例
      const encodedParams = encodeAbiParameters(['uint256', 'address'], [123, '0x...']);
  2. encodePacked

    • 用途:将参数以紧凑的方式编码,用于特定的哈希计算或其他非标准 ABI 编码场景。
    • 示例
      const packedData = encodePacked(['uint256', 'address'], [123, '0x...']);
  3. getAbiItem

    • 用途:从 ABI 定义中提取特定的函数或事件定义。
    • 示例
      const abiItem = getAbiItem(abi, 'functionName');

用于解析和处理 ABI 定义

  1. parseAbi

    • 用途:解析完整的 ABI 字符串或 JSON。
    • 示例
      const abi = parseAbi('[{"constant":true,"inputs":[],"name":"myFunction","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]');
  2. parseAbiItem

    • 用途:解析单个 ABI 项(如函数或事件)。
    • 示例
      const abiItem = parseAbiItem('function myFunction() view returns (uint256)');
  3. parseAbiParameter

    • 用途:解析单个 ABI 参数。
    • 示例
      const abiParam = parseAbiParameter('uint256 myParam');
  4. parseAbiParameters

    • 用途:解析多个 ABI 参数。
    • 示例
      const abiParams = parseAbiParameters('uint256 myParam1, address myParam2');

示例:综合使用这些 API 与合约交互

以下是一个完整的示例,展示了如何综合使用这些 API 与以太坊智能合约进行交互,包括准备调用数据和解析 ABI 定义。

const { ethers } = require('ethers');
const {
decodeAbiParameters,
encodeAbiParameters,
encodePacked,
getAbiItem,
parseAbi,
parseAbiItem,
parseAbiParameter,
parseAbiParameters,
} = require('viem');

const provider = new ethers.providers.JsonRpcProvider('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID');
const privateKey = 'YOUR_PRIVATE_KEY';
const wallet = new ethers.Wallet(privateKey, provider);

const contractAddress = 'YOUR_CONTRACT_ADDRESS';
const abi = parseAbi([
'function setData(uint256 _data)',
'function getData() view returns (uint256)',
]);

const contract = new ethers.Contract(contractAddress, abi, wallet);

async function interactWithContract() {
// 编码参数
const encodedSetData = encodeAbiParameters(['uint256'], [42]);

// 调用 setData 函数
const setDataTx = await contract.setData(encodedSetData);
await setDataTx.wait();
console.log('Data has been set to 42.');

// 调用 getData 函数
const getDataItem = getAbiItem(abi, 'getData');
const encodedGetData = encodeAbiParameters([], []);
const result = await provider.call({
to: contractAddress,
data: getDataItem.signature + encodedGetData.slice(2),
});

// 解码返回值
const decodedResult = decodeAbiParameters(['uint256'], result);
console.log('Stored data:', decodedResult[0].toString());

// 示例:使用 parseAbiItem 和 parseAbiParameter
const parsedItem = parseAbiItem('function setData(uint256 _data)');
console.log('Parsed ABI Item:', parsedItem);

const parsedParam = parseAbiParameter('uint256 _data');
console.log('Parsed ABI Parameter:', parsedParam);
}

interactWithContract().catch(console.error);

总结

  • 准备和处理与合约交互的数据encodeAbiParametersencodePackedgetAbiItem
  • 解析和处理 ABI 定义parseAbiparseAbiItemparseAbiParameterparseAbiParameters

通过这些 API,可以高效地与以太坊智能合约进行交互,处理复杂的 ABI 编码和解码操作。