Skip to content

Feat/platform wallet#794

Draft
shumkov wants to merge 106 commits intov1.0-devfrom
feat/platform-wallet
Draft

Feat/platform wallet#794
shumkov wants to merge 106 commits intov1.0-devfrom
feat/platform-wallet

Conversation

@shumkov
Copy link
Copy Markdown
Contributor

@shumkov shumkov commented Mar 26, 2026

No description provided.

shumkov and others added 5 commits March 17, 2026 14:33
- Add PlatformWalletManager + platform_wallets bridge map to AppContext
- Register wallets with bridge on create/import/unlock
- Clean up bridge on lock/remove/clear
- Add get_platform_wallet() / require_platform_wallet() helpers
- Update platform_wallet_bridge.rs with clean re-exports + WalletIdMapping
- Both old wallets map and new bridge coexist during migration

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
- 7 backend tasks now validate wallet exists via require_platform_wallet()
- generate_receive_address: diagnostic comparison with CoreWallet
- transfer_to_addresses: tries platform_wallets first with fallback
- Remove dead_code allows from bridge helper methods

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Replace old Wallet model signer with platform_wallet.platform()
as Signer<PlatformAddress> in 4 backend task callsites:
- transfer_platform_credits
- withdraw_from_platform_address
- fund_platform_address_from_asset_lock
- top_up_identity_from_platform_addresses

Old wallet clone blocks removed where no longer needed.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signing migration:
- 4 callsites use platform_wallet.platform() as Signer<PlatformAddress>
- Removed old Wallet clone blocks

Asset lock creation:
- try_build_registration/topup_via_platform_wallet with fallback to legacy
- Shared broadcast_and_track_asset_lock helper

Address table UI:
- WalletTask::LoadAddressInfo backend task
- Cached CoreAddressInfo snapshot in WalletsBalancesScreen
- address_data_from_cache() renders from snapshot, falls back to old path

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Mar 26, 2026

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: a7865787-fc91-4847-a750-6079735ddfa5

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/platform-wallet

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

shumkov and others added 22 commits March 31, 2026 21:25
# Conflicts:
#	Cargo.lock
#	Cargo.toml
#	src/app.rs
#	src/backend_task/core/create_asset_lock.rs
#	src/backend_task/core/mod.rs
#	src/backend_task/mod.rs
#	src/context/wallet_lifecycle.rs
#	src/model/wallet/mod.rs
#	src/ui/tokens/tokens_screen/mod.rs
#	src/ui/tools/masternode_list_diff_screen.rs
#	src/ui/wallets/add_new_wallet_screen.rs
#	src/ui/wallets/import_mnemonic_screen.rs
#	src/ui/wallets/wallets_screen/mod.rs
Fix lifetime error from merge — `self.run_shielded_task()` should use
the `this` Arc clone like all other task dispatches in the match arm.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Migrate 9 token backend tasks from direct SDK builder calls to
TokenWallet::*_with_signer() methods:
- transfer_tokens, mint_tokens, burn_tokens
- freeze_tokens, unfreeze_tokens
- claim_tokens, purchase_tokens, set_token_price
- query_my_token_balances (watch + sync + balance with fallback)

Add platform_wallet_for_identity() helper to resolve QualifiedIdentity
to its PlatformWallet via wallet seed hash lookup.

Add PlatformWalletTokenError variant to TaskError.
Add TokenWallet re-export to platform_wallet_bridge.

All function signatures preserved. DB persistence unchanged.
destroy_frozen_funds, pause, resume, update_config not yet migrated
(TokenWallet methods pending).

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Migrate 4 identity backend tasks from direct SDK calls to
IdentityWallet::*_with_signer() methods:

- withdraw_from_identity → withdraw_credits_with_signer()
- transfer → transfer_credits_with_signer()
- add_key_to_identity → update_identity_with_signer()
  (consolidates nonce fetch + transition build + broadcast)
- register_dpns_name → register_name_with_signer()
  (replaces ~90 lines of manual document construction)

