diff --git a/lib/db/migrate_wallets_to_isar.dart b/lib/db/migrate_wallets_to_isar.dart index cac0d8a41..3378c013b 100644 --- a/lib/db/migrate_wallets_to_isar.dart +++ b/lib/db/migrate_wallets_to_isar.dart @@ -4,7 +4,6 @@ import 'package:hive_flutter/hive_flutter.dart'; import 'package:isar/isar.dart'; import 'package:stackwallet/db/hive/db.dart'; import 'package:stackwallet/db/isar/main_db.dart'; -import 'package:stackwallet/models/isar/models/blockchain_data/address.dart'; import 'package:stackwallet/models/isar/models/transaction_note.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart'; @@ -121,8 +120,7 @@ Future<void> migrateWalletsToIsar({ coinName: old.coin.name, walletId: old.walletId, name: old.name, - walletType: _walletTypeForCoin(old.coin), - mainAddressType: _addressTypeForCoin(old.coin), + mainAddressType: old.coin.primaryAddressType, favouriteOrderIndex: favourites.indexOf(old.walletId), isMnemonicVerified: allWalletsBox .get("${old.walletId}_mnemonicHasBeenVerified") as bool? ?? @@ -160,101 +158,3 @@ Future<void> _cleanupOnSuccess({required List<String> walletIds}) async { await Hive.deleteBoxFromDisk(walletId); } } - -WalletType _walletTypeForCoin(Coin coin) { - WalletType walletType; - switch (coin) { - case Coin.bitcoin: - case Coin.bitcoinTestNet: - case Coin.bitcoincash: - case Coin.bitcoincashTestnet: - case Coin.litecoin: - case Coin.dogecoin: - case Coin.firo: - case Coin.namecoin: - case Coin.particl: - case Coin.litecoinTestNet: - case Coin.firoTestNet: - case Coin.dogecoinTestNet: - case Coin.eCash: - walletType = WalletType.bip39HD; - break; - - case Coin.monero: - case Coin.wownero: - walletType = WalletType.cryptonote; - break; - - case Coin.epicCash: - case Coin.ethereum: - case Coin.tezos: - case Coin.nano: - case Coin.banano: - case Coin.stellar: - case Coin.stellarTestnet: - walletType = WalletType.bip39; - break; - } - - return walletType; -} - -AddressType _addressTypeForCoin(Coin coin) { - AddressType addressType; - switch (coin) { - case Coin.bitcoin: - case Coin.bitcoinTestNet: - case Coin.litecoin: - case Coin.litecoinTestNet: - addressType = AddressType.p2wpkh; - break; - - case Coin.eCash: - case Coin.bitcoincash: - case Coin.bitcoincashTestnet: - case Coin.dogecoin: - case Coin.firo: - case Coin.firoTestNet: - case Coin.namecoin: - case Coin.particl: - case Coin.dogecoinTestNet: - addressType = AddressType.p2pkh; - break; - - case Coin.monero: - case Coin.wownero: - addressType = AddressType.cryptonote; - break; - - case Coin.epicCash: - addressType = AddressType.mimbleWimble; - break; - - case Coin.ethereum: - addressType = AddressType.ethereum; - break; - - case Coin.tezos: - // should not be unknown but since already used in prod changing - // this requires a migrate - addressType = AddressType.unknown; - break; - - case Coin.nano: - addressType = AddressType.nano; - break; - - case Coin.banano: - addressType = AddressType.banano; - break; - - case Coin.stellar: - case Coin.stellarTestnet: - // should not be unknown but since already used in prod changing - // this requires a migrate - addressType = AddressType.unknown; - break; - } - - return addressType; -} diff --git a/lib/utilities/enums/coin_enum.dart b/lib/utilities/enums/coin_enum.dart index 45348ecae..67872e3b9 100644 --- a/lib/utilities/enums/coin_enum.dart +++ b/lib/utilities/enums/coin_enum.dart @@ -8,6 +8,7 @@ * */ +import 'package:stackwallet/models/isar/models/blockchain_data/address.dart'; import 'package:stackwallet/utilities/constants.dart'; enum Coin { @@ -354,6 +355,55 @@ extension CoinExt on Coin { } int get decimals => Constants.decimalPlacesForCoin(this); + + AddressType get primaryAddressType { + switch (this) { + case Coin.bitcoin: + case Coin.bitcoinTestNet: + case Coin.litecoin: + case Coin.litecoinTestNet: + return AddressType.p2wpkh; + break; + + case Coin.eCash: + case Coin.bitcoincash: + case Coin.bitcoincashTestnet: + case Coin.dogecoin: + case Coin.firo: + case Coin.firoTestNet: + case Coin.namecoin: + case Coin.particl: + case Coin.dogecoinTestNet: + return AddressType.p2pkh; + + case Coin.monero: + case Coin.wownero: + return AddressType.cryptonote; + + case Coin.epicCash: + return AddressType.mimbleWimble; + + case Coin.ethereum: + return AddressType.ethereum; + + case Coin.tezos: + // should not be unknown but since already used in prod changing + // this requires a migrate + return AddressType.unknown; + + case Coin.nano: + return AddressType.nano; + + case Coin.banano: + return AddressType.banano; + + case Coin.stellar: + case Coin.stellarTestnet: + // should not be unknown but since already used in prod changing + // this requires a migrate + return AddressType.unknown; + } + } } Coin coinFromPrettyName(String name) { diff --git a/lib/wallets/isar/models/wallet_info.dart b/lib/wallets/isar/models/wallet_info.dart index b7855dfd5..bf03fa112 100644 --- a/lib/wallets/isar/models/wallet_info.dart +++ b/lib/wallets/isar/models/wallet_info.dart @@ -19,9 +19,6 @@ class WalletInfo implements IsarId { final String name; - @enumerated - final WalletType walletType; - @enumerated final AddressType mainAddressType; @@ -248,7 +245,6 @@ class WalletInfo implements IsarId { required this.coinName, required this.walletId, required this.name, - required this.walletType, required this.mainAddressType, // cachedReceivingAddress should never actually be empty in practice as @@ -291,23 +287,10 @@ class WalletInfo implements IsarId { throw UnimplementedError(); } - final WalletType walletType; - switch (coin) { - case Coin.bitcoin: - case Coin.bitcoinTestNet: - case Coin.bitcoincash: - case Coin.bitcoincashTestnet: - walletType = WalletType.bip39HD; - - default: - throw UnimplementedError(); - } - return WalletInfo( coinName: coin.name, walletId: walletIdOverride ?? const Uuid().v1(), name: name, - walletType: walletType, mainAddressType: mainAddressType, restoreHeight: restoreHeight, ); @@ -328,7 +311,6 @@ class WalletInfo implements IsarId { coinName: coinName ?? this.coinName, walletId: walletId, name: name ?? this.name, - walletType: walletType, mainAddressType: mainAddressType, favouriteOrderIndex: favouriteOrderIndex ?? this.favouriteOrderIndex, cachedChainHeight: cachedChainHeight ?? this.cachedChainHeight, @@ -343,14 +325,15 @@ class WalletInfo implements IsarId { } @Deprecated("Legacy support") - factory WalletInfo.fromJson(Map<String, dynamic> jsonObject, - WalletType walletType, AddressType mainAddressType) { + factory WalletInfo.fromJson( + Map<String, dynamic> jsonObject, + AddressType mainAddressType, + ) { final coin = Coin.values.byName(jsonObject["coin"] as String); return WalletInfo( coinName: coin.name, walletId: jsonObject["id"] as String, name: jsonObject["name"] as String, - walletType: walletType, mainAddressType: mainAddressType, ); } @@ -380,12 +363,3 @@ abstract class WalletInfoKeys { static const String cachedSecondaryBalance = "cachedSecondaryBalanceKey"; static const String epiccashData = "epiccashDataKey"; } - -// Used in Isar db and stored there as int indexes so adding/removing values -// in this definition should be done extremely carefully in production -enum WalletType { - bip39, - bip39HD, - cryptonote, - privateKeyBased; -} diff --git a/lib/wallets/wallet/wallet.dart b/lib/wallets/wallet/wallet.dart index 3ae9b01d5..c3bc852d2 100644 --- a/lib/wallets/wallet/wallet.dart +++ b/lib/wallets/wallet/wallet.dart @@ -30,8 +30,12 @@ import 'package:stackwallet/wallets/wallet/impl/bitcoin_wallet.dart'; import 'package:stackwallet/wallets/wallet/impl/bitcoincash_wallet.dart'; import 'package:stackwallet/wallets/wallet/impl/epiccash_wallet.dart'; import 'package:stackwallet/wallets/wallet/impl/wownero_wallet.dart'; +import 'package:stackwallet/wallets/wallet/intermediate/bip39_hd_wallet.dart'; +import 'package:stackwallet/wallets/wallet/intermediate/bip39_wallet.dart'; +import 'package:stackwallet/wallets/wallet/intermediate/cryptonote_wallet.dart'; import 'package:stackwallet/wallets/wallet/mixins/electrumx_mixin.dart'; import 'package:stackwallet/wallets/wallet/mixins/multi_address.dart'; +import 'package:stackwallet/wallets/wallet/private_key_based_wallet.dart'; abstract class Wallet<T extends CryptoCurrency> { // default to Transaction class. For TransactionV2 set to 2 @@ -90,7 +94,6 @@ abstract class Wallet<T extends CryptoCurrency> { // ========== Wallet Info Convenience Getters ================================ String get walletId => info.walletId; - WalletType get walletType => info.walletType; /// Attempt to fetch the most recent chain height. /// On failure return the last cached height. @@ -130,9 +133,9 @@ abstract class Wallet<T extends CryptoCurrency> { prefs: prefs, ); - switch (walletInfo.walletType) { - case WalletType.bip39: - case WalletType.bip39HD: + switch (wallet.runtimeType) { + case Bip39Wallet: + case Bip39HDWallet: await secureStorageInterface.write( key: mnemonicKey(walletId: walletInfo.walletId), value: mnemonic!, @@ -143,10 +146,10 @@ abstract class Wallet<T extends CryptoCurrency> { ); break; - case WalletType.cryptonote: + case CryptonoteWallet: break; - case WalletType.privateKeyBased: + case PrivateKeyBasedWallet: await secureStorageInterface.write( key: privateKeyKey(walletId: walletInfo.walletId), value: privateKey!,