[DIS] Mobile-Ready CKB Light Client (Pocket Node) for Android

Hi @Jnr6, the 7-day discussion period has ended, and your proposal has reached more than 30 likes, meeting the requirement to proceed to the voting stage. When you’re ready, please go ahead and create the voting thread and share the voting link per the DAO process.

Metaforo currently has wallet unbinding disabled, and voting plus vote verification can be handled under the transitional rules, so it is safe to start the vote now.

7天的讨论期已结束,您的提案已获得超过30个赞,符合进入投票阶段的要求。现在您可以按照DAO流程创建投票帖并提交投票链接。

Metaforo目前已禁用钱包解绑功能,投票和投票验证均可按照过渡规则进行,因此现在可以安全地开始投票。

5 Likes

Hi everyone
Voting is now live on Metaforo

https://dao.ckb.community/thread/vot-mobile-ready-ckb-light-client-pocket-node-for-android-67494

2 Likes

@zz_tovarishch Voting is live

https://dao.ckb.community/thread/vot-mobile-ready-ckb-light-client-pocket-node-for-android-67494

3 Likes

Pocket Node 提案投票现已结束

初步结果:通过(赞成率:98.85%,总投票权重:87,273,842 CKB)

接下来,作为过渡期协调员,我将使用 CKB DAO Watchdog 进行投票后验证,将 Metaforo 记录的投票权重与链上 Nervos DAO 的存款权重进行交叉核对,并进行人工核查。我将把验证日志提交给委员会,以便最终确认结果是否符合流程要求。

Pocket Node Proposal Voting has now closed

Preliminary outcome: PASSED (Approval: 98.85%, Total voting weight: 87,273,842 CKB).

Next, as the transitional period coordinator, I will run a post-close verification using CKB DAO Watchdog to cross-check Metaforo-recorded voting weights against on-chain Nervos DAO deposit weights, along with a manual check. I will share the verification logs with the committee for final confirmation of whether the result is valid per the process.

2 Likes

Pocket Node Voting Verification Announcement

Based on the Metaforo tally at close, the outcome is PASSED. Approval is 98.85% with total voting weight 87,273,842 CKB (Yes 86,273,842, No 1,000,000).

Post-close verification has been completed using CKB DAO Watchdog, together with a manual sanity check. The verification cross-checks Metaforo-recorded voting weights against on-chain Nervos DAO deposit weights. In this run, all entries match and there is no indication of weight inflation or double-counting.

Committee confirmation: the proposal is confirmed as PASSED based on the Metaforo tally at close.

Verification logs: ckb-dao-watchdog/Verification Logs - Pocket Node at main · kydchen/ckb-dao-watchdog · GitHub

Tool repo: GitHub - CKBFansDAO/ckb-dao-watchdog: Community-driven tools for auditing and verifying CKB DAO governance voting results.

Pocket Node 投票核验公告

根据 Metaforo 在投票截止时的统计结果,本次投票结果为通过。赞成率 98.85%,总投票权重 87,273,842 CKB(Yes 86,273,842,No 1,000,000)。

投票结束后,我们使用 CKB DAO Watchdog 完成了核验,并配合进行了人工交叉核验。核验内容为对照 Metaforo 记录的投票权重 与 链上 Nervos DAO 存款对应的权重。本次核验中,记录均一致,未发现权重膨胀或重复计权的迹象。

委员会确认:本次最终结果以投票截止时 Metaforo 记录的权重为准。 提案确认通过

核验日志:ckb-dao-watchdog/Verification Logs - Pocket Node at main · kydchen/ckb-dao-watchdog · GitHub

工具仓库:GitHub - CKBFansDAO/ckb-dao-watchdog: Community-driven tools for auditing and verifying CKB DAO governance voting results.

3 Likes

The initial 10% down payment (payable in CKB)
首付10%(以CKB支付)

15,000 USD * 10% = 1500 USD, @CKB price 0.001647
1500/0.001647 = 910,747 CKB

https://explorer.nervos.org/transaction/0x41a182b678b6312ac85807834a915bc9529f1c898b3ee4f27f2c3392b181fcbd

