[TOC]

Recentemente, a plataforma FMZ adicionou suporte para Hyperliquid DEX, uma exchange descentralizada de alto desempenho, oferecendo aos usuários mais opções para participar de transações descentralizadas. Atualmente, a função de custódia da plataforma FMZ foi totalmente atualizada para oferecer suporte às transações de contratos spot e perpétuos da Hyperliquid e cobrir todas as funções de API da DEX.
Visão geral da plataforma Hyperliquid
Hyperliquid é uma blockchain L1 de alto desempenho otimizada do zero com a visão de construir um sistema financeiro aberto totalmente on-chain. Os usuários podem criar aplicativos de forma independente, interagindo com componentes nativos eficientes, garantindo ao mesmo tempo uma experiência tranquila para o usuário final.
O desempenho do Hyperliquid L1 é suficiente para suportar um ecossistema sem permissão de aplicativos financeiros. Todos os pedidos, retiradas de pedidos, transações e liquidações são concluídos na cadeia de forma completamente transparente, com atrasos de bloco de menos de 1 segundo. Atualmente, a rede suporta uma capacidade de processamento de até 100.000 pedidos por segundo.
O Hyperliquid L1 usa um algoritmo de consenso personalizado chamado HyperBFT, inspirado no Hotstuff e seus sucessores. Tanto o mecanismo de consenso quanto a arquitetura de rede são otimizados de baixo para cima para atender às necessidades de blockchain de alto desempenho.
Por meio deste guia, esperamos ajudar você a começar rapidamente com a negociação programática e quantitativa da Hyperliquid DEX na plataforma FMZ e descobrir mais oportunidades de negociação.
Protocolo REST
Protocolo Websocket
Na página Adicionar Bolsa da plataforma FMZ, você pode configurar objetos de bolsa à vista e de futuros da Hyperliquid:

Divisão ambiental Como a maioria das exchanges, a Hyperliquid tem um ambiente de testes.
Pela experiência real de uso, a rede principal é relativamente estável e a velocidade também é boa.
Endereço do nó da interface da API do protocolo REST correspondente:https://api.hyperliquid.xyz。
As informações relacionadas à assinatura de mensagens também são diferentes:source == "a",chainId = 42161
A rede de teste frequentemente trava, mas ela é usada apenas como uma interface de teste e para familiarizar-se com as funções de negociação na DEX.
Endereço do nó da interface da API do protocolo REST correspondente:https://api.hyperliquid-testnet.xyz。
As informações relacionadas à assinatura de mensagens também são diferentes:source == "b",chainId = 421614
Assim como o método de conexão de carteira da maioria das exchanges DEX, você pode usar o APP da carteira para escanear o código QR para se conectar ao Hyperliquid (troque a carteira para Arbitrum e escaneie o código para fazer login, a rede de teste e a rede principal são as mesmas) .

Se você quiser se familiarizar com a testnet primeiro, poderá encontrar a faucet diretamente na página da Hyperliquid depois de conectar sua carteira à Hyperliquid.

Você pode reivindicar ativos de teste. Após receber o USDC para teste, clique no botão “Deposit” para depositá-lo no Hyperliquid (é melhor ter algum ETH para a rede de teste Arbitrum).
Clique no botão “Depositar” para depositar, o que requer verificação de carteira e consumirá um pouco de ETH na Arbitrum.
Ao realizar transações manuais na página do Hyperliquid APP, a página gerará automaticamente um endereço de carteira proxy e uma chave privada, que são registrados no navegador e usados para operações como fazer pedidos na página do navegador. Se quisermos fazer programática e quantitativa Como a transação precisa obter essas informações de configuração?
Você pode criar o endereço da carteira proxy necessária e a chave privada correspondente na página da API do Hyperliquid:


1. Dê um nome para a carteira proxy a ser criada.
2. Gere endereço e chave privada.
Configurar o endereço da carteira proxy e a chave privada no FMZ
Então você pode configurar essas informações na plataforma FMZ (a interface de configuração é mencionada acima).
Informações necessárias para configurar o objeto de troca:
Uma vez que a configuração esteja completa, podemos testá-la na plataforma FMZ. Usamos diretamente a “ferramenta de depuração” da plataforma FMZ para prática de teste.
Se você estiver usando um objeto de troca Hyperliquid configurado com informações de testnet, será necessário fazer algumas operações de comutação ao usá-lo, por exemplo:
function main() {
// REST协议API地址切换到测试网
exchange.SetBase("https://api.hyperliquid-testnet.xyz")
// source : a 主网 , b 测试网
exchange.IO("source", "b")
return exchange.GetAccount()
}
A configuração da mainnet não requer a operação de comutação acima. As interfaces de API relacionadas a produtos spot e futuros na bolsa Hyperliquid DEX são quase as mesmas, com apenas pequenas diferenças nos detalhes. Em seguida, usamosInformações de configuração da rede principaleInformações de configuração do Testnetde Futuros HiperlíquidosTroque objetos para testar.
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() retorna as informações de resposta da solicitação de configuração de alavancagem:
{“status”:“ok”,“response”:{“type”:“default”}}
Como os parâmetros da interface da exchange são complexos, não é possível usar o método de codificação de URL para passar os parâmetros.exchange.IOAo chamar uma função, somente strings JSON podem ser passadas como parâmetros. A seguir estão exemplos de chamada de cada interface.
Documentação de referência do 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 função tem restrições: a conta deve atingir o nível de negociação para usar esta função.
Crie um pedido 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, autorize uma nova carteira 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))
}
A autorização retorna com sucesso:
{“status”:“ok”,“response”:{“type”:“default”}}
https://app.hyperliquid-testnet.xyz/APImeio.Retire ativos do cofre.
function main() {
var params = {
"type": "vaultTransfer",
"vaultAddress": "0xAAA",
"isDeposit": true,
"usd": 5000000
}
return exchange.IO("api", "POST", "/exchange", null, JSON.stringify(params))
}
Testnet, retire ativos para a carteira.
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))
}
Transferência de ativos entre spot/futuros (contratos perpétuos).
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 a direção da rotação: futuros -> spot.trueIndica a direção da transferência: spot -> futuros.Endereço da interface WS da rede principal:
Mainnet: wss://api.hyperliquid.xyz/ws
Como a interface da API do protocolo REST não possui uma interface para obter dados de transações recentes, a interface Websocket possui este canal que pode ser assinado.
Estrutura da mensagem de assinatura
{
"method": "subscribe",
"subscription": {
"type": "trades",
"coin": "SOL"
}
}
Exemplo de teste executado no 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("测试结束")
}

Os testes acima são baseados no custodian mais recente. Você precisa baixar o custodian mais recente para dar suporte à exchange Hyperliquid DEX.
Obrigado pelo seu apoio e obrigado pela leitura.