Skip to content

v1.17.0 — CIP-68 ADA Handle Fix, Wallet Reliability & Android Companion

Latest

Choose a tag to compare

@Tarrant64 Tarrant64 released this 27 Sep 14:14
9130f21

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 and INTERNET/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 pins gradle-8.14-all and downloads it (~220MB) on the first build.
  • ANDROID_HOME and JAVA_HOME set, 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.apk

This 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_history materializer, 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_value key 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_name that broke Coinbase's portfolio_positions write (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 the BLOCKFROST_BASE_URL self-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
    sync
  • BALANCE_ANOMALY_PCT_THRESHOLD — the alert-only large-balance-change guard
  • STAKE_REDISCOVERY_ENABLED, STAKE_REDISCOVERY_INTERVAL_HOURS, STAKE_REDISCOVERY_DISPATCH_DELAY_SECONDS,
    STAKE_REDISCOVERY_LOCK_TTL_MINUTES — periodic stake-key address rediscovery
  • PORTFOLIO_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