{"version":3,"sources":["../src/utils/address.ts","../src/utils/parsing.ts","../src/api/client.ts","../src/core/feed.ts"],"names":["bech32m"],"mappings":"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","file":"index.cjs","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"]}