Conversation
- 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]>
Contributor
|
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
This was referenced Mar 26, 2026
# 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]>
# Conflicts: # Cargo.lock # Cargo.toml
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]>
…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]>
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]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
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]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.