update lelantus coin schema

This commit is contained in:
julian 2023-07-24 15:42:45 -06:00
parent df0b004b82
commit c97de6017b
7 changed files with 634 additions and 203 deletions
lib
db/isar
models/isar/models/firo_specific
services/coins/firo
utilities
test

View file

@ -14,7 +14,6 @@ import 'package:isar/isar.dart';
import 'package:stackwallet/exceptions/main_db/main_db_exception.dart'; import 'package:stackwallet/exceptions/main_db/main_db_exception.dart';
import 'package:stackwallet/models/isar/models/block_explorer.dart'; import 'package:stackwallet/models/isar/models/block_explorer.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/firo_specific/lelantus_coin.dart';
import 'package:stackwallet/models/isar/models/isar_models.dart'; import 'package:stackwallet/models/isar/models/isar_models.dart';
import 'package:stackwallet/models/isar/stack_theme.dart'; import 'package:stackwallet/models/isar/stack_theme.dart';
import 'package:stackwallet/utilities/amount/amount.dart'; import 'package:stackwallet/utilities/amount/amount.dart';

View file

@ -23,20 +23,33 @@ class LelantusCoin {
final String value; // can't use BigInt in isar :shrug: final String value; // can't use BigInt in isar :shrug:
final int index; @Index(
unique: true,
replace: false,
composite: [
CompositeIndex("walletId"),
],
)
final int mintIndex;
final int anonymitySetId; final int anonymitySetId;
final bool isUsed; final bool isUsed;
final bool isJMint;
final String? otherData;
LelantusCoin({ LelantusCoin({
required this.walletId, required this.walletId,
required this.publicCoin, required this.publicCoin,
required this.txid, required this.txid,
required this.value, required this.value,
required this.index, required this.mintIndex,
required this.anonymitySetId, required this.anonymitySetId,
required this.isUsed, required this.isUsed,
required this.isJMint,
required this.otherData,
}); });
LelantusCoin copyWith({ LelantusCoin copyWith({
@ -44,18 +57,22 @@ class LelantusCoin {
String? publicCoin, String? publicCoin,
String? txid, String? txid,
String? value, String? value,
int? index, int? mintIndex,
int? anonymitySetId, int? anonymitySetId,
bool? isUsed, bool? isUsed,
bool? isJMint,
String? otherData,
}) { }) {
return LelantusCoin( return LelantusCoin(
walletId: walletId ?? this.walletId, walletId: walletId ?? this.walletId,
publicCoin: publicCoin ?? this.publicCoin, publicCoin: publicCoin ?? this.publicCoin,
txid: txid ?? this.txid, txid: txid ?? this.txid,
value: value ?? this.value, value: value ?? this.value,
index: index ?? this.index, mintIndex: mintIndex ?? this.mintIndex,
anonymitySetId: anonymitySetId ?? this.anonymitySetId, anonymitySetId: anonymitySetId ?? this.anonymitySetId,
isUsed: isUsed ?? this.isUsed, isUsed: isUsed ?? this.isUsed,
isJMint: isJMint ?? this.isJMint,
otherData: otherData ?? this.otherData,
); );
} }
@ -67,8 +84,10 @@ class LelantusCoin {
'publicCoin: $publicCoin, ' 'publicCoin: $publicCoin, '
'txid: $txid, ' 'txid: $txid, '
'value: $value, ' 'value: $value, '
'index: $index, ' 'mintIndex: $mintIndex, '
'anonymitySetId: $anonymitySetId, ' 'anonymitySetId: $anonymitySetId, '
'otherData: $otherData, '
'isJMint: $isJMint, '
'isUsed: $isUsed' 'isUsed: $isUsed'
'}'; '}';
} }

View file

@ -22,33 +22,43 @@ const LelantusCoinSchema = CollectionSchema(
name: r'anonymitySetId', name: r'anonymitySetId',
type: IsarType.long, type: IsarType.long,
), ),
r'index': PropertySchema( r'isJMint': PropertySchema(
id: 1, id: 1,
name: r'index', name: r'isJMint',
type: IsarType.long, type: IsarType.bool,
), ),
r'isUsed': PropertySchema( r'isUsed': PropertySchema(
id: 2, id: 2,
name: r'isUsed', name: r'isUsed',
type: IsarType.bool, type: IsarType.bool,
), ),
r'publicCoin': PropertySchema( r'mintIndex': PropertySchema(
id: 3, id: 3,
name: r'mintIndex',
type: IsarType.long,
),
r'otherData': PropertySchema(
id: 4,
name: r'otherData',
type: IsarType.string,
),
r'publicCoin': PropertySchema(
id: 5,
name: r'publicCoin', name: r'publicCoin',
type: IsarType.string, type: IsarType.string,
), ),
r'txid': PropertySchema( r'txid': PropertySchema(
id: 4, id: 6,
name: r'txid', name: r'txid',
type: IsarType.string, type: IsarType.string,
), ),
r'value': PropertySchema( r'value': PropertySchema(
id: 5, id: 7,
name: r'value', name: r'value',
type: IsarType.string, type: IsarType.string,
), ),
r'walletId': PropertySchema( r'walletId': PropertySchema(
id: 6, id: 8,
name: r'walletId', name: r'walletId',
type: IsarType.string, type: IsarType.string,
) )
@ -94,6 +104,24 @@ const LelantusCoinSchema = CollectionSchema(
caseSensitive: true, caseSensitive: true,
) )
], ],
),
r'mintIndex_walletId': IndexSchema(
id: -9147309777276196770,
name: r'mintIndex_walletId',
unique: true,
replace: false,
properties: [
IndexPropertySchema(
name: r'mintIndex',
type: IndexType.value,
caseSensitive: false,
),
IndexPropertySchema(
name: r'walletId',
type: IndexType.hash,
caseSensitive: true,
)
],
) )
}, },
links: {}, links: {},
@ -110,6 +138,12 @@ int _lelantusCoinEstimateSize(
Map<Type, List<int>> allOffsets, Map<Type, List<int>> allOffsets,
) { ) {
var bytesCount = offsets.last; var bytesCount = offsets.last;
{
final value = object.otherData;
if (value != null) {
bytesCount += 3 + value.length * 3;
}
}
bytesCount += 3 + object.publicCoin.length * 3; bytesCount += 3 + object.publicCoin.length * 3;
bytesCount += 3 + object.txid.length * 3; bytesCount += 3 + object.txid.length * 3;
bytesCount += 3 + object.value.length * 3; bytesCount += 3 + object.value.length * 3;
@ -124,12 +158,14 @@ void _lelantusCoinSerialize(
Map<Type, List<int>> allOffsets, Map<Type, List<int>> allOffsets,
) { ) {
writer.writeLong(offsets[0], object.anonymitySetId); writer.writeLong(offsets[0], object.anonymitySetId);
writer.writeLong(offsets[1], object.index); writer.writeBool(offsets[1], object.isJMint);
writer.writeBool(offsets[2], object.isUsed); writer.writeBool(offsets[2], object.isUsed);
writer.writeString(offsets[3], object.publicCoin); writer.writeLong(offsets[3], object.mintIndex);
writer.writeString(offsets[4], object.txid); writer.writeString(offsets[4], object.otherData);
writer.writeString(offsets[5], object.value); writer.writeString(offsets[5], object.publicCoin);
writer.writeString(offsets[6], object.walletId); writer.writeString(offsets[6], object.txid);
writer.writeString(offsets[7], object.value);
writer.writeString(offsets[8], object.walletId);
} }
LelantusCoin _lelantusCoinDeserialize( LelantusCoin _lelantusCoinDeserialize(
@ -140,12 +176,14 @@ LelantusCoin _lelantusCoinDeserialize(
) { ) {
final object = LelantusCoin( final object = LelantusCoin(
anonymitySetId: reader.readLong(offsets[0]), anonymitySetId: reader.readLong(offsets[0]),
index: reader.readLong(offsets[1]), isJMint: reader.readBool(offsets[1]),
isUsed: reader.readBool(offsets[2]), isUsed: reader.readBool(offsets[2]),
publicCoin: reader.readString(offsets[3]), mintIndex: reader.readLong(offsets[3]),
txid: reader.readString(offsets[4]), otherData: reader.readStringOrNull(offsets[4]),
value: reader.readString(offsets[5]), publicCoin: reader.readString(offsets[5]),
walletId: reader.readString(offsets[6]), txid: reader.readString(offsets[6]),
value: reader.readString(offsets[7]),
walletId: reader.readString(offsets[8]),
); );
object.id = id; object.id = id;
return object; return object;
@ -161,17 +199,21 @@ P _lelantusCoinDeserializeProp<P>(
case 0: case 0:
return (reader.readLong(offset)) as P; return (reader.readLong(offset)) as P;
case 1: case 1:
return (reader.readLong(offset)) as P; return (reader.readBool(offset)) as P;
case 2: case 2:
return (reader.readBool(offset)) as P; return (reader.readBool(offset)) as P;
case 3: case 3:
return (reader.readString(offset)) as P; return (reader.readLong(offset)) as P;
case 4: case 4:
return (reader.readString(offset)) as P; return (reader.readStringOrNull(offset)) as P;
case 5: case 5:
return (reader.readString(offset)) as P; return (reader.readString(offset)) as P;
case 6: case 6:
return (reader.readString(offset)) as P; return (reader.readString(offset)) as P;
case 7:
return (reader.readString(offset)) as P;
case 8:
return (reader.readString(offset)) as P;
default: default:
throw IsarError('Unknown property with id $propertyId'); throw IsarError('Unknown property with id $propertyId');
} }
@ -290,6 +332,92 @@ extension LelantusCoinByIndex on IsarCollection<LelantusCoin> {
return putAllByIndexSync(r'publicCoin_walletId_txid', objects, return putAllByIndexSync(r'publicCoin_walletId_txid', objects,
saveLinks: saveLinks); saveLinks: saveLinks);
} }
Future<LelantusCoin?> getByMintIndexWalletId(int mintIndex, String walletId) {
return getByIndex(r'mintIndex_walletId', [mintIndex, walletId]);
}
LelantusCoin? getByMintIndexWalletIdSync(int mintIndex, String walletId) {
return getByIndexSync(r'mintIndex_walletId', [mintIndex, walletId]);
}
Future<bool> deleteByMintIndexWalletId(int mintIndex, String walletId) {
return deleteByIndex(r'mintIndex_walletId', [mintIndex, walletId]);
}
bool deleteByMintIndexWalletIdSync(int mintIndex, String walletId) {
return deleteByIndexSync(r'mintIndex_walletId', [mintIndex, walletId]);
}
Future<List<LelantusCoin?>> getAllByMintIndexWalletId(
List<int> mintIndexValues, List<String> walletIdValues) {
final len = mintIndexValues.length;
assert(walletIdValues.length == len,
'All index values must have the same length');
final values = <List<dynamic>>[];
for (var i = 0; i < len; i++) {
values.add([mintIndexValues[i], walletIdValues[i]]);
}
return getAllByIndex(r'mintIndex_walletId', values);
}
List<LelantusCoin?> getAllByMintIndexWalletIdSync(
List<int> mintIndexValues, List<String> walletIdValues) {
final len = mintIndexValues.length;
assert(walletIdValues.length == len,
'All index values must have the same length');
final values = <List<dynamic>>[];
for (var i = 0; i < len; i++) {
values.add([mintIndexValues[i], walletIdValues[i]]);
}
return getAllByIndexSync(r'mintIndex_walletId', values);
}
Future<int> deleteAllByMintIndexWalletId(
List<int> mintIndexValues, List<String> walletIdValues) {
final len = mintIndexValues.length;
assert(walletIdValues.length == len,
'All index values must have the same length');
final values = <List<dynamic>>[];
for (var i = 0; i < len; i++) {
values.add([mintIndexValues[i], walletIdValues[i]]);
}
return deleteAllByIndex(r'mintIndex_walletId', values);
}
int deleteAllByMintIndexWalletIdSync(
List<int> mintIndexValues, List<String> walletIdValues) {
final len = mintIndexValues.length;
assert(walletIdValues.length == len,
'All index values must have the same length');
final values = <List<dynamic>>[];
for (var i = 0; i < len; i++) {
values.add([mintIndexValues[i], walletIdValues[i]]);
}
return deleteAllByIndexSync(r'mintIndex_walletId', values);
}
Future<Id> putByMintIndexWalletId(LelantusCoin object) {
return putByIndex(r'mintIndex_walletId', object);
}
Id putByMintIndexWalletIdSync(LelantusCoin object, {bool saveLinks = true}) {
return putByIndexSync(r'mintIndex_walletId', object, saveLinks: saveLinks);
}
Future<List<Id>> putAllByMintIndexWalletId(List<LelantusCoin> objects) {
return putAllByIndex(r'mintIndex_walletId', objects);
}
List<Id> putAllByMintIndexWalletIdSync(List<LelantusCoin> objects,
{bool saveLinks = true}) {
return putAllByIndexSync(r'mintIndex_walletId', objects,
saveLinks: saveLinks);
}
} }
extension LelantusCoinQueryWhereSort extension LelantusCoinQueryWhereSort
@ -552,6 +680,144 @@ extension LelantusCoinQueryWhere
} }
}); });
} }
QueryBuilder<LelantusCoin, LelantusCoin, QAfterWhereClause>
mintIndexEqualToAnyWalletId(int mintIndex) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(IndexWhereClause.equalTo(
indexName: r'mintIndex_walletId',
value: [mintIndex],
));
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterWhereClause>
mintIndexNotEqualToAnyWalletId(int mintIndex) {
return QueryBuilder.apply(this, (query) {
if (query.whereSort == Sort.asc) {
return query
.addWhereClause(IndexWhereClause.between(
indexName: r'mintIndex_walletId',
lower: [],
upper: [mintIndex],
includeUpper: false,
))
.addWhereClause(IndexWhereClause.between(
indexName: r'mintIndex_walletId',
lower: [mintIndex],
includeLower: false,
upper: [],
));
} else {
return query
.addWhereClause(IndexWhereClause.between(
indexName: r'mintIndex_walletId',
lower: [mintIndex],
includeLower: false,
upper: [],
))
.addWhereClause(IndexWhereClause.between(
indexName: r'mintIndex_walletId',
lower: [],
upper: [mintIndex],
includeUpper: false,
));
}
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterWhereClause>
mintIndexGreaterThanAnyWalletId(
int mintIndex, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(IndexWhereClause.between(
indexName: r'mintIndex_walletId',
lower: [mintIndex],
includeLower: include,
upper: [],
));
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterWhereClause>
mintIndexLessThanAnyWalletId(
int mintIndex, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(IndexWhereClause.between(
indexName: r'mintIndex_walletId',
lower: [],
upper: [mintIndex],
includeUpper: include,
));
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterWhereClause>
mintIndexBetweenAnyWalletId(
int lowerMintIndex,
int upperMintIndex, {
bool includeLower = true,
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(IndexWhereClause.between(
indexName: r'mintIndex_walletId',
lower: [lowerMintIndex],
includeLower: includeLower,
upper: [upperMintIndex],
includeUpper: includeUpper,
));
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterWhereClause>
mintIndexWalletIdEqualTo(int mintIndex, String walletId) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(IndexWhereClause.equalTo(
indexName: r'mintIndex_walletId',
value: [mintIndex, walletId],
));
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterWhereClause>
mintIndexEqualToWalletIdNotEqualTo(int mintIndex, String walletId) {
return QueryBuilder.apply(this, (query) {
if (query.whereSort == Sort.asc) {
return query
.addWhereClause(IndexWhereClause.between(
indexName: r'mintIndex_walletId',
lower: [mintIndex],
upper: [mintIndex, walletId],
includeUpper: false,
))
.addWhereClause(IndexWhereClause.between(
indexName: r'mintIndex_walletId',
lower: [mintIndex, walletId],
includeLower: false,
upper: [mintIndex],
));
} else {
return query
.addWhereClause(IndexWhereClause.between(
indexName: r'mintIndex_walletId',
lower: [mintIndex, walletId],
includeLower: false,
upper: [mintIndex],
))
.addWhereClause(IndexWhereClause.between(
indexName: r'mintIndex_walletId',
lower: [mintIndex],
upper: [mintIndex, walletId],
includeUpper: false,
));
}
});
}
} }
extension LelantusCoinQueryFilter extension LelantusCoinQueryFilter
@ -665,60 +931,16 @@ extension LelantusCoinQueryFilter
}); });
} }
QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition> indexEqualTo( QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition>
int value) { isJMintEqualTo(bool value) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo( return query.addFilterCondition(FilterCondition.equalTo(
property: r'index', property: r'isJMint',
value: value, value: value,
)); ));
}); });
} }
QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition>
indexGreaterThan(
int value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'index',
value: value,
));
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition> indexLessThan(
int value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'index',
value: value,
));
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition> indexBetween(
int lower,
int upper, {
bool includeLower = true,
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'index',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition> isUsedEqualTo( QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition> isUsedEqualTo(
bool value) { bool value) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -729,6 +951,216 @@ extension LelantusCoinQueryFilter
}); });
} }
QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition>
mintIndexEqualTo(int value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'mintIndex',
value: value,
));
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition>
mintIndexGreaterThan(
int value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'mintIndex',
value: value,
));
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition>
mintIndexLessThan(
int value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'mintIndex',
value: value,
));
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition>
mintIndexBetween(
int lower,
int upper, {
bool includeLower = true,
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'mintIndex',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition>
otherDataIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'otherData',
));
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition>
otherDataIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'otherData',
));
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition>
otherDataEqualTo(
String? value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'otherData',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition>
otherDataGreaterThan(
String? value, {
bool include = false,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'otherData',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition>
otherDataLessThan(
String? value, {
bool include = false,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'otherData',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition>
otherDataBetween(
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'otherData',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition>
otherDataStartsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.startsWith(
property: r'otherData',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition>
otherDataEndsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.endsWith(
property: r'otherData',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition>
otherDataContains(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.contains(
property: r'otherData',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition>
otherDataMatches(String pattern, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.matches(
property: r'otherData',
wildcard: pattern,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition>
otherDataIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'otherData',
value: '',
));
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition>
otherDataIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
property: r'otherData',
value: '',
));
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition> QueryBuilder<LelantusCoin, LelantusCoin, QAfterFilterCondition>
publicCoinEqualTo( publicCoinEqualTo(
String value, { String value, {
@ -1292,15 +1724,15 @@ extension LelantusCoinQuerySortBy
}); });
} }
QueryBuilder<LelantusCoin, LelantusCoin, QAfterSortBy> sortByIndex() { QueryBuilder<LelantusCoin, LelantusCoin, QAfterSortBy> sortByIsJMint() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'index', Sort.asc); return query.addSortBy(r'isJMint', Sort.asc);
}); });
} }
QueryBuilder<LelantusCoin, LelantusCoin, QAfterSortBy> sortByIndexDesc() { QueryBuilder<LelantusCoin, LelantusCoin, QAfterSortBy> sortByIsJMintDesc() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'index', Sort.desc); return query.addSortBy(r'isJMint', Sort.desc);
}); });
} }
@ -1316,6 +1748,30 @@ extension LelantusCoinQuerySortBy
}); });
} }
QueryBuilder<LelantusCoin, LelantusCoin, QAfterSortBy> sortByMintIndex() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'mintIndex', Sort.asc);
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterSortBy> sortByMintIndexDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'mintIndex', Sort.desc);
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterSortBy> sortByOtherData() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'otherData', Sort.asc);
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterSortBy> sortByOtherDataDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'otherData', Sort.desc);
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterSortBy> sortByPublicCoin() { QueryBuilder<LelantusCoin, LelantusCoin, QAfterSortBy> sortByPublicCoin() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'publicCoin', Sort.asc); return query.addSortBy(r'publicCoin', Sort.asc);
@ -1394,15 +1850,15 @@ extension LelantusCoinQuerySortThenBy
}); });
} }
QueryBuilder<LelantusCoin, LelantusCoin, QAfterSortBy> thenByIndex() { QueryBuilder<LelantusCoin, LelantusCoin, QAfterSortBy> thenByIsJMint() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'index', Sort.asc); return query.addSortBy(r'isJMint', Sort.asc);
}); });
} }
QueryBuilder<LelantusCoin, LelantusCoin, QAfterSortBy> thenByIndexDesc() { QueryBuilder<LelantusCoin, LelantusCoin, QAfterSortBy> thenByIsJMintDesc() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'index', Sort.desc); return query.addSortBy(r'isJMint', Sort.desc);
}); });
} }
@ -1418,6 +1874,30 @@ extension LelantusCoinQuerySortThenBy
}); });
} }
QueryBuilder<LelantusCoin, LelantusCoin, QAfterSortBy> thenByMintIndex() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'mintIndex', Sort.asc);
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterSortBy> thenByMintIndexDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'mintIndex', Sort.desc);
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterSortBy> thenByOtherData() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'otherData', Sort.asc);
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterSortBy> thenByOtherDataDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'otherData', Sort.desc);
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QAfterSortBy> thenByPublicCoin() { QueryBuilder<LelantusCoin, LelantusCoin, QAfterSortBy> thenByPublicCoin() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'publicCoin', Sort.asc); return query.addSortBy(r'publicCoin', Sort.asc);
@ -1477,9 +1957,9 @@ extension LelantusCoinQueryWhereDistinct
}); });
} }
QueryBuilder<LelantusCoin, LelantusCoin, QDistinct> distinctByIndex() { QueryBuilder<LelantusCoin, LelantusCoin, QDistinct> distinctByIsJMint() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'index'); return query.addDistinctBy(r'isJMint');
}); });
} }
@ -1489,6 +1969,19 @@ extension LelantusCoinQueryWhereDistinct
}); });
} }
QueryBuilder<LelantusCoin, LelantusCoin, QDistinct> distinctByMintIndex() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'mintIndex');
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QDistinct> distinctByOtherData(
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'otherData', caseSensitive: caseSensitive);
});
}
QueryBuilder<LelantusCoin, LelantusCoin, QDistinct> distinctByPublicCoin( QueryBuilder<LelantusCoin, LelantusCoin, QDistinct> distinctByPublicCoin(
{bool caseSensitive = true}) { {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -1532,9 +2025,9 @@ extension LelantusCoinQueryProperty
}); });
} }
QueryBuilder<LelantusCoin, int, QQueryOperations> indexProperty() { QueryBuilder<LelantusCoin, bool, QQueryOperations> isJMintProperty() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'index'); return query.addPropertyName(r'isJMint');
}); });
} }
@ -1544,6 +2037,18 @@ extension LelantusCoinQueryProperty
}); });
} }
QueryBuilder<LelantusCoin, int, QQueryOperations> mintIndexProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'mintIndex');
});
}
QueryBuilder<LelantusCoin, String?, QQueryOperations> otherDataProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'otherData');
});
}
QueryBuilder<LelantusCoin, String, QQueryOperations> publicCoinProperty() { QueryBuilder<LelantusCoin, String, QQueryOperations> publicCoinProperty() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'publicCoin'); return query.addPropertyName(r'publicCoin');

