Para desarrolladores / Activos del mundo real

Activos del mundo real

La capa es una capa de precios. 33 feeds, 19 de ellos activos del mundo real, publicados dentro del protocolo y legibles con una sola llamada. Esta página explica cómo obtener la lista; la siguiente, cómo leer un precio.

Qué existe

La documentación en lenguaje claro describe tres capas. Exactamente una de ellas tiene código en este repositorio, y esta referencia documenta esa.

CapaEstado
A price, published in the protocolbuilt, and documented here33 feeds written by block production into a registry predeploy, with one Chainlink-shaped adapter per feed
Exposure to a priced assetdesigned, not present in this repositorya margin system denominated by a feed, with crypto collateral and crypto settlement. There is no contract to call
A registry admitting third-party tokenised assets as collateraldesigned, not present in this repositorywith risk parameters and haircuts. Pickle would admit such a token, not issue one

Así que: hay precios, y hay contratos que los guardan y los sirven. No hay motor de margen, ni registro de colateral, ni contrato de posición al que llamar. Cuando existan, se documentarán aquí como superficies de llamada, no como intenciones.

Un precio, no el activo

A feed is the PRICE of a real-world asset. It is not the asset.

The chain publishes a number describing what something trades at somewhere else. It issues no tokenised share, holds no underlying instrument, offers no redemption and keeps no custody. Exposure measured against one of these prices is a claim on a margin system, not on an issuer, and this reference does not call it a tokenised asset. Nothing about a feed confers a shareholder right, and there is nothing to redeem.

Name it accordingly in your own interface. A contract reading XAU/USD is reading the price of gold; it is not holding gold, and a user who reads otherwise has been told something untrue.

Esto es una afirmación sobre lo que hace la cadena, no una cláusula de descargo atornillada encima. Nada en el registro referencia a un emisor, un custodio o una reserva, porque no hay ninguno: Pickle no emite ningún activo del mundo real y no tiene ninguno. Un feed llamado AAPL/USD es un número que describe a cuánto se negocia esa acción en un mercado de otro lugar, publicado en esta cadena y nada más.

Obtener la lista de activos

Tres vías, y la primera es casi siempre la correcta. No necesita ABI, ni dirección, ni clave.

VíaLlamada
Over JSON-RPCpickle_pricesno params. Answers the whole registry: every feed with its symbol, feedId, adapter, decimals, class, policy, latest answer and age. One call, no ABI, no address
From a contractfeedCount() then feeds(offset, limit)on the price registry. limit is capped at 256; an offset past the end returns an empty array rather than reverting, so a reader can page blindly
From the sourceoracle/catalog.jsonthe live feed set in the repository: what the oracle service prints and what l2-feeds-init (scripts/sync-feeds.sh) reconciles the registry to. The authority for what the chain should hold after a sync, not proof of what it holds now
The genesis inputoracle/catalog-genesis.jsonthe frozen copy the genesis allocation was generated from, and the authority for what the chain was born with. It is never edited on its own: a change to it is a genesis regeneration, a new chain
bash
# Every feed the chain carries, with its adapter, decimals, answer and age.
curl -s $RPC_URL \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"pickle_prices","params":[]}' \
  | jq '.result.feeds[] | {symbol, feedId, adapter, decimals, price, statusName, staleOnchain}'

# The count alone, when you only want to know whether the catalog changed.
curl -s $RPC_URL \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"pickle_prices","params":[]}' \
  | jq '.result.feeds | length'

$RPC_URL es el punto de acceso de los parámetros de red. La respuesta lleva también blockNumber, timestamp, y el publisher y el owner que nombra el registro - léalos si quiere saber quién pudo haber escrito lo que acaba de leer.

El catálogo es estado del registro, no una constante

El conjunto de génesis de abajo es aquel con el que nació la cadena. Después se pueden añadir feeds desde el rol propietario, así que un cliente que fije la lista en el código se los perderá. Pagine el registro o llame a pickle_prices y trabaje a partir de la respuesta.

Los 33 feeds

Clase de activoCantidad
crypto14 feedsclass 1. ETH, BTC, SOL, XRP, DOGE, LINK, ADA, XLM, BCH, TRX, BNB, HYPE, ZEC, XMR - all quoted in USD
equity9 feedsclass 2. AAPL, MSFT, NVDA, AMZN, GOOGL, META, TSLA, SPY, JPM
commodity2 feedsclass 3. XAU/USD and XAG/USD - gold and silver
fx5 feedsclass 4. EUR/USD, GBP/USD, USD/JPY, USD/CHF, USD/CNH
index3 feedsclass 5. PYTHOIL/USD, BRENT/USD, NATGAS/USD - energy indices, which trade around the clock

19 de los 33 son activos del mundo real. La separación que cuenta en la práctica es otra: 13 feeds se respaldan en mercados spot y 20 vienen solo de Pyth - es decir, todos los feeds del mundo real más XMR/USD, el único par cripto sin pata de mercado.

SímboloClaseFuentesPolítica de publicaciónMercado
ETH/USDcripto5 mercados + PytheveryBlocksiempre abierto
BTC/USDcripto5 mercados + PytheveryBlocksiempre abierto
SOL/USDcripto5 mercados + PytheveryBlocksiempre abierto
XRP/USDcripto5 mercados + PytheveryBlocksiempre abierto
DOGE/USDcripto5 mercados + PytheveryBlocksiempre abierto
LINK/USDcripto5 mercados + PytheveryBlocksiempre abierto
ADA/USDcripto5 mercados + Pyth10 bps / 60 ssiempre abierto
XLM/USDcripto5 mercados + Pyth10 bps / 60 ssiempre abierto
BCH/USDcripto5 mercados + Pyth10 bps / 60 ssiempre abierto
TRX/USDcripto5 mercados + Pyth10 bps / 60 ssiempre abierto
BNB/USDcripto5 mercados + PytheveryBlocksiempre abierto
HYPE/USDcripto5 mercados + PytheveryBlocksiempre abierto
ZEC/USDcripto5 mercados + Pyth10 bps / 60 ssiempre abierto
XMR/USDcriptosolo Pyth10 bps / 60 ssiempre abierto
AAPL/USDaccionessolo PytheveryBlockhorario del NYSE
MSFT/USDaccionessolo Pyth10 bps / 300 shorario del NYSE
NVDA/USDaccionessolo PytheveryBlockhorario del NYSE
AMZN/USDaccionessolo PytheveryBlockhorario del NYSE
GOOGL/USDaccionessolo Pyth10 bps / 300 shorario del NYSE
META/USDaccionessolo PytheveryBlockhorario del NYSE
TSLA/USDaccionessolo PytheveryBlockhorario del NYSE
SPY/USDaccionessolo Pyth10 bps / 300 shorario del NYSE
JPM/USDaccionessolo Pyth10 bps / 300 shorario del NYSE
XAU/USDmaterias primassolo PytheveryBlocksesión con pausa diaria
XAG/USDmaterias primassolo Pyth5 bps / 300 ssesión con pausa diaria
PYTHOIL/USDíndicesolo Pyth10 bps / 300 ssiempre abierto
BRENT/USDíndicesolo Pyth10 bps / 300 ssiempre abierto
NATGAS/USDíndicesolo Pyth10 bps / 300 ssiempre abierto
EUR/USDdivisassolo Pyth2 bps / 300 ssemana de divisas
GBP/USDdivisassolo Pyth2 bps / 300 ssemana de divisas
USD/JPYdivisassolo Pyth2 bps / 300 ssemana de divisas
USD/CHFdivisassolo Pyth2 bps / 300 ssemana de divisas
USD/CNHdivisassolo Pyth2 bps / 300 ssesión con pausa diaria
  • 5 mercados + Pyth. five spot venues, with a Pyth feed alongside as a cross-check and a stand-in
  • Solo Pyth. Pyth only - no venue is listed for this feed, so an absent Pyth credential leaves it unpublished

Columna Mercado: siempre abierto - open every day, all day; horario del NYSE - 09:30-16:00 New York, Monday to Friday, with the exchange holiday list; semana de divisas - continuous Monday to Friday afternoon New York, closed Saturday, reopening Sunday evening; sesión con pausa diaria - a nearly-continuous session with a daily break and a closed Saturday. Los calendarios son el asunto de los horarios de mercado, y atenderlos no es opcional.

Cinco políticas de publicación, no treinta y tres

PolíticaFeeds
everyBlock, no step capETH/USD, BTC/USD, SOL/USD, XRP/USD, DOGE/USD, LINK/USD, BNB/USD, HYPE/USDwritten on every EVM block the publisher can fill. No deviation trigger, no heartbeat, no step cap - the whole crypto class carries a step cap of 0 whether or not it is on this policy. Ring capacity 16,384 for ETH/USD and BTC/USD, 1,024 for the other six
everyBlock, with step capAAPL/USD, NVDA/USD, AMZN/USD, META/USD, TSLA/USD, XAU/USDthe six real-world feeds moved onto everyBlock still carry their class's step cap (2,000 bps for the equities, 1,000 bps for gold), so a move wider than that is skipped unless the market status changed in the same update. Ring capacity 1,024
10 bps / 60 sthe other 6 crypto feedsrepublished on a 10 bps move or after 60 s, whichever is first. No step cap. Ring capacity 1,024
10 bps / 300 s, step 2,000 bpsthe 4 remaining equities and the 3 energy indicesa move wider than 20 % is skipped by the contract unless the market status changed in the same update
5 bps / 300 s, step 1,000 bpsXAG/USDthe metal moves less, so the trigger is tighter and the implausible-move cap is 10 %. XAU/USD kept the same trigger shape until it moved to everyBlock
2 bps / 300 s, step 500 bpsthe 5 FX pairsthe tightest trigger in the set, and a 5 % cap - an FX pair that moves further in one update is not moving, it is wrong

El tope de salto es la fila que más se malinterpreta. Vale 0, y por tanto está desactivado, en todos los feeds cripto, y está activo en todos los feeds del mundo real - así que una actualización del mundo real que se mueva más allá del tope en un solo salto la omite el contrato en lugar de escribirla, salvo que el estado de mercado haya cambiado en esa misma actualización. Esa excepción es lo que deja aterrizar un hueco de fin de semana.

Qué lleva la ficha de un feed

CampoValor en el conjunto de génesis
symbolBASE/QUOTE^[A-Z0-9.]+/[A-Z]+$, at most 32 bytes, unique. The contract enforces the same shape
descriptionfree textthe Chainlink-style spaced form, "ETH / USD"; description() returns it and symbol() returns the canonical one
assetClasscrypto | equity | commodity | fx | indexstored as 1-5
decimals8every feed in the catalog. The field allows 0-18, so read it rather than assuming
capacityring length in rounds16,384 for ETH/USD and BTC/USD, 1,024 for every other feed - including the twelve other feeds now on everyBlock. Rounds older than this are overwritten
policypaused | everyBlock | deviationstored as 0, 1, 2. A paused feed is skipped rather than refused
deviationBps10, 5 or 2the move that triggers a republish. 0 on an everyBlock feed, which needs no trigger
heartbeatSecs60 or 300republish even without a move. 0 on an everyBlock feed
maxStepBps0, 500, 1,000 or 2,000the contract skips a move wider than this. 0 disables the check and is what every crypto feed carries; every real-world feed has it live. Bypassed whenever the status changed
minSources3 on an exchange-backed feed, 1 on a Pyth-only feedthe floor below which nothing is published
sources{ exchanges: {venue: productId}, pyth: id }the venue-native product id per venue, and the Pyth feed id without its 0x

Esos mismos campos son la configuración del feed en cadena, así que lo que lee de pickle_prices o de feeds(offset, limit) es esa ficha más la última ronda. decimals vale 8 en todos los feeds hoy y el campo admite de 0 a 18: léalo en lugar de suponerlo, porque el coste de equivocarse es un precio errado en ocho órdenes de magnitud.

Los identificadores de feed

Un feed se indexa por un hash de su símbolo, no por un índice y no por una dirección:

solidity
bytes32 feedId = keccak256(bytes("ETH/USD"));

The canonical symbol, upper case, with a single slash - keccak256("ETH/USD"), not "ETH-USD" and not "eth/usd". The same 32 bytes key the contract's mappings, name the feed on the RPC, and appear as the indexed topic of every FeedUpdated log. You can compute it offline with any keccak-256 implementation; nothing has to be fetched to know it.

The node and the service both accept ETH/USD, ETH-USD, eth-usd or 0x<64 hex feed id and normalise before looking up, so a URL-safe spelling costs nothing.

Resolver las direcciones

Esta referencia no imprime ninguna dirección de contrato

El registro y los adaptadores por feed son predespliegues canónicos, fijados en la génesis para toda la vida de la cadena - que es justo el caso en el que publicar el literal es lo peor. Un CALL de la EVM a una cuenta sin código tiene éxito: una dirección mal escrita no hace revert, no devuelve nada y se lee como un precio de cero. Por eso este sitio documenta en su lugar el mecanismo de resolución.

The price registry and one adapter per feed are predeploys: their addresses are fixed at genesis and canonical for the life of the chain. That is precisely why this reference resolves them instead of printing them.

  • pickle_prices answers with the registry's address in core and each feed's adapter in feeds[].adapter, checksummed. That is the shortest path and it needs no ABI.
  • pickle_price(feed) carries that feed's adapter; pickle_ethUsdPrice carries the adapter, the registry and, under contract, the adapter again, which is what a Chainlink reader should be pointed at.
  • On chain, adapterOf(feedId) returns the deployed adapter and adapterAddress(feedId) recomputes it: the adapter is CREATE2 from the registry with salt = feedId, so its address is a pure function of the registry address and the symbol.
  • The first-party applications resolve every address they use at runtime rather than compiling one in - shared-ui/config.js merges the deployment's address files into config.addresses at load.
  • The explorer shows that address as an account, with its code and its activity, which is the human-readable cross-check that something is deployed there. It publishes no source and no ABI: the repository is not public yet, and the explorer verifies no contract.
bash
# The registry and one feed's adapter, resolved from the chain itself.
curl -s $RPC_URL \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"pickle_price","params":["ETH-USD"]}' \
  | jq '{adapter: .result.adapter, feedId: .result.feedId}'

# Then prove the address has code before you call it.
curl -s $RPC_URL \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_getCode","params":["<adapter>","latest"]}'

Verify a resolved address with an eth_getCode before your first call. A CALL to an account with no code succeeds and returns nothing, so a wrong address does not revert - it reads as a price of zero.