> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tenderly.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Viem - интеграция с Node RPC

> Подключите viem к Tenderly Node RPC для чтения, отправки, трассировки и симуляции транзакций в 100+ EVM-сетях по HTTPS или WebSocket.

[Viem](https://viem.sh/) — это TypeScript-интерфейс для Ethereum, предоставляющий низкоуровневые stateless-примитивы для взаимодействия с Ethereum.

Вы можете использовать Tenderly вместе с Viem для взаимодействия с блокчейном с помощью стандартных RPC-методов, а также [пользовательских методов, доступных в Node RPC](/node-rpc/rpc-reference).

Вызовите `createPublicClient` из Viem и передайте следующие аргументы:

* `chain`: одна из предопределённых сетей из `viem/chains`
* `transport`: вызов `http` или `webSocket`, инициализированный URL RPC со схемой `https` или `wss`.

<Card title="Примеры кода: использование Viem с Node RPC" href="" />

```js title="node/samples/viem/0-a-call.ts" showLineNumbers {16-18} theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}

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-запросы](https://viem.sh/docs/clients/transports/http#batch-json-rpc). При пакетировании несколько JSON-RPC-вызовов обрабатываются в одном HTTPS-запросе. Несколько действий Viem группируются и выполняются в конце текущей очереди сообщений JavaScript. По умолчанию задержки нет, но её можно настроить через необязательный параметр `wait`.

Это означает, что несколько действий viem будут сгруппированы и выполнены в конце текущей очереди сообщений JavaScript. По умолчанию задержки нет, но её можно настроить через необязательный параметр `wait`.

```js title="node/samples/viem/0-batch-calls.ts" showLineNumbers {16-21} theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}

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-методы симуляции](/node-rpc/rpc-reference?network=ethereum-mainnet\&method=tenderly_simulateTransaction), просто воспользуйтесь методом `client.request`:

```js title="node/samples/viem/1-simulate.ts" showLineNumbers {2-15} theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
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-rpc/rpc-reference?network=ethereum-mainnet\&method=tenderly_traceTransaction), чтобы получить полностью декодированную трассировку транзакции.

```ts showLineNumbers title="node/samples/viem/2-transaction-trace.ts" {2-6} theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
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("=======================================================");
```
