feat: load real transaction history in demo app - #102
Conversation
|
Hi @j-kon, nice work here I noticed something. The Steps to reproduce: load wallet A → open Transactions → Load Transaction History → switch to wallet B → reopen Transactions. It still shows wallet A's transactions; tapping one resolves against B's repository and 404s as "Transaction not found." The sibling providers already handle this by keying off wallet identity, blockchain_providers.dart resets when activeWalletRecordProvider.id changes. Might be worth having the controller watch an activeWalletId (or ref.listen the record and reset) instead of a bool. Happy to be corrected if in-place switching isn't a supported flow. |
|
Thanks for the detailed. You were right that the transaction state was scoped only to wallet availability rather than the logical active wallet. I updated the transaction list and detail flow to use the active wallet record ID. Switching from wallet A to wallet B now clears the previous wallet’s transaction state, and stale asynchronous results are ignored if the active wallet changes before loading completes. I also added coverage for wallet switching so transaction list and detail data cannot leak between active wallets. |
|
Thanks @j-kon |
Johnosezele
left a comment
There was a problem hiding this comment.
Every time I leave the wallet/Home flow and navigate back to Transaction History, I land on "Transaction history not loaded yet" and have to tap Load Transaction History again, even right after a successful sync with txs already known to the wallet (Home shows the balance).
Likely related to transactionsControllerProvider being NotifierProvider.autoDispose.family keyed by wallet ID: leaving the page disposes the controller, so remount always returns TransactionsState.idle().
Please either:
- keep loaded history for the active wallet across navigations (drop autoDispose, or cache last success by wallet ID), or
- auto-load on page open when an active wallet is present,
and add widget coverage that pumps the list page, navigates away, returns and still shows (or auto-reloads) the previously loaded rows without an extra tap.
Johnosezele
left a comment
There was a problem hiding this comment.
After an incoming tx confirms, Home correctly updates (Balance + Trusted spendable reflect the synced wallet), but Transaction History can still show the earlier pending row until I leave, come back, and tap Reload Transaction History.
So for a while Home and History disagree: spendable says confirmed funds are available, history still says "Awaiting confirmation."
Root cause looks like split data paths:
- Home reads
wallet.balance()viabalanceSnapshotProvideron every successful sync - History only refreshes on explicit Load/Reload of
transactionsControllerProvider(and withautoDisposeit also drops to idle when leaving the route)
Please invalidate or auto-reload transaction history for the active wallet when sync completes (same moment balance is applied), so pending, confirmed cannot lag behind Home.
Widget coverage: load history while pending, then, apply post-sync wallet, and assert list shows confirmed without a manual reload.
|
Thanks @Johnosezele for the detailed review! I've updated PR #102 in commits
|
Johnosezele
left a comment
There was a problem hiding this comment.
I've left some questions and nits here
|
Thanks for the detailed review, John. I’ve gone through the six open threads and I understand the concerns. The main issue is that the transaction history refresh path is still not fully consistent after broadcast, and there are also a few state and cleanup problems around wallet availability, empty states, and the tests. I haven’t fixed these yet. I’m going to address them one by one, add focused regression coverage, and avoid pushing another broad update until I’ve verified the behavior locally. I’ll reply to each thread with the exact change and test once it is done. Thanks for taking the time to review this carefully. |
|
@Johnosezele All six open review points are addressed in |
Johnosezele
left a comment
There was a problem hiding this comment.
Nice work, thank you! I've left some comments, should be good to go after these fixes.
@j-kon remove the "Transaction History" banner with the "Reload Transaction History" button. From your comment:
With auto-load / auto-reload in place, that banner is redundant, you can remove it. while testing I noticed an incoming receive can show pending in history while Home already shows the updated total balance and trusted spendable still at 0, then after a Home refresh, trusted spendable catches up and the tx flips to confirmed, because sync refreshes the confirmation status. This part is ux related and the fix is above the scope of this PR, not a merge blocker |
|
@Johnosezele Updated in |
Johnosezele
left a comment
There was a problem hiding this comment.
Nice work, we can remove these below...
|
Addressed the remaining review comments in 09e0d45 and cc809fc. The redundant Transaction History heading and the Transaction Detail subtitle have both been removed. Thanks again for the review, @Johnosezele. This should be ready for another look whenever you have a chance. |
|
@j-kon You have some unverified commits in this PR, can you pls re-sign your commit history? |
…tate and native resource disposal
…from widget tests
…transaction-history
cc809fc to
0cb3375
Compare
|
@Johnosezele Done! I've re-signed the entire commit history on the branch. All 20 commits are now verified on GitHub, with identical commit trees and diffs (tip commit is now 0cb3375). |


Summary
Context
Continues the transaction presentation scaffold from #62 by wiring the list/detail flow to active wallet transaction data instead of sample rows.
The production transaction repository uses the BDK Dart API to read wallet transactions. Transaction state remains auto-disposed and keyed by logical wallet ID, while an active wallet binding ensures each provider only reads from the matching FFI wallet.
Wallet replacement refreshes existing rows, wallet clearing removes stale rows, delayed results cannot cross wallet boundaries, and successful broadcasts invalidate the active wallet transaction controller. Full transaction scans run outside the UI isolate, and direct transaction lookup falls back to a scan only when the wallet reports that the transaction is missing.
Verification
dart format --output=none --set-exit-if-changed lib test example bdk_demo/lib bdk_demo/testdart analyze --fatal-infos --fatal-warnings lib test exampledart testflutter analyzeinsidebdk_demoflutter test --no-pub testinsidebdk_demoValidation passed: