# Recovering a 1Click refund on HyperCore
> Part of the `hyperliquid-connector` skill. Read `SKILL.md` first. When fetched over HTTP the base is `https://skills.outlayer.ai/hyperliquid-connector/`.
**When this applies.** A `withdraw_start` to `intents` or `confidential` sent
its spot transfer, and 1Click then failed the route and refunded. A refund
from HyperCore goes back on HyperCore — not to your trading account, but to
the wallet's OWN EVM address, a key the connector cannot sign with. The signs:
`withdraw_status` stays `bridging` past its `expires_at` while the intents (or
confidential) balance has not risen, and the wallet's address holds spot USDC.
Nothing is lost: that account is the wallet's. Not yet seen live.
Moving it back is a HyperCore spot transfer signed by the wallet's own key. It
costs no gas: HyperCore takes a signature and an HTTP POST.
1. **The address.** `GET /wallet/v1/address?chain=ethereum` → `address`. The
wallet's EVM address is the same on HyperCore.
2. **What is there.** `POST https://api.hyperliquid.xyz/info`
`{"type": "spotClearinghouseState", "user": "
"}` → the `balances`
entry with `"coin": "USDC"`, its `total`.
3. **The fee.** `POST https://api.hyperliquid.xyz/info`
`{"type": "preTransferCheck", "user": "", "source": ""}`
→ `fee`: `"1.0"` for an account's first outbound transfer, then `"0.0"`.
Send `total − fee`, as a plain decimal string (`"12.35"`).
4. **Where to.** Your trading account — `addresses.trading` from
`{"operation": "status"}`. The money is the connector's again, and a normal
`withdraw_start` takes it on.
5. **Sign** this EIP-712 object with the wallet's own key (no `sub_path`,
`"chain": "arbitrum"`) — the request shape is in
.
`time` is now in milliseconds, and the same number is the nonce below.
```json
{
"domain": {"name": "HyperliquidSignTransaction", "version": "1",
"chainId": 42161,
"verifyingContract": "0x0000000000000000000000000000000000000000"},
"types": {
"EIP712Domain": [{"name": "name", "type": "string"}, {"name": "version", "type": "string"},
{"name": "chainId", "type": "uint256"}, {"name": "verifyingContract", "type": "address"}],
"HyperliquidTransaction:SpotSend": [
{"name": "hyperliquidChain", "type": "string"}, {"name": "destination", "type": "string"},
{"name": "token", "type": "string"}, {"name": "amount", "type": "string"},
{"name": "time", "type": "uint64"}]
},
"primaryType": "HyperliquidTransaction:SpotSend",
"message": {"hyperliquidChain": "Mainnet", "destination": "",
"token": "USDC:0x6d1e7cde53ba9467b783cb7c530ce054",
"amount": "12.35", "time": 1790261829555}
}
```
6. **Send.** Split the 65-byte signature into `r` (bytes 0–31), `s` (32–63)
and `v` (the last byte, 27 or 28; add 27 to a 0 or 1), then
`POST https://api.hyperliquid.xyz/exchange`:
```json
{"action": {"type": "spotSend", "hyperliquidChain": "Mainnet", "signatureChainId": "0xa4b1",
"destination": "", "token": "USDC:0x6d1e7cde53ba9467b783cb7c530ce054",
"amount": "12.35", "time": 1790261829555},
"nonce": 1790261829555,
"signature": {"r": "0x…", "s": "0x…", "v": 27},
"vaultAddress": null}
```
`{"status": "ok"}` means it went; `{"status": "err", …}` means nothing
moved. `{"operation": "status"}` then shows the USDC on your spot.
The `token` is USDC's HyperCore token id (`spotMeta`, `USDC:`); the
`destination` and every field must be exactly as signed, or the signature
recovers to a different account and the venue refuses it.