mirror of
https://github.com/Such-Software/hash-wallet.git
synced 2026-10-22 06:28:39 +02: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
173 lines
5.2 KiB
Dart
173 lines
5.2 KiB
Dart
import 'package:bip39/bip39.dart' as bip39;
|
|
import 'package:cw_core/encryption_file_utils.dart';
|
|
import 'package:cw_core/wallet_base.dart';
|
|
import 'package:cw_core/wallet_info.dart';
|
|
import 'package:cw_core/wallet_type.dart';
|
|
import 'package:cw_evm/evm_chain_wallet_creation_credentials.dart';
|
|
import 'package:cw_evm/evm_chain_wallet_service.dart';
|
|
import 'package:cw_base/base_wallet.dart';
|
|
import 'package:cw_base/base_client.dart';
|
|
import 'package:cw_base/base_mnemonics_exception.dart';
|
|
|
|
class BaseWalletService extends EVMChainWalletService<BaseWallet> {
|
|
BaseWalletService(
|
|
super.isDirect, {
|
|
required this.client,
|
|
});
|
|
|
|
late BaseClient client;
|
|
|
|
@override
|
|
WalletType getType() => WalletType.base;
|
|
|
|
@override
|
|
Future<BaseWallet> create(EVMChainNewWalletCredentials credentials, {bool? isTestnet}) async {
|
|
final strength = credentials.seedPhraseLength == 24 ? 256 : 128;
|
|
|
|
final mnemonic = credentials.mnemonic ?? bip39.generateMnemonic(strength: strength);
|
|
|
|
final wallet = BaseWallet(
|
|
walletInfo: credentials.walletInfo!,
|
|
derivationInfo: await credentials.walletInfo!.getDerivationInfo(),
|
|
mnemonic: mnemonic,
|
|
password: credentials.password!,
|
|
passphrase: credentials.passphrase,
|
|
client: client,
|
|
encryptionFileUtils: encryptionFileUtilsFor(isDirect),
|
|
);
|
|
|
|
await wallet.init();
|
|
wallet.addInitialTokens();
|
|
await wallet.save();
|
|
return wallet;
|
|
}
|
|
|
|
@override
|
|
Future<BaseWallet> 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 BaseWallet.open(
|
|
name: name,
|
|
password: password,
|
|
walletInfo: walletInfo,
|
|
encryptionFileUtils: encryptionFileUtilsFor(isDirect),
|
|
);
|
|
|
|
await wallet.init();
|
|
wallet.addInitialTokens();
|
|
await wallet.save();
|
|
saveBackup(name);
|
|
return wallet;
|
|
} catch (_) {
|
|
await restoreWalletFilesFromBackup(name);
|
|
|
|
final wallet = await BaseWallet.open(
|
|
name: name,
|
|
password: password,
|
|
walletInfo: walletInfo,
|
|
encryptionFileUtils: encryptionFileUtilsFor(isDirect),
|
|
);
|
|
|
|
await wallet.init();
|
|
wallet.addInitialTokens();
|
|
await wallet.save();
|
|
return wallet;
|
|
}
|
|
}
|
|
|
|
@override
|
|
Future<BaseWallet> restoreFromKeys(EVMChainRestoreWalletFromPrivateKey credentials,
|
|
{bool? isTestnet}) async {
|
|
final wallet = BaseWallet(
|
|
password: credentials.password!,
|
|
privateKey: credentials.privateKey,
|
|
walletInfo: credentials.walletInfo!,
|
|
derivationInfo: await credentials.walletInfo!.getDerivationInfo(),
|
|
client: client,
|
|
encryptionFileUtils: encryptionFileUtilsFor(isDirect),
|
|
);
|
|
|
|
await wallet.init();
|
|
wallet.addInitialTokens();
|
|
await wallet.save();
|
|
return wallet;
|
|
}
|
|
|
|
@override
|
|
Future<BaseWallet> restoreFromHardwareWallet(
|
|
EVMChainRestoreWalletFromHardware credentials) async {
|
|
final derivationInfo = await credentials.walletInfo!.getDerivationInfo();
|
|
derivationInfo.derivationType = DerivationType.bip39;
|
|
derivationInfo.derivationPath = "m/44'/60'/${credentials.hwAccountData.accountIndex}'/0/0";
|
|
await derivationInfo.save();
|
|
credentials.walletInfo!.hardwareWalletType = credentials.hardwareWalletType;
|
|
credentials.walletInfo!.address = credentials.hwAccountData.address;
|
|
await credentials.walletInfo!.save();
|
|
|
|
final wallet = BaseWallet(
|
|
walletInfo: credentials.walletInfo!,
|
|
derivationInfo: derivationInfo,
|
|
password: credentials.password!,
|
|
client: client,
|
|
encryptionFileUtils: encryptionFileUtilsFor(isDirect),
|
|
);
|
|
|
|
await wallet.init();
|
|
wallet.addInitialTokens();
|
|
await wallet.save();
|
|
|
|
return wallet;
|
|
}
|
|
|
|
@override
|
|
Future<BaseWallet> restoreFromSeed(EVMChainRestoreWalletFromSeedCredentials credentials,
|
|
{bool? isTestnet}) async {
|
|
if (!bip39.validateMnemonic(credentials.mnemonic)) {
|
|
throw BaseMnemonicIsIncorrectException();
|
|
}
|
|
|
|
final wallet = BaseWallet(
|
|
password: credentials.password!,
|
|
mnemonic: credentials.mnemonic,
|
|
walletInfo: credentials.walletInfo!,
|
|
derivationInfo: await credentials.walletInfo!.getDerivationInfo(),
|
|
passphrase: credentials.passphrase,
|
|
client: client,
|
|
encryptionFileUtils: encryptionFileUtilsFor(isDirect),
|
|
);
|
|
|
|
await wallet.init();
|
|
wallet.addInitialTokens();
|
|
await wallet.save();
|
|
|
|
return wallet;
|
|
}
|
|
|
|
@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 = await BaseWallet.open(
|
|
password: password,
|
|
name: currentName,
|
|
walletInfo: currentWalletInfo,
|
|
encryptionFileUtils: encryptionFileUtilsFor(isDirect),
|
|
);
|
|
|
|
await currentWallet.renameWalletFiles(newName);
|
|
await saveBackup(newName);
|
|
|
|
final newWalletInfo = currentWalletInfo;
|
|
newWalletInfo.id = WalletBase.idFor(newName, getType());
|
|
newWalletInfo.name = newName;
|
|
|
|
newWalletInfo.save();
|
|
}
|
|
}
|