viem 合约交互API

实际上,encodeAbiParameters、encodePacked 和 getAbiItem 主要用于准备和处理与合约交互的数据,而 parseAbi、parseAbiItem、parseAbiParameter 和 parseAbiParameters 主要用于解析和处理 ABI(应用二进制接口)定义。它们的具体用途如下:
用于准备和处理与合约交互的数据
-
encodeAbiParameters- 用途:将函数调用的参数编码为 ABI 格式,以便发送到智能合约。
- 示例:
const encodedParams = encodeAbiParameters(['uint256', 'address'], [123, '0x...']);
-
encodePacked- 用途:将参数以紧凑的方式编码,用于特定的哈希计算或其他非标准 ABI 编码场景。
- 示例:
const packedData = encodePacked(['uint256', 'address'], [123, '0x...']);
-
getAbiItem- 用途:从 ABI 定义中提取特定的函数或事件定义。
- 示例:
const abiItem = getAbiItem(abi, 'functionName');
用于解析和处理 ABI 定义
-
parseAbi- 用途:解析完整的 ABI 字符串或 JSON。
- 示例:
const abi = parseAbi('[{"constant":true,"inputs":[],"name":"myFunction","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]');
-
parseAbiItem- 用途:解析单个 ABI 项(如函数或事件)。
- 示例:
const abiItem = parseAbiItem('function myFunction() view returns (uint256)');
-
parseAbiParameter- 用途:解析单个 ABI 参数。
- 示例:
const abiParam = parseAbiParameter('uint256 myParam');
-
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);
总结
- 准备和处理与合约交互的数据:
encodeAbiParameters、encodePacked、getAbiItem。 - 解析和处理 ABI 定义:
parseAbi、parseAbiItem、parseAbiParameter、parseAbiParameters。
通过这些 API,可以高效地与以太坊智能合约进行交互,处理复杂的 ABI 编码和解码操作。