mirror of
https://github.com/cypherstack/stack_wallet.git
synced 2025-02-02 19:26:37 +00:00
switch values that change over time to computed properties
This commit is contained in:
parent
86956b3fad
commit
3de937fe03
4 changed files with 119 additions and 514 deletions
|
@ -1,3 +1,5 @@
|
|||
import 'dart:math';
|
||||
|
||||
import 'package:isar/isar.dart';
|
||||
import 'package:stackwallet/models/isar/models/blockchain_data/input.dart';
|
||||
import 'package:stackwallet/models/isar/models/blockchain_data/output.dart';
|
||||
|
@ -11,10 +13,6 @@ class Transaction {
|
|||
|
||||
late String txid;
|
||||
|
||||
late bool confirmed;
|
||||
|
||||
late int confirmations;
|
||||
|
||||
late int timestamp;
|
||||
|
||||
@enumerated
|
||||
|
@ -28,8 +26,6 @@ class Transaction {
|
|||
// TODO: do we need this?
|
||||
// late List<dynamic> aliens;
|
||||
|
||||
late String worthAtBlockTimestamp;
|
||||
|
||||
late int fee;
|
||||
|
||||
late String address;
|
||||
|
@ -47,6 +43,15 @@ class Transaction {
|
|||
final outputs = IsarLinks<Output>();
|
||||
|
||||
final note = IsarLink<TransactionNote>();
|
||||
|
||||
int getConfirmations(int currentChainHeight) {
|
||||
return max(0, currentChainHeight - height);
|
||||
}
|
||||
|
||||
bool isConfirmed(int currentChainHeight, int minimumConfirms) {
|
||||
final confirmations = getConfirmations(currentChainHeight);
|
||||
return confirmations >= minimumConfirms;
|
||||
}
|
||||
}
|
||||
|
||||
// Used in Isar db and stored there as int indexes so adding/removing values
|
||||
|
|
|
@ -32,62 +32,47 @@ const TransactionSchema = CollectionSchema(
|
|||
name: r'cancelled',
|
||||
type: IsarType.bool,
|
||||
),
|
||||
r'confirmations': PropertySchema(
|
||||
id: 3,
|
||||
name: r'confirmations',
|
||||
type: IsarType.long,
|
||||
),
|
||||
r'confirmed': PropertySchema(
|
||||
id: 4,
|
||||
name: r'confirmed',
|
||||
type: IsarType.bool,
|
||||
),
|
||||
r'fee': PropertySchema(
|
||||
id: 5,
|
||||
id: 3,
|
||||
name: r'fee',
|
||||
type: IsarType.long,
|
||||
),
|
||||
r'height': PropertySchema(
|
||||
id: 6,
|
||||
id: 4,
|
||||
name: r'height',
|
||||
type: IsarType.long,
|
||||
),
|
||||
r'otherData': PropertySchema(
|
||||
id: 7,
|
||||
id: 5,
|
||||
name: r'otherData',
|
||||
type: IsarType.string,
|
||||
),
|
||||
r'slateId': PropertySchema(
|
||||
id: 8,
|
||||
id: 6,
|
||||
name: r'slateId',
|
||||
type: IsarType.string,
|
||||
),
|
||||
r'subType': PropertySchema(
|
||||
id: 9,
|
||||
id: 7,
|
||||
name: r'subType',
|
||||
type: IsarType.byte,
|
||||
enumMap: _TransactionsubTypeEnumValueMap,
|
||||
),
|
||||
r'timestamp': PropertySchema(
|
||||
id: 10,
|
||||
id: 8,
|
||||
name: r'timestamp',
|
||||
type: IsarType.long,
|
||||
),
|
||||
r'txType': PropertySchema(
|
||||
id: 11,
|
||||
id: 9,
|
||||
name: r'txType',
|
||||
type: IsarType.byte,
|
||||
enumMap: _TransactiontxTypeEnumValueMap,
|
||||
),
|
||||
r'txid': PropertySchema(
|
||||
id: 12,
|
||||
id: 10,
|
||||
name: r'txid',
|
||||
type: IsarType.string,
|
||||
),
|
||||
r'worthAtBlockTimestamp': PropertySchema(
|
||||
id: 13,
|
||||
name: r'worthAtBlockTimestamp',
|
||||
type: IsarType.string,
|
||||
)
|
||||
},
|
||||
estimateSize: _transactionEstimateSize,
|
||||
|
@ -143,7 +128,6 @@ int _transactionEstimateSize(
|
|||
}
|
||||
}
|
||||
bytesCount += 3 + object.txid.length * 3;
|
||||
bytesCount += 3 + object.worthAtBlockTimestamp.length * 3;
|
||||
return bytesCount;
|
||||
}
|
||||
|
||||
|
@ -156,17 +140,14 @@ void _transactionSerialize(
|
|||
writer.writeString(offsets[0], object.address);
|
||||
writer.writeLong(offsets[1], object.amount);
|
||||
writer.writeBool(offsets[2], object.cancelled);
|
||||
writer.writeLong(offsets[3], object.confirmations);
|
||||
writer.writeBool(offsets[4], object.confirmed);
|
||||
writer.writeLong(offsets[5], object.fee);
|
||||
writer.writeLong(offsets[6], object.height);
|
||||
writer.writeString(offsets[7], object.otherData);
|
||||
writer.writeString(offsets[8], object.slateId);
|
||||
writer.writeByte(offsets[9], object.subType.index);
|
||||
writer.writeLong(offsets[10], object.timestamp);
|
||||
writer.writeByte(offsets[11], object.txType.index);
|
||||
writer.writeString(offsets[12], object.txid);
|
||||
writer.writeString(offsets[13], object.worthAtBlockTimestamp);
|
||||
writer.writeLong(offsets[3], object.fee);
|
||||
writer.writeLong(offsets[4], object.height);
|
||||
writer.writeString(offsets[5], object.otherData);
|
||||
writer.writeString(offsets[6], object.slateId);
|
||||
writer.writeByte(offsets[7], object.subType.index);
|
||||
writer.writeLong(offsets[8], object.timestamp);
|
||||
writer.writeByte(offsets[9], object.txType.index);
|
||||
writer.writeString(offsets[10], object.txid);
|
||||
}
|
||||
|
||||
Transaction _transactionDeserialize(
|
||||
|
@ -179,22 +160,19 @@ Transaction _transactionDeserialize(
|
|||
object.address = reader.readString(offsets[0]);
|
||||
object.amount = reader.readLong(offsets[1]);
|
||||
object.cancelled = reader.readBool(offsets[2]);
|
||||
object.confirmations = reader.readLong(offsets[3]);
|
||||
object.confirmed = reader.readBool(offsets[4]);
|
||||
object.fee = reader.readLong(offsets[5]);
|
||||
object.height = reader.readLong(offsets[6]);
|
||||
object.fee = reader.readLong(offsets[3]);
|
||||
object.height = reader.readLong(offsets[4]);
|
||||
object.id = id;
|
||||
object.otherData = reader.readStringOrNull(offsets[7]);
|
||||
object.slateId = reader.readStringOrNull(offsets[8]);
|
||||
object.otherData = reader.readStringOrNull(offsets[5]);
|
||||
object.slateId = reader.readStringOrNull(offsets[6]);
|
||||
object.subType =
|
||||
_TransactionsubTypeValueEnumMap[reader.readByteOrNull(offsets[9])] ??
|
||||
_TransactionsubTypeValueEnumMap[reader.readByteOrNull(offsets[7])] ??
|
||||
TransactionSubType.none;
|
||||
object.timestamp = reader.readLong(offsets[10]);
|
||||
object.timestamp = reader.readLong(offsets[8]);
|
||||
object.txType =
|
||||
_TransactiontxTypeValueEnumMap[reader.readByteOrNull(offsets[11])] ??
|
||||
_TransactiontxTypeValueEnumMap[reader.readByteOrNull(offsets[9])] ??
|
||||
TransactionType.outgoing;
|
||||
object.txid = reader.readString(offsets[12]);
|
||||
object.worthAtBlockTimestamp = reader.readString(offsets[13]);
|
||||
object.txid = reader.readString(offsets[10]);
|
||||
return object;
|
||||
}
|
||||
|
||||
|
@ -214,26 +192,20 @@ P _transactionDeserializeProp<P>(
|
|||
case 3:
|
||||
return (reader.readLong(offset)) as P;
|
||||
case 4:
|
||||
return (reader.readBool(offset)) as P;
|
||||
return (reader.readLong(offset)) as P;
|
||||
case 5:
|
||||
return (reader.readLong(offset)) as P;
|
||||
return (reader.readStringOrNull(offset)) as P;
|
||||
case 6:
|
||||
return (reader.readLong(offset)) as P;
|
||||
return (reader.readStringOrNull(offset)) as P;
|
||||
case 7:
|
||||
return (reader.readStringOrNull(offset)) as P;
|
||||
case 8:
|
||||
return (reader.readStringOrNull(offset)) as P;
|
||||
case 9:
|
||||
return (_TransactionsubTypeValueEnumMap[reader.readByteOrNull(offset)] ??
|
||||
TransactionSubType.none) as P;
|
||||
case 10:
|
||||
case 8:
|
||||
return (reader.readLong(offset)) as P;
|
||||
case 11:
|
||||
case 9:
|
||||
return (_TransactiontxTypeValueEnumMap[reader.readByteOrNull(offset)] ??
|
||||
TransactionType.outgoing) as P;
|
||||
case 12:
|
||||
return (reader.readString(offset)) as P;
|
||||
case 13:
|
||||
case 10:
|
||||
return (reader.readString(offset)) as P;
|
||||
default:
|
||||
throw IsarError('Unknown property with id $propertyId');
|
||||
|
@ -557,72 +529,6 @@ extension TransactionQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterFilterCondition>
|
||||
confirmationsEqualTo(int value) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'confirmations',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterFilterCondition>
|
||||
confirmationsGreaterThan(
|
||||
int value, {
|
||||
bool include = false,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
include: include,
|
||||
property: r'confirmations',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterFilterCondition>
|
||||
confirmationsLessThan(
|
||||
int value, {
|
||||
bool include = false,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.lessThan(
|
||||
include: include,
|
||||
property: r'confirmations',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterFilterCondition>
|
||||
confirmationsBetween(
|
||||
int lower,
|
||||
int upper, {
|
||||
bool includeLower = true,
|
||||
bool includeUpper = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.between(
|
||||
property: r'confirmations',
|
||||
lower: lower,
|
||||
includeLower: includeLower,
|
||||
upper: upper,
|
||||
includeUpper: includeUpper,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterFilterCondition>
|
||||
confirmedEqualTo(bool value) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'confirmed',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterFilterCondition> feeEqualTo(
|
||||
int value) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
|
@ -1383,143 +1289,6 @@ extension TransactionQueryFilter
|
|||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterFilterCondition>
|
||||
worthAtBlockTimestampEqualTo(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'worthAtBlockTimestamp',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterFilterCondition>
|
||||
worthAtBlockTimestampGreaterThan(
|
||||
String value, {
|
||||
bool include = false,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
include: include,
|
||||
property: r'worthAtBlockTimestamp',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterFilterCondition>
|
||||
worthAtBlockTimestampLessThan(
|
||||
String value, {
|
||||
bool include = false,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.lessThan(
|
||||
include: include,
|
||||
property: r'worthAtBlockTimestamp',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterFilterCondition>
|
||||
worthAtBlockTimestampBetween(
|
||||
String lower,
|
||||
String upper, {
|
||||
bool includeLower = true,
|
||||
bool includeUpper = true,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.between(
|
||||
property: r'worthAtBlockTimestamp',
|
||||
lower: lower,
|
||||
includeLower: includeLower,
|
||||
upper: upper,
|
||||
includeUpper: includeUpper,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterFilterCondition>
|
||||
worthAtBlockTimestampStartsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.startsWith(
|
||||
property: r'worthAtBlockTimestamp',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterFilterCondition>
|
||||
worthAtBlockTimestampEndsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.endsWith(
|
||||
property: r'worthAtBlockTimestamp',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterFilterCondition>
|
||||
worthAtBlockTimestampContains(String value, {bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.contains(
|
||||
property: r'worthAtBlockTimestamp',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterFilterCondition>
|
||||
worthAtBlockTimestampMatches(String pattern,
|
||||
{bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.matches(
|
||||
property: r'worthAtBlockTimestamp',
|
||||
wildcard: pattern,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterFilterCondition>
|
||||
worthAtBlockTimestampIsEmpty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'worthAtBlockTimestamp',
|
||||
value: '',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterFilterCondition>
|
||||
worthAtBlockTimestampIsNotEmpty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
property: r'worthAtBlockTimestamp',
|
||||
value: '',
|
||||
));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
extension TransactionQueryObject
|
||||
|
@ -1701,31 +1470,6 @@ extension TransactionQuerySortBy
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterSortBy> sortByConfirmations() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'confirmations', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterSortBy>
|
||||
sortByConfirmationsDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'confirmations', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterSortBy> sortByConfirmed() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'confirmed', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterSortBy> sortByConfirmedDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'confirmed', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterSortBy> sortByFee() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'fee', Sort.asc);
|
||||
|
@ -1821,20 +1565,6 @@ extension TransactionQuerySortBy
|
|||
return query.addSortBy(r'txid', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterSortBy>
|
||||
sortByWorthAtBlockTimestamp() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'worthAtBlockTimestamp', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterSortBy>
|
||||
sortByWorthAtBlockTimestampDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'worthAtBlockTimestamp', Sort.desc);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
extension TransactionQuerySortThenBy
|
||||
|
@ -1875,31 +1605,6 @@ extension TransactionQuerySortThenBy
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterSortBy> thenByConfirmations() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'confirmations', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterSortBy>
|
||||
thenByConfirmationsDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'confirmations', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterSortBy> thenByConfirmed() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'confirmed', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterSortBy> thenByConfirmedDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'confirmed', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterSortBy> thenByFee() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'fee', Sort.asc);
|
||||
|
@ -2007,20 +1712,6 @@ extension TransactionQuerySortThenBy
|
|||
return query.addSortBy(r'txid', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterSortBy>
|
||||
thenByWorthAtBlockTimestamp() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'worthAtBlockTimestamp', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QAfterSortBy>
|
||||
thenByWorthAtBlockTimestampDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'worthAtBlockTimestamp', Sort.desc);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
extension TransactionQueryWhereDistinct
|
||||
|
@ -2044,18 +1735,6 @@ extension TransactionQueryWhereDistinct
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QDistinct> distinctByConfirmations() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addDistinctBy(r'confirmations');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QDistinct> distinctByConfirmed() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addDistinctBy(r'confirmed');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QDistinct> distinctByFee() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addDistinctBy(r'fee');
|
||||
|
@ -2106,14 +1785,6 @@ extension TransactionQueryWhereDistinct
|
|||
return query.addDistinctBy(r'txid', caseSensitive: caseSensitive);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, Transaction, QDistinct>
|
||||
distinctByWorthAtBlockTimestamp({bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addDistinctBy(r'worthAtBlockTimestamp',
|
||||
caseSensitive: caseSensitive);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
extension TransactionQueryProperty
|
||||
|
@ -2142,18 +1813,6 @@ extension TransactionQueryProperty
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, int, QQueryOperations> confirmationsProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addPropertyName(r'confirmations');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, bool, QQueryOperations> confirmedProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addPropertyName(r'confirmed');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, int, QQueryOperations> feeProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addPropertyName(r'fee');
|
||||
|
@ -2203,11 +1862,4 @@ extension TransactionQueryProperty
|
|||
return query.addPropertyName(r'txid');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Transaction, String, QQueryOperations>
|
||||
worthAtBlockTimestampProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addPropertyName(r'worthAtBlockTimestamp');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
import 'dart:math';
|
||||
|
||||
import 'package:isar/isar.dart';
|
||||
|
||||
part 'utxo.g.dart';
|
||||
|
@ -14,24 +16,29 @@ class UTXO {
|
|||
|
||||
late int value;
|
||||
|
||||
late String fiatWorth;
|
||||
|
||||
late String txName;
|
||||
|
||||
late bool blocked;
|
||||
|
||||
late String? blockedReason;
|
||||
|
||||
late bool isCoinbase;
|
||||
}
|
||||
|
||||
@Embedded()
|
||||
class Status {
|
||||
late bool confirmed;
|
||||
|
||||
late int confirmations;
|
||||
|
||||
late String blockHash;
|
||||
|
||||
late int blockHeight;
|
||||
|
||||
late int blockTime;
|
||||
|
||||
int getConfirmations(int currentChainHeight) {
|
||||
return max(0, currentChainHeight - blockHeight);
|
||||
}
|
||||
|
||||
bool isConfirmed(int currentChainHeight, int minimumConfirms) {
|
||||
final confirmations = getConfirmations(currentChainHeight);
|
||||
return confirmations >= minimumConfirms;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,9 +22,9 @@ const UTXOSchema = CollectionSchema(
|
|||
name: r'blocked',
|
||||
type: IsarType.bool,
|
||||
),
|
||||
r'fiatWorth': PropertySchema(
|
||||
r'blockedReason': PropertySchema(
|
||||
id: 1,
|
||||
name: r'fiatWorth',
|
||||
name: r'blockedReason',
|
||||
type: IsarType.string,
|
||||
),
|
||||
r'isCoinbase': PropertySchema(
|
||||
|
@ -79,7 +79,12 @@ int _uTXOEstimateSize(
|
|||
Map<Type, List<int>> allOffsets,
|
||||
) {
|
||||
var bytesCount = offsets.last;
|
||||
bytesCount += 3 + object.fiatWorth.length * 3;
|
||||
{
|
||||
final value = object.blockedReason;
|
||||
if (value != null) {
|
||||
bytesCount += 3 + value.length * 3;
|
||||
}
|
||||
}
|
||||
bytesCount += 3 +
|
||||
StatusSchema.estimateSize(object.status, allOffsets[Status]!, allOffsets);
|
||||
bytesCount += 3 + object.txName.length * 3;
|
||||
|
@ -94,7 +99,7 @@ void _uTXOSerialize(
|
|||
Map<Type, List<int>> allOffsets,
|
||||
) {
|
||||
writer.writeBool(offsets[0], object.blocked);
|
||||
writer.writeString(offsets[1], object.fiatWorth);
|
||||
writer.writeString(offsets[1], object.blockedReason);
|
||||
writer.writeBool(offsets[2], object.isCoinbase);
|
||||
writer.writeObject<Status>(
|
||||
offsets[3],
|
||||
|
@ -116,7 +121,7 @@ UTXO _uTXODeserialize(
|
|||
) {
|
||||
final object = UTXO();
|
||||
object.blocked = reader.readBool(offsets[0]);
|
||||
object.fiatWorth = reader.readString(offsets[1]);
|
||||
object.blockedReason = reader.readStringOrNull(offsets[1]);
|
||||
object.id = id;
|
||||
object.isCoinbase = reader.readBool(offsets[2]);
|
||||
object.status = reader.readObjectOrNull<Status>(
|
||||
|
@ -142,7 +147,7 @@ P _uTXODeserializeProp<P>(
|
|||
case 0:
|
||||
return (reader.readBool(offset)) as P;
|
||||
case 1:
|
||||
return (reader.readString(offset)) as P;
|
||||
return (reader.readStringOrNull(offset)) as P;
|
||||
case 2:
|
||||
return (reader.readBool(offset)) as P;
|
||||
case 3:
|
||||
|
@ -262,59 +267,75 @@ extension UTXOQueryFilter on QueryBuilder<UTXO, UTXO, QFilterCondition> {
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<UTXO, UTXO, QAfterFilterCondition> fiatWorthEqualTo(
|
||||
String value, {
|
||||
QueryBuilder<UTXO, UTXO, QAfterFilterCondition> blockedReasonIsNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNull(
|
||||
property: r'blockedReason',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<UTXO, UTXO, QAfterFilterCondition> blockedReasonIsNotNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNotNull(
|
||||
property: r'blockedReason',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<UTXO, UTXO, QAfterFilterCondition> blockedReasonEqualTo(
|
||||
String? value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'fiatWorth',
|
||||
property: r'blockedReason',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<UTXO, UTXO, QAfterFilterCondition> fiatWorthGreaterThan(
|
||||
String value, {
|
||||
QueryBuilder<UTXO, UTXO, QAfterFilterCondition> blockedReasonGreaterThan(
|
||||
String? value, {
|
||||
bool include = false,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
include: include,
|
||||
property: r'fiatWorth',
|
||||
property: r'blockedReason',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<UTXO, UTXO, QAfterFilterCondition> fiatWorthLessThan(
|
||||
String value, {
|
||||
QueryBuilder<UTXO, UTXO, QAfterFilterCondition> blockedReasonLessThan(
|
||||
String? value, {
|
||||
bool include = false,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.lessThan(
|
||||
include: include,
|
||||
property: r'fiatWorth',
|
||||
property: r'blockedReason',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<UTXO, UTXO, QAfterFilterCondition> fiatWorthBetween(
|
||||
String lower,
|
||||
String upper, {
|
||||
QueryBuilder<UTXO, UTXO, QAfterFilterCondition> blockedReasonBetween(
|
||||
String? lower,
|
||||
String? upper, {
|
||||
bool includeLower = true,
|
||||
bool includeUpper = true,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.between(
|
||||
property: r'fiatWorth',
|
||||
property: r'blockedReason',
|
||||
lower: lower,
|
||||
includeLower: includeLower,
|
||||
upper: upper,
|
||||
|
@ -324,69 +345,69 @@ extension UTXOQueryFilter on QueryBuilder<UTXO, UTXO, QFilterCondition> {
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<UTXO, UTXO, QAfterFilterCondition> fiatWorthStartsWith(
|
||||
QueryBuilder<UTXO, UTXO, QAfterFilterCondition> blockedReasonStartsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.startsWith(
|
||||
property: r'fiatWorth',
|
||||
property: r'blockedReason',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<UTXO, UTXO, QAfterFilterCondition> fiatWorthEndsWith(
|
||||
QueryBuilder<UTXO, UTXO, QAfterFilterCondition> blockedReasonEndsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.endsWith(
|
||||
property: r'fiatWorth',
|
||||
property: r'blockedReason',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<UTXO, UTXO, QAfterFilterCondition> fiatWorthContains(
|
||||
QueryBuilder<UTXO, UTXO, QAfterFilterCondition> blockedReasonContains(
|
||||
String value,
|
||||
{bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.contains(
|
||||
property: r'fiatWorth',
|
||||
property: r'blockedReason',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<UTXO, UTXO, QAfterFilterCondition> fiatWorthMatches(
|
||||
QueryBuilder<UTXO, UTXO, QAfterFilterCondition> blockedReasonMatches(
|
||||
String pattern,
|
||||
{bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.matches(
|
||||
property: r'fiatWorth',
|
||||
property: r'blockedReason',
|
||||
wildcard: pattern,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<UTXO, UTXO, QAfterFilterCondition> fiatWorthIsEmpty() {
|
||||
QueryBuilder<UTXO, UTXO, QAfterFilterCondition> blockedReasonIsEmpty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'fiatWorth',
|
||||
property: r'blockedReason',
|
||||
value: '',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<UTXO, UTXO, QAfterFilterCondition> fiatWorthIsNotEmpty() {
|
||||
QueryBuilder<UTXO, UTXO, QAfterFilterCondition> blockedReasonIsNotEmpty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
property: r'fiatWorth',
|
||||
property: r'blockedReason',
|
||||
value: '',
|
||||
));
|
||||
});
|
||||
|
@ -839,15 +860,15 @@ extension UTXOQuerySortBy on QueryBuilder<UTXO, UTXO, QSortBy> {
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<UTXO, UTXO, QAfterSortBy> sortByFiatWorth() {
|
||||
QueryBuilder<UTXO, UTXO, QAfterSortBy> sortByBlockedReason() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'fiatWorth', Sort.asc);
|
||||
return query.addSortBy(r'blockedReason', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<UTXO, UTXO, QAfterSortBy> sortByFiatWorthDesc() {
|
||||
QueryBuilder<UTXO, UTXO, QAfterSortBy> sortByBlockedReasonDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'fiatWorth', Sort.desc);
|
||||
return query.addSortBy(r'blockedReason', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -925,15 +946,15 @@ extension UTXOQuerySortThenBy on QueryBuilder<UTXO, UTXO, QSortThenBy> {
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<UTXO, UTXO, QAfterSortBy> thenByFiatWorth() {
|
||||
QueryBuilder<UTXO, UTXO, QAfterSortBy> thenByBlockedReason() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'fiatWorth', Sort.asc);
|
||||
return query.addSortBy(r'blockedReason', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<UTXO, UTXO, QAfterSortBy> thenByFiatWorthDesc() {
|
||||
QueryBuilder<UTXO, UTXO, QAfterSortBy> thenByBlockedReasonDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'fiatWorth', Sort.desc);
|
||||
return query.addSortBy(r'blockedReason', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -1017,10 +1038,11 @@ extension UTXOQueryWhereDistinct on QueryBuilder<UTXO, UTXO, QDistinct> {
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<UTXO, UTXO, QDistinct> distinctByFiatWorth(
|
||||
QueryBuilder<UTXO, UTXO, QDistinct> distinctByBlockedReason(
|
||||
{bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addDistinctBy(r'fiatWorth', caseSensitive: caseSensitive);
|
||||
return query.addDistinctBy(r'blockedReason',
|
||||
caseSensitive: caseSensitive);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -1070,9 +1092,9 @@ extension UTXOQueryProperty on QueryBuilder<UTXO, UTXO, QQueryProperty> {
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<UTXO, String, QQueryOperations> fiatWorthProperty() {
|
||||
QueryBuilder<UTXO, String?, QQueryOperations> blockedReasonProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addPropertyName(r'fiatWorth');
|
||||
return query.addPropertyName(r'blockedReason');
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -1138,16 +1160,6 @@ const StatusSchema = Schema(
|
|||
id: 2,
|
||||
name: r'blockTime',
|
||||
type: IsarType.long,
|
||||
),
|
||||
r'confirmations': PropertySchema(
|
||||
id: 3,
|
||||
name: r'confirmations',
|
||||
type: IsarType.long,
|
||||
),
|
||||
r'confirmed': PropertySchema(
|
||||
id: 4,
|
||||
name: r'confirmed',
|
||||
type: IsarType.bool,
|
||||
)
|
||||
},
|
||||
estimateSize: _statusEstimateSize,
|
||||
|
@ -1175,8 +1187,6 @@ void _statusSerialize(
|
|||
writer.writeString(offsets[0], object.blockHash);
|
||||
writer.writeLong(offsets[1], object.blockHeight);
|
||||
writer.writeLong(offsets[2], object.blockTime);
|
||||
writer.writeLong(offsets[3], object.confirmations);
|
||||
writer.writeBool(offsets[4], object.confirmed);
|
||||
}
|
||||
|
||||
Status _statusDeserialize(
|
||||
|
@ -1189,8 +1199,6 @@ Status _statusDeserialize(
|
|||
object.blockHash = reader.readString(offsets[0]);
|
||||
object.blockHeight = reader.readLong(offsets[1]);
|
||||
object.blockTime = reader.readLong(offsets[2]);
|
||||
object.confirmations = reader.readLong(offsets[3]);
|
||||
object.confirmed = reader.readBool(offsets[4]);
|
||||
return object;
|
||||
}
|
||||
|
||||
|
@ -1207,10 +1215,6 @@ P _statusDeserializeProp<P>(
|
|||
return (reader.readLong(offset)) as P;
|
||||
case 2:
|
||||
return (reader.readLong(offset)) as P;
|
||||
case 3:
|
||||
return (reader.readLong(offset)) as P;
|
||||
case 4:
|
||||
return (reader.readBool(offset)) as P;
|
||||
default:
|
||||
throw IsarError('Unknown property with id $propertyId');
|
||||
}
|
||||
|
@ -1452,69 +1456,6 @@ extension StatusQueryFilter on QueryBuilder<Status, Status, QFilterCondition> {
|
|||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Status, Status, QAfterFilterCondition> confirmationsEqualTo(
|
||||
int value) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'confirmations',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Status, Status, QAfterFilterCondition> confirmationsGreaterThan(
|
||||
int value, {
|
||||
bool include = false,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
include: include,
|
||||
property: r'confirmations',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Status, Status, QAfterFilterCondition> confirmationsLessThan(
|
||||
int value, {
|
||||
bool include = false,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.lessThan(
|
||||
include: include,
|
||||
property: r'confirmations',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Status, Status, QAfterFilterCondition> confirmationsBetween(
|
||||
int lower,
|
||||
int upper, {
|
||||
bool includeLower = true,
|
||||
bool includeUpper = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.between(
|
||||
property: r'confirmations',
|
||||
lower: lower,
|
||||
includeLower: includeLower,
|
||||
upper: upper,
|
||||
includeUpper: includeUpper,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Status, Status, QAfterFilterCondition> confirmedEqualTo(
|
||||
bool value) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'confirmed',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
extension StatusQueryObject on QueryBuilder<Status, Status, QFilterCondition> {}
|
||||
|
|
Loading…
Reference in a new issue