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 { ZanoWalletService(); static bool walletFilesExist(String path) => !File(path).existsSync() && !File('$path.keys').existsSync(); int hWallet = 0; @override WalletType getType() => WalletType.zano; @override Future create(WalletCredentials credentials, {bool? isTestnet}) async { printV('zanowallet service create isTestnet $isTestnet'); return await ZanoWalletBase.create(credentials: credentials); } @override Future isWalletExit(String name) async { final path = await pathForWallet(name: name, type: getType()); return zano.PlainWallet_isWalletExist(path); } @override Future 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 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 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 restoreFromKeys(ZanoRestoreWalletFromKeysCredentials credentials, {bool? isTestnet}) async { throw UnimplementedError(); } @override Future restoreFromSeed(ZanoRestoreWalletFromSeedCredentials credentials, {bool? isTestnet}) async { return ZanoWalletBase.restore(credentials: credentials); } @override Future restoreFromHardwareWallet(ZanoNewWalletCredentials credentials) { throw UnimplementedError("Restoring a Zano wallet from a hardware wallet is not yet supported!"); } }