Oracle API Reference
Query and subscribe to token price feeds and metadata.
Table of Contents
Section titled “Table of Contents”Queries
Section titled “Queries”Get details for a specific token by ID.
Signature:
token(id: Int!): Token!Parameters:
id: Token ID (integer)
Returns: Token object
Example:
query GetToken { oracle { token(id: 1) { id symbol name logoUrl tradingViewSymbol permissionGroup } }}Use Cases:
- Get token metadata
- Display token information
- Resolve token ID to symbol
tokens
Section titled “tokens”List all available tokens with filtering and ordering.
Signature:
tokens( where: TokensFilter limit: Int order_by: TokensOrder order_desc: Boolean): [Token!]!Parameters:
where: Filter object (optional)name: Filter by token name (string match)permissionGroup: Filter by permission group
limit: Max resultsorder_by: Sort byid,name, orpermission_grouporder_desc: Sort descending
Returns: Array of Token objects
Example - List All Tokens:
query ListAllTokens { oracle { tokens(order_by: name) { id symbol name logoUrl tradingViewSymbol } }}Example - Search by Name:
query SearchToken($searchTerm: String!) { oracle { tokens(where: { name: $searchTerm }) { id symbol name } }}Example - Filter by Permission Group:
query GetPermittedTokens { oracle { tokens(where: { permissionGroup: 1 }) { id symbol name } }}Use Cases:
- Build token selector dropdown
- Search tokens by name
- List tradeable assets
- Filter by permissions
tokenPricesUsd query
Section titled “tokenPricesUsd query”Get current USD prices for tokens.
Signature:
tokenPricesUsd( where: TokenPriceUsdFilter limit: Int order_by: TokenPriceUsdOrder order_desc: Boolean): [TokenPricesUsd!]!Parameters:
where: Filter object (optional)tokenId: Filter by specific token ID
limit: Max resultsorder_by: Sort byoracle_token_idorder_desc: Sort descending
Returns: Array of TokenPricesUsd objects
Example - Get All Prices:
query GetAllPrices { oracle { tokenPricesUsd { token { id symbol name } priceUsd lastUpdatedBlock { block block_ts } } }}Example - Get Specific Token Price:
query GetBTCPrice { oracle { tokenPricesUsd(where: { tokenId: 1 }) { token { symbol } priceUsd lastUpdatedBlock { block block_ts } } }}Example - Get Multiple Prices:
query GetPrices { btc: oracle { tokenPricesUsd(where: { tokenId: 1 }) { priceUsd lastUpdatedBlock { block_ts } } } eth: oracle { tokenPricesUsd(where: { tokenId: 2 }) { priceUsd lastUpdatedBlock { block_ts } } }}Key Fields:
priceUsd: Current price in USD (float)lastUpdatedBlock: Block info for last price update
Use Cases:
- Display token prices
- Calculate position values
- Monitor price changes
- Verify price freshness
Subscriptions
Section titled “Subscriptions”Subscribe to real-time price updates.
tokenPricesUsd
Section titled “tokenPricesUsd”Subscribe to price updates for specific or all tokens.
Signature:
subscription { tokenPricesUsd(where: SubTokenPriceUsdFilter): [TokenPricesUsd!]!}Example - Subscribe to All Prices:
subscription WatchAllPrices { tokenPricesUsd { token { id symbol } priceUsd lastUpdatedBlock { block block_ts } }}Example - Subscribe to Specific Token:
subscription WatchBTCPrice { tokenPricesUsd(where: { tokenId: 1 }) { token { symbol } priceUsd lastUpdatedBlock { block_ts } }}Use Cases:
- Real-time price tickers
- Live trading dashboards
- Price alert systems
- Chart updates
userBalances
Section titled “userBalances”Subscribe to user balance updates across all tokens.
Signature:
subscription { userBalances(where: SubUserBalancesFilter!): [Balance!]!}Example:
subscription WatchUserBalances($user: String!) { userBalances(where: { user: $user }) { amount token_info { symbol decimals bank_denom erc20_contract_address logo name type } }}Use Cases:
- Track wallet balances
- Monitor account changes
- Real-time portfolio updates
- Display available funds
Types Reference
Section titled “Types Reference”type Token { id: Int! symbol: String! name: String! logoUrl: String tradingViewSymbol: String permissionGroup: Int!}Field Details:
id: Unique token identifiersymbol: Token ticker (e.g., “BTC”, “ETH”)name: Full token name (e.g., “Bitcoin”, “Ethereum”)logoUrl: URL to token logo imagetradingViewSymbol: Symbol for TradingView chartspermissionGroup: Access/trading permission level
TokenPricesUsd
Section titled “TokenPricesUsd”type TokenPricesUsd { token: Token priceUsd: Float! lastUpdatedBlock: Block!}Field Details:
token: Associated token metadatapriceUsd: Current USD pricelastUpdatedBlock: Last price update infoblock: Block heightblock_ts: Timestamp (RFC3339 format)
Balance
Section titled “Balance”type Balance { amount: String! token_info: TokenInfo!}TokenInfo
Section titled “TokenInfo”Detailed token information for balances.
type TokenInfo { bank_denom: String! symbol: String! name: String! decimals: Int! logo: String type: TokenType! erc20_contract_address: String!}TokenType Enum:
bank: Native Cosmos SDK tokenerc20: ERC20 token on EVM
Working with Prices
Section titled “Working with Prices”Price Freshness
Section titled “Price Freshness”Always check when price was last updated:
const now = Date.now()const lastUpdate = new Date(lastUpdatedBlock.block_ts).getTime()const ageSeconds = (now - lastUpdate) / 1000
if (ageSeconds > 60) { console.warn('Price may be stale')}Price Formatting
Section titled “Price Formatting”// Format price with appropriate decimalsconst formatPrice = (priceUsd) => { if (priceUsd >= 1000) { return priceUsd.toFixed(2) } else if (priceUsd >= 1) { return priceUsd.toFixed(4) } else { return priceUsd.toFixed(6) }}Calculate Position Value
Section titled “Calculate Position Value”// Calculate position value in USDconst positionValueUsd = (collateralAmount, priceUsd, decimals) => { const actualAmount = collateralAmount / (10 ** decimals) return actualAmount * priceUsd}Balance Conversion
Section titled “Balance Conversion”// Convert balance amount string to numberconst getBalanceValue = (balance) => { const amount = parseFloat(balance.amount) return amount / (10 ** balance.token_info.decimals)}Best Practices
Section titled “Best Practices”Caching Prices
Section titled “Caching Prices”// Cache prices for short periods to reduce queriesconst priceCache = new Map()const CACHE_TTL = 5000 // 5 seconds
const getCachedPrice = async (tokenId) => { const cached = priceCache.get(tokenId) if (cached && Date.now() - cached.timestamp < CACHE_TTL) { return cached.price }
const price = await fetchPrice(tokenId) priceCache.set(tokenId, { price, timestamp: Date.now() }) return price}Handling Multiple Tokens
Section titled “Handling Multiple Tokens”// Batch query multiple prices efficientlyconst query = ` query GetMultiplePrices($tokenIds: [Int!]!) { oracle { prices: tokenPricesUsd(limit: 100) { token { id symbol } priceUsd } } }`
// Filter client-side for needed tokensconst relevantPrices = data.oracle.prices.filter(p => tokenIds.includes(p.token.id))Subscription Management
Section titled “Subscription Management”// Manage price subscription lifecyclelet priceSubscription
const subscribeToPrices = (tokenIds) => { // Unsubscribe from previous if (priceSubscription) { priceSubscription.unsubscribe() }
// Subscribe to new set priceSubscription = client.subscribe({ query: PRICE_SUBSCRIPTION, variables: { tokenIds } }).subscribe({ next: (data) => updatePrices(data), error: (err) => console.error(err) })}