use isar ordinal model

This commit is contained in:
julian 2023-07-21 17:51:04 -06:00
parent 974924de8d
commit 48109f3c49
6 changed files with 1588 additions and 42 deletions

View file

@ -0,0 +1,76 @@
import 'package:isar/isar.dart';
import 'package:stackwallet/dto/ordinals/inscription_data.dart';
part 'ordinal.g.dart';
@collection
class Ordinal {
Id id = Isar.autoIncrement;
final String walletId;
@Index(unique: true, replace: true, composite: [
CompositeIndex("utxoTXID"),
CompositeIndex("utxoVOUT"),
])
final String inscriptionId;
final int inscriptionNumber;
final String content;
// following two are used to look up the UTXO object in isar combined w/ walletId
final String utxoTXID;
final int utxoVOUT;
Ordinal({
required this.walletId,
required this.inscriptionId,
required this.inscriptionNumber,
required this.content,
required this.utxoTXID,
required this.utxoVOUT,
});
factory Ordinal.fromInscriptionData(InscriptionData data, String walletId) {
return Ordinal(
walletId: walletId,
inscriptionId: data.inscriptionId,
inscriptionNumber: data.inscriptionNumber,
content: data.content,
utxoTXID: data.output.split(':')[
0], // "output": "062f32e21aa04246b8873b5d9a929576addd0339881e1ea478b406795d6b6c47:0"
utxoVOUT: int.parse(data.output.split(':')[1]),
);
}
Ordinal copyWith({
String? walletId,
String? inscriptionId,
int? inscriptionNumber,
String? content,
String? utxoTXID,
int? utxoVOUT,
}) {
return Ordinal(
walletId: walletId ?? this.walletId,
inscriptionId: inscriptionId ?? this.inscriptionId,
inscriptionNumber: inscriptionNumber ?? this.inscriptionNumber,
content: content ?? this.content,
utxoTXID: utxoTXID ?? this.utxoTXID,
utxoVOUT: utxoVOUT ?? this.utxoVOUT,
);
}
@override
String toString() {
return 'Ordinal {'
' walletId: $walletId,'
' inscriptionId: $inscriptionId,'
' inscriptionNumber: $inscriptionNumber,'
' content: $content,'
' utxoTXID: $utxoTXID,'
' utxoVOUT: $utxoVOUT'
' }';
}
}

File diff suppressed because it is too large Load diff

View file

@ -1,29 +0,0 @@
import 'package:stackwallet/dto/ordinals/inscription_data.dart';
class Ordinal {
final String inscriptionId;
final int inscriptionNumber;
final String content;
// following two are used to look up the UTXO object in isar combined w/ walletId
final String utxoTXID;
final int utxoVOUT;
Ordinal({
required this.inscriptionId,
required this.inscriptionNumber,
required this.content,
required this.utxoTXID,
required this.utxoVOUT,
});
factory Ordinal.fromInscriptionData(InscriptionData data) {
return Ordinal(
inscriptionId: data.inscriptionId,
inscriptionNumber: data.inscriptionNumber,
content: data.content,
utxoTXID: data.output.split(':')[0], // "output": "062f32e21aa04246b8873b5d9a929576addd0339881e1ea478b406795d6b6c47:0"
utxoVOUT: int.parse(data.output.split(':')[1]),
);
}
}

