[TOC]

Recientemente, la plataforma FMZ ha agregado soporte para Hyperliquid DEX, un intercambio descentralizado de alto rendimiento, que brinda a los usuarios más opciones para participar en transacciones descentralizadas. Actualmente, la función de custodia de la plataforma FMZ se ha actualizado completamente para admitir las transacciones de contratos al contado y perpetuos de Hyperliquid y cubrir todas las funciones API del DEX.
Descripción general de la plataforma HyperLiquid
Hyperliquid es una cadena de bloques L1 de alto rendimiento optimizada desde cero con la visión de construir un sistema financiero completamente abierto en cadena. Los usuarios pueden crear aplicaciones de forma independiente interactuando con componentes nativos eficientes y garantizando al mismo tiempo una experiencia fluida para el usuario final.
El rendimiento de Hyperliquid L1 es suficiente para soportar un ecosistema de aplicaciones financieras sin permisos. Todos los pedidos, retiros de pedidos, transacciones y liquidaciones se completan en cadena de manera completamente transparente, con retrasos de bloque de menos de 1 segundo. Actualmente, la cadena admite una capacidad de procesamiento de hasta 100.000 pedidos por segundo.
Hyperliquid L1 utiliza un algoritmo de consenso personalizado llamado HyperBFT, que está inspirado en Hotstuff y sus sucesores. Tanto el mecanismo de consenso como la arquitectura de la red están optimizados de abajo hacia arriba para satisfacer las necesidades de la cadena de bloques de alto rendimiento.
A través de esta guía, esperamos ayudarlo a comenzar rápidamente con el comercio programático y cuantitativo de Hyperliquid DEX en la plataforma FMZ y descubrir más oportunidades comerciales.
Protocolo REST
Protocolo WebSocket
En la página Agregar intercambio de la plataforma FMZ, puede configurar objetos de intercambio de futuros y spot de Hyperliquid:

División ambiental Como la mayoría de los intercambios, Hyperliquid tiene un entorno de prueba.
Según la experiencia de uso real, la red principal es relativamente estable y la velocidad también es buena.
La dirección del nodo de interfaz API del protocolo REST correspondiente:https://api.hyperliquid.xyz。
La información relacionada con la firma de mensajes también es diferente:source == "a",chainId = 42161
La red de prueba a menudo falla, pero solo se utiliza como interfaz de prueba y para familiarizarse con las funciones comerciales en DEX.
La dirección del nodo de interfaz API del protocolo REST correspondiente:https://api.hyperliquid-testnet.xyz。
La información relacionada con la firma de mensajes también es diferente:source == "b",chainId = 421614
Al igual que el método de conexión de billetera de la mayoría de los intercambios DEX, puede usar la aplicación de billetera para escanear el código QR para conectarse a Hyperliquid (cambie la billetera a Arbitrum y escanee el código para iniciar sesión, la red de prueba y la red principal son las mismas) .

Si primero desea familiarizarse con la red de prueba, puede encontrar la faucet directamente en la página de Hyperliquid después de conectar su billetera a Hyperliquid.

Puedes reclamar activos de prueba. Después de recibir los USDC para la prueba, haz clic en el botón “Depositar” para depositarlos en Hyperliquid (es mejor tener algo de ETH para la red de prueba de Arbitrum).
Haga clic en el botón “Depositar” para depositar, lo que requiere verificación de billetera y consumirá un poco de ETH en Arbitrum.
Al realizar transacciones manuales en la página de la aplicación Hyperliquid, la página generará automáticamente una dirección de billetera proxy y una clave privada, que se registran en el navegador y se utilizan para operaciones como realizar pedidos en la página del navegador. Si queremos realizar transacciones programáticas y cuantitativas ¿Cómo necesita la transacción obtener esta información de configuración?
Puede crear la dirección de billetera proxy requerida y la clave privada correspondiente en la página de API de Hyperliquid:


