Skip to main content
Skip to main content

HyperCore Spot

Spot pairs such as HYPE-USDC-SPOT settle through the HYPERCORE_SPOT adapter against Silhouette's HyperCore omnibus, the HyperCore spot account that holds every balance Silhouette custodies there. Each quote is one of two kinds, set per quote by the promised flag:

  • Inventory (promised: false, the default). You already hold the maker token in the omnibus. A win settles on Silhouette's books in the same transaction that selects it, and nothing moves on HyperCore.
  • Promised (promised: true). You do not hold the maker token. A win obliges you to spot-send it to the omnibus within your delivery window.

You hold one quote per RFQ on this adapter. Re-submitting replaces it, and can switch it from one kind to the other.

Your venue account

Your venue account is the HyperCore spot account you deposit from, deliver from, and withdraw to. Silhouette registers it at onboarding. It can be the address you log in with, or a separate one. Every movement of money on this adapter keys on it: your inventory is held against it, and a delivery counts only if it comes from it. Its key must sign every spot-send on this page.

Funding

GET /v1/rfq/funding returns the omnibus address as depositAddress and the HyperCore network as hypercore.chain. To deposit, spotSend the token from your venue account to the omnibus. The deposit credits your available balance on the HYPERCORE rail as soon as Silhouette observes it, with no confirmations to wait for. Subscribe to the balances topic to see it land.

A deposit is credited to whoever sent it. Send directly from your venue account and sign the transfer with its key. A transfer forwarded by an exchange, or relayed by a bridge, is attributed to the intermediary or held for manual review.

To withdraw, call POST /v1/rfq/withdrawals with "rail": "HYPERCORE". It pays a spot-send to your own address, and funds never move between rails. Size the request against the balance line's withdrawable.

Inventory quotes

{
"rfqId": "rfq_0193b6f17c107d6c8000abc123456789",
"instrumentId": "HYPE-USDC-SPOT",
"side": "BUY",
"settlementMode": "HYPERCORE_SPOT",
"makerPays": { "token": "HYPE", "amount": "10" },
"makerReceives": { "token": "USDC", "amount": "200" }
}

Neither kind carries a settlement payload, and a quote that includes one is refused.

An inventory quote is valid only while your available balance of the makerPays token on the HYPERCORE rail covers it. A quote your balance does not cover is never selected, and you receive no push for it. The balance is checked again at selection, so if another win has drawn it down in the meantime, the quote is passed over.

A winning inventory quote produces one quoteStatus frame, SETTLED, with no SELECTED before it. A balanceSnapshot showing both legs follows. The frame has no txHash, because nothing moved on HyperCore.

Promised quotes

A promised quote is the same body with "promised": true. No balance check runs. Its makerPays amount must exceed the token's late-delivery return fee, described under late deliveries and defaults.

The cascade

Inventory and promised quotes compete on price alone. When a promised quote wins, Silhouette builds a cascade chain: the winner at position 0, then every other conforming promised quote, best price for the taker first. Any inventory quotes end NOT_SELECTED. Each position gets its own maker's delivery window, agreed at onboarding and one hour by default, and the windows run back to back:

position 0 (winner) |── window ──|
position 1 (backup) |── window ──|
position 2 (backup) |── window ──|
  • The first position to deliver within its own window settles the RFQ, at that position's quoted price. Every position was checked against the taker's limit when the chain was built.
  • A position that misses its window loses the trade, and the chain moves on.
  • If every window closes without a delivery, the RFQ fails and the taker is refunded.

Once the chain is built, its quotes cannot be re-priced or cancelled.

Frames

The winner receives PENDING_DELIVERY with its window, in unix milliseconds. makerPays is what you owe:

{
"kind": "quoteStatus",
"rfqId": "rfq_0193b6f17c107d6c8000abc123456789",
"quoteId": "qt_0193b6f19a207e448000def987654321",
"instrumentId": "HYPE-USDC-SPOT",
"side": "BUY",
"status": "PENDING_DELIVERY",
"makerPays": { "token": "HYPE", "amount": "10" },
"makerReceives": { "token": "USDC", "amount": "200" },
"receivedAt": 1716284400000,
"windowStartsAt": 1716284400000,
"windowEndsAt": 1716288000000
}

Each backup receives SUBMITTED with its position, counted from 1, and the window its turn would get. If the chain reaches a backup, it receives PENDING_DELIVERY when its window opens. A backup may deliver early: the delivery settles the moment its window opens, or is returned if an earlier position delivers first.

Final statusWho gets itMeaning
SETTLEDThe position that deliveredDone. makerReceives is credited to your available balance on the HYPERCORE rail.
DEFAULTEDThe winner, if its window closed without a deliveryRecorded against you.
NOT_SELECTEDBackups, when an earlier position deliveredNothing owed.
FAILEDBackups, when every window closed without a deliveryNothing owed, and not recorded against you.

Delivering

Deliver with a spotSend from your venue account, signed by its key and submitted to Hyperliquid's exchange endpoint:

{
"type": "spotSend",
"hyperliquidChain": "Mainnet",
"signatureChainId": "0xa4b1",
"destination": "0x6666666666666666666666666666666666666666",
"token": "HYPE:0x0d01dc56dcaaca66ad901c959b4011ec",
"amount": "10",
"time": 1716284405000
}
  • destination is the omnibus address from GET /v1/rfq/funding. The address above is a placeholder.
  • token uses Hyperliquid's <name>:<tokenId> form, and the bare symbol is rejected. Token ids come from Hyperliquid's spotMeta.
  • amount is exactly the quote's makerPays.amount.
  • time is the nonce. If a send times out, retry the identical action with the same nonce.

HyperCore transfers carry no memo, so Silhouette matches a delivery to your quote by sender, token, and exact amount. Any other transfer from you is a deposit. A deposit that happens to equal an open obligation's amount is taken as that delivery, so keep top-ups at sizes no open promise shares. When two open obligations have the same amount, one transfer settles the older. A delivery that landed inside the window counts even if Silhouette observes it late.

Don't rely on the socket alone to know what you owe. GET /v1/rfq/maker/quotes?status=PENDING_DELIVERY lists every delivery still outstanding. Poll it well inside your window, and mark an obligation done only once the send succeeds. An accidental second send is credited back to you as a deposit.

Late deliveries and defaults

Silhouette returns a delivery it cannot use to your venue account automatically. That covers a delivery that arrives after your window closed, and an early backup delivery overtaken by an earlier position. The return is net of a flat per-token fee, about a dollar's worth of the token, set at onboarding.

A winner that misses its window ends DEFAULTED, and the default is recorded against the maker. Silhouette may suspend a maker that defaults. A suspended maker receives no RFQs and cannot withdraw until the default has been reviewed. A backup that lets its window pass is not penalised.

Onboarding

  1. Open a HyperCore spot account to serve as your venue account.
  2. Log in with SIWE and mint credentials. If your venue account is not the address you log in with, tell Silhouette.
  3. If you will quote promised, agree a delivery window. The default is one hour.
  4. If you will quote from inventory, deposit it before you start quoting.
  5. On testnet, take one inventory RFQ and one promised RFQ through to SETTLED.