From e0e2a65d1c50b286fc4e3bc627a2d2f18aa226a0 Mon Sep 17 00:00:00 2001 From: Vexta Project Date: Sat, 15 Aug 2026 14:47:35 +0000 Subject: [PATCH] Fix header sync and recovery handling --- app/build.gradle.kts | 4 +-- .../org/vextaproject/wallet/HeaderSync.kt | 9 ++++-- .../org/vextaproject/wallet/MainActivity.kt | 31 ++++++++++++++----- .../org/vextaproject/wallet/WalletActivity.kt | 12 ++++++- 4 files changed, 43 insertions(+), 13 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index cb4a42e..e206e75 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -22,8 +22,8 @@ android { applicationId = "org.vextaproject.wallet" minSdk = 26 targetSdk = 36 - versionCode = 33 - versionName = "0.6.3" + versionCode = 35 + versionName = "0.6.5" } signingConfigs { diff --git a/app/src/main/java/org/vextaproject/wallet/HeaderSync.kt b/app/src/main/java/org/vextaproject/wallet/HeaderSync.kt index 7a5818b..63982fe 100644 --- a/app/src/main/java/org/vextaproject/wallet/HeaderSync.kt +++ b/app/src/main/java/org/vextaproject/wallet/HeaderSync.kt @@ -192,8 +192,13 @@ object HeaderSync { val buffer = ByteBuffer.wrap(payload).order(ByteOrder.LITTLE_ENDIAN) val count = readCompactSize(buffer) - if (count > 2000) { - throw IllegalStateException("too many headers: $count") + val maximumPossibleHeaders = + buffer.remaining() / 81 + + if (count < 0 || count > maximumPossibleHeaders) { + throw IllegalStateException( + "invalid headers count: $count" + ) } repeat(count) { diff --git a/app/src/main/java/org/vextaproject/wallet/MainActivity.kt b/app/src/main/java/org/vextaproject/wallet/MainActivity.kt index ee51d1f..d763973 100644 --- a/app/src/main/java/org/vextaproject/wallet/MainActivity.kt +++ b/app/src/main/java/org/vextaproject/wallet/MainActivity.kt @@ -148,13 +148,23 @@ class MainActivity : Activity() { runOnUiThread { if (intent.getBooleanExtra("sync_only", false)) { - setResult( - RESULT_OK, - android.content.Intent().putExtra( - "verified_height", - chain.last().height + if (chain.last().height > 0) { + setResult( + RESULT_OK, + android.content.Intent().putExtra( + "verified_height", + chain.last().height + ) ) - ) + } else { + setResult( + RESULT_CANCELED, + android.content.Intent().putExtra( + "sync_error", + results.joinToString("\n\n") + ) + ) + } finish() } else { status.text = @@ -317,8 +327,13 @@ class MainActivity : Activity() { val buffer = ByteBuffer.wrap(payload).order(ByteOrder.LITTLE_ENDIAN) val count = readCompactSize(buffer) - if (count > 2000) { - throw IllegalStateException("too many headers: $count") + val maximumPossibleHeaders = + buffer.remaining() / 81 + + if (count < 0 || count > maximumPossibleHeaders) { + throw IllegalStateException( + "invalid headers count: $count" + ) } repeat(count) { diff --git a/app/src/main/java/org/vextaproject/wallet/WalletActivity.kt b/app/src/main/java/org/vextaproject/wallet/WalletActivity.kt index 02824e7..b469243 100644 --- a/app/src/main/java/org/vextaproject/wallet/WalletActivity.kt +++ b/app/src/main/java/org/vextaproject/wallet/WalletActivity.kt @@ -871,8 +871,18 @@ class WalletActivity : FragmentActivity() { runBlockchainScan() } else { blockchainScanRunning = false + + val syncError = data?.getStringExtra( + "sync_error" + )?.trim() + blockchainScanStatus?.text = - "Block-header synchronization failed." + if (syncError.isNullOrBlank()) { + "Block-header synchronization failed." + } else { + "Block-header synchronization failed:\n" + + syncError + } } return