Skip to content

Commit

Permalink
TMP 4
Browse files Browse the repository at this point in the history
  • Loading branch information
mkyq committed Jun 20, 2020
1 parent 7198429 commit 81cee18
Show file tree
Hide file tree
Showing 94 changed files with 3,771 additions and 2,986 deletions.
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -87,4 +87,6 @@ cw_monero/cw_monero/android/.cxx/
android/key.properties

**/tool/.secrets-prod.json
**/lib/.secrets.g.dart
**/lib/.secrets.g.dart

vendor/
6 changes: 6 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
[submodule "inject.dart"]
path = inject.dart
url = https://github.com/google/inject.dart
[submodule ".vendor/inject.dart"]
path = .vendor/inject.dart
url = https://github.com/google/inject.dart
17 changes: 17 additions & 0 deletions lib/bitcoin/bitcoin_address_record.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import 'dart:convert';

class BitcoinAddressRecord {
BitcoinAddressRecord(this.address, {this.label});

factory BitcoinAddressRecord.fromJSON(String jsonSource) {
final decoded = json.decode(jsonSource) as Map;

return BitcoinAddressRecord(decoded['address'] as String,
label: decoded['label'] as String);
}

final String address;
String label;

String toJSON() => json.encode({'label': label, 'address': address});
}
23 changes: 22 additions & 1 deletion lib/bitcoin/bitcoin_balance.dart
Original file line number Diff line number Diff line change
@@ -1,14 +1,35 @@
import 'dart:convert';

import 'package:flutter/foundation.dart';
import 'package:cake_wallet/bitcoin/bitcoin_amount_format.dart';
import 'package:cake_wallet/src/domain/common/balance.dart';

class BitcoinBalance extends Balance {
BitcoinBalance({@required this.confirmed, @required this.unconfirmed});
const BitcoinBalance({@required this.confirmed, @required this.unconfirmed}) : super();

factory BitcoinBalance.fromJSON(String jsonSource) {
if (jsonSource == null) {
return null;
}

final decoded = json.decode(jsonSource) as Map;

return BitcoinBalance(
confirmed: decoded['confirmed'] as int ?? 0,
unconfirmed: decoded['unconfirmed'] as int ?? 0);
}

final int confirmed;
final int unconfirmed;

int get total => confirmed + unconfirmed;

String get confirmedFormatted => bitcoinAmountToString(amount: confirmed);

String get unconfirmedFormatted => bitcoinAmountToString(amount: unconfirmed);

String get totalFormatted => bitcoinAmountToString(amount: total);

String toJSON() =>
json.encode({'confirmed': confirmed, 'unconfirmed': unconfirmed});
}
126 changes: 56 additions & 70 deletions lib/bitcoin/bitcoin_transaction_history.dart
Original file line number Diff line number Diff line change
@@ -1,78 +1,64 @@
import 'dart:convert';
import 'package:cake_wallet/bitcoin/bitcoin_wallet.dart';
import 'package:flutter/foundation.dart';
import 'package:rxdart/rxdart.dart';
import 'package:mobx/mobx.dart';
import 'package:cake_wallet/core/transaction_history.dart';
import 'package:cake_wallet/bitcoin/file.dart';
import 'package:cake_wallet/bitcoin/bitcoin_wallet.dart';
import 'package:cake_wallet/bitcoin/bitcoin_transaction_info.dart';
import 'package:cake_wallet/bitcoin/electrum.dart';
import 'package:cake_wallet/src/domain/common/transaction_history.dart';
import 'package:cake_wallet/src/domain/common/transaction_info.dart';
import 'package:cake_wallet/bitcoin/file.dart';
import 'package:cake_wallet/src/domain/common/transaction_direction.dart';

part 'bitcoin_transaction_history.g.dart';

class BitcoinTransactionHistory extends TransactionHistory {
BitcoinTransactionHistory(
{@required this.eclient,
@required this.path,
@required String password,
@required this.wallet})
: _transactions = BehaviorSubject<List<TransactionInfo>>.seeded([]),
// TODO: Think about another transaction store for bitcoin transaction history..

const _transactionsHistoryFileName = 'transactions.json';

class BitcoinTransactionHistory = BitcoinTransactionHistoryBase
with _$BitcoinTransactionHistory;

abstract class BitcoinTransactionHistoryBase
extends TransactionHistoryBase<BitcoinTransactionInfo> with Store {
BitcoinTransactionHistoryBase(
{this.eclient, String dirPath, @required String password})
: path = '$dirPath/$_transactionsHistoryFileName',
_password = password,
_height = 0;

final BitcoinWallet wallet;
BitcoinWallet wallet;
final ElectrumClient eclient;
final String path;
final String _password;
int _height;

@override
Observable<List<TransactionInfo>> get transactions => _transactions.stream;
List<TransactionInfo> get transactionsAll => _transactions.value;
final BehaviorSubject<List<TransactionInfo>> _transactions;
bool _isUpdating = false;

Future<void> init() async {
// TODO: throw exeption if wallet is null;
final info = await _read();
_height = (info['height'] as int) ?? _height;
_transactions.value = info['transactions'] as List<TransactionInfo>;
// FIXME: remove hardcoded value
transactions = ObservableList.of([
BitcoinTransactionInfo(
id: 'test',
height: 12,
amount: 12,
direction: TransactionDirection.incoming,
date: DateTime.now(),
isPending: false)
]);
}

@override
Future<List<TransactionInfo>> getAll() async => _transactions.value;

@override
Future update() async {
if (_isUpdating) {
return;
}

try {
_isUpdating = true;
final newTransasctions = await fetchTransactions();
_transactions.value = _transactions.value + newTransasctions;
_updateHeight();
await save();
_isUpdating = false;
} catch (e) {
_isUpdating = false;
rethrow;
}
}

Future<Map<String, Object>> fetchTransactionInfo(
{@required String hash, @required int height}) async {
final rawFetching = eclient.getTransactionRaw(hash: hash);
final headerFetching = eclient.getHeader(height: height);
final result = await Future.wait([rawFetching, headerFetching]);
final raw = result.first as String;
final header = result[1] as Map<String, Object>;

return {'raw': raw, 'header': header};
await super.update();
_updateHeight();
}

@override
Future<List<BitcoinTransactionInfo>> fetchTransactions() async {
final addresses = wallet.getAddresses();
final addresses = wallet.addresses;
final histories =
addresses.map((address) => eclient.getHistory(address: address));
addresses.map((record) => eclient.getHistory(address: record.address));
final _historiesWithDetails = await Future.wait(histories)
.then((histories) => histories
.map((h) => h.where((tx) => (tx['height'] as int) > _height))
Expand All @@ -85,35 +71,35 @@ class BitcoinTransactionHistory extends TransactionHistory {
return historiesWithDetails
.map((info) => BitcoinTransactionInfo.fromHexAndHeader(
info['raw'] as String, info['header'] as Map<String, Object>,
addresses: addresses))
addresses: addresses.map((record) => record.address).toList()))
.toList();
}

Future<Map<String, Object>> fetchTransactionInfo(
{@required String hash, @required int height}) async {
final rawFetching = eclient.getTransactionRaw(hash: hash);
final headerFetching = eclient.getHeader(height: height);
final result = await Future.wait([rawFetching, headerFetching]);
final raw = result.first as String;
final header = result[1] as Map<String, Object>;

return {'raw': raw, 'header': header};
}

Future<void> add(List<BitcoinTransactionInfo> transactions) async {
final txs = await getAll()
..addAll(transactions);
await writeData(
path: path,
password: _password,
data: json
.encode(txs.map((tx) => (tx as BitcoinTransactionInfo).toJson())));
this.transactions.addAll(transactions);
await save();
}

Future<void> addOne(BitcoinTransactionInfo tx) async {
final txs = await getAll()
..add(tx);
await writeData(
path: path,
password: _password,
data: json
.encode(txs.map((tx) => (tx as BitcoinTransactionInfo).toJson())));
transactions.add(tx);
await save();
}

Future<void> save() async => writeData(
path: path,
password: _password,
data: json
.encode({'height': _height, 'transactions': _transactions.value}));
data: json.encode({'height': _height, 'transactions': transactions}));

Future<Map<String, Object>> _read() async {
try {
Expand All @@ -133,13 +119,13 @@ class BitcoinTransactionHistory extends TransactionHistory {

return {'transactions': transactions, 'height': height};
} catch (_) {
return {'transactions': List<TransactionInfo>(), 'height': 0};
return {'transactions': <TransactionInfo>[], 'height': 0};
}
}

void _updateHeight() {
final int newHeight = _transactions.value
.fold(0, (acc, val) => val.height > acc ? val.height : acc);
final newHeight = transactions.fold(
0, (int acc, val) => val.height > acc ? val.height : acc);
_height = newHeight > _height ? newHeight : _height;
}
}
2 changes: 1 addition & 1 deletion lib/bitcoin/bitcoin_transaction_info.dart
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ class BitcoinTransactionInfo extends TransactionInfo {
String amountFormatted() => bitcoinAmountToString(amount: amount);

@override
String fiatAmount() => '';
String fiatAmount() => '\$ 24.5';

Map<String, dynamic> toJson() {
final m = Map<String, dynamic>();
Expand Down
Loading

0 comments on commit 81cee18

Please sign in to comment.