Перейти к основному содержанию
Viem — это TypeScript-интерфейс для Ethereum, предоставляющий низкоуровневые stateless-примитивы для взаимодействия с Ethereum. Вы можете взаимодействовать с Virtual Environments с помощью стандартных RPC-методов, скопировав Public RPC, а также пользовательских методов, доступных в Node RPC, скопировав Admin RPC.

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

Определите кастомную цепочку

Создайте файл tenderly.config.ts и используйте defineChain для создания объекта цепочки.
Если при создании Virtual Environment вы указали уникальный Chain ID, вам нужно создать новый объект цепочки и установить id в выбранное значение.
virtual-environments/src/tenderly.config.ts

export const vMainnet = defineChain({
  id: 73571,
  name: 'Virtual Ethereum Mainnet',
  nativeCurrency: { name: 'vEther', symbol: 'vETH', decimals: 18 },
  rpcUrls: {
    default: { http: [process.env.TENDERLY_VIRTUAL_MAINNET_RPC!] },
  },
  blockExplorers: {
    default: {
      name: 'Tenderly Explorer',
      url: process.env.TENDERLY_VIRTUAL_MAINNET_EXPLORER!
    },
  },
  contracts: {
    ensRegistry: {
      address: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',
    },
    ensUniversalResolver: {
      address: '0xE4Acdd618deED4e6d2f03b9bf62dc6118FC9A4da',
      blockCreated: 16773775,
    },
    multicall3: {
      address: '0xca11bde05977b3631167028862be2a173976ca11',
      blockCreated: 14353601,
    },
  },
});

Определите Viem-actions для пользовательских RPC-методов

Определите Viem-actions для пользовательских RPC-методов, таких как tenderly_setBalance, tenderly_setErc20Balance и simulate. Например, следующий файл определяет action tenderlySetBalance, который будет вызывать tenderly_setBalance. Больше actions можно найти здесь:

Viem-actions для пользовательских RPC-методов

virtual-environments/src/viem-tenderly-actions.ts

type TSetBalanceParams = [addresses: Hex[], value: Hex];

export async function tenderlySetBalance(client: Client, params: TSetBalanceParams) {
  return client.request<{
    method: 'tenderly_setBalance',
    Parameters: TSetBalanceParams,
    ReturnType: Hex
  }>({
    method: 'tenderly_setBalance',
    params: params,
  });
}

Вызов стандартных и пользовательских RPC-методов

В этом примере вы можете увидеть, как:
  • Вызвать Viem’овский createPublicClient и передать следующие аргументы:
  • chain: установлен в vMainnet, определённый на предыдущем шаге
  • transport: либо вызов http, установленный в https RPC URL.
virtual-environments/src/viem-call-balance-top-up.ts

(async () => {
  const client = createPublicClient({
    chain: vMainnet,
    transport: http(vMainnet.rpcUrls.default.http[0]),
  });

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

  const balanceTxs = await Promise.all([
    tenderlySetBalance(client, [
      ["0x0d2026b3EE6eC71FC6746ADb6311F6d3Ba1C000B", "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"],
      "0xDE0B6B3A7640000"
    ]),
    tenderlySetErc20Balance(client, [
      "0xdAC17F958D2ee523a2206206994597C13D831ec7",
      "0x40BdB4497614bAe1A67061EE20AAdE3c2067AC9e",
      "0xDE0B6B3A7640000"
    ]),
    // USDT
    tenderlySetErc20Balance(client, [
      "0x6B175474E89094C44Da98b954EedeAC495271d0F",
      "0x40BdB4497614bAe1A67061EE20AAdE3c2067AC9e",
      "0xDE0B6B3A7640000"
    ]),
    tenderlySetErc20Balance(client, [
      "0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE",
      "0x40BdB4497614bAe1A67061EE20AAdE3c2067AC9e",
      "0xDE0B6B3A7640000"
    ]),
  ]);

  console.log(
    "ETH balance, DAI and ShibaInu topups",
    balanceTxs.map(txHash => `${(vMainnet.blockExplorers.default.url)}/tx/${txHash}`));
})().catch(e => {
  console.error(e);
  process.exitCode = 1;
});

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

Чтобы использовать Simulation RPC методы Virtual Environment, просто выполните request для вызова tenderly_simulateTransaction:
virtual-environments/src/viem-call-simulate.ts

const client = createPublicClient({
  chain: vMainnet,
  transport: http(vMainnet.rpcUrls.default[0])
});

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("Logs");
console.log(JSON.stringify(simulation.logs, null, 2));
console.log("Asset Changes");
console.log(JSON.stringify(simulation.assetChanges, null, 2));
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("=======================================================");