4 Likes
3 Likes

Google Play Rejected App

The app got rejected from Google playstore because I was trying to deploy it on my personal developer account and google has a policy against that because it’s a cryptocurrency related app.

Setting up a business account takes time, so i will defer that task to the future

What Next

I have the version 1.1.0 and version 1.2.0 on github release already, so the community can try it out and provide early feedback.

I planned on put it on F-Droid also, and work hve already began on that, please try it out and open any issue if you find any.

also verison 1.2.1 will also be released soon

official website: https://pocket-node.vercel.app/

Thank you

11 Likes

Congrats for the good work..:clap: Can you merge with obscell wallet?

2 Likes

Thank you @d3fus7.bit; but i’d have to look into obscell wallet before i can give a response

3 Likes

Milestone 1 Completion Report

Project: Pocket Node: Mobile CKB Light Client Wallet for Android
Repository: github.com/RaheemJnr/pocket-node
Milestone: M1 — Mainnet Ready & Hardware-Backed Security
Releases: v1.1.0, v1.2.0, v1.2.1, v1.2.2


Deliverables Summary

All six accepted deliverables for M1 have been completed:

# Deliverable Status
1 Production mainnet configuration with cell dependencies and bootnode settings Done
2 BIP39 mnemonic generation with TEE/StrongBox encryption Done
3 Biometric authentication (fingerprint/face) with PIN fallback Done
4 Comprehensive mainnet testing with real transactions Done
5 Open-source repository on GitHub Done
6 Releases: v1.1.0 (Week 2), v1.2.0 (Week 4) Done

Feature 1: BIP39 Mnemonic with TEE/StrongBox Encryption

