This commit is contained in:
fosse 2023-08-24 11:20:04 -04:00
parent 9502b7ef0f
commit bbb196dba8
5 changed files with 210 additions and 56 deletions

View file

@ -0,0 +1,91 @@
import 'package:cw_core/wallet_info.dart';
Map<DerivationType, List<DerivationInfo>> bitcoin_derivations = {
DerivationType.bip39: [
DerivationInfo(
derivationType: DerivationType.bip39,
derivationPath: "m/0'/1",
description: "cake default?",
script_type: "???",
),
DerivationInfo(
derivationType: DerivationType.bip39,
derivationPath: "m/44'/0'/0'",
description: "Standard BIP44 legacy",
script_type: "p2pkh",
),
DerivationInfo(
derivationType: DerivationType.bip39,
derivationPath: "m/49'/0'/0'",
description: "Standard BIP49 compatibility segwit",
script_type: "p2wpkh-p2sh",
),
DerivationInfo(
derivationType: DerivationType.bip39,
derivationPath: "m/84'/0'/0'",
description: "Standard BIP84 native segwit",
script_type: "p2wpkh",
),
DerivationInfo(
derivationType: DerivationType.bip39,
derivationPath: "m/0'",
description: "Non-standard legacy",
script_type: "p2pkh",
),
DerivationInfo(
derivationType: DerivationType.bip39,
derivationPath: "m/0'",
description: "Non-standard compatibility segwit",
script_type: "p2wpkh-p2sh",
),
DerivationInfo(
derivationType: DerivationType.bip39,
derivationPath: "m/0'",
description: "Non-standard native segwit",
script_type: "p2wpkh",
),
DerivationInfo(
derivationType: DerivationType.bip39,
derivationPath: "m/44'/0'/0'",
description: "Copay native segwit",
script_type: "p2wpkh",
),
DerivationInfo(
derivationType: DerivationType.bip39,
derivationPath: "m/84'/0'/2147483644'",
description: "Samourai Bad Bank (toxic change)",
script_type: "p2wpkh",
),
DerivationInfo(
derivationType: DerivationType.bip39,
derivationPath: "m/84'/0'/2147483645'",
description: "Samourai Whirlpool Pre Mix",
script_type: "p2wpkh",
),
DerivationInfo(
derivationType: DerivationType.bip39,
derivationPath: "m/84'/0'/2147483646'",
description: "Samourai Whirlpool Post Mix",
script_type: "p2wpkh",
),
DerivationInfo(
derivationType: DerivationType.bip39,
derivationPath: "m/44'/0'/2147483647'",
description: "Samourai Ricochet legacy",
script_type: "p2pkh",
),
DerivationInfo(
derivationType: DerivationType.bip39,
derivationPath: "m/49'/0'/2147483647'",
description: "Samourai Ricochet compatibility segwit",
script_type: "p2wpkh-p2sh",
),
DerivationInfo(
derivationType: DerivationType.bip39,
derivationPath: "m/84'/0'/2147483647'",
description: "Samourai Ricochet native segwit",
script_type: "p2wpkh",
),
],
};

View file

@ -45,7 +45,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store {
initialChangeAddressIndex: initialChangeAddressIndex, initialChangeAddressIndex: initialChangeAddressIndex,
mainHd: hd, mainHd: hd,
sideHd: bitcoin.HDWallet.fromSeed(seedBytes, network: networkType) sideHd: bitcoin.HDWallet.fromSeed(seedBytes, network: networkType)
.derivePath(walletInfo.derivationPath!),// "m/0'/1" .derivePath(walletInfo.derivationPath!),// default: "m/0'/1"
networkType: networkType); networkType: networkType);
} }

View file

