Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
119 commits
Select commit Hold shift + click to select a range
83eb899
test: restore mnemonic test compilation
ovitrif Sep 30, 2026
eaccc22
fix: prevent false on-chain send success
ovitrif Sep 30, 2026
e96f046
Merge remote-tracking branch 'origin/master' into codex/1211-explicit…
ovitrif Sep 30, 2026
00a2e52
fix: use verified broadcast outcome bindings
ovitrif Sep 30, 2026
b7740c7
test: make accepted send checks reproducible
ovitrif Sep 30, 2026
5bafcf2
chore: link release notes to the pull request
ovitrif Sep 30, 2026
904264c
docs: clarify on-chain max confirmation
ovitrif Sep 30, 2026
6966111
fix: preserve original on-chain follow-up context
ovitrif Sep 30, 2026
ae0be37
fix: require observed hardware shop payments
ovitrif Sep 30, 2026
9de645a
fix: protect unresolved hardware shop payments
ovitrif Sep 30, 2026
0ef4613
fix: finish accepted funding and show unresolved transactions
ovitrif Sep 30, 2026
6c75463
fix: preserve paid funding after local follow-up failure
ovitrif Sep 30, 2026
62c32cc
fix: preserve payment authorization when syncing master
ovitrif Sep 30, 2026
56398e3
chore: sync master for draft integration
ovitrif Oct 5, 2026
d252bcb
fix: preserve shop activity recovery with current master
ovitrif Oct 5, 2026
5f7839a
fix: keep unsent shop payments retryable
ovitrif Oct 5, 2026
152b43d
fix: retain payment identity during on-chain retry
ovitrif Oct 5, 2026
15f45fa
fix: update pending screens after payment acceptance
ovitrif Oct 6, 2026
5f8e105
fix: validate funding terms during payment recovery
ovitrif Oct 6, 2026
6c1a9cb
test: verify pending payment observation
ovitrif Oct 6, 2026
66d32dd
fix: recover original payments without misleading success
ovitrif Oct 6, 2026
c7745fc
fix: show the actual accepted retry fee
ovitrif Oct 6, 2026
d3f3bec
fix: bind retry fallback to the original payment
ovitrif Oct 6, 2026
b9cf568
fix: complete restored on-chain contact follow-up
ovitrif Oct 6, 2026
df05937
fix: open the original funded order after pending recovery
ovitrif Oct 6, 2026
82782f5
fix: recover interrupted shop payment preparation
ovitrif Oct 6, 2026
b75cda3
fix: use validated native payment recovery release
ovitrif Oct 6, 2026
b51a541
fix: retain payment safety with shared paykit state
ovitrif Oct 6, 2026
d7cad9e
fix: retain original payments across deadline checks
ovitrif Oct 6, 2026
6686f9a
fix: preserve payment expiry during original retry
ovitrif Oct 7, 2026
5f800c2
test: repair paykit device fixtures
ovitrif Oct 7, 2026
fea3f42
fix: validate original retry inputs through native preparation
ovitrif Oct 7, 2026
2cb41e0
fix: keep payment recovery reachable when sync fails
ovitrif Oct 7, 2026
59df4f8
fix: preserve original payment results during recovery
ovitrif Oct 7, 2026
5843da2
fix: retain proofs with unknown app provenance
ovitrif Oct 7, 2026
875a3cb
fix: release expired payments before first broadcast
ovitrif Oct 7, 2026
a6ddeb0
fix: retain exact fee for recovered original payments
ovitrif Oct 7, 2026
f9315bd
fix: keep recovery pending until local completion
ovitrif Oct 7, 2026
c4e92cd
fix: finish restored accepted ordinary payments
ovitrif Oct 7, 2026
7984a64
fix: verify observed hardware payment terms
ovitrif Oct 7, 2026
9c16edb
fix: exclude never dispatched shop preparations from backups
ovitrif Oct 7, 2026
5a07a0f
fix: retain hardware shop candidate before broadcast
ovitrif Oct 7, 2026
d864283
fix: preserve payment state across backup uploads
ovitrif Oct 7, 2026
e5970b8
fix: release hardware payments denied before dispatch
ovitrif Oct 7, 2026
4250107
fix: keep shop backups consistent and resume restored proofs
ovitrif Oct 7, 2026
a685b2b
fix: consume completed hardware shop results
ovitrif Oct 7, 2026
d463af9
fix: resume denied hardware payment cleanup after restart
ovitrif Oct 7, 2026
8f4b85e
fix: preserve payment recovery after failed storage
ovitrif Oct 7, 2026
2592aa2
fix: retain each hardware payment completion
ovitrif Oct 7, 2026
2d18a4c
test: verify original payment survives remote backup restore
ovitrif Oct 7, 2026
86ea341
fix: preserve payment recovery progress during restore
ovitrif Oct 7, 2026
f9cdbc4
fix: keep recovery pending until acceptance is saved
ovitrif Oct 7, 2026
cb127b7
fix: prevent unsigned backups and lost hardware retries
ovitrif Oct 7, 2026
51cc014
fix: retain failed hardware shop payments
ovitrif Oct 7, 2026
9758e98
fix: preserve shop receipts for all broadcast failures
ovitrif Oct 7, 2026
0eeb96f
fix: recover original hardware shop receipts
ovitrif Oct 7, 2026
3925ef2
fix: retain shop receipt before authorization
ovitrif Oct 7, 2026
91351de
fix: restore hardware dispatch state
ovitrif Oct 7, 2026
b71aff7
fix: keep private shop cleanup retryable
ovitrif Oct 7, 2026
e38369f
fix: preserve prior private payment boundary
ovitrif Oct 7, 2026
5214de9
fix: preserve unsent shop recovery boundaries
ovitrif Oct 7, 2026
8b1c572
fix: keep original payment guards with shared paykit
ovitrif Oct 7, 2026
08d35b7
fix: preserve private payment guard after restart
ovitrif Oct 7, 2026
4306d22
fix: keep incomplete payment follow-up retryable
ovitrif Oct 7, 2026
bcc22b1
fix: protect retained payments across cleanup and restart
ovitrif Oct 7, 2026
cd07c3c
fix: retain durable payment recovery guards
ovitrif Oct 7, 2026
964ef89
fix: preserve removed contacts during recovery
ovitrif Oct 7, 2026
7ec4d56
fix: keep unpersisted send acceptance pending
ovitrif Oct 8, 2026
2836a9b
fix: finish observed hardware payments after timeout
ovitrif Oct 8, 2026
3ca8a30
fix: reject incomplete accepted replacement backups
ovitrif Oct 8, 2026
96a9230
fix: reject backups missing payment follow-up
ovitrif Oct 8, 2026
9f73e83
fix: resume merged acceptance after backup restore
ovitrif Oct 8, 2026
f616693
fix: preserve original contact during payment recovery
ovitrif Oct 8, 2026
118075f
fix: follow original shop payment recovery
ovitrif Oct 8, 2026
d400138
fix: retain original contact in payment backup
ovitrif Oct 8, 2026
6445174
fix: resume accepted funding after network recovery
ovitrif Oct 8, 2026
29eba08
fix: reject malformed contacts in payment backups
ovitrif Oct 8, 2026
b85ed5d
fix: require complete replacement fees on restore
ovitrif Oct 8, 2026
a57fb48
fix: bind restored funding to its order amount
ovitrif Oct 8, 2026
6a194a7
fix: preserve original fees during backup restore
ovitrif Oct 8, 2026
1a0fb1a
fix: preserve original funding order terms
ovitrif Oct 8, 2026
9cbc47a
fix: preserve send-all funding backups
ovitrif Oct 8, 2026
b6a7873
fix: reject impossible restored funding amounts
ovitrif Oct 8, 2026
f1b3f2e
fix: reject funding outside approved terms
ovitrif Oct 8, 2026
34424e5
fix: reject understated funding backups
ovitrif Oct 8, 2026
3b03b7a
chore: resolve master send-flow test conflict
ovitrif Oct 8, 2026
2179bcd
fix: release unsigned payments abandoned before dispatch
ovitrif Oct 8, 2026
dd95573
fix: reject transfer backup totals outside database range
ovitrif Oct 8, 2026
0976499
fix: validate proof backups before installing payment guards
ovitrif Oct 8, 2026
5d98660
fix: retry funding recovery after overlapping reconnects
ovitrif Oct 8, 2026
bef0388
fix: preserve recovery winners across stale transaction events
ovitrif Oct 8, 2026
4848182
fix: bound prepared funding by the approved total
ovitrif Oct 8, 2026
125aca5
fix: reuse the verified winning payment fee
ovitrif Oct 8, 2026
f3ec6ed
fix: complete ordinary payments after transient failures
ovitrif Oct 8, 2026
bf8b7be
fix: preserve unsent hardware payment recovery
ovitrif Oct 8, 2026
d77eb87
fix: keep completed hardware payments out of pending
ovitrif Oct 8, 2026
77e6e75
fix: reopen the original blocked transfer
ovitrif Oct 8, 2026
c866762
fix: preserve newer contacts during shop completion
ovitrif Oct 8, 2026
d0e54c7
fix: preserve original refusal before retry submission
ovitrif Oct 8, 2026
2653e81
fix: replay payment completion when its payer returns
ovitrif Oct 8, 2026
09eef0d
fix: rebuild original hardware activity before proof delivery
ovitrif Oct 8, 2026
116f6b5
fix: reject invalid payment recipients before wallet restore
ovitrif Oct 8, 2026
6ba9d11
fix: keep selected tags on hardware shop payments
ovitrif Oct 8, 2026
5082ab2
fix: approve exact recovery fee before authentication
ovitrif Oct 8, 2026
6f46682
fix: persist original payment dispatch boundary
ovitrif Oct 8, 2026
56e6e7c
merge: resolve send confirmation recovery imports
ovitrif Oct 8, 2026
645f01d
fix: keep original payments observable after unsent retries
ovitrif Oct 8, 2026
bc6b5bf
fix: recover payments without fiat rates after node restarts
ovitrif Oct 8, 2026
2e5ffee
fix: allow leaving hardware sends after definite refusal
ovitrif Oct 8, 2026
1c539f5
fix: keep refused hardware payment sheets dismissible
ovitrif Oct 9, 2026
30504cb
fix: preserve original shop retries and signed send details
ovitrif Oct 9, 2026
45358b6
fix: retain confirmed initial preset fees
ovitrif Oct 9, 2026
a11b479
fix: preserve retained hardware payment retry navigation
ovitrif Oct 9, 2026
6558827
fix: recognize hardware payment refusals
ovitrif Oct 9, 2026
37e4405
fix: reopen retained hardware payments
ovitrif Oct 9, 2026
b33dc94
fix: preserve original hardware retry confirmation
ovitrif Oct 9, 2026
feb7b16
fix: preserve payment recovery on current master
ovitrif Oct 9, 2026
aa33095
docs: make fallback payment checks reproducible
ovitrif Oct 10, 2026
6b000fe
test: exercise unresolved send recovery
ovitrif Oct 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package to.bitkit.services

