diff --git a/app/src/main/java/to/bitkit/data/backup/VssBackupClient.kt b/app/src/main/java/to/bitkit/data/backup/VssBackupClient.kt index 845510c18..76c74361c 100644 --- a/app/src/main/java/to/bitkit/data/backup/VssBackupClient.kt +++ b/app/src/main/java/to/bitkit/data/backup/VssBackupClient.kt @@ -26,12 +26,13 @@ class VssBackupClient @Inject constructor( ) { private val isSetup = CompletableDeferred() - suspend fun setup() = withContext(bgDispatcher) { + suspend fun setup(walletIndex: Int = 0) = withContext(bgDispatcher) { try { withTimeout(30.seconds) { Logger.debug("VSS client setting up…", context = TAG) val vssUrl = Env.vssServerUrl val lnurlAuthServerUrl = Env.lnurlAuthServerUrl + val vssStoreId = vssStoreIdProvider.getVssStoreId(walletIndex) Logger.verbose("Building VSS client with vssUrl: '$vssUrl'") Logger.verbose("Building VSS client with lnurlAuthServerUrl: '$lnurlAuthServerUrl'") if (lnurlAuthServerUrl.isNotEmpty()) { @@ -41,7 +42,7 @@ class VssBackupClient @Inject constructor( vssNewClientWithLnurlAuth( baseUrl = vssUrl, - storeId = vssStoreIdProvider.getVssStoreId(), + storeId = vssStoreId, mnemonic = mnemonic, passphrase = passphrase, lnurlAuthServerUrl = lnurlAuthServerUrl, @@ -49,7 +50,7 @@ class VssBackupClient @Inject constructor( } else { vssNewClient( baseUrl = vssUrl, - storeId = vssStoreIdProvider.getVssStoreId(), + storeId = vssStoreId, ) } isSetup.complete(Unit) diff --git a/app/src/main/java/to/bitkit/data/backup/VssStoreIdProvider.kt b/app/src/main/java/to/bitkit/data/backup/VssStoreIdProvider.kt index 3b4e1c81d..ddcb202e9 100644 --- a/app/src/main/java/to/bitkit/data/backup/VssStoreIdProvider.kt +++ b/app/src/main/java/to/bitkit/data/backup/VssStoreIdProvider.kt @@ -5,6 +5,7 @@ import to.bitkit.data.keychain.Keychain import to.bitkit.env.Env import to.bitkit.utils.Logger import to.bitkit.utils.ServiceError +import java.util.concurrent.ConcurrentHashMap import javax.inject.Inject import javax.inject.Singleton @@ -12,14 +13,11 @@ import javax.inject.Singleton class VssStoreIdProvider @Inject constructor( private val keychain: Keychain, ) { - @Volatile - private var cachedStoreId: String? = null + private val cacheMap: MutableMap = ConcurrentHashMap() - fun getVssStoreId(): String { - cachedStoreId?.let { return it } - - return synchronized(this) { - cachedStoreId?.let { return it } + fun getVssStoreId(walletIndex: Int = 0): String { + synchronized(this) { + cacheMap[walletIndex]?.let { return it } val mnemonic = keychain.loadString(Keychain.Key.BIP39_MNEMONIC.name) ?: throw ServiceError.MnemonicNotFound val passphrase = keychain.loadString(Keychain.Key.BIP39_PASSPHRASE.name) @@ -30,12 +28,16 @@ class VssStoreIdProvider @Inject constructor( passphrase = passphrase, ) - Logger.info("VSS store id: '$storeId'", context = TAG) - cachedStoreId = storeId - storeId + cacheMap[walletIndex] = storeId + Logger.info("VSS store id setup for wallet[$walletIndex]: '$storeId'", context = TAG) + return storeId } } + fun clearCache(walletIndex: Int = 0) { + cacheMap.remove(walletIndex) + } + companion object { private const val TAG = "VssStoreIdProvider" } diff --git a/app/src/main/java/to/bitkit/repositories/WalletRepo.kt b/app/src/main/java/to/bitkit/repositories/WalletRepo.kt index 3882c75cb..54ac93f6d 100644 --- a/app/src/main/java/to/bitkit/repositories/WalletRepo.kt +++ b/app/src/main/java/to/bitkit/repositories/WalletRepo.kt @@ -18,6 +18,7 @@ import org.lightningdevkit.ldknode.Event import to.bitkit.data.AppDb import to.bitkit.data.CacheStore import to.bitkit.data.SettingsStore +import to.bitkit.data.backup.VssStoreIdProvider import to.bitkit.data.entities.TagMetadataEntity import to.bitkit.data.keychain.Keychain import to.bitkit.di.BgDispatcher @@ -50,6 +51,7 @@ class WalletRepo @Inject constructor( private val lightningRepo: LightningRepo, private val cacheStore: CacheStore, private val deriveBalanceStateUseCase: DeriveBalanceStateUseCase, + private val vssStoreIdProvider: VssStoreIdProvider, ) { private val repoScope = CoroutineScope(bgDispatcher + SupervisorJob()) @@ -210,6 +212,7 @@ class WalletRepo @Inject constructor( suspend fun wipeWallet(walletIndex: Int = 0): Result = withContext(bgDispatcher) { try { keychain.wipe() + vssStoreIdProvider.clearCache(walletIndex) db.clearAllTables() settingsStore.reset() cacheStore.reset() diff --git a/app/src/main/java/to/bitkit/services/LightningService.kt b/app/src/main/java/to/bitkit/services/LightningService.kt index b6bc78175..fc049e226 100644 --- a/app/src/main/java/to/bitkit/services/LightningService.kt +++ b/app/src/main/java/to/bitkit/services/LightningService.kt @@ -104,7 +104,7 @@ class LightningService @Inject constructor( Logger.debug("Building node…") - val vssStoreId = vssStoreIdProvider.getVssStoreId() + val vssStoreId = vssStoreIdProvider.getVssStoreId(walletIndex) ServiceQueue.LDK.background { node = try { diff --git a/app/src/test/java/to/bitkit/repositories/WalletRepoTest.kt b/app/src/test/java/to/bitkit/repositories/WalletRepoTest.kt index 27259bb42..1fd6f2429 100644 --- a/app/src/test/java/to/bitkit/repositories/WalletRepoTest.kt +++ b/app/src/test/java/to/bitkit/repositories/WalletRepoTest.kt @@ -20,6 +20,7 @@ import to.bitkit.data.AppDb import to.bitkit.data.CacheStore import to.bitkit.data.SettingsData import to.bitkit.data.SettingsStore +import to.bitkit.data.backup.VssStoreIdProvider import to.bitkit.data.keychain.Keychain import to.bitkit.models.BalanceState import to.bitkit.services.CoreService @@ -46,6 +47,7 @@ class WalletRepoTest : BaseUnitTest() { private val lightningRepo: LightningRepo = mock() private val cacheStore: CacheStore = mock() private val deriveBalanceStateUseCase: DeriveBalanceStateUseCase = mock() + private val vssStoreIdProvider = mock() @Before fun setUp() { @@ -75,6 +77,7 @@ class WalletRepoTest : BaseUnitTest() { lightningRepo = lightningRepo, cacheStore = cacheStore, deriveBalanceStateUseCase = deriveBalanceStateUseCase, + vssStoreIdProvider = vssStoreIdProvider, ) @Test