1. Dale un nombre a la billetera proxy que se creará.
2. Generar dirección y clave privada.
Configurar la dirección de la billetera proxy y la clave privada en FMZ
Luego puedes configurar esta información en la plataforma FMZ (la interfaz de configuración se menciona arriba).
Información necesaria para configurar el objeto de intercambio:
Una vez completada la configuración, podemos probarla en la plataforma FMZ. Para la práctica de pruebas, utilizamos directamente la “herramienta de depuración” de la plataforma FMZ.
Si está utilizando un objeto de intercambio Hyperliquid configurado con información de red de prueba, deberá realizar algunas operaciones de conmutación al usarlo, por ejemplo:
function main() {
// REST协议API地址切换到测试网
exchange.SetBase("https://api.hyperliquid-testnet.xyz")
// source : a 主网 , b 测试网
exchange.IO("source", "b")
return exchange.GetAccount()
}
La configuración de la red principal no requiere la operación de conmutación anterior. Las interfaces API relacionadas con los productos spot y futuros en el intercambio Hyperliquid DEX son casi las mismas, con solo ligeras diferencias en los detalles. A continuación, utilizamosInformación de configuración de la red principalyInformación de configuración de la red de pruebade Futuros hiperlíquidosIntercambiar objetos para probar.
function main() {
var markets = exchange.GetMarkets()
if (!markets) {
throw "get markets error"
}
var tbl = {
type: "table",
title: "test markets",
cols: [
"key", "Symbol", "BaseAsset", "QuoteAsset", "TickSize", "AmountSize", "PricePrecision", "AmountPrecision", "MinQty",
"MaxQty", "MinNotional", "MaxNotional", "CtVal", "CtValCcy"
],
rows: []
}
for (var symbol in markets) {
var market = markets[symbol]
tbl.rows.push([
symbol, market.Symbol, market.BaseAsset, market.QuoteAsset, market.TickSize, market.AmountSize,
market.PricePrecision, market.AmountPrecision, market.MinQty, market.MaxQty, market.MinNotional, market.MaxNotional, market.CtVal, market.CtValCcy
])
}
LogStatus("`" + JSON.stringify(tbl) + "`")
}

function main() {
var depth = exchange.GetDepth("ETH_USD.swap")
var asks = depth.Asks
var bids = depth.Bids
Log("买3", bids[2])
Log("买2", bids[1])
Log("买1", bids[0])
Log("卖1", asks[0])
Log("卖2", asks[1])
Log("卖3", asks[2])
}

function main() {
var account = exchange.GetAccount()
return account
}

function main() {
var symbols = ["ETH_USD.swap", "XRP_USD.swap", "HYPE_USD.swap"]
var arrDir = ["market_buy", "sell", "buy"]
var markets = exchange.GetMarkets()
var ids = []
for (var i in symbols) {
var symbol = symbols[i]
var side = arrDir[i]
var ticker = exchange.GetTicker(symbol)
var info = markets[symbol]
exchange.SetPrecision(info.PricePrecision, info.AmountPrecision)
// USDC
var qty = 15
var price = null
var amount = null
if (side == "market_buy") {
price = -1
side = "buy"
amount = qty / ticker.Last
} else {
price = side == "buy" ? ticker.Last * 0.9 : ticker.Last * 1.1
amount = qty / price
}
var id = exchange.CreateOrder(symbol, side, price, amount)
ids.push(id)
}
var tbl = {type: "table", title: "test", cols: ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], rows: []}
for (var id of ids) {
var order = exchange.GetOrder(id)
tbl.rows.push([order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType])
Sleep(500)
}
LogStatus("`" + JSON.stringify(tbl) + "`")
}

function main() {
var orders = exchange.GetOrders("USD.swap")
for (var order of orders) {
exchange.CancelOrder(order.Id, order)
Sleep(1000)
}
var tbl = {type: "table", title: "test", cols: ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], rows: []}
for (var order of orders) {
tbl.rows.push([order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType])
}
LogStatus("`" + JSON.stringify(tbl) + "`")
}

function main() {
// 设置当前为全仓
exchange.IO("cross", true)
// 设置杠杆
exchange.SetMarginLevel("ETH_USD.swap", 10)
return exchange.GetRawJSON()
}

