This commit is contained in:
M
2020-11-30 19:17:44 +02:00
parent 9ad76376d9
commit 62a877dd61
16 changed files with 223 additions and 123 deletions
+11
View File
@@ -128,6 +128,17 @@ Uint8List mnemonicToSeedBytes(String mnemonic, {String prefix = segwit}) {
nonce: cryptography.Nonce('electrum'.codeUnits));
}
bool matchesAnyPrefix(String mnemonic) =>
prefixMatches(mnemonic, [segwit]).any((el) => el);
bool validateMnemonic(String mnemonic, {String prefix = segwit}) {
try {
return matchesAnyPrefix(mnemonic);
} catch(e) {
return false;
}
}
final COMBININGCODEPOINTS = combiningcodepoints();
List<int> combiningcodepoints() {
+4 -6
View File
@@ -65,7 +65,7 @@ abstract class BitcoinTransactionHistoryBase
return historiesWithDetails.fold<Map<String, BitcoinTransactionInfo>>(
<String, BitcoinTransactionInfo>{}, (acc, tx) {
acc[tx.id] = tx;
acc[tx.id] = acc[tx.id]?.updated(tx) ?? tx;
return acc;
});
}
@@ -103,10 +103,6 @@ abstract class BitcoinTransactionHistoryBase
Future<void> save() async {
final data = json.encode({'height': _height, 'transactions': transactions});
print('data');
print(data);
await writeData(path: path, password: _password, data: data);
}
@@ -168,7 +164,9 @@ abstract class BitcoinTransactionHistoryBase
});
_height = content['height'] as int;
} catch (_) {}
} catch (e) {
print(e);
}
}
void _updateOrInsert(BitcoinTransactionInfo transaction) {
+11
View File
@@ -130,6 +130,17 @@ class BitcoinTransactionInfo extends TransactionInfo {
@override
void changeFiatAmount(String amount) => _fiatAmount = formatAmount(amount);
BitcoinTransactionInfo updated(BitcoinTransactionInfo info) {
return BitcoinTransactionInfo(
id: id,
height: info.height,
amount: info.amount,
direction: direction ?? info.direction,
date: date ?? info.date,
isPending: isPending ?? info.isPending,
confirmations: info.confirmations);
}
Map<String, dynamic> toJson() {
final m = <String, dynamic>{};
m['id'] = id;
+24 -4
View File
@@ -175,6 +175,22 @@ abstract class BitcoinWalletBase extends WalletBase<BitcoinBalance> with Store {
return address;
}
Future<List<BitcoinAddressRecord>> generateNewAddresses(int count) async {
final list = <BitcoinAddressRecord>[];
for (var i = 0; i < count; i++) {
_accountIndex += 1;
final address = BitcoinAddressRecord(_getAddress(index: _accountIndex),
index: _accountIndex, label: null);
list.add(address);
}
addresses.addAll(list);
await save();
return list;
}
Future<void> updateAddress(String address, {String label}) async {
for (final addr in addresses) {
if (addr.address == address) {
@@ -190,8 +206,10 @@ abstract class BitcoinWalletBase extends WalletBase<BitcoinBalance> with Store {
Future<void> startSync() async {
try {
syncStatus = StartingSyncStatus();
transactionHistory.updateAsync(
onFinished: () => print('transactionHistory update finished!'));
transactionHistory.updateAsync(onFinished: () {
print('transactionHistory update finished!');
transactionHistory.save();
});
_subscribeForUpdates();
await _updateBalance();
syncStatus = SyncedSyncStatus();
@@ -315,8 +333,10 @@ abstract class BitcoinWalletBase extends WalletBase<BitcoinBalance> with Store {
bitcoinAmountToDouble(amount: _feeMultiplier(priority));
@override
Future<void> save() async =>
await write(path: path, password: _password, data: toJSON());
Future<void> save() async {
await write(path: path, password: _password, data: toJSON());
await transactionHistory.save();
}
bitcoin.ECPair keyPairFor({@required int index}) =>
generateKeyPair(hd: hd, index: index);
+1
View File
@@ -84,6 +84,7 @@ class BitcoinWalletService extends WalletService<
walletInfo: credentials.walletInfo);
await wallet.save();
await wallet.init();
await wallet.generateNewAddresses(32);
return wallet;
}
+22 -15
View File
@@ -78,14 +78,14 @@ class ElectrumClient {
print(jsoned);
final method = jsoned['method'];
final id = jsoned['id'] as String;
final params = jsoned['result'];
final result = jsoned['result'];
if (method is String) {
_methodHandler(method: method, request: jsoned);
return;
}
_finish(id, params);
_finish(id, result);
} catch (e) {
print(e);
}
@@ -209,16 +209,20 @@ class ElectrumClient {
Future<Map<String, Object>> getTransactionExpanded(
{@required String hash}) async {
final originalTx = await getTransactionRaw(hash: hash);
final vins = originalTx['vin'] as List<Object>;
try {
final originalTx = await getTransactionRaw(hash: hash);
final vins = originalTx['vin'] as List<Object>;
for (dynamic vin in vins) {
if (vin is Map<String, Object>) {
vin['tx'] = await getTransactionRaw(hash: vin['txid'] as String);
for (dynamic vin in vins) {
if (vin is Map<String, Object>) {
vin['tx'] = await getTransactionRaw(hash: vin['txid'] as String);
}
}
}
return originalTx;
return originalTx;
} catch (_) {
return {};
}
}
Future<String> broadcastTransaction(
@@ -256,11 +260,13 @@ class ElectrumClient {
return 0;
});
BehaviorSubject<Object> scripthashUpdate(String scripthash) =>
subscribe<Object>(
id: 'blockchain.scripthash.subscribe:$scripthash',
method: 'blockchain.scripthash.subscribe',
params: [scripthash]);
BehaviorSubject<Object> scripthashUpdate(String scripthash) {
_id += 1;
return subscribe<Object>(
id: 'blockchain.scripthash.subscribe:$scripthash',
method: 'blockchain.scripthash.subscribe',
params: [scripthash]);
}
BehaviorSubject<T> subscribe<T>(
{@required String id,
@@ -273,7 +279,8 @@ class ElectrumClient {
return subscription;
}
Future<dynamic> call({String method, List<Object> params = const []}) {
Future<dynamic> call({String method, List<Object> params = const []}) async {
await Future<void>.delayed(Duration(milliseconds: 100));
final completer = Completer<dynamic>();
_id += 1;
final id = _id;