> ## 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

> एक custom chain परिभाषित करने, standard और custom RPC methods को call करने, और transactions को simulate या trace करने के लिए viem को Virtual Environment से कनेक्ट करें।

[Viem](https://viem.sh/) Ethereum के लिए एक TypeScript Interface है जो Ethereum के साथ इंटरैक्ट करने के लिए low-level stateless primitives प्रदान करता है।

आप **Public RPC** कॉपी करने पर मानक RPC methods का उपयोग करके Virtual Environments के साथ इंटरैक्ट कर सकते हैं,
साथ ही **Admin RPC** कॉपी करने पर [Node RPC पर उपलब्ध custom methods](/virtual-environments/admin-rpc) का उपयोग कर सकते हैं।

<Card title="Code samples: Using Viem with Virtual Environments" href="" />

## एक custom chain परिभाषित करें

एक file `tenderly.config.ts` बनाएं और एक chain object बनाने के लिए **`defineChain`** का उपयोग करें।

<Info>
  यदि आपने Virtual Environment निर्माण के दौरान एक अद्वितीय Chain ID निर्दिष्ट किया है, तो आपको एक नया chain object बनाना होगा और **`id`** को अपने चुने हुए मान पर सेट करना होगा।
</Info>

```typescript title="virtual-environments/src/tenderly.config.ts" showLineNumbers lines={4, 8, 13} theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}

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,
    },
  },
});
```

## custom RPC methods के लिए Viem actions परिभाषित करें

custom RPC methods के लिए Viem actions परिभाषित करें, जैसे `tenderly_setBalance` `tenderly_setErc20Balance`, और `simulate`।

उदाहरण के लिए, निम्न file एक `tenderlySetBalance` action परिभाषित करती है जो `tenderly_setBalance` को invoke करेगी।

आप यहाँ अधिक actions पा सकते हैं:

<Card title="Viem actions for custom RPC methods" href="" />

```typescript title="virtual-environments/src/viem-tenderly-actions.ts" theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}

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,
  });
}
```

## standard और custom RPC methods को call करें

इस example में, आप देख सकते हैं कि कैसे:

* Viem के `createPublicClient` को call करें और निम्न arguments पास करें:
* **`chain`**: पिछले चरण में परिभाषित `vMainnet` पर सेट करें
* **`transport`**: या तो `http` को call करें, और `https` RPC URL पर सेट करें।

```typescript title="virtual-environments/src/viem-call-balance-top-up.ts" showLineNumbers {8, 12-13, 24-28, 31-34, 39-41, 46} theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}

(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 का उपयोग करके transactions simulate करें

Virtual Environment के [Simulation RPC methods](/node-rpc/rpc-reference?network=ethereum-mainnet\&method=tenderly_simulateTransaction) का उपयोग करने के लिए, बस **`tenderly_simulateTransaction`** को call करने के लिए `request` करें:

```typescript title="virtual-environments/src/viem-call-simulate.ts" showLineNumbers {6, 9-24} theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}

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 का उपयोग करके transactions trace करें

पूरी तरह से decoded transaction trace प्राप्त करने के लिए [`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("=======================================================");
```
