Перейти к основному содержанию
Viem — это TypeScript-интерфейс для Ethereum, предоставляющий низкоуровневые stateless-примитивы для взаимодействия с Ethereum. Вы можете использовать Tenderly вместе с Viem для взаимодействия с блокчейном с помощью стандартных RPC-методов, а также пользовательских методов, доступных в Node RPC. Вызовите createPublicClient из Viem и передайте следующие аргументы:
  • chain: одна из предопределённых сетей из viem/chains
  • transport: вызов http или webSocket, инициализированный URL RPC со схемой https или wss.

Примеры кода: использование Viem с Node RPC

node/samples/viem/0-a-call.ts

const client = createPublicClient({
  chain: mainnet,
  transport: http(
    `https://mainnet.gateway.tenderly.co/${process.env.TENDERLY_NODE_ACCESS_KEY}`
  ),
});


console.log("Block Number", await client.getBlockNumber());

Пакетирование запросов

Viem позволяет отправлять batch-запросы. При пакетировании несколько JSON-RPC-вызовов обрабатываются в одном HTTPS-запросе. Несколько действий Viem группируются и выполняются в конце текущей очереди сообщений JavaScript. По умолчанию задержки нет, но её можно настроить через необязательный параметр wait. Это означает, что несколько действий viem будут сгруппированы и выполнены в конце текущей очереди сообщений JavaScript. По умолчанию задержки нет, но её можно настроить через необязательный параметр wait.
node/samples/viem/0-batch-calls.ts

const client = createPublicClient({
  chain: mainnet,
  transport: http(
    `https://mainnet.gateway.tenderly.co/${process.env.TENDERLY_NODE_ACCESS_KEY}`,
    {
      batch: true,
    }
  ),
});

const [blockNumber, balance, ensName] = await Promise.all([
  client.getBlockNumber(),
  client.getBalance({ address: "0xd2135CfB216b74109775236E36d4b433F1DF507B" }),
  client.getEnsName({ address: "0xd2135CfB216b74109775236E36d4b433F1DF507B" }),
  client.getChainId(),
]);
console.log("Results are in");
console.log({ blockNumber, balance, ensName });

//  So will this
const bnPromise = client.getBlockNumber();

const balancePromise = client.getBalance({
  address: "0xd2135CfB216b74109775236E36d4b433F1DF507B",
});

console.log(await bnPromise);
console.log(await balancePromise);

Симуляция транзакций с помощью viem

Чтобы использовать RPC-методы симуляции, просто воспользуйтесь методом client.request:
node/samples/viem/1-simulate.ts
const simulation = await client.request({
  method: "tenderly_simulateTransaction",
  params: [
    // transaction object
    {
      from: "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
      to: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
      gas: "0x0",
      gasPrice: "0x0",
      value: "0x0",
      data: "0xa9059cbb00000000000000000000000020a5814b73ef3537c6e099a0d45c798f4bd6e1d60000000000000000000000000000000000000000000000000000000000000001",
    },
    // the block
    "latest",
  ],
});

console.log("Trace");
console.log(JSON.stringify(simulation.trace, null, 2));
console.log("=======================================================");
console.log("Logs");
console.log(JSON.stringify(simulation.logs, null, 2));
console.log("=======================================================");
console.log("Asset Changes");
console.log(JSON.stringify(simulation.assetChanges, null, 2));
console.log("=======================================================");
console.log("Balance Changes");
console.log(JSON.stringify(simulation.balanceChanges, null, 2));

Трассировка транзакций с помощью Viem

Используйте tenderly_traceTransaction, чтобы получить полностью декодированную трассировку транзакции.
node/samples/viem/2-transaction-trace.ts
const txTrace = await client.request({
  method: "tenderly_traceTransaction",
  params: [
    // transaction hash
    "0x6b2264fa8e28a641d834482d250080b39cbbf39251344573c7504d6137c4b793"
  ],
});


console.log("Logs");
console.log(JSON.stringify(txTrace.logs, null, 2));
console.log("=======================================================");
console.log("Asset Changes");
console.log(JSON.stringify(txTrace.assetChanges, null, 2));
console.log("=======================================================");
console.log("Balance Changes");
console.log(JSON.stringify(txTrace.balanceChanges, null, 2));
console.log("=======================================================");