Merge remote-tracking branch 'origin_SW/staging' into amount_display_precision

This commit is contained in:
julian 2023-05-30 09:04:34 -06:00
commit 79a22e12c3
26 changed files with 244 additions and 53 deletions

View file

@ -12,6 +12,7 @@ part 'transaction.g.dart';
@Collection()
class Transaction {
Transaction({
required this.walletId,
required this.txid,
@ -29,6 +30,7 @@ class Transaction {
required this.inputs,
required this.outputs,
required this.nonce,
required this.numberOfMessages,
});
Tuple2<Transaction, Address?> copyWith({
@ -50,6 +52,7 @@ class Transaction {
int? nonce,
Id? id,
Address? address,
int? numberOfMessages,
}) {
return Tuple2(
Transaction(
@ -68,7 +71,8 @@ class Transaction {
otherData: otherData ?? this.otherData,
nonce: nonce ?? this.nonce,
inputs: inputs ?? this.inputs,
outputs: outputs ?? this.outputs)
outputs: outputs ?? this.outputs,
numberOfMessages: numberOfMessages ?? this.numberOfMessages)
..id = id ?? this.id,
address ?? this.address.value,
);
@ -114,6 +118,8 @@ class Transaction {
late final List<Output> outputs;
late final int? numberOfMessages;
@Backlink(to: "transactions")
final address = IsarLink<Address>();
@ -154,6 +160,7 @@ class Transaction {
"address: ${address.value}, "
"inputsLength: ${inputs.length}, "
"outputsLength: ${outputs.length}, "
"numberOfMessages: $numberOfMessages, "
"}";
String toJsonString() {
@ -175,6 +182,7 @@ class Transaction {
"address": address.value?.toJsonString(),
"inputs": inputs.map((e) => e.toJsonString()).toList(),
"outputs": outputs.map((e) => e.toJsonString()).toList(),
"numberOfMessages": numberOfMessages,
};
return jsonEncode(result);
}
@ -205,6 +213,7 @@ class Transaction {
outputs: List<String>.from(json["outputs"] as List)
.map((e) => Output.fromJsonString(e))
.toList(),
numberOfMessages: json["numberOfMessages"] as int,
);
if (json["address"] == null) {
return Tuple2(transaction, null);

View file

@ -58,46 +58,51 @@ const TransactionSchema = CollectionSchema(
name: r'nonce',
type: IsarType.long,
),
r'otherData': PropertySchema(
r'numberOfMessages': PropertySchema(
id: 8,
name: r'numberOfMessages',
type: IsarType.long,
),
r'otherData': PropertySchema(
id: 9,
name: r'otherData',
type: IsarType.string,
),
r'outputs': PropertySchema(
id: 9,
id: 10,
name: r'outputs',
type: IsarType.objectList,
target: r'Output',
),
r'slateId': PropertySchema(
id: 10,
id: 11,
name: r'slateId',
type: IsarType.string,
),
r'subType': PropertySchema(
id: 11,
id: 12,
name: r'subType',
type: IsarType.byte,
enumMap: _TransactionsubTypeEnumValueMap,
),
r'timestamp': PropertySchema(
id: 12,
id: 13,
name: r'timestamp',
type: IsarType.long,
),
r'txid': PropertySchema(
id: 13,
id: 14,
name: r'txid',
type: IsarType.string,
),
r'type': PropertySchema(
id: 14,
id: 15,
name: r'type',
type: IsarType.byte,
enumMap: _TransactiontypeEnumValueMap,
),
r'walletId': PropertySchema(
id: 15,
id: 16,
name: r'walletId',
type: IsarType.string,
)
@ -233,19 +238,20 @@ void _transactionSerialize(
writer.writeBool(offsets[5], object.isCancelled);
writer.writeBool(offsets[6], object.isLelantus);
writer.writeLong(offsets[7], object.nonce);
writer.writeString(offsets[8], object.otherData);
writer.writeLong(offsets[8], object.numberOfMessages);
writer.writeString(offsets[9], object.otherData);
writer.writeObjectList<Output>(
offsets[9],
offsets[10],
allOffsets,
OutputSchema.serialize,
object.outputs,
);
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.writeString(offsets[15], object.walletId);
writer.writeString(offsets[11], object.slateId);
writer.writeByte(offsets[12], object.subType.index);
writer.writeLong(offsets[13], object.timestamp);
writer.writeString(offsets[14], object.txid);
writer.writeByte(offsets[15], object.type.index);
writer.writeString(offsets[16], object.walletId);
}
Transaction _transactionDeserialize(
@ -269,23 +275,24 @@ Transaction _transactionDeserialize(
isCancelled: reader.readBool(offsets[5]),
isLelantus: reader.readBoolOrNull(offsets[6]),
nonce: reader.readLongOrNull(offsets[7]),
otherData: reader.readStringOrNull(offsets[8]),
numberOfMessages: reader.readLongOrNull(offsets[8]),
otherData: reader.readStringOrNull(offsets[9]),
outputs: reader.readObjectList<Output>(
offsets[9],
offsets[10],
OutputSchema.deserialize,
allOffsets,
Output(),
) ??
[],
slateId: reader.readStringOrNull(offsets[10]),
slateId: reader.readStringOrNull(offsets[11]),
subType:
_TransactionsubTypeValueEnumMap[reader.readByteOrNull(offsets[11])] ??
_TransactionsubTypeValueEnumMap[reader.readByteOrNull(offsets[12])] ??
TransactionSubType.none,
timestamp: reader.readLong(offsets[12]),
txid: reader.readString(offsets[13]),
type: _TransactiontypeValueEnumMap[reader.readByteOrNull(offsets[14])] ??
timestamp: reader.readLong(offsets[13]),
txid: reader.readString(offsets[14]),
type: _TransactiontypeValueEnumMap[reader.readByteOrNull(offsets[15])] ??
TransactionType.outgoing,
walletId: reader.readString(offsets[15]),
walletId: reader.readString(offsets[16]),
);
object.id = id;
return object;
@ -321,8 +328,10 @@ P _transactionDeserializeProp<P>(
case 7:
return (reader.readLongOrNull(offset)) as P;
case 8:
return (reader.readStringOrNull(offset)) as P;
return (reader.readLongOrNull(offset)) as P;
case 9:
return (reader.readStringOrNull(offset)) as P;
case 10:
return (reader.readObjectList<Output>(
offset,
OutputSchema.deserialize,
@ -330,19 +339,19 @@ P _transactionDeserializeProp<P>(
Output(),
) ??
[]) as P;
case 10:
return (reader.readStringOrNull(offset)) as P;
case 11:
return (reader.readStringOrNull(offset)) as P;
case 12:
return (_TransactionsubTypeValueEnumMap[reader.readByteOrNull(offset)] ??
TransactionSubType.none) as P;
case 12:
return (reader.readLong(offset)) as P;
case 13:
return (reader.readString(offset)) as P;
return (reader.readLong(offset)) as P;
case 14:
return (reader.readString(offset)) as P;
case 15:
return (_TransactiontypeValueEnumMap[reader.readByteOrNull(offset)] ??
TransactionType.outgoing) as P;
case 15:
case 16:
return (reader.readString(offset)) as P;
default:
throw IsarError('Unknown property with id $propertyId');
@ -1374,6 +1383,80 @@ extension TransactionQueryFilter
});
}
QueryBuilder<Transaction, Transaction, QAfterFilterCondition>
numberOfMessagesIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'numberOfMessages',
));
});
}
QueryBuilder<Transaction, Transaction, QAfterFilterCondition>
numberOfMessagesIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'numberOfMessages',
));
});
}
QueryBuilder<Transaction, Transaction, QAfterFilterCondition>
numberOfMessagesEqualTo(int? value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'numberOfMessages',
value: value,
));
});
}
QueryBuilder<Transaction, Transaction, 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<Transaction, Transaction, 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<Transaction, Transaction, 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<Transaction, Transaction, QAfterFilterCondition>
otherDataIsNull() {
return QueryBuilder.apply(this, (query) {
@ -2320,6 +2403,20 @@ extension TransactionQuerySortBy
});
}
QueryBuilder<Transaction, Transaction, QAfterSortBy>
sortByNumberOfMessages() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'numberOfMessages', Sort.asc);
});
}
QueryBuilder<Transaction, Transaction, QAfterSortBy>
sortByNumberOfMessagesDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'numberOfMessages', Sort.desc);
});
}
QueryBuilder<Transaction, Transaction, QAfterSortBy> sortByOtherData() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'otherData', Sort.asc);
@ -2504,6 +2601,20 @@ extension TransactionQuerySortThenBy
});
}
QueryBuilder<Transaction, Transaction, QAfterSortBy>
thenByNumberOfMessages() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'numberOfMessages', Sort.asc);
});
}
QueryBuilder<Transaction, Transaction, QAfterSortBy>
thenByNumberOfMessagesDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'numberOfMessages', Sort.desc);
});
}
QueryBuilder<Transaction, Transaction, QAfterSortBy> thenByOtherData() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'otherData', Sort.asc);
@ -2634,6 +2745,13 @@ extension TransactionQueryWhereDistinct
});
}
QueryBuilder<Transaction, Transaction, QDistinct>
distinctByNumberOfMessages() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'numberOfMessages');
});
}
QueryBuilder<Transaction, Transaction, QDistinct> distinctByOtherData(
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
@ -2737,6 +2855,12 @@ extension TransactionQueryProperty
});
}
QueryBuilder<Transaction, int?, QQueryOperations> numberOfMessagesProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'numberOfMessages');
});
}
QueryBuilder<Transaction, String?, QQueryOperations> otherDataProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'otherData');

