Para desarrolladores / API de las aplicaciones

API de las aplicaciones

Cuatro servicios de primera parte se sitúan junto a la cadena. Ninguno es la cadena, ninguno está versionado, y cada uno falla a su manera - y para eso está esta sección.

Qué son

La interfaz de la cadena es el JSON-RPC. Todo lo que aparece en estas páginas es algo que una aplicación se construyó para sí misma y después dejó accesible: un índice Postgres sobre el spool de logs del secuenciador, un proceso que guarda una clave, un bucle de juego. Son cómodos, son de primera parte, y no son autoritativos.

Una lectura aquí no es una lectura de la cadena

Cada cifra de aquí ha pasado por un indexador, por una caché, o por ambos. Un indexador detenido sigue respondiendo con su último estado y ningún campo de la respuesta lo dice; las únicas rutas que lo cuentan son las de salud, y hay que preguntarles. Si la respuesta decide dinero, lea la cadena.

A read-only view of what the Pepper indexer has derived from the chain's logs: constant-product pools, concentrated pools, swaps, liquidity events and positions. It reads Postgres rather than the chain, deliberately.

Pila
Python, standard-library ThreadingHTTPServer, psycopg pool of at most 8 connections, HTTP/1.1
Montado en
/api/ on the Pepper origin

The archive the node deliberately is not. Blocks, mini-blocks, transactions, receipts, logs, call traces, decoded transfers, accounts, tokens, NFTs and the name-service record, all from a Postgres index fed by the sequencer's own log spool.

Pila
Python, standard-library ThreadingHTTPServer, psycopg pool of at most 12 connections, plus live reads against the node
Montado en
/api/ on the explorer origin

The only first-party service that WRITES to the chain. It holds the faucet operator key and submits the drip on your behalf, which is why the page needs no wallet.

Pila
Python, standard-library SimpleHTTPRequestHandler serving a static site as well as the API, signing with eth-account
Montado en
its own origin; the home origin re-exposes two of its routes

A WebSocket server for the games, with a small HTTP surface beside it for health and for the figures the site's chrome draws. The socket is the interface; the HTTP routes are a snapshot of it.

Pila
Node, `ws` in noServer mode behind a plain http server, one event loop for eight game rooms
Montado en
/api/ and /ws/ on the arcade origin

Dónde responden

ServicioURL de base
API del exploradorhttps://explorer.picklechain.xyz/api/también montada en /api/ por los sitios del servicio de nombres y de la caja de herramientas
API del DEX Pepperhttps://pepper.picklechain.xyz/api/solo mismo origen; un navegador en otro origen no puede llamarla
Faucethttps://faucet.picklechain.xyzel origen de inicio reexpone POST /drip y GET /faucet-status
Arcadehttps://minigame.picklechain.xyz/api/y el socket en wss://minigame.picklechain.xyz/ws/<room>

Ninguno de estos servicios tiene un nombre de host propio. Cada uno es un montaje /api/ sobre el origen de una interfaz, lo que convierte la base pública en un hecho de nginx más que en un hecho del servicio: un despliegue que mueve un sitio mueve su API con él, y la ruta interna sigue siendo la misma. En una pila que usted mismo ejecute, los mismos servicios responden en el bucle invertido, en el puerto que nombra la página de cada uno.

Ningún versionado, en ninguna parte

No hay /v1, ni cabecera de versión, ni política de obsolescencia en ninguno de los cuatro. Tampoco hay documento OpenAPI ni JSON Schema en el repositorio, así que un campo puede cambiar de forma entre dos despliegues sin nada contra lo que comparar. Lea a la defensiva: ignore las claves que no conozca, y no falle por una clave que haya desaparecido.

Autenticación

Ninguno de los cuatro pide autenticación, y la diferencia que importa es lo que cada uno puede hacer sin ella.

  • El explorador, la API del DEX y el arcade no piden ninguna. Son de solo lectura y públicos. El explorador responde 405 a todo POST; la API del DEX no implementa ningún verbo salvo GET.
  • El faucet tampoco pide ninguna, y escribe en la cadena. Esa es toda la razón de que su cuota sea estricta y se reserve antes de firmar nada.

El socket del arcade no tiene autenticación y el proceso guarda una clave

No hay ninguna capa de autenticación delante de él y no se prevé ninguna: el proxy transmite la actualización de conexión y nada más. Lo que lo protege es que toda dimensión de una conexión está acotada - número, origen, tamaño de trama, tasa de mensajes, bytes en búfer - y que todo desbordamiento se descarta en lugar de encolarse. Nada de lo que un cliente diga por ese socket autoriza nada; son los contratos los que deciden quién puede jugar.

Llamar a uno desde un navegador

El CORS se configura servicio por servicio y no se ponen de acuerdo, así que lo primero que hay que establecer es si una página de su origen puede siquiera llamar al que quiere.

  • La API del DEX no envía ninguna cabecera CORS y no tiene manejador OPTIONS. Un fetch de origen cruzado desde un navegador falla en seco mientras la misma petición desde un servidor funciona, que es la forma de fallo que todo el mundo achaca a la red. Póngala tras un proxy, o llámela desde un backend.
  • El explorador y el faucet mantienen listas de permitidos. Un preflight venido de un origen que no está en la lista se rechaza con 403, lo que al menos es una respuesta clara.
  • El arcade comprueba el Origin al actualizar la conexión y rechaza con 403 antes del apretón de manos, así que el socket nunca se abre en lugar de abrirse y quedarse callado.

