On-chain

Pushers & oracles

Pushers read prepared prices off the bus, encode them for their oracle, sign, and broadcast. The compressed oracle is registrationless — a feed's identity is packed into its id.

Registrationless feedId

There is no registry and no createOracles step. A feed's 32-byte id is self-describing — creator, chain id, slot and lane packed together — so a push carries everything the contract needs to place it.

feedId = uint160(creator) << 96  |  chainid << 16  |  slot << 8  |  pos

Compressed pusher

Prices are packed into 32-byte slot words (four lanes each) and pushed to the CompressedOracle. Two send modes:

  • broadcast — parallel send to N public RPCs, first-accepted wins; a pool of signing wallets with the anti-drift nonce machine and creator-funded refills. For L2s / altchains.
  • builder_lane — escalating-fee replacement bundles to MEV builders, Flashbots-signed when required. For Ethereum mainnet.

Operator onboarding

Because the oracle is registrationless, onboarding is only about delegating signers and (optionally) setting price bounds — one-shot commands, then the push loop:

  1. --allow-pushers — delegate the derived signer wallets to the creator's namespace. Each signer signs an EIP-191 consent with a deadline (replay of consent is the one place a deadline still matters).
  2. --set-guards — write static setPriceGuard bounds for feeds that declare min_price/max_price.
  3. --register — both, in order. Full onboarding.

Push calldata is the slot words verbatim — no deadline prefix; each word carries its own timestamp and the oracle checks time drift on-chain.

The guard service

Beyond static bounds, an in-process task keeps the oracle's price band tracking the script-formed band the feed publishes. It reads guard_min:{chain}/guard_max:{chain} and calls setPriceGuard — funder-signed (same nonce owner as refills), and deliberately excluded from push stats.

It updates by time (re-assert every interval_secs) or trigger (either bound deviates past trigger_bps), with a min_update_secs anti-spam floor. Off by default:

[guard]
enabled         = true
interval_secs   = 3600
trigger_bps     = 500
min_update_secs = 300

Pyth-lazer pusher

Forwards the signed Lazer EVM blob from the bus to the Pyth oracle. Feeds auto-register on the first signed push — no registrar role. A pool of signers shares the same nonce machinery as the compressed pusher.

Deploying the contracts to a live network and switching production pushers is a separate operational step from the code — the registrationless flow runs against a revamp deployment, not the older on-chain oracle.