Skip to main content
The same protocol is deployed on both testnets with identical contract bytecode and identical parameters. Switch tabs to view per-chain addresses.
chainId: 11155111 · Block explorer: sepolia.etherscan.ioStart block: 10391511 — used as the startBlock in the subgraph and event scanning.
Bytecode is identical on both chains. Only the addresses, the Pyth contract that OracleModule wraps, and the per-chain startBlock differ.

External Dependencies

The protocol integrates with external infrastructure that is not operated by the Nile Markets team. Pyth Network is deployed on every chain at a chain-specific address; price feed IDs are global.
The Pyth price feed IDs are bytes32 identifiers, not Ethereum addresses. They are used by the publisher service to fetch prices from the Pyth Hermes API and by the OracleModule to verify onchain price updates. The same feed IDs are used on every supported chain.

Block Explorer

Contracts are verified on each chain’s block explorer.
To view any contract, use the appropriate explorer base URL:
  • Ethereum Sepolia: https://sepolia.etherscan.io/address/<CONTRACT_ADDRESS>
  • Arbitrum Sepolia: https://sepolia.arbiscan.io/address/<CONTRACT_ADDRESS>
For example, the Sepolia PositionManager: https://sepolia.etherscan.io/address/0x8d81E9f1D0F0d1BdAAc0a91AFc2976522429A0cd

Contract Architecture

The contracts are organized into shared infrastructure (singletons) and per-pool instances:
All contracts are non-upgradeable (no proxy pattern). Parameters are configurable via the Config contract, but contract logic is immutable. Logic changes require a full redeployment.

Loading Addresses in Code

TypeScript (Frontend / SDK)

The frontend loads addresses from the deployment JSON file via the getAddress helper, which resolves the correct address based on the connected chain ID:
Address resolution by chain:
  • Chain ID 11155111 (Ethereum Sepolia) loads from deployments/sepolia/addresses.json
  • Chain ID 421614 (Arbitrum Sepolia) loads from deployments/arbitrumSepolia/addresses.json
  • Chain ID 31337 (Anvil) loads from deployments/anvil/addresses.json

TypeScript (Standalone / Node.js)

For scripts or services that do not use wagmi, reference addresses directly:

Rust (Keeper / Publisher)

Rust services receive contract addresses via environment variables or CLI arguments:
For the EUR/USD pair ID constant (pre-computed keccak256("EUR/USD")):

Subgraph

The subgraph references contract addresses in subgraph.yaml data sources:

Deployment JSON

The canonical source of truth for addresses is the deployment JSON file generated by the deploy script:
Contract addresses should never be stored in environment variables. They are always loaded from the deployment JSON file, which is generated by the deploy script and committed to the repository. This ensures a single source of truth that stays in sync across all consumers (frontend, subgraph, tests).