> For the complete documentation index, see [llms.txt](https://sodex.com/documentation/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sodex.com/documentation/for-developers/developers/mirror-protocol/lifecycle/custody-deposits.md).

# Custody Deposits

Transfer the selected asset from its external network to an assigned custody address, then confirm credit in the user's **Spot account**. Unlike a bridge deposit, the sender transfers to that address rather than calling a bridge contract. Custody deposits credit Spot directly; no ValueChain EVM-to-Spot transfer is required.

## 1. Select the route

From [Asset Configuration](/documentation/for-developers/api-reference/mirror-api/asset-configuration.md), select a `chains` entry whose `custody.allowDeposit` is `true`. Use its exact `chainName`. `custody.minDepositAmount` is the **amount that must arrive**, in human-readable asset units. Source-network fees are extra; if the received amount is below the minimum, the deposit can be rejected or stay `Processing`.

Do not reuse a custody address from another `chainName` or asset. A valid destination for one route is not valid for another.

## 2. Obtain and verify the address

Create or query the destination and verify it on ValueChain as described in [Generate Custody Address](/documentation/for-developers/developers/mirror-protocol/generate-address.md). Do not transfer until API `status` is `Enabled` and the address is an exact string in `getDepositWalletList` on SoDexTokenCustody.

The deposit-address object has only `chain`, `address`, and `status`. It does not include a memo or tag. Do not invent a tag or derive one from the user's EVM address. If the destination network requires a memo or tag and you do not have it from the custody assignment, do not open the transfer. See [Custody addresses](/documentation/for-developers/developers/mirror-protocol/lifecycle.md#custody-addresses).

## 3. Transfer from the external network

In the source wallet or exchange, select the same asset and the network that matches `chainName` (for example `TON` is not an EVM network). Send to the verified address. Save the source-network transaction hash.

The transfer is performed by that wallet or exchange, not by the address-creation API. No bridge approval or bridge call is required.

## 4. Track the deposit

Query [Deposit status](/documentation/for-developers/api-reference/mirror-api/history-and-status.md#deposit-status) with the saved hash and the same `chainName`:

```bash
curl -sS --get "https://mainnet-gw.sodex.dev/api/v1/user/deposit/status" \
  --data-urlencode "chain=$CHAIN" \
  --data-urlencode "txHash=$SOURCE_TX_HASH" \
  -H "Accept: application/json"
```

* If `chain` does not match the indexed record, the API returns an empty result, not an error.
* The same `txHash` can match several records with different `n`. Inspect every `data.records` entry, including `status`, `failCode`, and `failReason`.
* Empty records or `Processing` do not confirm credit.

Confirm the deposited asset in the user's [Spot balance](/documentation/for-developers/api-reference/trading-api/rest-v1/sodex-rest-spot-api.md#query-balances). Custody deposits do not credit the ValueChain EVM wallet or Perps directly. Do not send a second transfer to retry a status query.

{% content-ref url="/pages/fXAuQpVLw3SIeFHTMrHO" %}
[Generate Custody Address](/documentation/for-developers/developers/mirror-protocol/generate-address.md)
{% endcontent-ref %}

{% content-ref url="/pages/CMCc0kXoVuQVc5eMRSUw" %}
[History & Status](/documentation/for-developers/api-reference/mirror-api/history-and-status.md)
{% endcontent-ref %}

{% content-ref url="/pages/na8o9MAsQDanoJmg0eZW" %}
[Mirror Protocol Lifecycle](/documentation/for-developers/developers/mirror-protocol/lifecycle.md)
{% endcontent-ref %}