View file

@ -155,6 +155,9 @@ class Transaction {
// @HiveField(18)
final String? otherData;
// @HiveField(16)
final int? numberOfMessages;
Transaction({
required this.txid,
required this.confirmedStatus,
@ -176,6 +179,7 @@ class Transaction {
this.isCancelled = false,
this.slateId,
this.otherData,
this.numberOfMessages,
});
factory Transaction.fromJson(Map<String, dynamic> json) {
@ -211,6 +215,7 @@ class Transaction {
isCancelled: json["isCancelled"] as bool? ?? false,
slateId: json["slateId"] as String?,
otherData: json["otherData"] as String?,
numberOfMessages: json["numberOfMessages"] as int?,
);
}
@ -269,6 +274,7 @@ class Transaction {
bool? isCancelled,
String? slateId,
String? otherData,
int? numberOfMessages,
}) {
return Transaction(
txid: txid ?? this.txid,
@ -292,13 +298,14 @@ class Transaction {
isCancelled: isCancelled ?? this.isCancelled,
slateId: slateId ?? this.slateId,
otherData: otherData ?? this.otherData,
numberOfMessages: numberOfMessages ?? this.numberOfMessages,
);
}
@override
String toString() {
String transaction =
"{txid: $txid, type: $txType, subType: $subType, value: $amount, fee: $fees, height: $height, confirm: $confirmedStatus, confirmations: $confirmations, address: $address, timestamp: $timestamp, worthNow: $worthNow, inputs: $inputs, slateid: $slateId }";
"{txid: $txid, type: $txType, subType: $subType, value: $amount, fee: $fees, height: $height, confirm: $confirmedStatus, confirmations: $confirmations, address: $address, timestamp: $timestamp, worthNow: $worthNow, inputs: $inputs, slateid: $slateId, numberOfMessages: $numberOfMessages }";
return transaction;
}
}

View file

@ -93,12 +93,7 @@ class _TransactionsListState extends ConsumerState<TransactionsList> {
children: [
TransactionCard(
// this may mess with combined firo transactions
key: isConfirmed
? Key(tx.txid +
tx.type.name +
tx.address.value.toString() +
tx.height.toString())
: UniqueKey(), //
key: UniqueKey(), //
transaction: tx,
walletId: widget.walletId,
),
@ -193,12 +188,7 @@ class _TransactionsListState extends ConsumerState<TransactionsList> {
),
child: TransactionCard(
// this may mess with combined firo transactions
key: isConfirmed
? Key(tx.txid +
tx.type.name +
tx.address.value.toString() +
tx.height.toString())
: UniqueKey(),
key: UniqueKey(),
transaction: tx,
walletId: widget.walletId,
),

View file

@ -128,6 +128,37 @@ class _TransactionDetailsViewState
}
}
if (coin == Coin.epicCash) {
if (_transaction.isCancelled) {
return "Cancelled";
} else if (type == TransactionType.incoming) {
if (tx.isConfirmed(height, coin.requiredConfirmations)) {
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 (tx.isConfirmed(height, coin.requiredConfirmations)) {
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 (type == TransactionType.incoming) {
// if (_transaction.isMinting) {
// return "Minting";

View file

@ -1293,6 +1293,7 @@ class BitcoinWallet extends CoinServiceAPI
nonce: null,
inputs: [],
outputs: [],
numberOfMessages: null,
);
final address = txData["address"] is String

View file

@ -1158,6 +1158,7 @@ class BitcoinCashWallet extends CoinServiceAPI
nonce: null,
inputs: [],
outputs: [],
numberOfMessages: null,
);
final address = txData["address"] is String
@ -2142,6 +2143,7 @@ class BitcoinCashWallet extends CoinServiceAPI
nonce: null,
inputs: inputs,
outputs: outputs,
numberOfMessages: null,
);
txns.add(Tuple2(tx, transactionAddress));

View file

@ -1145,6 +1145,7 @@ class DogecoinWallet extends CoinServiceAPI
nonce: null,
inputs: [],
outputs: [],
numberOfMessages: null,
);
final address = txData["address"] is String

View file

@ -1365,6 +1365,7 @@ class ECashWallet extends CoinServiceAPI
nonce: null,
inputs: inputs,
outputs: outputs,
numberOfMessages: null,
);
txns.add(Tuple2(tx, transactionAddress));
@ -2775,6 +2776,7 @@ class ECashWallet extends CoinServiceAPI
nonce: null,
inputs: [],
outputs: [],
numberOfMessages: null,
);
final address = txData["address"] is String

