Skip to content

Commit bf10550

Browse files
committed
Tx listing and address generation
1 parent f66b3bf commit bf10550

File tree

14 files changed

+582
-177
lines changed

14 files changed

+582
-177
lines changed

lib/main.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,26 @@ import 'package:flutter/services.dart';
55
import 'package:provider/provider.dart';
66
import 'package:sentinelx/channels/ApiChannel.dart';
77
import 'package:sentinelx/models/db/database.dart';
8+
import 'package:sentinelx/models/db/txDB.dart';
89
import 'package:sentinelx/models/tx.dart';
910
import 'package:sentinelx/screens/Track/track_screen.dart';
1011
import 'package:sentinelx/screens/home.dart';
1112
import 'package:sentinelx/shared_state/ThemeProvider.dart';
1213
import 'package:sentinelx/shared_state/appState.dart';
14+
import 'package:sentinelx/shared_state/txState.dart';
1315
import 'package:sentinelx/widgets/account_pager.dart';
1416

1517
import 'models/wallet.dart';
1618

1719
Future main() async {
1820
Provider.debugCheckInvalidValueType = null;
1921
await initDatabase();
20-
var txs = await Tx.getTxes();
21-
print("TXES ${txs.map((tx) => tx.toJson()).toList()}");
2222
return runApp(MultiProvider(
2323
providers: [
2424
Provider<AppState>.value(value: AppState()),
2525
ChangeNotifierProvider<ThemeProvider>.value(value: AppState().theme),
2626
Provider<Wallet>.value(value: AppState().selectedWallet),
27+
ChangeNotifierProvider<TxState>.value(value: AppState().selectedWallet.txState),
2728
],
2829
child: SentinelX(),
2930
));
@@ -46,4 +47,3 @@ class SentinelX extends StatelessWidget {
4647
// return
4748
}
4849
}
49-

lib/models/db/database.dart

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,30 @@
11
import 'package:sentinelx/models/db/sentinelxDB.dart';
22
import 'package:sentinelx/models/db/txDB.dart';
3+
import 'package:sentinelx/models/tx.dart';
34
import 'package:sentinelx/models/wallet.dart';
45
import 'package:sentinelx/shared_state/appState.dart';
56

67
initDatabase() async {
78
await SentinelxDB.instance.database;
8-
await TxDB.instance.database;
99
final wallets = await Wallet.getAllWallets();
1010
AppState appState = AppState();
1111

1212
if (wallets.length == 0) {
1313
//Default account
1414
//for future updates app will support multiple account
15-
var wallet = new Wallet( walletName: "Wallet 1", xpubs: []);
15+
var wallet = new Wallet(walletName: "Wallet 1", xpubs: []);
1616
Wallet.insert(wallet);
1717
print("Init : Wallet created");
1818
appState.wallets = wallets.toList();
1919
appState.wallets.add(wallet);
2020
appState.selectWallet(wallet);
21+
await TxDB.instance(wallet.getTxDb()).database;
22+
appState.selectedWallet.initTxDb();
2123
} else {
2224
appState.wallets = wallets.toList();
2325
appState.selectWallet(wallets.toList().first);
2426
print(appState.selectedWallet.toJson());
27+
await TxDB.instance(wallets.toList().first.getTxDb()).database;
28+
appState.selectedWallet.initTxDb();
2529
}
2630
}

lib/models/db/txDB.dart

Lines changed: 62 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,87 @@ import 'dart:async';
33
import 'package:path/path.dart';
44
import 'package:sembast/sembast.dart';
55
import 'package:sembast/sembast_io.dart';
6+
import 'package:sembast/utils/value_utils.dart';
67
import 'package:sentinelx/channels/SystemChannel.dart';
8+
import 'package:sentinelx/models/tx.dart';
79
import 'package:sentinelx/models/wallet.dart';
10+
import 'package:sentinelx/models/xpub.dart';
811
import 'package:sentinelx/shared_state/appState.dart';
912

1013
class TxDB {
11-
static final TxDB _singleton = TxDB._();
14+
static String db = 'txes.db';
15+
static TxDB _singleton = TxDB._privateConstructor();
1216

13-
static TxDB get instance => _singleton;
17+
static const String STORE_NAME = 'txs';
1418

15-
Completer<Database> _dbOpenCompleter;
19+
static Future<Database> get _db async => await TxDB.instance(AppState().selectedWallet.getTxDb()).database;
20+
static final txStore = stringMapStoreFactory.store(STORE_NAME);
21+
22+
TxDB._privateConstructor();
1623

17-
TxDB._();
24+
String dbPath;
25+
static TxDB instance(param) {
26+
if (param != db) {
27+
db = param;
28+
_singleton = TxDB._privateConstructor();
29+
}
30+
return _singleton;
31+
}
32+
33+
Completer<Database> _dbOpenCompleter;
1834

1935
Database _database;
2036

2137
Future<Database> get database async {
2238
if (_dbOpenCompleter == null) {
2339
_dbOpenCompleter = Completer();
24-
_openDatabase();
40+
openDatabase();
2541
}
26-
2742
return _dbOpenCompleter.future;
2843
}
2944

30-
Future _openDatabase() async {
45+
static Future insertOrUpdate(List<dynamic> items, Address addressObj, bool isXpub) async {
46+
var db = await _db;
47+
StoreRef txStore = stringMapStoreFactory.store(addressObj.address);
48+
await txStore.delete(db);
49+
await db.transaction((txn) async {
50+
for (var i = 0; i < items.length; i++) {
51+
var item = Tx.fromJson(items[i]);
52+
await txStore.add(txn, item.toJson());
53+
}
54+
});
55+
}
56+
57+
static Future<List<Tx>> getTxes(String xpubOraddress) async {
58+
StoreRef txStore = stringMapStoreFactory.store(xpubOraddress);
59+
final recordSnapshots = await txStore.find(await _db);
60+
return recordSnapshots.map((snapshot) {
61+
final tx = Tx.fromJson(snapshot.value);
62+
tx.key = snapshot.key;
63+
return tx;
64+
}).toList();
65+
}
66+
67+
static Future<List<Tx>> getAllTxes(List<XPUBModel> models) async {
68+
List<Tx> txes = [];
69+
for (var i = 0; i < models.length; i++) {
70+
StoreRef txStore = stringMapStoreFactory.store(models[i].xpub);
71+
final recordSnapshots = await txStore.find(await _db);
72+
recordSnapshots.forEach((record) {
73+
final tx = Tx.fromJson(record.value);
74+
tx.key = record.key;
75+
var txExist = txes.firstWhere((item) => item.hash == tx.hash,orElse: () => null);
76+
if(txExist == null){
77+
txes.add(tx);
78+
}
79+
});
80+
}
81+
return txes;
82+
}
83+
84+
Future openDatabase() async {
3185
final appDocumentDir = await SystemChannel().getDataDir();
32-
print(appDocumentDir);
33-
final dbPath = join(appDocumentDir.path, 'txes.db');
86+
final dbPath = join(appDocumentDir.path, TxDB.db);
3487
final database = await databaseFactoryIo.openDatabase(dbPath);
3588
_dbOpenCompleter.complete(database);
3689
}

lib/models/tx.dart

Lines changed: 75 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import 'package:flutter/widgets.dart';
22
import 'package:sembast/sembast.dart';
3+
import 'package:sembast/utils/value_utils.dart';
34
import 'package:sentinelx/models/db/txDB.dart';
5+
import 'package:sentinelx/shared_state/appState.dart';
46

57
import '../db_test.dart';
68

@@ -36,7 +38,10 @@ class Tx {
3638
String key;
3739
static const String STORE_NAME = 'txs';
3840

39-
static Future<Database> get _db async => await TxDB.instance.database;
41+
//associated xpub and address will be updated in this filed
42+
List<String> associatedWallets = [];
43+
44+
static Future<Database> get _db async => await TxDB.instance(AppState().selectedWallet.getTxDb()).database;
4045
static final txStore = stringMapStoreFactory.store(STORE_NAME);
4146

4247
Tx(
@@ -68,6 +73,10 @@ class Tx {
6873
out.add(new Out.fromJson(v));
6974
});
7075
}
76+
if (json['associatedWallets'] != null) {
77+
List<String> wallets = json['associatedWallets'].cast<String>();
78+
this.associatedWallets = wallets.toList();
79+
}
7180
blockHeight = json['block_height'];
7281
balance = json['balance'];
7382
}
@@ -87,27 +96,70 @@ class Tx {
8796
}
8897
data['block_height'] = this.blockHeight;
8998
data['balance'] = this.balance;
90-
data['key'] = this.hash;
99+
// data['key'] = this.hash;
100+
101+
if (this.associatedWallets != null) {
102+
data['associatedWallets'] = this.associatedWallets;
103+
}
91104
return data;
92105
}
93106

94-
static Future insert(List<Tx> items) async {
95-
var db = await _db;
96-
await db.transaction((txn) async {
97-
for (var i = 0; i < items.length; i++) {
98-
await txStore.add(txn, items[i].toJson());
107+
void update(Map<String, dynamic> jsonTx, bool isXpub) {
108+
jsonTx.keys.forEach((key) {
109+
switch (key) {
110+
case "hash":
111+
{
112+
hash = jsonTx['hash'];
113+
break;
114+
}
115+
case "time":
116+
{
117+
time = jsonTx['time'];
118+
break;
119+
}
120+
case "version":
121+
{
122+
version = jsonTx['version'];
123+
break;
124+
}
125+
case "locktime":
126+
{
127+
locktime = jsonTx['locktime'];
128+
break;
129+
}
130+
case "result":
131+
{
132+
result = jsonTx['result'];
133+
break;
134+
}
135+
case "inputs":
136+
{
137+
if (jsonTx['inputs'] != null) {
138+
inputs = new List<Inputs>();
139+
jsonTx['inputs'].forEach((v) {
140+
inputs.add(new Inputs.fromJson(v));
141+
});
142+
}
143+
break;
144+
}
145+
case "out":
146+
{
147+
if (jsonTx['out'] != null) {
148+
out = new List<Out>();
149+
jsonTx['out'].forEach((v) {
150+
out.add(new Out.fromJson(v));
151+
});
152+
}
153+
break;
154+
}
155+
case "block_height":
156+
{
157+
blockHeight = jsonTx['block_height'];
158+
break;
159+
}
99160
}
100161
});
101162
}
102-
103-
static Future<List<Tx>> getTxes() async {
104-
final recordSnapshots = await txStore.find(await _db);
105-
return recordSnapshots.map((snapshot) {
106-
final tx = Tx.fromJson(snapshot.value);
107-
tx.key = snapshot.key;
108-
return tx;
109-
}).toList();
110-
}
111163
}
112164

113165
class PrevOut {
@@ -218,3 +270,10 @@ class Address {
218270
return data;
219271
}
220272
}
273+
274+
class ListSection extends Tx{
275+
String section ="";
276+
DateTime timeStamp = DateTime.now();
277+
ListSection({this.section, this.timeStamp});
278+
279+
}

lib/models/wallet.dart

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,47 @@
11
import 'package:flutter/widgets.dart';
22
import 'package:sembast/sembast.dart';
3+
import 'package:sentinelx/models/db/txDB.dart';
34
import 'package:sentinelx/models/tx.dart';
45
import 'package:sentinelx/models/xpub.dart';
56

67
import 'package:sentinelx/models/db/sentinelxDB.dart';
78
import 'package:sentinelx/shared_state/balance.dart';
9+
import 'package:sentinelx/shared_state/txState.dart';
810

911
class Wallet extends ChangeNotifier {
1012
static const String STORE_NAME = 'wallet';
1113

1214
int id;
13-
String walletName = "Wallet 1";
15+
String walletName = "Wallet1";
1416
List<XPUBModel> xpubs = [];
1517
List<String> legacyAddresses = [];
1618
BalanceModel balanceModel = new BalanceModel();
19+
TxState txState = TxState();
20+
TxDB txDB;
21+
22+
Wallet({this.walletName, this.xpubs});
1723

18-
Wallet({this.walletName, this.xpubs });
1924

2025
static Future<Database> get _db async => await SentinelxDB.instance.database;
2126

2227
static final _walletStore = intMapStoreFactory.store(STORE_NAME);
2328

29+
Future initTxDb() async {
30+
print("initTxDbinitTxDb");
31+
txDB = TxDB.instance(this.getTxDb());
32+
await txDB.database;
33+
this.loadAllTxes();
34+
}
35+
36+
Future loadAllTxes() async {
37+
List<Tx> txList = await TxDB.getAllTxes(this.xpubs);
38+
txState.addTxes(txList);
39+
}
40+
2441
void addXpub({String xpub, String bip}) {
2542
var xpubItem = new XPUBModel(xpub: xpub, bip: bip);
2643
this.xpubs.add(xpubItem);
2744
this.notifyListeners();
28-
print(this.toJson());
2945
Wallet.update(this);
3046
}
3147

@@ -50,7 +66,6 @@ class Wallet extends ChangeNotifier {
5066
wallet.toJson(),
5167
finder: finder,
5268
);
53-
print("UPDATED");
5469
}
5570

5671
Map<String, dynamic> toJson() {
@@ -72,11 +87,8 @@ class Wallet extends ChangeNotifier {
7287
}
7388

7489
Wallet.fromJson(Map<String, dynamic> json) {
75-
76-
if(json.containsKey("balanceModel")){
77-
this.balanceModel.fromJSON(
78-
json['balanceModel']
79-
) ;
90+
if (json.containsKey("balanceModel")) {
91+
this.balanceModel.fromJSON(json['balanceModel']);
8092
}
8193

8294
this.walletName = json['walletName'];
@@ -90,10 +102,10 @@ class Wallet extends ChangeNotifier {
90102
}
91103
}
92104

93-
num updateTotalBalance(){
105+
num updateTotalBalance() {
94106
num total = 0;
95-
this.xpubs.forEach((model){
96-
total = total+ model.final_balance;
107+
this.xpubs.forEach((model) {
108+
total = total + model.final_balance;
97109
});
98110
this.balanceModel.update(total);
99111
this.notifyListeners();
@@ -119,4 +131,8 @@ class Wallet extends ChangeNotifier {
119131
notifyListeners();
120132
return this.saveState();
121133
}
134+
135+
String getTxDb() {
136+
return "txstore-wallet-${this.id}.db";
137+
}
122138
}

0 commit comments

Comments
 (0)