RPC del nodo

xrs-node 0.1.1puerto 5600148 rutas

Cuatro rutas escriben; el resto lee.

Base

URL basehttp://<host>:56001
transporteHTTP/1.1, sin TLS
CORS*
cuerpoJSON
errores{"error":"…"}, HTTP 200; 501 solo en los stubs de gobernanza y claim
tasa de escritura30 por minuto por IP
cuerpo de escritura256 KiB
cuerpo del planificador16 KiB
lecturassin límite
importeslamports salvo que la clave termine en _xrs
importes de tokenslos decimals del token

Escritura

RutaPrimera instrucciónComprobaciones previasÉxito
POST /submitcualquieraadmisión{"status": "ok", "signature"}
POST /stakeStakefirmante = pubkey; saldo ≥ importe; clave del roster en mainnet{"status": "queued", "staked", …}
POST /unstakeUnstakestake ≥ importe; retirar todo o conservar ≥ 1,000 XRS; al menos 1 XRS{"status": "queued", "unstaked", "unbonding_period_slots": 151200}
POST /pq-registerPqKeyRegisterfirmante = ed25519_pubkey{"status": "queued", "ed25519_pubkey"}

Cuerpo de las cuatro: {"tx_base64":"…"}, la transacción bincode en base64 (sobre).

curl -s -X POST http://138.197.116.81:56001/submit \ -H 'Content-Type: application/json' \ -d '{"tx_base64":"<base64>"}' # {"status":"ok","signature":"<base58>"} | {"error":"…"}
await client.sendInstruction(wallet, ix); // POST /submit await client.stakeXrs(wallet, 1000); // POST /stake await client.unstakeXrs(wallet, 1000); // POST /unstake // POST /pq-register, clave de 1,952 bytes await client.pqKeyRegister(wallet, pqPublicKey, 'dilithium3', 3);

Admisión

límite de tasaRate limited. Max 30 write RPCs per minute per IP.
base64Invalid base64 encoding
bincodeFailed to deserialize transaction
firmaTransaction validation failed: Invalid transaction signature
número de instruccionesTransaction validation failed: Too many instructions in transaction
tamaño de instrucciónTransaction validation failed: Instruction data exceeds size limit
transferencia legacyTransaction validation failed: Legacy SystemInstruction::Transfer is disabled
SubDelegateTransaction validation failed: SubDelegate is disabled (XWC-82)
federaciónPublic self-staking is closed during federated beta
ya en cadenaTransaction already processed
ya en el mempoolTransaction already in mempool
blockhashTransaction rejected: recent_blockhash expired or unknown
pagador sin saldo para la tarifa, cuota llena"status":"rejected_underfunded_quota"
pool lleno"status":"rejected_mempool_full"
El hint /v2/recent_blockhash no existe. Usa JSON-RPC getLatestBlockhash, puerto 50008.

Cadena y stake

GET /health{"status":"ok"}
GET /blocks50 bloques más recientes, hashes como arrays de bytes
GET /stake/{address}stake, isValidator (≥ 1,000 XRS), earns_staking_rewards (≥ 100 XRS), 7 % APR estimado
GET /account/{address}/unstakingsessions[]; *_time = slot × 4 s
GET /network/economicsemisión, recompensa por bloque, halving, tarifas, totales de staking
curl -s http://138.197.116.81:56001/network/economics # {"chain_height":…,"current_block_reward_xrs":10.0, # "emission_cap_xrs":500000000.0,"base_tx_fee_xrs":0.001,…}

Tokens

GET /tokens{"tokens":[…]}, sin paginar
GET /token/balance/{address}/{token_id}balance, token_info
GET /token/accounts/{address}native_xrs (lamports), token_accounts[]

Contratos y launchpads

GET /contractscontract_id, type, owner, is_active
GET /contract/{id}contract.state, indexado por tipo
GET /contract/{id}/quote?input_token=&amount=cotización de swap; price_impact_pct es una cadena
GET /contract/{id}/vesting/{wallet}{"vesting":{"enabled":false}}: el deploy rechaza vesting
GET /launchpadstodos los launchpads, el más reciente primero; xeris_fee_bps 77
GET /launchpad/{id}/quote?xrs_amount=tokens_out, tarifas, price_impact_pct (número)

Agentes, capacidades, tareas

GET /agent/registry/{owner}agents[]: límites, gasto, revoked
GET /agent/validate/{agent}/{owner}authorized, revoked, expired, agent
GET /capabilitieslistados activos con identidad activa
GET /tasksopen_tasks, data[]
GET /tasks/{id}un TaskEntry

Planificador

Ruta, actionPeticiónDevuelve
POST /agent/plan{"action":"…",…}variant_index, variant_name, params
transferfrom, to, amount_xrsNativeTransfer, fee, sufficient_balance
swappool_id, token_in, amount_in, slippage_pctContractCall, args como 16 bytes, quote
buy_launchpadlaunchpad_id, xrs_amount, slippage_pctContractCall, args como objeto JSON, quote
stakepubkey, amount_xrsStake
wrap, unwrapamount_xrsWrapXrs, UnwrapXrs

Solo lectura: devuelve qué firmar, nunca firma.

curl -s -X POST http://138.197.116.81:56001/agent/plan \ -H 'Content-Type: application/json' \ -d '{"action":"transfer","from":"<from>","to":"<to>","amount_xrs":1.5}' # {"action":"transfer","variant_index":11,"variant_name":"NativeTransfer", # "params":{"from":"…","to":"…","amount":1500000000},"amount_xrs":1.5, # "fee":1000000,"fee_xrs":0.001,"sender_balance":…, # "sufficient_balance":true}
import { fromPlan } from 'xeris-sdk'; // POST /agent/plan const plan = await client.planTransfer(wallet.publicKey, to, 1.5); await client.sendInstruction(wallet, fromPlan(plan)); // firma y envía

Gobernanza, ZK, PQ

GET /governance/proposalsproposals[]; las marcas de tiempo son slot × 4,000 ms
GET /governance/lock/{address}locked_amount, locked_xrs, delegate
GET /zk/proofs/{identity}proofs[] por remitente
GET /zk/verify/{proof_id}un ZkProofRecord
GET /zk/statstotal_proofs, total_verified
GET /pq/keys/{address}has_pq_key, algorithm, security_level, key_hash, active
GET /pq/statustotal_registered, algorithms, quantum_ready_pct

Precios

GET /price-history?pool_id=&limit=últimos limit (500, ≤ 10,080); uno cada 100 bloques
GET /pools/price-historyúltimos 100 por pool

Local al nodo, no consenso.

Deshabilitado

/airdrop/{address}/{amount}HTTP 200, "status":501
POST /stake/claimHTTP 501
POST /governance/{vote,propose,lock,delegate}HTTP 501, variantes 39–41 en su lugar
POST /token/{mint,transfer,burn,create}HTTP 200, Direct RPC mutation disabled…
POST /contract/{deploy,call}HTTP 200, Direct RPC mutation disabled…
POST /rwa/{create,update_status}HTTP 200, Direct RPC mutation disabled…

Los cambios de estado pasan por /submit.