diff --git a/cw_decred/lib/api/libdcrwallet.dart b/cw_decred/lib/api/libdcrwallet.dart index 1942dafae..4b8a01fb2 100644 --- a/cw_decred/lib/api/libdcrwallet.dart +++ b/cw_decred/lib/api/libdcrwallet.dart @@ -31,11 +31,13 @@ Future<void> createWalletAsync( {required String name, required String dataDir, required String password, + required String network, String? mnemonic}) { final args = <String, String>{ "name": name, "dataDir": dataDir, "password": password, + "network": network, "mnemonic": mnemonic ?? "", }; return compute(createWalletSync, args); @@ -48,7 +50,7 @@ void createWalletSync(Map<String, String> args) { final dataDir = args["dataDir"]!.toCString(); final password = args["password"]!.toCString(); final mnemonic = args["mnemonic"]!.toCString(); - final network = "testnet".toCString(); + final network = args["network"]!.toCString(); executePayloadFn( fn: () => @@ -57,11 +59,12 @@ void createWalletSync(Map<String, String> args) { ); } -void createWatchOnlyWallet(String walletName, String datadir, String pubkey) { +void createWatchOnlyWallet( + String walletName, String datadir, String pubkey, String network) { final cName = walletName.toCString(); final cDataDir = datadir.toCString(); final cPub = pubkey.toCString(); - final cNet = "testnet".toCString(); + final cNet = network.toCString(); executePayloadFn( fn: () => dcrwalletApi.createWatchOnlyWallet(cName, cDataDir, cNet, cPub), ptrsToFree: [cName, cDataDir, cNet, cPub], @@ -69,10 +72,12 @@ void createWatchOnlyWallet(String walletName, String datadir, String pubkey) { } /// loadWalletAsync calls the libdcrwallet's loadWallet function asynchronously. -Future<void> loadWalletAsync({required String name, required String dataDir}) { +Future<void> loadWalletAsync( + {required String name, required String dataDir, required String net}) { final args = <String, String>{ "name": name, "dataDir": dataDir, + "network": net, }; return compute(loadWalletSync, args); } @@ -81,7 +86,7 @@ Future<void> loadWalletAsync({required String name, required String dataDir}) { void loadWalletSync(Map<String, String> args) { final name = args["name"]!.toCString(); final dataDir = args["dataDir"]!.toCString(); - final network = "testnet".toCString(); + final network = args["network"]!.toCString(); executePayloadFn( fn: () => dcrwalletApi.loadWallet(name, dataDir, network), ptrsToFree: [name, dataDir, network], diff --git a/cw_decred/lib/wallet.dart b/cw_decred/lib/wallet.dart index 01c025390..d998a38d5 100644 --- a/cw_decred/lib/wallet.dart +++ b/cw_decred/lib/wallet.dart @@ -38,8 +38,10 @@ abstract class DecredWalletBase extends WalletBase<DecredBalance, : _password = password, this.syncStatus = NotConnectedSyncStatus(), this.unspentCoinsInfo = unspentCoinsInfo, - this.watchingOnly = - walletInfo.derivationPath == DecredWalletService.pubkeyRestorePath, + this.watchingOnly = walletInfo.derivationPath == + DecredWalletService.pubkeyRestorePath || + walletInfo.derivationPath == + DecredWalletService.pubkeyRestorePathTestnet, this.balance = ObservableMap.of({CryptoCurrency.dcr: DecredBalance.zero()}), super(walletInfo) { @@ -209,9 +211,16 @@ abstract class DecredWalletBase extends WalletBase<DecredBalance, } persistantPeer = addr; libdcrwallet.closeWallet(walletInfo.name); + final network = walletInfo.derivationPath == + DecredWalletService.seedRestorePathTestnet || + walletInfo.derivationPath == + DecredWalletService.pubkeyRestorePathTestnet + ? "testnet" + : "mainnet"; libdcrwallet.loadWalletSync({ "name": walletInfo.name, "dataDir": walletInfo.dirPath, + "network": network, }); } await this._startSync(); diff --git a/cw_decred/lib/wallet_service.dart b/cw_decred/lib/wallet_service.dart index 8edd86928..02db4f33a 100644 --- a/cw_decred/lib/wallet_service.dart +++ b/cw_decred/lib/wallet_service.dart @@ -21,7 +21,11 @@ class DecredWalletService extends WalletService< final Box<WalletInfo> walletInfoSource; final Box<UnspentCoinsInfo> unspentCoinsInfoSource; final seedRestorePath = "m/44'/42'"; + static final seedRestorePathTestnet = "m/44'/1'"; static final pubkeyRestorePath = "m/44'/42'/0'"; + static final pubkeyRestorePathTestnet = "m/44'/1'/0'"; + final mainnet = "mainnet"; + final testnet = "testnet"; static void init() async { // Use the general path for all dcr wallets as the general log directory. @@ -44,8 +48,10 @@ class DecredWalletService extends WalletService< name: credentials.walletInfo!.name, dataDir: credentials.walletInfo!.dirPath, password: credentials.password!, + network: isTestnet == true ? testnet : mainnet, ); - credentials.walletInfo!.derivationPath = seedRestorePath; + credentials.walletInfo!.derivationPath = + isTestnet == true ? seedRestorePathTestnet : seedRestorePath; final wallet = DecredWallet(credentials.walletInfo!, credentials.password!, this.unspentCoinsInfoSource); await wallet.init(); @@ -56,9 +62,14 @@ class DecredWalletService extends WalletService< Future<DecredWallet> openWallet(String name, String password) async { final walletInfo = walletInfoSource.values.firstWhereOrNull( (info) => info.id == WalletBase.idFor(name, getType()))!; + final network = walletInfo.derivationPath == seedRestorePathTestnet || + walletInfo.derivationPath == pubkeyRestorePathTestnet + ? testnet + : mainnet; await loadWalletAsync( name: walletInfo.name, dataDir: walletInfo.dirPath, + net: network, ); final wallet = DecredWallet(walletInfo, password, this.unspentCoinsInfoSource); @@ -80,6 +91,11 @@ class DecredWalletService extends WalletService< String currentName, String password, String newName) async { final currentWalletInfo = walletInfoSource.values.firstWhereOrNull( (info) => info.id == WalletBase.idFor(currentName, getType()))!; + final network = + currentWalletInfo.derivationPath == seedRestorePathTestnet || + currentWalletInfo.derivationPath == pubkeyRestorePathTestnet + ? testnet + : mainnet; final currentWallet = DecredWallet(currentWalletInfo, password, this.unspentCoinsInfoSource); @@ -99,12 +115,13 @@ class DecredWalletService extends WalletService< DecredRestoreWalletFromSeedCredentials credentials, {bool? isTestnet}) async { await createWalletAsync( - name: credentials.walletInfo!.name, - dataDir: credentials.walletInfo!.dirPath, - password: credentials.password!, - mnemonic: credentials.mnemonic, - ); - credentials.walletInfo!.derivationPath = seedRestorePath; + name: credentials.walletInfo!.name, + dataDir: credentials.walletInfo!.dirPath, + password: credentials.password!, + mnemonic: credentials.mnemonic, + network: isTestnet == true ? testnet : mainnet); + credentials.walletInfo!.derivationPath = + isTestnet == true ? seedRestorePathTestnet : seedRestorePath; final wallet = DecredWallet(credentials.walletInfo!, credentials.password!, this.unspentCoinsInfoSource); await wallet.init();