Pocket Node now generates wallets using BIP39 12-word mnemonic seed phrases with CKB’s standard derivation path (m/44'/309'/0'/0/0). The mnemonic and derived private key are encrypted using Android’s Trusted Execution Environment (TEE) or StrongBox hardware security module where available.

What was built:

  • MnemonicManager — BIP39 mnemonic generation, validation, and BIP32/BIP44 key derivation using the kotlin-bip39 library
  • MnemonicBackupScreen — 3-step backup flow: display 12 words in a numbered grid (with FLAG_SECURE to prevent screenshots), verify 3 randomly selected words, and success confirmation
  • MnemonicImportScreen — Recovery flow with word autocomplete from the BIP39 word list and real-time validation
  • KeyManager upgraded — Mnemonic-aware wallet creation, TEE/StrongBox-backed MasterKey encryption, and support for both mnemonic and raw key wallet types

PRs: #11, #12, #13


Feature 2: Biometric Authentication with PIN Fallback

The app now requires authentication before showing wallet contents. Users authenticate via fingerprint, face recognition, or a 6-digit PIN on devices without biometric hardware.

What was built:

  • AuthManager — Detects biometric hardware availability and enrollment status using BiometricManager
  • PinManager — PIN hashing with Blake2b + per-device salt, 5-attempt lockout with 30-second cooldown
  • AuthScreen — Automatically triggers BiometricPrompt on launch with manual retry and PIN fallback
  • PinEntryScreen — 6-digit PIN pad with dot indicators, shake animation on wrong entry, lockout timer display
  • SecuritySettingsScreen — Toggle biometric auth, set/change PIN, view security status
  • PIN re-verification required before changing security settings

PRs: #15, #16, #21


Feature 3: Mainnet Production Hardening

The wallet has been hardened for real CKB mainnet transactions with proper validation, error handling, and release configuration.

What was built:

  • NetworkValidator — Validates address-network consistency (rejects ckt testnet addresses on mainnet and vice versa)
  • Testnet support with network switching — users can toggle between mainnet and testnet, each with isolated data directories and configurations
  • Release signing and R8 minification configured
  • ProGuard rules for CKB SDK, BouncyCastle, secp256k1, and Room entities
  • Debug logging gated behind BuildConfig.DEBUG
  • AndroidManifest hardened: backup disabled, native library extraction enabled
  • 15 globally distributed bootnodes configured for both mainnet and testnet

PRs: #19, #22


Feature 4: Open Source & CI/CD

The repository is public on GitHub with automated CI/CD and community contribution infrastructure.

What was built:

  • GitHub Actions CI workflow — builds JNI library + Android app, runs unit tests on every PR
  • Release workflow — automated APK builds on version tags
  • CONTRIBUTING.md, SECURITY.md, issue templates, PR template
  • Google Play Store listing content prepared
  • UI/UX redesign to Material 3 standards with the Nervos team’s feedback incorporated

PRs: #20, #25, #42, #43, #44


Additional Work (Beyond Spec)

Several improvements were shipped beyond the original M1 scope:

  • Room database caching (Phase 1 & 2) : Transaction history and balance caching with transactions, balance_cache, header_cache, and dao_cells tables for offline-first performance (#49, #50)
  • CKB/USD price feed : Live CKB price from CoinGecko displayed on the home screen
  • Test coverage expansion : 232 unit tests covering JNI models, Extensions utilities, TransactionBuilder, TransactionRecord, DAO models, and more (#47, #52)
  • Sync mode selector after import : Users choose their sync depth (Recent, Full History, Custom) when importing a wallet (#41)
  • Website : Landing page for the project at the repo’s GitHub Pages

Releases

Version Highlights
v1.1.0 BIP39 mnemonic, biometric/PIN auth, mainnet hardening, testnet support, CI/CD
v1.2.0 Room database cache, DAO sync pipeline, UI/UX redesign
v1.2.1 Test coverage (67 new tests), website fixes
v1.2.2 Copy private key in backup, balance visibility toggle

All releases include signed APKs attached as assets.


What’s Next: M2 — Nervos DAO Protocol Integration

Work on Milestone 2 is already underway on the feature/m2-nervos-dao branch. M2 will add full Nervos DAO support including:

  • DAO deposit and withdrawal transactions
  • Compensation tracking and cycle visualization
  • DAO direction detection in transaction history
  • In-app update notifications from GitHub releases

Latest Release: Release v1.2.2 · RaheemJnr/pocket-node · GitHub

3 Likes

M1 Payout

https://explorer.nervos.org/transaction/0xc0d6256f62667a86f655add3d2a0dd22cf76e3afac82d6fd2690026289af72f2

2,286,586 CKB (equivalent to $3,375 at 0.001476 CKB/USD, representing the 22.5% of full grants)

3 Likes

Milestone 2 Completion Report

Project: Pocket Node: Mobile CKB Light Client Wallet for Android
Repository: github.com/RaheemJnr/pocket-node
Milestone: M2 — Nervos DAO Protocol Integration
Releases: v1.3.0, v1.4.0


Deliverables Summary

All accepted deliverables for M2 have been completed:

# Deliverable Status
1 DAO data models, protocol constants, and 7-state FSM Done
2 JNI layer — 3 new Rust DAO functions for on-device compensation calculation Done
3 Repository — DAO cell querying, deposit/withdraw/unlock operations Done
4 Transaction builder — DAO deposit, withdraw, and unlock transaction construction Done
5 DAO UI — dashboard, deposit cards, compensation progress, bottom sheets Done
6 End-to-end testing and edge case handling Done
7 Releases: v1.3.0, v1.4.0 Done

Feature 1: Nervos DAO Deposit, Withdraw & Unlock

Pocket Node now supports the full Nervos DAO lifecycle. Users can deposit CKB to earn compensation, initiate withdrawals, and unlock funds after the 180-epoch lock period — all executed locally on-device through the embedded light client.

What was built:

  • DAO deposit — Lock CKB in the Nervos DAO (minimum 102 CKB) with biometric/PIN authentication gating
  • DAO withdraw (Phase 1) — Initiate withdrawal, converting a deposit cell to a withdrawing cell
  • DAO unlock (Phase 2) — Claim deposited CKB plus accumulated compensation after the 180-epoch lock period
  • 7-state deposit lifecycle — Full FSM tracking: Depositing → Deposited → Withdrawing → Locked → Unlockable → Unlocking → Completed
  • TransactionBuilder extended with buildDaoDeposit, buildDaoWithdraw, and buildDaoUnlock with molecule encoding and proper cell dep handling for the DAO type script

Issues: #26, #27, #28, #29, #34 PR: #54


Feature 2: JNI DAO Utilities (Rust)

Three new Rust JNI functions were added to perform DAO-specific calculations on-device, avoiding any server dependency:

What was built:

  • nativeExtractDaoFields — Parse the 32-byte DAO header field into its 4 components (C, AR, S, U) as defined in RFC-0023
  • nativeCalculateMaxWithdraw — Compute deposit + compensation using the formula: (capacity - occupied) * AR_withdraw / AR_deposit + occupied, with overflow-safe u128 arithmetic and saturating_mul
  • nativeCalculateUnlockEpoch — Calculate the phase 2 unlock epoch by determining deposited epochs, rounding up to the next 180-epoch boundary, and encoding as an absolute epoch since value
  • Input validation on all functions: negative capacity guards, division-by-zero checks, epoch fraction validation (length > 0, index < length), epoch ordering verification

Issue: #27 PR: #54


Feature 3: DAO Dashboard & Compensation Tracking

A dedicated DAO tab provides real-time visibility into all deposits, their status, accumulated compensation, and lock cycle progress.

What was built:

  • DAO tab accessible from the home screen’s stake button, with Active and Completed deposit views
  • Deposit bottom sheet — Input amount with balance display, minimum deposit validation, and auth-gated confirmation
  • Neuron-style deposit cards — Each card shows deposit amount, status badge, accrued compensation, and lock countdown (hours remaining)
  • Compensation progress bar — Visual indicator of position within the current 180-epoch lock cycle with phase markers (Normal → Suggested → Ending) and a triangle marker for current progress
  • DAO transaction badges in the activity feed — DAO Deposit, DAO Withdraw, DAO Unlock labels with distinct icons
  • Adaptive polling — 10-second refresh during pending actions, 30-second default, with automatic pending action resolution via FSM matching

Issues: #30, #31, #32, #33, #35, #36 PR: #54


Feature 4: Edge Cases, Error Handling & Polish

Robustness improvements ensure the DAO features work reliably across sync states and edge conditions.

What was built:

  • Paginated cell/transaction fetching — Replaced single 100-cell limit with cursor-based pagination loop for wallets with many deposits
  • Deposit block hash preservation — Retains known deposit block hash when header fetch temporarily fails during sync
  • Withdraw guard — Validates deposit block hash is available before allowing phase 1 withdraw
  • Max withdraw return validation — Kotlin-side guards against JNI error returns (-1) to prevent silent data corruption
  • Epoch fraction validation — Length > 0 and index < length checks before arithmetic, preventing malformed epoch computation
  • Pending action clearing — Amount-based matching in shouldClearPendingAction for accurate Depositing state resolution

Issues: #36, #37 PR: #54


Testing

9 new test files were added covering the full DAO feature surface:

Test File Coverage
DaoModelsTest DAO cell status transitions, EpochInfo parsing, DaoDeposit construction
DaoConstantsTest Protocol constants, minimum deposit, epoch calculations
DaoDirectionDetectionTest DAO deposit/withdraw/unlock detection from raw transactions
TransactionBuilderDaoTest DAO deposit, withdraw, and unlock transaction construction
TransactionBuilderFeeTest Fee calculation edge cases
DaoViewModelTest ViewModel state management, pending action resolution, auth gating
DaoFormatTest CKB amount formatting, compensation display
TransactionRecordDaoTest DAO-related transaction record mapping
TransactionEntityDaoTest Room entity DAO field persistence

Releases

Version Highlights
v1.3.0 DAO deposit/withdraw/unlock, JNI DAO utilities, compensation tracking, DAO dashboard UI, 9 test files
v1.4.0 DAO polish, pagination, epoch validation, error handling hardening, CodeRabbit review fixes

All releases include signed APKs attached as assets.


What’s Next: M3 — Multi-Wallet & Sync Optimization

Work on Milestone 3 is already underway on the feature/m3-multi-wallet branch. M3 will add:

  • Multiple wallet management (create, import, switch, delete)
  • Sub-account derivation from existing mnemonics
  • Wallet-scoped data isolation (transactions, balances, DAO cells)
  • CSV transaction export
  • SQLite/Room sync optimization

Latest Release: v1.4.0 — Nervos DAO Protocol Integration

8 Likes

M2 Payout

https://explorer.nervos.org/transaction/0x6ad0e217a800ae14c650139661ba3c40fdb381091b8fa850c46a5670120229c1

2,319,588 CKB (equivalent to $3,375 at 0.001455 CKB/USD, representing the 22.5% of full grants)

3 Likes

To get update about Pocket Node as they arise follow our twitter/X account.

https://x.com/PocketNodeCKB

4 Likes

Release Summary — Pocket Node v1.4.1

Pocket Node v1.4.1 — Bugfix Release

Thanks to the community for the great feedback on v1.4.0! This patch addresses several issues reported by testers.

What’s fixed:

  • Onboarding bypass — Previously, if you closed the app during the mnemonic backup verification step and reopened it, you’d skip straight to the dashboard without ever confirming your recovery phrase. The app now remembers where you left off and sends you back to complete the verification before giving you access to the wallet.
  • “Mnemonic not found” after app upgrade — Some users reported that after upgrading from an older version, the backup screen showed “mnemonic not found” even though their wallet was loaded. This was caused by a race condition in how wallet data was saved, and a potential encryption key mismatch during upgrades. Both are now fixed — wallet data is written atomically, and if encryption corruption is detected, the app gracefully resets and guides you through re-import instead of showing a broken dashboard.
  • Network switch now visibly restarts — Switching between Mainnet and Testnet previously just killed the app process, which on some devices looked like a crash. The app now properly closes and immediately reopens on the new network.
  • In-app dark mode toggle — You no longer need to change your system settings to get dark mode. Head to Settings > Appearance > Theme and choose between System, Light, or Dark.
  • Removed redundant settings icon — The gear icon in the home screen top bar has been removed since Settings is already accessible from the bottom navigation bar.
4 Likes

Milestone 3 Completion Report

Project: Pocket Node: Mobile CKB Light Client Wallet for Android
Repository: GitHub - RaheemJnr/pocket-node: A native Android CKB (Nervos) wallet that runs an embedded light client directly on the device via JNI — full sovereignty, no remote servers. · GitHub
Milestone: M3 — Multi-Wallet & Sync Optimization
Releases: v1.5.0

Deliverables Summary

All accepted deliverables for M3 have been completed:

# Deliverable Status
1 Multi-wallet data model, Room schema (walletId FKs), migrations v2→v5 Done
2 Wallet CRUD — create, import (mnemonic/raw key), switch, delete Done
3 HD sub-account derivation from parent mnemonics Done
4 Wallet-scoped data isolation (transactions, balance cache, DAO cells, sync mode) Done
5 Key storage redesign — ESP → Room encrypted with Android Keystore AES-256-GCM Done
6 Mandatory PIN with PIN-encrypted KeyBackupManager recovery path Done
7 Sync strategies — ALL_WALLETS / ACTIVE_ONLY / BALANCED; Paging 3 transaction list Done
8 Background sync foreground service with notification updates Done
9 In-app auto-update (GitHub Releases + DownloadManager) Done
10 CSV transaction export with UTF-8 BOM for Excel compatibility Done
11 End-to-end testing, multi-wallet edge-case guards, Review fixes Done
12 Release: v1.5.0 Done

Feature 1: Multi-Wallet Management

Users can now create, import, switch between, and delete multiple wallets independently, each with its own address, transaction history, balance, and sync state.

What was built:

  • Wallet CRUD in WalletRepositorycreateWallet, importWallet (mnemonic), importRawKey, createSubAccount, switchActiveWallet, renameWallet, deleteWallet, all keyed by a UUID walletId
  • Wallet Manager screen grouping parent wallets with their sub-accounts,account selector bottom sheet, per-wallet settings screen with seed reveal behind PIN
  • Wallet-scoped prefs — sync mode, custom block height, last-synced block, sync-completed flag all keyed by (walletId, network)
  • Room migrations v2→v3, v3→v4 adding the wallets table and walletId columns to transactions, balance_cache, dao_cells; idempotent WalletMigrationHelper promoting existing single-wallet users to the multi-wallet schema
  • Color-coded WalletAvatar with WCAG AA contrast-aware initials
  • Guards — can’t delete the active wallet, can’t delete a parent with sub-accounts, can’t import the same mnemonic/raw key twice, can’t rename to a duplicate name, can’t delete the last wallet
  • deleteWallet atomicity — Room row + caches removed inside a withTransaction block; key material destroyed only after commit

Issues: M3 Multi-Wallet PRs: #76, #80

Feature 2: HD Sub-Account Derivation

Parent mnemonic wallets can now spawn sub-accounts with their own keys and addresses, without exposing or duplicating the seed.

What was built:

  • createSubAccount(parentWalletId, name) derives m/44'/309'/<n>'/0/0 where n = max(existingSubIndexes) + 1 (gap-resistant after sub deletions)
  • Sub-accounts store their own derived private key — no need to re-derive from parent on every sign
  • Parent wallet’s mnemonic is the only place the seed lives; sub-accounts inherit via derivation path
  • UI: sub-accounts nested under their parent in Wallet Manager, own entry in account selector sheet
  • Backup reminder suppressed for sub-accounts (parent holds the seed)

Issues: M3 Sub-Accounts PR: #80

Feature 3: Key Storage Redesign (ESP → Room)

Private keys and mnemonics moved off EncryptedSharedPreferences and into Room, encrypted with an Android Keystore AES-256-GCM key.

What was built:

  • New key_material table (migration v4→v5) holding encryptedPrivateKey, encryptedMnemonic, iv, walletType, mnemonicBackedUp
  • KeystoreEncryptionManager — AES-256-GCM with hardware-backed Keystore key generation, round-trip verification
  • KeyStoreMigrationHelper — idempotent one-time migration reading from ESP and writing to Room, with round-trip verification before marking complete
  • ESP fallback retained in KeyManager for one release cycle (read-only) so corrupted Room state can recover
  • deleteEspFilesIfSafe() — only runs after migration completes
  • KeyBackupManager — PIN-encrypted secondary backup on disk, written alongside every Room key update, used as a recovery path if Keystore eviction corrupts the AES key
  • AuthManager is the single source of truth for session PIN; KeyManager reads it via injection; session PIN cleared on app backgrounding

Issues: M3 Key Storage Redesign (Phase 1 + 2) PR: #80

Feature 4: Mandatory PIN & Security Hardening

PIN is now required whenever a wallet exists, with a dedicated onboarding screen explaining why in layman terms.

What was built:

  • InitialPinSetupScreen — standalone composable with three internal phases (INTRO → SETUP → CONFIRM), explains that the PIN locks the wallet and unlocks an on-device encrypted recovery-phrase backup
  • Startup gate in MainActivity — users upgrading from v1.4.x are routed through the PIN flow once
  • destinationAfterWalletReady() helper in NavGraph — every path that reaches Main is gated on pinManager.hasPin()
  • PIN removal refused while any wallet exists; dialog explains the constraint up front instead of surfacing it as a post-verify snackbar
  • PinViewModel propagates PIN to AuthManager.setSessionPin on both CONFIRM and VERIFY so KeyBackupManager backups are always written
  • SecurityChecklistScreen + SecuritySettingsViewModel expose PIN/biometric/backup state
  • RecoveryScreen — Keystore-corruption recovery flow using PIN-encrypted backup

Issues: M3 Mandatory PIN, Security Checklist PR: #80

Feature 5: Sync Strategies & Background Sync

Users can choose how to balance freshness across multiple wallets, and sync continues while the app is backgrounded.

What was built:

  • SyncStrategy enum — ALL_WALLETS (up to MAX_CONCURRENT_WALLET_SCRIPTS = 3), ACTIVE_ONLY, BALANCED (active real-time, others every 15 min)
  • registerAllWalletScripts — registers every tracked wallet’s lock script with the light client; logs dropped wallets above the cap for support diagnostics
  • SyncProgressTracker — rolling-window ETA + percentage with reset() on wallet switch to avoid cross-wallet sample contamination
  • SyncForegroundServiceSTART_STICKY foreground service with notification updates showing current sync block/tip
  • SyncNotificationManager — notification channel, permission flow, auto-dismiss when synced
  • Per-wallet sync mode (NEW_WALLET, RECENT, FULL_HISTORY, CUSTOM) defaults: newly created wallets start in NEW_WALLET so they don’t walk history; imported wallets use the user-selected mode
  • Paging 3 wired into ActivityScreen for infinite-scroll transaction list
  • Post-send rescan captures sender wallet before the 5 s delay so switching wallets mid-flight doesn’t re-register the wrong script

Issues: M3 Sync Optimization, Background Sync PR: #80

Feature 6: In-App Auto-Update

Pocket Node checks GitHub Releases on launch and offers a one-tap install of new versions, Telegram-style.

What was built:

  • UpdateRepository — polls api.github.com/repos/.../releases/latest, compares versionCode, filters for the APK asset
  • UpdateDownloader — Android DownloadManager download with progress, FileProvider-backed install intent (REQUEST_INSTALL_PACKAGES permission)
  • UpdateDialog composable — modal with “What’s new” from release notes, download progress, install action
  • Wired into HomeViewModel — checks on wallet screen resume, respects 24 h backoff between checks
  • Tested via UpdateRepositoryTest covering version comparison, APK asset resolution, and no-update scenarios

Issues: M3 In-App Update PR: #80

Feature 7: CSV Transaction Export

Users can export a wallet’s transaction history as CSV, ready to open in Excel/Google Sheets.

What was built:

  • TransactionExporter — emits CSV with columns for tx hash, direction, amount (CKB), fee, block, timestamp, status, confirmations, DAO type
  • ActivityScreen export flow — Storage Access Framework CreateDocument contract so users pick the destination
  • UTF-8 BOM prepended so Excel on Windows renders non-ASCII wallet names/memos correctly
  • pendingCsvContent cleared on every picker result (even cancellation) so wallet data doesn’t leak across export sessions

Issues: M3 CSV Export PR: #80

Testing

15 new test files were added covering the full M3 feature surface:

Test File Coverage
WalletRepositoryTest Wallet CRUD, active-delete refusal, duplicate import rejection
WalletDaoTest Room wallets table: insert, deactivate-all, activate, sub-account queries
WalletEntityTest Entity round-trip, equality, sub-account relations
WalletMigrationHelperTest Idempotent single→multi wallet backfill
KeyManagerMultiWalletTest Per-wallet key store, storeKeysForWallet, deleteWalletKeys
KeyStoreMigrationHelperTest ESP→Room encryption, round-trip verification, migration-complete flag
KeystoreEncryptionManagerTest AES-256-GCM encrypt/decrypt, wrong-IV failure, Keystore key rotation
KeyBackupManagerTest PIN-encrypted backup write/read, recovery path
WalletPreferencesMultiWalletTest Wallet-scoped preference keys per network
MigrationTest Room migration chain 1→2→3→4→5 schema correctness
BalanceCacheDaoTest / BalanceCacheEntityTest Per-(walletId, network) balance cache
TransactionDaoWalletTest Wallet-scoped transaction queries and deletion
SyncProgressTrackerTest Rolling-window ETA, reset semantics
RecoveryViewModelTest Keystore-corruption recovery flow
UpdateRepositoryTest GitHub Releases poll, version comparison, APK asset filter
TransactionExporterTest CSV column formatting, DAO-type labelling
PinManagerTest / AuthManagerSessionPinTest PIN hashing, session PIN lifecycle

Releases

Version Highlights
v1.5.0 Multi-wallet, HD sub-accounts, key storage redesign (ESP→Room, Keystore AES-256-GCM), mandatory PIN, sync strategies, background sync foreground service, in-app auto-update, CSV export, Paging 3 transaction list, 15+ new test files

All releases include signed APKs attached as assets.

What’s Next: M4 — Address Book, Polish & Launch

Work on Milestone 4 will add:

  • Address book / contacts for frequent recipients
  • Play Store listing preparation, screenshots, store copy(almost done, I just need to open a company account and setup an organization for google)
  • User-facing documentation and onboarding polish
  • Any bug fixes discovered in v1.5.0 field testing (to ship as v1.6.0)

Latest Release: v1.5.0 — M3: Multi-Wallet & Key Storage Redesign

6 Likes

Release Summary - Pocket Node v1.5.1

Pocket Node v1.5.1 - User Education Release

Big thanks to everyone who tried v1.5.0 and gave feedback,This release is the response.

Pocket Node is a self-custodial CKB wallet, but unlike most wallets it actually runs a CKB light client on your phone. That’s powerful, but the trade-off has always been that the first-time experience felt foreign to anyone whose mental model is MetaMask or Trust Wallet etc. v1.5.1 is the first round of fixing that.

What’s new:

  • First-run sync coachmark. When you create or import a wallet for the first time, a one-time spotlight on the Sync card explains what your phone is actually doing when syncing.
  • ? help icons everywhere they’re useful. On the Home screen Sync and Activity sections, on every option in the sync mode picker, and on the block height field when you’re entering a custom start point. Each one opens a plain-language explainer in a bottom sheet, with a Open FAQ link if you want to read more.
  • In-app FAQ. Settings > Help & FAQ now has 10 questions answered in plain English: why sync exists, which mode to pick, what Pending means, what confirmations are, why your balance doesn’t show instantly, and so on. The help icons deep-link straight to the relevant entry.
  • Sync mode picker rewrite. The old dialog has been replaced with a bottom sheet that includes a “Pick this if…” sentence under each option. Recent activity is now badged as Recommended. The Custom Block Height option is renamed to the friendlier From a specific date.
  • Block height removed from Home. The home screen no longer shows raw block numbers anywhere; it just says Catching up from 18,250,000 to 18,310,422 (with the values bolded so you can see progress at a glance) or Up to date. If you actually want the raw block height, it’s still on the Node Status screen(I made it less nerdy…).

What’s fixed:

  • Sync sheet survives the explorer round-trip. If you tapped “Don’t know your block height? Look up on explorer” and Chrome opened, on some phones the OS killed Pocket Node in the background(still not 100% fixed, I ahve an issue opened to use webview instead of opening chrome directly). When you came back you had to unlock with your PIN and you’d land on Home with the sync mode dialog gone, meaning you had to start the flow over. The sheet now restores itself after you return, with whatever you’d typed still in the field.
  • Node Status no longer freezes on stale block numbers. When you changed sync mode, the Node Status screen would sometimes get stuck showing the previous mode’s block number for ages because a JNI call threw an exception during the brief restart window and the screen just kept the old value. Each query is now individually fault-tolerant.
  • Coachmark grace timer doesn’t fire prematurely. A subtle race condition where a sync poll that returned right before you changed sync mode could resurrect the dismissed coachmark. Closed off with a generation-token gate that ignores in-flight responses from the previous polling run.
  • Smaller polish. Coachmark spotlight now has rounded corners matching the sync card; tap-swallow scrim prevents accidental taps on backgrounded UI; FAQ back button is now properly labeled for screen readers; coachmark anchor entries are cleaned up on dispose.

Under the hood:

  • Migrated 4 small components and the sync mode picker to strings.xml. All the new copy in this release is resource-backed, so future translations can drop in without touching code. Full migration of the rest of the app is tracked separately.

Download: Release Pocket Node v1.5.1 — User Education Release · RaheemJnr/pocket-node · GitHub
Source: GitHub - RaheemJnr/pocket-node: A native Android CKB (Nervos) wallet that runs an embedded light client directly on the device via JNI — full sovereignty, no remote servers. · GitHub

5 Likes

Hi @zz_tovarishch it’s close to a month, M4 currently in the pipeline and M3 haven’t been cleared. Is there a reason for the delay?

已经多次提醒committee打款,但目前尚未得到回复

请耐心等待,有消息会及时同步

1 Like