# Deposit to Hyperliquid

> Fund a Hyperliquid perps account from any supported chain, with a swap your user signs or with a deposit address. USDC (perps) arrives on Hyperliquid through Relay.

Source: https://docs.layerhop.com/guides/hyperliquid

To deposit to **Hyperliquid** from any chain, quote with `dstChain=hyperliquid` and `dstToken=USDC`: LayerHop routes the swap through Relay, and the funds arrive as **USDC in the recipient's Hyperliquid perps balance**, ready to trade. Your user pays with any token Relay routes on an EVM chain (ETH on Ethereum, USDC on Base or Arbitrum…), either by signing one transaction or by sending to a [deposit address](/guides/deposit-addresses).

## What is the Hyperliquid chain in LayerHop?

| | |
|---|---|
| Chain | `hyperliquid`, id `1337` (HyperCore, the exchange itself; not HyperEVM `999`) |
| Addresses | `0x…` EVM-style addresses. The recipient is the user's Hyperliquid account, usually their EVM wallet address. |
| Token | `USDC` (perps balance), **8 decimals**. It is the chain's native coin in LayerHop, so `dstToken=USDC` and `0x0000000000000000000000000000000000000000` both select it. Relay's own address, `0x00000000000000000000000000000000`, is accepted too. |
| Direction | **Destination only.** Withdrawals from Hyperliquid need actions signed on Hyperliquid, which LayerHop doesn't build; `srcChain=hyperliquid` returns [`UNSUPPORTED_CHAIN`](/errors/UNSUPPORTED_CHAIN). `GET /v1/chains` marks it `destinationOnly: true`. |
| Provider | Relay |

Mind the decimals: USDC is 6 decimals on most EVM chains but 8 on Hyperliquid perps. `dstAmount` `"1993799700"` means 19.937997 USDC.

## Deposit with a swap

```bash
curl "https://api.layerhop.com/v1/quote?srcChain=base&srcToken=USDC&amount=20000000\
&dstChain=hyperliquid&dstToken=USDC&sender=0xUser&recipient=0xUser"
```

```ts
const { best } = await lh.quote({
  srcChain: "base", srcToken: "USDC", amount: "20000000",  // 20 USDC (6 decimals)
  dstChain: "hyperliquid", dstToken: "USDC",
  sender: address, recipient: address,                    // the user's Hyperliquid account
});
// best.dstAmount ≈ "1993799700" → 19.937997 USDC (8 decimals) in the perps balance
const tx = await lh.buildTx(best.quoteId);                // approval (if any) + deposit on Base
```

The user signs on the source chain only; Relay delivers to Hyperliquid in seconds. Track it like any other order ([order tracking](/concepts/order-tracking)). The destination transaction hash links to the [Hyperliquid explorer](https://app.hyperliquid.xyz/explorer).

## Deposit with a deposit address

For a "deposit from any chain" button without wallet signing in your app, create a [deposit address](/guides/deposit-addresses) with Hyperliquid as the destination:

```bash
curl -X POST https://api.layerhop.com/v1/deposit-addresses \
  -H "x-api-key: $LAYERHOP_API_KEY" -H "content-type: application/json" \
  -d '{
    "srcChain": "arbitrum", "srcToken": "USDC",
    "dstChain": "hyperliquid", "dstToken": "USDC",
    "recipient": "0xUserHyperliquidAccount",
    "refundTo": "0xUserAddressOnArbitrum"
  }'
```

Every deposit of USDC on Arbitrum to the returned `address` lands in the user's perps balance, with the usual order webhooks.

## Minimums and limits

- **No 5 USDC bridge minimum.** Hyperliquid's own Arbitrum bridge needs at least 5 USDC; deposits through Relay don't use it. Relay quoted deposits well below $1 in our tests, but fees make tiny deposits poor value, so suggest $5 or more.
- **Deposit addresses** need at least $1 of value per deposit, like every route.
- Too small an amount returns [`AMOUNT_TOO_SMALL`](/errors/AMOUNT_TOO_SMALL); retry with more.
- [Gas on arrival](/guides/gas-on-arrival) doesn't apply: trading on Hyperliquid needs no gas token.
- Only the perps USDC balance is a destination today, not spot tokens or HyperEVM (`999` is a separate, regular EVM chain).
