> For the complete documentation index, see [llms.txt](https://base-es.gitbook.io/base/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://base-es.gitbook.io/base/overview/clientes/viem.md).

# viem

**INFO**

&#x20;Viem actualmente solo está disponible en Base Goerli testnet(red de prueba).

[viem](https://viem.sh/) es una interfaz TypeScript para Ethereum que proporciona primitivas sin estado de bajo nivel para interactuar con Ethereum.

Puedes usar viem para interactuar con contratos inteligentes desplegados en Base.

**Instalar** Para instalar viem, ejecute el siguiente comando:

```css
cssCopy code
npm install --save viem

```

**Configuración**

&#x20;Antes de que puedas comenzar a usar viem, necesitas configurar un [Cliente](https://viem.sh/docs/clients/intro.html) con un [Transporte](https://viem.sh/docs/clients/intro.html) y una [blockchain especifica](https://viem.sh/docs/clients/chains.html).

```jsx
javascriptCopy code
import { createPublicClient, http } from 'viem';
import { base } from 'viem/chains';

const client = createPublicClient({
  chain: base,
  transport: http(),
});

```

**INFO**

&#x20;Para usar `Base`, debes especificar base como la cadena al crear un Cliente.

Para usar Base Goerli (testnet), reemplace `base` con `baseGoerli.`

**Leyendo datos de la blockchain**

&#x20;Una vez que hayas creado un cliente, puedes usarlo para leer y acceder a datos de Base usando [Acciones Públicas.](https://viem.sh/docs/actions/public/introduction.html)

Las Acciones Públicas son métodos del cliente que se mapean uno a uno con un método RPC "público" de Ethereum `(eth_blockNumber, eth_getBalance`, etc.)

Por ejemplo, puedes usar el método getBlockNumber del cliente para obtener el último bloque:

```jsx
javascriptCopy code
const blockNumber = await client.getBlockNumber();

```

**Escribiendo datos en la blockchain**

&#x20;Para escribir datos en Base, necesitas crear un cliente de Billetera (`createWalletClient`) y especificar una [Account](https://ethereum.org/en/developers/docs/accounts/) (Cuenta) para usar.

```jsx
javascriptCopy code
import { createWalletClient, custom } from 'viem'
import { base } from 'viem/chains'

const [account] = await window.ethereum.request({ method: 'eth_requestAccounts' })

const client = createWalletClient({
  account,
  chain: base,
  transport: custom(window.ethereum)
})

client.sendTransaction({ ... })

```

**INFO**

&#x20;Además de hacer una solicitud JSON-RPC (`eth_requestAccounts`) para obtener una Cuenta, viem proporciona varios métodos auxiliares para crear una `Account` (Cuenta), incluyendo: `privateKeyToAccount`, `mnemonicToAccount` y `hdKeyToAccount.`

Para usar Base Goerli (testnet), reemplace `base` con `baseGoerli.`

**Interactuando con contratos inteligentes**

&#x20;Puedes usar viem para interactuar con un contrato inteligente en Base creando una instancia de [Contract](https://viem.sh/docs/contract/getContract.html) (contrato) usando `getContract` y pasándole el ABI del contrato, la dirección del contrato y el [Cliente Público](https://viem.sh/docs/clients/public.html) y/o de [Billetera:](https://viem.sh/docs/clients/wallet.html)

```jsx
javascriptCopy code
import { getContract } from 'viem';
import { wagmiAbi } from './abi';
import { publicClient } from './client';

// 1. Crear instancia de contrato
const contract = getContract({
  address: 'DIRECCION_CONTRATO',
  abi: wagmiAbi,
  publicClient,
});

// 2. Llamar a métodos del contrato, escuchar eventos, etc.
const result = await contract.read.totalSupply();

```

**INFO**

`DIRECCION_CONTRATO` es la dirección del contrato desplegado.