exchange.GetRawJSON() devuelve la información de respuesta de la solicitud de configuración de apalancamiento:
{“status”:“ok”,“response”:{“type”:“default”}}
Dado que los parámetros de la interfaz del intercambio son complejos, no es posible utilizar el método de codificación de URL para pasar los parámetros.exchange.IOAl llamar a una función, solo se pueden pasar cadenas JSON como parámetros. A continuación, se muestran ejemplos de llamadas a cada interfaz.
Documentación de referencia de Hyperliquid: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#place-an-order
var params = {"type": "scheduleCancel", "time": new Date().getTime()}
return exchange.IO("api", "POST", "/exchange", null, JSON.stringify(params))
{“status”:“err”,“response”:“Cannot set scheduled cancel time until enough volume traded. Required: \(1000000. Traded: \)174.57424.”}
Esta función tiene restricciones: la cuenta debe alcanzar el nivel comercial para utilizar esta función.
Crear una orden TWAP.
function main() {
var params = {
"type": "twapOrder",
"twap": {
"a": 0,
"b": true,
"s": "1",
"r": false,
"m": 10,
"t": false
}
}
// SOL_USDT.swap , 订单量 : 1 , twapOrder 订单有头寸要求,最少100美元价值
// a : 0 , 即 SOL_USDT.swap 这个品种
return exchange.IO("api", "POST", "/exchange", null, JSON.stringify(params))
}
Cancelar pedido TWAP.
function main() {
var params = {
"type": "twapCancel",
"a": 0,
"t": 3805
}
return exchange.IO("api", "POST", "/exchange", null, JSON.stringify(params))
}
Testnet, autoriza una nueva billetera proxy.
function main() {
var params = {
"type": "approveAgent",
"hyperliquidChain": "Testnet",
"signatureChainId": "0x66eee",
"agentAddress": "0xAAAA",
"agentName": "test02",
"nonce": new Date().getTime()
}
return exchange.IO("api", "POST", "/exchange", null, JSON.stringify(params))
}
La autorización se devuelve correctamente:
{“status”:“ok”,“response”:{“type”:“default”}}
https://app.hyperliquid-testnet.xyz/APImedio.Retirar activos de la bóveda.
function main() {
var params = {
"type": "vaultTransfer",
"vaultAddress": "0xAAA",
"isDeposit": true,
"usd": 5000000
}
return exchange.IO("api", "POST", "/exchange", null, JSON.stringify(params))
}
Testnet, retira activos a la billetera.
function main() {
var params = {
"type": "withdraw3",
"hyperliquidChain": "Testnet",
"signatureChainId": "0x66eee",
"amount": "5",
"time": new Date().getTime(),
"destination": "0xAAA"
}
return exchange.IO("api", "POST", "/exchange", null, JSON.stringify(params))
}
Transferencia de activos entre spot/futuros (contratos perpetuos).
function main() {
var params = {
"type": "usdClassTransfer",
"hyperliquidChain": "Testnet",
"signatureChainId": "0x66eee",
"amount": "5",
"toPerp": false,
"nonce": new Date().getTime()
}
return exchange.IO("api", "POST", "/exchange", null, JSON.stringify(params))
}
falseIndica la dirección de rotación: futuros -> spot.trueIndica la dirección de transferencia: spot -> futuros.Dirección de la interfaz WS de la red principal:
Mainnet: wss://api.hyperliquid.xyz/ws
Dado que la interfaz API del protocolo REST no tiene una interfaz para obtener datos de transacciones recientes, la interfaz Websocket tiene este canal al que se puede suscribir.
Estructura del mensaje de suscripción
{
"method": "subscribe",
"subscription": {
"type": "trades",
"coin": "SOL"
}
}
Ejemplo de prueba ejecutada en el depurador:
function main() {
var loopCount = 20
var subMsg = {
"method": "subscribe",
"subscription": {
"type": "trades",
"coin": "SOL"
}
}
var conn = Dial("wss://api.hyperliquid.xyz/ws")
conn.write(JSON.stringify(subMsg))
if (conn) {
for (var i = 0; i < loopCount; i++) {
var msg = conn.read(1000)
if (msg) {
Log(msg)
}
}
}
conn.close()
Log("测试结束")
}

Las pruebas anteriores se basan en el último custodio. Debe descargar el último custodio para admitir el intercambio DEX Hyperliquid.
Gracias por su apoyo y gracias por leer.