Límites y paginación

Solo el explorador limita la tasa de peticiones. Los otros tres se apoyan en un acotamiento, en una cuota o en un techo de conexiones.

ServicioLímite
Pepper DEX API`limit` is clamped to 1..500 on every list route and defaults to 50. There is no request-rate limit in the service.
Explorer API300 requests per minute per client address, then 429. Request bodies are capped at 600,000 bytes. Live streams are capped at 32 concurrent.
FaucetQuota is reserved before the transaction is signed: 5 a day per address seen, 2 a day per funded address, 1000 a day in total. Request bodies are capped at 4096 bytes.
Arcade server256 sockets in total and 8 per source address, then the upgrade is refused 429. Inbound frames are 4 KiB at most and rate-limited per socket. A socket more than 512 KiB behind is cut.

Una lista acotada es una lista corta en silencio

Pida mil swaps a la API del DEX y obtendrá quinientos, con un 200 y nada que diga que la respuesta fue cortada. Pida doscientos bloques al explorador y obtendrá cien. Ninguno de los dos servicios devuelve un total en la mayoría de las rutas de lista, así que no hay campo con el que comparar la longitud de su página - la única señal de que existe más es haber obtenido exactamente el acotamiento.

Donde existe paginación es limit y offset, no un cursor. Eso quiere decir que una lista que crece por la cabeza se desliza bajo sus pies entre dos páginas: filas ya vistas reaparecen, y filas nunca vistas pueden saltarse. Para todo lo que deba estar completo, pagine por una clave que usted controle - un número de bloque, un hash - en lugar de por offset.

Convenciones

ConvenciónValue
VersioningNone of them is versionedno /v1, no version header, no deprecation policy. A field can change shape between two deployments. Read defensively and pin nothing.
SchemaThere is no OpenAPI documentand no JSON Schema anywhere in the repository. Every shape documented here was read out of a route handler, which is why each record names the line.
Errors{"error": "..."}a human-readable string, occasionally with a second key. There are no error codes and no stable error strings - match on the HTTP status, never on the message.
Cachingcache-control: no-storeon every route of all four services, without exception. Nothing here is safe to cache, and nothing offers you an ETag to revalidate against.
Content typeJSONwith two exceptions: the explorer's logo route returns raw image bytes, and its live route is an event stream.
Unitsnot uniformtoken amounts and wei are DECIMAL STRINGS, not numbers, because they do not survive a double. Mini-block timestamps are in MICROSECONDS. Concentrated-pool swap amounts are SIGNED.

Los importes son cadenas, y algunos vienen con signo

Los importes de tokens, los wei y los saldos vuelven en todas partes como CADENAS decimales, porque no sobreviven a un double. Analícelos con un tipo de entero grande. En las rutas de los pools concentrados los importes además llevan signo - una pata de cada swap es negativa, y eso es lo que dice hacia dónde fue el intercambio - así que una suma que no tome valores absolutos reduce todo un mercado a nada.

javascript
// The shape of a careful call against any of these: a timeout, a status check
// before the body, and a big-integer parse of anything that looks like money.
const res = await fetch(`${BASE}/pools`, { signal: AbortSignal.timeout(5000) });
if (!res.ok) throw new Error(`pools: ${res.status}`);          // never the message
const { pools } = await res.json();                              // an object, not an array
const reserve0 = BigInt(pools[0].reserve0);                      // a decimal string

Cuando uno está caído

Cada uno de los cuatro falla de forma distinta, y solo uno de esos fallos parece un fallo visto desde fuera.

  • La API del DEX responde 503 index not ready cuando la base de datos es inalcanzable o el indexador nunca ha corrido, de modo que las tablas no existen. Ese es el caso honesto. El deshonesto es un indexador que se ha DETENIDO: todas las rutas siguen respondiendo con el estado al que llegó, y solo lagBlocks en /health lo dice.
  • El explorador sigue sirviendo el índice cuando el nodo es inalcanzable, y las partes de una respuesta que exigen una lectura en vivo - un saldo, un registro del servicio de nombres, el saldo pendiente del enrutador de comisiones - vuelven nulas o ausentes en lugar de dar error. El campo indexLag en /stats es la cifra a vigilar.
  • El faucet responde 502 cuando el nodo no contesta, y no se ha firmado nada. Un 503 quiere decir que se ha quedado sin fondos, o que el drip revirtió.
  • El /ready del arcade responde 503 cuando su socket hacia el nodo está caído, o cuando el último minibloque que APLICÓ tiene más de cinco segundos. Medir la llegada en su lugar dejaba que un proceso atascado respondiera 200 sin que nada se moviera.
Reintente el estado, no la escritura

Solo el faucet escribe, y un 502 suyo significa que no se envió nada - ese es seguro de reintentar. Un 503 después de que la transacción haya salido no lo es: el drip puede haber aterrizado y la reserva de cuota ya se ha deshecho, así que sondee la cadena en busca del recibo en lugar de volver a enviar.

Qué está documentado en otra parte

  • The node. Chain state, transactions, logs and subscriptions are JSON-RPC and are documented in this reference's own RPC pages, not here.
  • Contracts. What the pools, the faucet and the games actually do on chain - their functions, their events and their revert reasons - is the contract reference.
  • Prices. Several answers here carry a dollar figure or a price snapshot. Those fields come from a layer this page does not own; read its own reference for what the number means, how old it is and when it is absent.