View file

@ -1153,10 +1153,6 @@ class EpicCashWallet extends CoinServiceAPI
Future<bool> startScans() async {
try {
if (ListenerManager.pointer != null) {
Logging.instance
.log("LISTENER HANDLER IS NOT NULL ....", level: LogLevel.Info);
Logging.instance
.log("STOPPING ANY WALLET LISTENER ....", level: LogLevel.Info);
epicboxListenerStop(ListenerManager.pointer!);
}
@ -1648,7 +1644,7 @@ class EpicCashWallet extends CoinServiceAPI
Future<void> _refreshTransactions() async {
// final currentChainHeight = await chainHeight;
final wallet = await _secureStore.read(key: '${_walletId}_wallet');
const refreshFromNode = 0;
const refreshFromNode = 1;
dynamic message;
await m.protect(() async {
@ -1714,6 +1710,7 @@ class EpicCashWallet extends CoinServiceAPI
?[tx["tx_type"] == "TxReceived" ? "from" : "to"] as String? ??
"";
String? commitId = slatesToCommits[slateId]?['commitId'] as String?;
tx['numberOfMessages'] = tx['messages']?['messages']?.length;
int? height;
@ -1726,6 +1723,7 @@ class EpicCashWallet extends CoinServiceAPI
final isIncoming = (tx["tx_type"] == "TxReceived" ||
tx["tx_type"] == "TxReceivedCancelled");
final txn = isar_models.Transaction(
walletId: walletId,
txid: commitId ?? tx["id"].toString(),
@ -1749,6 +1747,7 @@ class EpicCashWallet extends CoinServiceAPI
otherData: tx["id"].toString(),
inputs: [],
outputs: [],
numberOfMessages: ((tx["numberOfMessages"] == null) ? 0 : tx["numberOfMessages"]) as int,
);
// txn.address =

View file

@ -944,6 +944,7 @@ class EthereumWallet extends CoinServiceAPI with WalletCache, WalletDB {
response.value?.nonce.toBigIntFromHex.toInt(),
inputs: [],
outputs: [],
numberOfMessages: null,
);
Address? address = await db.getAddress(
@ -1035,6 +1036,7 @@ class EthereumWallet extends CoinServiceAPI with WalletCache, WalletDB {
nonce: tuple.item2,
inputs: [],
outputs: [],
numberOfMessages: null,
);
Address? transactionAddress = await db

View file

@ -449,6 +449,7 @@ Future<Map<dynamic, dynamic>> staticProcessRestore(
nonce: null,
inputs: element.inputs,
outputs: element.outputs,
numberOfMessages: null,
)..address.value = element.address.value;
}
});
@ -891,6 +892,7 @@ class FiroWallet extends CoinServiceAPI
nonce: null,
inputs: [],
outputs: [],
numberOfMessages: null,
);
final address = txData["address"] is String
@ -3038,6 +3040,7 @@ class FiroWallet extends CoinServiceAPI
otherData: transactionInfo["otherData"] as String?,
inputs: [],
outputs: [],
numberOfMessages: null,
);
final transactionAddress = await db
@ -3518,6 +3521,7 @@ class FiroWallet extends CoinServiceAPI
nonce: null,
inputs: ins,
outputs: [],
numberOfMessages: null,
);
txnsData.add(Tuple2(tx, null));
@ -3640,6 +3644,7 @@ class FiroWallet extends CoinServiceAPI
nonce: null,
inputs: ins,
outputs: outs,
numberOfMessages: null,
);
txnsData.add(Tuple2(tx, transactionAddress));
@ -3791,6 +3796,7 @@ class FiroWallet extends CoinServiceAPI
nonce: null,
inputs: ins,
outputs: outs,
numberOfMessages: null,
);
txnsData.add(Tuple2(tx, transactionAddress));
@ -5069,6 +5075,7 @@ class FiroWallet extends CoinServiceAPI
nonce: null,
inputs: [],
outputs: [],
numberOfMessages: null,
);
final address = await db

View file

@ -1276,6 +1276,7 @@ class LitecoinWallet extends CoinServiceAPI
nonce: null,
inputs: [],
outputs: [],
numberOfMessages: null,
);
final address = txData["address"] is String

View file

@ -954,6 +954,7 @@ class MoneroWallet extends CoinServiceAPI with WalletCache, WalletDB {
nonce: null,
inputs: [],
outputs: [],
numberOfMessages: null,
);
txnsData.add(Tuple2(txn, address));

View file

@ -1265,6 +1265,7 @@ class NamecoinWallet extends CoinServiceAPI
nonce: null,
inputs: [],
outputs: [],
numberOfMessages: null,
);
final address = txData["address"] is String

View file

@ -1193,6 +1193,7 @@ class ParticlWallet extends CoinServiceAPI
nonce: null,
inputs: [],
outputs: [],
numberOfMessages: null,
);
final address = txData["address"] is String
@ -2396,6 +2397,7 @@ class ParticlWallet extends CoinServiceAPI
nonce: null,
slateId: null,
otherData: null,
numberOfMessages: null,
);
txns.add(Tuple2(tx, transactionAddress));

View file

@ -1041,6 +1041,7 @@ class WowneroWallet extends CoinServiceAPI with WalletCache, WalletDB {
nonce: null,
inputs: [],
outputs: [],
numberOfMessages: null,
);
txnsData.add(Tuple2(txn, address));