View file

@ -269,18 +269,20 @@ Future<Map<String, dynamic>> isolateRestore(
lelantusCoins.removeWhere((e) => lelantusCoins.removeWhere((e) =>
e.txid == txId && e.txid == txId &&
e.index == currentIndex && e.mintIndex == currentIndex &&
e.anonymitySetId != setId); e.anonymitySetId != setId);
lelantusCoins.add( lelantusCoins.add(
isar_models.LelantusCoin( isar_models.LelantusCoin(
walletId: walletId, walletId: walletId,
index: currentIndex, mintIndex: currentIndex,
value: amount.toString(), value: amount.toString(),
publicCoin: publicCoin, publicCoin: publicCoin,
txid: txId, txid: txId,
anonymitySetId: setId, anonymitySetId: setId,
isUsed: isUsed, isUsed: isUsed,
isJMint: false,
otherData: null,
), ),
); );
Logging.instance.log( Logging.instance.log(
@ -317,18 +319,20 @@ Future<Map<String, dynamic>> isolateRestore(
bool isUsed = usedSerialNumbersSet.contains(serialNumber); bool isUsed = usedSerialNumbersSet.contains(serialNumber);
lelantusCoins.removeWhere((e) => lelantusCoins.removeWhere((e) =>
e.txid == txId && e.txid == txId &&
e.index == currentIndex && e.mintIndex == currentIndex &&
e.anonymitySetId != setId); e.anonymitySetId != setId);
lelantusCoins.add( lelantusCoins.add(
isar_models.LelantusCoin( isar_models.LelantusCoin(
walletId: walletId, walletId: walletId,
index: currentIndex, mintIndex: currentIndex,
value: amount.toString(), value: amount.toString(),
publicCoin: publicCoin, publicCoin: publicCoin,
txid: txId, txid: txId,
anonymitySetId: setId, anonymitySetId: setId,
isUsed: isUsed, isUsed: isUsed,
isJMint: true,
otherData: null,
), ),
); );
jindexes.add(currentIndex); jindexes.add(currentIndex);
@ -2325,7 +2329,7 @@ class FiroWallet extends CoinServiceAPI
final derivePath = constructDerivePath( final derivePath = constructDerivePath(
networkWIF: _network.wif, networkWIF: _network.wif,
chain: MINT_INDEX, chain: MINT_INDEX,
index: coin.index, index: coin.mintIndex,
); );
final keyPair = await Bip32Utils.getBip32NodeFromRoot(root, derivePath); final keyPair = await Bip32Utils.getBip32NodeFromRoot(root, derivePath);
@ -2335,7 +2339,7 @@ class FiroWallet extends CoinServiceAPI
} }
final String privateKey = Format.uint8listToString(keyPair.privateKey!); final String privateKey = Format.uint8listToString(keyPair.privateKey!);
return DartLelantusEntry(coin.isUsed ? 1 : 0, 0, coin.anonymitySetId, return DartLelantusEntry(coin.isUsed ? 1 : 0, 0, coin.anonymitySetId,
int.parse(coin.value), coin.index, privateKey); int.parse(coin.value), coin.mintIndex, privateKey);
}).toList(); }).toList();
final lelantusEntries = await Future.wait(waitLelantusEntries); final lelantusEntries = await Future.wait(waitLelantusEntries);
@ -3054,12 +3058,14 @@ class FiroWallet extends CoinServiceAPI
// if a jmint was made add it to the unspent coin index // if a jmint was made add it to the unspent coin index
final jmint = isar_models.LelantusCoin( final jmint = isar_models.LelantusCoin(
walletId: walletId, walletId: walletId,
index: index, mintIndex: nextFreeMintIndex,
value: (transactionInfo['jmintValue'] as int? ?? 0).toString(), value: (transactionInfo['jmintValue'] as int? ?? 0).toString(),
publicCoin: transactionInfo['publicCoin'] as String, publicCoin: transactionInfo['publicCoin'] as String,
txid: transactionInfo['txid'] as String, txid: transactionInfo['txid'] as String,
anonymitySetId: latestSetId, anonymitySetId: latestSetId,
isUsed: false, isUsed: false,
isJMint: true,
otherData: null,
); );
if (int.parse(jmint.value) > 0) { if (int.parse(jmint.value) > 0) {
updatedCoins.add(jmint); updatedCoins.add(jmint);
@ -3143,12 +3149,14 @@ class FiroWallet extends CoinServiceAPI
final index = mintMap['index'] as int; final index = mintMap['index'] as int;
final mint = isar_models.LelantusCoin( final mint = isar_models.LelantusCoin(
walletId: walletId, walletId: walletId,
index: index, mintIndex: index,
value: (mintMap['value'] as int).toString(), value: (mintMap['value'] as int).toString(),
publicCoin: mintMap['publicCoin'] as String, publicCoin: mintMap['publicCoin'] as String,
txid: transactionInfo['txid'] as String, txid: transactionInfo['txid'] as String,
anonymitySetId: latestSetId, anonymitySetId: latestSetId,
isUsed: false, isUsed: false,
isJMint: false,
otherData: null,
); );
if (int.parse(mint.value) > 0) { if (int.parse(mint.value) > 0) {
updatedCoins.add(mint); updatedCoins.add(mint);

View file

@ -386,19 +386,28 @@ class DbVersionMigrator with WalletDB {
) as List? ?? ) as List? ??
[]; [];
final jindexes = (DB.instance
.get<dynamic>(boxName: walletId, key: "jindex") as List? ??
[])
.cast<int>();
final List<isar_models.LelantusCoin> coins = []; final List<isar_models.LelantusCoin> coins = [];
for (final e in hiveLCoins) { for (final e in hiveLCoins) {
final map = e as Map; final map = e as Map;
final lcoin = map.values.first as LelantusCoin; final lcoin = map.values.first as LelantusCoin;
final isJMint = jindexes.contains(lcoin.index);
final coin = isar_models.LelantusCoin( final coin = isar_models.LelantusCoin(
walletId: walletId, walletId: walletId,
publicCoin: lcoin.publicCoin, publicCoin: lcoin.publicCoin,
txid: lcoin.txId, txid: lcoin.txId,
value: lcoin.value.toString(), value: lcoin.value.toString(),
index: lcoin.index, mintIndex: lcoin.index,
anonymitySetId: lcoin.anonymitySetId, anonymitySetId: lcoin.anonymitySetId,
isUsed: lcoin.isUsed, isUsed: lcoin.isUsed,
isJMint: isJMint,
otherData: null,
); );
coins.add(coin); coins.add(coin);

View file

@ -14,7 +14,6 @@ import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i5;
import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i4; import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i4;
import 'package:stackwallet/models/balance.dart' as _i6; import 'package:stackwallet/models/balance.dart' as _i6;
import 'package:stackwallet/models/isar/models/isar_models.dart' as _i13; import 'package:stackwallet/models/isar/models/isar_models.dart' as _i13;
import 'package:stackwallet/models/lelantus_coin.dart' as _i15;
import 'package:stackwallet/models/paymint/fee_object_model.dart' as _i3; import 'package:stackwallet/models/paymint/fee_object_model.dart' as _i3;
import 'package:stackwallet/models/signing_data.dart' as _i14; import 'package:stackwallet/models/signing_data.dart' as _i14;
import 'package:stackwallet/services/coins/firo/firo_wallet.dart' as _i10; import 'package:stackwallet/services/coins/firo/firo_wallet.dart' as _i10;
@ -589,15 +588,6 @@ class MockFiroWallet extends _i1.Mock implements _i10.FiroWallet {
returnValueForMissingStub: _i11.Future<void>.value(), returnValueForMissingStub: _i11.Future<void>.value(),
) as _i11.Future<void>); ) as _i11.Future<void>);
@override @override
List<Map<dynamic, _i15.LelantusCoin>> getLelantusCoinMap() =>
(super.noSuchMethod(
Invocation.method(
#getLelantusCoinMap,
[],
),
returnValue: <Map<dynamic, _i15.LelantusCoin>>[],
) as List<Map<dynamic, _i15.LelantusCoin>>);
@override
_i11.Future<void> anonymizeAllPublicFunds() => (super.noSuchMethod( _i11.Future<void> anonymizeAllPublicFunds() => (super.noSuchMethod(
Invocation.method( Invocation.method(
#anonymizeAllPublicFunds, #anonymizeAllPublicFunds,
@ -1061,51 +1051,6 @@ class MockFiroWallet extends _i1.Mock implements _i10.FiroWallet {
), ),
returnValueForMissingStub: null, returnValueForMissingStub: null,
); );
@override
void initFiroHive(String? walletId) => super.noSuchMethod(
Invocation.method(
#initFiroHive,
[walletId],
),
returnValueForMissingStub: null,
);
@override
_i11.Future<void> firoUpdateJIndex(List<dynamic>? jIndex) =>
(super.noSuchMethod(
Invocation.method(
#firoUpdateJIndex,
[jIndex],
),
returnValue: _i11.Future<void>.value(),
returnValueForMissingStub: _i11.Future<void>.value(),
) as _i11.Future<void>);
@override
_i11.Future<void> firoUpdateLelantusCoins(List<dynamic>? lelantusCoins) =>
(super.noSuchMethod(
Invocation.method(
#firoUpdateLelantusCoins,
[lelantusCoins],
),
returnValue: _i11.Future<void>.value(),
returnValueForMissingStub: _i11.Future<void>.value(),
) as _i11.Future<void>);
@override
int firoGetMintIndex() => (super.noSuchMethod(
Invocation.method(
#firoGetMintIndex,
[],
),
returnValue: 0,
) as int);
@override
_i11.Future<void> firoUpdateMintIndex(int? mintIndex) => (super.noSuchMethod(
Invocation.method(
#firoUpdateMintIndex,
[mintIndex],
),
returnValue: _i11.Future<void>.value(),
returnValueForMissingStub: _i11.Future<void>.value(),
) as _i11.Future<void>);
} }
/// A class which mocks [ElectrumX]. /// A class which mocks [ElectrumX].

View file

@ -1602,15 +1602,6 @@ class MockFiroWallet extends _i1.Mock implements _i23.FiroWallet {
returnValueForMissingStub: _i19.Future<void>.value(), returnValueForMissingStub: _i19.Future<void>.value(),
) as _i19.Future<void>); ) as _i19.Future<void>);
@override @override
List<Map<dynamic, _i8.LelantusCoin>> getLelantusCoinMap() =>
(super.noSuchMethod(
Invocation.method(
#getLelantusCoinMap,
[],
),
returnValue: <Map<dynamic, _i8.LelantusCoin>>[],
) as List<Map<dynamic, _i8.LelantusCoin>>);
@override
_i19.Future<void> anonymizeAllPublicFunds() => (super.noSuchMethod( _i19.Future<void> anonymizeAllPublicFunds() => (super.noSuchMethod(
Invocation.method( Invocation.method(
#anonymizeAllPublicFunds, #anonymizeAllPublicFunds,
@ -2075,51 +2066,6 @@ class MockFiroWallet extends _i1.Mock implements _i23.FiroWallet {
), ),
returnValueForMissingStub: null, returnValueForMissingStub: null,
); );
@override
void initFiroHive(String? walletId) => super.noSuchMethod(
Invocation.method(
#initFiroHive,
[walletId],
),
returnValueForMissingStub: null,
);
@override
_i19.Future<void> firoUpdateJIndex(List<dynamic>? jIndex) =>
(super.noSuchMethod(
Invocation.method(
#firoUpdateJIndex,
[jIndex],
),
returnValue: _i19.Future<void>.value(),
returnValueForMissingStub: _i19.Future<void>.value(),
) as _i19.Future<void>);
@override
_i19.Future<void> firoUpdateLelantusCoins(List<dynamic>? lelantusCoins) =>
(super.noSuchMethod(
Invocation.method(
#firoUpdateLelantusCoins,
[lelantusCoins],
),
returnValue: _i19.Future<void>.value(),
returnValueForMissingStub: _i19.Future<void>.value(),
) as _i19.Future<void>);
@override
int firoGetMintIndex() => (super.noSuchMethod(
Invocation.method(
#firoGetMintIndex,
[],
),
returnValue: 0,
) as int);
@override
_i19.Future<void> firoUpdateMintIndex(int? mintIndex) => (super.noSuchMethod(
Invocation.method(
#firoUpdateMintIndex,
[mintIndex],
),
returnValue: _i19.Future<void>.value(),
returnValueForMissingStub: _i19.Future<void>.value(),
) as _i19.Future<void>);
} }
/// A class which mocks [LocaleService]. /// A class which mocks [LocaleService].