Skipped: refresh_identity (targeted single-identity fetch vs
platform-wallet's gap-limit scan — different operations).

All DB persistence, fee tracking, QualifiedIdentity updates preserved.
Net -116 lines.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Registration (register_identity.rs):
- put_new_identity_to_platform() delegates to
  identity_wallet.register_identity_with_signer() when platform-wallet
  available, falls back to direct SDK call otherwise
- All evo-tool logic preserved: IS→CL fallback, QualifiedIdentity,
  DB writes, version-mismatch retry

Top-up (top_up_identity.rs):
- top_up SDK call delegates to identity_wallet.top_up_identity_with_signer()
  with platform-wallet, direct SDK fallback
- All retry paths (IS→CL, version mismatch) use same pattern
- Balance tracking, fee calculation, DB writes preserved

Discovery (discover_identities.rs):
- New discover_identities_via_platform_wallet() path using
  identity_wallet.sync() (12-key window + DPNS lookup)
- Converts platform-wallet ManagedIdentity → evo-tool QualifiedIdentity
- Maps PrivateKeyData/DpnsNameInfo to evo-tool types
- Legacy scan preserved as fallback when no platform-wallet

Skipped: DashPay contact requests (evo-tool-specific features:
QR auto-accept, reject, custom labels, pre-send validation)

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
…config

Complete token task migration (all 13 token tasks now use platform-wallet):
- destroy_frozen_funds → token_wallet.destroy_frozen_funds_with_signer()
- pause_tokens → token_wallet.pause_with_signer()
- resume_tokens → token_wallet.resume_with_signer()
- update_token_config → token_wallet.update_config_with_signer()

Removes manual SDK builder + sign + broadcast_and_wait pattern.
All DB writes, fee estimation, error handling preserved.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Replace Identity::fetch_by_identifier() with
identity_wallet.refresh_identity_with_signer() when platform wallet
available. Falls back to direct SDK call otherwise.
All QualifiedIdentity updates, DB writes, status tracking preserved.

Skipped: load_identity_from_wallet, refresh_dpns_names,
load_identity_by_dpns_name, DashPay contact_requests — all deeply
intertwined with QualifiedIdentity key resolution and wallet
matching that platform-wallet's ManagedIdentity can't replace.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
…rm-wallet

load_identity_from_wallet: delegates Platform query + key matching to
identity_wallet.load_identity_by_index() when platform wallet available,
converts ManagedIdentity key_storage/DPNS to QualifiedIdentity types.
Legacy fallback preserved for non-wallet identities.

load_identity_by_dpns_name: replaced manual DPNS document query with
sdk.resolve_dpns_name(). When platform wallet available, also populates
watched_identities. All post-processing preserved (DPNS fetch, wallet
key matching, QualifiedIdentity construction, DB writes).

Added first_available_platform_wallet() helper to AppContext.
Added IdentityLoadByIndex TaskError variant.

Skipped: refresh_dpns_names (operates on all DB identities, not just
wallet-managed), DashPay contact_requests (raw key bytes needed for
ECDH, Signer trait doesn't expose).

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Sync QualifiedIdentity → ManagedIdentity at DB persistence chokepoints:

- insert_local_qualified_identity() now also registers with IdentityManager
- update_local_qualified_identity() now also updates IdentityManager
- sync_all_identities_to_platform_wallets() called at startup (bootstrap)

Conversion: QualifiedIdentity fields → ManagedIdentity fields:
- key_storage: only PrivateKeyOnMainIdentity keys, Clear/AtWalletDerivationPath
- dpns_names: DPNSNameInfo → DpnsNameInfo
- status: IdentityStatus mapping
- wallet_seed_hash, top_ups, label

Best-effort sync — if no platform wallet or lock contended, skip silently.
Non-blocking try_write() locks for sync context compatibility.

All 30+ identity create/update callsites automatically route through
these 2 chokepoints — no individual callsite changes needed.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
send_contact_request + send_contact_request_with_proof:
- Delegate ECDH, xpub encryption, account reference, document
  construction to platform_wallet.dashpay().send_contact_request()
- Remove ~250 lines of manual crypto (ECDH, HD derivation, AES
  encryption, document building)
- Keep: username resolution, duplicate check, auto-accept proof
  construction, result wrapping

accept_contact_request:
- Delegate reciprocal request to platform_wallet.dashpay().send_contact_request()
- Keep: document fetch, duplicate check, result wrapping

Added TaskError::PlatformWallet variant for platform-wallet errors.

Kept as-is: load_contact_requests (UI expects raw Documents),
reject_contact_request (platform-wallet only does local removal,
evo-tool persists rejection to Platform via contactInfo document).

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Replace manual DocumentQuery + raw document parsing with
sdk.get_dpns_usernames_by_identity(). Removes boilerplate
WhereClause construction and document field extraction.

acquired_at set to 0 (SDK's DpnsUsername doesn't carry timestamps;
only used in contested names screen which can query directly).

IdentityManager gets updated via chokepoint sync in
update_local_qualified_identity().

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Replace 5 instances of manual DocumentQuery + Document::fetch_many +
document field parsing with sdk.get_dpns_usernames_by_identity():
- discover_identities.rs (legacy path)
- load_identity.rs
- load_identity_from_wallet.rs (legacy path)
- load_identity_by_dpns_name.rs
- register_dpns_name.rs

Remove ~25 unused imports per file (DocumentQuery, WhereClause,
WhereOperator, Document, FetchMany, DocumentV0Getters, Value).

Handle acquired_at=0 in contested names screen:
- Sort: unknowns (0) sort to end
- Display: show "Unknown" instead of epoch timestamp

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
- refresh_identity: fall back to direct SDK fetch on platform-wallet
  error instead of silently marking identity as NotFound
- contact_requests: document auto-accept account_reference=0 behavior
  change with rationale (QR codes are session-scoped, expire anyway)

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
The merge accidentally replaced evo-tool's SpvEventHandler with
Arc::new(()) (no-op EventHandler), breaking SPV event propagation.

Restored from v1.0-dev:
- SpvEventHandler struct with Arc-wrapped shared state fields
- impl EventHandler: on_progress (status/sync updates),
  on_sync_event (finality forwarding, reconciliation),
  on_network_event (connected_peers counter)
- build_client() constructs SpvEventHandler with cloned Arcs
- SpvClient type alias includes SpvEventHandler generic param

Without this, connected_peers was never updated from network events,
causing wait_for_spv_peers() to always timeout in e2e tests.

Removed dead code replaced by EventHandler:
- spawn_sync_event_handler, spawn_network_event_handler,
  spawn_progress_watcher (were #[allow(dead_code)], never called)

E2E results: 3/8 passed (SPV-only tests), 5/8 failed (DAPI
connectivity — infrastructure, not code).

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
The timeout increase wasn't needed — the real issue was the missing
SpvEventHandler (fixed in previous commit). 60s is sufficient.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Replace old AWS testnet DAPI addresses with 68.67.122.x range.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
TransactionRecord fields changed to methods in latest v0.42-dev:
- height → height() method returning Option<u32>
- timestamp/block_hash → extracted from context.block_info()
- is_ours → removed (set to true for SPV wallet transactions)

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Replace build_registration_asset_lock_transaction() and
build_topup_asset_lock_transaction() calls with single
build_asset_lock_transaction(amount, funding_type, identity_index).

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
- Remove network argument from PlatformWalletManager::new()
  (SDK already holds the network)
- Remove kw_network conversion block in AppContext

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Replace core().all_address_info() with core().wallet_info() lock
accessor + CoreAddressInfo::all_from_wallet_info(). CoreWallet
convenience wrappers removed in platform-wallet.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
self.config → this.config in async move block to fix lifetime error
from v1.0-dev merge (#767 DAPI discovery feature).

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
shumkov and others added 30 commits April 6, 2026 19:44
…ction

Register recovered and newly detected asset locks with
PlatformWallet's AssetLockManager alongside the existing
unused_asset_locks vec. Sync existing locks on wallet unlock.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
- Add account_index (0) to all build_asset_lock_transaction,
  create_funded_asset_lock_proof, and recover_asset_lock_blocking calls
- Rename blocking_ prefix to _blocking suffix on all blocking method calls

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
- Add output_index: 0 to all recover_asset_lock_blocking calls
- Destructure create_funded_asset_lock_proof return as OutPoint,
  extract .txid for existing usage

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
- Change RegisterIdentityFundingMethod::UseAssetLock and
  TopUpIdentityFundingMethod::UseAssetLock from (Address, AssetLockProof,
  Transaction) to OutPoint
- Remove manual IS→CL proof upgrade logic from register_identity.rs and
  top_up_identity.rs — now handled by platform-wallet's resume_asset_lock
- Remove manual private key lookup — platform-wallet re-derives from
  funding account
- UI passes OutPoint::new(tx.txid(), 0) from selected asset lock

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Update all platform-wallet identity method calls to pass None for the
new settings parameter, maintaining existing behavior.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
- Extend asset_lock_transaction table with output_index, account_index,
  funding_type, identity_index, proof_data columns
- Add DB migration v34: recreate table with composite PK (tx_id, output_index)
- Update SQLite persister to serialize/deserialize AssetLockProof via bincode
  and AssetLockFundingType as integer discriminant

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
…put_index

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
- Remove unused_asset_locks field from Wallet struct
- UI screens (asset locks table, detail, identity selection) now read
  from AssetLockManager via list_tracked_locks_blocking()
- Remove wallet.unused_asset_locks.push/retain in transaction processing,
  recovery, identity registration, top-up, and platform address funding
- Remove unused_asset_locks population from database wallet loading
- Fix AssetLockEntry field mismatch in SQLite persister (use status enum
  instead of separate boolean fields)
- Keep identity_id DB tracking as app-level concern
- Keep broadcast_and_commit_asset_lock/wait_for_asset_lock_proof (still
  used by some flows)

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
- Remove broadcast_and_commit_asset_lock(), wait_for_asset_lock_proof(),
  broadcast_raw_transaction() from transaction_processing.rs
- Remove transactions_waiting_for_finality field from AppContext
- Remove spv_setup_finality_listener() and handle_spv_finality_event()
  from wallet_lifecycle.rs
- Migrate FundWithUtxo paths in register_identity.rs and
  top_up_identity.rs to use recover_asset_lock_blocking + resume_asset_lock
- Simplify fund_platform_address_from_wallet_utxos.rs to single
  create_funded_asset_lock_proof call
- Migrate shielded/bundle.rs to AssetLockManager
- Migrate create_asset_lock.rs to broadcast_and_track_asset_lock_via_manager

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
- Replace FundWithUtxo with FundWithWallet in QR-funded flows — the
  wallet's coin selection picks UTXOs automatically, the specific
  QR-received UTXO is not forced
- Remove FundWithUtxo variant from RegisterIdentityFundingMethod and
  TopUpIdentityFundingMethod enums
- Remove FundWithUtxo match arms from register_identity.rs and
  top_up_identity.rs (~110 lines)
- Add TODO comments on UI screens noting that list_tracked_locks_blocking
  only shows active locks; DB is source of truth for full history

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
- Use wallet_manager.create_wallet_from_seed_bytes() instead of
  PlatformWallet::from_seed_bytes() — wires SPV event channel
- UI screens read asset locks from SQLite DB instead of AssetLockManager
  (DB has full history including consumed locks with identity_id)
- Add get_unused_asset_lock_display_info() and related DB query methods
- Remove unused sdk import from wallet_lifecycle.rs

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
- Delete asset_lock_transaction.rs entirely (FundWithUtxo removed,
  all UTXO asset lock methods dead: registration/top_up/generic)
- Remove identities: HashMap<u32, Identity> from Wallet (never
  populated, duplicated DB state)
- Replace wallet.identities.keys() with DB query
  get_wallet_identity_indices() in UI screens
- Remove wallet.identities.insert() from identity backend tasks

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
- Add SpvEventBridge — subscribes to PlatformWalletEvent channel,
  translates SPV events into ConnectionStatus pushes,
  SpvStatusSnapshot for UI, and reconcile triggers
- Extract SpvStatus, SpvStatusSnapshot, CoreBackendMode to spv/types.rs
  (survives SpvManager deletion)
- SpvEventBridge replaces the old SpvEventHandler's role without
  depending on dash-spv's EventHandler trait

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Delete SpvManager (1,481 lines). All SPV functionality now comes from
platform-wallet's SpvRuntime via PlatformWalletManager.

- Migrate all spv_manager callers to wallet_manager.spv()
- SpvEventBridge subscribes to PlatformWalletEvent for status/reconcile
- Rewrite start_spv/stop_spv to use SpvRuntime::run() with CancellationToken
- Extract build_spv_config() from old SpvManager::build_client()
- Rewrite reconcile_spv_wallets() to read from PlatformWallet instances
- Migrate quorum key lookup to SpvRuntime::get_quorum_public_key()
- Migrate TX broadcast to SpvRuntime::broadcast_transaction()
- Migrate address derivation to PlatformWallet::core()
- Preserve SpvStatus/SpvStatusSnapshot types in spv/types.rs
- Keep SpvEventBridge in spv/event_bridge.rs as app-level glue
- Keep E2E tests, rewrite unit tests with TODO markers

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
- SqliteWalletPersister: remove seed_hash field, accept wallet_id
  per-call, use Mutex<BTreeMap<WalletId, Staged>> for per-wallet staging
- Create persister once in AppContext, pass to PlatformWalletManager::new()
- Simplify register_with_platform_wallet_manager() — just call
  create_wallet_from_seed_bytes() which returns fully configured wallet

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
- Rename persister.initialize() → persister.load() in test assertions
- Fix mcp/resolve.rs return type to Arc<PlatformWallet>
- Backend-e2e tests still reference removed spv_manager() — needs
  separate update (tracked as TODO)

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
- Replace spv_manager().det_wallets_snapshot() with wallet_id_mapping()
- Replace spv_manager().status_async() with spv_event_bridge().status()
- Add test-only wallet_id_mapping() accessor on AppContext
- All assertions preserved, only API calls updated
- Remaining e2e compile errors (wallets(), test_helpers) are pre-existing

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Backend-e2e tests access private AppContext fields via test-only
accessors gated behind #[cfg(feature = "testing")]. Added
required-features = ["testing"] to the [[test]] section so the
accessors are available during integration test compilation.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
- Use async wallet_info().await in reconcile_spv_wallets instead of
  wallet_info_blocking() which panics inside tokio runtime
- Use try_wallet_info() in derivation_path_for_address for mixed
  sync/async callers
- Drop wallets guard before .await in reconcile_spv_wallets
- Register wallet BEFORE starting SPV in test harness so addresses
  are in bloom filter from start
- Fix diagnostic code in harness error handler

Remaining issue: SPV syncs but finds no transactions (balance stays 0).
monitored_addresses() may return empty due to try_read contention or
empty address pools on fresh wallet.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
- Use stable workdir name (no git hash) so SPV cache persists across commits
- Register wallet BEFORE starting SPV for correct bloom filter
- Use async wallet_info().await in reconcile path instead of blocking_read
- Use try_wallet_info() in derivation_path_for_address for sync callers
- Add logging to monitored_addresses for debugging
- Fix diagnostic code to avoid blocking_read panic in error handler

E2E tests: SPV connects, syncs, 190 addresses monitored. Balance stays 0
because filter scan from genesis needs >90min for testnet. Cached data
from previous runs helps but initial cold start is slow.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Update all call sites for the platform-wallet locking redesign:
- wallet_info() -> state(), try_wallet_info() -> try_state(), etc.
- Access wallet_info/identity_manager/wallet through state guard
- CoreAddressInfo::all_from_wallet_info takes &guard.wallet_info
- Fix e2e test DB isolation (tempdir per test)
- Fix rmcp non-exhaustive struct construction
- Add birth_height to E2E test harness for fast SPV sync
- Increase SPV Running timeout to 600s for masternode sync

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Update 31 call sites to use PlatformWallet's state getters directly.
Also fix std::sync::RwLock held across .await in test harness
(deadlock with SPV reconcile).

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
…c lock across .await

cleanup_test_wallets and get_receive_address held std::sync::RwLock
guards across async calls to next_receive_address(), which internally
takes a tokio::sync::RwLock write on PlatformWalletInfo. SPV block
processing holds the same tokio lock and needs the std::sync locks,
causing a lock inversion deadlock. Fix: extract Arc/PlatformWallet
under short sync scope, drop lock, then await.

Also fix harness error path to use read() instead of write() (only
reads balance/address).

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Replace manual IS→CL fallback orchestration in RegisterIdentityTask
and TopUpIdentityTask with platform-wallet's funded_register_identity()
and funded_top_up_identity() which handle IS→CL proof upgrade
internally. Removes ~220 lines of duplicated logic.

Part of PR-31: evo-tool identity + asset lock cleanup.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
PR-30 Phase 3: Update evo-tool for platform-wallet's WalletManager
integration.

- SpvEventBridge handles BalanceUpdated, TransactionReceived,
  TransactionStatusChanged events (signals reconcile for UI refresh)
- Remove notify_wallets_changed() calls (WalletManager bumps revision
  automatically)
- reset_spv_filter_committed_height now async
- Update all PlatformWalletInfo field accesses from .wallet/.wallet_info
  to .managed_state.wallet()/.managed_state.wallet_info() (19 files)
- Remove unused WalletInfoInterface imports

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant