mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2024-12-23 03:59:23 +00:00
save
This commit is contained in:
parent
9502b7ef0f
commit
bbb196dba8
5 changed files with 210 additions and 56 deletions
91
cw_bitcoin/lib/bitcoin_derivations.dart
Normal file
91
cw_bitcoin/lib/bitcoin_derivations.dart
Normal 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",
|
||||
),
|
||||
],
|
||||
|
||||
};
|
|
@ -45,7 +45,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store {
|
|||
initialChangeAddressIndex: initialChangeAddressIndex,
|
||||
mainHd: hd,
|
||||
sideHd: bitcoin.HDWallet.fromSeed(seedBytes, network: networkType)
|
||||
.derivePath(walletInfo.derivationPath!),// "m/0'/1"
|
||||
.derivePath(walletInfo.derivationPath!),// default: "m/0'/1"
|
||||
networkType: networkType);
|
||||
}
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@ import 'package:hive/hive.dart';
|
|||
import 'package:collection/collection.dart';
|
||||
import 'package:mobx/mobx.dart';
|
||||
import 'package:bitcoin_flutter/bitcoin_flutter.dart' as bitcoin;
|
||||
import 'package:cw_bitcoin/bitcoin_derivations.dart';
|
||||
|
||||
class BitcoinWalletService extends WalletService<BitcoinNewWalletCredentials,
|
||||
BitcoinRestoreWalletFromSeedCredentials, BitcoinRestoreWalletFromWIFCredentials> {
|
||||
|
@ -111,17 +112,49 @@ class BitcoinWalletService extends WalletService<BitcoinNewWalletCredentials,
|
|||
|
||||
static Future<List<DerivationType>> compareDerivationMethods(
|
||||
{required mnemonic, required Node node}) async {
|
||||
return [DerivationType.bip39, DerivationType.StandardBIP44Legacy];
|
||||
return [DerivationType.bip39];
|
||||
}
|
||||
|
||||
static Future<List<DerivationInfo>> getDerivationsFromMnemonic(
|
||||
{required String mnemonic, required Node node}) async {
|
||||
// throw UnimplementedError();
|
||||
|
||||
var list = [];
|
||||
|
||||
final electrumClient = ElectrumClient();
|
||||
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:
|
||||
var wallet =
|
||||
bitcoin.HDWallet.fromSeed(await mnemonicToSeedBytes(mnemonic), network: bitcoin.bitcoin)
|
||||
|
@ -132,6 +165,8 @@ class BitcoinWalletService extends WalletService<BitcoinNewWalletCredentials,
|
|||
|
||||
final balance = await electrumClient.getBalance(sh);
|
||||
|
||||
wallet.derive(0);
|
||||
|
||||
print(wallet.address);
|
||||
print(balance.entries);
|
||||
print("@@@@@@@@@@@@@");
|
||||
|
@ -158,11 +193,10 @@ class BitcoinWalletService extends WalletService<BitcoinNewWalletCredentials,
|
|||
// unspentCoinsInfo: unspentCoinsInfoSource);
|
||||
|
||||
list.add(DerivationInfo(
|
||||
"0.00000",
|
||||
"address",
|
||||
0,
|
||||
DerivationType.bip39,
|
||||
null,
|
||||
derivationType: DerivationType.bip39,
|
||||
balance: "0.00000",
|
||||
address: "address",
|
||||
height: 0,
|
||||
));
|
||||
|
||||
return [];
|
||||
|
|
|
@ -10,50 +10,83 @@ enum DerivationType {
|
|||
@HiveField(0)
|
||||
unknown,
|
||||
@HiveField(1)
|
||||
def,// default is a reserved word
|
||||
def, // default is a reserved word
|
||||
@HiveField(2)
|
||||
nano,
|
||||
@HiveField(3)
|
||||
bip39,
|
||||
@HiveField(4)
|
||||
StandardBIP44Legacy
|
||||
}
|
||||
|
||||
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;
|
||||
final String address;
|
||||
final int height;
|
||||
String balance;
|
||||
String address;
|
||||
int height;
|
||||
final DerivationType derivationType;
|
||||
final String? derivationPath;
|
||||
final String? script_type;
|
||||
final String? description;
|
||||
}
|
||||
|
||||
@HiveType(typeId: WalletInfo.typeId)
|
||||
class WalletInfo extends HiveObject {
|
||||
WalletInfo(this.id, 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)
|
||||
WalletInfo(
|
||||
this.id,
|
||||
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();
|
||||
|
||||
factory WalletInfo.external(
|
||||
{required String id,
|
||||
required String name,
|
||||
required WalletType type,
|
||||
required bool isRecovery,
|
||||
required int restoreHeight,
|
||||
required DateTime date,
|
||||
required String dirPath,
|
||||
required String path,
|
||||
required String address,
|
||||
bool? showIntroCakePayCard,
|
||||
String yatEid = '',
|
||||
String yatLastUsedAddressRaw = '',
|
||||
DerivationType? derivationType,
|
||||
String? derivationPath,}) {
|
||||
return WalletInfo(id, name, type, isRecovery, restoreHeight,
|
||||
date.millisecondsSinceEpoch, dirPath, path, address,
|
||||
yatEid, yatLastUsedAddressRaw, showIntroCakePayCard, derivationType, derivationPath);
|
||||
factory WalletInfo.external({
|
||||
required String id,
|
||||
required String name,
|
||||
required WalletType type,
|
||||
required bool isRecovery,
|
||||
required int restoreHeight,
|
||||
required DateTime date,
|
||||
required String dirPath,
|
||||
required String path,
|
||||
required String address,
|
||||
bool? showIntroCakePayCard,
|
||||
String yatEid = '',
|
||||
String yatLastUsedAddressRaw = '',
|
||||
DerivationType? derivationType,
|
||||
String? derivationPath,
|
||||
}) {
|
||||
return WalletInfo(
|
||||
id,
|
||||
name,
|
||||
type,
|
||||
isRecovery,
|
||||
restoreHeight,
|
||||
date.millisecondsSinceEpoch,
|
||||
dirPath,
|
||||
path,
|
||||
address,
|
||||
yatEid,
|
||||
yatLastUsedAddressRaw,
|
||||
showIntroCakePayCard,
|
||||
derivationType,
|
||||
derivationPath);
|
||||
}
|
||||
|
||||
static const typeId = WALLET_INFO_TYPE_ID;
|
||||
|
@ -114,7 +147,7 @@ class WalletInfo extends HiveObject {
|
|||
String get yatEmojiId => yatEid ?? '';
|
||||
|
||||
bool get isShowIntroCakePayCard {
|
||||
if(showIntroCakePayCard == null) {
|
||||
if (showIntroCakePayCard == null) {
|
||||
return type != WalletType.haven;
|
||||
}
|
||||
return showIntroCakePayCard!;
|
||||
|
|
|
@ -13,8 +13,6 @@ part 'wallet_restore_choose_derivation_view_model.g.dart';
|
|||
class WalletRestoreChooseDerivationViewModel = WalletRestoreChooseDerivationViewModelBase
|
||||
with _$WalletRestoreChooseDerivationViewModel;
|
||||
|
||||
|
||||
|
||||
abstract class WalletRestoreChooseDerivationViewModelBase with Store {
|
||||
WalletRestoreChooseDerivationViewModelBase({required this.credentials})
|
||||
: mode = WalletRestoreMode.seed {}
|
||||
|
@ -33,7 +31,6 @@ abstract class WalletRestoreChooseDerivationViewModelBase with Store {
|
|||
case WalletType.bitcoin:
|
||||
String? mnemonic = credentials['seed'] as String?;
|
||||
await BitcoinWalletService.getDerivationsFromMnemonic(mnemonic: mnemonic!, node: node);
|
||||
|
||||
|
||||
// var standardInfo = await NanoWalletService.getInfoFromSeedOrMnemonic(
|
||||
// DerivationType.nano,
|
||||
|
@ -43,11 +40,10 @@ abstract class WalletRestoreChooseDerivationViewModelBase with Store {
|
|||
// );
|
||||
|
||||
list.add(DerivationInfo(
|
||||
"0.00000",
|
||||
"address",
|
||||
0,
|
||||
DerivationType.bip39,
|
||||
null,
|
||||
balance: "0.00000",
|
||||
address: "address",
|
||||
height: 0,
|
||||
derivationType: DerivationType.bip39,
|
||||
));
|
||||
|
||||
// if (bip39Info["balance"] != null) {
|
||||
|
@ -76,27 +72,27 @@ abstract class WalletRestoreChooseDerivationViewModelBase with Store {
|
|||
|
||||
if (standardInfo["balance"] != null) {
|
||||
list.add(DerivationInfo(
|
||||
NanoUtil.getRawAsUsableString(standardInfo["balance"] as String, NanoUtil.rawPerNano),
|
||||
standardInfo["address"] as String,
|
||||
int.tryParse(
|
||||
derivationType: DerivationType.nano,
|
||||
balance: NanoUtil.getRawAsUsableString(
|
||||
standardInfo["balance"] as String, NanoUtil.rawPerNano),
|
||||
address: standardInfo["address"] as String,
|
||||
height: int.tryParse(
|
||||
standardInfo["confirmation_height"] as String,
|
||||
) ??
|
||||
0,
|
||||
DerivationType.nano,
|
||||
null,
|
||||
));
|
||||
}
|
||||
|
||||
if (bip39Info["balance"] != null) {
|
||||
list.add(DerivationInfo(
|
||||
NanoUtil.getRawAsUsableString(bip39Info["balance"] as String, NanoUtil.rawPerNano),
|
||||
bip39Info["address"] as String,
|
||||
int.tryParse(
|
||||
derivationType: DerivationType.bip39,
|
||||
balance:
|
||||
NanoUtil.getRawAsUsableString(bip39Info["balance"] as String, NanoUtil.rawPerNano),
|
||||
address: bip39Info["address"] as String,
|
||||
height: int.tryParse(
|
||||
bip39Info["confirmation_height"] as String? ?? "",
|
||||
) ??
|
||||
0,
|
||||
DerivationType.bip39,
|
||||
null,
|
||||
));
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue