mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2024-12-23 12:09:43 +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,
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 [];
|
||||||
|
|
|
@ -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!;
|
||||||
|
|
|
@ -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,
|
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue