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

# Billetera y multi-dispositivo

> Crear, enviar y recuperar — con un solo chequeo de estado que mantiene cada dispositivo en sync.

El cliente de billetera ejecuta las acciones del usuario (crear, enviar, recuperar)
contra tu backend. La aprobación ocurre en el dispositivo del usuario; Meru completa
la transferencia y cubre la comisión.

## Construir

<CodeGroup>
  ```ts React Native theme={null}
  import { MeruDeviceWallet } from "@meru.app/device-signer/wallet";

  const wallet = new MeruDeviceWallet({
    baseUrl: "https://your-app.com/api/meru",
    userId: session.user.id,
    getToken: async () => auth.current()?.token ?? null,
  });
  ```

  ```dart Flutter theme={null}
  final wallet = MeruDeviceWallet(
    baseUrl: 'https://your-app.com/api/meru',
    getToken: () async => auth.current?.token,
    keyId: 'meru.device-key.${session.user.id}',
  );
  ```

  ```swift iOS theme={null}
  let wallet = MeruDeviceWallet(
      baseURL: URL(string: "https://your-app.com/api/meru")!,
      userId: session.user.id,
      getToken: { auth.current?.token }
  )
  ```

  ```kotlin Android theme={null}
  val wallet = MeruDeviceWallet(
      baseUrl = "https://your-app.com/api/meru",
      keys = DeviceKeyStore(applicationContext),
      userId = session.user.id,
      getToken = { auth.current?.token },
  )
  ```
</CodeGroup>

## Multi-dispositivo: siempre llama a `status()` primero

La llave de la billetera nunca sale del dispositivo, así que iniciar sesión en un
teléfono nuevo **no** la copia. `status()` combina "¿el usuario tiene billetera?"
con "¿este dispositivo tiene su llave?" y te dice la única acción correcta.

| `status().state` | Significado                                                                 | Acción                       |
| ---------------- | --------------------------------------------------------------------------- | ---------------------------- |
| `create`         | El usuario todavía no tiene billetera.                                      | `enroll({ activate: true })` |
| `recover`        | El usuario tiene billetera en otro dispositivo; este necesita configurarse. | `recover()`                  |
| `ready`          | Este dispositivo está listo para enviar.                                    | `send` / `signMessage`       |

<Warning>
  En un segundo dispositivo, llamar a `enroll()` en vez de `recover()` iniciaría una
  billetera **separada**. Siempre ramifica según `status()`.
</Warning>

* **Recibir** funciona en cualquier dispositivo de inmediato — la dirección de la
  billetera es pública.
* **Enviar** desde un dispositivo nuevo requiere `recover()` una vez. Restaura este
  dispositivo a la billetera existente del usuario (misma billetera, misma dirección)
  a través del servicio de recuperación de Meru, autorizado por el login del usuario.

## Métodos

| Llamada                | Qué hace                                                                |
| ---------------------- | ----------------------------------------------------------------------- |
| `status()`             | `create` / `recover` / `ready` para este dispositivo.                   |
| `enroll({ activate })` | Configura la billetera en este dispositivo (opcionalmente actívala ya). |
| `activate()`           | Configuración inicial de la billetera, cubierta por Meru.               |
| `send(to, amount)`     | Envía dólares. Aprobado en el dispositivo; Meru cubre la comisión.      |
| `recover()`            | Restaura este dispositivo a la billetera existente del usuario.         |
| `signMessage()`        | Prueba el control de la billetera sin mover dinero.                     |
| `forget()`             | Elimina la llave de este dispositivo al cerrar sesión.                  |

## Enviar

<CodeGroup>
  ```ts React Native theme={null}
  const txHash = await wallet.send("GB7C…FB2Q", 5);
  ```

  ```dart Flutter theme={null}
  final txHash = await wallet.send('GB7C…FB2Q', 5);
  ```

  ```swift iOS theme={null}
  let txHash = try await wallet.send(to: "GB7C…FB2Q", amount: 5)
  ```

  ```kotlin Android theme={null}
  val txHash = wallet.send("GB7C…FB2Q", 5.0)
  ```
</CodeGroup>

## Cerrar sesión

Elimina la llave del dispositivo y borra la sesión. Perder la llave no es problema
— la billetera se recupera volviendo a iniciar sesión.

<CodeGroup>
  ```ts React Native theme={null}
  await wallet.forget();
  await auth.logout();
  ```

  ```swift iOS theme={null}
  try wallet.forget()
  auth.logout()
  ```

  ```kotlin Android theme={null}
  wallet.forget()
  auth.logout()
  ```
</CodeGroup>
