Skip to main content

Common JSON Data Structures for SOON RPC Methods

Various SOON RPC methods return complex responses as structured JSON objects. Here are the most common JSON data structures you’ll encounter:

Reports

Reports are the primary data structure in SOON’s Oracle system. They contain price feed information and associated metadata. The JSON structure of a report is defined as follows:
{
  "report": {
    "configDigest": <string>, // Configuration digest for the price feed
    "epochAndRound": <number>, // Current epoch and round number
    "extraHash": <string>, // Additional hash information
    "feedID": <string>, // Unique identifier for the price feed
    "validFromTimestamp": <number>, // Timestamp from which the report is valid
    "observationsTimestamp": <number>, // Timestamp when observations were made
    "nativeFee": <string>, // Fee in native token
    "tokenFee": <string>, // Fee in ERC20 token
    "expireAt": <number>, // Timestamp when the report expires
    "benchmarkPrice": <string>, // Main reference price
    "askPrice": <string>, // Ask price from aggregated sources
    "bidPrice": <string>, // Bid price from aggregated sources
    "signatures": <array[string]>, // List of validator signatures
    "recovery_ids": <array[number]> // Recovery IDs for signature verification
  }
}

Price Feed Data

Price feeds are another crucial data structure in SOON. Each feed has specific attributes:
{
  "name": <string>, // Name of the price pair (e.g., "BTC/USD")
  "feedID": <string>, // Unique hex identifier for the feed
  "decimals": <number>, // Number of decimal places (typically 18)
  "status": <string>, // Current status of the feed
  "timestamp": <number>, // Last update timestamp
  "configuration": {
    "heartbeat": <number>, // Update frequency in seconds
    "deviation": <number>, // Price deviation threshold
    "validators": <array[string]> // List of validator addresses
  }
}

Account Information

Account data structure on SOON follows the SVM (Solana Virtual Machine) format:
{
  "lamports": <number>, // Account balance in lamports
  "owner": <string>, // Program that owns this account
  "data": <[string, string]>, // Account data and its encoding
  "executable": <boolean>, // Whether account contains executable code
  "rentEpoch": <number>, // Next rent collection epoch
  "space": <number> // Size of account data in bytes
}

Oracle Observations

Raw oracle observations before aggregation are structured as:
{
  "observer": <string>, // Address of the observer
  "timestamp": <number>, // Observation timestamp
  "price": <string>, // Observed price
  "source": <string>, // Data source identifier
  "confidence": <number>, // Confidence score (0-1)
  "signature": <string> // Observer's signature
}

Important Notes

  1. Numeric Values:
    • Large numbers are often returned as strings to preserve precision
    • Timestamps are in Unix format (seconds since epoch)
    • Decimal values maintain 18 decimal places for price data
  2. Encoding:
    • Addresses and hashes are hex-encoded strings
    • Signatures are base64-encoded strings
    • Binary data is typically base58-encoded
  3. Price Representation:
    • All prices include 18 decimal places
    • Use appropriate decimal handling when displaying prices
    • Both string and numeric representations may be provided
I