import android.content.Context
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import androidx.work.Configuration
import androidx.work.WorkManager
import dagger.hilt.android.testing.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withTimeout
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import org.junit.Assume.assumeTrue
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import to.bitkit.data.backup.VssBackupClient
import to.bitkit.data.keychain.Keychain
import to.bitkit.env.Env
import to.bitkit.models.BackupCategory
import to.bitkit.models.WalletBackupV1
import to.bitkit.repositories.BackupRepo
import to.bitkit.repositories.OnchainSendAttemptStore
import javax.inject.Inject
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
import kotlin.test.assertNull
import kotlin.test.assertTrue

/** Opt-in remote backup check; run only on an owned funded test wallet. */
@HiltAndroidTest
@RunWith(AndroidJUnit4::class)
class OnchainBackupRestoreDeviceTest {
@get:Rule val hiltRule: HiltAndroidRule = HiltAndroidRule(this)
@Inject lateinit var backups: BackupRepo
@Inject lateinit var vss: VssBackupClient
@Inject lateinit var attempts: OnchainSendAttemptStore
@Inject lateinit var keychain: Keychain

@Test
fun remoteWalletBackupRestoresTheOriginalAcceptedPayment(): Unit = runBlocking {
assumeTrue(InstrumentationRegistry.getArguments().getString("ownedWalletVss") == "true")
withTimeout(180_000) {
val context = ApplicationProvider.getApplicationContext<Context>()
Env.initAppStoragePath(context.filesDir.absolutePath)
hiltRule.inject()
WorkManager.initialize(context, Configuration.Builder().build())
vss.setup().getOrThrow()
if (backups.hasPendingWalletRestore()) {
backups.performFullRestoreFromLatestBackup().getOrThrow()
}
val original = assertNotNull(attempts.current())
assertTrue(original.hasPositiveEvidence && original.localFollowupComplete)
assertTrue(original.requestId == null && !original.isTransfer)
vss.setup(original.walletIndex).getOrThrow()
try {
keychain.upsertString(
Keychain.Key.ONCHAIN_SEND_ATTEMPT.name,
Json.encodeToString(original.copy(localFollowupComplete = false)),
original.walletIndex,
)
assertTrue(assertNotNull(attempts.current()).blocksNextSend)
// Upload the complete owned fixture first: restoring must not rewind unrelated categories.
for (category in BackupCategory.entries.filterNot { it == BackupCategory.LIGHTNING_CONNECTIONS }) {
backups.triggerBackup(category).getOrThrow()
}
val remote = assertNotNull(vss.getObject(BackupCategory.WALLET.name).getOrThrow())
val payload = Json.decodeFromString<WalletBackupV1>(remote.value.decodeToString())
val wire = assertNotNull(payload.paykitPaymentState?.activeOnchainAttempt)
assertEquals(original.attemptId, wire.attemptId)
assertEquals(original.txid, wire.txid)
keychain.delete(Keychain.Key.ONCHAIN_SEND_ATTEMPT.name, original.walletIndex)
assertNull(attempts.current())
backups.performFullRestoreFromLatestBackup().getOrThrow()
val restored = assertNotNull(attempts.current())
assertEquals(original.attemptId, restored.attemptId)
assertEquals(original.walletIndex, restored.walletIndex)
assertEquals(original.walletId, restored.walletId)
assertEquals(original.txid, restored.txid)
assertEquals(original.amountSats, restored.amountSats)
assertEquals(original.originalInputs, restored.originalInputs)
assertEquals(original.candidateTxids, restored.candidateTxids)
assertTrue(restored.hasPositiveEvidence && restored.localFollowupComplete)
} finally {
attempts.restoreActive(original)
attempts.markLocalFollowupComplete(original.attemptId, original.walletIndex)
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
package to.bitkit.services

import android.content.Context
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import dagger.hilt.android.testing.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import to.bitkit.data.SettingsStore
import to.bitkit.data.keychain.Keychain
import to.bitkit.env.Env
import to.bitkit.models.WalletScope
import to.bitkit.repositories.OnchainSendAttemptStore
import to.bitkit.repositories.OnchainSendOutcome
import to.bitkit.repositories.WalletRepo
import to.bitkit.test.annotations.CoreServiceIntegration
import to.bitkit.test.annotations.DeviceIntegration
import java.io.File
import javax.inject.Inject

/** Disposable-device fixture: real signed receipt, deliberately seeded Pending, never a native fault claim. */
@HiltAndroidTest
@RunWith(AndroidJUnit4::class)
@DeviceIntegration
@CoreServiceIntegration
class PreparedOnchainRecoveryFixtureTest {
@get:Rule
val hiltRule = HiltAndroidRule(this)

@Inject
lateinit var lightningService: LightningService

@Inject
lateinit var coreService: CoreService

@Inject
lateinit var keychain: Keychain

@Inject
lateinit var walletRepo: WalletRepo

@Inject
lateinit var store: OnchainSendAttemptStore

@Inject
lateinit var settingsStore: SettingsStore

@Test
fun verifySharedVssBindingVectors() {
val mnemonic = List(11) { "abandon" }.plus("about").joinToString(" ")
val vectors = mapOf(
"bitcoin" to "28f258542d91310274942356e7777d8978bac6dbd3fadbfbfe5d663b19f1f6c5",
"testnet" to "0ce1e7952991cf5ce84bfa135dbc194b3d55a7f2fc69807091c4ca1d6eaac809",
"signet" to "966319adba79fb70afbf6eb1c7bde0cf93433e08d6f2f832c30467b812005fbe",
"regtest" to "fe843546f607f38ba7b1e8fe479c3103139ebea5b83628cbaa465e41cf6cb6c0",
)
vectors.forEach { (network, expected) ->
val storeId = com.synonym.vssclient.vssDeriveStoreId("bitkit_v1_$network", mnemonic, null)
val binding = java.security.MessageDigest.getInstance("SHA-256")
.digest(storeId.toByteArray(Charsets.UTF_8)).joinToString("") { "%02x".format(it) }
org.junit.Assert.assertEquals(expected, binding)
}
}

@Test
fun verifyPersistedOriginalWinnerAfterUi() = runBlocking {
val context = ApplicationProvider.getApplicationContext<Context>()
Env.initAppStoragePath(context.filesDir.absolutePath)
hiltRule.inject()
val attempt = requireNotNull(store.current())
val expectedTxid = requireNotNull(InstrumentationRegistry.getArguments().getString("expectedWinnerTxid"))
org.junit.Assert.assertEquals(expectedTxid, attempt.txid)
org.junit.Assert.assertTrue(attempt.hasPositiveEvidence)
org.junit.Assert.assertTrue(attempt.localFollowupComplete)
org.junit.Assert.assertTrue(attempt.candidateTxids.contains(expectedTxid))
org.junit.Assert.assertFalse(attempt.originalInputs.isNullOrEmpty())
File(context.getExternalFilesDir(null), "recovery-final-native-receipt.json")
.writeText(Json.encodeToString(attempt))
}

@Test
fun seedPreparedOriginalForRecoveryUi() = runBlocking {
val context = ApplicationProvider.getApplicationContext<Context>()
Env.initAppStoragePath(context.filesDir.absolutePath)
hiltRule.inject()
// Refuse a pre-existing wallet; the runner must use an owned, disposable app install.
check(keychain.loadString(Keychain.Key.BIP39_MNEMONIC.name) == null)
walletRepo.createWallet(null).getOrThrow()
keychain.upsertString(Keychain.Key.PIN.name, "1234") // Public disposable-fixture PIN only.
settingsStore.update {
it.copy(
isPinEnabled = true,
isPinForPaymentsEnabled = true,
isBiometricEnabled = false,
electrumServer = InstrumentationRegistry.getArguments().getString("fixtureElectrumUrl")
?: it.electrumServer,
)
}
lightningService.setup(walletIndex = 0)
try {
lightningService.start()
// Let the native initial background sync settle before forcing another sync in this fixture.
delay(15_000)
lightningService.sync()
val depositAddress = lightningService.newAddress()
coreService.blocktank.regtestMine(1u)
coreService.blocktank.regtestDeposit(depositAddress, 100_000uL)
coreService.blocktank.regtestMine(6u)
delay(15_000)
lightningService.sync()
val recipient = "bcrt1qs04g2ka4pr9s3mv73nu32tvfy7r3cxd27wkyu8"
val isMax = InstrumentationRegistry.getArguments().getString("recoveryMode") == "max"
val original = store.admit(
walletId = WalletScope.default, requestId = null, orderId = null, address = recipient,
amountSats = 1_000uL, isMaxAmount = isMax, feeRateSatsPerVByte = 1uL,
isTransfer = false, channelId = null, tags = emptyList(), beforeSendAttempt = {},
)
val prepared = lightningService.prepareOnchainSend(recipient, 1_000uL, 1uL, isMaxAmount = isMax)
store.retainPreparedReceipt(original.attemptId, 0, prepared.receipt, false)
// No original broadcast: this seeds the uncertainty UI using actual native receipt provenance.
val pending = store.recordOutcome(original.attemptId, OnchainSendOutcome.Unknown(prepared.receipt.txid), 0)
File(context.getExternalFilesDir(null), "recovery-original-native-receipt.json")
.writeText(Json.encodeToString(pending))
} finally {
lightningService.stop()
}
// Retain this disposable fixture for the real app UI journey; owned-device teardown removes it afterward.
}
}
7 changes: 5 additions & 2 deletions app/src/androidTest/java/to/bitkit/services/TxBumpingTests.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,14 @@ import org.junit.Test
import org.junit.runner.RunWith
import to.bitkit.data.keychain.Keychain
import to.bitkit.env.Env
import to.bitkit.repositories.OnchainSendOutcome
import to.bitkit.repositories.WalletRepo
import to.bitkit.test.annotations.CoreServiceIntegration
import to.bitkit.test.annotations.DeviceIntegration
import javax.inject.Inject
import kotlin.test.assertEquals
import kotlin.test.assertFalse
import kotlin.test.assertIs
import kotlin.test.assertNotNull
import kotlin.test.assertTrue

Expand Down Expand Up @@ -148,11 +150,12 @@ class TxBumpingTests {
val lowFeeRate = 1uL // 1 sat/vbyte (very low)

println("Sending $sendAmount sats to $destinationAddress with low fee rate of $lowFeeRate sat/vbyte")
val originalTxId = lightningService.send(
val outcome = lightningService.prepareOnchainSend(
address = destinationAddress,
sats = sendAmount,
satsPerVByte = lowFeeRate,
)
).broadcast()
val originalTxId = assertIs<OnchainSendOutcome.Accepted>(outcome).txid

lightningService.sync()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,14 @@ import org.junit.runner.RunWith
import org.lightningdevkit.ldknode.CoinSelectionAlgorithm
import to.bitkit.data.keychain.Keychain
import to.bitkit.env.Env
import to.bitkit.repositories.OnchainSendOutcome
import to.bitkit.repositories.WalletRepo
import to.bitkit.test.annotations.CoreServiceIntegration
import to.bitkit.test.annotations.DeviceIntegration
import javax.inject.Inject
import kotlin.test.assertEquals
import kotlin.test.assertFalse
import kotlin.test.assertIs
import kotlin.test.assertNotNull
import kotlin.test.assertTrue
import kotlin.test.fail
Expand Down Expand Up @@ -203,12 +205,13 @@ class UtxoSelectionTests {
val feeRate = 1uL // 1 sat/vbyte

println("Sending $sendAmount sats to $destinationAddress using specific UTXOs")
val txId = lightningService.send(
val outcome = lightningService.prepareOnchainSend(
address = destinationAddress,
sats = sendAmount,
satsPerVByte = feeRate,
utxosToSpend = utxosToSpend
)
).broadcast()
val txId = assertIs<OnchainSendOutcome.Accepted>(outcome).txid

assertTrue(txId.isNotEmpty(), "Transaction ID should not be empty")
println("Transaction sent successfully with txid: $txId")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,9 @@ class DrawerMenuWidgetsTest {
rootNavController = navController,
hasSeenWidgetsIntro = false,
hasSeenShopIntro = true,
profileIdentityExists = flowOf(false),
onBeforeNavigate = {},
showWidgets = true,
profileIdentityExists = flowOf(false),
)
}
}
Expand Down Expand Up @@ -102,9 +102,9 @@ class DrawerMenuWidgetsTest {
rootNavController = navController,
hasSeenWidgetsIntro = true,
hasSeenShopIntro = true,
profileIdentityExists = flowOf(false),
onBeforeNavigate = {},
showWidgets = true,
profileIdentityExists = flowOf(false),
onOpenWidgetsHome = { openWidgetsHome.value = true },
)
if (openWidgetsHome.value) {
Expand Down Expand Up @@ -139,9 +139,9 @@ class DrawerMenuWidgetsTest {
rootNavController = navController,
hasSeenWidgetsIntro = true,
hasSeenShopIntro = true,
profileIdentityExists = flowOf(false),
onBeforeNavigate = {},
showWidgets = false,
profileIdentityExists = flowOf(false),
onOpenWidgetsHome = { error("Should not request home widgets page") },
onOpenWidgetsSheet = { openWidgetsSheet.value = true },
)
Expand Down Expand Up @@ -179,9 +179,9 @@ class DrawerMenuWidgetsTest {
rootNavController = navController,
hasSeenWidgetsIntro = true,
hasSeenShopIntro = true,
profileIdentityExists = flowOf(true),
onBeforeNavigate = {},
showWidgets = true,
profileIdentityExists = flowOf(true),
isPaykitEnabled = true,
)
}
Expand All @@ -204,9 +204,9 @@ class DrawerMenuWidgetsTest {
rootNavController = navController,
hasSeenWidgetsIntro = true,
hasSeenShopIntro = true,
profileIdentityExists = flowOf(true),
onBeforeNavigate = {},
showWidgets = true,
profileIdentityExists = flowOf(true),
isPaykitEnabled = false,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,8 @@ class MnemonicInputFieldTest {
onPositionChange = {},
onBackspaceInEmpty = { backspaceInEmptyCount++ },
focusRequester = focusRequester,
isFocused = false,
index = 0,
isFocused = true,
)
}
}
Expand Down
Loading
Loading