mirror of
https://github.com/Such-Software/hash-wallet.git
synced 2026-10-31 06:58:42 +01:00
* feat: initial hive -> SQLite Includes migration script and initial work done to remove dependency on hive generators. Also contains some refactoring to make sync code async. Features new dev screen that lists all SQLite tables Aspects that need testing: - backups (from this version, and from previous versions as well) - wallet loading / wallet list - almost everything else - renaming - deletion - sorting in wallet list - wallet groups - wallet seed/keys - wallet switching - wallet creation / restore - all methods - wallet address page - hardware wallet connection (and prompts from mall screens) - contacts - advanced settings in wallet creation - derivation paths - some minor wownero fixes - base, hardware wallets * fix: build errors * fix: Bad state: No element in backup restore * address comments from review * fix: HardwareWalletType
132 lines
4.5 KiB
Dart
132 lines
4.5 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:collection/collection.dart';
|
|
import 'package:cw_core/pathForWallet.dart';
|
|
import 'package:cw_core/utils/print_verbose.dart';
|
|
import 'package:cw_core/wallet_base.dart';
|
|
import 'package:cw_core/wallet_credentials.dart';
|
|
import 'package:cw_core/wallet_info.dart';
|
|
import 'package:cw_core/wallet_service.dart';
|
|
import 'package:cw_core/wallet_type.dart';
|
|
import 'package:cw_zano/zano_wallet.dart';
|
|
import 'package:cw_zano/zano_wallet_api.dart';
|
|
import 'package:hive/hive.dart';
|
|
import 'package:monero/zano.dart' as zano;
|
|
|
|
class ZanoNewWalletCredentials extends WalletCredentials {
|
|
ZanoNewWalletCredentials({required String name, String? password, required String? passphrase}) : super(name: name, password: password, passphrase: passphrase);
|
|
}
|
|
|
|
class ZanoRestoreWalletFromSeedCredentials extends WalletCredentials {
|
|
ZanoRestoreWalletFromSeedCredentials({required String name, required String password, required String passphrase, required int height, required this.mnemonic})
|
|
: super(name: name, password: password, passphrase: passphrase, height: height);
|
|
|
|
final String mnemonic;
|
|
}
|
|
|
|
class ZanoRestoreWalletFromKeysCredentials extends WalletCredentials {
|
|
ZanoRestoreWalletFromKeysCredentials(
|
|
{required String name,
|
|
required String password,
|
|
required this.language,
|
|
required this.address,
|
|
required this.viewKey,
|
|
required this.spendKey,
|
|
required int height})
|
|
: super(name: name, password: password, height: height);
|
|
|
|
final String language;
|
|
final String address;
|
|
final String viewKey;
|
|
final String spendKey;
|
|
}
|
|
|
|
class ZanoWalletService extends WalletService<ZanoNewWalletCredentials,
|
|
ZanoRestoreWalletFromSeedCredentials, ZanoRestoreWalletFromKeysCredentials, ZanoNewWalletCredentials> {
|
|
ZanoWalletService();
|
|
|
|
static bool walletFilesExist(String path) => !File(path).existsSync() && !File('$path.keys').existsSync();
|
|
|
|
int hWallet = 0;
|
|
|
|
@override
|
|
WalletType getType() => WalletType.zano;
|
|
|
|
@override
|
|
Future<ZanoWallet> create(WalletCredentials credentials, {bool? isTestnet}) async {
|
|
printV('zanowallet service create isTestnet $isTestnet');
|
|
return await ZanoWalletBase.create(credentials: credentials);
|
|
}
|
|
|
|
@override
|
|
Future<bool> isWalletExit(String name) async {
|
|
final path = await pathForWallet(name: name, type: getType());
|
|
return zano.PlainWallet_isWalletExist(path);
|
|
}
|
|
|
|
@override
|
|
Future<ZanoWallet> openWallet(String name, String password) async {
|
|
final walletInfo = await WalletInfo.get(name, getType());
|
|
if (walletInfo == null) {
|
|
throw Exception('Wallet not found');
|
|
}
|
|
try {
|
|
final wallet = await ZanoWalletBase.open(name: name, password: password, walletInfo: walletInfo);
|
|
saveBackup(name);
|
|
return wallet;
|
|
} catch (e) {
|
|
await restoreWalletFilesFromBackup(name);
|
|
return await ZanoWalletBase.open(name: name, password: password, walletInfo: walletInfo);
|
|
}
|
|
}
|
|
|
|
@override
|
|
Future<void> remove(String wallet) async {
|
|
final path = await pathForWalletDir(name: wallet, type: getType());
|
|
final file = Directory(path);
|
|
final isExist = file.existsSync();
|
|
|
|
if (isExist) {
|
|
await file.delete(recursive: true);
|
|
}
|
|
|
|
final walletInfo = await WalletInfo.get(wallet, getType());
|
|
if (walletInfo == null) {
|
|
throw Exception('Wallet not found');
|
|
}
|
|
await WalletInfo.delete(walletInfo);
|
|
}
|
|
|
|
@override
|
|
Future<void> rename(String currentName, String password, String newName) async {
|
|
final currentWalletInfo = await WalletInfo.get(currentName, getType());
|
|
if (currentWalletInfo == null) {
|
|
throw Exception('Wallet not found');
|
|
}
|
|
final currentWallet = ZanoWallet(currentWalletInfo, await currentWalletInfo.getDerivationInfo(), password);
|
|
|
|
await currentWallet.renameWalletFiles(newName);
|
|
|
|
final newWalletInfo = currentWalletInfo;
|
|
newWalletInfo.id = WalletBase.idFor(newName, getType());
|
|
newWalletInfo.name = newName;
|
|
|
|
await newWalletInfo.save();
|
|
}
|
|
|
|
@override
|
|
Future<ZanoWallet> restoreFromKeys(ZanoRestoreWalletFromKeysCredentials credentials, {bool? isTestnet}) async {
|
|
throw UnimplementedError();
|
|
}
|
|
|
|
@override
|
|
Future<ZanoWallet> restoreFromSeed(ZanoRestoreWalletFromSeedCredentials credentials, {bool? isTestnet}) async {
|
|
return ZanoWalletBase.restore(credentials: credentials);
|
|
}
|
|
|
|
@override
|
|
Future<ZanoWallet> restoreFromHardwareWallet(ZanoNewWalletCredentials credentials) {
|
|
throw UnimplementedError("Restoring a Zano wallet from a hardware wallet is not yet supported!");
|
|
}
|
|
}
|