Repository navigation
Highlights
- ADA Handle resolution fixed for CIP-68 handles. Adding a wallet by handle failed for the majority of
ADA Handles in circulation today (any handle minted or upgraded since the standard moved to CIP-68).
resolve_ada_handle()only ever built the legacy CIP-25 Blockfrost asset id; it now tries the CIP-68
(222)-labelled asset id first and falls back to the legacy id, so both old- and new-style handles resolve.
(Issue #4, PR #6,7e5df22) - Android app — initial version, build from source. The mobile client (previously iOS/watchOS only) now
has a working Android build: real application ID andINTERNET/notification permissions, biometrics hosted
correctly on Android, an adaptive launcher icon, and release-signing support via your own keystore. There is
no pre-built APK in this release — see Build the Android app from source below. - Major wallet, DeFi and NFT fixes since v1.16.3 — see Fixes below: a Settings-vs-environment
Blockfrost key mismatch that broke DeFi/NFT/custom-token lookups and STRIKE rewards, account-level ADA
Handle detection and native-asset sourcing for grouped/stake-account wallets, a dead ticker-pricing path, a
valuation-zeroing key mismatch, atomic balance writes, and several cache/crash fixes.
Build the Android app from source
The Android client lives in mobile/ in this repo — a
cross-platform Flutter app that also covers iOS, watchOS and macOS. That mobile/ tree is the canonical,
up-to-date copy: a separate Tarrant64/abct-mobile repo carries an unmerged feature/android-companion branch,
but it stops at 2026-08-10 and is missing work that already shipped in mobile/ here (the chart/portfolio-total
consistency fixes, a device-deploy Makefile, an expanded README.md, an updated scripts/android_emu.sh, and
a stale-cache guard test) — so mobile/ in Tarrant64/abct is what to build from, not the abct-mobile repo.
Prerequisites (from mobile/README.md and mobile/android/app/build.gradle.kts):
- Flutter SDK, stable channel, on
PATH(Dart SDK constraint>=3.4.0 <4.0.0) - JDK 17
- Android SDK:
platforms;android-36,build-tools;36.0.0,platform-tools(targets Android 7.0 / API 24 and
up). The Gradle wrapper pinsgradle-8.14-alland downloads it (~220MB) on the first build. ANDROID_HOMEandJAVA_HOMEset, and Flutter pointed at the SDK once:flutter config --android-sdk <path-to-sdk>
Build and install (debug):
git clone https://github.com/Tarrant64/abct.git
cd abct/mobile
flutter pub get
flutter build apk --debug
adb install -r build/app/outputs/flutter-apk/app-debug.apkThis is an initial version — debug build only. A signed, distributable release build is planned; release
signing already works if you supply your own keystore (see mobile/android/README-signing.md), but no signed
APK is published with this release.
Fixes
- DeFi, NFT and custom-token features now use the Blockfrost key saved in Settings — they previously used
only the environment variable, so they failed (403s) whenever ABCT fell back to hosted Blockfrost — #7 - Pending STRIKE rewards now load — previously always unavailable due to a missing request header — #7
- Restore ADA Handle detection for grouped (stake-account) wallets and source account-level native assets from
Koios (5ecaaa2) - Apply account-level canonical-row treatment to the
balance_historymaterializer, matching the grouped-wallet
fix above (1c1a7c6) - Fix a Koios "match" being treated as a price — ticker pricing was still dead behind it (
2eb17b7) - Fix an
adaValue/ada_valuekey mismatch that was zeroing out Cardano token valuations (2843ef4) - Query the Cardano ADA balance at the stake-account level (
e5a9d47) - Add periodic Cardano stake-key address rediscovery, so wallets don't go stale as new addresses are used
(b3d593c) - Add an alert-only guard against silent large balance changes (
80cb2f6) - Add bounded background sync for on-chain wallet balances (
e850176) - Make
save_balance()clear+insert atomic, closing a zero-balance race (a48ce81) - Stop the portfolio-summary cache from shadowing the per-wallet quantity cache (
7dd32f4) - Fix an undefined
exchange_namethat broke Coinbase'sportfolio_positionswrite (a9377d5) - Define a missing logger in
routers/wallets.py— error paths no longer crash the request (6e2c823) - Raise the quantity-cache TTL to 20 minutes as a stopgap for a performance regression (
cf59dff)
Other changes
- Add a server-side NFT-inclusion preference for portfolio totals (
553619b) - V2 dashboard: compute 7-Day Change client-side from balance-history data (
6eebc49) - Security: block SSRF in the NFT image fetcher and bound its fan-out (
f8e5c06) - Security: require authentication on 9 state-changing NFT image and SSL endpoints (
5575fde) - Add Blockfrost "run-your-own" (self-hosted-compatible backend) tests using documentation addresses,
exercising theBLOCKFROST_BASE_URLself-hosted path (7210192) - Mobile: fix the chart's latest point to match the live portfolio total, and make the Overview chart/header
agree with the Assets tab (9bf119c,ec4b72a,28a8877,93605c5) - Mobile: stop the dashboard reverting to stale cached data on refresh (
38dab9c) - Mobile/dev: add a Makefile for one-command iOS device deploy (
311eeea) - Mobile: sync the Android companion port into
mobile/— see Build the Android app from source above
(1d37152)
Upgrade notes
New optional environment variables (all have safe defaults; no action required unless you want to change the
behavior):
WALLET_BGSYNC_ENABLED,WALLET_BGSYNC_BUCKET_COUNT,WALLET_BGSYNC_SKIP_RECENT_MINUTES,
WALLET_BGSYNC_DISPATCH_DELAY_SECONDS,WALLET_BGSYNC_LOCK_TTL_MINUTES— bounded background wallet-balance
syncBALANCE_ANOMALY_PCT_THRESHOLD— the alert-only large-balance-change guardSTAKE_REDISCOVERY_ENABLED,STAKE_REDISCOVERY_INTERVAL_HOURS,STAKE_REDISCOVERY_DISPATCH_DELAY_SECONDS,
STAKE_REDISCOVERY_LOCK_TTL_MINUTES— periodic stake-key address rediscoveryPORTFOLIO_QUANTITY_CACHE_TTL_SECONDS— the quantity-cache TTL stopgap
The Blockfrost-key fix above introduces no new configuration: it makes DeFi/NFT/custom-token/STRIKE paths honor
a key saved in Settings the same way wallet-balance and staking paths already did. If you only ever set
BLOCKFROST_API_KEY as an environment variable (never via Settings), this release changes nothing for you.
Mobile (Android): building from source requires supplying your own keystore for a release build — no keystore
ships in the repo (see mobile/android/README-signing.md).
Known issues
- No pre-built Android APK. The Android port is source-only right now; see Build the Android app from
source above.
Full changelog: v1.16.3...v1.17.0