From 176ed0f89fd9a6d4eddadbdf3bd8e469f8c4c596 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Thu, 20 Mar 2025 14:51:12 -0500 Subject: [PATCH 1/2] Xelis init/open refactor --- lib/wallets/wallet/impl/xelis_wallet.dart | 152 ++++++++++++++++-- .../wallet/intermediate/lib_xelis_wallet.dart | 132 ++------------- 2 files changed, 149 insertions(+), 135 deletions(-) diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index 466755bae..36ebe2812 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -19,6 +19,8 @@ import '../../../services/event_bus/events/global/wallet_sync_status_changed_eve import '../../../services/event_bus/global_event_bus.dart'; import '../../../utilities/amount/amount.dart'; import '../../../utilities/logger.dart'; +import '../../../utilities/stack_file_system.dart'; + import '../../crypto_currency/crypto_currency.dart'; import '../../models/tx_data.dart'; import '../intermediate/lib_xelis_wallet.dart'; @@ -31,7 +33,46 @@ class XelisWallet extends LibXelisWallet { @override int get isarTransactionVersion => 2; + Future _restoreWallet() async { + final tablePath = await getPrecomputedTablesPath(); + final tableState = await getTableState(); + final xelisDir = await StackFileSystem.applicationXelisDirectory(); + final String name = walletId; + final String directory = xelisDir.path; + final password = await secureStorageInterface.read( + key: Wallet.mnemonicPassphraseKey(walletId: info.walletId), + ); + + final mnemonic = await getMnemonic(); + final seedLength = mnemonic.trim().split(" ").length; + + invalidSeedLengthCheck(seedLength); + + Logging.instance.i("Xelis: recovering wallet"); + final wallet = await x_wallet.createXelisWallet( + name: name, + directory: directory, + password: password!, + seed: mnemonic.trim(), + network: cryptoCurrency.network.xelisNetwork, + precomputedTablesPath: tablePath, + l1Low: tableState.currentSize.isLow, + ); + + await secureStorageInterface.write( + key: Wallet.mnemonicKey(walletId: walletId), + value: mnemonic.trim(), + ); + + libXelisWallet = wallet; + } + Future _createNewWallet() async { + final tablePath = await getPrecomputedTablesPath(); + final tableState = await getTableState(); + final xelisDir = await StackFileSystem.applicationXelisDirectory(); + final String name = walletId; + final String directory = xelisDir.path; final String password = generatePassword(); Logging.instance.d("Xelis: storing password"); @@ -39,21 +80,84 @@ class XelisWallet extends LibXelisWallet { key: Wallet.mnemonicPassphraseKey(walletId: info.walletId), value: password, ); + + final wallet = await x_wallet.createXelisWallet( + name: name, + directory: directory, + password: password!, + network: cryptoCurrency.network.xelisNetwork, + precomputedTablesPath: tablePath, + l1Low: tableState.currentSize.isLow, + ); + + final mnemonic = await wallet.getSeed(); + await secureStorageInterface.write( + key: Wallet.mnemonicKey(walletId: walletId), + value: mnemonic.trim(), + ); + + libXelisWallet = wallet; } @override Future init({bool? isRestore}) async { Logging.instance.d("Xelis: init"); - if (isRestore == true) { - await super.init(); - return await open(openType: XelisWalletOpenType.restore); - } + if (libXelisWallet == null) { + if (isRestore == true) { + await _restoreWallet(); + } else { + final bool walletExists = await LibXelisWallet.checkWalletExists(walletId); + if (!walletExists) { + await _createNewWallet(); + } else { + Logging.instance.i("Xelis: opening existing wallet"); + final tablePath = await getPrecomputedTablesPath(); + final tableState = await getTableState(); + final xelisDir = await StackFileSystem.applicationXelisDirectory(); + final String name = walletId; + final String directory = xelisDir.path; + final password = await secureStorageInterface.read( + key: Wallet.mnemonicPassphraseKey(walletId: info.walletId), + ); + + libXelisWallet = await x_wallet.openXelisWallet( + name: name, + directory: directory, + password: password!, + network: cryptoCurrency.network.xelisNetwork, + precomputedTablesPath: tablePath, + l1Low: tableState.currentSize.isLow, + ); + + print("Assigned wallet"); + } + } - final bool walletExists = await LibXelisWallet.checkWalletExists(walletId); - if (!walletExists) { - await _createNewWallet(); - await open(openType: XelisWalletOpenType.create); + if (await isTableUpgradeAvailable()) { + unawaited(updateTablesToDesiredSize()); + } + + final newReceivingAddress = + await getCurrentReceivingAddress() ?? + Address( + walletId: walletId, + derivationIndex: 0, + derivationPath: null, + value: libXelisWallet!.getAddressStr(), + publicKey: [], + type: AddressType.xelis, + subType: AddressSubType.receiving, + ); + + await mainDB.updateOrPutAddresses([newReceivingAddress]); + + if (info.cachedReceivingAddress != newReceivingAddress.value) { + await info.updateReceivingAddress( + newAddress: newReceivingAddress.value, + isar: mainDB.isar, + ); + } } return await super.init(); @@ -88,15 +192,37 @@ class XelisWallet extends LibXelisWallet { @override Future pingCheck() async { - checkInitialized(); try { - await libXelisWallet!.getDaemonInfo(); - await handleOnline(); - return true; + final node = getCurrentNode(); + final daemon = xelis_sdk.DaemonClient( + endPoint: "${node.host!}:${node.port!}", + secureWebSocket: node.useSSL ?? false, + timeout: 5000 + ); + daemon.connect(); + + final xelis_sdk.GetInfoResult networkInfo = await daemon.getInfo(); + bool testPassed = networkInfo.height != null; + + daemon.disconnect(); + + if (testPassed) { + GlobalEventBus.instance.fire( + WalletSyncStatusChangedEvent( + WalletSyncStatus.synced, + walletId, + info.coin, + ), + ); + } else { + await handleOffline(); + } + + return testPassed; } catch (_) { await handleOffline(); return false; - } + } } final _balanceUpdateMutex = Mutex(); diff --git a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart index 62876565b..a20868e74 100644 --- a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart @@ -335,125 +335,15 @@ abstract class LibXelisWallet @override Future open({XelisWalletOpenType? openType}) async { - bool wasNull = false; - - if (libXelisWallet == null) { - wasNull = true; - final tablePath = await getPrecomputedTablesPath(); - final tableState = await getTableState(); - final xelisDir = await StackFileSystem.applicationXelisDirectory(); - final String name = walletId; - final String directory = xelisDir.path; - final password = await secureStorageInterface.read( - key: Wallet.mnemonicPassphraseKey(walletId: info.walletId), - ); - - await LibXelisWallet._initMutex.protect(() async { - try { - libXelisWallet = await syncMutex.protect(() async { - switch (openType) { - case XelisWalletOpenType.create: - Logging.instance.i("Xelis: creating new wallet"); - final wallet = await x_wallet.createXelisWallet( - name: name, - directory: directory, - password: password!, - network: cryptoCurrency.network.xelisNetwork, - precomputedTablesPath: tablePath, - l1Low: tableState.currentSize.isLow, - ); - - final mnemonic = await wallet.getSeed(); - await secureStorageInterface.write( - key: Wallet.mnemonicKey(walletId: walletId), - value: mnemonic.trim(), - ); - - return wallet; - - case XelisWalletOpenType.restore: - final mnemonic = await getMnemonic(); - final seedLength = mnemonic.trim().split(" ").length; - - invalidSeedLengthCheck(seedLength); - - Logging.instance.i("Xelis: recovering wallet"); - final wallet = await x_wallet.createXelisWallet( - name: name, - directory: directory, - password: password!, - seed: mnemonic.trim(), - network: cryptoCurrency.network.xelisNetwork, - precomputedTablesPath: tablePath, - l1Low: tableState.currentSize.isLow, - ); - - await secureStorageInterface.write( - key: Wallet.mnemonicKey(walletId: walletId), - value: mnemonic.trim(), - ); - - return wallet; - - case null: - Logging.instance.i("Xelis: opening existing wallet"); - return await x_wallet.openXelisWallet( - name: name, - directory: directory, - password: password!, - network: cryptoCurrency.network.xelisNetwork, - precomputedTablesPath: tablePath, - l1Low: tableState.currentSize.isLow, - ); - } - }); - } catch (_) { - // Logging.instance.e( - // "Failed to open/create wallet: $e\n$s", - // ); - rethrow; - } - }); - - Logging.instance.i("Xelis: Checking for upgradability"); - if (await isTableUpgradeAvailable()) { - Logging.instance.i("Xelis: Generating large tables in background"); - unawaited(updateTablesToDesiredSize()); - } - } - - final newReceivingAddress = - await getCurrentReceivingAddress() ?? - Address( - walletId: walletId, - derivationIndex: 0, - derivationPath: null, - value: libXelisWallet!.getAddressStr(), - publicKey: [], - type: AddressType.xelis, - subType: AddressSubType.receiving, - ); - await mainDB.updateOrPutAddresses([newReceivingAddress]); - - if (info.cachedReceivingAddress != newReceivingAddress.value) { - await info.updateReceivingAddress( - newAddress: newReceivingAddress.value, - isar: mainDB.isar, - ); - } - - if (wasNull) { - try { - await connect(); - } catch (e) { - // Logging.instance.log( - // "Failed to start sync: $e", - // level: LogLevel.Error, - // ); - rethrow; - } + try { + await connect(); + } catch (e) { + // Logging.instance.log( + // "Failed to start sync: $e", + // level: LogLevel.Error, + // ); + rethrow; } - unawaited(refresh()); } @@ -467,10 +357,6 @@ abstract class LibXelisWallet _eventSubscription = null; await libXelisWallet?.offlineMode(); - await libXelisWallet?.close(); - libXelisWallet?.dispose(); - libXelisWallet = null; - await super.exit(); }); } @@ -521,6 +407,8 @@ extension XelisTableManagement on LibXelisWallet { await setTableState(state.copyWith(isGenerating: true)); try { + Logging.instance.i("Xelis: Generating large tables in background"); + final tablePath = await getPrecomputedTablesPath(); await x_wallet.updateTables( precomputedTablesPath: tablePath, From ae0631adebbcbe309f7ca68cc87e08059f68e229 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Thu, 20 Mar 2025 15:11:37 -0500 Subject: [PATCH 2/2] reversed investigative changes --- lib/wallets/wallet/impl/xelis_wallet.dart | 32 +++-------------------- 1 file changed, 4 insertions(+), 28 deletions(-) diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index 36ebe2812..06ee5147c 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -129,8 +129,6 @@ class XelisWallet extends LibXelisWallet { precomputedTablesPath: tablePath, l1Low: tableState.currentSize.isLow, ); - - print("Assigned wallet"); } } @@ -192,33 +190,11 @@ class XelisWallet extends LibXelisWallet { @override Future pingCheck() async { + checkInitialized(); try { - final node = getCurrentNode(); - final daemon = xelis_sdk.DaemonClient( - endPoint: "${node.host!}:${node.port!}", - secureWebSocket: node.useSSL ?? false, - timeout: 5000 - ); - daemon.connect(); - - final xelis_sdk.GetInfoResult networkInfo = await daemon.getInfo(); - bool testPassed = networkInfo.height != null; - - daemon.disconnect(); - - if (testPassed) { - GlobalEventBus.instance.fire( - WalletSyncStatusChangedEvent( - WalletSyncStatus.synced, - walletId, - info.coin, - ), - ); - } else { - await handleOffline(); - } - - return testPassed; + await libXelisWallet!.getDaemonInfo(); + await handleOnline(); + return true; } catch (_) { await handleOffline(); return false;