null address fix

This commit is contained in:
julian 2023-01-23 10:32:53 -06:00
parent a135404d67
commit 54cabe935f
9 changed files with 189 additions and 187 deletions

View file

@ -185,24 +185,28 @@ class BitcoinWallet extends CoinServiceAPI with WalletCache, WalletDB {
Future<String> get currentReceivingAddress async => Future<String> get currentReceivingAddress async =>
(await _currentReceivingAddress).value; (await _currentReceivingAddress).value;
Future<isar_models.Address> get _currentReceivingAddress async => (await db Future<isar_models.Address> get _currentReceivingAddress async =>
(await db
.getAddresses(walletId) .getAddresses(walletId)
.filter() .filter()
.typeEqualTo(isar_models.AddressType.p2wpkh) .typeEqualTo(isar_models.AddressType.p2wpkh)
.subTypeEqualTo(isar_models.AddressSubType.receiving) .subTypeEqualTo(isar_models.AddressSubType.receiving)
.sortByDerivationIndexDesc() .sortByDerivationIndexDesc()
.findFirst())!; .findFirst()) ??
await _generateAddressForChain(0, 0, DerivePathType.bip84);
Future<String> get currentChangeAddress async => Future<String> get currentChangeAddress async =>
(await _currentChangeAddress).value; (await _currentChangeAddress).value;
Future<isar_models.Address> get _currentChangeAddress async => (await db Future<isar_models.Address> get _currentChangeAddress async =>
(await db
.getAddresses(walletId) .getAddresses(walletId)
.filter() .filter()
.typeEqualTo(isar_models.AddressType.p2wpkh) .typeEqualTo(isar_models.AddressType.p2wpkh)
.subTypeEqualTo(isar_models.AddressSubType.change) .subTypeEqualTo(isar_models.AddressSubType.change)
.sortByDerivationIndexDesc() .sortByDerivationIndexDesc()
.findFirst())!; .findFirst()) ??
await _generateAddressForChain(1, 0, DerivePathType.bip84);
@override @override
Future<void> exit() async { Future<void> exit() async {
@ -1163,6 +1167,8 @@ class BitcoinWallet extends CoinServiceAPI with WalletCache, WalletDB {
} }
await _prefs.init(); await _prefs.init();
await _checkCurrentChangeAddressesForTransactions();
await _checkCurrentReceivingAddressesForTransactions();
} }
// hack to add tx to txData before refresh completes // hack to add tx to txData before refresh completes
@ -1856,7 +1862,7 @@ class BitcoinWallet extends CoinServiceAPI with WalletCache, WalletDB {
'Number of txs for current receiving address $currentReceiving: $txCount', 'Number of txs for current receiving address $currentReceiving: $txCount',
level: LogLevel.Info); level: LogLevel.Info);
if (txCount >= 1) { if (txCount >= 1 || currentReceiving.derivationIndex < 0) {
// First increment the receiving index // First increment the receiving index
final newReceivingIndex = currentReceiving.derivationIndex + 1; final newReceivingIndex = currentReceiving.derivationIndex + 1;
@ -1875,12 +1881,9 @@ class BitcoinWallet extends CoinServiceAPI with WalletCache, WalletDB {
} else { } else {
// we need to update the address // we need to update the address
await db.updateAddress(existing, newReceivingAddress); await db.updateAddress(existing, newReceivingAddress);
// since we updated an existing address there is a chance it has
// some tx history. To prevent address reuse we will call check again
// recursively
await _checkReceivingAddressForTransactions();
} }
// keep checking until address with no tx history is set as current
await _checkReceivingAddressForTransactions();
} }
} catch (e, s) { } catch (e, s) {
Logging.instance.log( Logging.instance.log(
@ -1898,7 +1901,7 @@ class BitcoinWallet extends CoinServiceAPI with WalletCache, WalletDB {
'Number of txs for current change address $currentChange: $txCount', 'Number of txs for current change address $currentChange: $txCount',
level: LogLevel.Info); level: LogLevel.Info);
if (txCount >= 1) { if (txCount >= 1 || currentChange.derivationIndex < 0) {
// First increment the change index // First increment the change index
final newChangeIndex = currentChange.derivationIndex + 1; final newChangeIndex = currentChange.derivationIndex + 1;
@ -1917,12 +1920,9 @@ class BitcoinWallet extends CoinServiceAPI with WalletCache, WalletDB {
} else { } else {
// we need to update the address // we need to update the address
await db.updateAddress(existing, newChangeAddress); await db.updateAddress(existing, newChangeAddress);
// since we updated an existing address there is a chance it has
// some tx history. To prevent address reuse we will call check again
// recursively
await _checkChangeAddressForTransactions();
} }
// keep checking until address with no tx history is set as current
await _checkChangeAddressForTransactions();
} }
} on SocketException catch (se, s) { } on SocketException catch (se, s) {
Logging.instance.log( Logging.instance.log(

View file

@ -162,24 +162,28 @@ class BitcoinCashWallet extends CoinServiceAPI with WalletCache, WalletDB {
Future<String> get currentReceivingAddress async => Future<String> get currentReceivingAddress async =>
(await _currentReceivingAddress).value; (await _currentReceivingAddress).value;
Future<isar_models.Address> get _currentReceivingAddress async => (await db Future<isar_models.Address> get _currentReceivingAddress async =>
(await db
.getAddresses(walletId) .getAddresses(walletId)
.filter() .filter()
.typeEqualTo(isar_models.AddressType.p2pkh) .typeEqualTo(isar_models.AddressType.p2pkh)
.subTypeEqualTo(isar_models.AddressSubType.receiving) .subTypeEqualTo(isar_models.AddressSubType.receiving)
.sortByDerivationIndexDesc() .sortByDerivationIndexDesc()
.findFirst())!; .findFirst()) ??
await _generateAddressForChain(0, 0, DerivePathType.bip44);
Future<String> get currentChangeAddress async => Future<String> get currentChangeAddress async =>
(await _currentChangeAddress).value; (await _currentChangeAddress).value;
Future<isar_models.Address> get _currentChangeAddress async => (await db Future<isar_models.Address> get _currentChangeAddress async =>
(await db
.getAddresses(walletId) .getAddresses(walletId)
.filter() .filter()
.typeEqualTo(isar_models.AddressType.p2pkh) .typeEqualTo(isar_models.AddressType.p2pkh)
.subTypeEqualTo(isar_models.AddressSubType.change) .subTypeEqualTo(isar_models.AddressSubType.change)
.sortByDerivationIndexDesc() .sortByDerivationIndexDesc()
.findFirst())!; .findFirst()) ??
await _generateAddressForChain(1, 0, DerivePathType.bip44);
@override @override
Future<void> exit() async { Future<void> exit() async {
@ -1093,6 +1097,8 @@ class BitcoinCashWallet extends CoinServiceAPI with WalletCache, WalletDB {
} }
await _prefs.init(); await _prefs.init();
await _checkCurrentChangeAddressesForTransactions();
await _checkCurrentReceivingAddressesForTransactions();
} }
// hack to add tx to txData before refresh completes // hack to add tx to txData before refresh completes
@ -1740,7 +1746,7 @@ class BitcoinCashWallet extends CoinServiceAPI with WalletCache, WalletDB {
'Number of txs for current receiving address $currentReceiving: $txCount', 'Number of txs for current receiving address $currentReceiving: $txCount',
level: LogLevel.Info); level: LogLevel.Info);
if (txCount >= 1) { if (txCount >= 1 || currentReceiving.derivationIndex < 0) {
// First increment the receiving index // First increment the receiving index
final newReceivingIndex = currentReceiving.derivationIndex + 1; final newReceivingIndex = currentReceiving.derivationIndex + 1;
@ -1759,12 +1765,9 @@ class BitcoinCashWallet extends CoinServiceAPI with WalletCache, WalletDB {
} else { } else {
// we need to update the address // we need to update the address
await db.updateAddress(existing, newReceivingAddress); await db.updateAddress(existing, newReceivingAddress);
// since we updated an existing address there is a chance it has
// some tx history. To prevent address reuse we will call check again
// recursively
await _checkReceivingAddressForTransactions();
} }
// keep checking until address with no tx history is set as current
await _checkReceivingAddressForTransactions();
} }
} on SocketException catch (se, s) { } on SocketException catch (se, s) {
Logging.instance.log( Logging.instance.log(
@ -1787,7 +1790,7 @@ class BitcoinCashWallet extends CoinServiceAPI with WalletCache, WalletDB {
'Number of txs for current change address $currentChange: $txCount', 'Number of txs for current change address $currentChange: $txCount',
level: LogLevel.Info); level: LogLevel.Info);
if (txCount >= 1) { if (txCount >= 1 || currentChange.derivationIndex < 0) {
// First increment the change index // First increment the change index
final newChangeIndex = currentChange.derivationIndex + 1; final newChangeIndex = currentChange.derivationIndex + 1;
@ -1806,12 +1809,9 @@ class BitcoinCashWallet extends CoinServiceAPI with WalletCache, WalletDB {
} else { } else {
// we need to update the address // we need to update the address
await db.updateAddress(existing, newChangeAddress); await db.updateAddress(existing, newChangeAddress);
// since we updated an existing address there is a chance it has
// some tx history. To prevent address reuse we will call check again
// recursively
await _checkChangeAddressForTransactions();
} }
// keep checking until address with no tx history is set as current
await _checkChangeAddressForTransactions();
} }
} on SocketException catch (se, s) { } on SocketException catch (se, s) {
Logging.instance.log( Logging.instance.log(

View file

@ -160,25 +160,29 @@ class DogecoinWallet extends CoinServiceAPI with WalletCache, WalletDB {
Future<String> get currentReceivingAddress async => Future<String> get currentReceivingAddress async =>
(await _currentReceivingAddress).value; (await _currentReceivingAddress).value;
Future<isar_models.Address> get _currentReceivingAddress async => (await db Future<isar_models.Address> get _currentReceivingAddress async =>
(await db
.getAddresses(walletId) .getAddresses(walletId)
.filter() .filter()
.typeEqualTo(isar_models.AddressType.p2pkh) .typeEqualTo(isar_models.AddressType.p2pkh)
.subTypeEqualTo(isar_models.AddressSubType.receiving) .subTypeEqualTo(isar_models.AddressSubType.receiving)
.sortByDerivationIndexDesc() .sortByDerivationIndexDesc()
.findFirst())!; .findFirst()) ??
await _generateAddressForChain(0, 0, DerivePathType.bip44);
// @override // @override
Future<String> get currentChangeAddress async => Future<String> get currentChangeAddress async =>
(await _currentChangeAddress).value; (await _currentChangeAddress).value;
Future<isar_models.Address> get _currentChangeAddress async => (await db Future<isar_models.Address> get _currentChangeAddress async =>
(await db
.getAddresses(walletId) .getAddresses(walletId)
.filter() .filter()
.typeEqualTo(isar_models.AddressType.p2pkh) .typeEqualTo(isar_models.AddressType.p2pkh)
.subTypeEqualTo(isar_models.AddressSubType.change) .subTypeEqualTo(isar_models.AddressSubType.change)
.sortByDerivationIndexDesc() .sortByDerivationIndexDesc()
.findFirst())!; .findFirst()) ??
await _generateAddressForChain(1, 0, DerivePathType.bip44);
@override @override
Future<void> exit() async { Future<void> exit() async {
@ -998,6 +1002,8 @@ class DogecoinWallet extends CoinServiceAPI with WalletCache, WalletDB {
} }
await _prefs.init(); await _prefs.init();
await _checkCurrentChangeAddressesForTransactions();
await _checkCurrentReceivingAddressesForTransactions();
} }
// hack to add tx to txData before refresh completes // hack to add tx to txData before refresh completes
@ -1644,7 +1650,7 @@ class DogecoinWallet extends CoinServiceAPI with WalletCache, WalletDB {
'Number of txs for current receiving address $currentReceiving: $txCount', 'Number of txs for current receiving address $currentReceiving: $txCount',
level: LogLevel.Info); level: LogLevel.Info);
if (txCount >= 1) { if (txCount >= 1 || currentReceiving.derivationIndex < 0) {
// First increment the receiving index // First increment the receiving index
final newReceivingIndex = currentReceiving.derivationIndex + 1; final newReceivingIndex = currentReceiving.derivationIndex + 1;
@ -1663,12 +1669,9 @@ class DogecoinWallet extends CoinServiceAPI with WalletCache, WalletDB {
} else { } else {
// we need to update the address // we need to update the address
await db.updateAddress(existing, newReceivingAddress); await db.updateAddress(existing, newReceivingAddress);
// since we updated an existing address there is a chance it has
// some tx history. To prevent address reuse we will call check again
// recursively
await _checkReceivingAddressForTransactions();
} }
// keep checking until address with no tx history is set as current
await _checkReceivingAddressForTransactions();
} }
} on SocketException catch (se, s) { } on SocketException catch (se, s) {
Logging.instance.log( Logging.instance.log(
@ -1691,7 +1694,7 @@ class DogecoinWallet extends CoinServiceAPI with WalletCache, WalletDB {
'Number of txs for current change address $currentChange: $txCount', 'Number of txs for current change address $currentChange: $txCount',
level: LogLevel.Info); level: LogLevel.Info);
if (txCount >= 1) { if (txCount >= 1 || currentChange.derivationIndex < 0) {
// First increment the change index // First increment the change index
final newChangeIndex = currentChange.derivationIndex + 1; final newChangeIndex = currentChange.derivationIndex + 1;
@ -1710,12 +1713,9 @@ class DogecoinWallet extends CoinServiceAPI with WalletCache, WalletDB {
} else { } else {
// we need to update the address // we need to update the address
await db.updateAddress(existing, newChangeAddress); await db.updateAddress(existing, newChangeAddress);
// since we updated an existing address there is a chance it has
// some tx history. To prevent address reuse we will call check again
// recursively
await checkChangeAddressForTransactions();
} }
// keep checking until address with no tx history is set as current
await checkChangeAddressForTransactions();
} }
} catch (e, s) { } catch (e, s) {
Logging.instance.log( Logging.instance.log(

View file

@ -871,24 +871,28 @@ class FiroWallet extends CoinServiceAPI with WalletCache, WalletDB, FiroHive {
Future<String> get currentReceivingAddress async => Future<String> get currentReceivingAddress async =>
(await _currentReceivingAddress).value; (await _currentReceivingAddress).value;
Future<isar_models.Address> get _currentReceivingAddress async => (await db Future<isar_models.Address> get _currentReceivingAddress async =>
(await db
.getAddresses(walletId) .getAddresses(walletId)
.filter() .filter()
.typeEqualTo(isar_models.AddressType.p2pkh) .typeEqualTo(isar_models.AddressType.p2pkh)
.subTypeEqualTo(isar_models.AddressSubType.receiving) .subTypeEqualTo(isar_models.AddressSubType.receiving)
.sortByDerivationIndexDesc() .sortByDerivationIndexDesc()
.findFirst())!; .findFirst()) ??
await _generateAddressForChain(0, 0);
Future<String> get currentChangeAddress async => Future<String> get currentChangeAddress async =>
(await _currentChangeAddress).value; (await _currentChangeAddress).value;
Future<isar_models.Address> get _currentChangeAddress async => (await db Future<isar_models.Address> get _currentChangeAddress async =>
(await db
.getAddresses(walletId) .getAddresses(walletId)
.filter() .filter()
.typeEqualTo(isar_models.AddressType.p2pkh) .typeEqualTo(isar_models.AddressType.p2pkh)
.subTypeEqualTo(isar_models.AddressSubType.change) .subTypeEqualTo(isar_models.AddressSubType.change)
.sortByDerivationIndexDesc() .sortByDerivationIndexDesc()
.findFirst())!; .findFirst()) ??
await _generateAddressForChain(1, 0);
late String _walletName; late String _walletName;
@override @override
@ -1831,6 +1835,8 @@ class FiroWallet extends CoinServiceAPI with WalletCache, WalletDB, FiroHive {
"Attempted to initialize an existing wallet using an unknown wallet ID!"); "Attempted to initialize an existing wallet using an unknown wallet ID!");
} }
await _prefs.init(); await _prefs.init();
await checkChangeAddressForTransactions();
await checkReceivingAddressForTransactions();
} }
Future<bool> refreshIfThereIsNewData() async { Future<bool> refreshIfThereIsNewData() async {
@ -3144,7 +3150,7 @@ class FiroWallet extends CoinServiceAPI with WalletCache, WalletDB, FiroHive {
'Number of txs for current receiving address $currentReceiving: $txCount', 'Number of txs for current receiving address $currentReceiving: $txCount',
level: LogLevel.Info); level: LogLevel.Info);
if (txCount >= 1) { if (txCount >= 1 || currentReceiving.derivationIndex < 0) {
// First increment the receiving index // First increment the receiving index
final newReceivingIndex = currentReceiving.derivationIndex + 1; final newReceivingIndex = currentReceiving.derivationIndex + 1;
@ -3165,12 +3171,9 @@ class FiroWallet extends CoinServiceAPI with WalletCache, WalletDB, FiroHive {
} else { } else {
// we need to update the address // we need to update the address
await db.updateAddress(existing, newReceivingAddress); await db.updateAddress(existing, newReceivingAddress);
// since we updated an existing address there is a chance it has
// some tx history. To prevent address reuse we will call check again
// recursively
await checkReceivingAddressForTransactions();
} }
// keep checking until address with no tx history is set as current
await checkReceivingAddressForTransactions();
} }
} on SocketException catch (se, s) { } on SocketException catch (se, s) {
Logging.instance.log( Logging.instance.log(
@ -3194,7 +3197,7 @@ class FiroWallet extends CoinServiceAPI with WalletCache, WalletDB, FiroHive {
'Number of txs for current change address: $currentChange: $txCount', 'Number of txs for current change address: $currentChange: $txCount',
level: LogLevel.Info); level: LogLevel.Info);
if (txCount >= 1) { if (txCount >= 1 || currentChange.derivationIndex < 0) {
// First increment the change index // First increment the change index
final newChangeIndex = currentChange.derivationIndex + 1; final newChangeIndex = currentChange.derivationIndex + 1;
@ -3215,12 +3218,9 @@ class FiroWallet extends CoinServiceAPI with WalletCache, WalletDB, FiroHive {
} else { } else {
// we need to update the address // we need to update the address
await db.updateAddress(existing, newChangeAddress); await db.updateAddress(existing, newChangeAddress);
// since we updated an existing address there is a chance it has
// some tx history. To prevent address reuse we will call check again
// recursively
await checkChangeAddressForTransactions();
} }
// keep checking until address with no tx history is set as current
await checkChangeAddressForTransactions();
} }
} on SocketException catch (se, s) { } on SocketException catch (se, s) {
Logging.instance.log( Logging.instance.log(

View file

@ -185,24 +185,28 @@ class LitecoinWallet extends CoinServiceAPI with WalletCache, WalletDB {
Future<String> get currentReceivingAddress async => Future<String> get currentReceivingAddress async =>
(await _currentReceivingAddress).value; (await _currentReceivingAddress).value;
Future<isar_models.Address> get _currentReceivingAddress async => (await db Future<isar_models.Address> get _currentReceivingAddress async =>
(await db
.getAddresses(walletId) .getAddresses(walletId)
.filter() .filter()
.typeEqualTo(isar_models.AddressType.p2wpkh) .typeEqualTo(isar_models.AddressType.p2wpkh)
.subTypeEqualTo(isar_models.AddressSubType.receiving) .subTypeEqualTo(isar_models.AddressSubType.receiving)
.sortByDerivationIndexDesc() .sortByDerivationIndexDesc()
.findFirst())!; .findFirst()) ??
await _generateAddressForChain(0, 0, DerivePathType.bip84);
Future<String> get currentChangeAddress async => Future<String> get currentChangeAddress async =>
(await _currentChangeAddress).value; (await _currentChangeAddress).value;
Future<isar_models.Address> get _currentChangeAddress async => (await db Future<isar_models.Address> get _currentChangeAddress async =>
(await db
.getAddresses(walletId) .getAddresses(walletId)
.filter() .filter()
.typeEqualTo(isar_models.AddressType.p2wpkh) .typeEqualTo(isar_models.AddressType.p2wpkh)
.subTypeEqualTo(isar_models.AddressSubType.change) .subTypeEqualTo(isar_models.AddressSubType.change)
.sortByDerivationIndexDesc() .sortByDerivationIndexDesc()
.findFirst())!; .findFirst()) ??
await _generateAddressForChain(1, 0, DerivePathType.bip84);
@override @override
Future<void> exit() async { Future<void> exit() async {
@ -1181,6 +1185,8 @@ class LitecoinWallet extends CoinServiceAPI with WalletCache, WalletDB {
"Attempted to initialize an existing wallet using an unknown wallet ID!"); "Attempted to initialize an existing wallet using an unknown wallet ID!");
} }
await _prefs.init(); await _prefs.init();
await _checkCurrentChangeAddressesForTransactions();
await _checkCurrentReceivingAddressesForTransactions();
} }
// hack to add tx to txData before refresh completes // hack to add tx to txData before refresh completes
@ -1879,7 +1885,7 @@ class LitecoinWallet extends CoinServiceAPI with WalletCache, WalletDB {
'Number of txs for current receiving address $currentReceiving: $txCount', 'Number of txs for current receiving address $currentReceiving: $txCount',
level: LogLevel.Info); level: LogLevel.Info);
if (txCount >= 1) { if (txCount >= 1 || currentReceiving.derivationIndex < 0) {
// First increment the receiving index // First increment the receiving index
final newReceivingIndex = currentReceiving.derivationIndex + 1; final newReceivingIndex = currentReceiving.derivationIndex + 1;
@ -1898,12 +1904,9 @@ class LitecoinWallet extends CoinServiceAPI with WalletCache, WalletDB {
} else { } else {
// we need to update the address // we need to update the address
await db.updateAddress(existing, newReceivingAddress); await db.updateAddress(existing, newReceivingAddress);
// since we updated an existing address there is a chance it has
// some tx history. To prevent address reuse we will call check again
// recursively
await _checkReceivingAddressForTransactions();
} }
// keep checking until address with no tx history is set as current
await _checkReceivingAddressForTransactions();
} }
} catch (e, s) { } catch (e, s) {
Logging.instance.log( Logging.instance.log(
@ -1921,7 +1924,7 @@ class LitecoinWallet extends CoinServiceAPI with WalletCache, WalletDB {
'Number of txs for current change address $currentChange: $txCount', 'Number of txs for current change address $currentChange: $txCount',
level: LogLevel.Info); level: LogLevel.Info);
if (txCount >= 1) { if (txCount >= 1 || currentChange.derivationIndex < 0) {
// First increment the change index // First increment the change index
final newChangeIndex = currentChange.derivationIndex + 1; final newChangeIndex = currentChange.derivationIndex + 1;
@ -1940,12 +1943,9 @@ class LitecoinWallet extends CoinServiceAPI with WalletCache, WalletDB {
} else { } else {
// we need to update the address // we need to update the address
await db.updateAddress(existing, newChangeAddress); await db.updateAddress(existing, newChangeAddress);
// since we updated an existing address there is a chance it has
// some tx history. To prevent address reuse we will call check again
// recursively
await _checkChangeAddressForTransactions();
} }
// keep checking until address with no tx history is set as current
await _checkChangeAddressForTransactions();
} }
} on SocketException catch (se, s) { } on SocketException catch (se, s) {
Logging.instance.log( Logging.instance.log(

View file

@ -288,6 +288,8 @@ class MoneroWallet extends CoinServiceAPI with WalletCache, WalletDB {
} }
walletBase = (await walletService!.openWallet(_walletId, password)) walletBase = (await walletService!.openWallet(_walletId, password))
as MoneroWalletBase; as MoneroWalletBase;
await _checkCurrentReceivingAddressesForTransactions();
// walletBase!.onNewBlock = onNewBlock; // walletBase!.onNewBlock = onNewBlock;
// walletBase!.onNewTransaction = onNewTransaction; // walletBase!.onNewTransaction = onNewTransaction;
// walletBase!.syncStatusChanged = syncStatusChanged; // walletBase!.syncStatusChanged = syncStatusChanged;

View file

@ -180,24 +180,28 @@ class NamecoinWallet extends CoinServiceAPI with WalletCache, WalletDB {
Future<String> get currentReceivingAddress async => Future<String> get currentReceivingAddress async =>
(await _currentReceivingAddress).value; (await _currentReceivingAddress).value;
Future<isar_models.Address> get _currentReceivingAddress async => (await db Future<isar_models.Address> get _currentReceivingAddress async =>
(await db
.getAddresses(walletId) .getAddresses(walletId)
.filter() .filter()
.typeEqualTo(isar_models.AddressType.p2wpkh) .typeEqualTo(isar_models.AddressType.p2wpkh)
.subTypeEqualTo(isar_models.AddressSubType.receiving) .subTypeEqualTo(isar_models.AddressSubType.receiving)
.sortByDerivationIndexDesc() .sortByDerivationIndexDesc()
.findFirst())!; .findFirst()) ??
await _generateAddressForChain(0, 0, DerivePathType.bip84);
Future<String> get currentChangeAddress async => Future<String> get currentChangeAddress async =>
(await _currentChangeAddress).value; (await _currentChangeAddress).value;
Future<isar_models.Address> get _currentChangeAddress async => (await db Future<isar_models.Address> get _currentChangeAddress async =>
(await db
.getAddresses(walletId) .getAddresses(walletId)
.filter() .filter()
.typeEqualTo(isar_models.AddressType.p2wpkh) .typeEqualTo(isar_models.AddressType.p2wpkh)
.subTypeEqualTo(isar_models.AddressSubType.change) .subTypeEqualTo(isar_models.AddressSubType.change)
.sortByDerivationIndexDesc() .sortByDerivationIndexDesc()
.findFirst())!; .findFirst()) ??
await _generateAddressForChain(1, 0, DerivePathType.bip84);
@override @override
Future<void> exit() async { Future<void> exit() async {
@ -1170,6 +1174,8 @@ class NamecoinWallet extends CoinServiceAPI with WalletCache, WalletDB {
"Attempted to initialize an existing wallet using an unknown wallet ID!"); "Attempted to initialize an existing wallet using an unknown wallet ID!");
} }
await _prefs.init(); await _prefs.init();
await _checkCurrentChangeAddressesForTransactions();
await _checkCurrentReceivingAddressesForTransactions();
} }
// hack to add tx to txData before refresh completes // hack to add tx to txData before refresh completes
@ -1861,7 +1867,7 @@ class NamecoinWallet extends CoinServiceAPI with WalletCache, WalletDB {
'Number of txs for current receiving address $currentReceiving: $txCount', 'Number of txs for current receiving address $currentReceiving: $txCount',
level: LogLevel.Info); level: LogLevel.Info);
if (txCount >= 1) { if (txCount >= 1 || currentReceiving.derivationIndex < 0) {
// First increment the receiving index // First increment the receiving index
final newReceivingIndex = currentReceiving.derivationIndex + 1; final newReceivingIndex = currentReceiving.derivationIndex + 1;
@ -1880,12 +1886,9 @@ class NamecoinWallet extends CoinServiceAPI with WalletCache, WalletDB {
} else { } else {
// we need to update the address // we need to update the address
await db.updateAddress(existing, newReceivingAddress); await db.updateAddress(existing, newReceivingAddress);
// since we updated an existing address there is a chance it has
// some tx history. To prevent address reuse we will call check again
// recursively
await _checkReceivingAddressForTransactions();
} }
// keep checking until address with no tx history is set as current
await _checkReceivingAddressForTransactions();
} }
} catch (e, s) { } catch (e, s) {
Logging.instance.log( Logging.instance.log(
@ -1903,7 +1906,7 @@ class NamecoinWallet extends CoinServiceAPI with WalletCache, WalletDB {
'Number of txs for current change address $currentChange: $txCount', 'Number of txs for current change address $currentChange: $txCount',
level: LogLevel.Info); level: LogLevel.Info);
if (txCount >= 1) { if (txCount >= 1 || currentChange.derivationIndex < 0) {
// First increment the change index // First increment the change index
final newChangeIndex = currentChange.derivationIndex + 1; final newChangeIndex = currentChange.derivationIndex + 1;
@ -1922,12 +1925,10 @@ class NamecoinWallet extends CoinServiceAPI with WalletCache, WalletDB {
} else { } else {
// we need to update the address // we need to update the address
await db.updateAddress(existing, newChangeAddress); await db.updateAddress(existing, newChangeAddress);
// since we updated an existing address there is a chance it has
// some tx history. To prevent address reuse we will call check again
// recursively
await _checkChangeAddressForTransactions();
} }
// keep checking until address with no tx history is set as current
await _checkChangeAddressForTransactions();
} }
} on SocketException catch (se, s) { } on SocketException catch (se, s) {
Logging.instance.log( Logging.instance.log(

View file

@ -176,24 +176,28 @@ class ParticlWallet extends CoinServiceAPI with WalletCache, WalletDB {
Future<String> get currentReceivingAddress async => Future<String> get currentReceivingAddress async =>
(await _currentReceivingAddress).value; (await _currentReceivingAddress).value;
Future<isar_models.Address> get _currentReceivingAddress async => (await db Future<isar_models.Address> get _currentReceivingAddress async =>
(await db
.getAddresses(walletId) .getAddresses(walletId)
.filter() .filter()
.typeEqualTo(isar_models.AddressType.p2wpkh) .typeEqualTo(isar_models.AddressType.p2wpkh)
.subTypeEqualTo(isar_models.AddressSubType.receiving) .subTypeEqualTo(isar_models.AddressSubType.receiving)
.sortByDerivationIndexDesc() .sortByDerivationIndexDesc()
.findFirst())!; .findFirst()) ??
await _generateAddressForChain(0, 0, DerivePathType.bip84);
Future<String> get currentChangeAddress async => Future<String> get currentChangeAddress async =>
(await _currentChangeAddress).value; (await _currentChangeAddress).value;
Future<isar_models.Address> get _currentChangeAddress async => (await db Future<isar_models.Address> get _currentChangeAddress async =>
(await db
.getAddresses(walletId) .getAddresses(walletId)
.filter() .filter()
.typeEqualTo(isar_models.AddressType.p2wpkh) .typeEqualTo(isar_models.AddressType.p2wpkh)
.subTypeEqualTo(isar_models.AddressSubType.change) .subTypeEqualTo(isar_models.AddressSubType.change)
.sortByDerivationIndexDesc() .sortByDerivationIndexDesc()
.findFirst())!; .findFirst()) ??
await _generateAddressForChain(1, 0, DerivePathType.bip84);
@override @override
Future<void> exit() async { Future<void> exit() async {
@ -1100,6 +1104,8 @@ class ParticlWallet extends CoinServiceAPI with WalletCache, WalletDB {
"Attempted to initialize an existing wallet using an unknown wallet ID!"); "Attempted to initialize an existing wallet using an unknown wallet ID!");
} }
await _prefs.init(); await _prefs.init();
await _checkCurrentChangeAddressesForTransactions();
await _checkCurrentReceivingAddressesForTransactions();
} }
// TODO make sure this copied implementation from bitcoin_wallet.dart applies for particl just as well--or import it // TODO make sure this copied implementation from bitcoin_wallet.dart applies for particl just as well--or import it
@ -1749,7 +1755,7 @@ class ParticlWallet extends CoinServiceAPI with WalletCache, WalletDB {
'Number of txs for current receiving address $currentReceiving: $txCount', 'Number of txs for current receiving address $currentReceiving: $txCount',
level: LogLevel.Info); level: LogLevel.Info);
if (txCount >= 1) { if (txCount >= 1 || currentReceiving.derivationIndex < 0) {
// First increment the receiving index // First increment the receiving index
final newReceivingIndex = currentReceiving.derivationIndex + 1; final newReceivingIndex = currentReceiving.derivationIndex + 1;
@ -1768,12 +1774,9 @@ class ParticlWallet extends CoinServiceAPI with WalletCache, WalletDB {
} else { } else {
// we need to update the address // we need to update the address
await db.updateAddress(existing, newReceivingAddress); await db.updateAddress(existing, newReceivingAddress);
// since we updated an existing address there is a chance it has
// some tx history. To prevent address reuse we will call check again
// recursively
await _checkReceivingAddressForTransactions();
} }
// keep checking until address with no tx history is set as current
await _checkReceivingAddressForTransactions();
} }
} catch (e, s) { } catch (e, s) {
Logging.instance.log( Logging.instance.log(
@ -1791,7 +1794,7 @@ class ParticlWallet extends CoinServiceAPI with WalletCache, WalletDB {
'Number of txs for current change address $currentChange: $txCount', 'Number of txs for current change address $currentChange: $txCount',
level: LogLevel.Info); level: LogLevel.Info);
if (txCount >= 1) { if (txCount >= 1 || currentChange.derivationIndex < 0) {
// First increment the change index // First increment the change index
final newChangeIndex = currentChange.derivationIndex + 1; final newChangeIndex = currentChange.derivationIndex + 1;
@ -1810,12 +1813,9 @@ class ParticlWallet extends CoinServiceAPI with WalletCache, WalletDB {
} else { } else {
// we need to update the address // we need to update the address
await db.updateAddress(existing, newChangeAddress); await db.updateAddress(existing, newChangeAddress);
// since we updated an existing address there is a chance it has
// some tx history. To prevent address reuse we will call check again
// recursively
await _checkChangeAddressForTransactions();
} }
// keep checking until address with no tx history is set as current
await _checkChangeAddressForTransactions();
} }
} on SocketException catch (se, s) { } on SocketException catch (se, s) {
Logging.instance.log( Logging.instance.log(

View file

@ -306,6 +306,8 @@ class WowneroWallet extends CoinServiceAPI with WalletCache, WalletDB {
walletBase = (await walletService?.openWallet(_walletId, password!)) walletBase = (await walletService?.openWallet(_walletId, password!))
as WowneroWalletBase; as WowneroWalletBase;
await _checkCurrentReceivingAddressesForTransactions();
Logging.instance.log( Logging.instance.log(
"Opened existing ${coin.prettyName} wallet $walletName", "Opened existing ${coin.prettyName} wallet $walletName",
level: LogLevel.Info, level: LogLevel.Info,
@ -1245,12 +1247,9 @@ class WowneroWallet extends CoinServiceAPI with WalletCache, WalletDB {
} else { } else {
// we need to update the address // we need to update the address
await db.updateAddress(existing, newReceivingAddress); await db.updateAddress(existing, newReceivingAddress);
// since we updated an existing address there is a chance it has
// some tx history. To prevent address reuse we will call check again
// recursively
await _checkReceivingAddressForTransactions();
} }
// keep checking until address with no tx history is set as current
await _checkReceivingAddressForTransactions();
} }
} on SocketException catch (se, s) { } on SocketException catch (se, s) {
Logging.instance.log( Logging.instance.log(