Skip to main content
Skip to main content

HyperCore Perpetuals

Perpetuals such as BTC-USDC-PERP settle through the HYPERCORE_PERP adapter by matched execution. Nothing is custodied: you and the taker each hold margin in your own Hyperliquid perp account. Your quote carries a pre-signed post-only order at your price, and a pre-signed cancel for it. The taker accepts with a pre-signed immediate-or-cancel (IOC) order at the same price and size. Silhouette broadcasts the orders in a fixed sequence and reports what the book did. You end up holding whatever position your order produced, at Hyperliquid.

Silhouette can broadcast only what you signed. It cannot change, re-price, or re-time an order, so any failure that would need a new price ends the RFQ, and the taker opens a new one.

Perp RFQs always use manual acceptance, because the taker must sign its order at your quoted price. A perp RFQ that nobody accepts before auctionEndsAt fails. The taker locks no funds, and baseQty is in Hyperliquid's size units for the asset.

The quote

{
"rfqId": "rfq_0193b6f17c107d6c8000abc123456789",
"instrumentId": "BTC-USDC-PERP",
"side": "BUY",
"settlementMode": "HYPERCORE_PERP",
"makerPays": { "token": "BTC", "amount": "0.5" },
"makerReceives": { "token": "USDC", "amount": "32000" },
"settlement": {
"makerOrder": {
"action": { "type": "order", "orders": [{ "a": 0, "b": false, "p": "64000", "s": "0.5", "r": false, "t": { "limit": { "tif": "Alo" } }, "c": "0x00000000000000000000000000000abc" }], "grouping": "na" },
"nonce": 1716284400123,
"signature": { "r": "0x…", "s": "0x…", "v": 27 }
},
"makerCancel": {
"action": { "type": "cancelByCloid", "cancels": [{ "asset": 0, "cloid": "0x00000000000000000000000000000abc" }] },
"nonce": 1716284400124,
"signature": { "r": "0x…", "s": "0x…", "v": 27 }
}
}
}

The base leg is the size, and the other leg is the notional in the quote token. settlement is required. It holds two signed Hyperliquid exchange actions, each an action, a nonce, and a signature, exactly as Hyperliquid signing tooling produces them. Both must be signed by the perp account registered for you. Silhouette refuses a maker payload signed by any other key, including an API wallet.

makerOrder must be:

  • one limit order, on the side opposite the taker's (b: false against a taker BUY);
  • at your quoted price p, for the full RFQ size s, agreeing with the quote's legs;
  • post-only ("tif": "Alo"), so it rests or is rejected but never crosses;
  • not reduce-only (r: false);
  • tagged with a client order id c.

makerCancel must be one cancelByCloid whose asset and cloid match the order's a and c.

Round the price and size to Hyperliquid's tick and szDecimals rules before you sign. Silhouette checks every one of these rules when you submit and again when the taker accepts, and refuses a quote that breaks any of them.

Execution

When the taker accepts, Silhouette:

  1. Broadcasts your post-only order. If the market has moved through your price, the order is rejected and the RFQ fails.
  2. Broadcasts the taker's IOC. It fills against your order, or against any better-priced order ahead of yours, and cancels its own remainder.
  3. Broadcasts your cancel, on every path, to clear any unfilled part of your order.
  4. Settles the RFQ for the taker's filled size if it is above zero, and fails it otherwise.

The cross is not atomic. If a stranger's better-priced order sits ahead of yours, the taker fills there first and you fill less. If a stranger lifts your order before the IOC lands, you keep that fill and the RFQ fails.

Outcomes

Your quote goes from SUBMITTED straight to SETTLED, with no SELECTED step. A quote the taker did not accept ends NOT_SELECTED or EXPIRED. An accepted quote whose cross fails ends FAILED.

{
"kind": "quoteStatus",
"rfqId": "rfq_0193b6f17c107d6c8000abc123456789",
"quoteId": "qt_0193b6f19a207e448000def987654321",
"instrumentId": "BTC-USDC-PERP",
"side": "BUY",
"status": "SETTLED",
"makerPays": { "token": "BTC", "amount": "0.5" },
"makerReceives": { "token": "USDC", "amount": "32000" },
"receivedAt": 1716284400000,
"settledAt": 1716284401500,
"perpFilledSize": "0.5",
"perpFillAvgPx": "63996"
}

perpFilledSize and perpFillAvgPx are the taker's realised fill. A partial fill reports the partial size. The frame has no txHash, so read your own position and fills from Hyperliquid.

Nonces

Each payload's nonce is the millisecond timestamp you sign it with, and Hyperliquid rejects a nonce that is too old. An acceptance that arrives long after you quoted can therefore fail on a stale nonce. Sign fresh payloads for every quote, and set acceptableForMs so the quote cannot be accepted after its nonces have aged out.

Fees

You pay Hyperliquid's maker fee on the fill, and funding on the position. Silhouette charges you nothing on this adapter. Any builder fee is charged to the taker's order, not yours.

Onboarding

  1. Fund a Hyperliquid perp account. Its key signs your orders and cancels, and Silhouette registers it as your settlement address.
  2. Log in with SIWE from that account and mint credentials.
  3. On testnet, answer a small perp RFQ and confirm both the SETTLED frame and the position at Hyperliquid.