View file

@ -169,6 +169,7 @@ class EthTokenWallet extends ChangeNotifier with EthTokenCache {
response.value?.nonce.toBigIntFromHex.toInt(),
inputs: [],
outputs: [],
numberOfMessages: null,
);
Address? address = await ethWallet.db.getAddress(
@ -519,6 +520,7 @@ class EthTokenWallet extends ChangeNotifier with EthTokenCache {
otherData: tuple.item1.address,
inputs: [],
outputs: [],
numberOfMessages: null,
);
Address? transactionAddress = await ethWallet.db

View file

@ -258,6 +258,7 @@ mixin ElectrumXParsing {
nonce: null,
inputs: ins,
outputs: outs,
numberOfMessages: null,
);
return Tuple2(tx, transactionAddress);

View file

@ -397,6 +397,7 @@ class DbVersionMigrator with WalletDB {
nonce: null,
inputs: [],
outputs: [],
numberOfMessages: tx.numberOfMessages,
);
if (tx.address.isEmpty) {

View file

@ -11,7 +11,7 @@ description: Stack Wallet
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.7.11+175
version: 1.7.11+176
environment:
sdk: ">=2.17.0 <3.0.0"

View file

@ -17,7 +17,7 @@ void main() {
'{"jsonrpc": "2.0", "id": "some id","method": "server.ping","params": []}';
final result = await jsonRPC.request(jsonRequestString);
expect(result, {"jsonrpc": "2.0", "result": null, "id": "some id"});
expect(result.data, {"jsonrpc": "2.0", "result": null, "id": "some id"});
});
test("JsonRPC.request fails due to SocketException", () async {

View file

@ -143,7 +143,7 @@ void main() {
]
});
expect(txChunk.toString(),
"timestamp: 993260735 transactions: [\n {txid: txid, type: txType, subType: mint, value: 10, fee: 1, height: 1, confirm: true, confirmations: 1, address: address, timestamp: 1876352482, worthNow: 1, inputs: [], slateid: slateId } \n]");
"timestamp: 993260735 transactions: [\n {txid: txid, type: txType, subType: mint, value: 10, fee: 1, height: 1, confirm: true, confirmations: 1, address: address, timestamp: 1876352482, worthNow: 1, inputs: [], slateid: slateId, numberOfMessages: null } \n]");
});
});

View file

@ -105,6 +105,7 @@ void main() {
nonce: null,
inputs: [],
outputs: [],
numberOfMessages: null,
),
)
.toList();

View file

@ -126,6 +126,7 @@ void main() {
nonce: null,
inputs: [],
outputs: [],
numberOfMessages: null,
);
when(wallet.transactions).thenAnswer((_) async => [
tx,

View file

@ -71,6 +71,7 @@ void main() {
nonce: null,
inputs: [],
outputs: [],
numberOfMessages: null,
)..address.value = Address(
walletId: "walletId",
value: "",
@ -188,6 +189,7 @@ void main() {
nonce: null,
inputs: [],
outputs: [],
numberOfMessages: null,
)..address.value = Address(
walletId: "walletId",
value: "",
@ -302,6 +304,7 @@ void main() {
nonce: null,
inputs: [],
outputs: [],
numberOfMessages: null,
)..address.value = Address(
walletId: "walletId",
value: "",
@ -410,6 +413,7 @@ void main() {
nonce: null,
inputs: [],
outputs: [],
numberOfMessages: null,
)..address.value = Address(
walletId: "walletId",
value: "",