UNPKG

oracle-sdk

Version:

Interact with ease with the eclipse contracts

1 lines 35.9 kB
{"version":3,"sources":["../src/utils/address.ts","../src/utils/parsing.ts","../src/api/client.ts","../src/core/feed.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import { bech32m } from '@scure/base';\n\n/**\n * Converts an Aleo bech32m address to an Aleo field.\n *\n * An Aleo address is encoded in bech32m. Decoding gives the\n * underlying bytes (representing the public key or hash).\n * These bytes are interpreted as a big integer to form the field.\n *\n * The interpretation seems to be Little-Endian for conversion to field.\n *\n * @param address The Aleo address in bech32m format (e.g., \"aleo1...\")\n * @returns The Aleo field representation (as bigint)\n * @throws Error if the address is invalid or if decoding fails.\n */\nexport function convertAddressToField(address: string): bigint {\n if (!address.startsWith('aleo1')) {\n throw new Error('Invalid address');\n }\n \n let decoded;\n try {\n decoded = bech32m.decode(address as `aleo1${string}`);\n } catch (e: unknown) {\n if (e instanceof Error) {\n throw new Error(`Failed to decode bech32m address: ${e.message}`);\n }\n throw new Error(`Failed to decode bech32m address`);\n }\n\n // Check prefix (Human-Readable Part - HRP)\n if (decoded.prefix !== 'aleo') {\n throw new Error(\n `Invalid Aleo address prefix: Expected 'aleo', got '${decoded.prefix}'`,\n );\n }\n\n const bytes = bech32m.fromWords(decoded.words);\n const reversedBytes = [...bytes].reverse();\n\n // Build hex string from REVERSED bytes\n let hexString = '';\n for (const byte of reversedBytes) {\n hexString += byte.toString(16).padStart(2, '0');\n }\n\n const fieldBigInt = BigInt('0x' + hexString);\n return fieldBigInt;\n} ","/**\n * Utility functions for parsing contract responses\n */\n\n/**\n * Parses a u128, u64 or u32 from an API response\n * \n * @param raw The raw string response from the API\n * @param type The type of integer to parse\n * @returns The parsed integer value or 0 if parsing fails\n */\nexport function parseUint(raw: string | null, type: 'u128' | 'u64' | 'u32'): number {\n if (!raw) return 0;\n const match = raw.match(new RegExp(`([0-9]+)${type}`));\n return match ? parseInt(match[1], 10) : 0;\n}\n\n/**\n * Parses a boolean from an API response\n * \n * @param raw The raw string response from the API\n * @returns The parsed boolean value or null if parsing fails\n */\nexport function parseBool(raw: string | null): boolean | null {\n return raw ? /true/.test(raw) : null;\n}\n\n/**\n * Parses a field (number) from an API response\n * \n * @param raw The raw string response from the API\n * @returns The parsed field value or null if parsing fails\n */\nexport function parseField(raw: string | null): number | null {\n return raw ? parseInt(raw.match(/([0-9]+)/)?.[1] ?? '0', 10) : null;\n}\n\n/**\n * Parses an Aleo address from an API response\n * \n * @param raw The raw string response from the API\n * @returns The parsed address or null if parsing fails\n */\nexport function parseAddress(raw: string | null): string | null {\n return raw?.match(/([a-z0-9]{59,})/)?.[1] ?? null;\n} ","import { convertAddressToField } from \"../utils/address\";\nimport {\n parseAddress,\n parseBool,\n parseField,\n parseUint,\n} from \"../utils/parsing\";\n\n/**\n * Configuration options for the API client\n */\nexport interface ApiClientConfig {\n /**\n * Base URL for the Aleo Explorer API\n */\n baseUrl?: string;\n\n /**\n * Network to use (testnet or mainnet)\n */\n network?: \"testnet\" | \"mainnet\";\n}\n\n/**\n * Default configuration for the API client\n */\nconst DEFAULT_CONFIG: ApiClientConfig = {\n baseUrl: \"https://api.explorer.provable.com/v1\",\n network: \"testnet\",\n};\n\n/**\n * Client for interacting with Aleo contracts via the Explorer API\n */\nexport class AleoExplorerClient {\n private baseUrl: string;\n private network: string;\n\n /**\n * Creates a new instance of the AleoExplorerClient\n *\n * @param config Configuration options\n */\n constructor(config: ApiClientConfig = {}) {\n this.baseUrl = config.baseUrl || DEFAULT_CONFIG.baseUrl!;\n this.network = config.network || DEFAULT_CONFIG.network!;\n }\n\n /**\n * Fetches data from the API\n *\n * @param endpoint API endpoint\n * @returns Response data as text\n */\n private async fetchData(endpoint: string): Promise<string | null> {\n try {\n const response = await fetch(\n `${this.baseUrl}/${this.network}/${endpoint}`\n );\n if (!response.ok) return null;\n return await response.text();\n } catch (error) {\n console.error(\"Error fetching data:\", error);\n return null;\n }\n }\n\n /**\n * Fetches a mapping value from a contract\n *\n * @param program Program name\n * @param mapping Mapping name\n * @param key Key to look up\n * @returns Mapping value as text\n */\n async getMappingValue(\n program: string,\n mapping: string,\n key: string\n ): Promise<string | null> {\n return this.fetchData(`program/${program}/mapping/${mapping}/${key}`);\n }\n\n /**\n * Gets a feed provider list\n *\n * @param feedId ID of the feed\n * @param maxProviders Maximum number of providers to fetch\n * @returns Array of provider addresses\n */\n async getFeedProviders(feedId: string, maxProviders = 8): Promise<string[]> {\n const providerRequests = Array.from({ length: maxProviders }, (_, i) =>\n this.getMappingValue(\n \"eclipse_oracle_staking_4.aleo\",\n \"provider_list\",\n `${Number(feedId) + i}field`\n ).then((raw) => parseAddress(raw))\n );\n\n const addresses = (await Promise.all(providerRequests)).filter(\n Boolean\n ) as string[];\n return addresses;\n }\n\n /**\n * Gets the stake amount for a provider in a feed\n *\n * @param address Provider address\n * @param feedId Feed ID\n * @returns Stake amount (in credits)\n */\n async getProviderStake(address: string, feedId: string): Promise<number> {\n const key = (convertAddressToField(address) + BigInt(feedId)).toString();\n const raw = await this.getMappingValue(\n \"eclipse_oracle_staking_4.aleo\",\n \"stakes\",\n `${key}field`\n );\n return parseUint(raw, \"u128\");\n }\n\n /**\n * Gets the proposed price for a provider in a feed\n *\n * @param address Provider address\n * @param feedId Feed ID\n * @returns Proposed price or null if no proposal\n */\n async getProviderProposedPrice(\n address: string,\n feedId: string\n ): Promise<number | null> {\n const key = (convertAddressToField(address) + BigInt(feedId)).toString();\n const raw = await this.getMappingValue(\n \"eclipse_oracle_submit_4.aleo\",\n \"temp_price\",\n `${key}field`\n );\n return raw ? parseUint(raw, \"u128\") / 1e6 : null;\n }\n\n /**\n * Gets the total staked amount for a feed\n *\n * @param feedId Feed ID\n * @returns Total staked amount\n */\n async getTotalStaked(feedId: string): Promise<number> {\n const raw = await this.getMappingValue(\n \"eclipse_oracle_staking_4.aleo\",\n \"total_staked\",\n `${feedId}field`\n );\n return parseUint(raw, \"u128\");\n }\n\n /**\n * Gets the current price for a feed\n *\n * @param feedId Feed ID\n * @returns Current price or null if not available\n */\n async getCurrentPrice(feedId: string): Promise<number | null> {\n const raw = await this.getMappingValue(\n \"eclipse_oracle_aggregate_4.aleo\",\n \"latest_price\",\n `${feedId}field`\n );\n return raw ? parseUint(raw, \"u128\") / 1e6 : null;\n }\n\n /**\n * Gets configuration information for a feed\n *\n * @param feedId Feed ID\n * @returns Feed configuration information\n */\n async getFeedInfo(feedId: string): Promise<{\n creator: string;\n min_stake: number;\n slashing_threshold: number;\n aggregation_window: number;\n challenge_window: number;\n paused: boolean;\n } | null> {\n const raw = await this.getMappingValue(\n \"eclipse_oracle_feed.aleo\",\n \"feeds\",\n `${feedId}field`\n );\n\n if (!raw) return null;\n\n const creator = raw.match(/creator:\\s*([a-z0-9]+)/)?.[1] ?? \"\";\n const min_stake = parseUint(raw, \"u64\");\n const slashing_threshold = parseUint(\n raw?.split(\"slashing_threshold:\")[1],\n \"u64\"\n );\n const aggregation_window = parseUint(raw, \"u32\");\n const challenge_window = parseUint(\n raw?.split(\"challenge_window:\")[1],\n \"u32\"\n );\n const paused =\n (raw.match(/paused:\\s*(true|false)/)?.[1] ?? \"false\") === \"true\";\n\n return {\n creator,\n min_stake,\n slashing_threshold,\n aggregation_window,\n challenge_window,\n paused,\n };\n }\n\n /**\n * Gets the count of providers for a feed\n *\n * @param feedId Feed ID\n * @returns Provider count\n */\n async getProviderCount(feedId: string): Promise<number | null> {\n const raw = await this.getMappingValue(\n \"eclipse_oracle_staking_4.aleo\",\n \"provider_count\",\n `${feedId}field`\n );\n return parseField(raw);\n }\n\n /**\n * Gets the proposal median for a feed\n *\n * @param feedId Feed ID\n * @returns Proposal median or null if not available\n */\n async getProposalMedian(feedId: string): Promise<number | null> {\n const raw = await this.getMappingValue(\n \"eclipse_oracle_aggregate_4.aleo\",\n \"proposal_median\",\n `${feedId}field`\n );\n return raw ? (parseField(raw) ? parseField(raw)! / 1e6 : null) : null;\n }\n\n /**\n * Gets the proposal proposer for a feed\n *\n * @param feedId Feed ID\n * @returns Proposer address or null if not available\n */\n async getProposalProposer(feedId: string): Promise<string | null> {\n const raw = await this.getMappingValue(\n \"eclipse_oracle_aggregate_4.aleo\",\n \"proposal_proposer\",\n `${feedId}field`\n );\n return parseAddress(raw);\n }\n\n /**\n * Gets the proposal block for a feed\n *\n * @param feedId Feed ID\n * @returns Proposal block number or null if not available\n */\n async getProposalBlock(feedId: string): Promise<number | null> {\n const raw = await this.getMappingValue(\n \"eclipse_oracle_aggregate_4.aleo\",\n \"proposal_block\",\n `${feedId}field`\n );\n return parseField(raw);\n }\n\n /**\n * Checks if the proposal was slashed for a feed\n *\n * @param feedId Feed ID\n * @returns True if slashed, false if not, null if not available\n */\n async getProposalSlashed(feedId: string): Promise<boolean | null> {\n const raw = await this.getMappingValue(\n \"eclipse_oracle_aggregate_4.aleo\",\n \"proposal_slashed\",\n `${feedId}field`\n );\n return parseBool(raw);\n }\n\n /**\n * Checks if the aggregate is done for a feed\n *\n * @param feedId Feed ID\n * @returns True if done, false if not, null if not available\n */\n async getAggregateDone(feedId: string): Promise<boolean | null> {\n const raw = await this.getMappingValue(\n \"eclipse_oracle_aggregate_4.aleo\",\n \"aggregate_done\",\n `${feedId}field`\n );\n return parseBool(raw);\n }\n\n /**\n * Gets the slasher for a feed\n *\n * @param feedId Feed ID\n * @returns Slasher address or null if not available\n */\n async getSlasher(feedId: string): Promise<string | null> {\n const raw = await this.getMappingValue(\n \"eclipse_oracle_aggregate_4.aleo\",\n \"slasher\",\n `${feedId}field`\n );\n return parseAddress(raw);\n }\n\n /**\n * Gets the slasher reward for a feed\n *\n * @param feedId Feed ID\n * @returns Slasher reward or null if not available\n */\n async getSlasherReward(feedId: string): Promise<number | null> {\n const raw = await this.getMappingValue(\n \"eclipse_oracle_aggregate_4.aleo\",\n \"slasher_reward\",\n `${feedId}field`\n );\n return parseField(raw);\n }\n\n /**\n * Gets the last propose block for a feed\n *\n * @param feedId Feed ID\n * @returns Last propose block number or null if not available\n */\n async getLastProposeBlock(feedId: string): Promise<number | null> {\n const raw = await this.getMappingValue(\n \"eclipse_oracle_aggregate_4.aleo\",\n \"last_propose_block\",\n `${feedId}field`\n );\n return parseField(raw);\n }\n}\n","import { AleoExplorerClient } from \"../api/client\";\nimport {\n Feed,\n FeedInfo,\n PricePoint,\n Provider,\n SlashedAddress,\n} from \"../types/feed\";\n\n/**\n * Default maximum number of providers to check\n */\nconst MAX_PROVIDERS = 8;\n\n/**\n * Feed service for retrieving complete feed data\n */\nexport class FeedService {\n private client: AleoExplorerClient;\n private aggregateProgramId: string;\n\n\n /**\n * Creates a new instance of the FeedService\n *\n * @param client AleoExplorerClient instance or config\n */\n constructor(\n client?:\n | AleoExplorerClient\n | { baseUrl?: string; network?: \"testnet\" | \"mainnet\" }\n ) {\n if (client instanceof AleoExplorerClient) {\n this.client = client;\n } else {\n this.client = new AleoExplorerClient(client);\n }\n this.aggregateProgramId = \"eclipse_oracle_aggregate_4.aleo\";\n }\n\n /**\n * Get the price history of a feed\n * @param feedId Feed ID\n * @param maxTransactions Maximum number of transactions to analyze (max 1000 per request)\n * @returns Array of PricePoint (timestamp (UNIX timestamp), price)\n */\n async getPriceHistory(feedId: string): Promise<PricePoint[]> {\n const functionName = \"propose\";\n const url = \"https://testnetbeta.aleorpc.com\";\n const pageSize = 1000; // Max per request according to the doc\n let page = 0;\n let totalFetched = 0;\n let finished = false;\n const history: PricePoint[] = [];\n\n while (!finished && totalFetched < pageSize) {\n const toFetch = Math.min(pageSize, pageSize - totalFetched);\n const body = JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"aleoTransactionsForProgram\",\n params: {\n programId: this.aggregateProgramId,\n functionName,\n page,\n maxTransactions: toFetch,\n },\n });\n\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body,\n });\n\n if (!res.ok) break;\n const data = await res.json();\n const txs = data.result || [];\n if (txs.length === 0) break;\n\n for (const tx of txs) {\n const finalizedAt = tx.finalizedAt || tx.transaction?.finalizedAt || \"\";\n const transitions = tx.transaction?.execution?.transitions || [];\n for (const transition of transitions) {\n if (\n transition.program === this.aggregateProgramId &&\n transition.function === functionName\n ) {\n const inputFeed = (transition.inputs || []).find(\n (input: any) => input.value === `${feedId}field`\n );\n if (inputFeed) {\n const priceInput = (transition.inputs || []).find(\n (input: any) =>\n typeof input.value === \"string\" &&\n input.value.match(/^[0-9]+u128$/)\n );\n if (priceInput) {\n const price =\n Number(priceInput.value.replace(\"u128\", \"\")) / 1e6;\n history.push({ timestamp: finalizedAt, price });\n }\n }\n }\n }\n }\n\n totalFetched += txs.length;\n page += 1;\n if (txs.length < toFetch) finished = true;\n }\n\n // Sort by increasing date\n return history.sort((a, b) => (a.timestamp > b.timestamp ? 1 : -1));\n }\n\n /**\n * Gets complete data for a feed\n *\n * @param feedId ID of the feed\n * @param maxProviders Maximum number of providers to check\n * @returns Complete feed data\n */\n async getFeedFullData(\n feedId: string,\n maxProviders = MAX_PROVIDERS\n ): Promise<Feed> {\n // 1. Get provider addresses\n const addresses = await this.client.getFeedProviders(feedId, maxProviders);\n\n // 2. Parallelize all independent calls\n const [\n stakes,\n proposedPrices,\n totalStaked,\n currentPrice,\n feedInfo,\n advancedInfo,\n priceHistory,\n slashedAddresses,\n ] = await Promise.all([\n Promise.all(\n addresses.map((address) =>\n this.client.getProviderStake(address, feedId)\n )\n ),\n Promise.all(\n addresses.map((address) =>\n this.client.getProviderProposedPrice(address, feedId)\n )\n ),\n this.client.getTotalStaked(feedId),\n this.client.getCurrentPrice(feedId),\n this.client.getFeedInfo(feedId),\n Promise.all([\n this.client.getProviderCount(feedId),\n this.client.getProposalMedian(feedId),\n this.client.getProposalProposer(feedId),\n this.client.getProposalBlock(feedId),\n this.client.getProposalSlashed(feedId),\n this.client.getAggregateDone(feedId),\n this.client.getSlasher(feedId),\n this.client.getSlasherReward(feedId),\n this.client.getLastProposeBlock(feedId),\n ]),\n this.getPriceHistory(feedId),\n this.getSlashedAddresses(feedId),\n ]);\n\n // 3. Combine provider data\n const submitters: Provider[] = addresses.map((address, i) => ({\n address,\n stakedCredits: stakes[i] ?? 0,\n proposedPrice: proposedPrices[i],\n }));\n\n // 4. Advanced staking and aggregation info\n const [\n providerCount,\n proposalMedian,\n proposalProposer,\n proposalBlock,\n proposalSlashed,\n aggregateDone,\n slasher,\n slasherReward,\n lastProposeBlock,\n ] = advancedInfo;\n\n // 5. Return the complete feed object\n return {\n id: feedId,\n name: `Feed ${feedId}`,\n infos: feedInfo,\n totalStaked,\n submitters,\n priceHistory,\n slashedAddresses,\n currentPrice,\n providerCount: providerCount !== null ? providerCount : undefined,\n proposalMedian,\n proposalProposer,\n proposalBlock,\n proposalSlashed,\n aggregateDone,\n slasher,\n slasherReward,\n lastProposeBlock,\n };\n }\n\n /**\n * Get the slashed addresses history for a feed\n * @param feedId Feed ID\n * @param maxTransactions Maximum number of transactions to analyze (max 1000 per request)\n * @returns Array of { address, date, type }\n */\n async getSlashedAddresses(\n feedId: string\n ): Promise<\n { address: string; date: string; type: \"aggregator\" | \"provider\" }[]\n > {\n const url = \"https://testnetbeta.aleorpc.com\";\n const pageSize = 1000;\n let page = 0;\n let totalFetched = 0;\n let finished = false;\n const slashed: {\n address: string;\n date: string;\n type: \"aggregator\" | \"provider\";\n }[] = [];\n const functions = [\"slash_aggregator\", \"slash_provider\"];\n\n while (!finished && totalFetched < pageSize) {\n const toFetch = Math.min(pageSize, pageSize - totalFetched);\n const body = JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"aleoTransactionsForProgram\",\n params: {\n programId: this.aggregateProgramId,\n page,\n maxTransactions: toFetch,\n },\n });\n\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body,\n });\n\n if (!res.ok) break;\n const data = await res.json();\n const txs = data.result || [];\n if (txs.length === 0) break;\n\n for (const tx of txs) {\n const finalizedAt = tx.finalizedAt || tx.transaction?.finalizedAt || \"\";\n const transitions = tx.transaction?.execution?.transitions || [];\n for (const transition of transitions) {\n if (\n transition.program === this.aggregateProgramId &&\n functions.includes(transition.function)\n ) {\n const inputFeed = (transition.inputs || []).find(\n (input: any) => input.value === `${feedId}field`\n );\n if (inputFeed) {\n // slash_aggregator: proposer, slash_provider: provider\n let slashedInput;\n let type: \"aggregator\" | \"provider\" | undefined = undefined;\n if (transition.function === \"slash_aggregator\") {\n slashedInput = (transition.inputs || []).find(\n (input: any) =>\n typeof input.value === \"string\" &&\n input.value.startsWith(\"aleo\") &&\n input.name === \"proposer\"\n );\n type = \"aggregator\";\n } else if (transition.function === \"slash_provider\") {\n slashedInput = (transition.inputs || []).find(\n (input: any) =>\n typeof input.value === \"string\" &&\n input.value.startsWith(\"aleo\") &&\n input.name === \"provider\"\n );\n type = \"provider\";\n }\n if (slashedInput && type) {\n slashed.push({\n address: slashedInput.value,\n date: finalizedAt,\n type,\n });\n }\n }\n }\n }\n }\n\n totalFetched += txs.length;\n page += 1;\n if (txs.length < toFetch) finished = true;\n }\n\n // Sort by increasing date\n return slashed.sort((a, b) => (a.date > b.date ? 1 : -1));\n }\n}\n"]}