47 lines
1.6 KiB
Markdown
47 lines
1.6 KiB
Markdown
---
|
|
epic: 3
|
|
story: 3.2
|
|
title: "Cryptocurrency Provider"
|
|
status: draft
|
|
---
|
|
|
|
## Epic 3 — Currency & Cryptocurrency
|
|
**Goal:** Real-time and historical currency conversion with 180+ fiat and 50+ crypto.
|
|
|
|
### Story 3.2: Cryptocurrency Provider
|
|
|
|
As a CalcPad user,
|
|
I want live cryptocurrency rates for the top 50+ coins updated hourly,
|
|
So that I can convert between crypto and fiat currencies.
|
|
|
|
**Acceptance Criteria:**
|
|
|
|
**Given** the engine is initialized with network access
|
|
**When** crypto rates are requested
|
|
**Then** it fetches live rates from CoinGecko free API (or configured provider)
|
|
**And** at least 50 top cryptocurrencies by market cap are included (BTC, ETH, SOL, ADA, etc.)
|
|
|
|
**Given** crypto rates have been fetched
|
|
**When** the rates are stored
|
|
**Then** they are cached locally on disk with a timestamp
|
|
**And** the cache refresh interval is configurable (default: 1 hour)
|
|
|
|
**Given** the expression `1 BTC in USD`
|
|
**When** the engine evaluates it with current rates
|
|
**Then** it returns the current USD value of 1 Bitcoin
|
|
**And** the result metadata includes the rate timestamp
|
|
|
|
**Given** the expression `$1000 in ETH`
|
|
**When** the engine evaluates it
|
|
**Then** it returns the equivalent amount in Ethereum
|
|
|
|
**Given** the device is offline
|
|
**When** a crypto conversion is requested
|
|
**Then** the engine uses cached rates
|
|
**And** the result metadata indicates the age of the cached rates
|
|
|
|
**Given** a crypto symbol that could be ambiguous (e.g., a future coin with a symbol matching a fiat currency)
|
|
**When** the engine encounters it
|
|
**Then** fiat currencies take precedence by default
|
|
**And** the user can disambiguate using explicit notation (e.g., `crypto:SOL`)
|