@ -17,6 +17,7 @@ import 'package:hive/hive.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:mobx/mobx.dart'; import 'package:mobx/mobx.dart';
import 'package:bitcoin_flutter/bitcoin_flutter.dart' as bitcoin; import 'package:bitcoin_flutter/bitcoin_flutter.dart' as bitcoin;
import 'package:cw_bitcoin/bitcoin_derivations.dart';
class BitcoinWalletService extends WalletService<BitcoinNewWalletCredentials, class BitcoinWalletService extends WalletService<BitcoinNewWalletCredentials,
BitcoinRestoreWalletFromSeedCredentials, BitcoinRestoreWalletFromWIFCredentials> { BitcoinRestoreWalletFromSeedCredentials, BitcoinRestoreWalletFromWIFCredentials> {
@ -111,17 +112,49 @@ class BitcoinWalletService extends WalletService<BitcoinNewWalletCredentials,
static Future<List<DerivationType>> compareDerivationMethods( static Future<List<DerivationType>> compareDerivationMethods(
{required mnemonic, required Node node}) async { {required mnemonic, required Node node}) async {
return [DerivationType.bip39, DerivationType.StandardBIP44Legacy]; return [DerivationType.bip39];
} }
static Future<List<DerivationInfo>> getDerivationsFromMnemonic( static Future<List<DerivationInfo>> getDerivationsFromMnemonic(
{required String mnemonic, required Node node}) async { {required String mnemonic, required Node node}) async {
// throw UnimplementedError();
var list = []; var list = [];
final electrumClient = ElectrumClient(); final electrumClient = ElectrumClient();
await electrumClient.connectToUri(node.uri); await electrumClient.connectToUri(node.uri);
print("@@@@@@@@@@@@@@");
for (DerivationType dType in bitcoin_derivations.keys) {
if (dType == DerivationType.bip39) {
for (DerivationInfo dInfo in bitcoin_derivations[dType]!) {
try {
print("${dInfo.derivationType.toString()} : ${dInfo.derivationPath}");
var wallet = bitcoin.HDWallet.fromSeed(await mnemonicToSeedBytes(mnemonic),
network: bitcoin.bitcoin)
.derivePath("m/0'/1");
// get addresses:
final sh = scriptHash(wallet.address!, networkType: bitcoin.bitcoin);
final balance = await electrumClient.getBalance(sh);
final history = await electrumClient.getHistory(sh);
print("history:");
print(history);
print(history.length);
dInfo.balance = balance.entries.first.value.toString();
dInfo.address = wallet.address ?? "";
dInfo.height = history.length;
list.add(dInfo);
} catch (e) {
print(e);
}
}
}
}
// default derivation path: // default derivation path:
var wallet = var wallet =
bitcoin.HDWallet.fromSeed(await mnemonicToSeedBytes(mnemonic), network: bitcoin.bitcoin) bitcoin.HDWallet.fromSeed(await mnemonicToSeedBytes(mnemonic), network: bitcoin.bitcoin)
@ -132,6 +165,8 @@ class BitcoinWalletService extends WalletService<BitcoinNewWalletCredentials,
final balance = await electrumClient.getBalance(sh); final balance = await electrumClient.getBalance(sh);
wallet.derive(0);
print(wallet.address); print(wallet.address);
print(balance.entries); print(balance.entries);
print("@@@@@@@@@@@@@"); print("@@@@@@@@@@@@@");
@ -158,11 +193,10 @@ class BitcoinWalletService extends WalletService<BitcoinNewWalletCredentials,
// unspentCoinsInfo: unspentCoinsInfoSource); // unspentCoinsInfo: unspentCoinsInfoSource);
list.add(DerivationInfo( list.add(DerivationInfo(
"0.00000", derivationType: DerivationType.bip39,
"address", balance: "0.00000",
0, address: "address",
DerivationType.bip39, height: 0,
null,
)); ));
return []; return [];

View file

@ -10,50 +10,83 @@ enum DerivationType {
@HiveField(0) @HiveField(0)
unknown, unknown,
@HiveField(1) @HiveField(1)
def,// default is a reserved word def, // default is a reserved word
@HiveField(2) @HiveField(2)
nano, nano,
@HiveField(3) @HiveField(3)
bip39, bip39,
@HiveField(4)
StandardBIP44Legacy
} }
class DerivationInfo { class DerivationInfo {
DerivationInfo(this.balance, this.address, this.height, this.derivationType, this.derivationPath); DerivationInfo({
required this.derivationType,
this.derivationPath,
this.balance = "",
this.address = "",
this.height = 0,
this.script_type,
this.description,
});
final String balance; String balance;
final String address; String address;
final int height; int height;
final DerivationType derivationType; final DerivationType derivationType;
final String? derivationPath; final String? derivationPath;
final String? script_type;
final String? description;
} }
@HiveType(typeId: WalletInfo.typeId) @HiveType(typeId: WalletInfo.typeId)
class WalletInfo extends HiveObject { class WalletInfo extends HiveObject {
WalletInfo(this.id, this.name, this.type, this.isRecovery, this.restoreHeight, WalletInfo(
this.timestamp, this.dirPath, this.path, this.address, this.yatEid, this.id,
this.yatLastUsedAddressRaw, this.showIntroCakePayCard, this.derivationType, this.derivationPath) this.name,
this.type,
this.isRecovery,
this.restoreHeight,
this.timestamp,
this.dirPath,
this.path,
this.address,
this.yatEid,
this.yatLastUsedAddressRaw,
this.showIntroCakePayCard,
this.derivationType,
this.derivationPath)
: _yatLastUsedAddressController = StreamController<String>.broadcast(); : _yatLastUsedAddressController = StreamController<String>.broadcast();
factory WalletInfo.external( factory WalletInfo.external({
{required String id, required String id,
required String name, required String name,
required WalletType type, required WalletType type,
required bool isRecovery, required bool isRecovery,
required int restoreHeight, required int restoreHeight,
required DateTime date, required DateTime date,
required String dirPath, required String dirPath,
required String path, required String path,
required String address, required String address,
bool? showIntroCakePayCard, bool? showIntroCakePayCard,
String yatEid = '', String yatEid = '',
String yatLastUsedAddressRaw = '', String yatLastUsedAddressRaw = '',
DerivationType? derivationType, DerivationType? derivationType,
String? derivationPath,}) { String? derivationPath,
return WalletInfo(id, name, type, isRecovery, restoreHeight, }) {
date.millisecondsSinceEpoch, dirPath, path, address, return WalletInfo(
yatEid, yatLastUsedAddressRaw, showIntroCakePayCard, derivationType, derivationPath); id,
name,
type,
isRecovery,
restoreHeight,
date.millisecondsSinceEpoch,
dirPath,
path,
address,
yatEid,
yatLastUsedAddressRaw,
showIntroCakePayCard,
derivationType,
derivationPath);
} }
static const typeId = WALLET_INFO_TYPE_ID; static const typeId = WALLET_INFO_TYPE_ID;
@ -114,7 +147,7 @@ class WalletInfo extends HiveObject {
String get yatEmojiId => yatEid ?? ''; String get yatEmojiId => yatEid ?? '';
bool get isShowIntroCakePayCard { bool get isShowIntroCakePayCard {
if(showIntroCakePayCard == null) { if (showIntroCakePayCard == null) {
return type != WalletType.haven; return type != WalletType.haven;
} }
return showIntroCakePayCard!; return showIntroCakePayCard!;

View file

@ -13,8 +13,6 @@ part 'wallet_restore_choose_derivation_view_model.g.dart';
class WalletRestoreChooseDerivationViewModel = WalletRestoreChooseDerivationViewModelBase class WalletRestoreChooseDerivationViewModel = WalletRestoreChooseDerivationViewModelBase
with _$WalletRestoreChooseDerivationViewModel; with _$WalletRestoreChooseDerivationViewModel;
abstract class WalletRestoreChooseDerivationViewModelBase with Store { abstract class WalletRestoreChooseDerivationViewModelBase with Store {
WalletRestoreChooseDerivationViewModelBase({required this.credentials}) WalletRestoreChooseDerivationViewModelBase({required this.credentials})
: mode = WalletRestoreMode.seed {} : mode = WalletRestoreMode.seed {}
@ -33,7 +31,6 @@ abstract class WalletRestoreChooseDerivationViewModelBase with Store {
case WalletType.bitcoin: case WalletType.bitcoin:
String? mnemonic = credentials['seed'] as String?; String? mnemonic = credentials['seed'] as String?;
await BitcoinWalletService.getDerivationsFromMnemonic(mnemonic: mnemonic!, node: node); await BitcoinWalletService.getDerivationsFromMnemonic(mnemonic: mnemonic!, node: node);
// var standardInfo = await NanoWalletService.getInfoFromSeedOrMnemonic( // var standardInfo = await NanoWalletService.getInfoFromSeedOrMnemonic(
// DerivationType.nano, // DerivationType.nano,
@ -43,11 +40,10 @@ abstract class WalletRestoreChooseDerivationViewModelBase with Store {
// ); // );
list.add(DerivationInfo( list.add(DerivationInfo(
"0.00000", balance: "0.00000",
"address", address: "address",
0, height: 0,
DerivationType.bip39, derivationType: DerivationType.bip39,
null,
)); ));
// if (bip39Info["balance"] != null) { // if (bip39Info["balance"] != null) {
@ -76,27 +72,27 @@ abstract class WalletRestoreChooseDerivationViewModelBase with Store {
if (standardInfo["balance"] != null) { if (standardInfo["balance"] != null) {
list.add(DerivationInfo( list.add(DerivationInfo(
NanoUtil.getRawAsUsableString(standardInfo["balance"] as String, NanoUtil.rawPerNano), derivationType: DerivationType.nano,
standardInfo["address"] as String, balance: NanoUtil.getRawAsUsableString(
int.tryParse( standardInfo["balance"] as String, NanoUtil.rawPerNano),
address: standardInfo["address"] as String,
height: int.tryParse(
standardInfo["confirmation_height"] as String, standardInfo["confirmation_height"] as String,
) ?? ) ??
0, 0,
DerivationType.nano,
null,
)); ));
} }
if (bip39Info["balance"] != null) { if (bip39Info["balance"] != null) {
list.add(DerivationInfo( list.add(DerivationInfo(
NanoUtil.getRawAsUsableString(bip39Info["balance"] as String, NanoUtil.rawPerNano), derivationType: DerivationType.bip39,
bip39Info["address"] as String, balance:
int.tryParse( NanoUtil.getRawAsUsableString(bip39Info["balance"] as String, NanoUtil.rawPerNano),
address: bip39Info["address"] as String,
height: int.tryParse(
bip39Info["confirmation_height"] as String? ?? "", bip39Info["confirmation_height"] as String? ?? "",
) ?? ) ??
0, 0,
DerivationType.bip39,
null,
)); ));
} }