View file

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:stackwallet/models/ordinal.dart'; import 'package:stackwallet/models/ordinal.dart';
import 'package:stackwallet/pages/ordinals/widgets/ordinal_card.dart'; import 'package:stackwallet/pages/ordinals/widgets/ordinal_card.dart';
import 'package:stackwallet/widgets/loading_indicator.dart';
class OrdinalsList extends StatelessWidget { class OrdinalsList extends StatelessWidget {
const OrdinalsList({ const OrdinalsList({
@ -20,7 +21,7 @@ class OrdinalsList extends StatelessWidget {
future: ordinalsFuture, future: ordinalsFuture,
builder: (context, snapshot) { builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) { if (snapshot.connectionState == ConnectionState.waiting) {
return const CircularProgressIndicator(); return const LoadingIndicator();
} else if (snapshot.hasError) { } else if (snapshot.hasError) {
return Text('Error: ${snapshot.error}'); return Text('Error: ${snapshot.error}');
} else if (snapshot.hasData) { } else if (snapshot.hasData) {

View file

@ -19,7 +19,7 @@ import 'package:stackwallet/models/exchange/incomplete_exchange.dart';
import 'package:stackwallet/models/exchange/response_objects/trade.dart'; import 'package:stackwallet/models/exchange/response_objects/trade.dart';
import 'package:stackwallet/models/isar/models/contact_entry.dart'; import 'package:stackwallet/models/isar/models/contact_entry.dart';
import 'package:stackwallet/models/isar/models/isar_models.dart'; import 'package:stackwallet/models/isar/models/isar_models.dart';
import 'package:stackwallet/models/ordinal.dart'; import 'package:stackwallet/models/isar/ordinal.dart';
import 'package:stackwallet/models/paynym/paynym_account_lite.dart'; import 'package:stackwallet/models/paynym/paynym_account_lite.dart';
import 'package:stackwallet/models/send_view_auto_fill_data.dart'; import 'package:stackwallet/models/send_view_auto_fill_data.dart';
import 'package:stackwallet/pages/add_wallet_views/add_token_view/add_custom_token_view.dart'; import 'package:stackwallet/pages/add_wallet_views/add_token_view/add_custom_token_view.dart';

View file

@ -4,7 +4,7 @@ import 'package:isar/isar.dart';
import 'package:stackwallet/db/isar/main_db.dart'; import 'package:stackwallet/db/isar/main_db.dart';
import 'package:stackwallet/dto/ordinals/inscription_data.dart'; import 'package:stackwallet/dto/ordinals/inscription_data.dart';
import 'package:stackwallet/models/isar/models/blockchain_data/utxo.dart'; import 'package:stackwallet/models/isar/models/blockchain_data/utxo.dart';
import 'package:stackwallet/models/ordinal.dart'; import 'package:stackwallet/models/isar/ordinal.dart';
import 'package:stackwallet/services/litescribe_api.dart'; import 'package:stackwallet/services/litescribe_api.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
@ -18,12 +18,13 @@ mixin OrdinalsInterface {
required Coin coin, required Coin coin,
required MainDB db, required MainDB db,
}) { }) {
print('init');
_walletId = walletId; _walletId = walletId;
_coin = coin; _coin = coin;
_db = db; _db = db;
} }
final LitescribeAPI litescribeAPI = LitescribeAPI(baseUrl: 'https://litescribe.io/api');
final LitescribeAPI litescribeAPI =
LitescribeAPI(baseUrl: 'https://litescribe.io/api');
void refreshInscriptions() async { void refreshInscriptions() async {
List<dynamic> _inscriptions; List<dynamic> _inscriptions;
@ -63,22 +64,26 @@ mixin OrdinalsInterface {
return uniqueAddresses.toList(); return uniqueAddresses.toList();
} }
Future<List<InscriptionData>> getInscriptionDataFromAddress(String address) async { Future<List<InscriptionData>> getInscriptionDataFromAddress(
String address) async {
List<InscriptionData> allInscriptions = []; List<InscriptionData> allInscriptions = [];
try { try {
var inscriptions = await litescribeAPI.getInscriptionsByAddress(address); var inscriptions = await litescribeAPI.getInscriptionsByAddress(address);
allInscriptions.addAll(inscriptions); allInscriptions.addAll(inscriptions);
} catch (e) { } catch (e) {
throw Exception('Error in OrdinalsInterface getInscriptionsByAddress: $e'); throw Exception(
'Error in OrdinalsInterface getInscriptionsByAddress: $e');
} }
return allInscriptions; return allInscriptions;
} }
Future<List<InscriptionData>> getInscriptionDataFromAddresses(List<String> addresses) async { Future<List<InscriptionData>> getInscriptionDataFromAddresses(
List<String> addresses) async {
List<InscriptionData> allInscriptions = []; List<InscriptionData> allInscriptions = [];
for (String address in addresses) { for (String address in addresses) {
try { try {
var inscriptions = await litescribeAPI.getInscriptionsByAddress(address); var inscriptions =
await litescribeAPI.getInscriptionsByAddress(address);
allInscriptions.addAll(inscriptions); allInscriptions.addAll(inscriptions);
} catch (e) { } catch (e) {
print("Error fetching inscriptions for address $address: $e"); print("Error fetching inscriptions for address $address: $e");
@ -90,7 +95,9 @@ mixin OrdinalsInterface {
Future<List<Ordinal>> getOrdinalsFromAddress(String address) async { Future<List<Ordinal>> getOrdinalsFromAddress(String address) async {
try { try {
var inscriptions = await litescribeAPI.getInscriptionsByAddress(address); var inscriptions = await litescribeAPI.getInscriptionsByAddress(address);
return inscriptions.map((data) => Ordinal.fromInscriptionData(data)).toList(); return inscriptions
.map((data) => Ordinal.fromInscriptionData(data, _walletId))
.toList();
} catch (e) { } catch (e) {
throw Exception('Error in OrdinalsInterface getOrdinalsFromAddress: $e'); throw Exception('Error in OrdinalsInterface getOrdinalsFromAddress: $e');
} }
@ -100,12 +107,14 @@ mixin OrdinalsInterface {
List<Ordinal> allOrdinals = []; List<Ordinal> allOrdinals = [];
for (String address in addresses) { for (String address in addresses) {
try { try {
var inscriptions = await litescribeAPI.getInscriptionsByAddress(address); var inscriptions =
allOrdinals.addAll(inscriptions.map((data) => Ordinal.fromInscriptionData(data))); await litescribeAPI.getInscriptionsByAddress(address);
allOrdinals.addAll(inscriptions
.map((data) => Ordinal.fromInscriptionData(data, _walletId)));
} catch (e) { } catch (e) {
print("Error fetching inscriptions for address $address: $e"); print("Error fetching inscriptions for address $address: $e");
} }
} }
return allOrdinals; return allOrdinals;
} }
} }