# Direcciones de depósito

Crea una dirección para recibir un token por una red.

Una dirección de depósito recibe un token por una red. Se crea con [`POST /v1/deposit-addresses`](/docs/operaciones/crear-direccion-de-deposito/), con `chain` y `currency`, y la respuesta trae también `warning`. Las combinaciones disponibles están en [Cobertura](/docs/cobertura/#redes-y-tokens).

**Variables de estas muestras: simulador público, sin cuenta**

Define esto en tu terminal. Con estos valores las muestras corren tal cual contra el simulador público:

```bash
export FITAL_API="https://widget.fital.xyz/explorar/v1"
export FITAL_KEY="sk_test_sandbox_publica"
export FITAL_SIGNING_SECRET="secreto_de_firma_de_prueba_publico"
```

En la cuenta de prueba o en producción cambia la base, la llave y el secreto, y sustituye los `id` de ejemplo por los tuyos. Ver [Ambientes](/docs/ambientes/).

```bash
CUERPO='{"chain":"polygon","currency":"USDC"}'
CLAVE="direccion-tesoreria-01"
TS=$(date +%s)
HASH=$(printf '%s' "$CUERPO" | openssl dgst -sha256 -r | cut -d' ' -f1)
FIRMA=$(printf '%s\n%s\n%s\n%s\n%s' "$TS" POST /v1/deposit-addresses "$HASH" "$CLAVE" \
  | openssl dgst -sha256 -hmac "$FITAL_SIGNING_SECRET" -r | cut -d' ' -f1)
curl -sS -X POST "$FITAL_API/deposit-addresses" \
  -H "Authorization: Bearer $FITAL_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $CLAVE" \
  -H "X-Fital-Timestamp: $TS" \
  -H "X-Fital-Signature: v1=$FIRMA" \
  -d "$CUERPO"
```

```js
import { createHash, createHmac } from 'node:crypto';
const cuerpo = JSON.stringify({"chain":"polygon","currency":"USDC"});
const clave = 'direccion-tesoreria-01';
const ts = String(Math.floor(Date.now() / 1000));
const hash = createHash('sha256').update(cuerpo).digest('hex');
const firma = createHmac('sha256', process.env.FITAL_SIGNING_SECRET)
  .update([ts, 'POST', '/v1/deposit-addresses', hash, clave].join('\n')).digest('hex');
const r = await fetch(`${process.env.FITAL_API}/deposit-addresses`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.FITAL_KEY}`,
    'Content-Type': 'application/json',
    'Idempotency-Key': clave,
    'X-Fital-Timestamp': ts,
    'X-Fital-Signature': `v1=${firma}`,
  },
  body: cuerpo,
});
console.log(r.status, await r.json());
```

```python
import hashlib, hmac, json, os, time, urllib.error, urllib.request
datos = {"chain":"polygon","currency":"USDC"}
cuerpo = json.dumps(datos).encode()
clave = "direccion-tesoreria-01"
ts = str(int(time.time()))
canon = "\n".join([ts, "POST", "/v1/deposit-addresses", hashlib.sha256(cuerpo).hexdigest(), clave])
firma = hmac.new(os.environ["FITAL_SIGNING_SECRET"].encode(), canon.encode(), hashlib.sha256).hexdigest()
pet = urllib.request.Request(os.environ["FITAL_API"] + "/deposit-addresses", method="POST", data=cuerpo,
    headers={"Authorization": "Bearer " + os.environ["FITAL_KEY"],
             "Content-Type": "application/json",
             "Idempotency-Key": clave,
             "X-Fital-Timestamp": ts,
             "X-Fital-Signature": "v1=" + firma})
try:
    with urllib.request.urlopen(pet) as r:
        print(r.status, json.load(r))
except urllib.error.HTTPError as e:
    print(e.code, e.read().decode())
```

```php
<?php
$cuerpo = '{"chain":"polygon","currency":"USDC"}';
$clave = 'direccion-tesoreria-01';
$ts = (string) time();
$canon = implode("\n", [$ts, 'POST', '/v1/deposit-addresses', hash('sha256', $cuerpo), $clave]);
$firma = hash_hmac('sha256', $canon, getenv('FITAL_SIGNING_SECRET'));
$c = curl_init(getenv('FITAL_API') . '/deposit-addresses');
curl_setopt_array($c, [
  CURLOPT_POST => true,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    'Authorization: Bearer ' . getenv('FITAL_KEY'),
    'Content-Type: application/json',
    'Idempotency-Key: ' . $clave,
    'X-Fital-Timestamp: ' . $ts,
    'X-Fital-Signature: v1=' . $firma,
  ],
  CURLOPT_POSTFIELDS => $cuerpo,
]);
echo curl_exec($c), "\n";
```

La respuesta trae `chain` en minúsculas y `currency` en mayúsculas, sin importar cómo los pediste.

## Antes de compartirla

- En `solana`, `tron`, `tempo`, `linea` y `xdc` un depósito rechazado no regresa automáticamente. Lo dice también el `warning` de esas direcciones. Tenlo en cuenta antes de usarlas para montos grandes.
- `stellar` no está disponible.
- Otro token enviado a una dirección puede no acreditarse. Respeta `chain`, `currency` y `warning` de la respuesta.

## En qué se acredita

- EURC se queda en EURC. En [`GET /v1/balances`](/docs/operaciones/listar-saldos/) suma a la fila `EUR`, y el depósito trae `credited_currency: EURC`.
- USDC, USDT y PYUSD se acreditan en dólares: suman a la fila `USD`. Lee `credited_amount` y `credited_currency` de cada depósito.

## Estados

`processing` mientras se crea y `active` cuando ya recibe. Consulta con [`GET /v1/deposit-addresses/{id}`](/docs/operaciones/consultar-direccion-de-deposito/).

## Errores comunes

- `422 pair_not_supported`: esa red no recibe ese token.
- `422 deposit_address_rejected`: la dirección se rechazó. Revisa `chain` y `currency`.
- Compartir la dirección con `processing`: `address` todavía es `null`.

## Qué sigue

[Quién pagó](/docs/recetas/quien-pago/).
