mirror of
https://github.com/cypherstack/stack_wallet.git
synced 2024-12-23 03:49:22 +00:00
Merge remote-tracking branch 'origin/wallets_refactor' into namecoin
This commit is contained in:
commit
5fdcb522ca
17 changed files with 2086 additions and 3005 deletions
|
@ -8,6 +8,7 @@ import 'package:stackwallet/models/isar/models/transaction_note.dart';
|
|||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart';
|
||||
import 'package:stackwallet/wallets/isar/models/wallet_info.dart';
|
||||
import 'package:stackwallet/wallets/isar/models/wallet_info_meta.dart';
|
||||
import 'package:stackwallet/wallets/wallet/supporting/epiccash_wallet_info_extension.dart';
|
||||
|
||||
Future<void> migrateWalletsToIsar({
|
||||
|
@ -47,7 +48,7 @@ Future<void> migrateWalletsToIsar({
|
|||
final List<String> favourites =
|
||||
(await Hive.openBox<String>(DB.boxNameFavoriteWallets)).values.toList();
|
||||
|
||||
final List<WalletInfo> newInfo = [];
|
||||
final List<(WalletInfo, WalletInfoMeta)> newInfo = [];
|
||||
final List<TransactionNote> migratedNotes = [];
|
||||
|
||||
//
|
||||
|
@ -113,15 +114,19 @@ Future<void> migrateWalletsToIsar({
|
|||
//
|
||||
otherData.removeWhere((key, value) => value == null);
|
||||
|
||||
final infoMeta = WalletInfoMeta(
|
||||
walletId: old.walletId,
|
||||
isMnemonicVerified: allWalletsBox
|
||||
.get("${old.walletId}_mnemonicHasBeenVerified") as bool? ??
|
||||
false,
|
||||
);
|
||||
|
||||
final info = WalletInfo(
|
||||
coinName: old.coin.name,
|
||||
walletId: old.walletId,
|
||||
name: old.name,
|
||||
mainAddressType: old.coin.primaryAddressType,
|
||||
favouriteOrderIndex: favourites.indexOf(old.walletId),
|
||||
isMnemonicVerified: allWalletsBox
|
||||
.get("${old.walletId}_mnemonicHasBeenVerified") as bool? ??
|
||||
false,
|
||||
cachedChainHeight: walletBox.get(
|
||||
DBKeys.storedChainHeight,
|
||||
) as int? ??
|
||||
|
@ -135,7 +140,7 @@ Future<void> migrateWalletsToIsar({
|
|||
otherDataJsonString: jsonEncode(otherData),
|
||||
);
|
||||
|
||||
newInfo.add(info);
|
||||
newInfo.add((info, infoMeta));
|
||||
}
|
||||
|
||||
if (migratedNotes.isNotEmpty) {
|
||||
|
@ -145,10 +150,14 @@ Future<void> migrateWalletsToIsar({
|
|||
}
|
||||
|
||||
await MainDB.instance.isar.writeTxn(() async {
|
||||
await MainDB.instance.isar.walletInfo.putAll(newInfo);
|
||||
await MainDB.instance.isar.walletInfo
|
||||
.putAll(newInfo.map((e) => e.$1).toList());
|
||||
await MainDB.instance.isar.walletInfoMeta
|
||||
.putAll(newInfo.map((e) => e.$2).toList());
|
||||
});
|
||||
|
||||
await _cleanupOnSuccess(walletIds: newInfo.map((e) => e.walletId).toList());
|
||||
await _cleanupOnSuccess(
|
||||
walletIds: newInfo.map((e) => e.$1.walletId).toList());
|
||||
}
|
||||
|
||||
Future<void> _cleanupOnSuccess({required List<String> walletIds}) async {
|
||||
|
|
|
@ -57,6 +57,14 @@ class TransactionV2 {
|
|||
required this.otherData,
|
||||
});
|
||||
|
||||
bool get isEpiccashTransaction =>
|
||||
_getFromOtherData(key: "isEpiccashTransaction") == true;
|
||||
int? get numberOfMessages =>
|
||||
_getFromOtherData(key: "numberOfMessages") as int?;
|
||||
String? get slateId => _getFromOtherData(key: "slateId") as String?;
|
||||
String? get onChainNote => _getFromOtherData(key: "onChainNote") as String?;
|
||||
bool get isCancelled => _getFromOtherData(key: "isCancelled") == true;
|
||||
|
||||
int getConfirmations(int currentChainHeight) {
|
||||
if (height == null || height! <= 0) return 0;
|
||||
return max(0, currentChainHeight - (height! - 1));
|
||||
|
@ -146,35 +154,39 @@ class TransactionV2 {
|
|||
}
|
||||
}
|
||||
|
||||
// if (coin == Coin.epicCash) {
|
||||
// if (_transaction.isCancelled) {
|
||||
// return "Cancelled";
|
||||
// } else if (type == TransactionType.incoming) {
|
||||
// if (isConfirmed(height, minConfirms)) {
|
||||
// return "Received";
|
||||
// } else {
|
||||
// if (_transaction.numberOfMessages == 1) {
|
||||
// return "Receiving (waiting for sender)";
|
||||
// } else if ((_transaction.numberOfMessages ?? 0) > 1) {
|
||||
// return "Receiving (waiting for confirmations)"; // TODO test if the sender still has to open again after the receiver has 2 messages present, ie. sender->receiver->sender->node (yes) vs. sender->receiver->node (no)
|
||||
// } else {
|
||||
// return "Receiving";
|
||||
// }
|
||||
// }
|
||||
// } else if (type == TransactionType.outgoing) {
|
||||
// if (isConfirmed(height, minConfirms)) {
|
||||
// return "Sent (confirmed)";
|
||||
// } else {
|
||||
// if (_transaction.numberOfMessages == 1) {
|
||||
// return "Sending (waiting for receiver)";
|
||||
// } else if ((_transaction.numberOfMessages ?? 0) > 1) {
|
||||
// return "Sending (waiting for confirmations)";
|
||||
// } else {
|
||||
// return "Sending";
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
if (isEpiccashTransaction) {
|
||||
if (slateId == null) {
|
||||
return "Restored Funds";
|
||||
}
|
||||
|
||||
if (isCancelled) {
|
||||
return "Cancelled";
|
||||
} else if (type == TransactionType.incoming) {
|
||||
if (isConfirmed(currentChainHeight, minConfirms)) {
|
||||
return "Received";
|
||||
} else {
|
||||
if (numberOfMessages == 1) {
|
||||
return "Receiving (waiting for sender)";
|
||||
} else if ((numberOfMessages ?? 0) > 1) {
|
||||
return "Receiving (waiting for confirmations)"; // TODO test if the sender still has to open again after the receiver has 2 messages present, ie. sender->receiver->sender->node (yes) vs. sender->receiver->node (no)
|
||||
} else {
|
||||
return "Receiving";
|
||||
}
|
||||
}
|
||||
} else if (type == TransactionType.outgoing) {
|
||||
if (isConfirmed(currentChainHeight, minConfirms)) {
|
||||
return "Sent (confirmed)";
|
||||
} else {
|
||||
if (numberOfMessages == 1) {
|
||||
return "Sending (waiting for receiver)";
|
||||
} else if ((numberOfMessages ?? 0) > 1) {
|
||||
return "Sending (waiting for confirmations)";
|
||||
} else {
|
||||
return "Sending";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (type == TransactionType.incoming) {
|
||||
// if (_transaction.isMinting) {
|
||||
|
@ -198,6 +210,14 @@ class TransactionV2 {
|
|||
}
|
||||
}
|
||||
|
||||
dynamic _getFromOtherData({required dynamic key}) {
|
||||
if (otherData == null) {
|
||||
return null;
|
||||
}
|
||||
final map = jsonDecode(otherData!);
|
||||
return map[key];
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'TransactionV2(\n'
|
||||
|
|
|
@ -38,46 +38,71 @@ const TransactionV2Schema = CollectionSchema(
|
|||
type: IsarType.objectList,
|
||||
target: r'InputV2',
|
||||
),
|
||||
r'otherData': PropertySchema(
|
||||
r'isCancelled': PropertySchema(
|
||||
id: 4,
|
||||
name: r'isCancelled',
|
||||
type: IsarType.bool,
|
||||
),
|
||||
r'isEpiccashTransaction': PropertySchema(
|
||||
id: 5,
|
||||
name: r'isEpiccashTransaction',
|
||||
type: IsarType.bool,
|
||||
),
|
||||
r'numberOfMessages': PropertySchema(
|
||||
id: 6,
|
||||
name: r'numberOfMessages',
|
||||
type: IsarType.long,
|
||||
),
|
||||
r'onChainNote': PropertySchema(
|
||||
id: 7,
|
||||
name: r'onChainNote',
|
||||
type: IsarType.string,
|
||||
),
|
||||
r'otherData': PropertySchema(
|
||||
id: 8,
|
||||
name: r'otherData',
|
||||
type: IsarType.string,
|
||||
),
|
||||
r'outputs': PropertySchema(
|
||||
id: 5,
|
||||
id: 9,
|
||||
name: r'outputs',
|
||||
type: IsarType.objectList,
|
||||
target: r'OutputV2',
|
||||
),
|
||||
r'slateId': PropertySchema(
|
||||
id: 10,
|
||||
name: r'slateId',
|
||||
type: IsarType.string,
|
||||
),
|
||||
r'subType': PropertySchema(
|
||||
id: 6,
|
||||
id: 11,
|
||||
name: r'subType',
|
||||
type: IsarType.byte,
|
||||
enumMap: _TransactionV2subTypeEnumValueMap,
|
||||
),
|
||||
r'timestamp': PropertySchema(
|
||||
id: 7,
|
||||
id: 12,
|
||||
name: r'timestamp',
|
||||
type: IsarType.long,
|
||||
),
|
||||
r'txid': PropertySchema(
|
||||
id: 8,
|
||||
id: 13,
|
||||
name: r'txid',
|
||||
type: IsarType.string,
|
||||
),
|
||||
r'type': PropertySchema(
|
||||
id: 9,
|
||||
id: 14,
|
||||
name: r'type',
|
||||
type: IsarType.byte,
|
||||
enumMap: _TransactionV2typeEnumValueMap,
|
||||
),
|
||||
r'version': PropertySchema(
|
||||
id: 10,
|
||||
id: 15,
|
||||
name: r'version',
|
||||
type: IsarType.long,
|
||||
),
|
||||
r'walletId': PropertySchema(
|
||||
id: 11,
|
||||
id: 16,
|
||||
name: r'walletId',
|
||||
type: IsarType.string,
|
||||
)
|
||||
|
@ -166,6 +191,12 @@ int _transactionV2EstimateSize(
|
|||
bytesCount += InputV2Schema.estimateSize(value, offsets, allOffsets);
|
||||
}
|
||||
}
|
||||
{
|
||||
final value = object.onChainNote;
|
||||
if (value != null) {
|
||||
bytesCount += 3 + value.length * 3;
|
||||
}
|
||||
}
|
||||
{
|
||||
final value = object.otherData;
|
||||
if (value != null) {
|
||||
|
@ -180,6 +211,12 @@ int _transactionV2EstimateSize(
|
|||
bytesCount += OutputV2Schema.estimateSize(value, offsets, allOffsets);
|
||||
}
|
||||
}
|
||||
{
|
||||
final value = object.slateId;
|
||||
if (value != null) {
|
||||
bytesCount += 3 + value.length * 3;
|
||||
}
|
||||
}
|
||||
bytesCount += 3 + object.txid.length * 3;
|
||||
bytesCount += 3 + object.walletId.length * 3;
|
||||
return bytesCount;
|
||||
|
@ -200,19 +237,24 @@ void _transactionV2Serialize(
|
|||
InputV2Schema.serialize,
|
||||
object.inputs,
|
||||
);
|
||||
writer.writeString(offsets[4], object.otherData);
|
||||
writer.writeBool(offsets[4], object.isCancelled);
|
||||
writer.writeBool(offsets[5], object.isEpiccashTransaction);
|
||||
writer.writeLong(offsets[6], object.numberOfMessages);
|
||||
writer.writeString(offsets[7], object.onChainNote);
|
||||
writer.writeString(offsets[8], object.otherData);
|
||||
writer.writeObjectList<OutputV2>(
|
||||
offsets[5],
|
||||
offsets[9],
|
||||
allOffsets,
|
||||
OutputV2Schema.serialize,
|
||||
object.outputs,
|
||||
);
|
||||
writer.writeByte(offsets[6], object.subType.index);
|
||||
writer.writeLong(offsets[7], object.timestamp);
|
||||
writer.writeString(offsets[8], object.txid);
|
||||
writer.writeByte(offsets[9], object.type.index);
|
||||
writer.writeLong(offsets[10], object.version);
|
||||
writer.writeString(offsets[11], object.walletId);
|
||||
writer.writeString(offsets[10], object.slateId);
|
||||
writer.writeByte(offsets[11], object.subType.index);
|
||||
writer.writeLong(offsets[12], object.timestamp);
|
||||
writer.writeString(offsets[13], object.txid);
|
||||
writer.writeByte(offsets[14], object.type.index);
|
||||
writer.writeLong(offsets[15], object.version);
|
||||
writer.writeString(offsets[16], object.walletId);
|
||||
}
|
||||
|
||||
TransactionV2 _transactionV2Deserialize(
|
||||
|
@ -232,23 +274,23 @@ TransactionV2 _transactionV2Deserialize(
|
|||
InputV2(),
|
||||
) ??
|
||||
[],
|
||||
otherData: reader.readStringOrNull(offsets[4]),
|
||||
otherData: reader.readStringOrNull(offsets[8]),
|
||||
outputs: reader.readObjectList<OutputV2>(
|
||||
offsets[5],
|
||||
offsets[9],
|
||||
OutputV2Schema.deserialize,
|
||||
allOffsets,
|
||||
OutputV2(),
|
||||
) ??
|
||||
[],
|
||||
subType:
|
||||
_TransactionV2subTypeValueEnumMap[reader.readByteOrNull(offsets[6])] ??
|
||||
_TransactionV2subTypeValueEnumMap[reader.readByteOrNull(offsets[11])] ??
|
||||
TransactionSubType.none,
|
||||
timestamp: reader.readLong(offsets[7]),
|
||||
txid: reader.readString(offsets[8]),
|
||||
type: _TransactionV2typeValueEnumMap[reader.readByteOrNull(offsets[9])] ??
|
||||
timestamp: reader.readLong(offsets[12]),
|
||||
txid: reader.readString(offsets[13]),
|
||||
type: _TransactionV2typeValueEnumMap[reader.readByteOrNull(offsets[14])] ??
|
||||
TransactionType.outgoing,
|
||||
version: reader.readLong(offsets[10]),
|
||||
walletId: reader.readString(offsets[11]),
|
||||
version: reader.readLong(offsets[15]),
|
||||
walletId: reader.readString(offsets[16]),
|
||||
);
|
||||
object.id = id;
|
||||
return object;
|
||||
|
@ -276,8 +318,16 @@ P _transactionV2DeserializeProp<P>(
|
|||
) ??
|
||||
[]) as P;
|
||||
case 4:
|
||||
return (reader.readStringOrNull(offset)) as P;
|
||||
return (reader.readBool(offset)) as P;
|
||||
case 5:
|
||||
return (reader.readBool(offset)) as P;
|
||||
case 6:
|
||||
return (reader.readLongOrNull(offset)) as P;
|
||||
case 7:
|
||||
return (reader.readStringOrNull(offset)) as P;
|
||||
case 8:
|
||||
return (reader.readStringOrNull(offset)) as P;
|
||||
case 9:
|
||||
return (reader.readObjectList<OutputV2>(
|
||||
offset,
|
||||
OutputV2Schema.deserialize,
|
||||
|
@ -285,20 +335,22 @@ P _transactionV2DeserializeProp<P>(
|
|||
OutputV2(),
|
||||
) ??
|
||||
[]) as P;
|
||||
case 6:
|
||||
case 10:
|
||||
return (reader.readStringOrNull(offset)) as P;
|
||||
case 11:
|
||||
return (_TransactionV2subTypeValueEnumMap[
|
||||
reader.readByteOrNull(offset)] ??
|
||||
TransactionSubType.none) as P;
|
||||
case 7:
|
||||
case 12:
|
||||
return (reader.readLong(offset)) as P;
|
||||
case 8:
|
||||
case 13:
|
||||
return (reader.readString(offset)) as P;
|
||||
case 9:
|
||||
case 14:
|
||||
return (_TransactionV2typeValueEnumMap[reader.readByteOrNull(offset)] ??
|
||||
TransactionType.outgoing) as P;
|
||||
case 10:
|
||||
case 15:
|
||||
return (reader.readLong(offset)) as P;
|
||||
case 11:
|
||||
case 16:
|
||||
return (reader.readString(offset)) as P;
|
||||
default:
|
||||
throw IsarError('Unknown property with id $propertyId');
|
||||
|
@ -1263,6 +1315,254 @@ extension TransactionV2QueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
isCancelledEqualTo(bool value) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'isCancelled',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
isEpiccashTransactionEqualTo(bool value) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'isEpiccashTransaction',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
numberOfMessagesIsNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNull(
|
||||
property: r'numberOfMessages',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
numberOfMessagesIsNotNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNotNull(
|
||||
property: r'numberOfMessages',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
numberOfMessagesEqualTo(int? value) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'numberOfMessages',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
numberOfMessagesGreaterThan(
|
||||
int? value, {
|
||||
bool include = false,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
include: include,
|
||||
property: r'numberOfMessages',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
numberOfMessagesLessThan(
|
||||
int? value, {
|
||||
bool include = false,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.lessThan(
|
||||
include: include,
|
||||
property: r'numberOfMessages',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
numberOfMessagesBetween(
|
||||
int? lower,
|
||||
int? upper, {
|
||||
bool includeLower = true,
|
||||
bool includeUpper = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.between(
|
||||
property: r'numberOfMessages',
|
||||
lower: lower,
|
||||
includeLower: includeLower,
|
||||
upper: upper,
|
||||
includeUpper: includeUpper,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
onChainNoteIsNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNull(
|
||||
property: r'onChainNote',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
onChainNoteIsNotNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNotNull(
|
||||
property: r'onChainNote',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
onChainNoteEqualTo(
|
||||
String? value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'onChainNote',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
onChainNoteGreaterThan(
|
||||
String? value, {
|
||||
bool include = false,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
include: include,
|
||||
property: r'onChainNote',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
onChainNoteLessThan(
|
||||
String? value, {
|
||||
bool include = false,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.lessThan(
|
||||
include: include,
|
||||
property: r'onChainNote',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
onChainNoteBetween(
|
||||
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'onChainNote',
|
||||
lower: lower,
|
||||
includeLower: includeLower,
|
||||
upper: upper,
|
||||
includeUpper: includeUpper,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
onChainNoteStartsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.startsWith(
|
||||
property: r'onChainNote',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
onChainNoteEndsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.endsWith(
|
||||
property: r'onChainNote',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
onChainNoteContains(String value, {bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.contains(
|
||||
property: r'onChainNote',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
onChainNoteMatches(String pattern, {bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.matches(
|
||||
property: r'onChainNote',
|
||||
wildcard: pattern,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
onChainNoteIsEmpty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'onChainNote',
|
||||
value: '',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
onChainNoteIsNotEmpty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
property: r'onChainNote',
|
||||
value: '',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
otherDataIsNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
|
@ -1506,6 +1806,160 @@ extension TransactionV2QueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
slateIdIsNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNull(
|
||||
property: r'slateId',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
slateIdIsNotNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNotNull(
|
||||
property: r'slateId',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
slateIdEqualTo(
|
||||
String? value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'slateId',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
slateIdGreaterThan(
|
||||
String? value, {
|
||||
bool include = false,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
include: include,
|
||||
property: r'slateId',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
slateIdLessThan(
|
||||
String? value, {
|
||||
bool include = false,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.lessThan(
|
||||
include: include,
|
||||
property: r'slateId',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
slateIdBetween(
|
||||
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'slateId',
|
||||
lower: lower,
|
||||
includeLower: includeLower,
|
||||
upper: upper,
|
||||
includeUpper: includeUpper,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
slateIdStartsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.startsWith(
|
||||
property: r'slateId',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
slateIdEndsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.endsWith(
|
||||
property: r'slateId',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
slateIdContains(String value, {bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.contains(
|
||||
property: r'slateId',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
slateIdMatches(String pattern, {bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.matches(
|
||||
property: r'slateId',
|
||||
wildcard: pattern,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
slateIdIsEmpty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'slateId',
|
||||
value: '',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
slateIdIsNotEmpty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
property: r'slateId',
|
||||
value: '',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterFilterCondition>
|
||||
subTypeEqualTo(TransactionSubType value) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
|
@ -2060,6 +2514,60 @@ extension TransactionV2QuerySortBy
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> sortByIsCancelled() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'isCancelled', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy>
|
||||
sortByIsCancelledDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'isCancelled', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy>
|
||||
sortByIsEpiccashTransaction() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'isEpiccashTransaction', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy>
|
||||
sortByIsEpiccashTransactionDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'isEpiccashTransaction', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy>
|
||||
sortByNumberOfMessages() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'numberOfMessages', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy>
|
||||
sortByNumberOfMessagesDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'numberOfMessages', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> sortByOnChainNote() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'onChainNote', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy>
|
||||
sortByOnChainNoteDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'onChainNote', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> sortByOtherData() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'otherData', Sort.asc);
|
||||
|
@ -2073,6 +2581,18 @@ extension TransactionV2QuerySortBy
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> sortBySlateId() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'slateId', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> sortBySlateIdDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'slateId', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> sortBySubType() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'subType', Sort.asc);
|
||||
|
@ -2199,6 +2719,60 @@ extension TransactionV2QuerySortThenBy
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> thenByIsCancelled() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'isCancelled', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy>
|
||||
thenByIsCancelledDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'isCancelled', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy>
|
||||
thenByIsEpiccashTransaction() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'isEpiccashTransaction', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy>
|
||||
thenByIsEpiccashTransactionDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'isEpiccashTransaction', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy>
|
||||
thenByNumberOfMessages() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'numberOfMessages', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy>
|
||||
thenByNumberOfMessagesDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'numberOfMessages', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> thenByOnChainNote() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'onChainNote', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy>
|
||||
thenByOnChainNoteDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'onChainNote', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> thenByOtherData() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'otherData', Sort.asc);
|
||||
|
@ -2212,6 +2786,18 @@ extension TransactionV2QuerySortThenBy
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> thenBySlateId() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'slateId', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> thenBySlateIdDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'slateId', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QAfterSortBy> thenBySubType() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'subType', Sort.asc);
|
||||
|
@ -2309,6 +2895,34 @@ extension TransactionV2QueryWhereDistinct
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QDistinct>
|
||||
distinctByIsCancelled() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addDistinctBy(r'isCancelled');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QDistinct>
|
||||
distinctByIsEpiccashTransaction() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addDistinctBy(r'isEpiccashTransaction');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QDistinct>
|
||||
distinctByNumberOfMessages() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addDistinctBy(r'numberOfMessages');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QDistinct> distinctByOnChainNote(
|
||||
{bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addDistinctBy(r'onChainNote', caseSensitive: caseSensitive);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QDistinct> distinctByOtherData(
|
||||
{bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
|
@ -2316,6 +2930,13 @@ extension TransactionV2QueryWhereDistinct
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QDistinct> distinctBySlateId(
|
||||
{bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addDistinctBy(r'slateId', caseSensitive: caseSensitive);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionV2, QDistinct> distinctBySubType() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addDistinctBy(r'subType');
|
||||
|
@ -2388,6 +3009,32 @@ extension TransactionV2QueryProperty
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, bool, QQueryOperations> isCancelledProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addPropertyName(r'isCancelled');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, bool, QQueryOperations>
|
||||
isEpiccashTransactionProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addPropertyName(r'isEpiccashTransaction');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, int?, QQueryOperations>
|
||||
numberOfMessagesProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addPropertyName(r'numberOfMessages');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, String?, QQueryOperations> onChainNoteProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addPropertyName(r'onChainNote');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, String?, QQueryOperations> otherDataProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addPropertyName(r'otherData');
|
||||
|
@ -2401,6 +3048,12 @@ extension TransactionV2QueryProperty
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, String?, QQueryOperations> slateIdProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addPropertyName(r'slateId');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<TransactionV2, TransactionSubType, QQueryOperations>
|
||||
subTypeProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
|
||||
import 'dart:async';
|
||||
import 'dart:collection';
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
import 'dart:math';
|
||||
|
||||
|
@ -50,6 +51,8 @@ import 'package:stackwallet/utilities/logger.dart';
|
|||
import 'package:stackwallet/utilities/text_styles.dart';
|
||||
import 'package:stackwallet/utilities/util.dart';
|
||||
import 'package:stackwallet/wallets/isar/models/wallet_info.dart';
|
||||
import 'package:stackwallet/wallets/wallet/impl/epiccash_wallet.dart';
|
||||
import 'package:stackwallet/wallets/wallet/supporting/epiccash_wallet_info_extension.dart';
|
||||
import 'package:stackwallet/wallets/wallet/wallet.dart';
|
||||
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
|
||||
import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart';
|
||||
|
@ -202,6 +205,7 @@ class _RestoreWalletViewState extends ConsumerState<RestoreWalletView> {
|
|||
mnemonic = mnemonic.trim();
|
||||
|
||||
int height = 0;
|
||||
String? otherDataJsonString;
|
||||
|
||||
if (widget.coin == Coin.monero) {
|
||||
height = monero.getHeigthByDate(date: widget.restoreFromDate);
|
||||
|
@ -228,6 +232,22 @@ class _RestoreWalletViewState extends ConsumerState<RestoreWalletView> {
|
|||
if (height < 0) {
|
||||
height = 0;
|
||||
}
|
||||
|
||||
otherDataJsonString = jsonEncode(
|
||||
{
|
||||
WalletInfoKeys.epiccashData: jsonEncode(
|
||||
ExtraEpiccashWalletInfo(
|
||||
receivingIndex: 0,
|
||||
changeIndex: 0,
|
||||
slatesToAddresses: {},
|
||||
slatesToCommits: {},
|
||||
lastScannedBlock: height,
|
||||
restoreHeight: height,
|
||||
creationHeight: height,
|
||||
).toMap(),
|
||||
),
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
// TODO: do actual check to make sure it is a valid mnemonic for monero
|
||||
|
@ -244,6 +264,8 @@ class _RestoreWalletViewState extends ConsumerState<RestoreWalletView> {
|
|||
final info = WalletInfo.createNew(
|
||||
coin: widget.coin,
|
||||
name: widget.walletName,
|
||||
restoreHeight: height,
|
||||
otherDataJsonString: otherDataJsonString,
|
||||
);
|
||||
|
||||
bool isRestoring = true;
|
||||
|
@ -292,7 +314,12 @@ class _RestoreWalletViewState extends ConsumerState<RestoreWalletView> {
|
|||
mnemonic: mnemonic,
|
||||
);
|
||||
|
||||
await wallet.init();
|
||||
if (wallet is EpiccashWallet) {
|
||||
await wallet.init(isRestore: true);
|
||||
} else {
|
||||
await wallet.init();
|
||||
}
|
||||
|
||||
await wallet.recover(isRescan: false);
|
||||
|
||||
// check if state is still active before continuing
|
||||
|
|
|
@ -30,7 +30,6 @@ import 'package:stackwallet/pages/settings_views/wallet_settings_view/wallet_set
|
|||
import 'package:stackwallet/providers/global/wallets_provider.dart';
|
||||
import 'package:stackwallet/providers/ui/transaction_filter_provider.dart';
|
||||
import 'package:stackwallet/route_generator.dart';
|
||||
import 'package:stackwallet/services/coins/epiccash/epiccash_wallet.dart';
|
||||
import 'package:stackwallet/services/event_bus/events/global/node_connection_status_changed_event.dart';
|
||||
import 'package:stackwallet/services/event_bus/events/global/wallet_sync_status_changed_event.dart';
|
||||
import 'package:stackwallet/services/event_bus/global_event_bus.dart';
|
||||
|
@ -40,6 +39,7 @@ import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
|||
import 'package:stackwallet/utilities/show_loading.dart';
|
||||
import 'package:stackwallet/utilities/text_styles.dart';
|
||||
import 'package:stackwallet/utilities/util.dart';
|
||||
import 'package:stackwallet/wallets/wallet/impl/epiccash_wallet.dart';
|
||||
import 'package:stackwallet/wallets/wallet/wallet_mixin_interfaces/mnemonic_interface.dart';
|
||||
import 'package:stackwallet/widgets/background.dart';
|
||||
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
|
||||
|
@ -470,11 +470,11 @@ class _EpiBoxInfoFormState extends ConsumerState<EpicBoxInfoForm> {
|
|||
final hostController = TextEditingController();
|
||||
final portController = TextEditingController();
|
||||
|
||||
late EpicCashWallet wallet;
|
||||
late EpiccashWallet wallet;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
wallet = ref.read(pWallets).getWallet(widget.walletId) as EpicCashWallet;
|
||||
wallet = ref.read(pWallets).getWallet(widget.walletId) as EpiccashWallet;
|
||||
|
||||
wallet.getEpicBoxConfig().then((EpicBoxConfigModel epicBoxConfig) {
|
||||
hostController.text = epicBoxConfig.host;
|
||||
|
|
|
@ -26,7 +26,6 @@ import 'package:stackwallet/pages/wallet_view/wallet_view.dart';
|
|||
import 'package:stackwallet/providers/db/main_db_provider.dart';
|
||||
import 'package:stackwallet/providers/global/address_book_service_provider.dart';
|
||||
import 'package:stackwallet/providers/providers.dart';
|
||||
import 'package:stackwallet/services/coins/epiccash/epiccash_wallet.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
|
@ -39,6 +38,7 @@ import 'package:stackwallet/utilities/logger.dart';
|
|||
import 'package:stackwallet/utilities/text_styles.dart';
|
||||
import 'package:stackwallet/utilities/util.dart';
|
||||
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
|
||||
import 'package:stackwallet/wallets/wallet/impl/epiccash_wallet.dart';
|
||||
import 'package:stackwallet/widgets/background.dart';
|
||||
import 'package:stackwallet/widgets/conditional_parent.dart';
|
||||
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
|
||||
|
@ -1592,7 +1592,7 @@ class _TransactionDetailsViewState
|
|||
onPressed: () async {
|
||||
final wallet = ref.read(pWallets).getWallet(walletId);
|
||||
|
||||
if (wallet is EpicCashWallet) {
|
||||
if (wallet is EpiccashWallet) {
|
||||
final String? id = _transaction.slateId;
|
||||
if (id == null) {
|
||||
unawaited(showFloatingFlushBar(
|
||||
|
@ -1610,8 +1610,8 @@ class _TransactionDetailsViewState
|
|||
const CancellingTransactionProgressDialog(),
|
||||
));
|
||||
|
||||
final result = await (wallet as EpicCashWallet)
|
||||
.cancelPendingTransactionAndPost(id);
|
||||
final result =
|
||||
await wallet.cancelPendingTransactionAndPost(id);
|
||||
if (mounted) {
|
||||
// pop progress dialog
|
||||
Navigator.of(context).pop();
|
||||
|
|
|
@ -19,7 +19,9 @@ import 'package:stackwallet/models/isar/models/blockchain_data/transaction.dart'
|
|||
import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart';
|
||||
import 'package:stackwallet/notifications/show_flush_bar.dart';
|
||||
import 'package:stackwallet/pages/wallet_view/sub_widgets/tx_icon.dart';
|
||||
import 'package:stackwallet/pages/wallet_view/transaction_views/dialogs/cancelling_transaction_progress_dialog.dart';
|
||||
import 'package:stackwallet/pages/wallet_view/transaction_views/edit_note_view.dart';
|
||||
import 'package:stackwallet/pages/wallet_view/wallet_view.dart';
|
||||
import 'package:stackwallet/providers/global/address_book_service_provider.dart';
|
||||
import 'package:stackwallet/providers/providers.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
|
@ -34,6 +36,7 @@ import 'package:stackwallet/utilities/logger.dart';
|
|||
import 'package:stackwallet/utilities/text_styles.dart';
|
||||
import 'package:stackwallet/utilities/util.dart';
|
||||
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
|
||||
import 'package:stackwallet/wallets/wallet/impl/epiccash_wallet.dart';
|
||||
import 'package:stackwallet/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart';
|
||||
import 'package:stackwallet/widgets/background.dart';
|
||||
import 'package:stackwallet/widgets/conditional_parent.dart';
|
||||
|
@ -107,7 +110,25 @@ class _TransactionV2DetailsViewState
|
|||
|
||||
unit = coin.ticker;
|
||||
|
||||
if (_transaction.subType == TransactionSubType.cashFusion) {
|
||||
if (_transaction.isEpiccashTransaction) {
|
||||
switch (_transaction.type) {
|
||||
case TransactionType.outgoing:
|
||||
case TransactionType.unknown:
|
||||
amount = _transaction.getAmountSentFromThisWallet(coin: coin);
|
||||
break;
|
||||
|
||||
case TransactionType.incoming:
|
||||
case TransactionType.sentToSelf:
|
||||
amount = _transaction.getAmountReceivedInThisWallet(coin: coin);
|
||||
break;
|
||||
}
|
||||
data = _transaction.outputs
|
||||
.map((e) => (
|
||||
addresses: e.addresses,
|
||||
amount: Amount(rawValue: e.value, fractionDigits: coin.decimals)
|
||||
))
|
||||
.toList();
|
||||
} else if (_transaction.subType == TransactionSubType.cashFusion) {
|
||||
amount = _transaction.getAmountReceivedInThisWallet(coin: coin);
|
||||
data = _transaction.outputs
|
||||
.where((e) => e.walletOwns)
|
||||
|
@ -1448,7 +1469,68 @@ class _TransactionV2DetailsViewState
|
|||
// ],
|
||||
// ),
|
||||
// ),
|
||||
|
||||
if (coin == Coin.epicCash)
|
||||
isDesktop
|
||||
? const _Divider()
|
||||
: const SizedBox(
|
||||
height: 12,
|
||||
),
|
||||
if (coin == Coin.epicCash)
|
||||
RoundedWhiteContainer(
|
||||
padding: isDesktop
|
||||
? const EdgeInsets.all(16)
|
||||
: const EdgeInsets.all(12),
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Column(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
"Slate ID",
|
||||
style: isDesktop
|
||||
? STextStyles
|
||||
.desktopTextExtraExtraSmall(
|
||||
context)
|
||||
: STextStyles.itemSubtitle(
|
||||
context),
|
||||
),
|
||||
// Flexible(
|
||||
// child: FittedBox(
|
||||
// fit: BoxFit.scaleDown,
|
||||
// child:
|
||||
SelectableText(
|
||||
_transaction.slateId ?? "Unknown",
|
||||
style: isDesktop
|
||||
? STextStyles
|
||||
.desktopTextExtraExtraSmall(
|
||||
context)
|
||||
.copyWith(
|
||||
color: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
.textDark,
|
||||
)
|
||||
: STextStyles.itemSubtitle12(
|
||||
context),
|
||||
),
|
||||
// ),
|
||||
// ),
|
||||
],
|
||||
),
|
||||
if (isDesktop)
|
||||
const SizedBox(
|
||||
width: 12,
|
||||
),
|
||||
if (isDesktop)
|
||||
IconCopyButton(
|
||||
data: _transaction.slateId ?? "Unknown",
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
if (!isDesktop)
|
||||
const SizedBox(
|
||||
height: 12,
|
||||
|
@ -1463,6 +1545,98 @@ class _TransactionV2DetailsViewState
|
|||
],
|
||||
),
|
||||
),
|
||||
floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
|
||||
floatingActionButton: (coin == Coin.epicCash &&
|
||||
_transaction.getConfirmations(currentHeight) < 1 &&
|
||||
_transaction.isCancelled == false)
|
||||
? ConditionalParent(
|
||||
condition: isDesktop,
|
||||
builder: (child) => Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 32,
|
||||
vertical: 16,
|
||||
),
|
||||
child: child,
|
||||
),
|
||||
child: SizedBox(
|
||||
width: MediaQuery.of(context).size.width - 32,
|
||||
child: TextButton(
|
||||
style: ButtonStyle(
|
||||
backgroundColor: MaterialStateProperty.all<Color>(
|
||||
Theme.of(context).extension<StackColors>()!.textError,
|
||||
),
|
||||
),
|
||||
onPressed: () async {
|
||||
final wallet = ref.read(pWallets).getWallet(walletId);
|
||||
|
||||
if (wallet is EpiccashWallet) {
|
||||
final String? id = _transaction.slateId;
|
||||
if (id == null) {
|
||||
unawaited(showFloatingFlushBar(
|
||||
type: FlushBarType.warning,
|
||||
message: "Could not find Epic transaction ID",
|
||||
context: context,
|
||||
));
|
||||
return;
|
||||
}
|
||||
|
||||
unawaited(
|
||||
showDialog<void>(
|
||||
barrierDismissible: false,
|
||||
context: context,
|
||||
builder: (_) =>
|
||||
const CancellingTransactionProgressDialog(),
|
||||
),
|
||||
);
|
||||
|
||||
final result =
|
||||
await wallet.cancelPendingTransactionAndPost(id);
|
||||
if (mounted) {
|
||||
// pop progress dialog
|
||||
Navigator.of(context).pop();
|
||||
|
||||
if (result.isEmpty) {
|
||||
await showDialog<dynamic>(
|
||||
context: context,
|
||||
builder: (_) => StackOkDialog(
|
||||
title: "Transaction cancelled",
|
||||
onOkPressed: (_) {
|
||||
wallet.refresh();
|
||||
Navigator.of(context).popUntil(
|
||||
ModalRoute.withName(
|
||||
WalletView.routeName,
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
} else {
|
||||
await showDialog<dynamic>(
|
||||
context: context,
|
||||
builder: (_) => StackOkDialog(
|
||||
title: "Failed to cancel transaction",
|
||||
message: result,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
unawaited(showFloatingFlushBar(
|
||||
type: FlushBarType.warning,
|
||||
message: "ERROR: Wallet type is not Epic Cash",
|
||||
context: context,
|
||||
));
|
||||
return;
|
||||
}
|
||||
},
|
||||
child: Text(
|
||||
"Cancel Transaction",
|
||||
style: STextStyles.button(context),
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
: null,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
@ -14,7 +14,6 @@ import 'package:stackwallet/models/balance.dart';
|
|||
import 'package:stackwallet/models/isar/models/isar_models.dart' as isar_models;
|
||||
import 'package:stackwallet/models/node_model.dart';
|
||||
import 'package:stackwallet/models/paymint/fee_object_model.dart';
|
||||
import 'package:stackwallet/services/coins/epiccash/epiccash_wallet.dart';
|
||||
import 'package:stackwallet/services/coins/ethereum/ethereum_wallet.dart';
|
||||
import 'package:stackwallet/services/coins/namecoin/namecoin_wallet.dart';
|
||||
import 'package:stackwallet/services/coins/particl/particl_wallet.dart';
|
||||
|
@ -101,13 +100,7 @@ abstract class CoinServiceAPI {
|
|||
throw UnimplementedError("moved");
|
||||
|
||||
case Coin.epicCash:
|
||||
return EpicCashWallet(
|
||||
walletId: walletId,
|
||||
walletName: walletName,
|
||||
coin: coin,
|
||||
secureStore: secureStorageInterface,
|
||||
// tracker: tracker,
|
||||
);
|
||||
throw UnimplementedError("moved");
|
||||
|
||||
case Coin.ethereum:
|
||||
return EthereumWallet(
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,122 +0,0 @@
|
|||
/*
|
||||
* This file is part of Stack Wallet.
|
||||
*
|
||||
* Copyright (c) 2023 Cypher Stack
|
||||
* All Rights Reserved.
|
||||
* The code is distributed under GPLv3 license, see LICENSE file for details.
|
||||
* Generated by Cypher Stack on 2023-05-26
|
||||
*
|
||||
*/
|
||||
|
||||
import 'package:stackwallet/db/hive/db.dart';
|
||||
|
||||
mixin EpicCashHive {
|
||||
late final String _walletId;
|
||||
|
||||
void initEpicCashHive(String walletId) {
|
||||
_walletId = walletId;
|
||||
}
|
||||
|
||||
// receiving index
|
||||
int? epicGetReceivingIndex() {
|
||||
return DB.instance.get<dynamic>(boxName: _walletId, key: "receivingIndex")
|
||||
as int?;
|
||||
}
|
||||
|
||||
Future<void> epicUpdateReceivingIndex(int index) async {
|
||||
await DB.instance.put<dynamic>(
|
||||
boxName: _walletId,
|
||||
key: "receivingIndex",
|
||||
value: index,
|
||||
);
|
||||
}
|
||||
|
||||
// change index
|
||||
int? epicGetChangeIndex() {
|
||||
return DB.instance.get<dynamic>(boxName: _walletId, key: "changeIndex")
|
||||
as int?;
|
||||
}
|
||||
|
||||
Future<void> epicUpdateChangeIndex(int index) async {
|
||||
await DB.instance.put<dynamic>(
|
||||
boxName: _walletId,
|
||||
key: "changeIndex",
|
||||
value: index,
|
||||
);
|
||||
}
|
||||
|
||||
// slateToAddresses
|
||||
Map epicGetSlatesToAddresses() {
|
||||
return DB.instance.get<dynamic>(
|
||||
boxName: _walletId,
|
||||
key: "slate_to_address",
|
||||
) as Map? ??
|
||||
{};
|
||||
}
|
||||
|
||||
Future<void> epicUpdateSlatesToAddresses(Map map) async {
|
||||
await DB.instance.put<dynamic>(
|
||||
boxName: _walletId,
|
||||
key: "slate_to_address",
|
||||
value: map,
|
||||
);
|
||||
}
|
||||
|
||||
// slatesToCommits
|
||||
Map? epicGetSlatesToCommits() {
|
||||
return DB.instance.get<dynamic>(
|
||||
boxName: _walletId,
|
||||
key: "slatesToCommits",
|
||||
) as Map?;
|
||||
}
|
||||
|
||||
Future<void> epicUpdateSlatesToCommits(Map map) async {
|
||||
await DB.instance.put<dynamic>(
|
||||
boxName: _walletId,
|
||||
key: "slatesToCommits",
|
||||
value: map,
|
||||
);
|
||||
}
|
||||
|
||||
// last scanned block
|
||||
int? epicGetLastScannedBlock() {
|
||||
return DB.instance.get<dynamic>(boxName: _walletId, key: "lastScannedBlock")
|
||||
as int?;
|
||||
}
|
||||
|
||||
Future<void> epicUpdateLastScannedBlock(int blockHeight) async {
|
||||
await DB.instance.put<dynamic>(
|
||||
boxName: _walletId,
|
||||
key: "lastScannedBlock",
|
||||
value: blockHeight,
|
||||
);
|
||||
}
|
||||
|
||||
// epic restore height
|
||||
int? epicGetRestoreHeight() {
|
||||
return DB.instance.get<dynamic>(boxName: _walletId, key: "restoreHeight")
|
||||
as int?;
|
||||
}
|
||||
|
||||
Future<void> epicUpdateRestoreHeight(int height) async {
|
||||
await DB.instance.put<dynamic>(
|
||||
boxName: _walletId,
|
||||
key: "restoreHeight",
|
||||
value: height,
|
||||
);
|
||||
}
|
||||
|
||||
// epic creation height
|
||||
int? epicGetCreationHeight() {
|
||||
return DB.instance.get<dynamic>(boxName: _walletId, key: "creationHeight")
|
||||
as int?;
|
||||
}
|
||||
|
||||
Future<void> epicUpdateCreationHeight(int height) async {
|
||||
await DB.instance.put<dynamic>(
|
||||
boxName: _walletId,
|
||||
key: "creationHeight",
|
||||
value: height,
|
||||
);
|
||||
}
|
||||
}
|
|
@ -13,7 +13,6 @@ import 'package:flutter_libmonero/wownero/wownero.dart';
|
|||
import 'package:isar/isar.dart';
|
||||
import 'package:stackwallet/db/hive/db.dart';
|
||||
import 'package:stackwallet/db/isar/main_db.dart';
|
||||
import 'package:stackwallet/services/coins/epiccash/epiccash_wallet.dart';
|
||||
import 'package:stackwallet/services/node_service.dart';
|
||||
import 'package:stackwallet/services/notifications_service.dart';
|
||||
import 'package:stackwallet/services/trade_sent_from_stack_service.dart';
|
||||
|
@ -24,6 +23,7 @@ import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart';
|
|||
import 'package:stackwallet/utilities/logger.dart';
|
||||
import 'package:stackwallet/utilities/prefs.dart';
|
||||
import 'package:stackwallet/wallets/isar/models/wallet_info.dart';
|
||||
import 'package:stackwallet/wallets/wallet/impl/epiccash_wallet.dart';
|
||||
import 'package:stackwallet/wallets/wallet/wallet.dart';
|
||||
|
||||
class Wallets {
|
||||
|
|
|
@ -15,12 +15,12 @@ import 'package:flutter_libmonero/monero/monero.dart';
|
|||
import 'package:flutter_libmonero/wownero/wownero.dart';
|
||||
import 'package:stackwallet/db/hive/db.dart';
|
||||
import 'package:stackwallet/db/isar/main_db.dart';
|
||||
import 'package:stackwallet/services/coins/epiccash/epiccash_wallet.dart';
|
||||
import 'package:stackwallet/services/notifications_service.dart';
|
||||
import 'package:stackwallet/services/trade_sent_from_stack_service.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart';
|
||||
import 'package:stackwallet/utilities/logger.dart';
|
||||
import 'package:stackwallet/wallets/wallet/impl/epiccash_wallet.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
|
||||
class WalletInfo {
|
||||
|
|
|
@ -259,7 +259,6 @@ abstract class Constants {
|
|||
case Coin.litecoinTestNet:
|
||||
case Coin.firo:
|
||||
case Coin.firoTestNet:
|
||||
case Coin.epicCash:
|
||||
case Coin.namecoin:
|
||||
case Coin.particl:
|
||||
case Coin.ethereum:
|
||||
|
@ -270,6 +269,7 @@ abstract class Constants {
|
|||
|
||||
case Coin.nano:
|
||||
case Coin.banano:
|
||||
case Coin.epicCash:
|
||||
case Coin.stellar:
|
||||
case Coin.stellarTestnet:
|
||||
case Coin.tezos:
|
||||
|
|
|
@ -353,7 +353,6 @@ class WalletInfo implements IsarId {
|
|||
int favouriteOrderIndex = -1,
|
||||
int cachedChainHeight = 0,
|
||||
int restoreHeight = 0,
|
||||
bool isMnemonicVerified = false,
|
||||
String? cachedBalanceString,
|
||||
String? cachedBalanceSecondaryString,
|
||||
String? cachedBalanceTertiaryString,
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,5 +1,6 @@
|
|||
import 'dart:convert';
|
||||
|
||||
import 'package:isar/isar.dart';
|
||||
import 'package:stackwallet/utilities/logger.dart';
|
||||
import 'package:stackwallet/wallets/isar/models/wallet_info.dart';
|
||||
|
||||
|
@ -23,6 +24,18 @@ extension EpiccashWalletInfoExtension on WalletInfo {
|
|||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> updateExtraEpiccashWalletInfo({
|
||||
required ExtraEpiccashWalletInfo epicData,
|
||||
required Isar isar,
|
||||
}) async {
|
||||
await updateOtherData(
|
||||
newEntries: {
|
||||
WalletInfoKeys.epiccashData: jsonEncode(epicData.toMap()),
|
||||
},
|
||||
isar: isar,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// Holds data previously stored in hive
|
||||
|
|
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue