mirror of
https://github.com/cypherstack/stack_wallet.git
synced 2025-01-30 14:15:52 +00:00
Merge branch 'amount_display_precision' into add_nano
# Conflicts: # lib/pages/pinpad_views/create_pin_view.dart # lib/widgets/custom_pin_put/custom_pin_put_state.dart
This commit is contained in:
commit
1449814e35
99 changed files with 3790 additions and 2325 deletions
|
@ -14,43 +14,23 @@ import 'package:stackwallet/db/hive/db.dart';
|
|||
import 'package:stackwallet/electrumx_rpc/electrumx.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/logger.dart';
|
||||
import 'package:stackwallet/utilities/prefs.dart';
|
||||
import 'package:string_validator/string_validator.dart';
|
||||
|
||||
class CachedElectrumX {
|
||||
final ElectrumX? electrumXClient;
|
||||
|
||||
final String server;
|
||||
final int port;
|
||||
final bool useSSL;
|
||||
|
||||
final Prefs prefs;
|
||||
final List<ElectrumXNode> failovers;
|
||||
final ElectrumX electrumXClient;
|
||||
|
||||
static const minCacheConfirms = 30;
|
||||
|
||||
const CachedElectrumX({
|
||||
required this.server,
|
||||
required this.port,
|
||||
required this.useSSL,
|
||||
required this.prefs,
|
||||
required this.failovers,
|
||||
this.electrumXClient,
|
||||
required this.electrumXClient,
|
||||
});
|
||||
|
||||
factory CachedElectrumX.from({
|
||||
required ElectrumXNode node,
|
||||
required Prefs prefs,
|
||||
required List<ElectrumXNode> failovers,
|
||||
ElectrumX? electrumXClient,
|
||||
required ElectrumX electrumXClient,
|
||||
}) =>
|
||||
CachedElectrumX(
|
||||
server: node.address,
|
||||
port: node.port,
|
||||
useSSL: node.useSSL,
|
||||
prefs: prefs,
|
||||
failovers: failovers,
|
||||
electrumXClient: electrumXClient);
|
||||
electrumXClient: electrumXClient,
|
||||
);
|
||||
|
||||
Future<Map<String, dynamic>> getAnonymitySet({
|
||||
required String groupId,
|
||||
|
@ -76,16 +56,7 @@ class CachedElectrumX {
|
|||
set = Map<String, dynamic>.from(cachedSet);
|
||||
}
|
||||
|
||||
final client = electrumXClient ??
|
||||
ElectrumX(
|
||||
host: server,
|
||||
port: port,
|
||||
useSSL: useSSL,
|
||||
prefs: prefs,
|
||||
failovers: failovers,
|
||||
);
|
||||
|
||||
final newSet = await client.getAnonymitySet(
|
||||
final newSet = await electrumXClient.getAnonymitySet(
|
||||
groupId: groupId,
|
||||
blockhash: set["blockHash"] as String,
|
||||
);
|
||||
|
@ -162,16 +133,8 @@ class CachedElectrumX {
|
|||
final cachedTx = DB.instance.get<dynamic>(
|
||||
boxName: DB.instance.boxNameTxCache(coin: coin), key: txHash) as Map?;
|
||||
if (cachedTx == null) {
|
||||
final client = electrumXClient ??
|
||||
ElectrumX(
|
||||
host: server,
|
||||
port: port,
|
||||
useSSL: useSSL,
|
||||
prefs: prefs,
|
||||
failovers: failovers,
|
||||
);
|
||||
final Map<String, dynamic> result =
|
||||
await client.getTransaction(txHash: txHash, verbose: verbose);
|
||||
final Map<String, dynamic> result = await electrumXClient
|
||||
.getTransaction(txHash: txHash, verbose: verbose);
|
||||
|
||||
result.remove("hex");
|
||||
result.remove("lelantusData");
|
||||
|
@ -212,16 +175,8 @@ class CachedElectrumX {
|
|||
|
||||
final startNumber = cachedSerials.length;
|
||||
|
||||
final client = electrumXClient ??
|
||||
ElectrumX(
|
||||
host: server,
|
||||
port: port,
|
||||
useSSL: useSSL,
|
||||
prefs: prefs,
|
||||
failovers: failovers,
|
||||
);
|
||||
|
||||
final serials = await client.getUsedCoinSerials(startNumber: startNumber);
|
||||
final serials =
|
||||
await electrumXClient.getUsedCoinSerials(startNumber: startNumber);
|
||||
List<String> newSerials = [];
|
||||
|
||||
for (final element in (serials["serials"] as List)) {
|
||||
|
|
|
@ -142,8 +142,12 @@ class ElectrumX {
|
|||
|
||||
final response = await _rpcClient!.request(jsonRequestString);
|
||||
|
||||
if (response["error"] != null) {
|
||||
if (response["error"]
|
||||
if (response.exception != null) {
|
||||
throw response.exception!;
|
||||
}
|
||||
|
||||
if (response.data["error"] != null) {
|
||||
if (response.data["error"]
|
||||
.toString()
|
||||
.contains("No such mempool or blockchain transaction")) {
|
||||
throw NoSuchTransactionException(
|
||||
|
@ -153,11 +157,15 @@ class ElectrumX {
|
|||
}
|
||||
|
||||
throw Exception(
|
||||
"JSONRPC response \ncommand: $command \nargs: $args \nerror: $response");
|
||||
"JSONRPC response\n"
|
||||
" command: $command\n"
|
||||
" args: $args\n"
|
||||
" error: $response.data",
|
||||
);
|
||||
}
|
||||
|
||||
currentFailoverIndex = -1;
|
||||
return response;
|
||||
return response.data;
|
||||
} on WifiOnlyException {
|
||||
rethrow;
|
||||
} on SocketException {
|
||||
|
@ -238,7 +246,13 @@ class ElectrumX {
|
|||
// Logging.instance.log("batch request: $request");
|
||||
|
||||
// send batch request
|
||||
final response = (await _rpcClient!.request(request)) as List<dynamic>;
|
||||
final jsonRpcResponse = (await _rpcClient!.request(request));
|
||||
|
||||
if (jsonRpcResponse.exception != null) {
|
||||
throw jsonRpcResponse.exception!;
|
||||
}
|
||||
|
||||
final response = jsonRpcResponse.data as List;
|
||||
|
||||
// check for errors, format and throw if there are any
|
||||
final List<String> errors = [];
|
||||
|
@ -320,6 +334,13 @@ class ElectrumX {
|
|||
requestID: requestID,
|
||||
command: 'blockchain.headers.subscribe',
|
||||
);
|
||||
if (response["result"] == null) {
|
||||
Logging.instance.log(
|
||||
"getBlockHeadTip returned null response",
|
||||
level: LogLevel.Error,
|
||||
);
|
||||
throw 'getBlockHeadTip returned null response';
|
||||
}
|
||||
return Map<String, dynamic>.from(response["result"] as Map);
|
||||
} catch (e) {
|
||||
rethrow;
|
||||
|
@ -556,8 +577,9 @@ class ElectrumX {
|
|||
bool verbose = true,
|
||||
String? requestID,
|
||||
}) async {
|
||||
dynamic response;
|
||||
try {
|
||||
final response = await request(
|
||||
response = await request(
|
||||
requestID: requestID,
|
||||
command: 'blockchain.transaction.get',
|
||||
args: [
|
||||
|
@ -571,6 +593,10 @@ class ElectrumX {
|
|||
|
||||
return Map<String, dynamic>.from(response["result"] as Map);
|
||||
} catch (e) {
|
||||
Logging.instance.log(
|
||||
"getTransaction($txHash) response: $response",
|
||||
level: LogLevel.Error,
|
||||
);
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,9 +12,11 @@ import 'dart:async';
|
|||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:mutex/mutex.dart';
|
||||
import 'package:stackwallet/utilities/logger.dart';
|
||||
|
||||
// hacky fix to receive large jsonrpc responses
|
||||
// Json RPC class to handle connecting to electrumx servers
|
||||
class JsonRPC {
|
||||
JsonRPC({
|
||||
required this.host,
|
||||
|
@ -22,65 +24,267 @@ class JsonRPC {
|
|||
this.useSSL = false,
|
||||
this.connectionTimeout = const Duration(seconds: 60),
|
||||
});
|
||||
bool useSSL;
|
||||
String host;
|
||||
int port;
|
||||
Duration connectionTimeout;
|
||||
final bool useSSL;
|
||||
final String host;
|
||||
final int port;
|
||||
final Duration connectionTimeout;
|
||||
|
||||
Future<dynamic> request(String jsonRpcRequest) async {
|
||||
Socket? socket;
|
||||
final completer = Completer<dynamic>();
|
||||
final List<int> responseData = [];
|
||||
final _requestMutex = Mutex();
|
||||
final _JsonRPCRequestQueue _requestQueue = _JsonRPCRequestQueue();
|
||||
Socket? _socket;
|
||||
StreamSubscription<Uint8List>? _subscription;
|
||||
|
||||
void dataHandler(List<int> data) {
|
||||
responseData.addAll(data);
|
||||
void _dataHandler(List<int> data) {
|
||||
_requestQueue.nextIncompleteReq.then((req) {
|
||||
if (req != null) {
|
||||
req.appendDataAndCheckIfComplete(data);
|
||||
|
||||
// 0x0A is newline
|
||||
// https://electrumx-spesmilo.readthedocs.io/en/latest/protocol-basics.html
|
||||
if (data.last == 0x0A) {
|
||||
try {
|
||||
final response = json.decode(String.fromCharCodes(responseData));
|
||||
completer.complete(response);
|
||||
} catch (e, s) {
|
||||
Logging.instance
|
||||
.log("JsonRPC json.decode: $e\n$s", level: LogLevel.Error);
|
||||
completer.completeError(e, s);
|
||||
} finally {
|
||||
socket?.destroy();
|
||||
if (req.isComplete) {
|
||||
_onReqCompleted(req);
|
||||
}
|
||||
} else {
|
||||
Logging.instance.log(
|
||||
"_dataHandler found a null req!",
|
||||
level: LogLevel.Warning,
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void errorHandler(Object error, StackTrace trace) {
|
||||
Logging.instance
|
||||
.log("JsonRPC errorHandler: $error\n$trace", level: LogLevel.Error);
|
||||
completer.completeError(error, trace);
|
||||
socket?.destroy();
|
||||
void _errorHandler(Object error, StackTrace trace) {
|
||||
_requestQueue.nextIncompleteReq.then((req) {
|
||||
if (req != null) {
|
||||
req.completer.completeError(error, trace);
|
||||
_onReqCompleted(req);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void doneHandler() {
|
||||
socket?.destroy();
|
||||
void _doneHandler() {
|
||||
disconnect(reason: "JsonRPC _doneHandler() called");
|
||||
}
|
||||
|
||||
void _onReqCompleted(_JsonRPCRequest req) {
|
||||
_requestQueue.remove(req).then((_) {
|
||||
// attempt to send next request
|
||||
_sendNextAvailableRequest();
|
||||
});
|
||||
}
|
||||
|
||||
void _sendNextAvailableRequest() {
|
||||
_requestQueue.nextIncompleteReq.then((req) {
|
||||
if (req != null) {
|
||||
// \r\n required by electrumx server
|
||||
_socket!.write('${req.jsonRequest}\r\n');
|
||||
|
||||
// TODO different timeout length?
|
||||
req.initiateTimeout(
|
||||
const Duration(seconds: 10),
|
||||
onTimedOut: () {
|
||||
_requestQueue.remove(req);
|
||||
},
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Future<JsonRPCResponse> request(String jsonRpcRequest) async {
|
||||
await _requestMutex.protect(() async {
|
||||
if (_socket == null) {
|
||||
Logging.instance.log(
|
||||
"JsonRPC request: opening socket $host:$port",
|
||||
level: LogLevel.Info,
|
||||
);
|
||||
await connect();
|
||||
}
|
||||
});
|
||||
|
||||
final req = _JsonRPCRequest(
|
||||
jsonRequest: jsonRpcRequest,
|
||||
completer: Completer<JsonRPCResponse>(),
|
||||
);
|
||||
|
||||
final future = req.completer.future.onError(
|
||||
(error, stackTrace) async {
|
||||
await disconnect(
|
||||
reason: "return req.completer.future.onError: $error\n$stackTrace",
|
||||
);
|
||||
return JsonRPCResponse(
|
||||
exception: error is Exception
|
||||
? error
|
||||
: Exception(
|
||||
"req.completer.future.onError: $error\n$stackTrace",
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
// if this is the only/first request then send it right away
|
||||
await _requestQueue.add(
|
||||
req,
|
||||
onInitialRequestAdded: _sendNextAvailableRequest,
|
||||
);
|
||||
|
||||
return future;
|
||||
}
|
||||
|
||||
Future<void> disconnect({required String reason}) async {
|
||||
await _requestMutex.protect(() async {
|
||||
await _subscription?.cancel();
|
||||
_subscription = null;
|
||||
_socket?.destroy();
|
||||
_socket = null;
|
||||
|
||||
// clean up remaining queue
|
||||
await _requestQueue.completeRemainingWithError(
|
||||
"JsonRPC disconnect() called with reason: \"$reason\"",
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> connect() async {
|
||||
if (_socket != null) {
|
||||
throw Exception(
|
||||
"JsonRPC attempted to connect to an already existing socket!",
|
||||
);
|
||||
}
|
||||
|
||||
if (useSSL) {
|
||||
await SecureSocket.connect(host, port,
|
||||
_socket = await SecureSocket.connect(
|
||||
host,
|
||||
port,
|
||||
timeout: connectionTimeout,
|
||||
onBadCertificate: (_) => true).then((Socket sock) {
|
||||
socket = sock;
|
||||
socket?.listen(dataHandler,
|
||||
onError: errorHandler, onDone: doneHandler, cancelOnError: true);
|
||||
});
|
||||
onBadCertificate: (_) => true,
|
||||
); // TODO do not automatically trust bad certificates
|
||||
} else {
|
||||
await Socket.connect(host, port, timeout: connectionTimeout)
|
||||
.then((Socket sock) {
|
||||
socket = sock;
|
||||
socket?.listen(dataHandler,
|
||||
onError: errorHandler, onDone: doneHandler, cancelOnError: true);
|
||||
});
|
||||
_socket = await Socket.connect(
|
||||
host,
|
||||
port,
|
||||
timeout: connectionTimeout,
|
||||
);
|
||||
}
|
||||
|
||||
socket?.write('$jsonRpcRequest\r\n');
|
||||
|
||||
return completer.future;
|
||||
_subscription = _socket!.listen(
|
||||
_dataHandler,
|
||||
onError: _errorHandler,
|
||||
onDone: _doneHandler,
|
||||
cancelOnError: true,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class _JsonRPCRequestQueue {
|
||||
final _lock = Mutex();
|
||||
final List<_JsonRPCRequest> _rq = [];
|
||||
|
||||
Future<void> add(
|
||||
_JsonRPCRequest req, {
|
||||
VoidCallback? onInitialRequestAdded,
|
||||
}) async {
|
||||
return await _lock.protect(() async {
|
||||
_rq.add(req);
|
||||
if (_rq.length == 1) {
|
||||
onInitialRequestAdded?.call();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Future<bool> remove(_JsonRPCRequest req) async {
|
||||
return await _lock.protect(() async {
|
||||
final result = _rq.remove(req);
|
||||
return result;
|
||||
});
|
||||
}
|
||||
|
||||
Future<_JsonRPCRequest?> get nextIncompleteReq async {
|
||||
return await _lock.protect(() async {
|
||||
int removeCount = 0;
|
||||
_JsonRPCRequest? returnValue;
|
||||
for (final req in _rq) {
|
||||
if (req.isComplete) {
|
||||
removeCount++;
|
||||
} else {
|
||||
returnValue = req;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
_rq.removeRange(0, removeCount);
|
||||
|
||||
return returnValue;
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> completeRemainingWithError(
|
||||
String error, {
|
||||
StackTrace? stackTrace,
|
||||
}) async {
|
||||
await _lock.protect(() async {
|
||||
for (final req in _rq) {
|
||||
if (!req.isComplete) {
|
||||
req.completer.completeError(Exception(error), stackTrace);
|
||||
}
|
||||
}
|
||||
_rq.clear();
|
||||
});
|
||||
}
|
||||
|
||||
Future<bool> get isEmpty async {
|
||||
return await _lock.protect(() async {
|
||||
return _rq.isEmpty;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
class _JsonRPCRequest {
|
||||
// 0x0A is newline
|
||||
// https://electrumx-spesmilo.readthedocs.io/en/latest/protocol-basics.html
|
||||
static const int separatorByte = 0x0A;
|
||||
|
||||
final String jsonRequest;
|
||||
final Completer<JsonRPCResponse> completer;
|
||||
final List<int> _responseData = [];
|
||||
|
||||
_JsonRPCRequest({required this.jsonRequest, required this.completer});
|
||||
|
||||
void appendDataAndCheckIfComplete(List<int> data) {
|
||||
_responseData.addAll(data);
|
||||
if (data.last == separatorByte) {
|
||||
try {
|
||||
final response = json.decode(String.fromCharCodes(_responseData));
|
||||
completer.complete(JsonRPCResponse(data: response));
|
||||
} catch (e, s) {
|
||||
Logging.instance.log(
|
||||
"JsonRPC json.decode: $e\n$s",
|
||||
level: LogLevel.Error,
|
||||
);
|
||||
completer.completeError(e, s);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void initiateTimeout(
|
||||
Duration timeout, {
|
||||
VoidCallback? onTimedOut,
|
||||
}) {
|
||||
Future<void>.delayed(timeout).then((_) {
|
||||
if (!isComplete) {
|
||||
try {
|
||||
throw Exception("_JsonRPCRequest timed out: $jsonRequest");
|
||||
} catch (e, s) {
|
||||
completer.completeError(e, s);
|
||||
onTimedOut?.call();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
bool get isComplete => completer.isCompleted;
|
||||
}
|
||||
|
||||
class JsonRPCResponse {
|
||||
final dynamic data;
|
||||
final Exception? exception;
|
||||
|
||||
JsonRPCResponse({this.data, this.exception});
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@ part 'transaction.g.dart';
|
|||
|
||||
@Collection()
|
||||
class Transaction {
|
||||
|
||||
Transaction({
|
||||
required this.walletId,
|
||||
required this.txid,
|
||||
|
@ -39,6 +40,7 @@ class Transaction {
|
|||
required this.inputs,
|
||||
required this.outputs,
|
||||
required this.nonce,
|
||||
required this.numberOfMessages,
|
||||
});
|
||||
|
||||
Tuple2<Transaction, Address?> copyWith({
|
||||
|
@ -60,6 +62,7 @@ class Transaction {
|
|||
int? nonce,
|
||||
Id? id,
|
||||
Address? address,
|
||||
int? numberOfMessages,
|
||||
}) {
|
||||
return Tuple2(
|
||||
Transaction(
|
||||
|
@ -78,7 +81,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,
|
||||
);
|
||||
|
@ -124,6 +128,8 @@ class Transaction {
|
|||
|
||||
late final List<Output> outputs;
|
||||
|
||||
late final int? numberOfMessages;
|
||||
|
||||
@Backlink(to: "transactions")
|
||||
final address = IsarLink<Address>();
|
||||
|
||||
|
@ -164,6 +170,7 @@ class Transaction {
|
|||
"address: ${address.value}, "
|
||||
"inputsLength: ${inputs.length}, "
|
||||
"outputsLength: ${outputs.length}, "
|
||||
"numberOfMessages: $numberOfMessages, "
|
||||
"}";
|
||||
|
||||
String toJsonString() {
|
||||
|
@ -185,6 +192,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);
|
||||
}
|
||||
|
@ -215,6 +223,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);
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -165,6 +165,9 @@ class Transaction {
|
|||
// @HiveField(18)
|
||||
final String? otherData;
|
||||
|
||||
// @HiveField(16)
|
||||
final int? numberOfMessages;
|
||||
|
||||
Transaction({
|
||||
required this.txid,
|
||||
required this.confirmedStatus,
|
||||
|
@ -186,6 +189,7 @@ class Transaction {
|
|||
this.isCancelled = false,
|
||||
this.slateId,
|
||||
this.otherData,
|
||||
this.numberOfMessages,
|
||||
});
|
||||
|
||||
factory Transaction.fromJson(Map<String, dynamic> json) {
|
||||
|
@ -221,6 +225,7 @@ class Transaction {
|
|||
isCancelled: json["isCancelled"] as bool? ?? false,
|
||||
slateId: json["slateId"] as String?,
|
||||
otherData: json["otherData"] as String?,
|
||||
numberOfMessages: json["numberOfMessages"] as int?,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -279,6 +284,7 @@ class Transaction {
|
|||
bool? isCancelled,
|
||||
String? slateId,
|
||||
String? otherData,
|
||||
int? numberOfMessages,
|
||||
}) {
|
||||
return Transaction(
|
||||
txid: txid ?? this.txid,
|
||||
|
@ -302,13 +308,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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,11 +18,11 @@ import 'package:stackwallet/db/isar/main_db.dart';
|
|||
import 'package:stackwallet/models/isar/models/isar_models.dart';
|
||||
import 'package:stackwallet/pages/coin_control/utxo_card.dart';
|
||||
import 'package:stackwallet/pages/coin_control/utxo_details_view.dart';
|
||||
import 'package:stackwallet/providers/global/locale_provider.dart';
|
||||
import 'package:stackwallet/providers/global/wallets_provider.dart';
|
||||
import 'package:stackwallet/services/mixins/coin_control_interface.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
|
@ -697,14 +697,9 @@ class _CoinControlViewState extends ConsumerState<CoinControlView> {
|
|||
fractionDigits: coin.decimals,
|
||||
);
|
||||
return Text(
|
||||
"${selectedSum.localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider
|
||||
.select(
|
||||
(value) => value.locale,
|
||||
),
|
||||
),
|
||||
)} ${coin.ticker}",
|
||||
ref
|
||||
.watch(pAmountFormatter(coin))
|
||||
.format(selectedSum),
|
||||
style: widget.requestedTotal == null
|
||||
? STextStyles.w600_14(context)
|
||||
: STextStyles.w600_14(context).copyWith(
|
||||
|
@ -745,14 +740,9 @@ class _CoinControlViewState extends ConsumerState<CoinControlView> {
|
|||
style: STextStyles.w600_14(context),
|
||||
),
|
||||
Text(
|
||||
"${widget.requestedTotal!.localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider
|
||||
.select(
|
||||
(value) => value.locale,
|
||||
),
|
||||
),
|
||||
)} ${coin.ticker}",
|
||||
ref
|
||||
.watch(pAmountFormatter(coin))
|
||||
.format(widget.requestedTotal!),
|
||||
style: STextStyles.w600_14(context),
|
||||
),
|
||||
],
|
||||
|
|
|
@ -12,10 +12,10 @@ import 'package:flutter/material.dart';
|
|||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:stackwallet/db/isar/main_db.dart';
|
||||
import 'package:stackwallet/models/isar/models/isar_models.dart';
|
||||
import 'package:stackwallet/providers/global/locale_provider.dart';
|
||||
import 'package:stackwallet/providers/global/wallets_provider.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/text_styles.dart';
|
||||
|
@ -134,15 +134,11 @@ class _UtxoCardState extends ConsumerState<UtxoCard> {
|
|||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Text(
|
||||
"${utxo.value.toAmountAsRaw(
|
||||
ref.watch(pAmountFormatter(coin)).format(
|
||||
utxo.value.toAmountAsRaw(
|
||||
fractionDigits: coin.decimals,
|
||||
).localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider.select(
|
||||
(value) => value.locale,
|
||||
),
|
||||
),
|
||||
)} ${coin.ticker}",
|
||||
style: STextStyles.w600_14(context),
|
||||
),
|
||||
const SizedBox(
|
||||
|
|
|
@ -16,10 +16,10 @@ import 'package:isar/isar.dart';
|
|||
import 'package:stackwallet/db/isar/main_db.dart';
|
||||
import 'package:stackwallet/models/isar/models/isar_models.dart';
|
||||
import 'package:stackwallet/pages/wallet_view/transaction_views/transaction_details_view.dart';
|
||||
import 'package:stackwallet/providers/global/locale_provider.dart';
|
||||
import 'package:stackwallet/providers/global/wallets_provider.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/text_styles.dart';
|
||||
import 'package:stackwallet/utilities/util.dart';
|
||||
|
@ -250,13 +250,11 @@ class _UtxoDetailsViewState extends ConsumerState<UtxoDetailsView> {
|
|||
width: 16,
|
||||
),
|
||||
Text(
|
||||
"${utxo!.value.toAmountAsRaw(fractionDigits: coin.decimals).localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider.select(
|
||||
(value) => value.locale,
|
||||
ref.watch(pAmountFormatter(coin)).format(
|
||||
utxo!.value.toAmountAsRaw(
|
||||
fractionDigits: coin.decimals,
|
||||
),
|
||||
),
|
||||
)} ${coin.ticker}",
|
||||
style: STextStyles.pageTitleH2(context),
|
||||
),
|
||||
],
|
||||
|
|
|
@ -23,6 +23,7 @@ import 'package:stackwallet/route_generator.dart';
|
|||
import 'package:stackwallet/services/coins/firo/firo_wallet.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/text_styles.dart';
|
||||
|
@ -376,20 +377,19 @@ class _ConfirmChangeNowSendViewState
|
|||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: [
|
||||
Text(
|
||||
"${(transactionInfo["fee"] is Amount ? transactionInfo["fee"] as Amount : (transactionInfo["fee"] as int).toAmountAsRaw(
|
||||
fractionDigits: ref.watch(
|
||||
managerProvider
|
||||
.select((value) => value.coin.decimals),
|
||||
),
|
||||
)).localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider.select(
|
||||
(value) => value.locale,
|
||||
),
|
||||
),
|
||||
)} ${ref.watch(
|
||||
ref
|
||||
.watch(pAmountFormatter(ref.watch(
|
||||
managerProvider.select((value) => value.coin),
|
||||
).ticker}",
|
||||
)))
|
||||
.format(transactionInfo["fee"] is Amount
|
||||
? transactionInfo["fee"] as Amount
|
||||
: (transactionInfo["fee"] as int)
|
||||
.toAmountAsRaw(
|
||||
fractionDigits: ref.watch(
|
||||
managerProvider.select(
|
||||
(value) => value.coin.decimals),
|
||||
),
|
||||
)),
|
||||
style:
|
||||
STextStyles.desktopTextExtraExtraSmall(context)
|
||||
.copyWith(
|
||||
|
@ -433,16 +433,9 @@ class _ConfirmChangeNowSendViewState
|
|||
final amount =
|
||||
transactionInfo["recipientAmt"] as Amount;
|
||||
final total = amount + fee;
|
||||
final locale = ref.watch(
|
||||
localeServiceChangeNotifierProvider.select(
|
||||
(value) => value.locale,
|
||||
),
|
||||
);
|
||||
|
||||
return Text(
|
||||
"${total.localizedStringAsFixed(
|
||||
locale: locale,
|
||||
)}"
|
||||
" ${coin.ticker}",
|
||||
ref.watch(pAmountFormatter(coin)).format(total),
|
||||
style: STextStyles.itemSubtitle12(context)
|
||||
.copyWith(
|
||||
color: Theme.of(context)
|
||||
|
@ -615,7 +608,7 @@ class _ConfirmChangeNowSendViewState
|
|||
);
|
||||
|
||||
return Text(
|
||||
" | ${value.localizedStringAsFixed(locale: locale)} $currency",
|
||||
" | ${value.fiatString(locale: locale)} $currency",
|
||||
style:
|
||||
STextStyles.desktopTextExtraExtraSmall(context)
|
||||
.copyWith(
|
||||
|
@ -628,15 +621,11 @@ class _ConfirmChangeNowSendViewState
|
|||
],
|
||||
),
|
||||
child: Text(
|
||||
"${(transactionInfo["recipientAmt"] as Amount).localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider.select(
|
||||
(value) => value.locale,
|
||||
),
|
||||
),
|
||||
)} ${ref.watch(
|
||||
managerProvider.select((value) => value.coin),
|
||||
).ticker}",
|
||||
ref
|
||||
.watch(pAmountFormatter(ref.watch(
|
||||
walletsChangeNotifierProvider.select(
|
||||
(value) => value.getManager(walletId).coin))))
|
||||
.format((transactionInfo["recipientAmt"] as Amount)),
|
||||
style: STextStyles.itemSubtitle12(context),
|
||||
textAlign: TextAlign.right,
|
||||
),
|
||||
|
@ -662,19 +651,20 @@ class _ConfirmChangeNowSendViewState
|
|||
style: STextStyles.smallMed12(context),
|
||||
),
|
||||
Text(
|
||||
"${(transactionInfo["fee"] is Amount ? transactionInfo["fee"] as Amount : (transactionInfo["fee"] as int).toAmountAsRaw(fractionDigits: ref.watch(
|
||||
ref
|
||||
.watch(pAmountFormatter(ref.watch(
|
||||
managerProvider.select((value) => value.coin),
|
||||
)))
|
||||
.format(
|
||||
(transactionInfo["fee"] is Amount
|
||||
? transactionInfo["fee"] as Amount
|
||||
: (transactionInfo["fee"] as int).toAmountAsRaw(
|
||||
fractionDigits: ref.watch(
|
||||
managerProvider.select(
|
||||
(value) => value.coin.decimals,
|
||||
),
|
||||
))).localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider.select(
|
||||
(value) => value.locale,
|
||||
))),
|
||||
),
|
||||
),
|
||||
)} ${ref.watch(
|
||||
managerProvider.select((value) => value.coin),
|
||||
).ticker}",
|
||||
style: STextStyles.itemSubtitle12(context),
|
||||
textAlign: TextAlign.right,
|
||||
),
|
||||
|
@ -766,16 +756,9 @@ class _ConfirmChangeNowSendViewState
|
|||
final amount =
|
||||
transactionInfo["recipientAmt"] as Amount;
|
||||
final total = amount + fee;
|
||||
final locale = ref.watch(
|
||||
localeServiceChangeNotifierProvider.select(
|
||||
(value) => value.locale,
|
||||
),
|
||||
);
|
||||
|
||||
return Text(
|
||||
"${total.localizedStringAsFixed(
|
||||
locale: locale,
|
||||
)}"
|
||||
" ${coin.ticker}",
|
||||
ref.watch(pAmountFormatter(coin)).format(total),
|
||||
style: STextStyles.itemSubtitle12(context).copyWith(
|
||||
color: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
|
|
|
@ -28,6 +28,7 @@ import 'package:stackwallet/route_generator.dart';
|
|||
import 'package:stackwallet/services/coins/firo/firo_wallet.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/clipboard_interface.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
|
@ -171,18 +172,15 @@ class _Step4ViewState extends ConsumerState<Step4View> {
|
|||
),
|
||||
SecondaryButton(
|
||||
label:
|
||||
"${firoWallet.balancePrivate.spendable.localizedStringAsFixed(
|
||||
locale: locale,
|
||||
)} (private)",
|
||||
"${ref.watch(pAmountFormatter(firoWallet.coin)).format(firoWallet.balancePrivate.spendable)} (private)",
|
||||
onPressed: () => Navigator.of(context).pop(false),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 16,
|
||||
),
|
||||
SecondaryButton(
|
||||
label: "${firoWallet.balance.spendable.localizedStringAsFixed(
|
||||
locale: locale,
|
||||
)} (public)",
|
||||
label:
|
||||
"${ref.watch(pAmountFormatter(firoWallet.coin)).format(firoWallet.balance.spendable)} (public)",
|
||||
onPressed: () => Navigator.of(context).pop(true),
|
||||
),
|
||||
const SizedBox(
|
||||
|
|
|
@ -26,6 +26,7 @@ import 'package:stackwallet/services/coins/manager.dart';
|
|||
import 'package:stackwallet/themes/coin_icon_provider.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
|
@ -157,13 +158,7 @@ class _SendFromViewState extends ConsumerState<SendFromView> {
|
|||
Row(
|
||||
children: [
|
||||
Text(
|
||||
"You need to send ${amount.localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider.select(
|
||||
(value) => value.locale,
|
||||
),
|
||||
),
|
||||
)} ${coin.ticker}",
|
||||
"You need to send ${ref.watch(pAmountFormatter(coin)).format(amount)}",
|
||||
style: isDesktop
|
||||
? STextStyles.desktopTextExtraExtraSmall(context)
|
||||
: STextStyles.itemSubtitle(context),
|
||||
|
@ -463,9 +458,10 @@ class _SendFromCardState extends ConsumerState<SendFromCard> {
|
|||
style: STextStyles.itemSubtitle(context),
|
||||
),
|
||||
Text(
|
||||
"${(manager.wallet as FiroWallet).availablePrivateBalance().localizedStringAsFixed(
|
||||
locale: locale,
|
||||
)} ${coin.ticker}",
|
||||
ref.watch(pAmountFormatter(coin)).format(
|
||||
(manager.wallet as FiroWallet)
|
||||
.availablePrivateBalance(),
|
||||
),
|
||||
style: STextStyles.itemSubtitle(context),
|
||||
),
|
||||
],
|
||||
|
@ -525,9 +521,9 @@ class _SendFromCardState extends ConsumerState<SendFromCard> {
|
|||
style: STextStyles.itemSubtitle(context),
|
||||
),
|
||||
Text(
|
||||
"${(manager.wallet as FiroWallet).availablePublicBalance().localizedStringAsFixed(
|
||||
locale: locale,
|
||||
)} ${coin.ticker}",
|
||||
ref.watch(pAmountFormatter(coin)).format(
|
||||
(manager.wallet as FiroWallet)
|
||||
.availablePublicBalance()),
|
||||
style: STextStyles.itemSubtitle(context),
|
||||
),
|
||||
],
|
||||
|
@ -615,9 +611,9 @@ class _SendFromCardState extends ConsumerState<SendFromCard> {
|
|||
),
|
||||
if (!isFiro)
|
||||
Text(
|
||||
"${manager.balance.spendable.localizedStringAsFixed(
|
||||
locale: locale,
|
||||
)} ${coin.ticker}",
|
||||
ref
|
||||
.watch(pAmountFormatter(coin))
|
||||
.format(manager.balance.spendable),
|
||||
style: STextStyles.itemSubtitle(context),
|
||||
),
|
||||
],
|
||||
|
|
|
@ -18,6 +18,8 @@ import 'package:stackwallet/providers/global/locale_provider.dart';
|
|||
import 'package:stackwallet/services/exchange/exchange.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_unit.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/enums/exchange_rate_type_enum.dart';
|
||||
|
@ -107,13 +109,32 @@ class _ExchangeOptionState extends ConsumerState<ExchangeOption> {
|
|||
.toAmount(fractionDigits: decimals);
|
||||
}
|
||||
|
||||
final rateString =
|
||||
"1 ${sendCurrency.ticker.toUpperCase()} ~ ${rate.localizedStringAsFixed(
|
||||
Coin? coin;
|
||||
try {
|
||||
coin = coinFromTickerCaseInsensitive(
|
||||
receivingCurrency.ticker);
|
||||
} catch (_) {
|
||||
coin = null;
|
||||
}
|
||||
|
||||
final String rateString;
|
||||
if (coin != null) {
|
||||
rateString = "1 ${sendCurrency.ticker.toUpperCase()} "
|
||||
"~ ${ref.watch(pAmountFormatter(coin)).format(rate)}";
|
||||
} else {
|
||||
final formatter = AmountFormatter(
|
||||
unit: AmountUnit.normal,
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider
|
||||
.select((value) => value.locale),
|
||||
),
|
||||
)} ${receivingCurrency.ticker.toUpperCase()}";
|
||||
coin: Coin.bitcoin, // some sane default
|
||||
maxDecimals: 8, // some sane default
|
||||
);
|
||||
rateString = "1 ${sendCurrency.ticker.toUpperCase()} "
|
||||
"~ ${formatter.format(rate, withUnitName: false)}"
|
||||
" ${receivingCurrency.ticker.toUpperCase()}";
|
||||
}
|
||||
|
||||
return ConditionalParent(
|
||||
condition: i > 0,
|
||||
|
|
|
@ -36,6 +36,7 @@ import 'package:stackwallet/services/exchange/trocador/trocador_exchange.dart';
|
|||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/themes/theme_providers.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/clipboard_interface.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
|
@ -366,13 +367,9 @@ class _TradeDetailsViewState extends ConsumerState<TradeDetailsView> {
|
|||
trade.payInCurrency);
|
||||
final amount = sendAmount.toAmount(
|
||||
fractionDigits: coin.decimals);
|
||||
text = amount.localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider.select(
|
||||
(value) => value.locale,
|
||||
),
|
||||
),
|
||||
);
|
||||
text = ref
|
||||
.watch(pAmountFormatter(coin))
|
||||
.format(amount);
|
||||
} catch (_) {
|
||||
text = sendAmount.toStringAsFixed(
|
||||
trade.payInCurrency.toLowerCase() == "xmr"
|
||||
|
|
|
@ -9,9 +9,11 @@
|
|||
*/
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/text_styles.dart';
|
||||
|
@ -22,7 +24,7 @@ import 'package:stackwallet/widgets/desktop/primary_button.dart';
|
|||
import 'package:stackwallet/widgets/desktop/secondary_button.dart';
|
||||
import 'package:stackwallet/widgets/stack_dialog.dart';
|
||||
|
||||
class ConfirmPaynymConnectDialog extends StatelessWidget {
|
||||
class ConfirmPaynymConnectDialog extends ConsumerWidget {
|
||||
const ConfirmPaynymConnectDialog({
|
||||
Key? key,
|
||||
required this.nymName,
|
||||
|
@ -40,14 +42,14 @@ class ConfirmPaynymConnectDialog extends StatelessWidget {
|
|||
|
||||
String get title => "Connect to $nymName";
|
||||
|
||||
String get message => "A one-time connection fee of "
|
||||
"${amount.localizedStringAsFixed(locale: locale)} ${coin.ticker} "
|
||||
String message(String amountString) => "A one-time connection fee of "
|
||||
"$amountString "
|
||||
"will be charged to connect to this PayNym.\n\nThis fee "
|
||||
"covers the cost of creating a one-time transaction to create a "
|
||||
"record on the blockchain. This keeps PayNyms decentralized.";
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
if (Util.isDesktop) {
|
||||
return DesktopDialog(
|
||||
maxHeight: double.infinity,
|
||||
|
@ -86,7 +88,7 @@ class ConfirmPaynymConnectDialog extends StatelessWidget {
|
|||
right: 40,
|
||||
),
|
||||
child: Text(
|
||||
message,
|
||||
message(ref.watch(pAmountFormatter(coin)).format(amount)),
|
||||
style: STextStyles.desktopTextMedium(context).copyWith(
|
||||
color: Theme.of(context).extension<StackColors>()!.textDark3,
|
||||
),
|
||||
|
@ -133,7 +135,7 @@ class ConfirmPaynymConnectDialog extends StatelessWidget {
|
|||
width: 24,
|
||||
height: 24,
|
||||
),
|
||||
message: message,
|
||||
message: message(ref.watch(pAmountFormatter(coin)).format(amount)),
|
||||
leftButton: SecondaryButton(
|
||||
buttonHeight: ButtonHeight.xl,
|
||||
label: "Cancel",
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
*
|
||||
*/
|
||||
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
@ -19,7 +20,6 @@ import 'package:stackwallet/providers/global/secure_store_provider.dart';
|
|||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/biometrics.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart';
|
||||
import 'package:stackwallet/utilities/text_styles.dart';
|
||||
import 'package:stackwallet/widgets/background.dart';
|
||||
|
@ -45,10 +45,11 @@ class CreatePinView extends ConsumerStatefulWidget {
|
|||
class _CreatePinViewState extends ConsumerState<CreatePinView> {
|
||||
BoxDecoration get _pinPutDecoration {
|
||||
return BoxDecoration(
|
||||
color: Theme.of(context).extension<StackColors>()!.textSubtitle3,
|
||||
color: Theme.of(context).extension<StackColors>()!.infoItemIcons,
|
||||
border: Border.all(
|
||||
width: 1,
|
||||
color: Theme.of(context).extension<StackColors>()!.textSubtitle3),
|
||||
color: Theme.of(context).extension<StackColors>()!.infoItemIcons,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(6),
|
||||
);
|
||||
}
|
||||
|
@ -67,10 +68,13 @@ class _CreatePinViewState extends ConsumerState<CreatePinView> {
|
|||
late SecureStorageInterface _secureStore;
|
||||
late Biometrics biometrics;
|
||||
|
||||
int pinCount = 1;
|
||||
|
||||
@override
|
||||
initState() {
|
||||
_secureStore = ref.read(secureStoreProvider);
|
||||
biometrics = widget.biometrics;
|
||||
|
||||
super.initState();
|
||||
}
|
||||
|
||||
|
@ -81,11 +85,13 @@ class _CreatePinViewState extends ConsumerState<CreatePinView> {
|
|||
_pinPutController2.dispose();
|
||||
_pinPutFocusNode1.dispose();
|
||||
_pinPutFocusNode2.dispose();
|
||||
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
// int pinCount = 1;
|
||||
return Background(
|
||||
child: Scaffold(
|
||||
backgroundColor: Theme.of(context).extension<StackColors>()!.background,
|
||||
|
@ -126,7 +132,7 @@ class _CreatePinViewState extends ConsumerState<CreatePinView> {
|
|||
height: 36,
|
||||
),
|
||||
CustomPinPut(
|
||||
fieldsCount: Constants.pinLength,
|
||||
fieldsCount: pinCount,
|
||||
eachFieldHeight: 12,
|
||||
eachFieldWidth: 12,
|
||||
textStyle: STextStyles.label(context).copyWith(
|
||||
|
@ -150,21 +156,23 @@ class _CreatePinViewState extends ConsumerState<CreatePinView> {
|
|||
),
|
||||
isRandom:
|
||||
ref.read(prefsChangeNotifierProvider).randomizePIN,
|
||||
submittedFieldDecoration: _pinPutDecoration.copyWith(
|
||||
color: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
.infoItemIcons,
|
||||
border: Border.all(
|
||||
width: 1,
|
||||
color: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
.infoItemIcons,
|
||||
),
|
||||
),
|
||||
submittedFieldDecoration: _pinPutDecoration,
|
||||
selectedFieldDecoration: _pinPutDecoration,
|
||||
followingFieldDecoration: _pinPutDecoration,
|
||||
onPinLengthChanged: (newLength) {
|
||||
setState(() {
|
||||
pinCount = newLength;
|
||||
});
|
||||
},
|
||||
onSubmit: (String pin) {
|
||||
if (pin.length == Constants.pinLength) {
|
||||
if (pin.length < 4) {
|
||||
showFloatingFlushBar(
|
||||
type: FlushBarType.warning,
|
||||
message: "PIN not long enough!",
|
||||
iconAsset: Assets.svg.alertCircle,
|
||||
context: context,
|
||||
);
|
||||
} else {
|
||||
_pageController.nextPage(
|
||||
duration: const Duration(milliseconds: 300),
|
||||
curve: Curves.linear,
|
||||
|
@ -194,7 +202,7 @@ class _CreatePinViewState extends ConsumerState<CreatePinView> {
|
|||
height: 36,
|
||||
),
|
||||
CustomPinPut(
|
||||
fieldsCount: Constants.pinLength,
|
||||
fieldsCount: pinCount,
|
||||
eachFieldHeight: 12,
|
||||
eachFieldWidth: 12,
|
||||
textStyle: STextStyles.infoSmall(context).copyWith(
|
||||
|
|
|
@ -23,7 +23,6 @@ import 'package:stackwallet/themes/stack_colors.dart';
|
|||
// import 'package:stackwallet/providers/global/should_show_lockscreen_on_resume_state_provider.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/biometrics.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart';
|
||||
import 'package:stackwallet/utilities/show_loading.dart';
|
||||
|
@ -199,10 +198,11 @@ class _LockscreenViewState extends ConsumerState<LockscreenView> {
|
|||
|
||||
BoxDecoration get _pinPutDecoration {
|
||||
return BoxDecoration(
|
||||
color: Theme.of(context).extension<StackColors>()!.textSubtitle2,
|
||||
color: Theme.of(context).extension<StackColors>()!.infoItemIcons,
|
||||
border: Border.all(
|
||||
width: 1,
|
||||
color: Theme.of(context).extension<StackColors>()!.textSubtitle2),
|
||||
color: Theme.of(context).extension<StackColors>()!.infoItemIcons,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(6),
|
||||
);
|
||||
}
|
||||
|
@ -212,6 +212,7 @@ class _LockscreenViewState extends ConsumerState<LockscreenView> {
|
|||
|
||||
late SecureStorageInterface _secureStore;
|
||||
late Biometrics biometrics;
|
||||
int pinCount = 1;
|
||||
|
||||
Widget get _body => Background(
|
||||
child: SafeArea(
|
||||
|
@ -284,13 +285,7 @@ class _LockscreenViewState extends ConsumerState<LockscreenView> {
|
|||
height: 52,
|
||||
),
|
||||
CustomPinPut(
|
||||
// customKey: CustomKey(
|
||||
// onPressed: _checkUseBiometrics,
|
||||
// iconAssetName: Platform.isIOS
|
||||
// ? Assets.svg.faceId
|
||||
// : Assets.svg.fingerprint,
|
||||
// ),
|
||||
fieldsCount: Constants.pinLength,
|
||||
fieldsCount: pinCount,
|
||||
eachFieldHeight: 12,
|
||||
eachFieldWidth: 12,
|
||||
textStyle: STextStyles.label(context).copyWith(
|
||||
|
@ -312,19 +307,7 @@ class _LockscreenViewState extends ConsumerState<LockscreenView> {
|
|||
.background,
|
||||
counterText: "",
|
||||
),
|
||||
submittedFieldDecoration: _pinPutDecoration.copyWith(
|
||||
color: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
.infoItemIcons,
|
||||
border: Border.all(
|
||||
width: 1,
|
||||
color: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
.infoItemIcons,
|
||||
),
|
||||
),
|
||||
selectedFieldDecoration: _pinPutDecoration,
|
||||
followingFieldDecoration: _pinPutDecoration,
|
||||
submittedFieldDecoration: _pinPutDecoration,
|
||||
isRandom: ref
|
||||
.read(prefsChangeNotifierProvider)
|
||||
.randomizePIN,
|
||||
|
|
|
@ -160,6 +160,7 @@ class _GenerateUriQrCodeViewState extends State<GenerateUriQrCodeView> {
|
|||
|
||||
String receivingAddress = widget.receivingAddress;
|
||||
if ((widget.coin == Coin.bitcoincash ||
|
||||
widget.coin == Coin.eCash ||
|
||||
widget.coin == Coin.bitcoincashTestnet) &&
|
||||
receivingAddress.contains(":")) {
|
||||
// remove cash addr prefix
|
||||
|
@ -256,6 +257,7 @@ class _GenerateUriQrCodeViewState extends State<GenerateUriQrCodeView> {
|
|||
|
||||
String receivingAddress = widget.receivingAddress;
|
||||
if ((widget.coin == Coin.bitcoincash ||
|
||||
widget.coin == Coin.eCash ||
|
||||
widget.coin == Coin.bitcoincashTestnet) &&
|
||||
receivingAddress.contains(":")) {
|
||||
// remove cash addr prefix
|
||||
|
|
|
@ -32,6 +32,7 @@ import 'package:stackwallet/services/mixins/paynym_wallet_interface.dart';
|
|||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/themes/theme_providers.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/text_styles.dart';
|
||||
|
@ -287,13 +288,15 @@ class _ConfirmTransactionViewState
|
|||
final managerProvider = ref.watch(walletsChangeNotifierProvider
|
||||
.select((value) => value.getManagerProvider(walletId)));
|
||||
|
||||
final coin = ref.watch(walletsChangeNotifierProvider
|
||||
.select((value) => value.getManager(walletId).coin));
|
||||
|
||||
final String unit;
|
||||
if (widget.isTokenTx) {
|
||||
unit = ref.watch(
|
||||
tokenServiceProvider.select((value) => value!.tokenContract.symbol));
|
||||
} else {
|
||||
unit = ref.watch(walletsChangeNotifierProvider
|
||||
.select((value) => value.getManager(walletId).coin.ticker));
|
||||
unit = coin.ticker;
|
||||
}
|
||||
|
||||
return ConditionalParent(
|
||||
|
@ -421,12 +424,12 @@ class _ConfirmTransactionViewState
|
|||
style: STextStyles.smallMed12(context),
|
||||
),
|
||||
Text(
|
||||
"${(transactionInfo["recipientAmt"] as Amount).localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider
|
||||
.select((value) => value.locale),
|
||||
ref.watch(pAmountFormatter(coin)).format(
|
||||
transactionInfo["recipientAmt"] as Amount,
|
||||
ethContract: ref
|
||||
.watch(tokenServiceProvider)
|
||||
?.tokenContract,
|
||||
),
|
||||
)} $unit",
|
||||
style: STextStyles.itemSubtitle12(context),
|
||||
textAlign: TextAlign.right,
|
||||
),
|
||||
|
@ -445,20 +448,18 @@ class _ConfirmTransactionViewState
|
|||
style: STextStyles.smallMed12(context),
|
||||
),
|
||||
Text(
|
||||
"${(transactionInfo["fee"] is Amount ? transactionInfo["fee"] as Amount : (transactionInfo["fee"] as int).toAmountAsRaw(
|
||||
ref.watch(pAmountFormatter(coin)).format(
|
||||
(transactionInfo["fee"] is Amount
|
||||
? transactionInfo["fee"] as Amount
|
||||
: (transactionInfo["fee"] as int)
|
||||
.toAmountAsRaw(
|
||||
fractionDigits: ref.watch(
|
||||
managerProvider.select(
|
||||
(value) => value.coin.decimals,
|
||||
),
|
||||
),
|
||||
)).localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider
|
||||
.select((value) => value.locale),
|
||||
)),
|
||||
),
|
||||
)} ${ref.watch(
|
||||
managerProvider.select((value) => value.coin),
|
||||
).ticker}",
|
||||
style: STextStyles.itemSubtitle12(context),
|
||||
textAlign: TextAlign.right,
|
||||
),
|
||||
|
@ -595,7 +596,7 @@ class _ConfirmTransactionViewState
|
|||
if (price > Decimal.zero) {
|
||||
fiatAmount = (amount.decimal * price)
|
||||
.toAmount(fractionDigits: 2)
|
||||
.localizedStringAsFixed(
|
||||
.fiatString(
|
||||
locale: ref
|
||||
.read(
|
||||
localeServiceChangeNotifierProvider)
|
||||
|
@ -607,12 +608,11 @@ class _ConfirmTransactionViewState
|
|||
return Row(
|
||||
children: [
|
||||
Text(
|
||||
"${amount.localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider
|
||||
.select((value) => value.locale),
|
||||
),
|
||||
)} $unit",
|
||||
ref.watch(pAmountFormatter(coin)).format(
|
||||
amount,
|
||||
ethContract: ref
|
||||
.read(tokenServiceProvider)
|
||||
?.tokenContract),
|
||||
style: STextStyles
|
||||
.desktopTextExtraExtraSmall(
|
||||
context)
|
||||
|
@ -722,14 +722,9 @@ class _ConfirmTransactionViewState
|
|||
);
|
||||
|
||||
return Text(
|
||||
"${fee.localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider
|
||||
.select(
|
||||
(value) => value.locale,
|
||||
),
|
||||
),
|
||||
)} ${coin.ticker}",
|
||||
ref
|
||||
.watch(pAmountFormatter(coin))
|
||||
.format(fee),
|
||||
style:
|
||||
STextStyles.desktopTextExtraExtraSmall(
|
||||
context)
|
||||
|
@ -902,13 +897,7 @@ class _ConfirmTransactionViewState
|
|||
);
|
||||
|
||||
return Text(
|
||||
"${fee.localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider.select(
|
||||
(value) => value.locale,
|
||||
),
|
||||
),
|
||||
)} ${coin.ticker}",
|
||||
ref.watch(pAmountFormatter(coin)).format(fee),
|
||||
style: STextStyles.itemSubtitle(context),
|
||||
);
|
||||
},
|
||||
|
@ -962,18 +951,13 @@ class _ConfirmTransactionViewState
|
|||
? transactionInfo["fee"] as Amount
|
||||
: (transactionInfo["fee"] as int)
|
||||
.toAmountAsRaw(fractionDigits: coin.decimals);
|
||||
final locale = ref.watch(
|
||||
localeServiceChangeNotifierProvider
|
||||
.select((value) => value.locale),
|
||||
);
|
||||
|
||||
final amount =
|
||||
transactionInfo["recipientAmt"] as Amount;
|
||||
return Text(
|
||||
"${(amount + fee).localizedStringAsFixed(
|
||||
locale: locale,
|
||||
)} ${ref.watch(
|
||||
managerProvider.select((value) => value.coin),
|
||||
).ticker}",
|
||||
ref
|
||||
.watch(pAmountFormatter(coin))
|
||||
.format(amount + fee),
|
||||
style: isDesktop
|
||||
? STextStyles.desktopTextExtraExtraSmall(context)
|
||||
.copyWith(
|
||||
|
|
|
@ -40,6 +40,8 @@ import 'package:stackwallet/themes/coin_icon_provider.dart';
|
|||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/address_utils.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_unit.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/barcode_scanner_interface.dart';
|
||||
import 'package:stackwallet/utilities/clipboard_interface.dart';
|
||||
|
@ -125,14 +127,25 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
|
||||
void _cryptoAmountChanged() async {
|
||||
if (!_cryptoAmountChangeLock) {
|
||||
final String cryptoAmount = cryptoAmountController.text;
|
||||
String cryptoAmount = cryptoAmountController.text;
|
||||
if (cryptoAmount.isNotEmpty &&
|
||||
cryptoAmount != "." &&
|
||||
cryptoAmount != ",") {
|
||||
if (cryptoAmount.startsWith("~")) {
|
||||
cryptoAmount = cryptoAmount.substring(1);
|
||||
}
|
||||
if (cryptoAmount.contains(" ")) {
|
||||
cryptoAmount = cryptoAmount.split(" ").first;
|
||||
}
|
||||
|
||||
final shift = ref.read(pAmountUnit(coin)).shift;
|
||||
|
||||
_amountToSend = cryptoAmount.contains(",")
|
||||
? Decimal.parse(cryptoAmount.replaceFirst(",", "."))
|
||||
.shift(0 - shift)
|
||||
.toAmount(fractionDigits: coin.decimals)
|
||||
: Decimal.parse(cryptoAmount)
|
||||
.shift(0 - shift)
|
||||
.toAmount(fractionDigits: coin.decimals);
|
||||
if (_cachedAmountToSend != null &&
|
||||
_cachedAmountToSend == _amountToSend) {
|
||||
|
@ -150,7 +163,7 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
.toAmount(
|
||||
fractionDigits: 2,
|
||||
)
|
||||
.localizedStringAsFixed(
|
||||
.fiatString(
|
||||
locale: ref.read(localeServiceChangeNotifierProvider).locale,
|
||||
);
|
||||
}
|
||||
|
@ -199,6 +212,15 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
late Amount _currentFee;
|
||||
|
||||
void _setCurrentFee(String fee, bool shouldSetState) {
|
||||
fee = fee.trim();
|
||||
|
||||
if (fee.startsWith("~")) {
|
||||
fee = fee.substring(1);
|
||||
}
|
||||
if (fee.contains(" ")) {
|
||||
fee = fee.split(" ").first;
|
||||
}
|
||||
|
||||
final value = fee.contains(",")
|
||||
? Decimal.parse(fee.replaceFirst(",", "."))
|
||||
.toAmount(fractionDigits: coin.decimals)
|
||||
|
@ -279,7 +301,6 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
break;
|
||||
}
|
||||
|
||||
final String locale = ref.read(localeServiceChangeNotifierProvider).locale;
|
||||
Amount fee;
|
||||
if (coin == Coin.monero) {
|
||||
MoneroTransactionPriority specialMoneroId;
|
||||
|
@ -296,7 +317,11 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
}
|
||||
|
||||
fee = await manager.estimateFeeFor(amount, specialMoneroId.raw!);
|
||||
cachedFees[amount] = fee.localizedStringAsFixed(locale: locale);
|
||||
cachedFees[amount] = ref.read(pAmountFormatter(coin)).format(
|
||||
fee,
|
||||
withUnitName: true,
|
||||
indicatePrecisionLoss: false,
|
||||
);
|
||||
|
||||
return cachedFees[amount]!;
|
||||
} else if (coin == Coin.firo || coin == Coin.firoTestNet) {
|
||||
|
@ -304,22 +329,32 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
"Private") {
|
||||
fee = await manager.estimateFeeFor(amount, feeRate);
|
||||
|
||||
cachedFiroPrivateFees[amount] =
|
||||
fee.localizedStringAsFixed(locale: locale);
|
||||
cachedFiroPrivateFees[amount] = ref.read(pAmountFormatter(coin)).format(
|
||||
fee,
|
||||
withUnitName: true,
|
||||
indicatePrecisionLoss: false,
|
||||
);
|
||||
|
||||
return cachedFiroPrivateFees[amount]!;
|
||||
} else {
|
||||
fee = await (manager.wallet as FiroWallet)
|
||||
.estimateFeeForPublic(amount, feeRate);
|
||||
|
||||
cachedFiroPublicFees[amount] =
|
||||
fee.localizedStringAsFixed(locale: locale);
|
||||
cachedFiroPublicFees[amount] = ref.read(pAmountFormatter(coin)).format(
|
||||
fee,
|
||||
withUnitName: true,
|
||||
indicatePrecisionLoss: false,
|
||||
);
|
||||
|
||||
return cachedFiroPublicFees[amount]!;
|
||||
}
|
||||
} else {
|
||||
fee = await manager.estimateFeeFor(amount, feeRate);
|
||||
cachedFees[amount] = fee.localizedStringAsFixed(locale: locale);
|
||||
cachedFees[amount] = ref.read(pAmountFormatter(coin)).format(
|
||||
fee,
|
||||
withUnitName: true,
|
||||
indicatePrecisionLoss: false,
|
||||
);
|
||||
|
||||
return cachedFees[amount]!;
|
||||
}
|
||||
|
@ -338,8 +373,8 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
balance = wallet.availablePublicBalance();
|
||||
}
|
||||
|
||||
return balance.localizedStringAsFixed(
|
||||
locale: ref.read(localeServiceChangeNotifierProvider).locale,
|
||||
return ref.read(pAmountFormatter(coin)).format(
|
||||
balance,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -598,7 +633,15 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
|
||||
if (_data != null) {
|
||||
if (_data!.amount != null) {
|
||||
cryptoAmountController.text = _data!.amount!.toString();
|
||||
final amount = Amount.fromDecimal(
|
||||
_data!.amount!,
|
||||
fractionDigits: coin.decimals,
|
||||
);
|
||||
|
||||
cryptoAmountController.text = ref.read(pAmountFormatter(coin)).format(
|
||||
amount,
|
||||
withUnitName: false,
|
||||
);
|
||||
}
|
||||
sendToController.text = _data!.contactLabel;
|
||||
_address = _data!.address.trim();
|
||||
|
@ -842,10 +885,12 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
if (_cachedBalance != null) {
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
cryptoAmountController.text =
|
||||
_cachedBalance!
|
||||
.localizedStringAsFixed(
|
||||
locale: locale);
|
||||
cryptoAmountController.text = ref
|
||||
.read(pAmountFormatter(coin))
|
||||
.format(
|
||||
_cachedBalance!,
|
||||
withUnitName: false,
|
||||
);
|
||||
},
|
||||
child: Container(
|
||||
color: Colors.transparent,
|
||||
|
@ -854,9 +899,10 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
CrossAxisAlignment.end,
|
||||
children: [
|
||||
Text(
|
||||
"${_cachedBalance!.localizedStringAsFixed(
|
||||
locale: locale,
|
||||
)} ${coin.ticker}",
|
||||
ref
|
||||
.watch(pAmountFormatter(
|
||||
coin))
|
||||
.format(_cachedBalance!),
|
||||
style:
|
||||
STextStyles.titleBold12(
|
||||
context)
|
||||
|
@ -868,7 +914,7 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
Text(
|
||||
"${(_cachedBalance!.decimal * ref.watch(priceAnd24hChangeNotifierProvider.select((value) => value.getPrice(coin).item1))).toAmount(
|
||||
fractionDigits: 2,
|
||||
).localizedStringAsFixed(
|
||||
).fiatString(
|
||||
locale: locale,
|
||||
)} ${ref.watch(prefsChangeNotifierProvider.select((value) => value.currency))}",
|
||||
style: STextStyles.subtitle(
|
||||
|
@ -1176,9 +1222,14 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
);
|
||||
cryptoAmountController
|
||||
.text =
|
||||
amount
|
||||
.localizedStringAsFixed(
|
||||
locale: locale,
|
||||
ref
|
||||
.read(
|
||||
pAmountFormatter(
|
||||
coin))
|
||||
.format(
|
||||
amount,
|
||||
withUnitName:
|
||||
false,
|
||||
);
|
||||
_amountToSend = amount;
|
||||
}
|
||||
|
@ -1367,7 +1418,7 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
_privateBalanceString !=
|
||||
null) {
|
||||
return Text(
|
||||
"$_privateBalanceString ${coin.ticker}",
|
||||
"$_privateBalanceString",
|
||||
style: STextStyles
|
||||
.itemSubtitle(context),
|
||||
);
|
||||
|
@ -1380,7 +1431,7 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
_publicBalanceString !=
|
||||
null) {
|
||||
return Text(
|
||||
"$_publicBalanceString ${coin.ticker}",
|
||||
"$_publicBalanceString",
|
||||
style: STextStyles
|
||||
.itemSubtitle(context),
|
||||
);
|
||||
|
@ -1440,23 +1491,32 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
.state)
|
||||
.state ==
|
||||
"Private") {
|
||||
cryptoAmountController.text = firoWallet
|
||||
.availablePrivateBalance()
|
||||
.localizedStringAsFixed(
|
||||
locale: locale);
|
||||
cryptoAmountController.text = ref
|
||||
.read(pAmountFormatter(coin))
|
||||
.format(
|
||||
firoWallet
|
||||
.availablePrivateBalance(),
|
||||
withUnitName: false,
|
||||
);
|
||||
} else {
|
||||
cryptoAmountController.text = firoWallet
|
||||
.availablePublicBalance()
|
||||
.localizedStringAsFixed(
|
||||
locale: locale);
|
||||
cryptoAmountController.text = ref
|
||||
.read(pAmountFormatter(coin))
|
||||
.format(
|
||||
firoWallet
|
||||
.availablePublicBalance(),
|
||||
withUnitName: false,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
cryptoAmountController.text = ref
|
||||
.read(pAmountFormatter(coin))
|
||||
.format(
|
||||
ref
|
||||
.read(provider)
|
||||
.balance
|
||||
.spendable
|
||||
.localizedStringAsFixed(
|
||||
locale: locale);
|
||||
.spendable,
|
||||
withUnitName: false,
|
||||
);
|
||||
}
|
||||
_cryptoAmountChanged();
|
||||
},
|
||||
|
@ -1509,7 +1569,9 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
child: Padding(
|
||||
padding: const EdgeInsets.all(12),
|
||||
child: Text(
|
||||
coin.ticker,
|
||||
ref
|
||||
.watch(pAmountUnit(coin))
|
||||
.unitForCoin(coin),
|
||||
style: STextStyles.smallMed14(context)
|
||||
.copyWith(
|
||||
color: Theme.of(context)
|
||||
|
@ -1595,11 +1657,9 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
level: LogLevel.Info);
|
||||
|
||||
final amountString =
|
||||
_amountToSend!.localizedStringAsFixed(
|
||||
locale: ref
|
||||
.read(
|
||||
localeServiceChangeNotifierProvider)
|
||||
.locale,
|
||||
ref.read(pAmountFormatter(coin)).format(
|
||||
_amountToSend!,
|
||||
withUnitName: false,
|
||||
);
|
||||
|
||||
_cryptoAmountChangeLock = true;
|
||||
|
@ -1833,6 +1893,8 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
amount: (Decimal.tryParse(
|
||||
cryptoAmountController
|
||||
.text) ??
|
||||
_amountToSend
|
||||
?.decimal ??
|
||||
Decimal.zero)
|
||||
.toAmount(
|
||||
fractionDigits: coin.decimals,
|
||||
|
@ -1872,7 +1934,7 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
false,
|
||||
);
|
||||
return Text(
|
||||
"~${snapshot.data! as String} ${coin.ticker}",
|
||||
"~${snapshot.data! as String}",
|
||||
style: STextStyles
|
||||
.itemSubtitle(
|
||||
context),
|
||||
|
@ -1929,7 +1991,7 @@ class _SendViewState extends ConsumerState<SendView> {
|
|||
false,
|
||||
);
|
||||
return Text(
|
||||
"~${snapshot.data! as String} ${coin.ticker}",
|
||||
"~${snapshot.data! as String}",
|
||||
style: STextStyles
|
||||
.itemSubtitle(
|
||||
context),
|
||||
|
|
|
@ -14,8 +14,8 @@ import 'package:stackwallet/providers/providers.dart';
|
|||
import 'package:stackwallet/providers/wallet/public_private_balance_state_provider.dart';
|
||||
import 'package:stackwallet/services/coins/firo/firo_wallet.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/text_styles.dart';
|
||||
|
||||
class FiroBalanceSelectionSheet extends ConsumerStatefulWidget {
|
||||
|
@ -162,14 +162,11 @@ class _FiroBalanceSelectionSheetState
|
|||
width: 2,
|
||||
),
|
||||
Text(
|
||||
"${firoWallet.availablePrivateBalance().localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider
|
||||
.select(
|
||||
(value) => value.locale,
|
||||
ref
|
||||
.watch(pAmountFormatter(manager.coin))
|
||||
.format(
|
||||
firoWallet.availablePrivateBalance(),
|
||||
),
|
||||
),
|
||||
)} ${manager.coin.ticker}",
|
||||
style: STextStyles.itemSubtitle(context),
|
||||
textAlign: TextAlign.left,
|
||||
),
|
||||
|
@ -243,14 +240,11 @@ class _FiroBalanceSelectionSheetState
|
|||
width: 2,
|
||||
),
|
||||
Text(
|
||||
"${firoWallet.availablePublicBalance().localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider
|
||||
.select(
|
||||
(value) => value.locale,
|
||||
ref
|
||||
.watch(pAmountFormatter(manager.coin))
|
||||
.format(
|
||||
firoWallet.availablePublicBalance(),
|
||||
),
|
||||
),
|
||||
)} ${manager.coin.ticker}",
|
||||
style: STextStyles.itemSubtitle(context),
|
||||
textAlign: TextAlign.left,
|
||||
),
|
||||
|
|
|
@ -9,7 +9,6 @@
|
|||
*/
|
||||
|
||||
import 'package:cw_core/monero_transaction_priority.dart';
|
||||
import 'package:decimal/decimal.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:stackwallet/models/paymint/fee_object_model.dart';
|
||||
|
@ -20,6 +19,7 @@ import 'package:stackwallet/providers/wallet/public_private_balance_state_provid
|
|||
import 'package:stackwallet/services/coins/firo/firo_wallet.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/enums/fee_rate_type_enum.dart';
|
||||
|
@ -335,20 +335,21 @@ class _TransactionFeeSelectionSheetState
|
|||
feeRate: feeObject!.fast,
|
||||
amount: amount,
|
||||
),
|
||||
// future: manager.estimateFeeFor(
|
||||
// Format.decimalAmountToSatoshis(
|
||||
// amount),
|
||||
// feeObject!.fast),
|
||||
builder: (_,
|
||||
AsyncSnapshot<Amount> snapshot) {
|
||||
if (snapshot.connectionState ==
|
||||
ConnectionState.done &&
|
||||
snapshot.hasData) {
|
||||
return Text(
|
||||
"(~${snapshot.data!.decimal.toStringAsFixed(
|
||||
manager.coin.decimals,
|
||||
)}"
|
||||
" ${manager.coin.ticker})",
|
||||
"(~${ref.watch(
|
||||
pAmountFormatter(
|
||||
manager.coin,
|
||||
),
|
||||
).format(
|
||||
snapshot.data!,
|
||||
indicatePrecisionLoss:
|
||||
false,
|
||||
)})",
|
||||
style: STextStyles.itemSubtitle(
|
||||
context),
|
||||
textAlign: TextAlign.left,
|
||||
|
@ -471,18 +472,21 @@ class _TransactionFeeSelectionSheetState
|
|||
feeRate: feeObject!.medium,
|
||||
amount: amount,
|
||||
),
|
||||
// future: manager.estimateFeeFor(
|
||||
// Format.decimalAmountToSatoshis(
|
||||
// amount),
|
||||
// feeObject!.fast),
|
||||
builder: (_,
|
||||
AsyncSnapshot<Amount> snapshot) {
|
||||
if (snapshot.connectionState ==
|
||||
ConnectionState.done &&
|
||||
snapshot.hasData) {
|
||||
return Text(
|
||||
"(~${snapshot.data!.decimal.toStringAsFixed(manager.coin.decimals)}"
|
||||
" ${manager.coin.ticker})",
|
||||
"(~${ref.watch(
|
||||
pAmountFormatter(
|
||||
manager.coin,
|
||||
),
|
||||
).format(
|
||||
snapshot.data!,
|
||||
indicatePrecisionLoss:
|
||||
false,
|
||||
)})",
|
||||
style: STextStyles.itemSubtitle(
|
||||
context),
|
||||
textAlign: TextAlign.left,
|
||||
|
@ -606,17 +610,21 @@ class _TransactionFeeSelectionSheetState
|
|||
feeRate: feeObject!.slow,
|
||||
amount: amount,
|
||||
),
|
||||
// future: manager.estimateFeeFor(
|
||||
// Format.decimalAmountToSatoshis(
|
||||
// amount),
|
||||
// feeObject!.fast),
|
||||
builder: (_,
|
||||
AsyncSnapshot<Amount> snapshot) {
|
||||
if (snapshot.connectionState ==
|
||||
ConnectionState.done &&
|
||||
snapshot.hasData) {
|
||||
return Text(
|
||||
"(~${snapshot.data!.decimal.toStringAsFixed(manager.coin.decimals)} ${manager.coin.ticker})",
|
||||
"(~${ref.watch(
|
||||
pAmountFormatter(
|
||||
manager.coin,
|
||||
),
|
||||
).format(
|
||||
snapshot.data!,
|
||||
indicatePrecisionLoss:
|
||||
false,
|
||||
)})",
|
||||
style: STextStyles.itemSubtitle(
|
||||
context),
|
||||
textAlign: TextAlign.left,
|
||||
|
@ -679,25 +687,31 @@ class _TransactionFeeSelectionSheetState
|
|||
switch (feeRateType) {
|
||||
case FeeRateType.fast:
|
||||
if (ref.read(feeSheetSessionCacheProvider).fast[amount] != null) {
|
||||
return (ref.read(feeSheetSessionCacheProvider).fast[amount]
|
||||
as Decimal)
|
||||
.toStringAsFixed(coin.decimals);
|
||||
return ref.read(pAmountFormatter(coin)).format(
|
||||
ref.read(feeSheetSessionCacheProvider).fast[amount]!,
|
||||
indicatePrecisionLoss: false,
|
||||
withUnitName: false,
|
||||
);
|
||||
}
|
||||
return null;
|
||||
|
||||
case FeeRateType.average:
|
||||
if (ref.read(feeSheetSessionCacheProvider).average[amount] != null) {
|
||||
return (ref.read(feeSheetSessionCacheProvider).average[amount]
|
||||
as Decimal)
|
||||
.toStringAsFixed(coin.decimals);
|
||||
return ref.read(pAmountFormatter(coin)).format(
|
||||
ref.read(feeSheetSessionCacheProvider).average[amount]!,
|
||||
indicatePrecisionLoss: false,
|
||||
withUnitName: false,
|
||||
);
|
||||
}
|
||||
return null;
|
||||
|
||||
case FeeRateType.slow:
|
||||
if (ref.read(feeSheetSessionCacheProvider).slow[amount] != null) {
|
||||
return (ref.read(feeSheetSessionCacheProvider).slow[amount]
|
||||
as Decimal)
|
||||
.toStringAsFixed(coin.decimals);
|
||||
return ref.read(pAmountFormatter(coin)).format(
|
||||
ref.read(feeSheetSessionCacheProvider).slow[amount]!,
|
||||
indicatePrecisionLoss: false,
|
||||
withUnitName: false,
|
||||
);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
|
|
@ -30,6 +30,7 @@ import 'package:stackwallet/services/coins/manager.dart';
|
|||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/address_utils.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/barcode_scanner_interface.dart';
|
||||
import 'package:stackwallet/utilities/clipboard_interface.dart';
|
||||
|
@ -176,8 +177,10 @@ class _TokenSendViewState extends ConsumerState<TokenSendView> {
|
|||
final Amount amount = Decimal.parse(results["amount"]!).toAmount(
|
||||
fractionDigits: tokenContract.decimals,
|
||||
);
|
||||
cryptoAmountController.text = amount.localizedStringAsFixed(
|
||||
locale: ref.read(localeServiceChangeNotifierProvider).locale,
|
||||
cryptoAmountController.text = ref.read(pAmountFormatter(coin)).format(
|
||||
amount,
|
||||
withUnitName: false,
|
||||
indicatePrecisionLoss: false,
|
||||
);
|
||||
_amountToSend = amount;
|
||||
}
|
||||
|
@ -248,8 +251,9 @@ class _TokenSendViewState extends ConsumerState<TokenSendView> {
|
|||
level: LogLevel.Info);
|
||||
|
||||
_cryptoAmountChangeLock = true;
|
||||
cryptoAmountController.text = _amountToSend!.localizedStringAsFixed(
|
||||
locale: ref.read(localeServiceChangeNotifierProvider).locale,
|
||||
cryptoAmountController.text = ref.read(pAmountFormatter(coin)).format(
|
||||
_amountToSend!,
|
||||
withUnitName: false,
|
||||
);
|
||||
_cryptoAmountChangeLock = false;
|
||||
} else {
|
||||
|
@ -268,10 +272,17 @@ class _TokenSendViewState extends ConsumerState<TokenSendView> {
|
|||
|
||||
void _cryptoAmountChanged() async {
|
||||
if (!_cryptoAmountChangeLock) {
|
||||
final String cryptoAmount = cryptoAmountController.text;
|
||||
String cryptoAmount = cryptoAmountController.text;
|
||||
if (cryptoAmount.isNotEmpty &&
|
||||
cryptoAmount != "." &&
|
||||
cryptoAmount != ",") {
|
||||
if (cryptoAmount.startsWith("~")) {
|
||||
cryptoAmount = cryptoAmount.substring(1);
|
||||
}
|
||||
if (cryptoAmount.contains(" ")) {
|
||||
cryptoAmount = cryptoAmount.split(" ").first;
|
||||
}
|
||||
|
||||
_amountToSend = Amount.fromDecimal(
|
||||
cryptoAmount.contains(",")
|
||||
? Decimal.parse(cryptoAmount.replaceFirst(",", "."))
|
||||
|
@ -295,7 +306,7 @@ class _TokenSendViewState extends ConsumerState<TokenSendView> {
|
|||
.toAmount(
|
||||
fractionDigits: 2,
|
||||
)
|
||||
.localizedStringAsFixed(
|
||||
.fiatString(
|
||||
locale: ref.read(localeServiceChangeNotifierProvider).locale,
|
||||
);
|
||||
}
|
||||
|
@ -366,8 +377,10 @@ class _TokenSendViewState extends ConsumerState<TokenSendView> {
|
|||
}
|
||||
|
||||
final Amount fee = wallet.estimateFeeFor(feeRate);
|
||||
cachedFees = fee.localizedStringAsFixed(
|
||||
locale: ref.read(localeServiceChangeNotifierProvider).locale,
|
||||
cachedFees = ref.read(pAmountFormatter(coin)).format(
|
||||
fee,
|
||||
withUnitName: true,
|
||||
indicatePrecisionLoss: false,
|
||||
);
|
||||
|
||||
return cachedFees;
|
||||
|
@ -684,14 +697,15 @@ class _TokenSendViewState extends ConsumerState<TokenSendView> {
|
|||
GestureDetector(
|
||||
onTap: () {
|
||||
cryptoAmountController.text = ref
|
||||
.watch(pAmountFormatter(coin))
|
||||
.format(
|
||||
ref
|
||||
.read(tokenServiceProvider)!
|
||||
.balance
|
||||
.spendable
|
||||
.localizedStringAsFixed(
|
||||
locale: ref
|
||||
.read(
|
||||
localeServiceChangeNotifierProvider)
|
||||
.locale,
|
||||
.spendable,
|
||||
ethContract: tokenContract,
|
||||
withUnitName: false,
|
||||
indicatePrecisionLoss: true,
|
||||
);
|
||||
},
|
||||
child: Container(
|
||||
|
@ -701,20 +715,22 @@ class _TokenSendViewState extends ConsumerState<TokenSendView> {
|
|||
CrossAxisAlignment.end,
|
||||
children: [
|
||||
Text(
|
||||
"${ref.watch(
|
||||
ref
|
||||
.watch(pAmountFormatter(coin))
|
||||
.format(
|
||||
ref.watch(
|
||||
tokenServiceProvider.select(
|
||||
(value) => value!
|
||||
.balance.spendable
|
||||
.localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider
|
||||
.select(
|
||||
(value) => value.locale,
|
||||
.balance.spendable,
|
||||
),
|
||||
),
|
||||
ethContract: ref.watch(
|
||||
tokenServiceProvider.select(
|
||||
(value) =>
|
||||
value!.tokenContract,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
)} ${tokenContract.symbol}",
|
||||
style:
|
||||
STextStyles.titleBold12(context)
|
||||
.copyWith(
|
||||
|
@ -725,7 +741,7 @@ class _TokenSendViewState extends ConsumerState<TokenSendView> {
|
|||
Text(
|
||||
"${(ref.watch(tokenServiceProvider.select((value) => value!.balance.spendable.decimal)) * ref.watch(priceAnd24hChangeNotifierProvider.select((value) => value.getTokenPrice(tokenContract.address).item1))).toAmount(
|
||||
fractionDigits: 2,
|
||||
).localizedStringAsFixed(
|
||||
).fiatString(
|
||||
locale: locale,
|
||||
)} ${ref.watch(prefsChangeNotifierProvider.select((value) => value.currency))}",
|
||||
style: STextStyles.subtitle(context)
|
||||
|
@ -1169,7 +1185,7 @@ class _TokenSendViewState extends ConsumerState<TokenSendView> {
|
|||
ConnectionState.done &&
|
||||
snapshot.hasData) {
|
||||
return Text(
|
||||
"~${snapshot.data! as String} ${coin.ticker}",
|
||||
"~${snapshot.data! as String}",
|
||||
style:
|
||||
STextStyles.itemSubtitle(
|
||||
context),
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:stackwallet/pages/settings_views/global_settings_view/advanced_views/debug_view.dart';
|
||||
import 'package:stackwallet/pages/settings_views/global_settings_view/advanced_views/manage_coin_units/manage_coin_units_view.dart';
|
||||
import 'package:stackwallet/pages/settings_views/global_settings_view/advanced_views/manage_explorer_view.dart';
|
||||
import 'package:stackwallet/pages/stack_privacy_calls.dart';
|
||||
import 'package:stackwallet/providers/global/prefs_provider.dart';
|
||||
|
@ -271,6 +272,41 @@ class AdvancedSettingsView extends StatelessWidget {
|
|||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 8,
|
||||
),
|
||||
RoundedWhiteContainer(
|
||||
padding: const EdgeInsets.all(0),
|
||||
child: RawMaterialButton(
|
||||
// splashColor: Theme.of(context).extension<StackColors>()!.highlight,
|
||||
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(
|
||||
Constants.size.circularBorderRadius,
|
||||
),
|
||||
),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pushNamed(
|
||||
ManageCoinUnitsView.routeName,
|
||||
);
|
||||
},
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 12,
|
||||
vertical: 20,
|
||||
),
|
||||
child: Row(
|
||||
children: [
|
||||
Text(
|
||||
"Units",
|
||||
style: STextStyles.titleBold12(context),
|
||||
textAlign: TextAlign.left,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
|
@ -0,0 +1,142 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_unit.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/text_styles.dart';
|
||||
|
||||
class ChooseUnitSheet extends ConsumerStatefulWidget {
|
||||
const ChooseUnitSheet({
|
||||
Key? key,
|
||||
required this.coin,
|
||||
}) : super(key: key);
|
||||
|
||||
final Coin coin;
|
||||
|
||||
@override
|
||||
ConsumerState<ChooseUnitSheet> createState() => _ChooseUnitSheetState();
|
||||
}
|
||||
|
||||
class _ChooseUnitSheetState extends ConsumerState<ChooseUnitSheet> {
|
||||
late AmountUnit _current;
|
||||
late final List<AmountUnit> values;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
values = AmountUnit.valuesForCoin(widget.coin);
|
||||
_current = ref.read(pAmountUnit(widget.coin));
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context).extension<StackColors>()!.popupBG,
|
||||
borderRadius: const BorderRadius.vertical(
|
||||
top: Radius.circular(20),
|
||||
),
|
||||
),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
left: 24,
|
||||
right: 24,
|
||||
top: 10,
|
||||
bottom: 0,
|
||||
),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Center(
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
.textFieldDefaultBG,
|
||||
borderRadius: BorderRadius.circular(
|
||||
Constants.size.circularBorderRadius,
|
||||
),
|
||||
),
|
||||
width: 60,
|
||||
height: 4,
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 36,
|
||||
),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
"Phrase length",
|
||||
style: STextStyles.pageTitleH2(context),
|
||||
textAlign: TextAlign.left,
|
||||
),
|
||||
const SizedBox(
|
||||
height: 16,
|
||||
),
|
||||
for (int i = 0; i < values.length; i++)
|
||||
Column(
|
||||
children: [
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
setState(() {
|
||||
_current = values[i];
|
||||
});
|
||||
|
||||
Navigator.of(context).pop(_current);
|
||||
},
|
||||
child: Container(
|
||||
color: Colors.transparent,
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
SizedBox(
|
||||
width: 20,
|
||||
height: 20,
|
||||
child: Radio(
|
||||
activeColor: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
.radioButtonIconEnabled,
|
||||
value: values[i],
|
||||
groupValue: _current,
|
||||
onChanged: (x) {
|
||||
setState(() {
|
||||
_current = values[i];
|
||||
});
|
||||
|
||||
Navigator.of(context).pop(_current);
|
||||
},
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 12,
|
||||
),
|
||||
Text(
|
||||
values[i].unitForCoin(widget.coin),
|
||||
style: STextStyles.titleBold12(context),
|
||||
textAlign: TextAlign.left,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 16,
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(
|
||||
height: 8,
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,343 @@
|
|||
import 'package:dropdown_button2/dropdown_button2.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:stackwallet/pages/settings_views/global_settings_view/advanced_views/manage_coin_units/choose_unit_sheet.dart';
|
||||
import 'package:stackwallet/providers/global/prefs_provider.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_unit.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/text_styles.dart';
|
||||
import 'package:stackwallet/utilities/util.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';
|
||||
import 'package:stackwallet/widgets/desktop/desktop_dialog.dart';
|
||||
import 'package:stackwallet/widgets/desktop/desktop_dialog_close_button.dart';
|
||||
import 'package:stackwallet/widgets/desktop/primary_button.dart';
|
||||
import 'package:stackwallet/widgets/desktop/secondary_button.dart';
|
||||
import 'package:stackwallet/widgets/icon_widgets/x_icon.dart';
|
||||
import 'package:stackwallet/widgets/stack_text_field.dart';
|
||||
import 'package:stackwallet/widgets/textfield_icon_button.dart';
|
||||
|
||||
class EditCoinUnitsView extends ConsumerStatefulWidget {
|
||||
const EditCoinUnitsView({
|
||||
Key? key,
|
||||
required this.coin,
|
||||
}) : super(key: key);
|
||||
|
||||
final Coin coin;
|
||||
|
||||
static const String routeName = "/editCoinUnitsView";
|
||||
|
||||
@override
|
||||
ConsumerState<EditCoinUnitsView> createState() => _EditCoinUnitsViewState();
|
||||
}
|
||||
|
||||
class _EditCoinUnitsViewState extends ConsumerState<EditCoinUnitsView> {
|
||||
late final TextEditingController _decimalsController;
|
||||
late final FocusNode _decimalsFocusNode;
|
||||
|
||||
late AmountUnit _currentUnit;
|
||||
|
||||
void onSave() {
|
||||
final maxDecimals = int.tryParse(_decimalsController.text);
|
||||
|
||||
if (maxDecimals == null) {
|
||||
// TODO show dialog error thing
|
||||
return;
|
||||
}
|
||||
|
||||
ref.read(prefsChangeNotifierProvider).updateAmountUnit(
|
||||
coin: widget.coin,
|
||||
amountUnit: _currentUnit,
|
||||
);
|
||||
ref.read(prefsChangeNotifierProvider).updateMaxDecimals(
|
||||
coin: widget.coin,
|
||||
maxDecimals: maxDecimals,
|
||||
);
|
||||
|
||||
Navigator.of(context).pop();
|
||||
}
|
||||
|
||||
Future<void> chooseUnit() async {
|
||||
final chosenUnit = await showModalBottomSheet<AmountUnit?>(
|
||||
backgroundColor: Colors.transparent,
|
||||
context: context,
|
||||
shape: const RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.vertical(
|
||||
top: Radius.circular(20),
|
||||
),
|
||||
),
|
||||
builder: (_) {
|
||||
return ChooseUnitSheet(
|
||||
coin: widget.coin,
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
if (chosenUnit != null) {
|
||||
setState(() {
|
||||
_currentUnit = chosenUnit;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
_decimalsFocusNode = FocusNode();
|
||||
_decimalsController = TextEditingController()
|
||||
..text = ref.read(pMaxDecimals(widget.coin)).toString();
|
||||
_currentUnit = ref.read(pAmountUnit(widget.coin));
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_decimalsFocusNode.dispose();
|
||||
_decimalsController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return ConditionalParent(
|
||||
condition: Util.isDesktop,
|
||||
builder: (child) => DesktopDialog(
|
||||
maxHeight: 350,
|
||||
maxWidth: 500,
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 32),
|
||||
child: Text(
|
||||
"Edit ${widget.coin.prettyName} units",
|
||||
style: STextStyles.desktopH3(context),
|
||||
),
|
||||
),
|
||||
const DesktopDialogCloseButton(),
|
||||
],
|
||||
),
|
||||
Expanded(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
left: 32,
|
||||
right: 32,
|
||||
bottom: 32,
|
||||
),
|
||||
child: child,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
child: ConditionalParent(
|
||||
condition: !Util.isDesktop,
|
||||
builder: (child) => Background(
|
||||
child: Scaffold(
|
||||
backgroundColor:
|
||||
Theme.of(context).extension<StackColors>()!.background,
|
||||
appBar: AppBar(
|
||||
leading: AppBarBackButton(
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
title: Text(
|
||||
"Edit ${widget.coin.prettyName} units",
|
||||
style: STextStyles.navBarTitle(context),
|
||||
),
|
||||
),
|
||||
body: Padding(
|
||||
padding: const EdgeInsets.all(16),
|
||||
child: child,
|
||||
),
|
||||
),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
if (Util.isDesktop)
|
||||
DropdownButtonHideUnderline(
|
||||
child: DropdownButton2<AmountUnit>(
|
||||
value: _currentUnit,
|
||||
items: [
|
||||
...AmountUnit.valuesForCoin(widget.coin).map(
|
||||
(e) => DropdownMenuItem(
|
||||
value: e,
|
||||
child: Text(
|
||||
e.unitForCoin(widget.coin),
|
||||
style: STextStyles.desktopTextMedium(context),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
onChanged: (value) {
|
||||
if (value is AmountUnit) {
|
||||
_currentUnit = value;
|
||||
}
|
||||
},
|
||||
isExpanded: true,
|
||||
icon: SvgPicture.asset(
|
||||
Assets.svg.chevronDown,
|
||||
width: 12,
|
||||
height: 6,
|
||||
color: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
.textFieldActiveSearchIconRight,
|
||||
),
|
||||
buttonPadding: const EdgeInsets.symmetric(
|
||||
horizontal: 16,
|
||||
vertical: 8,
|
||||
),
|
||||
buttonDecoration: BoxDecoration(
|
||||
color: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
.textFieldDefaultBG,
|
||||
borderRadius: BorderRadius.circular(
|
||||
Constants.size.circularBorderRadius,
|
||||
),
|
||||
),
|
||||
dropdownDecoration: BoxDecoration(
|
||||
color: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
.textFieldDefaultBG,
|
||||
borderRadius: BorderRadius.circular(
|
||||
Constants.size.circularBorderRadius,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
if (!Util.isDesktop)
|
||||
Stack(
|
||||
children: [
|
||||
TextField(
|
||||
autocorrect: Util.isDesktop ? false : true,
|
||||
enableSuggestions: Util.isDesktop ? false : true,
|
||||
// controller: _lengthController,
|
||||
readOnly: true,
|
||||
textInputAction: TextInputAction.none,
|
||||
),
|
||||
Positioned.fill(
|
||||
child: RawMaterialButton(
|
||||
splashColor:
|
||||
Theme.of(context).extension<StackColors>()!.highlight,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(
|
||||
Constants.size.circularBorderRadius,
|
||||
),
|
||||
),
|
||||
onPressed: chooseUnit,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
left: 12,
|
||||
right: 17,
|
||||
),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
_currentUnit.unitForCoin(widget.coin),
|
||||
style: STextStyles.itemSubtitle12(context),
|
||||
),
|
||||
SvgPicture.asset(
|
||||
Assets.svg.chevronDown,
|
||||
width: 14,
|
||||
height: 6,
|
||||
color: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
.textFieldActiveSearchIconRight,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
SizedBox(
|
||||
height: Util.isDesktop ? 24 : 8,
|
||||
),
|
||||
ClipRRect(
|
||||
borderRadius: BorderRadius.circular(
|
||||
Constants.size.circularBorderRadius,
|
||||
),
|
||||
child: TextField(
|
||||
autocorrect: Util.isDesktop ? false : true,
|
||||
enableSuggestions: Util.isDesktop ? false : true,
|
||||
key: const Key("addCustomNodeNodeNameFieldKey"),
|
||||
controller: _decimalsController,
|
||||
focusNode: _decimalsFocusNode,
|
||||
keyboardType: const TextInputType.numberWithOptions(
|
||||
signed: false,
|
||||
decimal: false,
|
||||
),
|
||||
style: STextStyles.field(context),
|
||||
decoration: standardInputDecoration(
|
||||
"Maximum precision",
|
||||
_decimalsFocusNode,
|
||||
context,
|
||||
).copyWith(
|
||||
labelStyle:
|
||||
Util.isDesktop ? STextStyles.fieldLabel(context) : null,
|
||||
suffixIcon: _decimalsController.text.isNotEmpty
|
||||
? Padding(
|
||||
padding: const EdgeInsets.only(right: 0),
|
||||
child: UnconstrainedBox(
|
||||
child: Row(
|
||||
children: [
|
||||
TextFieldIconButton(
|
||||
child: const XIcon(),
|
||||
onTap: () async {
|
||||
_decimalsController.text = "";
|
||||
setState(() {});
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
)
|
||||
: null,
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 24,
|
||||
),
|
||||
const Spacer(),
|
||||
ConditionalParent(
|
||||
condition: Util.isDesktop,
|
||||
builder: (child) => Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: SecondaryButton(
|
||||
label: "Cancel",
|
||||
buttonHeight: ButtonHeight.l,
|
||||
onPressed: Navigator.of(context).pop,
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 16,
|
||||
),
|
||||
Expanded(
|
||||
child: child,
|
||||
),
|
||||
],
|
||||
),
|
||||
child: PrimaryButton(
|
||||
label: "Save",
|
||||
buttonHeight: Util.isDesktop ? ButtonHeight.l : ButtonHeight.xl,
|
||||
onPressed: onSave,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,176 @@
|
|||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:stackwallet/pages/settings_views/global_settings_view/advanced_views/manage_coin_units/edit_coin_units_view.dart';
|
||||
import 'package:stackwallet/providers/global/prefs_provider.dart';
|
||||
import 'package:stackwallet/themes/coin_icon_provider.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/text_styles.dart';
|
||||
import 'package:stackwallet/utilities/util.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';
|
||||
import 'package:stackwallet/widgets/desktop/desktop_dialog.dart';
|
||||
import 'package:stackwallet/widgets/desktop/desktop_dialog_close_button.dart';
|
||||
import 'package:stackwallet/widgets/rounded_white_container.dart';
|
||||
|
||||
class ManageCoinUnitsView extends ConsumerWidget {
|
||||
const ManageCoinUnitsView({Key? key}) : super(key: key);
|
||||
|
||||
static const String routeName = "/manageCoinUnitsView";
|
||||
|
||||
void onEditPressed(Coin coin, BuildContext context) {
|
||||
if (Util.isDesktop) {
|
||||
showDialog<void>(
|
||||
context: context,
|
||||
builder: (context) => EditCoinUnitsView(coin: coin),
|
||||
);
|
||||
} else {
|
||||
Navigator.of(context).pushNamed(
|
||||
EditCoinUnitsView.routeName,
|
||||
arguments: coin,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
bool showTestNet = ref.watch(
|
||||
prefsChangeNotifierProvider.select((value) => value.showTestNetCoins),
|
||||
);
|
||||
|
||||
final _coins = Coin.values.where((e) => e != Coin.firoTestNet).toList();
|
||||
|
||||
List<Coin> coins = showTestNet
|
||||
? _coins
|
||||
: _coins.sublist(0, _coins.length - kTestNetCoinCount);
|
||||
|
||||
return ConditionalParent(
|
||||
condition: Util.isDesktop,
|
||||
builder: (child) => DesktopDialog(
|
||||
maxHeight: 850,
|
||||
maxWidth: 600,
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 32),
|
||||
child: Text(
|
||||
"Units",
|
||||
style: STextStyles.desktopH3(context),
|
||||
),
|
||||
),
|
||||
const DesktopDialogCloseButton(),
|
||||
],
|
||||
),
|
||||
Expanded(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
left: 32,
|
||||
right: 32,
|
||||
bottom: 32,
|
||||
),
|
||||
child: child,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
child: ConditionalParent(
|
||||
condition: !Util.isDesktop,
|
||||
builder: (child) => Background(
|
||||
child: Scaffold(
|
||||
backgroundColor:
|
||||
Theme.of(context).extension<StackColors>()!.background,
|
||||
appBar: AppBar(
|
||||
leading: AppBarBackButton(
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
title: Text(
|
||||
"Units",
|
||||
style: STextStyles.navBarTitle(context),
|
||||
),
|
||||
),
|
||||
body: child,
|
||||
),
|
||||
),
|
||||
child: ListView.separated(
|
||||
itemCount: Util.isDesktop ? coins.length : coins.length + 2,
|
||||
separatorBuilder: (_, __) => const SizedBox(
|
||||
height: 12,
|
||||
),
|
||||
itemBuilder: (_, index) {
|
||||
if (!Util.isDesktop) {
|
||||
if (index == 0) {
|
||||
return const SizedBox(height: 0);
|
||||
} else if (index > coins.length) {
|
||||
return const SizedBox(height: 10);
|
||||
}
|
||||
}
|
||||
|
||||
final coin = coins[Util.isDesktop ? index : index - 1];
|
||||
return Padding(
|
||||
padding: Util.isDesktop
|
||||
? EdgeInsets.zero
|
||||
: const EdgeInsets.symmetric(
|
||||
horizontal: 16,
|
||||
),
|
||||
child: RoundedWhiteContainer(
|
||||
padding: Util.isDesktop
|
||||
? const EdgeInsets.symmetric(
|
||||
vertical: 16,
|
||||
horizontal: 14,
|
||||
)
|
||||
: const EdgeInsets.all(12),
|
||||
borderColor: Util.isDesktop
|
||||
? Theme.of(context).extension<StackColors>()!.textSubtitle6
|
||||
: null,
|
||||
onPressed: () {
|
||||
onEditPressed(coin, context);
|
||||
},
|
||||
child: Row(
|
||||
children: [
|
||||
SvgPicture.file(
|
||||
File(
|
||||
ref.watch(
|
||||
coinIconProvider(coin),
|
||||
),
|
||||
),
|
||||
width: 24,
|
||||
height: 24,
|
||||
),
|
||||
const SizedBox(
|
||||
width: 12,
|
||||
),
|
||||
Expanded(
|
||||
child: Text(
|
||||
"Edit ${coin.prettyName} units",
|
||||
style: STextStyles.titleBold12(context),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 12,
|
||||
),
|
||||
SvgPicture.asset(
|
||||
Assets.svg.chevronRight,
|
||||
width: Util.isDesktop ? 20 : 14,
|
||||
height: Util.isDesktop ? 20 : 14,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -60,6 +60,10 @@ class _CurrencyViewState extends ConsumerState<BaseCurrencySettingsView> {
|
|||
currenciesWithoutSelected.remove(current);
|
||||
currenciesWithoutSelected.insert(0, current);
|
||||
ref.read(prefsChangeNotifierProvider).currency = current;
|
||||
|
||||
if (ref.read(prefsChangeNotifierProvider).externalCalls) {
|
||||
ref.read(priceAnd24hChangeNotifierProvider).updatePrice();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -160,6 +160,7 @@ class _AddEditNodeViewState extends ConsumerState<AddEditNodeView> {
|
|||
case Coin.bitcoincash:
|
||||
case Coin.litecoin:
|
||||
case Coin.dogecoin:
|
||||
case Coin.eCash:
|
||||
case Coin.firo:
|
||||
case Coin.namecoin:
|
||||
case Coin.particl:
|
||||
|
|
|
@ -16,7 +16,6 @@ import 'package:stackwallet/providers/global/prefs_provider.dart';
|
|||
import 'package:stackwallet/providers/global/secure_store_provider.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart';
|
||||
import 'package:stackwallet/utilities/text_styles.dart';
|
||||
import 'package:stackwallet/widgets/background.dart';
|
||||
|
@ -37,10 +36,11 @@ class ChangePinView extends ConsumerStatefulWidget {
|
|||
class _ChangePinViewState extends ConsumerState<ChangePinView> {
|
||||
BoxDecoration get _pinPutDecoration {
|
||||
return BoxDecoration(
|
||||
color: Theme.of(context).extension<StackColors>()!.textSubtitle2,
|
||||
color: Theme.of(context).extension<StackColors>()!.infoItemIcons,
|
||||
border: Border.all(
|
||||
width: 1,
|
||||
color: Theme.of(context).extension<StackColors>()!.textSubtitle2),
|
||||
color: Theme.of(context).extension<StackColors>()!.infoItemIcons,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(6),
|
||||
);
|
||||
}
|
||||
|
@ -58,6 +58,8 @@ class _ChangePinViewState extends ConsumerState<ChangePinView> {
|
|||
|
||||
late final SecureStorageInterface _secureStore;
|
||||
|
||||
int pinCount = 1;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
_secureStore = ref.read(secureStoreProvider);
|
||||
|
@ -111,7 +113,7 @@ class _ChangePinViewState extends ConsumerState<ChangePinView> {
|
|||
height: 52,
|
||||
),
|
||||
CustomPinPut(
|
||||
fieldsCount: Constants.pinLength,
|
||||
fieldsCount: pinCount,
|
||||
eachFieldHeight: 12,
|
||||
eachFieldWidth: 12,
|
||||
textStyle: STextStyles.label(context).copyWith(
|
||||
|
@ -135,21 +137,18 @@ class _ChangePinViewState extends ConsumerState<ChangePinView> {
|
|||
),
|
||||
isRandom:
|
||||
ref.read(prefsChangeNotifierProvider).randomizePIN,
|
||||
submittedFieldDecoration: _pinPutDecoration.copyWith(
|
||||
color: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
.infoItemIcons,
|
||||
border: Border.all(
|
||||
width: 1,
|
||||
color: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
.infoItemIcons,
|
||||
),
|
||||
),
|
||||
submittedFieldDecoration: _pinPutDecoration,
|
||||
selectedFieldDecoration: _pinPutDecoration,
|
||||
followingFieldDecoration: _pinPutDecoration,
|
||||
onSubmit: (String pin) {
|
||||
if (pin.length == Constants.pinLength) {
|
||||
if (pin.length < 4) {
|
||||
showFloatingFlushBar(
|
||||
type: FlushBarType.warning,
|
||||
message: "PIN not long enough!",
|
||||
iconAsset: Assets.svg.alertCircle,
|
||||
context: context,
|
||||
);
|
||||
} else {
|
||||
_pageController.nextPage(
|
||||
duration: const Duration(milliseconds: 300),
|
||||
curve: Curves.linear,
|
||||
|
@ -175,7 +174,7 @@ class _ChangePinViewState extends ConsumerState<ChangePinView> {
|
|||
height: 52,
|
||||
),
|
||||
CustomPinPut(
|
||||
fieldsCount: Constants.pinLength,
|
||||
fieldsCount: pinCount,
|
||||
eachFieldHeight: 12,
|
||||
eachFieldWidth: 12,
|
||||
textStyle: STextStyles.infoSmall(context).copyWith(
|
||||
|
@ -202,17 +201,7 @@ class _ChangePinViewState extends ConsumerState<ChangePinView> {
|
|||
),
|
||||
isRandom:
|
||||
ref.read(prefsChangeNotifierProvider).randomizePIN,
|
||||
submittedFieldDecoration: _pinPutDecoration.copyWith(
|
||||
color: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
.infoItemIcons,
|
||||
border: Border.all(
|
||||
width: 1,
|
||||
color: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
.infoItemIcons,
|
||||
),
|
||||
),
|
||||
submittedFieldDecoration: _pinPutDecoration,
|
||||
selectedFieldDecoration: _pinPutDecoration,
|
||||
followingFieldDecoration: _pinPutDecoration,
|
||||
onSubmit: (String pin) async {
|
||||
|
|
|
@ -16,8 +16,8 @@ import 'package:flutter_svg/svg.dart';
|
|||
import 'package:stackwallet/providers/providers.dart';
|
||||
import 'package:stackwallet/themes/coin_icon_provider.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/enums/sync_type_enum.dart';
|
||||
import 'package:stackwallet/utilities/text_styles.dart';
|
||||
import 'package:stackwallet/utilities/util.dart';
|
||||
|
@ -157,14 +157,10 @@ class WalletSyncingOptionsView extends ConsumerWidget {
|
|||
height: 2,
|
||||
),
|
||||
Text(
|
||||
"${manager.balance.total.localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider
|
||||
.select(
|
||||
(value) => value.locale,
|
||||
),
|
||||
),
|
||||
)} ${manager.coin.ticker}",
|
||||
ref
|
||||
.watch(pAmountFormatter(
|
||||
manager.coin))
|
||||
.format(manager.balance.total),
|
||||
style:
|
||||
STextStyles.itemSubtitle(context),
|
||||
)
|
||||
|
|
|
@ -20,7 +20,9 @@ import 'package:stackwallet/services/ethereum/cached_eth_token_balance.dart';
|
|||
import 'package:stackwallet/services/ethereum/ethereum_token_service.dart';
|
||||
import 'package:stackwallet/services/transaction_notification_tracker.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
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';
|
||||
|
@ -173,14 +175,10 @@ class _MyTokenSelectItemState extends ConsumerState<MyTokenSelectItem> {
|
|||
),
|
||||
const Spacer(),
|
||||
Text(
|
||||
"${cachedBalance.getCachedBalance().total.localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider.select(
|
||||
(value) => value.locale,
|
||||
ref.watch(pAmountFormatter(Coin.ethereum)).format(
|
||||
cachedBalance.getCachedBalance().total,
|
||||
ethContract: widget.token,
|
||||
),
|
||||
),
|
||||
)} "
|
||||
"${widget.token.symbol}",
|
||||
style: isDesktop
|
||||
? STextStyles.desktopTextExtraSmall(context)
|
||||
.copyWith(
|
||||
|
|
|
@ -29,6 +29,7 @@ import 'package:stackwallet/services/event_bus/events/global/wallet_sync_status_
|
|||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/themes/theme_providers.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
|
@ -96,14 +97,10 @@ class TokenSummary extends ConsumerWidget {
|
|||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Text(
|
||||
"${balance.total.localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider.select(
|
||||
(value) => value.locale,
|
||||
ref.watch(pAmountFormatter(Coin.ethereum)).format(
|
||||
balance.total,
|
||||
ethContract: token,
|
||||
),
|
||||
),
|
||||
)}"
|
||||
" ${token.symbol}",
|
||||
style: STextStyles.pageTitleH1(context).copyWith(
|
||||
color: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
|
@ -128,7 +125,7 @@ class TokenSummary extends ConsumerWidget {
|
|||
),
|
||||
)).toAmount(
|
||||
fractionDigits: 2,
|
||||
).localizedStringAsFixed(
|
||||
).fiatString(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider.select(
|
||||
(value) => value.locale,
|
||||
|
|
|
@ -103,12 +103,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,
|
||||
),
|
||||
|
@ -203,12 +198,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,
|
||||
),
|
||||
|
|
|
@ -17,6 +17,7 @@ import 'package:stackwallet/providers/wallet/wallet_balance_toggle_state_provide
|
|||
import 'package:stackwallet/services/coins/firo/firo_wallet.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/enums/wallet_balance_toggle_state.dart';
|
||||
|
@ -288,13 +289,7 @@ class BalanceSelector<T> extends ConsumerWidget {
|
|||
height: 2,
|
||||
),
|
||||
Text(
|
||||
"${balance.localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider.select(
|
||||
(value) => value.locale,
|
||||
),
|
||||
),
|
||||
)} ${coin.ticker}",
|
||||
ref.watch(pAmountFormatter(coin)).format(balance),
|
||||
style: STextStyles.itemSubtitle12(context).copyWith(
|
||||
color: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
|
|
|
@ -26,6 +26,7 @@ import 'package:stackwallet/services/event_bus/global_event_bus.dart';
|
|||
import 'package:stackwallet/themes/coin_icon_provider.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/enums/wallet_balance_toggle_state.dart';
|
||||
|
@ -160,9 +161,7 @@ class _WalletSummaryInfoState extends ConsumerState<WalletSummaryInfo> {
|
|||
FittedBox(
|
||||
fit: BoxFit.scaleDown,
|
||||
child: SelectableText(
|
||||
"${balanceToShow.localizedStringAsFixed(
|
||||
locale: locale,
|
||||
)} ${coin.ticker}",
|
||||
ref.watch(pAmountFormatter(coin)).format(balanceToShow),
|
||||
style: STextStyles.pageTitleH1(context).copyWith(
|
||||
fontSize: 24,
|
||||
color: Theme.of(context)
|
||||
|
@ -175,7 +174,7 @@ class _WalletSummaryInfoState extends ConsumerState<WalletSummaryInfo> {
|
|||
Text(
|
||||
"${(priceTuple.item1 * balanceToShow.decimal).toAmount(
|
||||
fractionDigits: 2,
|
||||
).localizedStringAsFixed(
|
||||
).fiatString(
|
||||
locale: locale,
|
||||
)} $baseCurrency",
|
||||
style: STextStyles.subtitle500(context).copyWith(
|
||||
|
|
|
@ -25,6 +25,7 @@ import 'package:stackwallet/providers/providers.dart';
|
|||
import 'package:stackwallet/providers/ui/transaction_filter_provider.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
|
@ -968,9 +969,7 @@ class _DesktopTransactionCardRowState
|
|||
builder: (_) {
|
||||
final amount = _transaction.realAmount;
|
||||
return Text(
|
||||
"$prefix${amount.localizedStringAsFixed(
|
||||
locale: locale,
|
||||
)} ${coin.ticker}",
|
||||
"$prefix${ref.watch(pAmountFormatter(coin)).format(amount)}",
|
||||
style: STextStyles.desktopTextExtraExtraSmall(context)
|
||||
.copyWith(
|
||||
color: Theme.of(context)
|
||||
|
@ -992,7 +991,7 @@ class _DesktopTransactionCardRowState
|
|||
return Text(
|
||||
"$prefix${(amount.decimal * price).toAmount(
|
||||
fractionDigits: 2,
|
||||
).localizedStringAsFixed(
|
||||
).fiatString(
|
||||
locale: locale,
|
||||
)} $baseCurrency",
|
||||
style: STextStyles.desktopTextExtraExtraSmall(context),
|
||||
|
|
|
@ -16,6 +16,7 @@ import 'package:flutter/services.dart';
|
|||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:stackwallet/models/isar/models/blockchain_data/transaction.dart';
|
||||
import 'package:stackwallet/models/isar/models/ethereum/eth_contract.dart';
|
||||
import 'package:stackwallet/notifications/show_flush_bar.dart';
|
||||
import 'package:stackwallet/pages/receive_view/addresses/address_details_view.dart';
|
||||
import 'package:stackwallet/pages/wallet_view/sub_widgets/tx_icon.dart';
|
||||
|
@ -29,6 +30,7 @@ import 'package:stackwallet/services/coins/epiccash/epiccash_wallet.dart';
|
|||
import 'package:stackwallet/services/coins/manager.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/block_explorers.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
|
@ -83,6 +85,7 @@ class _TransactionDetailsViewState
|
|||
late final String amountPrefix;
|
||||
late final String unit;
|
||||
late final bool isTokenTx;
|
||||
late final EthContract? ethContract;
|
||||
|
||||
bool showFeePending = false;
|
||||
|
||||
|
@ -104,12 +107,11 @@ class _TransactionDetailsViewState
|
|||
amountPrefix = _transaction.type == TransactionType.outgoing ? "-" : "+";
|
||||
}
|
||||
|
||||
unit = isTokenTx
|
||||
? ref
|
||||
.read(mainDBProvider)
|
||||
.getEthContractSync(_transaction.otherData!)!
|
||||
.symbol
|
||||
: coin.ticker;
|
||||
ethContract = isTokenTx
|
||||
? ref.read(mainDBProvider).getEthContractSync(_transaction.otherData!)
|
||||
: null;
|
||||
|
||||
unit = isTokenTx ? ethContract!.symbol : coin.ticker;
|
||||
|
||||
// if (coin == Coin.firo || coin == Coin.firoTestNet) {
|
||||
// showFeePending = true;
|
||||
|
@ -136,6 +138,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";
|
||||
|
@ -456,13 +489,7 @@ class _TransactionDetailsViewState
|
|||
: CrossAxisAlignment.start,
|
||||
children: [
|
||||
SelectableText(
|
||||
"$amountPrefix${amount.localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider
|
||||
.select((value) =>
|
||||
value.locale),
|
||||
),
|
||||
)} $unit",
|
||||
"$amountPrefix${ref.watch(pAmountFormatter(coin)).format(amount, ethContract: ethContract)}",
|
||||
style: isDesktop
|
||||
? STextStyles
|
||||
.desktopTextExtraExtraSmall(
|
||||
|
@ -496,7 +523,7 @@ class _TransactionDetailsViewState
|
|||
.getPrice(
|
||||
coin)
|
||||
.item1),
|
||||
)).toAmount(fractionDigits: 2).localizedStringAsFixed(
|
||||
)).toAmount(fractionDigits: 2).fiatString(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider
|
||||
.select(
|
||||
|
@ -951,23 +978,17 @@ class _TransactionDetailsViewState
|
|||
currentHeight,
|
||||
coin.requiredConfirmations,
|
||||
)
|
||||
? fee.localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider
|
||||
.select(
|
||||
(value) => value.locale),
|
||||
),
|
||||
? ref
|
||||
.watch(pAmountFormatter(coin))
|
||||
.format(
|
||||
fee,
|
||||
withUnitName: isTokenTx,
|
||||
)
|
||||
: "Pending"
|
||||
: fee.localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider
|
||||
.select((value) => value.locale),
|
||||
),
|
||||
: ref.watch(pAmountFormatter(coin)).format(
|
||||
fee,
|
||||
withUnitName: isTokenTx,
|
||||
);
|
||||
if (isTokenTx) {
|
||||
feeString += " ${coin.ticker}";
|
||||
}
|
||||
|
||||
return Row(
|
||||
mainAxisAlignment:
|
||||
|
@ -1043,6 +1064,7 @@ class _TransactionDetailsViewState
|
|||
final String height;
|
||||
|
||||
if (widget.coin == Coin.bitcoincash ||
|
||||
widget.coin == Coin.eCash ||
|
||||
widget.coin == Coin.bitcoincashTestnet) {
|
||||
height =
|
||||
"${_transaction.height != null && _transaction.height! > 0 ? _transaction.height! : "Pending"}";
|
||||
|
|
|
@ -15,11 +15,11 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||
import 'package:flutter_rounded_date_picker/flutter_rounded_date_picker.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:stackwallet/models/transaction_filter.dart';
|
||||
import 'package:stackwallet/providers/providers.dart';
|
||||
import 'package:stackwallet/providers/ui/transaction_filter_provider.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/themes/theme_providers.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
|
@ -86,11 +86,12 @@ class _TransactionSearchViewState
|
|||
_toDateString =
|
||||
_selectedToDate == null ? "" : Format.formatDate(_selectedToDate!);
|
||||
|
||||
final String amount = filterState.amount?.localizedStringAsFixed(
|
||||
locale: ref.read(localeServiceChangeNotifierProvider).locale,
|
||||
decimalPlaces: widget.coin.decimals,
|
||||
) ??
|
||||
"";
|
||||
final String amount = filterState.amount == null
|
||||
? ""
|
||||
: ref.read(pAmountFormatter(widget.coin)).format(
|
||||
filterState.amount!,
|
||||
withUnitName: false,
|
||||
);
|
||||
|
||||
_amountTextEditingController.text = amount;
|
||||
}
|
||||
|
|
|
@ -16,10 +16,11 @@ import 'package:flutter_svg/flutter_svg.dart';
|
|||
import 'package:stackwallet/pages/wallet_view/wallet_view.dart';
|
||||
import 'package:stackwallet/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart';
|
||||
import 'package:stackwallet/providers/providers.dart';
|
||||
import 'package:stackwallet/services/coins/manager.dart';
|
||||
import 'package:stackwallet/services/coins/firo/firo_wallet.dart';
|
||||
import 'package:stackwallet/themes/coin_icon_provider.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
|
@ -34,13 +35,11 @@ class FavoriteCard extends ConsumerStatefulWidget {
|
|||
required this.walletId,
|
||||
required this.width,
|
||||
required this.height,
|
||||
required this.managerProvider,
|
||||
}) : super(key: key);
|
||||
|
||||
final String walletId;
|
||||
final double width;
|
||||
final double height;
|
||||
final ChangeNotifierProvider<Manager> managerProvider;
|
||||
|
||||
@override
|
||||
ConsumerState<FavoriteCard> createState() => _FavoriteCardState();
|
||||
|
@ -48,15 +47,10 @@ class FavoriteCard extends ConsumerStatefulWidget {
|
|||
|
||||
class _FavoriteCardState extends ConsumerState<FavoriteCard> {
|
||||
late final String walletId;
|
||||
late final ChangeNotifierProvider<Manager> managerProvider;
|
||||
|
||||
Amount _cachedBalance = Amount.zero;
|
||||
Amount _cachedFiatValue = Amount.zero;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
walletId = widget.walletId;
|
||||
managerProvider = widget.managerProvider;
|
||||
|
||||
super.initState();
|
||||
}
|
||||
|
@ -65,9 +59,13 @@ class _FavoriteCardState extends ConsumerState<FavoriteCard> {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final coin = ref.watch(managerProvider.select((value) => value.coin));
|
||||
final coin = ref.watch(
|
||||
walletsChangeNotifierProvider
|
||||
.select((value) => value.getManager(walletId).coin),
|
||||
);
|
||||
final externalCalls = ref.watch(
|
||||
prefsChangeNotifierProvider.select((value) => value.externalCalls));
|
||||
prefsChangeNotifierProvider.select((value) => value.externalCalls),
|
||||
);
|
||||
|
||||
return ConditionalParent(
|
||||
condition: Util.isDesktop,
|
||||
|
@ -119,7 +117,10 @@ class _FavoriteCardState extends ConsumerState<FavoriteCard> {
|
|||
child: GestureDetector(
|
||||
onTap: () async {
|
||||
if (coin == Coin.monero || coin == Coin.wownero) {
|
||||
await ref.read(managerProvider).initializeExisting();
|
||||
await ref
|
||||
.read(walletsChangeNotifierProvider)
|
||||
.getManager(walletId)
|
||||
.initializeExisting();
|
||||
}
|
||||
if (mounted) {
|
||||
if (Util.isDesktop) {
|
||||
|
@ -132,7 +133,9 @@ class _FavoriteCardState extends ConsumerState<FavoriteCard> {
|
|||
WalletView.routeName,
|
||||
arguments: Tuple2(
|
||||
walletId,
|
||||
managerProvider,
|
||||
ref
|
||||
.read(walletsChangeNotifierProvider)
|
||||
.getManagerProvider(walletId),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
@ -215,8 +218,12 @@ class _FavoriteCardState extends ConsumerState<FavoriteCard> {
|
|||
children: [
|
||||
Expanded(
|
||||
child: Text(
|
||||
ref.watch(managerProvider
|
||||
.select((value) => value.walletName)),
|
||||
ref.watch(
|
||||
walletsChangeNotifierProvider.select(
|
||||
(value) =>
|
||||
value.getManager(walletId).walletName,
|
||||
),
|
||||
),
|
||||
style: STextStyles.itemSubtitle12(context).copyWith(
|
||||
color: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
|
@ -235,42 +242,48 @@ class _FavoriteCardState extends ConsumerState<FavoriteCard> {
|
|||
],
|
||||
),
|
||||
),
|
||||
FutureBuilder(
|
||||
future: Future(() => ref.watch(managerProvider
|
||||
.select((value) => value.balance.total))),
|
||||
builder: (builderContext, AsyncSnapshot<Amount> snapshot) {
|
||||
if (snapshot.connectionState == ConnectionState.done &&
|
||||
snapshot.hasData) {
|
||||
if (snapshot.data != null) {
|
||||
_cachedBalance = snapshot.data!;
|
||||
if (externalCalls && _cachedBalance > Amount.zero) {
|
||||
_cachedFiatValue = (_cachedBalance.decimal *
|
||||
Builder(
|
||||
builder: (context) {
|
||||
final balance = ref.watch(
|
||||
walletsChangeNotifierProvider.select(
|
||||
(value) => value.getManager(walletId).balance,
|
||||
),
|
||||
);
|
||||
|
||||
Amount total = balance.total;
|
||||
if (coin == Coin.firo || coin == Coin.firoTestNet) {
|
||||
final balancePrivate = ref.watch(
|
||||
walletsChangeNotifierProvider.select(
|
||||
(value) => (value.getManager(walletId).wallet
|
||||
as FiroWallet)
|
||||
.balancePrivate,
|
||||
),
|
||||
);
|
||||
|
||||
total += balancePrivate.total;
|
||||
}
|
||||
|
||||
Amount fiatTotal = Amount.zero;
|
||||
|
||||
if (externalCalls && total > Amount.zero) {
|
||||
fiatTotal = (total.decimal *
|
||||
ref
|
||||
.watch(
|
||||
priceAnd24hChangeNotifierProvider
|
||||
.select(
|
||||
priceAnd24hChangeNotifierProvider.select(
|
||||
(value) => value.getPrice(coin),
|
||||
),
|
||||
)
|
||||
.item1)
|
||||
.toAmount(fractionDigits: 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
FittedBox(
|
||||
fit: BoxFit.scaleDown,
|
||||
child: Text(
|
||||
"${_cachedBalance.localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider
|
||||
.select((value) => value.locale),
|
||||
),
|
||||
decimalPlaces: ref.watch(managerProvider
|
||||
.select((value) => value.coin.decimals)),
|
||||
)} ${coin.ticker}",
|
||||
ref.watch(pAmountFormatter(coin)).format(total),
|
||||
style: STextStyles.titleBold12(context).copyWith(
|
||||
fontSize: 16,
|
||||
color: Theme.of(context)
|
||||
|
@ -285,15 +298,16 @@ class _FavoriteCardState extends ConsumerState<FavoriteCard> {
|
|||
),
|
||||
if (externalCalls)
|
||||
Text(
|
||||
"${_cachedFiatValue.localizedStringAsFixed(
|
||||
"${fiatTotal.fiatString(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider
|
||||
.select((value) => value.locale),
|
||||
localeServiceChangeNotifierProvider.select(
|
||||
(value) => value.locale,
|
||||
),
|
||||
),
|
||||
decimalPlaces: 2,
|
||||
)} ${ref.watch(
|
||||
prefsChangeNotifierProvider
|
||||
.select((value) => value.currency),
|
||||
prefsChangeNotifierProvider.select(
|
||||
(value) => value.currency,
|
||||
),
|
||||
)}",
|
||||
style:
|
||||
STextStyles.itemSubtitle12(context).copyWith(
|
||||
|
|
|
@ -221,7 +221,6 @@ class _FavoriteWalletsState extends ConsumerState<FavoriteWallets> {
|
|||
child: FavoriteCard(
|
||||
key: Key("favCard_$walletId"),
|
||||
walletId: walletId!,
|
||||
managerProvider: managerProvider!,
|
||||
width: cardWidth,
|
||||
height: cardHeight,
|
||||
),
|
||||
|
@ -229,7 +228,6 @@ class _FavoriteWalletsState extends ConsumerState<FavoriteWallets> {
|
|||
: FavoriteCard(
|
||||
key: Key("favCard_$walletId"),
|
||||
walletId: walletId!,
|
||||
managerProvider: managerProvider!,
|
||||
width: cardWidth,
|
||||
height: cardHeight,
|
||||
)
|
||||
|
|
|
@ -108,10 +108,10 @@ class WalletListItem extends ConsumerWidget {
|
|||
final calls =
|
||||
ref.watch(prefsChangeNotifierProvider).externalCalls;
|
||||
|
||||
final priceString = tuple.item1
|
||||
.toAmount(fractionDigits: 2)
|
||||
.localizedStringAsFixed(
|
||||
locale: ref.watch(localeServiceChangeNotifierProvider
|
||||
final priceString =
|
||||
tuple.item1.toAmount(fractionDigits: 2).fiatString(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider
|
||||
.select((value) => value.locale)),
|
||||
);
|
||||
|
||||
|
|
|
@ -14,10 +14,10 @@ import 'package:isar/isar.dart';
|
|||
import 'package:stackwallet/db/isar/main_db.dart';
|
||||
import 'package:stackwallet/models/isar/models/isar_models.dart';
|
||||
import 'package:stackwallet/pages/coin_control/utxo_details_view.dart';
|
||||
import 'package:stackwallet/providers/global/locale_provider.dart';
|
||||
import 'package:stackwallet/providers/global/wallets_provider.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/text_styles.dart';
|
||||
import 'package:stackwallet/widgets/conditional_parent.dart';
|
||||
|
@ -154,16 +154,12 @@ class _UtxoRowState extends ConsumerState<UtxoRow> {
|
|||
),
|
||||
if (!widget.compact)
|
||||
Text(
|
||||
"${Amount(
|
||||
ref.watch(pAmountFormatter(coin)).format(
|
||||
Amount(
|
||||
rawValue: BigInt.from(utxo.value),
|
||||
fractionDigits: coin.decimals,
|
||||
).localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider.select(
|
||||
(value) => value.locale,
|
||||
),
|
||||
),
|
||||
)} ${coin.ticker}",
|
||||
textAlign: TextAlign.right,
|
||||
style: STextStyles.w600_14(context),
|
||||
),
|
||||
|
@ -180,16 +176,12 @@ class _UtxoRowState extends ConsumerState<UtxoRow> {
|
|||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Text(
|
||||
"${Amount(
|
||||
ref.watch(pAmountFormatter(coin)).format(
|
||||
Amount(
|
||||
rawValue: BigInt.from(utxo.value),
|
||||
fractionDigits: coin.decimals,
|
||||
).localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider.select(
|
||||
(value) => value.locale,
|
||||
),
|
||||
),
|
||||
)} ${coin.ticker}",
|
||||
textAlign: TextAlign.right,
|
||||
style: STextStyles.w600_14(context),
|
||||
),
|
||||
|
|
|
@ -15,6 +15,7 @@ import 'package:stackwallet/providers/providers.dart';
|
|||
import 'package:stackwallet/services/coins/firo/firo_wallet.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
|
@ -289,8 +290,6 @@ class _BalanceDisplay extends ConsumerWidget {
|
|||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final manager = ref.watch(walletsChangeNotifierProvider
|
||||
.select((value) => value.getManager(walletId)));
|
||||
final locale = ref.watch(
|
||||
localeServiceChangeNotifierProvider.select((value) => value.locale));
|
||||
|
||||
Amount total = manager.balance.total;
|
||||
if (manager.coin == Coin.firo || manager.coin == Coin.firoTestNet) {
|
||||
|
@ -299,8 +298,7 @@ class _BalanceDisplay extends ConsumerWidget {
|
|||
}
|
||||
|
||||
return Text(
|
||||
"${total.localizedStringAsFixed(locale: locale)} "
|
||||
"${manager.coin.ticker}",
|
||||
ref.watch(pAmountFormatter(manager.coin)).format(total),
|
||||
style: STextStyles.desktopTextExtraSmall(context).copyWith(
|
||||
color: Theme.of(context).extension<StackColors>()!.textSubtitle1,
|
||||
),
|
||||
|
|
|
@ -84,7 +84,6 @@ class DesktopFavoriteWallets extends ConsumerWidget {
|
|||
key: Key(walletName),
|
||||
width: cardWidth,
|
||||
height: cardHeight,
|
||||
managerProvider: managerProvider,
|
||||
);
|
||||
})
|
||||
],
|
||||
|
|
|
@ -25,6 +25,7 @@ import 'package:stackwallet/services/coins/firo/firo_wallet.dart';
|
|||
import 'package:stackwallet/themes/coin_icon_provider.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/barcode_scanner_interface.dart';
|
||||
import 'package:stackwallet/utilities/clipboard_interface.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
|
@ -134,15 +135,24 @@ class _DesktopPaynymSendDialogState
|
|||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
Text(
|
||||
"${!isFiro ? manager.balance.spendable.localizedStringAsFixed(
|
||||
locale: locale,
|
||||
) : ref.watch(
|
||||
publicPrivateBalanceStateProvider.state,
|
||||
).state == "Private" ? (manager.wallet as FiroWallet).availablePrivateBalance().localizedStringAsFixed(
|
||||
locale: locale,
|
||||
) : (manager.wallet as FiroWallet).availablePublicBalance().localizedStringAsFixed(
|
||||
locale: locale,
|
||||
)} ${coin.ticker}",
|
||||
!isFiro
|
||||
? ref
|
||||
.watch(pAmountFormatter(coin))
|
||||
.format(manager.balance.spendable)
|
||||
: ref
|
||||
.watch(
|
||||
publicPrivateBalanceStateProvider
|
||||
.state,
|
||||
)
|
||||
.state ==
|
||||
"Private"
|
||||
? ref.watch(pAmountFormatter(coin)).format(
|
||||
(manager.wallet as FiroWallet)
|
||||
.availablePrivateBalance())
|
||||
: ref.watch(pAmountFormatter(coin)).format(
|
||||
(manager.wallet as FiroWallet)
|
||||
.availablePublicBalance(),
|
||||
),
|
||||
style: STextStyles.titleBold12(context),
|
||||
textAlign: TextAlign.right,
|
||||
),
|
||||
|
@ -150,7 +160,15 @@ class _DesktopPaynymSendDialogState
|
|||
height: 2,
|
||||
),
|
||||
Text(
|
||||
"${((!isFiro ? manager.balance.spendable.decimal : ref.watch(publicPrivateBalanceStateProvider.state).state == "Private" ? (manager.wallet as FiroWallet).availablePrivateBalance().decimal : (manager.wallet as FiroWallet).availablePublicBalance().decimal) * ref.watch(priceAnd24hChangeNotifierProvider.select((value) => value.getPrice(coin).item1))).toAmount(fractionDigits: 2).localizedStringAsFixed(locale: locale)} ${ref.watch(prefsChangeNotifierProvider.select((value) => value.currency))}",
|
||||
"${((!isFiro ? manager.balance.spendable.decimal : ref.watch(publicPrivateBalanceStateProvider.state).state == "Private" ? (manager.wallet as FiroWallet).availablePrivateBalance().decimal : (manager.wallet as FiroWallet).availablePublicBalance().decimal) * ref.watch(
|
||||
priceAnd24hChangeNotifierProvider.select(
|
||||
(value) => value.getPrice(coin).item1,
|
||||
),
|
||||
)).toAmount(fractionDigits: 2).fiatString(
|
||||
locale: locale,
|
||||
)} ${ref.watch(prefsChangeNotifierProvider.select(
|
||||
(value) => value.currency,
|
||||
))}",
|
||||
style: STextStyles.baseXS(context).copyWith(
|
||||
color: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
|
|
|
@ -224,13 +224,12 @@ class TablePriceInfo extends ConsumerWidget {
|
|||
final priceString = Amount.fromDecimal(
|
||||
tuple.item1,
|
||||
fractionDigits: 2,
|
||||
).localizedStringAsFixed(
|
||||
).fiatString(
|
||||
locale: ref
|
||||
.watch(
|
||||
localeServiceChangeNotifierProvider.notifier,
|
||||
)
|
||||
.locale,
|
||||
decimalPlaces: 2,
|
||||
);
|
||||
|
||||
final double percentChange = tuple.item2;
|
||||
|
|
|
@ -22,6 +22,7 @@ import 'package:stackwallet/providers/wallet/public_private_balance_state_provid
|
|||
import 'package:stackwallet/services/coins/firo/firo_wallet.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
|
@ -370,10 +371,10 @@ class FeeDropDownChild extends ConsumerWidget {
|
|||
children: [
|
||||
Text(
|
||||
"${feeRateType.prettyName} "
|
||||
"(~${snapshot.data!.decimal.toStringAsFixed(
|
||||
manager.coin.decimals,
|
||||
)} "
|
||||
"${manager.coin.ticker})",
|
||||
"(~${ref.watch(pAmountFormatter(manager.coin)).format(
|
||||
snapshot.data!,
|
||||
indicatePrecisionLoss: false,
|
||||
)})",
|
||||
style:
|
||||
STextStyles.desktopTextExtraExtraSmall(context).copyWith(
|
||||
color: Theme.of(context)
|
||||
|
|
|
@ -37,6 +37,8 @@ import 'package:stackwallet/services/mixins/paynym_wallet_interface.dart';
|
|||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/address_utils.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_unit.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/barcode_scanner_interface.dart';
|
||||
import 'package:stackwallet/utilities/clipboard_interface.dart';
|
||||
|
@ -439,14 +441,25 @@ class _DesktopSendState extends ConsumerState<DesktopSend> {
|
|||
|
||||
void _cryptoAmountChanged() async {
|
||||
if (!_cryptoAmountChangeLock) {
|
||||
final String cryptoAmount = cryptoAmountController.text;
|
||||
String cryptoAmount = cryptoAmountController.text;
|
||||
if (cryptoAmount.isNotEmpty &&
|
||||
cryptoAmount != "." &&
|
||||
cryptoAmount != ",") {
|
||||
if (cryptoAmount.startsWith("~")) {
|
||||
cryptoAmount = cryptoAmount.substring(1);
|
||||
}
|
||||
if (cryptoAmount.contains(" ")) {
|
||||
cryptoAmount = cryptoAmount.split(" ").first;
|
||||
}
|
||||
|
||||
final shift = ref.read(pAmountUnit(coin)).shift;
|
||||
|
||||
_amountToSend = cryptoAmount.contains(",")
|
||||
? Decimal.parse(cryptoAmount.replaceFirst(",", "."))
|
||||
.shift(0 - shift)
|
||||
.toAmount(fractionDigits: coin.decimals)
|
||||
: Decimal.parse(cryptoAmount)
|
||||
.shift(0 - shift)
|
||||
.toAmount(fractionDigits: coin.decimals);
|
||||
if (_cachedAmountToSend != null &&
|
||||
_cachedAmountToSend == _amountToSend) {
|
||||
|
@ -462,7 +475,7 @@ class _DesktopSendState extends ConsumerState<DesktopSend> {
|
|||
if (price > Decimal.zero) {
|
||||
final String fiatAmountString = (_amountToSend!.decimal * price)
|
||||
.toAmount(fractionDigits: 2)
|
||||
.localizedStringAsFixed(
|
||||
.fiatString(
|
||||
locale: ref.read(localeServiceChangeNotifierProvider).locale,
|
||||
);
|
||||
|
||||
|
@ -516,10 +529,7 @@ class _DesktopSendState extends ConsumerState<DesktopSend> {
|
|||
} else {
|
||||
balance = wallet.availablePublicBalance();
|
||||
}
|
||||
return balance.localizedStringAsFixed(
|
||||
locale: locale,
|
||||
decimalPlaces: coin.decimals,
|
||||
);
|
||||
return ref.read(pAmountFormatter(coin)).format(balance);
|
||||
}
|
||||
|
||||
return null;
|
||||
|
@ -539,12 +549,12 @@ class _DesktopSendState extends ConsumerState<DesktopSend> {
|
|||
}
|
||||
if (private && _privateBalanceString != null) {
|
||||
return Text(
|
||||
"$_privateBalanceString ${coin.ticker}",
|
||||
"$_privateBalanceString",
|
||||
style: STextStyles.itemSubtitle(context),
|
||||
);
|
||||
} else if (!private && _publicBalanceString != null) {
|
||||
return Text(
|
||||
"$_publicBalanceString ${coin.ticker}",
|
||||
"$_publicBalanceString",
|
||||
style: STextStyles.itemSubtitle(context),
|
||||
);
|
||||
} else {
|
||||
|
@ -593,11 +603,9 @@ class _DesktopSendState extends ConsumerState<DesktopSend> {
|
|||
final amount = Decimal.parse(results["amount"]!).toAmount(
|
||||
fractionDigits: coin.decimals,
|
||||
);
|
||||
cryptoAmountController.text = amount.localizedStringAsFixed(
|
||||
locale: ref.read(localeServiceChangeNotifierProvider).locale,
|
||||
decimalPlaces: Constants.decimalPlacesForCoin(coin),
|
||||
);
|
||||
amount.toString();
|
||||
cryptoAmountController.text = ref
|
||||
.read(pAmountFormatter(coin))
|
||||
.format(amount, withUnitName: false);
|
||||
_amountToSend = amount;
|
||||
}
|
||||
|
||||
|
@ -679,9 +687,9 @@ class _DesktopSendState extends ConsumerState<DesktopSend> {
|
|||
Logging.instance.log("it changed $_amountToSend $_cachedAmountToSend",
|
||||
level: LogLevel.Info);
|
||||
|
||||
final amountString = _amountToSend!.localizedStringAsFixed(
|
||||
locale: ref.read(localeServiceChangeNotifierProvider).locale,
|
||||
decimalPlaces: coin.decimals,
|
||||
final amountString = ref.read(pAmountFormatter(coin)).format(
|
||||
_amountToSend!,
|
||||
withUnitName: false,
|
||||
);
|
||||
|
||||
_cryptoAmountChangeLock = true;
|
||||
|
@ -1057,7 +1065,7 @@ class _DesktopSendState extends ConsumerState<DesktopSend> {
|
|||
child: Padding(
|
||||
padding: const EdgeInsets.all(12),
|
||||
child: Text(
|
||||
coin.ticker,
|
||||
ref.watch(pAmountUnit(coin)).unitForCoin(coin),
|
||||
style: STextStyles.smallMed14(context).copyWith(
|
||||
color: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
|
|
|
@ -30,6 +30,7 @@ import 'package:stackwallet/services/coins/manager.dart';
|
|||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/address_utils.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/barcode_scanner_interface.dart';
|
||||
import 'package:stackwallet/utilities/clipboard_interface.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
|
@ -393,9 +394,8 @@ class _DesktopTokenSendState extends ConsumerState<DesktopTokenSend> {
|
|||
final String fiatAmountString = Amount.fromDecimal(
|
||||
_amountToSend!.decimal * price,
|
||||
fractionDigits: 2,
|
||||
).localizedStringAsFixed(
|
||||
).fiatString(
|
||||
locale: ref.read(localeServiceChangeNotifierProvider).locale,
|
||||
decimalPlaces: 2,
|
||||
);
|
||||
|
||||
baseAmountController.text = fiatAmountString;
|
||||
|
@ -463,11 +463,11 @@ class _DesktopTokenSendState extends ConsumerState<DesktopTokenSend> {
|
|||
fractionDigits:
|
||||
ref.read(tokenServiceProvider)!.tokenContract.decimals,
|
||||
);
|
||||
cryptoAmountController.text = amount.localizedStringAsFixed(
|
||||
locale: ref.read(localeServiceChangeNotifierProvider).locale,
|
||||
cryptoAmountController.text = ref.read(pAmountFormatter(coin)).format(
|
||||
amount,
|
||||
withUnitName: false,
|
||||
);
|
||||
|
||||
amount.toString();
|
||||
_amountToSend = amount;
|
||||
}
|
||||
|
||||
|
@ -551,9 +551,10 @@ class _DesktopTokenSendState extends ConsumerState<DesktopTokenSend> {
|
|||
Logging.instance.log("it changed $_amountToSend $_cachedAmountToSend",
|
||||
level: LogLevel.Info);
|
||||
|
||||
final amountString = _amountToSend!.localizedStringAsFixed(
|
||||
locale: ref.read(localeServiceChangeNotifierProvider).locale,
|
||||
decimalPlaces: tokenDecimals,
|
||||
final amountString = ref.read(pAmountFormatter(coin)).format(
|
||||
_amountToSend!,
|
||||
withUnitName: false,
|
||||
ethContract: ref.read(tokenServiceProvider)!.tokenContract,
|
||||
);
|
||||
|
||||
_cryptoAmountChangeLock = true;
|
||||
|
|
|
@ -20,6 +20,7 @@ import 'package:stackwallet/services/coins/firo/firo_wallet.dart';
|
|||
import 'package:stackwallet/services/event_bus/events/global/wallet_sync_status_changed_event.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/enums/wallet_balance_toggle_state.dart';
|
||||
import 'package:stackwallet/utilities/text_styles.dart';
|
||||
|
@ -70,10 +71,14 @@ class _WDesktopWalletSummaryState extends ConsumerState<DesktopWalletSummary> {
|
|||
final baseCurrency = ref
|
||||
.watch(prefsChangeNotifierProvider.select((value) => value.currency));
|
||||
|
||||
final tokenContract = widget.isToken
|
||||
? ref
|
||||
.watch(tokenServiceProvider.select((value) => value!.tokenContract))
|
||||
: null;
|
||||
|
||||
final priceTuple = widget.isToken
|
||||
? ref.watch(priceAnd24hChangeNotifierProvider.select((value) =>
|
||||
value.getTokenPrice(ref.watch(tokenServiceProvider
|
||||
.select((value) => value!.tokenContract.address)))))
|
||||
? ref.watch(priceAnd24hChangeNotifierProvider
|
||||
.select((value) => value.getTokenPrice(tokenContract!.address)))
|
||||
: ref.watch(priceAnd24hChangeNotifierProvider
|
||||
.select((value) => value.getPrice(coin)));
|
||||
|
||||
|
@ -81,15 +86,6 @@ class _WDesktopWalletSummaryState extends ConsumerState<DesktopWalletSummary> {
|
|||
ref.watch(walletBalanceToggleStateProvider.state).state ==
|
||||
WalletBalanceToggleState.available;
|
||||
|
||||
final unit = widget.isToken
|
||||
? ref.watch(
|
||||
tokenServiceProvider.select((value) => value!.tokenContract.symbol))
|
||||
: coin.ticker;
|
||||
final decimalPlaces = widget.isToken
|
||||
? ref.watch(tokenServiceProvider
|
||||
.select((value) => value!.tokenContract.decimals))
|
||||
: coin.decimals;
|
||||
|
||||
Balance balance = widget.isToken
|
||||
? ref.watch(tokenServiceProvider.select((value) => value!.balance))
|
||||
: ref.watch(walletsChangeNotifierProvider
|
||||
|
@ -134,10 +130,9 @@ class _WDesktopWalletSummaryState extends ConsumerState<DesktopWalletSummary> {
|
|||
FittedBox(
|
||||
fit: BoxFit.scaleDown,
|
||||
child: Text(
|
||||
"${balanceToShow.localizedStringAsFixed(
|
||||
locale: locale,
|
||||
decimalPlaces: decimalPlaces,
|
||||
)} $unit",
|
||||
ref
|
||||
.watch(pAmountFormatter(coin))
|
||||
.format(balanceToShow, ethContract: tokenContract),
|
||||
style: STextStyles.desktopH3(context),
|
||||
),
|
||||
),
|
||||
|
@ -146,9 +141,8 @@ class _WDesktopWalletSummaryState extends ConsumerState<DesktopWalletSummary> {
|
|||
"${Amount.fromDecimal(
|
||||
priceTuple.item1 * balanceToShow.decimal,
|
||||
fractionDigits: 2,
|
||||
).localizedStringAsFixed(
|
||||
).fiatString(
|
||||
locale: locale,
|
||||
decimalPlaces: 2,
|
||||
)} $baseCurrency",
|
||||
style: STextStyles.desktopTextExtraSmall(context).copyWith(
|
||||
color: Theme.of(context)
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:stackwallet/pages/settings_views/global_settings_view/advanced_views/manage_coin_units/manage_coin_units_view.dart';
|
||||
import 'package:stackwallet/pages_desktop_specific/settings/settings_menu/advanced_settings/debug_info_dialog.dart';
|
||||
import 'package:stackwallet/pages_desktop_specific/settings/settings_menu/advanced_settings/desktop_manage_block_explorers_dialog.dart';
|
||||
import 'package:stackwallet/pages_desktop_specific/settings/settings_menu/advanced_settings/stack_privacy_dialog.dart';
|
||||
|
@ -288,6 +289,47 @@ class _AdvancedSettings extends ConsumerState<AdvancedSettings> {
|
|||
],
|
||||
),
|
||||
),
|
||||
const Padding(
|
||||
padding: EdgeInsets.all(10.0),
|
||||
child: Divider(
|
||||
thickness: 0.5,
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(10),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
"Units",
|
||||
style: STextStyles.desktopTextExtraSmall(context)
|
||||
.copyWith(
|
||||
color: Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
.textDark),
|
||||
textAlign: TextAlign.left,
|
||||
),
|
||||
PrimaryButton(
|
||||
buttonHeight: ButtonHeight.xs,
|
||||
label: "Edit",
|
||||
width: 101,
|
||||
onPressed: () async {
|
||||
await showDialog<dynamic>(
|
||||
context: context,
|
||||
useSafeArea: false,
|
||||
barrierDismissible: true,
|
||||
builder: (context) {
|
||||
return const ManageCoinUnitsView();
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 10,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
|
@ -72,6 +72,8 @@ import 'package:stackwallet/pages/send_view/token_send_view.dart';
|
|||
import 'package:stackwallet/pages/settings_views/global_settings_view/about_view.dart';
|
||||
import 'package:stackwallet/pages/settings_views/global_settings_view/advanced_views/advanced_settings_view.dart';
|
||||
import 'package:stackwallet/pages/settings_views/global_settings_view/advanced_views/debug_view.dart';
|
||||
import 'package:stackwallet/pages/settings_views/global_settings_view/advanced_views/manage_coin_units/edit_coin_units_view.dart';
|
||||
import 'package:stackwallet/pages/settings_views/global_settings_view/advanced_views/manage_coin_units/manage_coin_units_view.dart';
|
||||
import 'package:stackwallet/pages/settings_views/global_settings_view/advanced_views/manage_explorer_view.dart';
|
||||
import 'package:stackwallet/pages/settings_views/global_settings_view/appearance_settings/appearance_settings_view.dart';
|
||||
import 'package:stackwallet/pages/settings_views/global_settings_view/appearance_settings/manage_themes.dart';
|
||||
|
@ -642,6 +644,26 @@ class RouteGenerator {
|
|||
}
|
||||
return _routeError("${settings.name} invalid args: ${args.toString()}");
|
||||
|
||||
case ManageCoinUnitsView.routeName:
|
||||
return getRoute(
|
||||
shouldUseMaterialRoute: useMaterialPageRoute,
|
||||
builder: (_) => const ManageCoinUnitsView(),
|
||||
settings: RouteSettings(name: settings.name));
|
||||
|
||||
case EditCoinUnitsView.routeName:
|
||||
if (args is Coin) {
|
||||
return getRoute(
|
||||
shouldUseMaterialRoute: useMaterialPageRoute,
|
||||
builder: (_) => EditCoinUnitsView(
|
||||
coin: args,
|
||||
),
|
||||
settings: RouteSettings(
|
||||
name: settings.name,
|
||||
),
|
||||
);
|
||||
}
|
||||
return _routeError("${settings.name} invalid args: ${args.toString()}");
|
||||
|
||||
case CreateBackupInfoView.routeName:
|
||||
return getRoute(
|
||||
shouldUseMaterialRoute: useMaterialPageRoute,
|
||||
|
|
|
@ -1211,13 +1211,18 @@ class BitcoinWallet extends CoinServiceAPI
|
|||
|
||||
void _periodicPingCheck() async {
|
||||
bool hasNetwork = await testNetworkConnection();
|
||||
_isConnected = hasNetwork;
|
||||
|
||||
if (_isConnected != hasNetwork) {
|
||||
NodeConnectionStatus status = hasNetwork
|
||||
? NodeConnectionStatus.connected
|
||||
: NodeConnectionStatus.disconnected;
|
||||
GlobalEventBus.instance
|
||||
.fire(NodeConnectionStatusChangedEvent(status, walletId, coin));
|
||||
|
||||
_isConnected = hasNetwork;
|
||||
if (hasNetwork) {
|
||||
unawaited(refresh());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1298,6 +1303,7 @@ class BitcoinWallet extends CoinServiceAPI
|
|||
nonce: null,
|
||||
inputs: [],
|
||||
outputs: [],
|
||||
numberOfMessages: null,
|
||||
);
|
||||
|
||||
final address = txData["address"] is String
|
||||
|
@ -1352,16 +1358,14 @@ class BitcoinWallet extends CoinServiceAPI
|
|||
))
|
||||
.toList();
|
||||
final newNode = await getCurrentNode();
|
||||
_cachedElectrumXClient = CachedElectrumX.from(
|
||||
node: newNode,
|
||||
prefs: _prefs,
|
||||
failovers: failovers,
|
||||
);
|
||||
_electrumXClient = ElectrumX.from(
|
||||
node: newNode,
|
||||
prefs: _prefs,
|
||||
failovers: failovers,
|
||||
);
|
||||
_cachedElectrumXClient = CachedElectrumX.from(
|
||||
electrumXClient: _electrumXClient,
|
||||
);
|
||||
|
||||
if (shouldRefresh) {
|
||||
unawaited(refresh());
|
||||
|
|
|
@ -1082,13 +1082,18 @@ class BitcoinCashWallet extends CoinServiceAPI
|
|||
|
||||
void _periodicPingCheck() async {
|
||||
bool hasNetwork = await testNetworkConnection();
|
||||
_isConnected = hasNetwork;
|
||||
|
||||
if (_isConnected != hasNetwork) {
|
||||
NodeConnectionStatus status = hasNetwork
|
||||
? NodeConnectionStatus.connected
|
||||
: NodeConnectionStatus.disconnected;
|
||||
GlobalEventBus.instance
|
||||
.fire(NodeConnectionStatusChangedEvent(status, walletId, coin));
|
||||
|
||||
_isConnected = hasNetwork;
|
||||
if (hasNetwork) {
|
||||
unawaited(refresh());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1163,6 +1168,7 @@ class BitcoinCashWallet extends CoinServiceAPI
|
|||
nonce: null,
|
||||
inputs: [],
|
||||
outputs: [],
|
||||
numberOfMessages: null,
|
||||
);
|
||||
|
||||
final address = txData["address"] is String
|
||||
|
@ -1244,16 +1250,14 @@ class BitcoinCashWallet extends CoinServiceAPI
|
|||
))
|
||||
.toList();
|
||||
final newNode = await getCurrentNode();
|
||||
_cachedElectrumXClient = CachedElectrumX.from(
|
||||
node: newNode,
|
||||
prefs: _prefs,
|
||||
failovers: failovers,
|
||||
);
|
||||
_electrumXClient = ElectrumX.from(
|
||||
node: newNode,
|
||||
prefs: _prefs,
|
||||
failovers: failovers,
|
||||
);
|
||||
_cachedElectrumXClient = CachedElectrumX.from(
|
||||
electrumXClient: _electrumXClient,
|
||||
);
|
||||
|
||||
if (shouldRefresh) {
|
||||
unawaited(refresh());
|
||||
|
@ -2149,6 +2153,7 @@ class BitcoinCashWallet extends CoinServiceAPI
|
|||
nonce: null,
|
||||
inputs: inputs,
|
||||
outputs: outputs,
|
||||
numberOfMessages: null,
|
||||
);
|
||||
|
||||
txns.add(Tuple2(tx, transactionAddress));
|
||||
|
|
|
@ -79,17 +79,7 @@ abstract class CoinServiceAPI {
|
|||
prefs: prefs,
|
||||
);
|
||||
final cachedClient = CachedElectrumX.from(
|
||||
node: electrumxNode,
|
||||
failovers: failovers
|
||||
.map((e) => ElectrumXNode(
|
||||
address: e.host,
|
||||
port: e.port,
|
||||
name: e.name,
|
||||
id: e.id,
|
||||
useSSL: e.useSSL,
|
||||
))
|
||||
.toList(),
|
||||
prefs: prefs,
|
||||
electrumXClient: client,
|
||||
);
|
||||
switch (coin) {
|
||||
case Coin.firo:
|
||||
|
|
|
@ -1068,13 +1068,18 @@ class DogecoinWallet extends CoinServiceAPI
|
|||
|
||||
void _periodicPingCheck() async {
|
||||
bool hasNetwork = await testNetworkConnection();
|
||||
_isConnected = hasNetwork;
|
||||
|
||||
if (_isConnected != hasNetwork) {
|
||||
NodeConnectionStatus status = hasNetwork
|
||||
? NodeConnectionStatus.connected
|
||||
: NodeConnectionStatus.disconnected;
|
||||
GlobalEventBus.instance
|
||||
.fire(NodeConnectionStatusChangedEvent(status, walletId, coin));
|
||||
|
||||
_isConnected = hasNetwork;
|
||||
if (hasNetwork) {
|
||||
unawaited(refresh());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1150,6 +1155,7 @@ class DogecoinWallet extends CoinServiceAPI
|
|||
nonce: null,
|
||||
inputs: [],
|
||||
outputs: [],
|
||||
numberOfMessages: null,
|
||||
);
|
||||
|
||||
final address = txData["address"] is String
|
||||
|
@ -1204,16 +1210,14 @@ class DogecoinWallet extends CoinServiceAPI
|
|||
))
|
||||
.toList();
|
||||
final newNode = await getCurrentNode();
|
||||
_cachedElectrumXClient = CachedElectrumX.from(
|
||||
node: newNode,
|
||||
prefs: _prefs,
|
||||
failovers: failovers,
|
||||
);
|
||||
_electrumXClient = ElectrumX.from(
|
||||
node: newNode,
|
||||
prefs: _prefs,
|
||||
failovers: failovers,
|
||||
);
|
||||
_cachedElectrumXClient = CachedElectrumX.from(
|
||||
electrumXClient: _electrumXClient,
|
||||
);
|
||||
|
||||
if (shouldRefresh) {
|
||||
unawaited(refresh());
|
||||
|
|
|
@ -57,7 +57,7 @@ import 'package:stackwallet/widgets/crypto_notifications.dart';
|
|||
import 'package:tuple/tuple.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
|
||||
const int MINIMUM_CONFIRMATIONS = 1;
|
||||
const int MINIMUM_CONFIRMATIONS = 0;
|
||||
|
||||
const String GENESIS_HASH_MAINNET =
|
||||
"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f";
|
||||
|
@ -371,9 +371,9 @@ class ECashWallet extends CoinServiceAPI
|
|||
print("format $format");
|
||||
}
|
||||
|
||||
if (_coin == Coin.bitcoincashTestnet) {
|
||||
return true;
|
||||
}
|
||||
// if (_coin == Coin.bitcoincashTestnet) {
|
||||
// return true;
|
||||
// }
|
||||
|
||||
if (format == bitbox.Address.formatCashAddr) {
|
||||
return validateCashAddr(address);
|
||||
|
@ -420,16 +420,14 @@ class ECashWallet extends CoinServiceAPI
|
|||
))
|
||||
.toList();
|
||||
final newNode = await getCurrentNode();
|
||||
_cachedElectrumXClient = CachedElectrumX.from(
|
||||
node: newNode,
|
||||
prefs: _prefs,
|
||||
failovers: failovers,
|
||||
);
|
||||
_electrumXClient = ElectrumX.from(
|
||||
node: newNode,
|
||||
prefs: _prefs,
|
||||
failovers: failovers,
|
||||
);
|
||||
_cachedElectrumXClient = CachedElectrumX.from(
|
||||
electrumXClient: _electrumXClient,
|
||||
);
|
||||
|
||||
if (shouldRefresh) {
|
||||
unawaited(refresh());
|
||||
|
@ -1377,6 +1375,7 @@ class ECashWallet extends CoinServiceAPI
|
|||
nonce: null,
|
||||
inputs: inputs,
|
||||
outputs: outputs,
|
||||
numberOfMessages: null,
|
||||
);
|
||||
|
||||
txns.add(Tuple2(tx, transactionAddress));
|
||||
|
@ -1909,7 +1908,7 @@ class ECashWallet extends CoinServiceAPI
|
|||
required List<int> satoshiAmounts,
|
||||
}) async {
|
||||
final builder = bitbox.Bitbox.transactionBuilder(
|
||||
testnet: coin == Coin.bitcoincashTestnet,
|
||||
testnet: false, //coin == Coin.bitcoincashTestnet,
|
||||
);
|
||||
|
||||
// retrieve address' utxos from the rest api
|
||||
|
@ -2691,13 +2690,18 @@ class ECashWallet extends CoinServiceAPI
|
|||
|
||||
void _periodicPingCheck() async {
|
||||
bool hasNetwork = await testNetworkConnection();
|
||||
_isConnected = hasNetwork;
|
||||
|
||||
if (_isConnected != hasNetwork) {
|
||||
NodeConnectionStatus status = hasNetwork
|
||||
? NodeConnectionStatus.connected
|
||||
: NodeConnectionStatus.disconnected;
|
||||
GlobalEventBus.instance
|
||||
.fire(NodeConnectionStatusChangedEvent(status, walletId, coin));
|
||||
|
||||
_isConnected = hasNetwork;
|
||||
if (hasNetwork) {
|
||||
unawaited(refresh());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2782,6 +2786,7 @@ class ECashWallet extends CoinServiceAPI
|
|||
nonce: null,
|
||||
inputs: [],
|
||||
outputs: [],
|
||||
numberOfMessages: null,
|
||||
);
|
||||
|
||||
final address = txData["address"] is String
|
||||
|
|
|
@ -1163,10 +1163,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!);
|
||||
}
|
||||
|
||||
|
@ -1630,13 +1626,18 @@ class EpicCashWallet extends CoinServiceAPI
|
|||
|
||||
void _periodicPingCheck() async {
|
||||
bool hasNetwork = await testNetworkConnection();
|
||||
_isConnected = hasNetwork;
|
||||
|
||||
if (_isConnected != hasNetwork) {
|
||||
NodeConnectionStatus status = hasNetwork
|
||||
? NodeConnectionStatus.connected
|
||||
: NodeConnectionStatus.disconnected;
|
||||
GlobalEventBus.instance
|
||||
.fire(NodeConnectionStatusChangedEvent(status, walletId, coin));
|
||||
|
||||
_isConnected = hasNetwork;
|
||||
if (hasNetwork) {
|
||||
unawaited(refresh());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1653,7 +1654,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 {
|
||||
|
@ -1719,6 +1720,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;
|
||||
|
||||
|
@ -1731,6 +1733,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(),
|
||||
|
@ -1754,6 +1757,7 @@ class EpicCashWallet extends CoinServiceAPI
|
|||
otherData: tx["id"].toString(),
|
||||
inputs: [],
|
||||
outputs: [],
|
||||
numberOfMessages: ((tx["numberOfMessages"] == null) ? 0 : tx["numberOfMessages"]) as int,
|
||||
);
|
||||
|
||||
// txn.address =
|
||||
|
|
|
@ -954,6 +954,7 @@ class EthereumWallet extends CoinServiceAPI with WalletCache, WalletDB {
|
|||
response.value?.nonce.toBigIntFromHex.toInt(),
|
||||
inputs: [],
|
||||
outputs: [],
|
||||
numberOfMessages: null,
|
||||
);
|
||||
|
||||
Address? address = await db.getAddress(
|
||||
|
@ -1045,6 +1046,7 @@ class EthereumWallet extends CoinServiceAPI with WalletCache, WalletDB {
|
|||
nonce: tuple.item2,
|
||||
inputs: [],
|
||||
outputs: [],
|
||||
numberOfMessages: null,
|
||||
);
|
||||
|
||||
Address? transactionAddress = await db
|
||||
|
|
|
@ -459,6 +459,7 @@ Future<Map<dynamic, dynamic>> staticProcessRestore(
|
|||
nonce: null,
|
||||
inputs: element.inputs,
|
||||
outputs: element.outputs,
|
||||
numberOfMessages: null,
|
||||
)..address.value = element.address.value;
|
||||
}
|
||||
});
|
||||
|
@ -901,6 +902,7 @@ class FiroWallet extends CoinServiceAPI
|
|||
nonce: null,
|
||||
inputs: [],
|
||||
outputs: [],
|
||||
numberOfMessages: null,
|
||||
);
|
||||
|
||||
final address = txData["address"] is String
|
||||
|
@ -995,13 +997,18 @@ class FiroWallet extends CoinServiceAPI
|
|||
|
||||
void _periodicPingCheck() async {
|
||||
bool hasNetwork = await testNetworkConnection();
|
||||
_isConnected = hasNetwork;
|
||||
|
||||
if (_isConnected != hasNetwork) {
|
||||
NodeConnectionStatus status = hasNetwork
|
||||
? NodeConnectionStatus.connected
|
||||
: NodeConnectionStatus.disconnected;
|
||||
GlobalEventBus.instance
|
||||
.fire(NodeConnectionStatusChangedEvent(status, walletId, coin));
|
||||
|
||||
_isConnected = hasNetwork;
|
||||
if (hasNetwork) {
|
||||
unawaited(refresh());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1850,16 +1857,14 @@ class FiroWallet extends CoinServiceAPI
|
|||
)
|
||||
.toList();
|
||||
final newNode = await _getCurrentNode();
|
||||
_cachedElectrumXClient = CachedElectrumX.from(
|
||||
node: newNode,
|
||||
prefs: _prefs,
|
||||
failovers: failovers,
|
||||
);
|
||||
_electrumXClient = ElectrumX.from(
|
||||
node: newNode,
|
||||
prefs: _prefs,
|
||||
failovers: failovers,
|
||||
);
|
||||
_cachedElectrumXClient = CachedElectrumX.from(
|
||||
electrumXClient: _electrumXClient,
|
||||
);
|
||||
|
||||
if (shouldRefresh) {
|
||||
unawaited(refresh());
|
||||
|
@ -3045,6 +3050,7 @@ class FiroWallet extends CoinServiceAPI
|
|||
otherData: transactionInfo["otherData"] as String?,
|
||||
inputs: [],
|
||||
outputs: [],
|
||||
numberOfMessages: null,
|
||||
);
|
||||
|
||||
final transactionAddress = await db
|
||||
|
@ -3371,17 +3377,17 @@ class FiroWallet extends CoinServiceAPI
|
|||
|
||||
List<Map<String, dynamic>> allTransactions = [];
|
||||
|
||||
final currentHeight = await chainHeight;
|
||||
// final currentHeight = await chainHeight;
|
||||
|
||||
for (final txHash in allTxHashes) {
|
||||
final storedTx = await db
|
||||
.getTransactions(walletId)
|
||||
.filter()
|
||||
.txidEqualTo(txHash["tx_hash"] as String)
|
||||
.findFirst();
|
||||
// final storedTx = await db
|
||||
// .getTransactions(walletId)
|
||||
// .filter()
|
||||
// .txidEqualTo(txHash["tx_hash"] as String)
|
||||
// .findFirst();
|
||||
|
||||
if (storedTx == null ||
|
||||
!storedTx.isConfirmed(currentHeight, MINIMUM_CONFIRMATIONS)) {
|
||||
// if (storedTx == null ||
|
||||
// !storedTx.isConfirmed(currentHeight, MINIMUM_CONFIRMATIONS)) {
|
||||
final tx = await cachedElectrumXClient.getTransaction(
|
||||
txHash: txHash["tx_hash"] as String,
|
||||
verbose: true,
|
||||
|
@ -3397,7 +3403,7 @@ class FiroWallet extends CoinServiceAPI
|
|||
tx["height"] = txHash["height"];
|
||||
allTransactions.add(tx);
|
||||
}
|
||||
}
|
||||
// }
|
||||
}
|
||||
|
||||
final List<Tuple2<isar_models.Transaction, isar_models.Address?>> txnsData =
|
||||
|
@ -3525,6 +3531,7 @@ class FiroWallet extends CoinServiceAPI
|
|||
nonce: null,
|
||||
inputs: ins,
|
||||
outputs: [],
|
||||
numberOfMessages: null,
|
||||
);
|
||||
|
||||
txnsData.add(Tuple2(tx, null));
|
||||
|
@ -3647,6 +3654,7 @@ class FiroWallet extends CoinServiceAPI
|
|||
nonce: null,
|
||||
inputs: ins,
|
||||
outputs: outs,
|
||||
numberOfMessages: null,
|
||||
);
|
||||
|
||||
txnsData.add(Tuple2(tx, transactionAddress));
|
||||
|
@ -3798,6 +3806,7 @@ class FiroWallet extends CoinServiceAPI
|
|||
nonce: null,
|
||||
inputs: ins,
|
||||
outputs: outs,
|
||||
numberOfMessages: null,
|
||||
);
|
||||
|
||||
txnsData.add(Tuple2(tx, transactionAddress));
|
||||
|
@ -5077,6 +5086,7 @@ class FiroWallet extends CoinServiceAPI
|
|||
nonce: null,
|
||||
inputs: [],
|
||||
outputs: [],
|
||||
numberOfMessages: null,
|
||||
);
|
||||
|
||||
final address = await db
|
||||
|
|
|
@ -1199,13 +1199,18 @@ class LitecoinWallet extends CoinServiceAPI
|
|||
|
||||
void _periodicPingCheck() async {
|
||||
bool hasNetwork = await testNetworkConnection();
|
||||
_isConnected = hasNetwork;
|
||||
|
||||
if (_isConnected != hasNetwork) {
|
||||
NodeConnectionStatus status = hasNetwork
|
||||
? NodeConnectionStatus.connected
|
||||
: NodeConnectionStatus.disconnected;
|
||||
GlobalEventBus.instance
|
||||
.fire(NodeConnectionStatusChangedEvent(status, walletId, coin));
|
||||
|
||||
_isConnected = hasNetwork;
|
||||
if (hasNetwork) {
|
||||
unawaited(refresh());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1281,6 +1286,7 @@ class LitecoinWallet extends CoinServiceAPI
|
|||
nonce: null,
|
||||
inputs: [],
|
||||
outputs: [],
|
||||
numberOfMessages: null,
|
||||
);
|
||||
|
||||
final address = txData["address"] is String
|
||||
|
@ -1335,16 +1341,14 @@ class LitecoinWallet extends CoinServiceAPI
|
|||
))
|
||||
.toList();
|
||||
final newNode = await getCurrentNode();
|
||||
_cachedElectrumXClient = CachedElectrumX.from(
|
||||
node: newNode,
|
||||
prefs: _prefs,
|
||||
failovers: failovers,
|
||||
);
|
||||
_electrumXClient = ElectrumX.from(
|
||||
node: newNode,
|
||||
prefs: _prefs,
|
||||
failovers: failovers,
|
||||
);
|
||||
_cachedElectrumXClient = CachedElectrumX.from(
|
||||
electrumXClient: _electrumXClient,
|
||||
);
|
||||
|
||||
if (shouldRefresh) {
|
||||
unawaited(refresh());
|
||||
|
@ -1803,6 +1807,18 @@ class LitecoinWallet extends CoinServiceAPI
|
|||
coin: coin,
|
||||
);
|
||||
|
||||
bool shouldBlock = false;
|
||||
String? blockReason;
|
||||
String? label;
|
||||
|
||||
final utxoAmount = jsonUTXO["value"] as int;
|
||||
|
||||
if (utxoAmount <= 10000) {
|
||||
shouldBlock = true;
|
||||
blockReason = "May contain ordinal";
|
||||
label = "Possible ordinal";
|
||||
}
|
||||
|
||||
final vout = jsonUTXO["tx_pos"] as int;
|
||||
|
||||
final outputs = txn["vout"] as List;
|
||||
|
@ -1821,10 +1837,10 @@ class LitecoinWallet extends CoinServiceAPI
|
|||
walletId: walletId,
|
||||
txid: txn["txid"] as String,
|
||||
vout: vout,
|
||||
value: jsonUTXO["value"] as int,
|
||||
name: "",
|
||||
isBlocked: false,
|
||||
blockedReason: null,
|
||||
value: utxoAmount,
|
||||
name: label ?? "",
|
||||
isBlocked: shouldBlock,
|
||||
blockedReason: blockReason,
|
||||
isCoinbase: txn["is_coinbase"] as bool? ?? false,
|
||||
blockHash: txn["blockhash"] as String?,
|
||||
blockHeight: jsonUTXO["height"] as int?,
|
||||
|
@ -1836,16 +1852,20 @@ class LitecoinWallet extends CoinServiceAPI
|
|||
}
|
||||
}
|
||||
|
||||
Logging.instance
|
||||
.log('Outputs fetched: $outputArray', level: LogLevel.Info);
|
||||
Logging.instance.log(
|
||||
'Outputs fetched: $outputArray',
|
||||
level: LogLevel.Info,
|
||||
);
|
||||
|
||||
await db.updateUTXOs(walletId, outputArray);
|
||||
|
||||
// finally update balance
|
||||
await _updateBalance();
|
||||
} catch (e, s) {
|
||||
Logging.instance
|
||||
.log("Output fetch unsuccessful: $e\n$s", level: LogLevel.Error);
|
||||
Logging.instance.log(
|
||||
"Output fetch unsuccessful: $e\n$s",
|
||||
level: LogLevel.Error,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -964,6 +964,7 @@ class MoneroWallet extends CoinServiceAPI with WalletCache, WalletDB {
|
|||
nonce: null,
|
||||
inputs: [],
|
||||
outputs: [],
|
||||
numberOfMessages: null,
|
||||
);
|
||||
|
||||
txnsData.add(Tuple2(txn, address));
|
||||
|
|
|
@ -1189,13 +1189,18 @@ class NamecoinWallet extends CoinServiceAPI
|
|||
|
||||
void _periodicPingCheck() async {
|
||||
bool hasNetwork = await testNetworkConnection();
|
||||
_isConnected = hasNetwork;
|
||||
|
||||
if (_isConnected != hasNetwork) {
|
||||
NodeConnectionStatus status = hasNetwork
|
||||
? NodeConnectionStatus.connected
|
||||
: NodeConnectionStatus.disconnected;
|
||||
GlobalEventBus.instance
|
||||
.fire(NodeConnectionStatusChangedEvent(status, walletId, coin));
|
||||
|
||||
_isConnected = hasNetwork;
|
||||
if (hasNetwork) {
|
||||
unawaited(refresh());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1270,6 +1275,7 @@ class NamecoinWallet extends CoinServiceAPI
|
|||
nonce: null,
|
||||
inputs: [],
|
||||
outputs: [],
|
||||
numberOfMessages: null,
|
||||
);
|
||||
|
||||
final address = txData["address"] is String
|
||||
|
@ -1324,16 +1330,14 @@ class NamecoinWallet extends CoinServiceAPI
|
|||
))
|
||||
.toList();
|
||||
final newNode = await getCurrentNode();
|
||||
_cachedElectrumXClient = CachedElectrumX.from(
|
||||
node: newNode,
|
||||
prefs: _prefs,
|
||||
failovers: failovers,
|
||||
);
|
||||
_electrumXClient = ElectrumX.from(
|
||||
node: newNode,
|
||||
prefs: _prefs,
|
||||
failovers: failovers,
|
||||
);
|
||||
_cachedElectrumXClient = CachedElectrumX.from(
|
||||
electrumXClient: _electrumXClient,
|
||||
);
|
||||
|
||||
if (shouldRefresh) {
|
||||
unawaited(refresh());
|
||||
|
@ -2813,19 +2817,18 @@ class NamecoinWallet extends CoinServiceAPI
|
|||
|
||||
// Add transaction output
|
||||
for (var i = 0; i < recipients.length; i++) {
|
||||
txb.addOutput(recipients[i], satoshiAmounts[i], namecoin.bech32!);
|
||||
txb.addOutput(recipients[i], satoshiAmounts[i], _network.bech32!);
|
||||
}
|
||||
|
||||
try {
|
||||
// Sign the transaction accordingly
|
||||
for (var i = 0; i < utxoSigningData.length; i++) {
|
||||
final txid = utxoSigningData[i].utxo.txid;
|
||||
txb.addInput(
|
||||
txid,
|
||||
utxoSigningData[i].utxo.vout,
|
||||
null,
|
||||
utxoSigningData[i].output!,
|
||||
_network.bech32!,
|
||||
txb.sign(
|
||||
vin: i,
|
||||
keyPair: utxoSigningData[i].keyPair!,
|
||||
witnessValue: utxoSigningData[i].utxo.value,
|
||||
redeemScript: utxoSigningData[i].redeemScript,
|
||||
overridePrefix: _network.bech32!,
|
||||
);
|
||||
}
|
||||
} catch (e, s) {
|
||||
|
@ -2834,7 +2837,7 @@ class NamecoinWallet extends CoinServiceAPI
|
|||
rethrow;
|
||||
}
|
||||
|
||||
final builtTx = txb.build(namecoin.bech32!);
|
||||
final builtTx = txb.build(_network.bech32!);
|
||||
final vSize = builtTx.virtualSize();
|
||||
|
||||
return {"hex": builtTx.toHex(), "vSize": vSize};
|
||||
|
|
|
@ -1116,13 +1116,18 @@ class ParticlWallet extends CoinServiceAPI
|
|||
|
||||
void _periodicPingCheck() async {
|
||||
bool hasNetwork = await testNetworkConnection();
|
||||
_isConnected = hasNetwork;
|
||||
|
||||
if (_isConnected != hasNetwork) {
|
||||
NodeConnectionStatus status = hasNetwork
|
||||
? NodeConnectionStatus.connected
|
||||
: NodeConnectionStatus.disconnected;
|
||||
GlobalEventBus.instance
|
||||
.fire(NodeConnectionStatusChangedEvent(status, walletId, coin));
|
||||
|
||||
_isConnected = hasNetwork;
|
||||
if (hasNetwork) {
|
||||
unawaited(refresh());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1198,6 +1203,7 @@ class ParticlWallet extends CoinServiceAPI
|
|||
nonce: null,
|
||||
inputs: [],
|
||||
outputs: [],
|
||||
numberOfMessages: null,
|
||||
);
|
||||
|
||||
final address = txData["address"] is String
|
||||
|
@ -1252,16 +1258,14 @@ class ParticlWallet extends CoinServiceAPI
|
|||
))
|
||||
.toList();
|
||||
final newNode = await getCurrentNode();
|
||||
_cachedElectrumXClient = CachedElectrumX.from(
|
||||
node: newNode,
|
||||
prefs: _prefs,
|
||||
failovers: failovers,
|
||||
);
|
||||
_electrumXClient = ElectrumX.from(
|
||||
node: newNode,
|
||||
prefs: _prefs,
|
||||
failovers: failovers,
|
||||
);
|
||||
_cachedElectrumXClient = CachedElectrumX.from(
|
||||
electrumXClient: _electrumXClient,
|
||||
);
|
||||
|
||||
if (shouldRefresh) {
|
||||
unawaited(refresh());
|
||||
|
@ -2403,6 +2407,7 @@ class ParticlWallet extends CoinServiceAPI
|
|||
nonce: null,
|
||||
slateId: null,
|
||||
otherData: null,
|
||||
numberOfMessages: null,
|
||||
);
|
||||
|
||||
txns.add(Tuple2(tx, transactionAddress));
|
||||
|
|
|
@ -1051,6 +1051,7 @@ class WowneroWallet extends CoinServiceAPI with WalletCache, WalletDB {
|
|||
nonce: null,
|
||||
inputs: [],
|
||||
outputs: [],
|
||||
numberOfMessages: null,
|
||||
);
|
||||
|
||||
txnsData.add(Tuple2(txn, address));
|
||||
|
|
|
@ -179,6 +179,7 @@ class EthTokenWallet extends ChangeNotifier with EthTokenCache {
|
|||
response.value?.nonce.toBigIntFromHex.toInt(),
|
||||
inputs: [],
|
||||
outputs: [],
|
||||
numberOfMessages: null,
|
||||
);
|
||||
|
||||
Address? address = await ethWallet.db.getAddress(
|
||||
|
@ -529,6 +530,7 @@ class EthTokenWallet extends ChangeNotifier with EthTokenCache {
|
|||
otherData: tuple.item1.address,
|
||||
inputs: [],
|
||||
outputs: [],
|
||||
numberOfMessages: null,
|
||||
);
|
||||
|
||||
Address? transactionAddress = await ethWallet.db
|
||||
|
|
|
@ -158,8 +158,13 @@ mixin ElectrumXParsing {
|
|||
type = TransactionType.outgoing;
|
||||
amount = amountSentFromWallet - changeAmount - fee;
|
||||
|
||||
final possible =
|
||||
outputAddresses.difference(myChangeReceivedOnAddresses).first;
|
||||
// non wallet addresses found in tx outputs
|
||||
final nonWalletOutAddresses = outputAddresses.difference(
|
||||
myChangeReceivedOnAddresses,
|
||||
);
|
||||
|
||||
if (nonWalletOutAddresses.isNotEmpty) {
|
||||
final possible = nonWalletOutAddresses.first;
|
||||
|
||||
if (transactionAddress.value != possible) {
|
||||
transactionAddress = Address(
|
||||
|
@ -172,6 +177,13 @@ mixin ElectrumXParsing {
|
|||
publicKey: [],
|
||||
);
|
||||
}
|
||||
} else {
|
||||
// some other type of tx where the receiving address is
|
||||
// one of my change addresses
|
||||
|
||||
type = TransactionType.sentToSelf;
|
||||
amount = changeAmount;
|
||||
}
|
||||
} else {
|
||||
// incoming tx
|
||||
type = TransactionType.incoming;
|
||||
|
@ -256,6 +268,7 @@ mixin ElectrumXParsing {
|
|||
nonce: null,
|
||||
inputs: ins,
|
||||
outputs: outs,
|
||||
numberOfMessages: null,
|
||||
);
|
||||
|
||||
return Tuple2(tx, transactionAddress);
|
||||
|
|
|
@ -62,19 +62,11 @@ class Amount {
|
|||
return jsonEncode(toMap());
|
||||
}
|
||||
|
||||
String localizedStringAsFixed({
|
||||
String fiatString({
|
||||
required String locale,
|
||||
int? decimalPlaces,
|
||||
}) {
|
||||
decimalPlaces ??= fractionDigits;
|
||||
assert(decimalPlaces >= 0);
|
||||
|
||||
final wholeNumber = decimal.truncate();
|
||||
|
||||
if (decimalPlaces == 0) {
|
||||
return wholeNumber.toStringAsFixed(0);
|
||||
}
|
||||
|
||||
final String separator =
|
||||
(numberFormatSymbols[locale] as NumberSymbols?)?.DECIMAL_SEP ??
|
||||
(numberFormatSymbols[locale.substring(0, 2)] as NumberSymbols?)
|
||||
|
@ -83,8 +75,31 @@ class Amount {
|
|||
|
||||
final fraction = decimal - wholeNumber;
|
||||
|
||||
return "${wholeNumber.toStringAsFixed(0)}$separator${fraction.toStringAsFixed(decimalPlaces).substring(2)}";
|
||||
return "${wholeNumber.toStringAsFixed(0)}$separator${fraction.toStringAsFixed(2).substring(2)}";
|
||||
}
|
||||
// String localizedStringAsFixed({
|
||||
// required String locale,
|
||||
// int? decimalPlaces,
|
||||
// }) {
|
||||
// decimalPlaces ??= fractionDigits;
|
||||
// assert(decimalPlaces >= 0);
|
||||
//
|
||||
// final wholeNumber = decimal.truncate();
|
||||
//
|
||||
// if (decimalPlaces == 0) {
|
||||
// return wholeNumber.toStringAsFixed(0);
|
||||
// }
|
||||
//
|
||||
// final String separator =
|
||||
// (numberFormatSymbols[locale] as NumberSymbols?)?.DECIMAL_SEP ??
|
||||
// (numberFormatSymbols[locale.substring(0, 2)] as NumberSymbols?)
|
||||
// ?.DECIMAL_SEP ??
|
||||
// ".";
|
||||
//
|
||||
// final fraction = decimal - wholeNumber;
|
||||
//
|
||||
// return "${wholeNumber.toStringAsFixed(0)}$separator${fraction.toStringAsFixed(decimalPlaces).substring(2)}";
|
||||
// }
|
||||
|
||||
// ===========================================================================
|
||||
// ======= Deserialization ===================================================
|
||||
|
|
66
lib/utilities/amount/amount_formatter.dart
Normal file
66
lib/utilities/amount/amount_formatter.dart
Normal file
|
@ -0,0 +1,66 @@
|
|||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:stackwallet/models/isar/models/ethereum/eth_contract.dart';
|
||||
import 'package:stackwallet/providers/global/locale_provider.dart';
|
||||
import 'package:stackwallet/providers/global/prefs_provider.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_unit.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
|
||||
final pAmountUnit = Provider.family<AmountUnit, Coin>(
|
||||
(ref, coin) => ref.watch(
|
||||
prefsChangeNotifierProvider.select(
|
||||
(value) => value.amountUnit(coin),
|
||||
),
|
||||
),
|
||||
);
|
||||
final pMaxDecimals = Provider.family<int, Coin>(
|
||||
(ref, coin) => ref.watch(
|
||||
prefsChangeNotifierProvider.select(
|
||||
(value) => value.maxDecimals(coin),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
final pAmountFormatter = Provider.family<AmountFormatter, Coin>((ref, coin) {
|
||||
return AmountFormatter(
|
||||
unit: ref.watch(pAmountUnit(coin)),
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider.select((value) => value.locale),
|
||||
),
|
||||
coin: coin,
|
||||
maxDecimals: ref.watch(pMaxDecimals(coin)),
|
||||
);
|
||||
});
|
||||
|
||||
class AmountFormatter {
|
||||
final AmountUnit unit;
|
||||
final String locale;
|
||||
final Coin coin;
|
||||
final int maxDecimals;
|
||||
|
||||
AmountFormatter({
|
||||
required this.unit,
|
||||
required this.locale,
|
||||
required this.coin,
|
||||
required this.maxDecimals,
|
||||
});
|
||||
|
||||
String format(
|
||||
Amount amount, {
|
||||
String? overrideUnit,
|
||||
EthContract? ethContract,
|
||||
bool withUnitName = true,
|
||||
bool indicatePrecisionLoss = true,
|
||||
}) {
|
||||
return unit.displayAmount(
|
||||
amount: amount,
|
||||
locale: locale,
|
||||
coin: coin,
|
||||
maxDecimalPlaces: maxDecimals,
|
||||
withUnitName: withUnitName,
|
||||
indicatePrecisionLoss: indicatePrecisionLoss,
|
||||
overrideUnit: overrideUnit,
|
||||
tokenContract: ethContract,
|
||||
);
|
||||
}
|
||||
}
|
|
@ -13,9 +13,11 @@ import 'dart:math' as math;
|
|||
import 'package:decimal/decimal.dart';
|
||||
import 'package:intl/number_symbols.dart';
|
||||
import 'package:intl/number_symbols_data.dart';
|
||||
import 'package:stackwallet/models/isar/models/ethereum/eth_contract.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
|
||||
// preserve index order as index is used to store value in preferences
|
||||
enum AmountUnit {
|
||||
normal(0),
|
||||
milli(3),
|
||||
|
@ -28,6 +30,33 @@ enum AmountUnit {
|
|||
|
||||
const AmountUnit(this.shift);
|
||||
final int shift;
|
||||
|
||||
static List<AmountUnit> valuesForCoin(Coin coin) {
|
||||
switch (coin) {
|
||||
case Coin.firo:
|
||||
case Coin.litecoin:
|
||||
case Coin.particl:
|
||||
case Coin.namecoin:
|
||||
case Coin.bitcoinTestNet:
|
||||
case Coin.litecoinTestNet:
|
||||
case Coin.bitcoincashTestnet:
|
||||
case Coin.dogecoinTestNet:
|
||||
case Coin.firoTestNet:
|
||||
case Coin.bitcoin:
|
||||
case Coin.bitcoincash:
|
||||
case Coin.dogecoin:
|
||||
case Coin.eCash:
|
||||
case Coin.epicCash:
|
||||
return AmountUnit.values.sublist(0, 4);
|
||||
|
||||
case Coin.monero:
|
||||
case Coin.wownero:
|
||||
return AmountUnit.values.sublist(0, 5);
|
||||
|
||||
case Coin.ethereum:
|
||||
return AmountUnit.values;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension AmountUnitExt on AmountUnit {
|
||||
|
@ -70,13 +99,37 @@ extension AmountUnitExt on AmountUnit {
|
|||
}
|
||||
}
|
||||
|
||||
String unitForContract(EthContract contract) {
|
||||
switch (this) {
|
||||
case AmountUnit.normal:
|
||||
return contract.symbol;
|
||||
case AmountUnit.milli:
|
||||
return "m${contract.symbol}";
|
||||
case AmountUnit.micro:
|
||||
return "µ${contract.symbol}";
|
||||
case AmountUnit.nano:
|
||||
return "gwei";
|
||||
case AmountUnit.pico:
|
||||
return "mwei";
|
||||
case AmountUnit.femto:
|
||||
return "kwei";
|
||||
case AmountUnit.atto:
|
||||
return "wei";
|
||||
}
|
||||
}
|
||||
|
||||
String displayAmount({
|
||||
required Amount amount,
|
||||
required String locale,
|
||||
required Coin coin,
|
||||
required int maxDecimalPlaces,
|
||||
bool withUnitName = true,
|
||||
bool indicatePrecisionLoss = true,
|
||||
String? overrideUnit,
|
||||
EthContract? tokenContract,
|
||||
}) {
|
||||
assert(maxDecimalPlaces >= 0);
|
||||
|
||||
// ensure we don't shift past minimum atomic value
|
||||
final realShift = math.min(shift, amount.fractionDigits);
|
||||
|
||||
|
@ -92,18 +145,44 @@ extension AmountUnitExt on AmountUnit {
|
|||
// start building the return value with just the whole value
|
||||
String returnValue = wholeNumber.toString();
|
||||
|
||||
// if true and withUnitName is true, we will show "~" prepended on amount
|
||||
bool didLosePrecision = false;
|
||||
|
||||
// if any decimal places should be shown continue building the return value
|
||||
if (places > 0) {
|
||||
// get the fractional value
|
||||
final Decimal fraction = shifted - shifted.truncate();
|
||||
|
||||
// get final decimal based on max precision wanted
|
||||
final int actualDecimalPlaces = math.min(places, maxDecimalPlaces);
|
||||
// get final decimal based on max precision wanted while ensuring that
|
||||
// maxDecimalPlaces doesn't exceed the max per coin
|
||||
final int updatedMax;
|
||||
if (tokenContract != null) {
|
||||
updatedMax = maxDecimalPlaces > tokenContract.decimals
|
||||
? tokenContract.decimals
|
||||
: maxDecimalPlaces;
|
||||
} else {
|
||||
updatedMax =
|
||||
maxDecimalPlaces > coin.decimals ? coin.decimals : maxDecimalPlaces;
|
||||
}
|
||||
final int actualDecimalPlaces = math.min(places, updatedMax);
|
||||
|
||||
// get remainder string without the prepending "0."
|
||||
String remainder = fraction.toString().substring(2);
|
||||
final fractionString = fraction.toString();
|
||||
String remainder;
|
||||
if (fractionString.length > 2) {
|
||||
remainder = fraction.toString().substring(2);
|
||||
} else {
|
||||
remainder = "0";
|
||||
}
|
||||
|
||||
if (remainder.length > actualDecimalPlaces) {
|
||||
// check for loss of precision
|
||||
final remainingRemainder =
|
||||
BigInt.tryParse(remainder.substring(actualDecimalPlaces));
|
||||
if (remainingRemainder != null) {
|
||||
didLosePrecision = remainingRemainder > BigInt.zero;
|
||||
}
|
||||
|
||||
// trim unwanted trailing digits
|
||||
remainder = remainder.substring(0, actualDecimalPlaces);
|
||||
} else if (remainder.length < actualDecimalPlaces) {
|
||||
|
@ -124,7 +203,23 @@ extension AmountUnitExt on AmountUnit {
|
|||
returnValue += "$separator$remainder";
|
||||
}
|
||||
|
||||
if (!withUnitName && !indicatePrecisionLoss) {
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
if (didLosePrecision && indicatePrecisionLoss) {
|
||||
returnValue = "~$returnValue";
|
||||
}
|
||||
|
||||
if (!withUnitName && indicatePrecisionLoss) {
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
// return the value with the proper unit symbol
|
||||
return "$returnValue ${unitForCoin(coin)}";
|
||||
if (tokenContract != null) {
|
||||
overrideUnit = unitForContract(tokenContract);
|
||||
}
|
||||
|
||||
return "$returnValue ${overrideUnit ?? unitForCoin(coin)}";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -52,8 +52,6 @@ abstract class Constants {
|
|||
static const int notificationsMax = 0xFFFFFFFF;
|
||||
static const Duration networkAliveTimerDuration = Duration(seconds: 10);
|
||||
|
||||
static const int pinLength = 4;
|
||||
|
||||
// Enable Logger.print statements
|
||||
static const bool disableLogger = false;
|
||||
|
||||
|
|
|
@ -407,6 +407,7 @@ class DbVersionMigrator with WalletDB {
|
|||
nonce: null,
|
||||
inputs: [],
|
||||
outputs: [],
|
||||
numberOfMessages: tx.numberOfMessages,
|
||||
);
|
||||
|
||||
if (tx.address.isEmpty) {
|
||||
|
|
|
@ -74,7 +74,7 @@ extension CoinExt on Coin {
|
|||
case Coin.epicCash:
|
||||
return "Epic Cash";
|
||||
case Coin.eCash:
|
||||
return "E-Cash";
|
||||
return "eCash";
|
||||
case Coin.ethereum:
|
||||
return "Ethereum";
|
||||
case Coin.firo:
|
||||
|
|
|
@ -10,8 +10,10 @@
|
|||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:stackwallet/db/hive/db.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_unit.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
import 'package:stackwallet/utilities/enums/backup_frequency_type.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/enums/languages_enum.dart';
|
||||
import 'package:stackwallet/utilities/enums/sync_type_enum.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
|
@ -56,6 +58,8 @@ class Prefs extends ChangeNotifier {
|
|||
_themeId = await _getThemeId();
|
||||
_systemBrightnessLightThemeId = await _getSystemBrightnessLightThemeId();
|
||||
_systemBrightnessDarkThemeId = await _getSystemBrightnessDarkTheme();
|
||||
await _setAmountUnits();
|
||||
await _setMaxDecimals();
|
||||
|
||||
_initialized = true;
|
||||
}
|
||||
|
@ -806,4 +810,62 @@ class Prefs extends ChangeNotifier {
|
|||
) as String? ??
|
||||
"dark";
|
||||
}
|
||||
|
||||
// coin amount unit settings
|
||||
|
||||
final Map<Coin, AmountUnit> _amountUnits = {};
|
||||
|
||||
AmountUnit amountUnit(Coin coin) => _amountUnits[coin] ?? AmountUnit.normal;
|
||||
|
||||
void updateAmountUnit({required Coin coin, required AmountUnit amountUnit}) {
|
||||
if (this.amountUnit(coin) != amountUnit) {
|
||||
DB.instance.put<dynamic>(
|
||||
boxName: DB.boxNamePrefs,
|
||||
key: "amountUnitFor${coin.name}",
|
||||
value: amountUnit.index,
|
||||
);
|
||||
_amountUnits[coin] = amountUnit;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _setAmountUnits() async {
|
||||
for (final coin in Coin.values) {
|
||||
final unitIndex = await DB.instance.get<dynamic>(
|
||||
boxName: DB.boxNamePrefs,
|
||||
key: "amountUnitFor${coin.name}",
|
||||
) as int? ??
|
||||
0; // 0 is "normal"
|
||||
_amountUnits[coin] = AmountUnit.values[unitIndex];
|
||||
}
|
||||
}
|
||||
|
||||
// coin precision setting (max decimal places to show)
|
||||
|
||||
final Map<Coin, int> _amountDecimals = {};
|
||||
|
||||
int maxDecimals(Coin coin) => _amountDecimals[coin] ?? coin.decimals;
|
||||
|
||||
void updateMaxDecimals({required Coin coin, required int maxDecimals}) {
|
||||
if (this.maxDecimals(coin) != maxDecimals) {
|
||||
DB.instance.put<dynamic>(
|
||||
boxName: DB.boxNamePrefs,
|
||||
key: "maxDecimalsFor${coin.name}",
|
||||
value: maxDecimals,
|
||||
);
|
||||
_amountDecimals[coin] = maxDecimals;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _setMaxDecimals() async {
|
||||
for (final coin in Coin.values) {
|
||||
final decimals = await DB.instance.get<dynamic>(
|
||||
boxName: DB.boxNamePrefs,
|
||||
key: "maxDecimalsFor${coin.name}",
|
||||
) as int? ??
|
||||
coin.decimals;
|
||||
_amountDecimals[coin] = decimals;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -63,8 +63,10 @@ class CustomPinPut extends StatefulWidget {
|
|||
this.mainAxisSize = MainAxisSize.max,
|
||||
this.autofillHints,
|
||||
this.customKey,
|
||||
}) : assert(fieldsCount > 0),
|
||||
super(key: key);
|
||||
this.onPinLengthChanged,
|
||||
}) : super(key: key);
|
||||
|
||||
final void Function(int)? onPinLengthChanged;
|
||||
|
||||
final double? width;
|
||||
final double? height;
|
||||
|
|
|
@ -8,6 +8,8 @@
|
|||
*
|
||||
*/
|
||||
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:stackwallet/widgets/custom_pin_put/custom_pin_put.dart';
|
||||
import 'package:stackwallet/widgets/custom_pin_put/pin_keyboard.dart';
|
||||
|
@ -20,6 +22,13 @@ class CustomPinPutState extends State<CustomPinPut>
|
|||
|
||||
int get selectedIndex => _controller.value.text.length;
|
||||
|
||||
int _pinCount = 0;
|
||||
int get pinCount => _pinCount;
|
||||
set pinCount(int newCount) {
|
||||
_pinCount = newCount;
|
||||
widget.onPinLengthChanged?.call(newCount);
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
_controller = widget.controller ?? TextEditingController();
|
||||
|
@ -60,22 +69,19 @@ class CustomPinPutState extends State<CustomPinPut>
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
// final bool randomize = ref
|
||||
// .read(prefsChangeNotifierProvider)
|
||||
// .randomizePIN;
|
||||
return SizedBox(
|
||||
width: widget.width,
|
||||
height: widget.height,
|
||||
child: Column(
|
||||
children: [
|
||||
SizedBox(
|
||||
width: (30 * widget.fieldsCount) - 18,
|
||||
width: max((30 * pinCount) - 18, 1),
|
||||
child: Stack(
|
||||
children: [
|
||||
_hiddenTextField,
|
||||
Align(
|
||||
alignment: Alignment.bottomCenter,
|
||||
child: _fields,
|
||||
child: _fields(pinCount),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
@ -85,15 +91,22 @@ class CustomPinPutState extends State<CustomPinPut>
|
|||
isRandom: widget.isRandom,
|
||||
customKey: widget.customKey,
|
||||
onNumberKeyPressed: (number) {
|
||||
if (_controller.text.length < widget.fieldsCount) {
|
||||
_controller.text += number;
|
||||
}
|
||||
|
||||
// add a set state and have the counter increment
|
||||
setState(() {
|
||||
pinCount = _controller.text.length;
|
||||
});
|
||||
},
|
||||
onBackPressed: () {
|
||||
final text = _controller.text;
|
||||
if (text.isNotEmpty) {
|
||||
_controller.text = text.substring(0, text.length - 1);
|
||||
setState(() {
|
||||
pinCount = _controller.text.length;
|
||||
});
|
||||
}
|
||||
// decrement counter here
|
||||
},
|
||||
onSubmitPressed: () {
|
||||
final pin = _controller.value.text;
|
||||
|
@ -127,7 +140,7 @@ class CustomPinPutState extends State<CustomPinPut>
|
|||
textCapitalization: widget.textCapitalization,
|
||||
inputFormatters: widget.inputFormatters,
|
||||
enableInteractiveSelection: false,
|
||||
maxLength: widget.fieldsCount,
|
||||
maxLength: 10,
|
||||
showCursor: false,
|
||||
scrollPadding: EdgeInsets.zero,
|
||||
decoration: widget.inputDecoration,
|
||||
|
@ -137,21 +150,22 @@ class CustomPinPutState extends State<CustomPinPut>
|
|||
);
|
||||
}
|
||||
|
||||
Widget get _fields {
|
||||
// have it include an int as a param
|
||||
Widget _fields(int count) {
|
||||
return ValueListenableBuilder<String>(
|
||||
valueListenable: _textControllerValue,
|
||||
builder: (BuildContext context, value, Widget? child) {
|
||||
return Row(
|
||||
mainAxisSize: widget.mainAxisSize,
|
||||
mainAxisAlignment: widget.fieldsAlignment,
|
||||
children: _buildFieldsWithSeparator(),
|
||||
children: _buildFieldsWithSeparator(count),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
List<Widget> _buildFieldsWithSeparator() {
|
||||
final fields = Iterable<int>.generate(widget.fieldsCount).map((index) {
|
||||
List<Widget> _buildFieldsWithSeparator(int count) {
|
||||
final fields = Iterable<int>.generate(count).map((index) {
|
||||
return _getField(index);
|
||||
}).toList();
|
||||
|
||||
|
|
|
@ -14,8 +14,11 @@ import 'package:flutter/material.dart';
|
|||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:stackwallet/providers/providers.dart';
|
||||
import 'package:stackwallet/services/coins/firo/firo_wallet.dart';
|
||||
import 'package:stackwallet/themes/coin_icon_provider.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/text_styles.dart';
|
||||
|
@ -44,6 +47,28 @@ class _ManagedFavoriteCardState extends ConsumerState<ManagedFavorite> {
|
|||
|
||||
final isDesktop = Util.isDesktop;
|
||||
|
||||
final balance = ref.watch(
|
||||
walletsChangeNotifierProvider.select(
|
||||
(value) => value.getManager(widget.walletId).balance,
|
||||
),
|
||||
);
|
||||
|
||||
Amount total = balance.total;
|
||||
if (manager.coin == Coin.firo || manager.coin == Coin.firoTestNet) {
|
||||
final balancePrivate = ref.watch(
|
||||
walletsChangeNotifierProvider.select(
|
||||
(value) => (value
|
||||
.getManager(
|
||||
widget.walletId,
|
||||
)
|
||||
.wallet as FiroWallet)
|
||||
.balancePrivate,
|
||||
),
|
||||
);
|
||||
|
||||
total += balancePrivate.total;
|
||||
}
|
||||
|
||||
return RoundedWhiteContainer(
|
||||
padding: EdgeInsets.all(isDesktop ? 0 : 4.0),
|
||||
child: RawMaterialButton(
|
||||
|
@ -117,14 +142,11 @@ class _ManagedFavoriteCardState extends ConsumerState<ManagedFavorite> {
|
|||
),
|
||||
Expanded(
|
||||
child: Text(
|
||||
"${manager.balance.total.localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider.select(
|
||||
(value) => value.locale,
|
||||
),
|
||||
),
|
||||
decimalPlaces: manager.coin.decimals,
|
||||
)} ${manager.coin.ticker}",
|
||||
ref
|
||||
.watch(
|
||||
pAmountFormatter(manager.coin),
|
||||
)
|
||||
.format(total),
|
||||
style: STextStyles.itemSubtitle(context),
|
||||
),
|
||||
),
|
||||
|
@ -160,14 +182,11 @@ class _ManagedFavoriteCardState extends ConsumerState<ManagedFavorite> {
|
|||
height: 2,
|
||||
),
|
||||
Text(
|
||||
"${manager.balance.total.localizedStringAsFixed(
|
||||
locale: ref.watch(
|
||||
localeServiceChangeNotifierProvider.select(
|
||||
(value) => value.locale,
|
||||
),
|
||||
),
|
||||
decimalPlaces: manager.coin.decimals,
|
||||
)} ${manager.coin.ticker}",
|
||||
ref
|
||||
.watch(
|
||||
pAmountFormatter(manager.coin),
|
||||
)
|
||||
.format(total),
|
||||
style: STextStyles.itemSubtitle(context),
|
||||
),
|
||||
],
|
||||
|
|
|
@ -20,6 +20,7 @@ import 'package:stackwallet/providers/db/main_db_provider.dart';
|
|||
import 'package:stackwallet/providers/providers.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/constants.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/format.dart';
|
||||
|
@ -49,6 +50,7 @@ class _TransactionCardState extends ConsumerState<TransactionCard> {
|
|||
late final String prefix;
|
||||
late final String unit;
|
||||
late final Coin coin;
|
||||
late final EthContract? tokenContract;
|
||||
|
||||
String whatIsIt(
|
||||
TransactionType type,
|
||||
|
@ -126,12 +128,11 @@ class _TransactionCardState extends ConsumerState<TransactionCard> {
|
|||
.getManager(widget.walletId)
|
||||
.coin;
|
||||
|
||||
unit = isTokenTx
|
||||
? ref
|
||||
tokenContract = ref
|
||||
.read(mainDBProvider)
|
||||
.getEthContractSync(_transaction.otherData!)!
|
||||
.symbol
|
||||
: coin.ticker;
|
||||
.getEthContractSync(_transaction.otherData ?? "");
|
||||
|
||||
unit = isTokenTx ? tokenContract!.symbol : coin.ticker;
|
||||
super.initState();
|
||||
}
|
||||
|
||||
|
@ -250,9 +251,7 @@ class _TransactionCardState extends ConsumerState<TransactionCard> {
|
|||
final amount = _transaction.realAmount;
|
||||
|
||||
return Text(
|
||||
"$prefix${amount.localizedStringAsFixed(
|
||||
locale: locale,
|
||||
)} $unit",
|
||||
"$prefix${ref.watch(pAmountFormatter(coin)).format(amount, ethContract: tokenContract)}",
|
||||
style: STextStyles.itemSubtitle12(context),
|
||||
);
|
||||
},
|
||||
|
@ -295,9 +294,8 @@ class _TransactionCardState extends ConsumerState<TransactionCard> {
|
|||
"$prefix${Amount.fromDecimal(
|
||||
amount.decimal * price,
|
||||
fractionDigits: 2,
|
||||
).localizedStringAsFixed(
|
||||
).fiatString(
|
||||
locale: locale,
|
||||
decimalPlaces: 2,
|
||||
)} $baseCurrency",
|
||||
style: STextStyles.label(context),
|
||||
);
|
||||
|
|
|
@ -11,11 +11,13 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:stackwallet/db/isar/main_db.dart';
|
||||
import 'package:stackwallet/models/isar/models/ethereum/eth_contract.dart';
|
||||
import 'package:stackwallet/providers/providers.dart';
|
||||
import 'package:stackwallet/services/coins/ethereum/ethereum_wallet.dart';
|
||||
import 'package:stackwallet/services/coins/firo/firo_wallet.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount.dart';
|
||||
import 'package:stackwallet/utilities/amount/amount_formatter.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/text_styles.dart';
|
||||
import 'package:stackwallet/utilities/util.dart';
|
||||
|
@ -36,36 +38,25 @@ class WalletInfoRowBalance extends ConsumerWidget {
|
|||
.watch(walletsChangeNotifierProvider.notifier)
|
||||
.getManagerProvider(walletId));
|
||||
|
||||
final locale = ref.watch(
|
||||
localeServiceChangeNotifierProvider.select(
|
||||
(value) => value.locale,
|
||||
),
|
||||
);
|
||||
|
||||
Amount totalBalance;
|
||||
int decimals;
|
||||
String unit;
|
||||
EthContract? contract;
|
||||
if (contractAddress == null) {
|
||||
totalBalance = manager.balance.total;
|
||||
if (manager.coin == Coin.firo || manager.coin == Coin.firoTestNet) {
|
||||
totalBalance =
|
||||
totalBalance + (manager.wallet as FiroWallet).balancePrivate.total;
|
||||
}
|
||||
unit = manager.coin.ticker;
|
||||
decimals = manager.coin.decimals;
|
||||
contract = null;
|
||||
} else {
|
||||
final ethWallet = manager.wallet as EthereumWallet;
|
||||
final contract = MainDB.instance.getEthContractSync(contractAddress!)!;
|
||||
contract = MainDB.instance.getEthContractSync(contractAddress!)!;
|
||||
totalBalance = ethWallet.getCachedTokenBalance(contract).total;
|
||||
unit = contract.symbol;
|
||||
decimals = contract.decimals;
|
||||
}
|
||||
|
||||
return Text(
|
||||
"${totalBalance.localizedStringAsFixed(
|
||||
locale: locale,
|
||||
decimalPlaces: decimals,
|
||||
)} $unit",
|
||||
ref
|
||||
.watch(pAmountFormatter(manager.coin))
|
||||
.format(totalBalance, ethContract: contract),
|
||||
style: Util.isDesktop
|
||||
? STextStyles.desktopTextExtraSmall(context).copyWith(
|
||||
color: Theme.of(context).extension<StackColors>()!.textSubtitle1,
|
||||
|
|
|
@ -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.10+174
|
||||
version: 1.7.11+176
|
||||
|
||||
environment:
|
||||
sdk: ">=2.17.0 <3.0.0"
|
||||
|
|
|
@ -127,11 +127,7 @@ void main() {
|
|||
|
||||
final cachedClient = CachedElectrumX(
|
||||
electrumXClient: client,
|
||||
port: 0,
|
||||
failovers: [],
|
||||
server: '',
|
||||
useSSL: true,
|
||||
prefs: Prefs.instance);
|
||||
);
|
||||
|
||||
expect(
|
||||
() async => await cachedClient.getTransaction(
|
||||
|
@ -143,12 +139,8 @@ void main() {
|
|||
|
||||
test("clearSharedTransactionCache", () async {
|
||||
final cachedClient = CachedElectrumX(
|
||||
server: '',
|
||||
electrumXClient: MockElectrumX(),
|
||||
port: 0,
|
||||
useSSL: true,
|
||||
prefs: MockPrefs(),
|
||||
failovers: []);
|
||||
);
|
||||
|
||||
bool didThrow = false;
|
||||
try {
|
||||
|
@ -174,11 +166,7 @@ void main() {
|
|||
useSSL: true,
|
||||
);
|
||||
|
||||
final client = CachedElectrumX.from(
|
||||
node: node,
|
||||
prefs: MockPrefs(),
|
||||
failovers: [],
|
||||
electrumXClient: MockElectrumX());
|
||||
final client = CachedElectrumX.from(electrumXClient: MockElectrumX());
|
||||
|
||||
expect(client, isA<CachedElectrumX>());
|
||||
});
|
||||
|
|
|
@ -57,16 +57,18 @@ void main() {
|
|||
const jsonArgs = '["",true]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenAnswer(
|
||||
(_) async => {
|
||||
(_) async => JsonRPCResponse(data: {
|
||||
"jsonrpc": "2.0",
|
||||
"error": {
|
||||
"code": 1,
|
||||
"message": "None should be a transaction hash",
|
||||
},
|
||||
"id": "some requestId",
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -93,13 +95,15 @@ void main() {
|
|||
const jsonArgs = '[]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenAnswer(
|
||||
(_) async => {
|
||||
(_) async => JsonRPCResponse(data: {
|
||||
"jsonrpc": "2.0",
|
||||
"result": {"height": 520481, "hex": "some block hex string"},
|
||||
"id": "some requestId"
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -126,7 +130,9 @@ void main() {
|
|||
const jsonArgs = '[]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenThrow(Exception());
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -153,9 +159,15 @@ void main() {
|
|||
const jsonArgs = '[]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenAnswer(
|
||||
(_) async => {"jsonrpc": "2.0", "result": null, "id": "some requestId"},
|
||||
(_) async => JsonRPCResponse(data: {
|
||||
"jsonrpc": "2.0",
|
||||
"result": null,
|
||||
"id": "some requestId",
|
||||
}),
|
||||
);
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -181,7 +193,9 @@ void main() {
|
|||
const jsonArgs = '[]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenThrow(Exception());
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -208,9 +222,11 @@ void main() {
|
|||
const jsonArgs = '[]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenAnswer(
|
||||
(_) async => {
|
||||
(_) async => JsonRPCResponse(data: {
|
||||
"jsonrpc": "2.0",
|
||||
"result": {
|
||||
"genesis_hash":
|
||||
|
@ -225,7 +241,7 @@ void main() {
|
|||
"hash_function": "sha256"
|
||||
},
|
||||
"id": "some requestId"
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -263,7 +279,9 @@ void main() {
|
|||
const jsonArgs = '[]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenThrow(Exception());
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -290,13 +308,15 @@ void main() {
|
|||
const jsonArgs = '["some raw transaction string"]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenAnswer(
|
||||
(_) async => {
|
||||
(_) async => JsonRPCResponse(data: {
|
||||
"jsonrpc": "2.0",
|
||||
"result": "the txid of the rawtx",
|
||||
"id": "some requestId"
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -323,7 +343,9 @@ void main() {
|
|||
const jsonArgs = '["some raw transaction string"]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenThrow(Exception());
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -353,16 +375,18 @@ void main() {
|
|||
const jsonArgs = '["dummy hash"]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenAnswer(
|
||||
(_) async => {
|
||||
(_) async => JsonRPCResponse(data: {
|
||||
"jsonrpc": "2.0",
|
||||
"result": {
|
||||
"confirmed": 103873966,
|
||||
"unconfirmed": 23684400,
|
||||
},
|
||||
"id": "some requestId"
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -389,7 +413,9 @@ void main() {
|
|||
const jsonArgs = '["dummy hash"]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenThrow(Exception());
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -418,9 +444,11 @@ void main() {
|
|||
const jsonArgs = '["dummy hash"]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenAnswer(
|
||||
(_) async => {
|
||||
(_) async => JsonRPCResponse(data: {
|
||||
"jsonrpc": "2.0",
|
||||
"result": [
|
||||
{
|
||||
|
@ -435,7 +463,7 @@ void main() {
|
|||
}
|
||||
],
|
||||
"id": "some requestId"
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -473,7 +501,9 @@ void main() {
|
|||
const jsonArgs = '["dummy hash"]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenThrow(Exception());
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -502,9 +532,11 @@ void main() {
|
|||
const jsonArgs = '["dummy hash"]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenAnswer(
|
||||
(_) async => {
|
||||
(_) async => JsonRPCResponse(data: {
|
||||
"jsonrpc": "2.0",
|
||||
"result": [
|
||||
{
|
||||
|
@ -523,7 +555,7 @@ void main() {
|
|||
}
|
||||
],
|
||||
"id": "some requestId"
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -565,7 +597,9 @@ void main() {
|
|||
const jsonArgs = '["dummy hash"]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenThrow(Exception());
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -594,13 +628,15 @@ void main() {
|
|||
const jsonArgs = '["${SampleGetTransactionData.txHash0}",true]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenAnswer(
|
||||
(_) async => {
|
||||
(_) async => JsonRPCResponse(data: {
|
||||
"jsonrpc": "2.0",
|
||||
"result": SampleGetTransactionData.txData0,
|
||||
"id": "some requestId"
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -629,7 +665,9 @@ void main() {
|
|||
const jsonArgs = '["${SampleGetTransactionData.txHash0}",true]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenThrow(Exception());
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -659,13 +697,15 @@ void main() {
|
|||
const jsonArgs = '["1",""]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenAnswer(
|
||||
(_) async => {
|
||||
(_) async => JsonRPCResponse(data: {
|
||||
"jsonrpc": "2.0",
|
||||
"result": GetAnonymitySetSampleData.data,
|
||||
"id": "some requestId"
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -692,7 +732,9 @@ void main() {
|
|||
const jsonArgs = '["1",""]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenThrow(Exception());
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -721,13 +763,15 @@ void main() {
|
|||
const jsonArgs = '["some mints"]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenAnswer(
|
||||
(_) async => {
|
||||
(_) async => JsonRPCResponse(data: {
|
||||
"jsonrpc": "2.0",
|
||||
"result": "mint meta data",
|
||||
"id": "some requestId"
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -754,7 +798,9 @@ void main() {
|
|||
const jsonArgs = '["some mints"]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenThrow(Exception());
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -783,13 +829,15 @@ void main() {
|
|||
const jsonArgs = '["0"]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenAnswer(
|
||||
(_) async => {
|
||||
(_) async => JsonRPCResponse(data: {
|
||||
"jsonrpc": "2.0",
|
||||
"result": GetUsedSerialsSampleData.serials,
|
||||
"id": "some requestId"
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -816,7 +864,9 @@ void main() {
|
|||
const jsonArgs = '["0"]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenThrow(Exception());
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -845,9 +895,15 @@ void main() {
|
|||
const jsonArgs = '[]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenAnswer(
|
||||
(_) async => {"jsonrpc": "2.0", "result": 1, "id": "some requestId"},
|
||||
(_) async => JsonRPCResponse(data: {
|
||||
"jsonrpc": "2.0",
|
||||
"result": 1,
|
||||
"id": "some requestId",
|
||||
}),
|
||||
);
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -873,7 +929,9 @@ void main() {
|
|||
const jsonArgs = '[]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenThrow(Exception());
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -886,7 +944,10 @@ void main() {
|
|||
prefs: mockPrefs,
|
||||
failovers: []);
|
||||
|
||||
expect(() => client.getLatestCoinId(requestID: "some requestId"),
|
||||
expect(
|
||||
() => client.getLatestCoinId(
|
||||
requestID: "some requestId",
|
||||
),
|
||||
throwsA(isA<Exception>()));
|
||||
verify(mockPrefs.wifiOnly).called(1);
|
||||
verifyNoMoreInteractions(mockPrefs);
|
||||
|
@ -900,13 +961,15 @@ void main() {
|
|||
const jsonArgs = '["1",""]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenAnswer(
|
||||
(_) async => {
|
||||
(_) async => JsonRPCResponse(data: {
|
||||
"jsonrpc": "2.0",
|
||||
"result": GetAnonymitySetSampleData.data,
|
||||
"id": "some requestId"
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -933,7 +996,9 @@ void main() {
|
|||
const jsonArgs = '["1",""]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenThrow(Exception());
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -947,8 +1012,10 @@ void main() {
|
|||
failovers: []);
|
||||
|
||||
expect(
|
||||
() =>
|
||||
client.getAnonymitySet(groupId: "1", requestID: "some requestId"),
|
||||
() => client.getAnonymitySet(
|
||||
groupId: "1",
|
||||
requestID: "some requestId",
|
||||
),
|
||||
throwsA(isA<Exception>()));
|
||||
verify(mockPrefs.wifiOnly).called(1);
|
||||
verifyNoMoreInteractions(mockPrefs);
|
||||
|
@ -962,13 +1029,15 @@ void main() {
|
|||
const jsonArgs = '["some mints"]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenAnswer(
|
||||
(_) async => {
|
||||
(_) async => JsonRPCResponse(data: {
|
||||
"jsonrpc": "2.0",
|
||||
"result": "mint meta data",
|
||||
"id": "some requestId"
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -995,7 +1064,9 @@ void main() {
|
|||
const jsonArgs = '["some mints"]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenThrow(Exception());
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -1010,7 +1081,9 @@ void main() {
|
|||
|
||||
expect(
|
||||
() => client.getMintData(
|
||||
mints: "some mints", requestID: "some requestId"),
|
||||
mints: "some mints",
|
||||
requestID: "some requestId",
|
||||
),
|
||||
throwsA(isA<Exception>()));
|
||||
verify(mockPrefs.wifiOnly).called(1);
|
||||
verifyNoMoreInteractions(mockPrefs);
|
||||
|
@ -1024,13 +1097,15 @@ void main() {
|
|||
const jsonArgs = '["0"]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenAnswer(
|
||||
(_) async => {
|
||||
(_) async => JsonRPCResponse(data: {
|
||||
"jsonrpc": "2.0",
|
||||
"result": GetUsedSerialsSampleData.serials,
|
||||
"id": "some requestId"
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -1057,7 +1132,9 @@ void main() {
|
|||
const jsonArgs = '["0"]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenThrow(Exception());
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -1086,9 +1163,15 @@ void main() {
|
|||
const jsonArgs = '[]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenAnswer(
|
||||
(_) async => {"jsonrpc": "2.0", "result": 1, "id": "some requestId"},
|
||||
(_) async => JsonRPCResponse(data: {
|
||||
"jsonrpc": "2.0",
|
||||
"result": 1,
|
||||
"id": "some requestId",
|
||||
}),
|
||||
);
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -1114,7 +1197,9 @@ void main() {
|
|||
const jsonArgs = '[]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenThrow(Exception());
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -1141,15 +1226,17 @@ void main() {
|
|||
const jsonArgs = '[]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenAnswer(
|
||||
(_) async => {
|
||||
(_) async => JsonRPCResponse(data: {
|
||||
"jsonrpc": "2.0",
|
||||
"result": {
|
||||
"rate": 1000,
|
||||
},
|
||||
"id": "some requestId"
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
@ -1175,7 +1262,9 @@ void main() {
|
|||
const jsonArgs = '[]';
|
||||
when(
|
||||
mockClient.request(
|
||||
'{"jsonrpc": "2.0", "id": "some requestId","method": "$command","params": $jsonArgs}'),
|
||||
'{"jsonrpc": "2.0", "id": "some requestId",'
|
||||
'"method": "$command","params": $jsonArgs}',
|
||||
),
|
||||
).thenThrow(Exception());
|
||||
|
||||
final mockPrefs = MockPrefs();
|
||||
|
|
|
@ -33,6 +33,17 @@ class _FakeDuration_0 extends _i1.SmartFake implements Duration {
|
|||
);
|
||||
}
|
||||
|
||||
class _FakeJsonRPCResponse_1 extends _i1.SmartFake
|
||||
implements _i2.JsonRPCResponse {
|
||||
_FakeJsonRPCResponse_1(
|
||||
Object parent,
|
||||
Invocation parentInvocation,
|
||||
) : super(
|
||||
parent,
|
||||
parentInvocation,
|
||||
);
|
||||
}
|
||||
|
||||
/// A class which mocks [JsonRPC].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
|
@ -47,40 +58,16 @@ class MockJsonRPC extends _i1.Mock implements _i2.JsonRPC {
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
set useSSL(bool? _useSSL) => super.noSuchMethod(
|
||||
Invocation.setter(
|
||||
#useSSL,
|
||||
_useSSL,
|
||||
),
|
||||
returnValueForMissingStub: null,
|
||||
);
|
||||
@override
|
||||
String get host => (super.noSuchMethod(
|
||||
Invocation.getter(#host),
|
||||
returnValue: '',
|
||||
) as String);
|
||||
@override
|
||||
set host(String? _host) => super.noSuchMethod(
|
||||
Invocation.setter(
|
||||
#host,
|
||||
_host,
|
||||
),
|
||||
returnValueForMissingStub: null,
|
||||
);
|
||||
@override
|
||||
int get port => (super.noSuchMethod(
|
||||
Invocation.getter(#port),
|
||||
returnValue: 0,
|
||||
) as int);
|
||||
@override
|
||||
set port(int? _port) => super.noSuchMethod(
|
||||
Invocation.setter(
|
||||
#port,
|
||||
_port,
|
||||
),
|
||||
returnValueForMissingStub: null,
|
||||
);
|
||||
@override
|
||||
Duration get connectionTimeout => (super.noSuchMethod(
|
||||
Invocation.getter(#connectionTimeout),
|
||||
returnValue: _FakeDuration_0(
|
||||
|
@ -89,21 +76,40 @@ class MockJsonRPC extends _i1.Mock implements _i2.JsonRPC {
|
|||
),
|
||||
) as Duration);
|
||||
@override
|
||||
set connectionTimeout(Duration? _connectionTimeout) => super.noSuchMethod(
|
||||
Invocation.setter(
|
||||
#connectionTimeout,
|
||||
_connectionTimeout,
|
||||
),
|
||||
returnValueForMissingStub: null,
|
||||
);
|
||||
@override
|
||||
_i3.Future<dynamic> request(String? jsonRpcRequest) => (super.noSuchMethod(
|
||||
_i3.Future<_i2.JsonRPCResponse> request(String? jsonRpcRequest) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#request,
|
||||
[jsonRpcRequest],
|
||||
),
|
||||
returnValue: _i3.Future<dynamic>.value(),
|
||||
) as _i3.Future<dynamic>);
|
||||
returnValue:
|
||||
_i3.Future<_i2.JsonRPCResponse>.value(_FakeJsonRPCResponse_1(
|
||||
this,
|
||||
Invocation.method(
|
||||
#request,
|
||||
[jsonRpcRequest],
|
||||
),
|
||||
)),
|
||||
) as _i3.Future<_i2.JsonRPCResponse>);
|
||||
@override
|
||||
_i3.Future<void> disconnect({required String? reason}) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#disconnect,
|
||||
[],
|
||||
{#reason: reason},
|
||||
),
|
||||
returnValue: _i3.Future<void>.value(),
|
||||
returnValueForMissingStub: _i3.Future<void>.value(),
|
||||
) as _i3.Future<void>);
|
||||
@override
|
||||
_i3.Future<void> connect() => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#connect,
|
||||
[],
|
||||
),
|
||||
returnValue: _i3.Future<void>.value(),
|
||||
returnValueForMissingStub: _i3.Future<void>.value(),
|
||||
) as _i3.Future<void>);
|
||||
}
|
||||
|
||||
/// A class which mocks [Prefs].
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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]");
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
@ -3,24 +3,23 @@
|
|||
// Do not manually edit this file.
|
||||
|
||||
// ignore_for_file: no_leading_underscores_for_library_prefixes
|
||||
import 'dart:async' as _i9;
|
||||
import 'dart:ui' as _i15;
|
||||
import 'dart:async' as _i8;
|
||||
import 'dart:ui' as _i14;
|
||||
|
||||
import 'package:local_auth/auth_strings.dart' as _i12;
|
||||
import 'package:local_auth/local_auth.dart' as _i11;
|
||||
import 'package:local_auth/auth_strings.dart' as _i11;
|
||||
import 'package:local_auth/local_auth.dart' as _i10;
|
||||
import 'package:mockito/mockito.dart' as _i1;
|
||||
import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i7;
|
||||
import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i8;
|
||||
import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i2;
|
||||
import 'package:stackwallet/models/balance.dart' as _i5;
|
||||
import 'package:stackwallet/models/isar/models/isar_models.dart' as _i17;
|
||||
import 'package:stackwallet/models/isar/models/isar_models.dart' as _i16;
|
||||
import 'package:stackwallet/models/models.dart' as _i4;
|
||||
import 'package:stackwallet/services/coins/coin_service.dart' as _i3;
|
||||
import 'package:stackwallet/services/coins/manager.dart' as _i16;
|
||||
import 'package:stackwallet/services/wallets_service.dart' as _i14;
|
||||
import 'package:stackwallet/services/coins/manager.dart' as _i15;
|
||||
import 'package:stackwallet/services/wallets_service.dart' as _i13;
|
||||
import 'package:stackwallet/utilities/amount/amount.dart' as _i6;
|
||||
import 'package:stackwallet/utilities/biometrics.dart' as _i13;
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i10;
|
||||
import 'package:stackwallet/utilities/prefs.dart' as _i2;
|
||||
import 'package:stackwallet/utilities/biometrics.dart' as _i12;
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i9;
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: avoid_redundant_argument_values
|
||||
|
@ -33,8 +32,8 @@ import 'package:stackwallet/utilities/prefs.dart' as _i2;
|
|||
// ignore_for_file: camel_case_types
|
||||
// ignore_for_file: subtype_of_sealed_class
|
||||
|
||||
class _FakePrefs_0 extends _i1.SmartFake implements _i2.Prefs {
|
||||
_FakePrefs_0(
|
||||
class _FakeElectrumX_0 extends _i1.SmartFake implements _i2.ElectrumX {
|
||||
_FakeElectrumX_0(
|
||||
Object parent,
|
||||
Invocation parentInvocation,
|
||||
) : super(
|
||||
|
@ -93,38 +92,18 @@ class MockCachedElectrumX extends _i1.Mock implements _i7.CachedElectrumX {
|
|||
}
|
||||
|
||||
@override
|
||||
String get server => (super.noSuchMethod(
|
||||
Invocation.getter(#server),
|
||||
returnValue: '',
|
||||
) as String);
|
||||
@override
|
||||
int get port => (super.noSuchMethod(
|
||||
Invocation.getter(#port),
|
||||
returnValue: 0,
|
||||
) as int);
|
||||
@override
|
||||
bool get useSSL => (super.noSuchMethod(
|
||||
Invocation.getter(#useSSL),
|
||||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i2.Prefs get prefs => (super.noSuchMethod(
|
||||
Invocation.getter(#prefs),
|
||||
returnValue: _FakePrefs_0(
|
||||
_i2.ElectrumX get electrumXClient => (super.noSuchMethod(
|
||||
Invocation.getter(#electrumXClient),
|
||||
returnValue: _FakeElectrumX_0(
|
||||
this,
|
||||
Invocation.getter(#prefs),
|
||||
Invocation.getter(#electrumXClient),
|
||||
),
|
||||
) as _i2.Prefs);
|
||||
) as _i2.ElectrumX);
|
||||
@override
|
||||
List<_i8.ElectrumXNode> get failovers => (super.noSuchMethod(
|
||||
Invocation.getter(#failovers),
|
||||
returnValue: <_i8.ElectrumXNode>[],
|
||||
) as List<_i8.ElectrumXNode>);
|
||||
@override
|
||||
_i9.Future<Map<String, dynamic>> getAnonymitySet({
|
||||
_i8.Future<Map<String, dynamic>> getAnonymitySet({
|
||||
required String? groupId,
|
||||
String? blockhash = r'',
|
||||
required _i10.Coin? coin,
|
||||
required _i9.Coin? coin,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -137,8 +116,8 @@ class MockCachedElectrumX extends _i1.Mock implements _i7.CachedElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i9.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i9.Future<Map<String, dynamic>>);
|
||||
_i8.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i8.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
String base64ToHex(String? source) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -156,9 +135,9 @@ class MockCachedElectrumX extends _i1.Mock implements _i7.CachedElectrumX {
|
|||
returnValue: '',
|
||||
) as String);
|
||||
@override
|
||||
_i9.Future<Map<String, dynamic>> getTransaction({
|
||||
_i8.Future<Map<String, dynamic>> getTransaction({
|
||||
required String? txHash,
|
||||
required _i10.Coin? coin,
|
||||
required _i9.Coin? coin,
|
||||
bool? verbose = true,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
|
@ -172,11 +151,11 @@ class MockCachedElectrumX extends _i1.Mock implements _i7.CachedElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i9.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i9.Future<Map<String, dynamic>>);
|
||||
_i8.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i8.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i9.Future<List<String>> getUsedCoinSerials({
|
||||
required _i10.Coin? coin,
|
||||
_i8.Future<List<String>> getUsedCoinSerials({
|
||||
required _i9.Coin? coin,
|
||||
int? startNumber = 0,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
|
@ -188,43 +167,43 @@ class MockCachedElectrumX extends _i1.Mock implements _i7.CachedElectrumX {
|
|||
#startNumber: startNumber,
|
||||
},
|
||||
),
|
||||
returnValue: _i9.Future<List<String>>.value(<String>[]),
|
||||
) as _i9.Future<List<String>>);
|
||||
returnValue: _i8.Future<List<String>>.value(<String>[]),
|
||||
) as _i8.Future<List<String>>);
|
||||
@override
|
||||
_i9.Future<void> clearSharedTransactionCache({required _i10.Coin? coin}) =>
|
||||
_i8.Future<void> clearSharedTransactionCache({required _i9.Coin? coin}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#clearSharedTransactionCache,
|
||||
[],
|
||||
{#coin: coin},
|
||||
),
|
||||
returnValue: _i9.Future<void>.value(),
|
||||
returnValueForMissingStub: _i9.Future<void>.value(),
|
||||
) as _i9.Future<void>);
|
||||
returnValue: _i8.Future<void>.value(),
|
||||
returnValueForMissingStub: _i8.Future<void>.value(),
|
||||
) as _i8.Future<void>);
|
||||
}
|
||||
|
||||
/// A class which mocks [LocalAuthentication].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockLocalAuthentication extends _i1.Mock
|
||||
implements _i11.LocalAuthentication {
|
||||
implements _i10.LocalAuthentication {
|
||||
MockLocalAuthentication() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
||||
@override
|
||||
_i9.Future<bool> get canCheckBiometrics => (super.noSuchMethod(
|
||||
_i8.Future<bool> get canCheckBiometrics => (super.noSuchMethod(
|
||||
Invocation.getter(#canCheckBiometrics),
|
||||
returnValue: _i9.Future<bool>.value(false),
|
||||
) as _i9.Future<bool>);
|
||||
returnValue: _i8.Future<bool>.value(false),
|
||||
) as _i8.Future<bool>);
|
||||
@override
|
||||
_i9.Future<bool> authenticateWithBiometrics({
|
||||
_i8.Future<bool> authenticateWithBiometrics({
|
||||
required String? localizedReason,
|
||||
bool? useErrorDialogs = true,
|
||||
bool? stickyAuth = false,
|
||||
_i12.AndroidAuthMessages? androidAuthStrings =
|
||||
const _i12.AndroidAuthMessages(),
|
||||
_i12.IOSAuthMessages? iOSAuthStrings = const _i12.IOSAuthMessages(),
|
||||
_i11.AndroidAuthMessages? androidAuthStrings =
|
||||
const _i11.AndroidAuthMessages(),
|
||||
_i11.IOSAuthMessages? iOSAuthStrings = const _i11.IOSAuthMessages(),
|
||||
bool? sensitiveTransaction = true,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
|
@ -240,16 +219,16 @@ class MockLocalAuthentication extends _i1.Mock
|
|||
#sensitiveTransaction: sensitiveTransaction,
|
||||
},
|
||||
),
|
||||
returnValue: _i9.Future<bool>.value(false),
|
||||
) as _i9.Future<bool>);
|
||||
returnValue: _i8.Future<bool>.value(false),
|
||||
) as _i8.Future<bool>);
|
||||
@override
|
||||
_i9.Future<bool> authenticate({
|
||||
_i8.Future<bool> authenticate({
|
||||
required String? localizedReason,
|
||||
bool? useErrorDialogs = true,
|
||||
bool? stickyAuth = false,
|
||||
_i12.AndroidAuthMessages? androidAuthStrings =
|
||||
const _i12.AndroidAuthMessages(),
|
||||
_i12.IOSAuthMessages? iOSAuthStrings = const _i12.IOSAuthMessages(),
|
||||
_i11.AndroidAuthMessages? androidAuthStrings =
|
||||
const _i11.AndroidAuthMessages(),
|
||||
_i11.IOSAuthMessages? iOSAuthStrings = const _i11.IOSAuthMessages(),
|
||||
bool? sensitiveTransaction = true,
|
||||
bool? biometricOnly = false,
|
||||
}) =>
|
||||
|
@ -267,46 +246,46 @@ class MockLocalAuthentication extends _i1.Mock
|
|||
#biometricOnly: biometricOnly,
|
||||
},
|
||||
),
|
||||
returnValue: _i9.Future<bool>.value(false),
|
||||
) as _i9.Future<bool>);
|
||||
returnValue: _i8.Future<bool>.value(false),
|
||||
) as _i8.Future<bool>);
|
||||
@override
|
||||
_i9.Future<bool> stopAuthentication() => (super.noSuchMethod(
|
||||
_i8.Future<bool> stopAuthentication() => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#stopAuthentication,
|
||||
[],
|
||||
),
|
||||
returnValue: _i9.Future<bool>.value(false),
|
||||
) as _i9.Future<bool>);
|
||||
returnValue: _i8.Future<bool>.value(false),
|
||||
) as _i8.Future<bool>);
|
||||
@override
|
||||
_i9.Future<bool> isDeviceSupported() => (super.noSuchMethod(
|
||||
_i8.Future<bool> isDeviceSupported() => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#isDeviceSupported,
|
||||
[],
|
||||
),
|
||||
returnValue: _i9.Future<bool>.value(false),
|
||||
) as _i9.Future<bool>);
|
||||
returnValue: _i8.Future<bool>.value(false),
|
||||
) as _i8.Future<bool>);
|
||||
@override
|
||||
_i9.Future<List<_i11.BiometricType>> getAvailableBiometrics() =>
|
||||
_i8.Future<List<_i10.BiometricType>> getAvailableBiometrics() =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getAvailableBiometrics,
|
||||
[],
|
||||
),
|
||||
returnValue:
|
||||
_i9.Future<List<_i11.BiometricType>>.value(<_i11.BiometricType>[]),
|
||||
) as _i9.Future<List<_i11.BiometricType>>);
|
||||
_i8.Future<List<_i10.BiometricType>>.value(<_i10.BiometricType>[]),
|
||||
) as _i8.Future<List<_i10.BiometricType>>);
|
||||
}
|
||||
|
||||
/// A class which mocks [Biometrics].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockBiometrics extends _i1.Mock implements _i13.Biometrics {
|
||||
class MockBiometrics extends _i1.Mock implements _i12.Biometrics {
|
||||
MockBiometrics() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
||||
@override
|
||||
_i9.Future<bool> authenticate({
|
||||
_i8.Future<bool> authenticate({
|
||||
required String? cancelButtonText,
|
||||
required String? localizedReason,
|
||||
required String? title,
|
||||
|
@ -321,28 +300,28 @@ class MockBiometrics extends _i1.Mock implements _i13.Biometrics {
|
|||
#title: title,
|
||||
},
|
||||
),
|
||||
returnValue: _i9.Future<bool>.value(false),
|
||||
) as _i9.Future<bool>);
|
||||
returnValue: _i8.Future<bool>.value(false),
|
||||
) as _i8.Future<bool>);
|
||||
}
|
||||
|
||||
/// A class which mocks [WalletsService].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockWalletsService extends _i1.Mock implements _i14.WalletsService {
|
||||
class MockWalletsService extends _i1.Mock implements _i13.WalletsService {
|
||||
@override
|
||||
_i9.Future<Map<String, _i14.WalletInfo>> get walletNames =>
|
||||
_i8.Future<Map<String, _i13.WalletInfo>> get walletNames =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.getter(#walletNames),
|
||||
returnValue: _i9.Future<Map<String, _i14.WalletInfo>>.value(
|
||||
<String, _i14.WalletInfo>{}),
|
||||
) as _i9.Future<Map<String, _i14.WalletInfo>>);
|
||||
returnValue: _i8.Future<Map<String, _i13.WalletInfo>>.value(
|
||||
<String, _i13.WalletInfo>{}),
|
||||
) as _i8.Future<Map<String, _i13.WalletInfo>>);
|
||||
@override
|
||||
bool get hasListeners => (super.noSuchMethod(
|
||||
Invocation.getter(#hasListeners),
|
||||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i9.Future<bool> renameWallet({
|
||||
_i8.Future<bool> renameWallet({
|
||||
required String? from,
|
||||
required String? to,
|
||||
required bool? shouldNotifyListeners,
|
||||
|
@ -357,21 +336,21 @@ class MockWalletsService extends _i1.Mock implements _i14.WalletsService {
|
|||
#shouldNotifyListeners: shouldNotifyListeners,
|
||||
},
|
||||
),
|
||||
returnValue: _i9.Future<bool>.value(false),
|
||||
) as _i9.Future<bool>);
|
||||
returnValue: _i8.Future<bool>.value(false),
|
||||
) as _i8.Future<bool>);
|
||||
@override
|
||||
Map<String, _i14.WalletInfo> fetchWalletsData() => (super.noSuchMethod(
|
||||
Map<String, _i13.WalletInfo> fetchWalletsData() => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#fetchWalletsData,
|
||||
[],
|
||||
),
|
||||
returnValue: <String, _i14.WalletInfo>{},
|
||||
) as Map<String, _i14.WalletInfo>);
|
||||
returnValue: <String, _i13.WalletInfo>{},
|
||||
) as Map<String, _i13.WalletInfo>);
|
||||
@override
|
||||
_i9.Future<void> addExistingStackWallet({
|
||||
_i8.Future<void> addExistingStackWallet({
|
||||
required String? name,
|
||||
required String? walletId,
|
||||
required _i10.Coin? coin,
|
||||
required _i9.Coin? coin,
|
||||
required bool? shouldNotifyListeners,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
|
@ -385,13 +364,13 @@ class MockWalletsService extends _i1.Mock implements _i14.WalletsService {
|
|||
#shouldNotifyListeners: shouldNotifyListeners,
|
||||
},
|
||||
),
|
||||
returnValue: _i9.Future<void>.value(),
|
||||
returnValueForMissingStub: _i9.Future<void>.value(),
|
||||
) as _i9.Future<void>);
|
||||
returnValue: _i8.Future<void>.value(),
|
||||
returnValueForMissingStub: _i8.Future<void>.value(),
|
||||
) as _i8.Future<void>);
|
||||
@override
|
||||
_i9.Future<String?> addNewWallet({
|
||||
_i8.Future<String?> addNewWallet({
|
||||
required String? name,
|
||||
required _i10.Coin? coin,
|
||||
required _i9.Coin? coin,
|
||||
required bool? shouldNotifyListeners,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
|
@ -404,46 +383,46 @@ class MockWalletsService extends _i1.Mock implements _i14.WalletsService {
|
|||
#shouldNotifyListeners: shouldNotifyListeners,
|
||||
},
|
||||
),
|
||||
returnValue: _i9.Future<String?>.value(),
|
||||
) as _i9.Future<String?>);
|
||||
returnValue: _i8.Future<String?>.value(),
|
||||
) as _i8.Future<String?>);
|
||||
@override
|
||||
_i9.Future<List<String>> getFavoriteWalletIds() => (super.noSuchMethod(
|
||||
_i8.Future<List<String>> getFavoriteWalletIds() => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getFavoriteWalletIds,
|
||||
[],
|
||||
),
|
||||
returnValue: _i9.Future<List<String>>.value(<String>[]),
|
||||
) as _i9.Future<List<String>>);
|
||||
returnValue: _i8.Future<List<String>>.value(<String>[]),
|
||||
) as _i8.Future<List<String>>);
|
||||
@override
|
||||
_i9.Future<void> saveFavoriteWalletIds(List<String>? walletIds) =>
|
||||
_i8.Future<void> saveFavoriteWalletIds(List<String>? walletIds) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#saveFavoriteWalletIds,
|
||||
[walletIds],
|
||||
),
|
||||
returnValue: _i9.Future<void>.value(),
|
||||
returnValueForMissingStub: _i9.Future<void>.value(),
|
||||
) as _i9.Future<void>);
|
||||
returnValue: _i8.Future<void>.value(),
|
||||
returnValueForMissingStub: _i8.Future<void>.value(),
|
||||
) as _i8.Future<void>);
|
||||
@override
|
||||
_i9.Future<void> addFavorite(String? walletId) => (super.noSuchMethod(
|
||||
_i8.Future<void> addFavorite(String? walletId) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#addFavorite,
|
||||
[walletId],
|
||||
),
|
||||
returnValue: _i9.Future<void>.value(),
|
||||
returnValueForMissingStub: _i9.Future<void>.value(),
|
||||
) as _i9.Future<void>);
|
||||
returnValue: _i8.Future<void>.value(),
|
||||
returnValueForMissingStub: _i8.Future<void>.value(),
|
||||
) as _i8.Future<void>);
|
||||
@override
|
||||
_i9.Future<void> removeFavorite(String? walletId) => (super.noSuchMethod(
|
||||
_i8.Future<void> removeFavorite(String? walletId) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#removeFavorite,
|
||||
[walletId],
|
||||
),
|
||||
returnValue: _i9.Future<void>.value(),
|
||||
returnValueForMissingStub: _i9.Future<void>.value(),
|
||||
) as _i9.Future<void>);
|
||||
returnValue: _i8.Future<void>.value(),
|
||||
returnValueForMissingStub: _i8.Future<void>.value(),
|
||||
) as _i8.Future<void>);
|
||||
@override
|
||||
_i9.Future<void> moveFavorite({
|
||||
_i8.Future<void> moveFavorite({
|
||||
required int? fromIndex,
|
||||
required int? toIndex,
|
||||
}) =>
|
||||
|
@ -456,48 +435,48 @@ class MockWalletsService extends _i1.Mock implements _i14.WalletsService {
|
|||
#toIndex: toIndex,
|
||||
},
|
||||
),
|
||||
returnValue: _i9.Future<void>.value(),
|
||||
returnValueForMissingStub: _i9.Future<void>.value(),
|
||||
) as _i9.Future<void>);
|
||||
returnValue: _i8.Future<void>.value(),
|
||||
returnValueForMissingStub: _i8.Future<void>.value(),
|
||||
) as _i8.Future<void>);
|
||||
@override
|
||||
_i9.Future<bool> checkForDuplicate(String? name) => (super.noSuchMethod(
|
||||
_i8.Future<bool> checkForDuplicate(String? name) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#checkForDuplicate,
|
||||
[name],
|
||||
),
|
||||
returnValue: _i9.Future<bool>.value(false),
|
||||
) as _i9.Future<bool>);
|
||||
returnValue: _i8.Future<bool>.value(false),
|
||||
) as _i8.Future<bool>);
|
||||
@override
|
||||
_i9.Future<String?> getWalletId(String? walletName) => (super.noSuchMethod(
|
||||
_i8.Future<String?> getWalletId(String? walletName) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getWalletId,
|
||||
[walletName],
|
||||
),
|
||||
returnValue: _i9.Future<String?>.value(),
|
||||
) as _i9.Future<String?>);
|
||||
returnValue: _i8.Future<String?>.value(),
|
||||
) as _i8.Future<String?>);
|
||||
@override
|
||||
_i9.Future<bool> isMnemonicVerified({required String? walletId}) =>
|
||||
_i8.Future<bool> isMnemonicVerified({required String? walletId}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#isMnemonicVerified,
|
||||
[],
|
||||
{#walletId: walletId},
|
||||
),
|
||||
returnValue: _i9.Future<bool>.value(false),
|
||||
) as _i9.Future<bool>);
|
||||
returnValue: _i8.Future<bool>.value(false),
|
||||
) as _i8.Future<bool>);
|
||||
@override
|
||||
_i9.Future<void> setMnemonicVerified({required String? walletId}) =>
|
||||
_i8.Future<void> setMnemonicVerified({required String? walletId}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#setMnemonicVerified,
|
||||
[],
|
||||
{#walletId: walletId},
|
||||
),
|
||||
returnValue: _i9.Future<void>.value(),
|
||||
returnValueForMissingStub: _i9.Future<void>.value(),
|
||||
) as _i9.Future<void>);
|
||||
returnValue: _i8.Future<void>.value(),
|
||||
returnValueForMissingStub: _i8.Future<void>.value(),
|
||||
) as _i8.Future<void>);
|
||||
@override
|
||||
_i9.Future<int> deleteWallet(
|
||||
_i8.Future<int> deleteWallet(
|
||||
String? name,
|
||||
bool? shouldNotifyListeners,
|
||||
) =>
|
||||
|
@ -509,20 +488,20 @@ class MockWalletsService extends _i1.Mock implements _i14.WalletsService {
|
|||
shouldNotifyListeners,
|
||||
],
|
||||
),
|
||||
returnValue: _i9.Future<int>.value(0),
|
||||
) as _i9.Future<int>);
|
||||
returnValue: _i8.Future<int>.value(0),
|
||||
) as _i8.Future<int>);
|
||||
@override
|
||||
_i9.Future<void> refreshWallets(bool? shouldNotifyListeners) =>
|
||||
_i8.Future<void> refreshWallets(bool? shouldNotifyListeners) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#refreshWallets,
|
||||
[shouldNotifyListeners],
|
||||
),
|
||||
returnValue: _i9.Future<void>.value(),
|
||||
returnValueForMissingStub: _i9.Future<void>.value(),
|
||||
) as _i9.Future<void>);
|
||||
returnValue: _i8.Future<void>.value(),
|
||||
returnValueForMissingStub: _i8.Future<void>.value(),
|
||||
) as _i8.Future<void>);
|
||||
@override
|
||||
void addListener(_i15.VoidCallback? listener) => super.noSuchMethod(
|
||||
void addListener(_i14.VoidCallback? listener) => super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#addListener,
|
||||
[listener],
|
||||
|
@ -530,7 +509,7 @@ class MockWalletsService extends _i1.Mock implements _i14.WalletsService {
|
|||
returnValueForMissingStub: null,
|
||||
);
|
||||
@override
|
||||
void removeListener(_i15.VoidCallback? listener) => super.noSuchMethod(
|
||||
void removeListener(_i14.VoidCallback? listener) => super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#removeListener,
|
||||
[listener],
|
||||
|
@ -558,7 +537,7 @@ class MockWalletsService extends _i1.Mock implements _i14.WalletsService {
|
|||
/// A class which mocks [Manager].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockManager extends _i1.Mock implements _i16.Manager {
|
||||
class MockManager extends _i1.Mock implements _i15.Manager {
|
||||
@override
|
||||
bool get isActiveWallet => (super.noSuchMethod(
|
||||
Invocation.getter(#isActiveWallet),
|
||||
|
@ -586,10 +565,10 @@ class MockManager extends _i1.Mock implements _i16.Manager {
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i10.Coin get coin => (super.noSuchMethod(
|
||||
_i9.Coin get coin => (super.noSuchMethod(
|
||||
Invocation.getter(#coin),
|
||||
returnValue: _i10.Coin.bitcoin,
|
||||
) as _i10.Coin);
|
||||
returnValue: _i9.Coin.bitcoin,
|
||||
) as _i9.Coin);
|
||||
@override
|
||||
bool get isRefreshing => (super.noSuchMethod(
|
||||
Invocation.getter(#isRefreshing),
|
||||
|
@ -622,23 +601,23 @@ class MockManager extends _i1.Mock implements _i16.Manager {
|
|||
returnValueForMissingStub: null,
|
||||
);
|
||||
@override
|
||||
_i9.Future<_i4.FeeObject> get fees => (super.noSuchMethod(
|
||||
_i8.Future<_i4.FeeObject> get fees => (super.noSuchMethod(
|
||||
Invocation.getter(#fees),
|
||||
returnValue: _i9.Future<_i4.FeeObject>.value(_FakeFeeObject_2(
|
||||
returnValue: _i8.Future<_i4.FeeObject>.value(_FakeFeeObject_2(
|
||||
this,
|
||||
Invocation.getter(#fees),
|
||||
)),
|
||||
) as _i9.Future<_i4.FeeObject>);
|
||||
) as _i8.Future<_i4.FeeObject>);
|
||||
@override
|
||||
_i9.Future<int> get maxFee => (super.noSuchMethod(
|
||||
_i8.Future<int> get maxFee => (super.noSuchMethod(
|
||||
Invocation.getter(#maxFee),
|
||||
returnValue: _i9.Future<int>.value(0),
|
||||
) as _i9.Future<int>);
|
||||
returnValue: _i8.Future<int>.value(0),
|
||||
) as _i8.Future<int>);
|
||||
@override
|
||||
_i9.Future<String> get currentReceivingAddress => (super.noSuchMethod(
|
||||
_i8.Future<String> get currentReceivingAddress => (super.noSuchMethod(
|
||||
Invocation.getter(#currentReceivingAddress),
|
||||
returnValue: _i9.Future<String>.value(''),
|
||||
) as _i9.Future<String>);
|
||||
returnValue: _i8.Future<String>.value(''),
|
||||
) as _i8.Future<String>);
|
||||
@override
|
||||
_i5.Balance get balance => (super.noSuchMethod(
|
||||
Invocation.getter(#balance),
|
||||
|
@ -648,16 +627,16 @@ class MockManager extends _i1.Mock implements _i16.Manager {
|
|||
),
|
||||
) as _i5.Balance);
|
||||
@override
|
||||
_i9.Future<List<_i17.Transaction>> get transactions => (super.noSuchMethod(
|
||||
_i8.Future<List<_i16.Transaction>> get transactions => (super.noSuchMethod(
|
||||
Invocation.getter(#transactions),
|
||||
returnValue:
|
||||
_i9.Future<List<_i17.Transaction>>.value(<_i17.Transaction>[]),
|
||||
) as _i9.Future<List<_i17.Transaction>>);
|
||||
_i8.Future<List<_i16.Transaction>>.value(<_i16.Transaction>[]),
|
||||
) as _i8.Future<List<_i16.Transaction>>);
|
||||
@override
|
||||
_i9.Future<List<_i17.UTXO>> get utxos => (super.noSuchMethod(
|
||||
_i8.Future<List<_i16.UTXO>> get utxos => (super.noSuchMethod(
|
||||
Invocation.getter(#utxos),
|
||||
returnValue: _i9.Future<List<_i17.UTXO>>.value(<_i17.UTXO>[]),
|
||||
) as _i9.Future<List<_i17.UTXO>>);
|
||||
returnValue: _i8.Future<List<_i16.UTXO>>.value(<_i16.UTXO>[]),
|
||||
) as _i8.Future<List<_i16.UTXO>>);
|
||||
@override
|
||||
set walletName(String? newName) => super.noSuchMethod(
|
||||
Invocation.setter(
|
||||
|
@ -677,15 +656,15 @@ class MockManager extends _i1.Mock implements _i16.Manager {
|
|||
returnValue: '',
|
||||
) as String);
|
||||
@override
|
||||
_i9.Future<List<String>> get mnemonic => (super.noSuchMethod(
|
||||
_i8.Future<List<String>> get mnemonic => (super.noSuchMethod(
|
||||
Invocation.getter(#mnemonic),
|
||||
returnValue: _i9.Future<List<String>>.value(<String>[]),
|
||||
) as _i9.Future<List<String>>);
|
||||
returnValue: _i8.Future<List<String>>.value(<String>[]),
|
||||
) as _i8.Future<List<String>>);
|
||||
@override
|
||||
_i9.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
|
||||
_i8.Future<String?> get mnemonicPassphrase => (super.noSuchMethod(
|
||||
Invocation.getter(#mnemonicPassphrase),
|
||||
returnValue: _i9.Future<String?>.value(),
|
||||
) as _i9.Future<String?>);
|
||||
returnValue: _i8.Future<String?>.value(),
|
||||
) as _i8.Future<String?>);
|
||||
@override
|
||||
bool get isConnected => (super.noSuchMethod(
|
||||
Invocation.getter(#isConnected),
|
||||
|
@ -727,24 +706,24 @@ class MockManager extends _i1.Mock implements _i16.Manager {
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i9.Future<String> get xpub => (super.noSuchMethod(
|
||||
_i8.Future<String> get xpub => (super.noSuchMethod(
|
||||
Invocation.getter(#xpub),
|
||||
returnValue: _i9.Future<String>.value(''),
|
||||
) as _i9.Future<String>);
|
||||
returnValue: _i8.Future<String>.value(''),
|
||||
) as _i8.Future<String>);
|
||||
@override
|
||||
bool get hasListeners => (super.noSuchMethod(
|
||||
Invocation.getter(#hasListeners),
|
||||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i9.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
|
||||
_i8.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#updateNode,
|
||||
[shouldRefresh],
|
||||
),
|
||||
returnValue: _i9.Future<void>.value(),
|
||||
returnValueForMissingStub: _i9.Future<void>.value(),
|
||||
) as _i9.Future<void>);
|
||||
returnValue: _i8.Future<void>.value(),
|
||||
returnValueForMissingStub: _i8.Future<void>.value(),
|
||||
) as _i8.Future<void>);
|
||||
@override
|
||||
void dispose() => super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -754,7 +733,7 @@ class MockManager extends _i1.Mock implements _i16.Manager {
|
|||
returnValueForMissingStub: null,
|
||||
);
|
||||
@override
|
||||
_i9.Future<Map<String, dynamic>> prepareSend({
|
||||
_i8.Future<Map<String, dynamic>> prepareSend({
|
||||
required String? address,
|
||||
required _i6.Amount? amount,
|
||||
Map<String, dynamic>? args,
|
||||
|
@ -770,27 +749,27 @@ class MockManager extends _i1.Mock implements _i16.Manager {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i9.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i9.Future<Map<String, dynamic>>);
|
||||
_i8.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i8.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i9.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
|
||||
_i8.Future<String> confirmSend({required Map<String, dynamic>? txData}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#confirmSend,
|
||||
[],
|
||||
{#txData: txData},
|
||||
),
|
||||
returnValue: _i9.Future<String>.value(''),
|
||||
) as _i9.Future<String>);
|
||||
returnValue: _i8.Future<String>.value(''),
|
||||
) as _i8.Future<String>);
|
||||
@override
|
||||
_i9.Future<void> refresh() => (super.noSuchMethod(
|
||||
_i8.Future<void> refresh() => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#refresh,
|
||||
[],
|
||||
),
|
||||
returnValue: _i9.Future<void>.value(),
|
||||
returnValueForMissingStub: _i9.Future<void>.value(),
|
||||
) as _i9.Future<void>);
|
||||
returnValue: _i8.Future<void>.value(),
|
||||
returnValueForMissingStub: _i8.Future<void>.value(),
|
||||
) as _i8.Future<void>);
|
||||
@override
|
||||
bool validateAddress(String? address) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -800,33 +779,33 @@ class MockManager extends _i1.Mock implements _i16.Manager {
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i9.Future<bool> testNetworkConnection() => (super.noSuchMethod(
|
||||
_i8.Future<bool> testNetworkConnection() => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#testNetworkConnection,
|
||||
[],
|
||||
),
|
||||
returnValue: _i9.Future<bool>.value(false),
|
||||
) as _i9.Future<bool>);
|
||||
returnValue: _i8.Future<bool>.value(false),
|
||||
) as _i8.Future<bool>);
|
||||
@override
|
||||
_i9.Future<void> initializeNew() => (super.noSuchMethod(
|
||||
_i8.Future<void> initializeNew() => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#initializeNew,
|
||||
[],
|
||||
),
|
||||
returnValue: _i9.Future<void>.value(),
|
||||
returnValueForMissingStub: _i9.Future<void>.value(),
|
||||
) as _i9.Future<void>);
|
||||
returnValue: _i8.Future<void>.value(),
|
||||
returnValueForMissingStub: _i8.Future<void>.value(),
|
||||
) as _i8.Future<void>);
|
||||
@override
|
||||
_i9.Future<void> initializeExisting() => (super.noSuchMethod(
|
||||
_i8.Future<void> initializeExisting() => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#initializeExisting,
|
||||
[],
|
||||
),
|
||||
returnValue: _i9.Future<void>.value(),
|
||||
returnValueForMissingStub: _i9.Future<void>.value(),
|
||||
) as _i9.Future<void>);
|
||||
returnValue: _i8.Future<void>.value(),
|
||||
returnValueForMissingStub: _i8.Future<void>.value(),
|
||||
) as _i8.Future<void>);
|
||||
@override
|
||||
_i9.Future<void> recoverFromMnemonic({
|
||||
_i8.Future<void> recoverFromMnemonic({
|
||||
required String? mnemonic,
|
||||
String? mnemonicPassphrase,
|
||||
required int? maxUnusedAddressGap,
|
||||
|
@ -845,20 +824,20 @@ class MockManager extends _i1.Mock implements _i16.Manager {
|
|||
#height: height,
|
||||
},
|
||||
),
|
||||
returnValue: _i9.Future<void>.value(),
|
||||
returnValueForMissingStub: _i9.Future<void>.value(),
|
||||
) as _i9.Future<void>);
|
||||
returnValue: _i8.Future<void>.value(),
|
||||
returnValueForMissingStub: _i8.Future<void>.value(),
|
||||
) as _i8.Future<void>);
|
||||
@override
|
||||
_i9.Future<void> exitCurrentWallet() => (super.noSuchMethod(
|
||||
_i8.Future<void> exitCurrentWallet() => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#exitCurrentWallet,
|
||||
[],
|
||||
),
|
||||
returnValue: _i9.Future<void>.value(),
|
||||
returnValueForMissingStub: _i9.Future<void>.value(),
|
||||
) as _i9.Future<void>);
|
||||
returnValue: _i8.Future<void>.value(),
|
||||
returnValueForMissingStub: _i8.Future<void>.value(),
|
||||
) as _i8.Future<void>);
|
||||
@override
|
||||
_i9.Future<void> fullRescan(
|
||||
_i8.Future<void> fullRescan(
|
||||
int? maxUnusedAddressGap,
|
||||
int? maxNumberOfIndexesToCheck,
|
||||
) =>
|
||||
|
@ -870,11 +849,11 @@ class MockManager extends _i1.Mock implements _i16.Manager {
|
|||
maxNumberOfIndexesToCheck,
|
||||
],
|
||||
),
|
||||
returnValue: _i9.Future<void>.value(),
|
||||
returnValueForMissingStub: _i9.Future<void>.value(),
|
||||
) as _i9.Future<void>);
|
||||
returnValue: _i8.Future<void>.value(),
|
||||
returnValueForMissingStub: _i8.Future<void>.value(),
|
||||
) as _i8.Future<void>);
|
||||
@override
|
||||
_i9.Future<_i6.Amount> estimateFeeFor(
|
||||
_i8.Future<_i6.Amount> estimateFeeFor(
|
||||
_i6.Amount? amount,
|
||||
int? feeRate,
|
||||
) =>
|
||||
|
@ -886,7 +865,7 @@ class MockManager extends _i1.Mock implements _i16.Manager {
|
|||
feeRate,
|
||||
],
|
||||
),
|
||||
returnValue: _i9.Future<_i6.Amount>.value(_FakeAmount_4(
|
||||
returnValue: _i8.Future<_i6.Amount>.value(_FakeAmount_4(
|
||||
this,
|
||||
Invocation.method(
|
||||
#estimateFeeFor,
|
||||
|
@ -896,26 +875,26 @@ class MockManager extends _i1.Mock implements _i16.Manager {
|
|||
],
|
||||
),
|
||||
)),
|
||||
) as _i9.Future<_i6.Amount>);
|
||||
) as _i8.Future<_i6.Amount>);
|
||||
@override
|
||||
_i9.Future<bool> generateNewAddress() => (super.noSuchMethod(
|
||||
_i8.Future<bool> generateNewAddress() => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#generateNewAddress,
|
||||
[],
|
||||
),
|
||||
returnValue: _i9.Future<bool>.value(false),
|
||||
) as _i9.Future<bool>);
|
||||
returnValue: _i8.Future<bool>.value(false),
|
||||
) as _i8.Future<bool>);
|
||||
@override
|
||||
_i9.Future<void> resetRescanOnOpen() => (super.noSuchMethod(
|
||||
_i8.Future<void> resetRescanOnOpen() => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#resetRescanOnOpen,
|
||||
[],
|
||||
),
|
||||
returnValue: _i9.Future<void>.value(),
|
||||
returnValueForMissingStub: _i9.Future<void>.value(),
|
||||
) as _i9.Future<void>);
|
||||
returnValue: _i8.Future<void>.value(),
|
||||
returnValueForMissingStub: _i8.Future<void>.value(),
|
||||
) as _i8.Future<void>);
|
||||
@override
|
||||
void addListener(_i15.VoidCallback? listener) => super.noSuchMethod(
|
||||
void addListener(_i14.VoidCallback? listener) => super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#addListener,
|
||||
[listener],
|
||||
|
@ -923,7 +902,7 @@ class MockManager extends _i1.Mock implements _i16.Manager {
|
|||
returnValueForMissingStub: null,
|
||||
);
|
||||
@override
|
||||
void removeListener(_i15.VoidCallback? listener) => super.noSuchMethod(
|
||||
void removeListener(_i14.VoidCallback? listener) => super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#removeListener,
|
||||
[listener],
|
||||
|
|
|
@ -3,16 +3,15 @@
|
|||
// Do not manually edit this file.
|
||||
|
||||
// ignore_for_file: no_leading_underscores_for_library_prefixes
|
||||
import 'dart:async' as _i5;
|
||||
import 'dart:async' as _i4;
|
||||
|
||||
import 'package:decimal/decimal.dart' as _i2;
|
||||
import 'package:mockito/mockito.dart' as _i1;
|
||||
import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i6;
|
||||
import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i4;
|
||||
import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i5;
|
||||
import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i3;
|
||||
import 'package:stackwallet/services/transaction_notification_tracker.dart'
|
||||
as _i8;
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i7;
|
||||
import 'package:stackwallet/utilities/prefs.dart' as _i3;
|
||||
as _i7;
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i6;
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: avoid_redundant_argument_values
|
||||
|
@ -35,8 +34,8 @@ class _FakeDecimal_0 extends _i1.SmartFake implements _i2.Decimal {
|
|||
);
|
||||
}
|
||||
|
||||
class _FakePrefs_1 extends _i1.SmartFake implements _i3.Prefs {
|
||||
_FakePrefs_1(
|
||||
class _FakeElectrumX_1 extends _i1.SmartFake implements _i3.ElectrumX {
|
||||
_FakeElectrumX_1(
|
||||
Object parent,
|
||||
Invocation parentInvocation,
|
||||
) : super(
|
||||
|
@ -48,13 +47,13 @@ class _FakePrefs_1 extends _i1.SmartFake implements _i3.Prefs {
|
|||
/// A class which mocks [ElectrumX].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
||||
class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
|
||||
MockElectrumX() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
||||
@override
|
||||
set failovers(List<_i4.ElectrumXNode>? _failovers) => super.noSuchMethod(
|
||||
set failovers(List<_i3.ElectrumXNode>? _failovers) => super.noSuchMethod(
|
||||
Invocation.setter(
|
||||
#failovers,
|
||||
_failovers,
|
||||
|
@ -90,7 +89,7 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i5.Future<dynamic> request({
|
||||
_i4.Future<dynamic> request({
|
||||
required String? command,
|
||||
List<dynamic>? args = const [],
|
||||
Duration? connectionTimeout = const Duration(seconds: 60),
|
||||
|
@ -109,10 +108,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#retries: retries,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<dynamic>.value(),
|
||||
) as _i5.Future<dynamic>);
|
||||
returnValue: _i4.Future<dynamic>.value(),
|
||||
) as _i4.Future<dynamic>);
|
||||
@override
|
||||
_i5.Future<List<Map<String, dynamic>>> batchRequest({
|
||||
_i4.Future<List<Map<String, dynamic>>> batchRequest({
|
||||
required String? command,
|
||||
required Map<String, List<dynamic>>? args,
|
||||
Duration? connectionTimeout = const Duration(seconds: 60),
|
||||
|
@ -129,11 +128,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#retries: retries,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<List<Map<String, dynamic>>>.value(
|
||||
returnValue: _i4.Future<List<Map<String, dynamic>>>.value(
|
||||
<Map<String, dynamic>>[]),
|
||||
) as _i5.Future<List<Map<String, dynamic>>>);
|
||||
) as _i4.Future<List<Map<String, dynamic>>>);
|
||||
@override
|
||||
_i5.Future<bool> ping({
|
||||
_i4.Future<bool> ping({
|
||||
String? requestID,
|
||||
int? retryCount = 1,
|
||||
}) =>
|
||||
|
@ -146,10 +145,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#retryCount: retryCount,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<bool>.value(false),
|
||||
) as _i5.Future<bool>);
|
||||
returnValue: _i4.Future<bool>.value(false),
|
||||
) as _i4.Future<bool>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getBlockHeadTip({String? requestID}) =>
|
||||
_i4.Future<Map<String, dynamic>> getBlockHeadTip({String? requestID}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getBlockHeadTip,
|
||||
|
@ -157,10 +156,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
{#requestID: requestID},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getServerFeatures({String? requestID}) =>
|
||||
_i4.Future<Map<String, dynamic>> getServerFeatures({String? requestID}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getServerFeatures,
|
||||
|
@ -168,10 +167,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
{#requestID: requestID},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<String> broadcastTransaction({
|
||||
_i4.Future<String> broadcastTransaction({
|
||||
required String? rawTx,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -184,10 +183,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#requestID: requestID,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<String>.value(''),
|
||||
) as _i5.Future<String>);
|
||||
returnValue: _i4.Future<String>.value(''),
|
||||
) as _i4.Future<String>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getBalance({
|
||||
_i4.Future<Map<String, dynamic>> getBalance({
|
||||
required String? scripthash,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -201,10 +200,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<List<Map<String, dynamic>>> getHistory({
|
||||
_i4.Future<List<Map<String, dynamic>>> getHistory({
|
||||
required String? scripthash,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -217,11 +216,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#requestID: requestID,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<List<Map<String, dynamic>>>.value(
|
||||
returnValue: _i4.Future<List<Map<String, dynamic>>>.value(
|
||||
<Map<String, dynamic>>[]),
|
||||
) as _i5.Future<List<Map<String, dynamic>>>);
|
||||
) as _i4.Future<List<Map<String, dynamic>>>);
|
||||
@override
|
||||
_i5.Future<Map<String, List<Map<String, dynamic>>>> getBatchHistory(
|
||||
_i4.Future<Map<String, List<Map<String, dynamic>>>> getBatchHistory(
|
||||
{required Map<String, List<dynamic>>? args}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -229,11 +228,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
[],
|
||||
{#args: args},
|
||||
),
|
||||
returnValue: _i5.Future<Map<String, List<Map<String, dynamic>>>>.value(
|
||||
returnValue: _i4.Future<Map<String, List<Map<String, dynamic>>>>.value(
|
||||
<String, List<Map<String, dynamic>>>{}),
|
||||
) as _i5.Future<Map<String, List<Map<String, dynamic>>>>);
|
||||
) as _i4.Future<Map<String, List<Map<String, dynamic>>>>);
|
||||
@override
|
||||
_i5.Future<List<Map<String, dynamic>>> getUTXOs({
|
||||
_i4.Future<List<Map<String, dynamic>>> getUTXOs({
|
||||
required String? scripthash,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -246,11 +245,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#requestID: requestID,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<List<Map<String, dynamic>>>.value(
|
||||
returnValue: _i4.Future<List<Map<String, dynamic>>>.value(
|
||||
<Map<String, dynamic>>[]),
|
||||
) as _i5.Future<List<Map<String, dynamic>>>);
|
||||
) as _i4.Future<List<Map<String, dynamic>>>);
|
||||
@override
|
||||
_i5.Future<Map<String, List<Map<String, dynamic>>>> getBatchUTXOs(
|
||||
_i4.Future<Map<String, List<Map<String, dynamic>>>> getBatchUTXOs(
|
||||
{required Map<String, List<dynamic>>? args}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -258,11 +257,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
[],
|
||||
{#args: args},
|
||||
),
|
||||
returnValue: _i5.Future<Map<String, List<Map<String, dynamic>>>>.value(
|
||||
returnValue: _i4.Future<Map<String, List<Map<String, dynamic>>>>.value(
|
||||
<String, List<Map<String, dynamic>>>{}),
|
||||
) as _i5.Future<Map<String, List<Map<String, dynamic>>>>);
|
||||
) as _i4.Future<Map<String, List<Map<String, dynamic>>>>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getTransaction({
|
||||
_i4.Future<Map<String, dynamic>> getTransaction({
|
||||
required String? txHash,
|
||||
bool? verbose = true,
|
||||
String? requestID,
|
||||
|
@ -278,10 +277,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getAnonymitySet({
|
||||
_i4.Future<Map<String, dynamic>> getAnonymitySet({
|
||||
String? groupId = r'1',
|
||||
String? blockhash = r'',
|
||||
String? requestID,
|
||||
|
@ -297,10 +296,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<dynamic> getMintData({
|
||||
_i4.Future<dynamic> getMintData({
|
||||
dynamic mints,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -313,10 +312,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#requestID: requestID,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<dynamic>.value(),
|
||||
) as _i5.Future<dynamic>);
|
||||
returnValue: _i4.Future<dynamic>.value(),
|
||||
) as _i4.Future<dynamic>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getUsedCoinSerials({
|
||||
_i4.Future<Map<String, dynamic>> getUsedCoinSerials({
|
||||
String? requestID,
|
||||
required int? startNumber,
|
||||
}) =>
|
||||
|
@ -330,19 +329,19 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<int> getLatestCoinId({String? requestID}) => (super.noSuchMethod(
|
||||
_i4.Future<int> getLatestCoinId({String? requestID}) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getLatestCoinId,
|
||||
[],
|
||||
{#requestID: requestID},
|
||||
),
|
||||
returnValue: _i5.Future<int>.value(0),
|
||||
) as _i5.Future<int>);
|
||||
returnValue: _i4.Future<int>.value(0),
|
||||
) as _i4.Future<int>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getFeeRate({String? requestID}) =>
|
||||
_i4.Future<Map<String, dynamic>> getFeeRate({String? requestID}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getFeeRate,
|
||||
|
@ -350,10 +349,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
{#requestID: requestID},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<_i2.Decimal> estimateFee({
|
||||
_i4.Future<_i2.Decimal> estimateFee({
|
||||
String? requestID,
|
||||
required int? blocks,
|
||||
}) =>
|
||||
|
@ -366,7 +365,7 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#blocks: blocks,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<_i2.Decimal>.value(_FakeDecimal_0(
|
||||
returnValue: _i4.Future<_i2.Decimal>.value(_FakeDecimal_0(
|
||||
this,
|
||||
Invocation.method(
|
||||
#estimateFee,
|
||||
|
@ -377,15 +376,15 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
)),
|
||||
) as _i5.Future<_i2.Decimal>);
|
||||
) as _i4.Future<_i2.Decimal>);
|
||||
@override
|
||||
_i5.Future<_i2.Decimal> relayFee({String? requestID}) => (super.noSuchMethod(
|
||||
_i4.Future<_i2.Decimal> relayFee({String? requestID}) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#relayFee,
|
||||
[],
|
||||
{#requestID: requestID},
|
||||
),
|
||||
returnValue: _i5.Future<_i2.Decimal>.value(_FakeDecimal_0(
|
||||
returnValue: _i4.Future<_i2.Decimal>.value(_FakeDecimal_0(
|
||||
this,
|
||||
Invocation.method(
|
||||
#relayFee,
|
||||
|
@ -393,50 +392,30 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
{#requestID: requestID},
|
||||
),
|
||||
)),
|
||||
) as _i5.Future<_i2.Decimal>);
|
||||
) as _i4.Future<_i2.Decimal>);
|
||||
}
|
||||
|
||||
/// A class which mocks [CachedElectrumX].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
||||
class MockCachedElectrumX extends _i1.Mock implements _i5.CachedElectrumX {
|
||||
MockCachedElectrumX() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
||||
@override
|
||||
String get server => (super.noSuchMethod(
|
||||
Invocation.getter(#server),
|
||||
returnValue: '',
|
||||
) as String);
|
||||
@override
|
||||
int get port => (super.noSuchMethod(
|
||||
Invocation.getter(#port),
|
||||
returnValue: 0,
|
||||
) as int);
|
||||
@override
|
||||
bool get useSSL => (super.noSuchMethod(
|
||||
Invocation.getter(#useSSL),
|
||||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i3.Prefs get prefs => (super.noSuchMethod(
|
||||
Invocation.getter(#prefs),
|
||||
returnValue: _FakePrefs_1(
|
||||
_i3.ElectrumX get electrumXClient => (super.noSuchMethod(
|
||||
Invocation.getter(#electrumXClient),
|
||||
returnValue: _FakeElectrumX_1(
|
||||
this,
|
||||
Invocation.getter(#prefs),
|
||||
Invocation.getter(#electrumXClient),
|
||||
),
|
||||
) as _i3.Prefs);
|
||||
) as _i3.ElectrumX);
|
||||
@override
|
||||
List<_i4.ElectrumXNode> get failovers => (super.noSuchMethod(
|
||||
Invocation.getter(#failovers),
|
||||
returnValue: <_i4.ElectrumXNode>[],
|
||||
) as List<_i4.ElectrumXNode>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getAnonymitySet({
|
||||
_i4.Future<Map<String, dynamic>> getAnonymitySet({
|
||||
required String? groupId,
|
||||
String? blockhash = r'',
|
||||
required _i7.Coin? coin,
|
||||
required _i6.Coin? coin,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -449,8 +428,8 @@ class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
String base64ToHex(String? source) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -468,9 +447,9 @@ class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
|||
returnValue: '',
|
||||
) as String);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getTransaction({
|
||||
_i4.Future<Map<String, dynamic>> getTransaction({
|
||||
required String? txHash,
|
||||
required _i7.Coin? coin,
|
||||
required _i6.Coin? coin,
|
||||
bool? verbose = true,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
|
@ -484,11 +463,11 @@ class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<List<String>> getUsedCoinSerials({
|
||||
required _i7.Coin? coin,
|
||||
_i4.Future<List<String>> getUsedCoinSerials({
|
||||
required _i6.Coin? coin,
|
||||
int? startNumber = 0,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
|
@ -500,26 +479,26 @@ class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
|||
#startNumber: startNumber,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<List<String>>.value(<String>[]),
|
||||
) as _i5.Future<List<String>>);
|
||||
returnValue: _i4.Future<List<String>>.value(<String>[]),
|
||||
) as _i4.Future<List<String>>);
|
||||
@override
|
||||
_i5.Future<void> clearSharedTransactionCache({required _i7.Coin? coin}) =>
|
||||
_i4.Future<void> clearSharedTransactionCache({required _i6.Coin? coin}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#clearSharedTransactionCache,
|
||||
[],
|
||||
{#coin: coin},
|
||||
),
|
||||
returnValue: _i5.Future<void>.value(),
|
||||
returnValueForMissingStub: _i5.Future<void>.value(),
|
||||
) as _i5.Future<void>);
|
||||
returnValue: _i4.Future<void>.value(),
|
||||
returnValueForMissingStub: _i4.Future<void>.value(),
|
||||
) as _i4.Future<void>);
|
||||
}
|
||||
|
||||
/// A class which mocks [TransactionNotificationTracker].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockTransactionNotificationTracker extends _i1.Mock
|
||||
implements _i8.TransactionNotificationTracker {
|
||||
implements _i7.TransactionNotificationTracker {
|
||||
MockTransactionNotificationTracker() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
@ -548,14 +527,14 @@ class MockTransactionNotificationTracker extends _i1.Mock
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i5.Future<void> addNotifiedPending(String? txid) => (super.noSuchMethod(
|
||||
_i4.Future<void> addNotifiedPending(String? txid) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#addNotifiedPending,
|
||||
[txid],
|
||||
),
|
||||
returnValue: _i5.Future<void>.value(),
|
||||
returnValueForMissingStub: _i5.Future<void>.value(),
|
||||
) as _i5.Future<void>);
|
||||
returnValue: _i4.Future<void>.value(),
|
||||
returnValueForMissingStub: _i4.Future<void>.value(),
|
||||
) as _i4.Future<void>);
|
||||
@override
|
||||
bool wasNotifiedConfirmed(String? txid) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -565,21 +544,21 @@ class MockTransactionNotificationTracker extends _i1.Mock
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i5.Future<void> addNotifiedConfirmed(String? txid) => (super.noSuchMethod(
|
||||
_i4.Future<void> addNotifiedConfirmed(String? txid) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#addNotifiedConfirmed,
|
||||
[txid],
|
||||
),
|
||||
returnValue: _i5.Future<void>.value(),
|
||||
returnValueForMissingStub: _i5.Future<void>.value(),
|
||||
) as _i5.Future<void>);
|
||||
returnValue: _i4.Future<void>.value(),
|
||||
returnValueForMissingStub: _i4.Future<void>.value(),
|
||||
) as _i4.Future<void>);
|
||||
@override
|
||||
_i5.Future<void> deleteTransaction(String? txid) => (super.noSuchMethod(
|
||||
_i4.Future<void> deleteTransaction(String? txid) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#deleteTransaction,
|
||||
[txid],
|
||||
),
|
||||
returnValue: _i5.Future<void>.value(),
|
||||
returnValueForMissingStub: _i5.Future<void>.value(),
|
||||
) as _i5.Future<void>);
|
||||
returnValue: _i4.Future<void>.value(),
|
||||
returnValueForMissingStub: _i4.Future<void>.value(),
|
||||
) as _i4.Future<void>);
|
||||
}
|
||||
|
|
|
@ -3,16 +3,15 @@
|
|||
// Do not manually edit this file.
|
||||
|
||||
// ignore_for_file: no_leading_underscores_for_library_prefixes
|
||||
import 'dart:async' as _i5;
|
||||
import 'dart:async' as _i4;
|
||||
|
||||
import 'package:decimal/decimal.dart' as _i2;
|
||||
import 'package:mockito/mockito.dart' as _i1;
|
||||
import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i6;
|
||||
import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i4;
|
||||
import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i5;
|
||||
import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i3;
|
||||
import 'package:stackwallet/services/transaction_notification_tracker.dart'
|
||||
as _i8;
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i7;
|
||||
import 'package:stackwallet/utilities/prefs.dart' as _i3;
|
||||
as _i7;
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i6;
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: avoid_redundant_argument_values
|
||||
|
@ -35,8 +34,8 @@ class _FakeDecimal_0 extends _i1.SmartFake implements _i2.Decimal {
|
|||
);
|
||||
}
|
||||
|
||||
class _FakePrefs_1 extends _i1.SmartFake implements _i3.Prefs {
|
||||
_FakePrefs_1(
|
||||
class _FakeElectrumX_1 extends _i1.SmartFake implements _i3.ElectrumX {
|
||||
_FakeElectrumX_1(
|
||||
Object parent,
|
||||
Invocation parentInvocation,
|
||||
) : super(
|
||||
|
@ -48,13 +47,13 @@ class _FakePrefs_1 extends _i1.SmartFake implements _i3.Prefs {
|
|||
/// A class which mocks [ElectrumX].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
||||
class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
|
||||
MockElectrumX() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
||||
@override
|
||||
set failovers(List<_i4.ElectrumXNode>? _failovers) => super.noSuchMethod(
|
||||
set failovers(List<_i3.ElectrumXNode>? _failovers) => super.noSuchMethod(
|
||||
Invocation.setter(
|
||||
#failovers,
|
||||
_failovers,
|
||||
|
@ -90,7 +89,7 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i5.Future<dynamic> request({
|
||||
_i4.Future<dynamic> request({
|
||||
required String? command,
|
||||
List<dynamic>? args = const [],
|
||||
Duration? connectionTimeout = const Duration(seconds: 60),
|
||||
|
@ -109,10 +108,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#retries: retries,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<dynamic>.value(),
|
||||
) as _i5.Future<dynamic>);
|
||||
returnValue: _i4.Future<dynamic>.value(),
|
||||
) as _i4.Future<dynamic>);
|
||||
@override
|
||||
_i5.Future<List<Map<String, dynamic>>> batchRequest({
|
||||
_i4.Future<List<Map<String, dynamic>>> batchRequest({
|
||||
required String? command,
|
||||
required Map<String, List<dynamic>>? args,
|
||||
Duration? connectionTimeout = const Duration(seconds: 60),
|
||||
|
@ -129,11 +128,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#retries: retries,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<List<Map<String, dynamic>>>.value(
|
||||
returnValue: _i4.Future<List<Map<String, dynamic>>>.value(
|
||||
<Map<String, dynamic>>[]),
|
||||
) as _i5.Future<List<Map<String, dynamic>>>);
|
||||
) as _i4.Future<List<Map<String, dynamic>>>);
|
||||
@override
|
||||
_i5.Future<bool> ping({
|
||||
_i4.Future<bool> ping({
|
||||
String? requestID,
|
||||
int? retryCount = 1,
|
||||
}) =>
|
||||
|
@ -146,10 +145,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#retryCount: retryCount,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<bool>.value(false),
|
||||
) as _i5.Future<bool>);
|
||||
returnValue: _i4.Future<bool>.value(false),
|
||||
) as _i4.Future<bool>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getBlockHeadTip({String? requestID}) =>
|
||||
_i4.Future<Map<String, dynamic>> getBlockHeadTip({String? requestID}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getBlockHeadTip,
|
||||
|
@ -157,10 +156,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
{#requestID: requestID},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getServerFeatures({String? requestID}) =>
|
||||
_i4.Future<Map<String, dynamic>> getServerFeatures({String? requestID}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getServerFeatures,
|
||||
|
@ -168,10 +167,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
{#requestID: requestID},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<String> broadcastTransaction({
|
||||
_i4.Future<String> broadcastTransaction({
|
||||
required String? rawTx,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -184,10 +183,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#requestID: requestID,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<String>.value(''),
|
||||
) as _i5.Future<String>);
|
||||
returnValue: _i4.Future<String>.value(''),
|
||||
) as _i4.Future<String>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getBalance({
|
||||
_i4.Future<Map<String, dynamic>> getBalance({
|
||||
required String? scripthash,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -201,10 +200,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<List<Map<String, dynamic>>> getHistory({
|
||||
_i4.Future<List<Map<String, dynamic>>> getHistory({
|
||||
required String? scripthash,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -217,11 +216,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#requestID: requestID,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<List<Map<String, dynamic>>>.value(
|
||||
returnValue: _i4.Future<List<Map<String, dynamic>>>.value(
|
||||
<Map<String, dynamic>>[]),
|
||||
) as _i5.Future<List<Map<String, dynamic>>>);
|
||||
) as _i4.Future<List<Map<String, dynamic>>>);
|
||||
@override
|
||||
_i5.Future<Map<String, List<Map<String, dynamic>>>> getBatchHistory(
|
||||
_i4.Future<Map<String, List<Map<String, dynamic>>>> getBatchHistory(
|
||||
{required Map<String, List<dynamic>>? args}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -229,11 +228,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
[],
|
||||
{#args: args},
|
||||
),
|
||||
returnValue: _i5.Future<Map<String, List<Map<String, dynamic>>>>.value(
|
||||
returnValue: _i4.Future<Map<String, List<Map<String, dynamic>>>>.value(
|
||||
<String, List<Map<String, dynamic>>>{}),
|
||||
) as _i5.Future<Map<String, List<Map<String, dynamic>>>>);
|
||||
) as _i4.Future<Map<String, List<Map<String, dynamic>>>>);
|
||||
@override
|
||||
_i5.Future<List<Map<String, dynamic>>> getUTXOs({
|
||||
_i4.Future<List<Map<String, dynamic>>> getUTXOs({
|
||||
required String? scripthash,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -246,11 +245,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#requestID: requestID,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<List<Map<String, dynamic>>>.value(
|
||||
returnValue: _i4.Future<List<Map<String, dynamic>>>.value(
|
||||
<Map<String, dynamic>>[]),
|
||||
) as _i5.Future<List<Map<String, dynamic>>>);
|
||||
) as _i4.Future<List<Map<String, dynamic>>>);
|
||||
@override
|
||||
_i5.Future<Map<String, List<Map<String, dynamic>>>> getBatchUTXOs(
|
||||
_i4.Future<Map<String, List<Map<String, dynamic>>>> getBatchUTXOs(
|
||||
{required Map<String, List<dynamic>>? args}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -258,11 +257,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
[],
|
||||
{#args: args},
|
||||
),
|
||||
returnValue: _i5.Future<Map<String, List<Map<String, dynamic>>>>.value(
|
||||
returnValue: _i4.Future<Map<String, List<Map<String, dynamic>>>>.value(
|
||||
<String, List<Map<String, dynamic>>>{}),
|
||||
) as _i5.Future<Map<String, List<Map<String, dynamic>>>>);
|
||||
) as _i4.Future<Map<String, List<Map<String, dynamic>>>>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getTransaction({
|
||||
_i4.Future<Map<String, dynamic>> getTransaction({
|
||||
required String? txHash,
|
||||
bool? verbose = true,
|
||||
String? requestID,
|
||||
|
@ -278,10 +277,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getAnonymitySet({
|
||||
_i4.Future<Map<String, dynamic>> getAnonymitySet({
|
||||
String? groupId = r'1',
|
||||
String? blockhash = r'',
|
||||
String? requestID,
|
||||
|
@ -297,10 +296,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<dynamic> getMintData({
|
||||
_i4.Future<dynamic> getMintData({
|
||||
dynamic mints,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -313,10 +312,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#requestID: requestID,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<dynamic>.value(),
|
||||
) as _i5.Future<dynamic>);
|
||||
returnValue: _i4.Future<dynamic>.value(),
|
||||
) as _i4.Future<dynamic>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getUsedCoinSerials({
|
||||
_i4.Future<Map<String, dynamic>> getUsedCoinSerials({
|
||||
String? requestID,
|
||||
required int? startNumber,
|
||||
}) =>
|
||||
|
@ -330,19 +329,19 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<int> getLatestCoinId({String? requestID}) => (super.noSuchMethod(
|
||||
_i4.Future<int> getLatestCoinId({String? requestID}) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getLatestCoinId,
|
||||
[],
|
||||
{#requestID: requestID},
|
||||
),
|
||||
returnValue: _i5.Future<int>.value(0),
|
||||
) as _i5.Future<int>);
|
||||
returnValue: _i4.Future<int>.value(0),
|
||||
) as _i4.Future<int>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getFeeRate({String? requestID}) =>
|
||||
_i4.Future<Map<String, dynamic>> getFeeRate({String? requestID}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getFeeRate,
|
||||
|
@ -350,10 +349,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
{#requestID: requestID},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<_i2.Decimal> estimateFee({
|
||||
_i4.Future<_i2.Decimal> estimateFee({
|
||||
String? requestID,
|
||||
required int? blocks,
|
||||
}) =>
|
||||
|
@ -366,7 +365,7 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#blocks: blocks,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<_i2.Decimal>.value(_FakeDecimal_0(
|
||||
returnValue: _i4.Future<_i2.Decimal>.value(_FakeDecimal_0(
|
||||
this,
|
||||
Invocation.method(
|
||||
#estimateFee,
|
||||
|
@ -377,15 +376,15 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
)),
|
||||
) as _i5.Future<_i2.Decimal>);
|
||||
) as _i4.Future<_i2.Decimal>);
|
||||
@override
|
||||
_i5.Future<_i2.Decimal> relayFee({String? requestID}) => (super.noSuchMethod(
|
||||
_i4.Future<_i2.Decimal> relayFee({String? requestID}) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#relayFee,
|
||||
[],
|
||||
{#requestID: requestID},
|
||||
),
|
||||
returnValue: _i5.Future<_i2.Decimal>.value(_FakeDecimal_0(
|
||||
returnValue: _i4.Future<_i2.Decimal>.value(_FakeDecimal_0(
|
||||
this,
|
||||
Invocation.method(
|
||||
#relayFee,
|
||||
|
@ -393,50 +392,30 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
{#requestID: requestID},
|
||||
),
|
||||
)),
|
||||
) as _i5.Future<_i2.Decimal>);
|
||||
) as _i4.Future<_i2.Decimal>);
|
||||
}
|
||||
|
||||
/// A class which mocks [CachedElectrumX].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
||||
class MockCachedElectrumX extends _i1.Mock implements _i5.CachedElectrumX {
|
||||
MockCachedElectrumX() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
||||
@override
|
||||
String get server => (super.noSuchMethod(
|
||||
Invocation.getter(#server),
|
||||
returnValue: '',
|
||||
) as String);
|
||||
@override
|
||||
int get port => (super.noSuchMethod(
|
||||
Invocation.getter(#port),
|
||||
returnValue: 0,
|
||||
) as int);
|
||||
@override
|
||||
bool get useSSL => (super.noSuchMethod(
|
||||
Invocation.getter(#useSSL),
|
||||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i3.Prefs get prefs => (super.noSuchMethod(
|
||||
Invocation.getter(#prefs),
|
||||
returnValue: _FakePrefs_1(
|
||||
_i3.ElectrumX get electrumXClient => (super.noSuchMethod(
|
||||
Invocation.getter(#electrumXClient),
|
||||
returnValue: _FakeElectrumX_1(
|
||||
this,
|
||||
Invocation.getter(#prefs),
|
||||
Invocation.getter(#electrumXClient),
|
||||
),
|
||||
) as _i3.Prefs);
|
||||
) as _i3.ElectrumX);
|
||||
@override
|
||||
List<_i4.ElectrumXNode> get failovers => (super.noSuchMethod(
|
||||
Invocation.getter(#failovers),
|
||||
returnValue: <_i4.ElectrumXNode>[],
|
||||
) as List<_i4.ElectrumXNode>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getAnonymitySet({
|
||||
_i4.Future<Map<String, dynamic>> getAnonymitySet({
|
||||
required String? groupId,
|
||||
String? blockhash = r'',
|
||||
required _i7.Coin? coin,
|
||||
required _i6.Coin? coin,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -449,8 +428,8 @@ class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
String base64ToHex(String? source) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -468,9 +447,9 @@ class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
|||
returnValue: '',
|
||||
) as String);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getTransaction({
|
||||
_i4.Future<Map<String, dynamic>> getTransaction({
|
||||
required String? txHash,
|
||||
required _i7.Coin? coin,
|
||||
required _i6.Coin? coin,
|
||||
bool? verbose = true,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
|
@ -484,11 +463,11 @@ class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<List<String>> getUsedCoinSerials({
|
||||
required _i7.Coin? coin,
|
||||
_i4.Future<List<String>> getUsedCoinSerials({
|
||||
required _i6.Coin? coin,
|
||||
int? startNumber = 0,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
|
@ -500,26 +479,26 @@ class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
|||
#startNumber: startNumber,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<List<String>>.value(<String>[]),
|
||||
) as _i5.Future<List<String>>);
|
||||
returnValue: _i4.Future<List<String>>.value(<String>[]),
|
||||
) as _i4.Future<List<String>>);
|
||||
@override
|
||||
_i5.Future<void> clearSharedTransactionCache({required _i7.Coin? coin}) =>
|
||||
_i4.Future<void> clearSharedTransactionCache({required _i6.Coin? coin}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#clearSharedTransactionCache,
|
||||
[],
|
||||
{#coin: coin},
|
||||
),
|
||||
returnValue: _i5.Future<void>.value(),
|
||||
returnValueForMissingStub: _i5.Future<void>.value(),
|
||||
) as _i5.Future<void>);
|
||||
returnValue: _i4.Future<void>.value(),
|
||||
returnValueForMissingStub: _i4.Future<void>.value(),
|
||||
) as _i4.Future<void>);
|
||||
}
|
||||
|
||||
/// A class which mocks [TransactionNotificationTracker].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockTransactionNotificationTracker extends _i1.Mock
|
||||
implements _i8.TransactionNotificationTracker {
|
||||
implements _i7.TransactionNotificationTracker {
|
||||
MockTransactionNotificationTracker() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
@ -548,14 +527,14 @@ class MockTransactionNotificationTracker extends _i1.Mock
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i5.Future<void> addNotifiedPending(String? txid) => (super.noSuchMethod(
|
||||
_i4.Future<void> addNotifiedPending(String? txid) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#addNotifiedPending,
|
||||
[txid],
|
||||
),
|
||||
returnValue: _i5.Future<void>.value(),
|
||||
returnValueForMissingStub: _i5.Future<void>.value(),
|
||||
) as _i5.Future<void>);
|
||||
returnValue: _i4.Future<void>.value(),
|
||||
returnValueForMissingStub: _i4.Future<void>.value(),
|
||||
) as _i4.Future<void>);
|
||||
@override
|
||||
bool wasNotifiedConfirmed(String? txid) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -565,21 +544,21 @@ class MockTransactionNotificationTracker extends _i1.Mock
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i5.Future<void> addNotifiedConfirmed(String? txid) => (super.noSuchMethod(
|
||||
_i4.Future<void> addNotifiedConfirmed(String? txid) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#addNotifiedConfirmed,
|
||||
[txid],
|
||||
),
|
||||
returnValue: _i5.Future<void>.value(),
|
||||
returnValueForMissingStub: _i5.Future<void>.value(),
|
||||
) as _i5.Future<void>);
|
||||
returnValue: _i4.Future<void>.value(),
|
||||
returnValueForMissingStub: _i4.Future<void>.value(),
|
||||
) as _i4.Future<void>);
|
||||
@override
|
||||
_i5.Future<void> deleteTransaction(String? txid) => (super.noSuchMethod(
|
||||
_i4.Future<void> deleteTransaction(String? txid) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#deleteTransaction,
|
||||
[txid],
|
||||
),
|
||||
returnValue: _i5.Future<void>.value(),
|
||||
returnValueForMissingStub: _i5.Future<void>.value(),
|
||||
) as _i5.Future<void>);
|
||||
returnValue: _i4.Future<void>.value(),
|
||||
returnValueForMissingStub: _i4.Future<void>.value(),
|
||||
) as _i4.Future<void>);
|
||||
}
|
||||
|
|
|
@ -3,16 +3,15 @@
|
|||
// Do not manually edit this file.
|
||||
|
||||
// ignore_for_file: no_leading_underscores_for_library_prefixes
|
||||
import 'dart:async' as _i5;
|
||||
import 'dart:async' as _i4;
|
||||
|
||||
import 'package:decimal/decimal.dart' as _i2;
|
||||
import 'package:mockito/mockito.dart' as _i1;
|
||||
import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i6;
|
||||
import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i4;
|
||||
import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i5;
|
||||
import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i3;
|
||||
import 'package:stackwallet/services/transaction_notification_tracker.dart'
|
||||
as _i8;
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i7;
|
||||
import 'package:stackwallet/utilities/prefs.dart' as _i3;
|
||||
as _i7;
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i6;
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: avoid_redundant_argument_values
|
||||
|
@ -35,8 +34,8 @@ class _FakeDecimal_0 extends _i1.SmartFake implements _i2.Decimal {
|
|||
);
|
||||
}
|
||||
|
||||
class _FakePrefs_1 extends _i1.SmartFake implements _i3.Prefs {
|
||||
_FakePrefs_1(
|
||||
class _FakeElectrumX_1 extends _i1.SmartFake implements _i3.ElectrumX {
|
||||
_FakeElectrumX_1(
|
||||
Object parent,
|
||||
Invocation parentInvocation,
|
||||
) : super(
|
||||
|
@ -48,13 +47,13 @@ class _FakePrefs_1 extends _i1.SmartFake implements _i3.Prefs {
|
|||
/// A class which mocks [ElectrumX].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
||||
class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
|
||||
MockElectrumX() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
||||
@override
|
||||
set failovers(List<_i4.ElectrumXNode>? _failovers) => super.noSuchMethod(
|
||||
set failovers(List<_i3.ElectrumXNode>? _failovers) => super.noSuchMethod(
|
||||
Invocation.setter(
|
||||
#failovers,
|
||||
_failovers,
|
||||
|
@ -90,7 +89,7 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i5.Future<dynamic> request({
|
||||
_i4.Future<dynamic> request({
|
||||
required String? command,
|
||||
List<dynamic>? args = const [],
|
||||
Duration? connectionTimeout = const Duration(seconds: 60),
|
||||
|
@ -109,10 +108,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#retries: retries,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<dynamic>.value(),
|
||||
) as _i5.Future<dynamic>);
|
||||
returnValue: _i4.Future<dynamic>.value(),
|
||||
) as _i4.Future<dynamic>);
|
||||
@override
|
||||
_i5.Future<List<Map<String, dynamic>>> batchRequest({
|
||||
_i4.Future<List<Map<String, dynamic>>> batchRequest({
|
||||
required String? command,
|
||||
required Map<String, List<dynamic>>? args,
|
||||
Duration? connectionTimeout = const Duration(seconds: 60),
|
||||
|
@ -129,11 +128,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#retries: retries,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<List<Map<String, dynamic>>>.value(
|
||||
returnValue: _i4.Future<List<Map<String, dynamic>>>.value(
|
||||
<Map<String, dynamic>>[]),
|
||||
) as _i5.Future<List<Map<String, dynamic>>>);
|
||||
) as _i4.Future<List<Map<String, dynamic>>>);
|
||||
@override
|
||||
_i5.Future<bool> ping({
|
||||
_i4.Future<bool> ping({
|
||||
String? requestID,
|
||||
int? retryCount = 1,
|
||||
}) =>
|
||||
|
@ -146,10 +145,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#retryCount: retryCount,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<bool>.value(false),
|
||||
) as _i5.Future<bool>);
|
||||
returnValue: _i4.Future<bool>.value(false),
|
||||
) as _i4.Future<bool>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getBlockHeadTip({String? requestID}) =>
|
||||
_i4.Future<Map<String, dynamic>> getBlockHeadTip({String? requestID}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getBlockHeadTip,
|
||||
|
@ -157,10 +156,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
{#requestID: requestID},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getServerFeatures({String? requestID}) =>
|
||||
_i4.Future<Map<String, dynamic>> getServerFeatures({String? requestID}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getServerFeatures,
|
||||
|
@ -168,10 +167,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
{#requestID: requestID},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<String> broadcastTransaction({
|
||||
_i4.Future<String> broadcastTransaction({
|
||||
required String? rawTx,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -184,10 +183,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#requestID: requestID,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<String>.value(''),
|
||||
) as _i5.Future<String>);
|
||||
returnValue: _i4.Future<String>.value(''),
|
||||
) as _i4.Future<String>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getBalance({
|
||||
_i4.Future<Map<String, dynamic>> getBalance({
|
||||
required String? scripthash,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -201,10 +200,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<List<Map<String, dynamic>>> getHistory({
|
||||
_i4.Future<List<Map<String, dynamic>>> getHistory({
|
||||
required String? scripthash,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -217,11 +216,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#requestID: requestID,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<List<Map<String, dynamic>>>.value(
|
||||
returnValue: _i4.Future<List<Map<String, dynamic>>>.value(
|
||||
<Map<String, dynamic>>[]),
|
||||
) as _i5.Future<List<Map<String, dynamic>>>);
|
||||
) as _i4.Future<List<Map<String, dynamic>>>);
|
||||
@override
|
||||
_i5.Future<Map<String, List<Map<String, dynamic>>>> getBatchHistory(
|
||||
_i4.Future<Map<String, List<Map<String, dynamic>>>> getBatchHistory(
|
||||
{required Map<String, List<dynamic>>? args}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -229,11 +228,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
[],
|
||||
{#args: args},
|
||||
),
|
||||
returnValue: _i5.Future<Map<String, List<Map<String, dynamic>>>>.value(
|
||||
returnValue: _i4.Future<Map<String, List<Map<String, dynamic>>>>.value(
|
||||
<String, List<Map<String, dynamic>>>{}),
|
||||
) as _i5.Future<Map<String, List<Map<String, dynamic>>>>);
|
||||
) as _i4.Future<Map<String, List<Map<String, dynamic>>>>);
|
||||
@override
|
||||
_i5.Future<List<Map<String, dynamic>>> getUTXOs({
|
||||
_i4.Future<List<Map<String, dynamic>>> getUTXOs({
|
||||
required String? scripthash,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -246,11 +245,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#requestID: requestID,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<List<Map<String, dynamic>>>.value(
|
||||
returnValue: _i4.Future<List<Map<String, dynamic>>>.value(
|
||||
<Map<String, dynamic>>[]),
|
||||
) as _i5.Future<List<Map<String, dynamic>>>);
|
||||
) as _i4.Future<List<Map<String, dynamic>>>);
|
||||
@override
|
||||
_i5.Future<Map<String, List<Map<String, dynamic>>>> getBatchUTXOs(
|
||||
_i4.Future<Map<String, List<Map<String, dynamic>>>> getBatchUTXOs(
|
||||
{required Map<String, List<dynamic>>? args}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -258,11 +257,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
[],
|
||||
{#args: args},
|
||||
),
|
||||
returnValue: _i5.Future<Map<String, List<Map<String, dynamic>>>>.value(
|
||||
returnValue: _i4.Future<Map<String, List<Map<String, dynamic>>>>.value(
|
||||
<String, List<Map<String, dynamic>>>{}),
|
||||
) as _i5.Future<Map<String, List<Map<String, dynamic>>>>);
|
||||
) as _i4.Future<Map<String, List<Map<String, dynamic>>>>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getTransaction({
|
||||
_i4.Future<Map<String, dynamic>> getTransaction({
|
||||
required String? txHash,
|
||||
bool? verbose = true,
|
||||
String? requestID,
|
||||
|
@ -278,10 +277,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getAnonymitySet({
|
||||
_i4.Future<Map<String, dynamic>> getAnonymitySet({
|
||||
String? groupId = r'1',
|
||||
String? blockhash = r'',
|
||||
String? requestID,
|
||||
|
@ -297,10 +296,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<dynamic> getMintData({
|
||||
_i4.Future<dynamic> getMintData({
|
||||
dynamic mints,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -313,10 +312,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#requestID: requestID,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<dynamic>.value(),
|
||||
) as _i5.Future<dynamic>);
|
||||
returnValue: _i4.Future<dynamic>.value(),
|
||||
) as _i4.Future<dynamic>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getUsedCoinSerials({
|
||||
_i4.Future<Map<String, dynamic>> getUsedCoinSerials({
|
||||
String? requestID,
|
||||
required int? startNumber,
|
||||
}) =>
|
||||
|
@ -330,19 +329,19 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<int> getLatestCoinId({String? requestID}) => (super.noSuchMethod(
|
||||
_i4.Future<int> getLatestCoinId({String? requestID}) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getLatestCoinId,
|
||||
[],
|
||||
{#requestID: requestID},
|
||||
),
|
||||
returnValue: _i5.Future<int>.value(0),
|
||||
) as _i5.Future<int>);
|
||||
returnValue: _i4.Future<int>.value(0),
|
||||
) as _i4.Future<int>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getFeeRate({String? requestID}) =>
|
||||
_i4.Future<Map<String, dynamic>> getFeeRate({String? requestID}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getFeeRate,
|
||||
|
@ -350,10 +349,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
{#requestID: requestID},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<_i2.Decimal> estimateFee({
|
||||
_i4.Future<_i2.Decimal> estimateFee({
|
||||
String? requestID,
|
||||
required int? blocks,
|
||||
}) =>
|
||||
|
@ -366,7 +365,7 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#blocks: blocks,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<_i2.Decimal>.value(_FakeDecimal_0(
|
||||
returnValue: _i4.Future<_i2.Decimal>.value(_FakeDecimal_0(
|
||||
this,
|
||||
Invocation.method(
|
||||
#estimateFee,
|
||||
|
@ -377,15 +376,15 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
)),
|
||||
) as _i5.Future<_i2.Decimal>);
|
||||
) as _i4.Future<_i2.Decimal>);
|
||||
@override
|
||||
_i5.Future<_i2.Decimal> relayFee({String? requestID}) => (super.noSuchMethod(
|
||||
_i4.Future<_i2.Decimal> relayFee({String? requestID}) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#relayFee,
|
||||
[],
|
||||
{#requestID: requestID},
|
||||
),
|
||||
returnValue: _i5.Future<_i2.Decimal>.value(_FakeDecimal_0(
|
||||
returnValue: _i4.Future<_i2.Decimal>.value(_FakeDecimal_0(
|
||||
this,
|
||||
Invocation.method(
|
||||
#relayFee,
|
||||
|
@ -393,50 +392,30 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
{#requestID: requestID},
|
||||
),
|
||||
)),
|
||||
) as _i5.Future<_i2.Decimal>);
|
||||
) as _i4.Future<_i2.Decimal>);
|
||||
}
|
||||
|
||||
/// A class which mocks [CachedElectrumX].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
||||
class MockCachedElectrumX extends _i1.Mock implements _i5.CachedElectrumX {
|
||||
MockCachedElectrumX() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
||||
@override
|
||||
String get server => (super.noSuchMethod(
|
||||
Invocation.getter(#server),
|
||||
returnValue: '',
|
||||
) as String);
|
||||
@override
|
||||
int get port => (super.noSuchMethod(
|
||||
Invocation.getter(#port),
|
||||
returnValue: 0,
|
||||
) as int);
|
||||
@override
|
||||
bool get useSSL => (super.noSuchMethod(
|
||||
Invocation.getter(#useSSL),
|
||||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i3.Prefs get prefs => (super.noSuchMethod(
|
||||
Invocation.getter(#prefs),
|
||||
returnValue: _FakePrefs_1(
|
||||
_i3.ElectrumX get electrumXClient => (super.noSuchMethod(
|
||||
Invocation.getter(#electrumXClient),
|
||||
returnValue: _FakeElectrumX_1(
|
||||
this,
|
||||
Invocation.getter(#prefs),
|
||||
Invocation.getter(#electrumXClient),
|
||||
),
|
||||
) as _i3.Prefs);
|
||||
) as _i3.ElectrumX);
|
||||
@override
|
||||
List<_i4.ElectrumXNode> get failovers => (super.noSuchMethod(
|
||||
Invocation.getter(#failovers),
|
||||
returnValue: <_i4.ElectrumXNode>[],
|
||||
) as List<_i4.ElectrumXNode>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getAnonymitySet({
|
||||
_i4.Future<Map<String, dynamic>> getAnonymitySet({
|
||||
required String? groupId,
|
||||
String? blockhash = r'',
|
||||
required _i7.Coin? coin,
|
||||
required _i6.Coin? coin,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -449,8 +428,8 @@ class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
String base64ToHex(String? source) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -468,9 +447,9 @@ class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
|||
returnValue: '',
|
||||
) as String);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getTransaction({
|
||||
_i4.Future<Map<String, dynamic>> getTransaction({
|
||||
required String? txHash,
|
||||
required _i7.Coin? coin,
|
||||
required _i6.Coin? coin,
|
||||
bool? verbose = true,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
|
@ -484,11 +463,11 @@ class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<List<String>> getUsedCoinSerials({
|
||||
required _i7.Coin? coin,
|
||||
_i4.Future<List<String>> getUsedCoinSerials({
|
||||
required _i6.Coin? coin,
|
||||
int? startNumber = 0,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
|
@ -500,26 +479,26 @@ class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
|||
#startNumber: startNumber,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<List<String>>.value(<String>[]),
|
||||
) as _i5.Future<List<String>>);
|
||||
returnValue: _i4.Future<List<String>>.value(<String>[]),
|
||||
) as _i4.Future<List<String>>);
|
||||
@override
|
||||
_i5.Future<void> clearSharedTransactionCache({required _i7.Coin? coin}) =>
|
||||
_i4.Future<void> clearSharedTransactionCache({required _i6.Coin? coin}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#clearSharedTransactionCache,
|
||||
[],
|
||||
{#coin: coin},
|
||||
),
|
||||
returnValue: _i5.Future<void>.value(),
|
||||
returnValueForMissingStub: _i5.Future<void>.value(),
|
||||
) as _i5.Future<void>);
|
||||
returnValue: _i4.Future<void>.value(),
|
||||
returnValueForMissingStub: _i4.Future<void>.value(),
|
||||
) as _i4.Future<void>);
|
||||
}
|
||||
|
||||
/// A class which mocks [TransactionNotificationTracker].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockTransactionNotificationTracker extends _i1.Mock
|
||||
implements _i8.TransactionNotificationTracker {
|
||||
implements _i7.TransactionNotificationTracker {
|
||||
MockTransactionNotificationTracker() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
@ -548,14 +527,14 @@ class MockTransactionNotificationTracker extends _i1.Mock
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i5.Future<void> addNotifiedPending(String? txid) => (super.noSuchMethod(
|
||||
_i4.Future<void> addNotifiedPending(String? txid) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#addNotifiedPending,
|
||||
[txid],
|
||||
),
|
||||
returnValue: _i5.Future<void>.value(),
|
||||
returnValueForMissingStub: _i5.Future<void>.value(),
|
||||
) as _i5.Future<void>);
|
||||
returnValue: _i4.Future<void>.value(),
|
||||
returnValueForMissingStub: _i4.Future<void>.value(),
|
||||
) as _i4.Future<void>);
|
||||
@override
|
||||
bool wasNotifiedConfirmed(String? txid) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -565,21 +544,21 @@ class MockTransactionNotificationTracker extends _i1.Mock
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i5.Future<void> addNotifiedConfirmed(String? txid) => (super.noSuchMethod(
|
||||
_i4.Future<void> addNotifiedConfirmed(String? txid) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#addNotifiedConfirmed,
|
||||
[txid],
|
||||
),
|
||||
returnValue: _i5.Future<void>.value(),
|
||||
returnValueForMissingStub: _i5.Future<void>.value(),
|
||||
) as _i5.Future<void>);
|
||||
returnValue: _i4.Future<void>.value(),
|
||||
returnValueForMissingStub: _i4.Future<void>.value(),
|
||||
) as _i4.Future<void>);
|
||||
@override
|
||||
_i5.Future<void> deleteTransaction(String? txid) => (super.noSuchMethod(
|
||||
_i4.Future<void> deleteTransaction(String? txid) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#deleteTransaction,
|
||||
[txid],
|
||||
),
|
||||
returnValue: _i5.Future<void>.value(),
|
||||
returnValueForMissingStub: _i5.Future<void>.value(),
|
||||
) as _i5.Future<void>);
|
||||
returnValue: _i4.Future<void>.value(),
|
||||
returnValueForMissingStub: _i4.Future<void>.value(),
|
||||
) as _i4.Future<void>);
|
||||
}
|
||||
|
|
|
@ -105,6 +105,7 @@ void main() {
|
|||
nonce: null,
|
||||
inputs: [],
|
||||
outputs: [],
|
||||
numberOfMessages: null,
|
||||
),
|
||||
)
|
||||
.toList();
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -126,6 +126,7 @@ void main() {
|
|||
nonce: null,
|
||||
inputs: [],
|
||||
outputs: [],
|
||||
numberOfMessages: null,
|
||||
);
|
||||
when(wallet.transactions).thenAnswer((_) async => [
|
||||
tx,
|
||||
|
|
|
@ -3,16 +3,15 @@
|
|||
// Do not manually edit this file.
|
||||
|
||||
// ignore_for_file: no_leading_underscores_for_library_prefixes
|
||||
import 'dart:async' as _i5;
|
||||
import 'dart:async' as _i4;
|
||||
|
||||
import 'package:decimal/decimal.dart' as _i2;
|
||||
import 'package:mockito/mockito.dart' as _i1;
|
||||
import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i6;
|
||||
import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i4;
|
||||
import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i5;
|
||||
import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i3;
|
||||
import 'package:stackwallet/services/transaction_notification_tracker.dart'
|
||||
as _i8;
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i7;
|
||||
import 'package:stackwallet/utilities/prefs.dart' as _i3;
|
||||
as _i7;
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i6;
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: avoid_redundant_argument_values
|
||||
|
@ -35,8 +34,8 @@ class _FakeDecimal_0 extends _i1.SmartFake implements _i2.Decimal {
|
|||
);
|
||||
}
|
||||
|
||||
class _FakePrefs_1 extends _i1.SmartFake implements _i3.Prefs {
|
||||
_FakePrefs_1(
|
||||
class _FakeElectrumX_1 extends _i1.SmartFake implements _i3.ElectrumX {
|
||||
_FakeElectrumX_1(
|
||||
Object parent,
|
||||
Invocation parentInvocation,
|
||||
) : super(
|
||||
|
@ -48,13 +47,13 @@ class _FakePrefs_1 extends _i1.SmartFake implements _i3.Prefs {
|
|||
/// A class which mocks [ElectrumX].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
||||
class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
|
||||
MockElectrumX() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
||||
@override
|
||||
set failovers(List<_i4.ElectrumXNode>? _failovers) => super.noSuchMethod(
|
||||
set failovers(List<_i3.ElectrumXNode>? _failovers) => super.noSuchMethod(
|
||||
Invocation.setter(
|
||||
#failovers,
|
||||
_failovers,
|
||||
|
@ -90,7 +89,7 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i5.Future<dynamic> request({
|
||||
_i4.Future<dynamic> request({
|
||||
required String? command,
|
||||
List<dynamic>? args = const [],
|
||||
Duration? connectionTimeout = const Duration(seconds: 60),
|
||||
|
@ -109,10 +108,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#retries: retries,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<dynamic>.value(),
|
||||
) as _i5.Future<dynamic>);
|
||||
returnValue: _i4.Future<dynamic>.value(),
|
||||
) as _i4.Future<dynamic>);
|
||||
@override
|
||||
_i5.Future<List<Map<String, dynamic>>> batchRequest({
|
||||
_i4.Future<List<Map<String, dynamic>>> batchRequest({
|
||||
required String? command,
|
||||
required Map<String, List<dynamic>>? args,
|
||||
Duration? connectionTimeout = const Duration(seconds: 60),
|
||||
|
@ -129,11 +128,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#retries: retries,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<List<Map<String, dynamic>>>.value(
|
||||
returnValue: _i4.Future<List<Map<String, dynamic>>>.value(
|
||||
<Map<String, dynamic>>[]),
|
||||
) as _i5.Future<List<Map<String, dynamic>>>);
|
||||
) as _i4.Future<List<Map<String, dynamic>>>);
|
||||
@override
|
||||
_i5.Future<bool> ping({
|
||||
_i4.Future<bool> ping({
|
||||
String? requestID,
|
||||
int? retryCount = 1,
|
||||
}) =>
|
||||
|
@ -146,10 +145,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#retryCount: retryCount,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<bool>.value(false),
|
||||
) as _i5.Future<bool>);
|
||||
returnValue: _i4.Future<bool>.value(false),
|
||||
) as _i4.Future<bool>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getBlockHeadTip({String? requestID}) =>
|
||||
_i4.Future<Map<String, dynamic>> getBlockHeadTip({String? requestID}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getBlockHeadTip,
|
||||
|
@ -157,10 +156,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
{#requestID: requestID},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getServerFeatures({String? requestID}) =>
|
||||
_i4.Future<Map<String, dynamic>> getServerFeatures({String? requestID}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getServerFeatures,
|
||||
|
@ -168,10 +167,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
{#requestID: requestID},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<String> broadcastTransaction({
|
||||
_i4.Future<String> broadcastTransaction({
|
||||
required String? rawTx,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -184,10 +183,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#requestID: requestID,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<String>.value(''),
|
||||
) as _i5.Future<String>);
|
||||
returnValue: _i4.Future<String>.value(''),
|
||||
) as _i4.Future<String>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getBalance({
|
||||
_i4.Future<Map<String, dynamic>> getBalance({
|
||||
required String? scripthash,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -201,10 +200,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<List<Map<String, dynamic>>> getHistory({
|
||||
_i4.Future<List<Map<String, dynamic>>> getHistory({
|
||||
required String? scripthash,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -217,11 +216,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#requestID: requestID,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<List<Map<String, dynamic>>>.value(
|
||||
returnValue: _i4.Future<List<Map<String, dynamic>>>.value(
|
||||
<Map<String, dynamic>>[]),
|
||||
) as _i5.Future<List<Map<String, dynamic>>>);
|
||||
) as _i4.Future<List<Map<String, dynamic>>>);
|
||||
@override
|
||||
_i5.Future<Map<String, List<Map<String, dynamic>>>> getBatchHistory(
|
||||
_i4.Future<Map<String, List<Map<String, dynamic>>>> getBatchHistory(
|
||||
{required Map<String, List<dynamic>>? args}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -229,11 +228,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
[],
|
||||
{#args: args},
|
||||
),
|
||||
returnValue: _i5.Future<Map<String, List<Map<String, dynamic>>>>.value(
|
||||
returnValue: _i4.Future<Map<String, List<Map<String, dynamic>>>>.value(
|
||||
<String, List<Map<String, dynamic>>>{}),
|
||||
) as _i5.Future<Map<String, List<Map<String, dynamic>>>>);
|
||||
) as _i4.Future<Map<String, List<Map<String, dynamic>>>>);
|
||||
@override
|
||||
_i5.Future<List<Map<String, dynamic>>> getUTXOs({
|
||||
_i4.Future<List<Map<String, dynamic>>> getUTXOs({
|
||||
required String? scripthash,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -246,11 +245,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#requestID: requestID,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<List<Map<String, dynamic>>>.value(
|
||||
returnValue: _i4.Future<List<Map<String, dynamic>>>.value(
|
||||
<Map<String, dynamic>>[]),
|
||||
) as _i5.Future<List<Map<String, dynamic>>>);
|
||||
) as _i4.Future<List<Map<String, dynamic>>>);
|
||||
@override
|
||||
_i5.Future<Map<String, List<Map<String, dynamic>>>> getBatchUTXOs(
|
||||
_i4.Future<Map<String, List<Map<String, dynamic>>>> getBatchUTXOs(
|
||||
{required Map<String, List<dynamic>>? args}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -258,11 +257,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
[],
|
||||
{#args: args},
|
||||
),
|
||||
returnValue: _i5.Future<Map<String, List<Map<String, dynamic>>>>.value(
|
||||
returnValue: _i4.Future<Map<String, List<Map<String, dynamic>>>>.value(
|
||||
<String, List<Map<String, dynamic>>>{}),
|
||||
) as _i5.Future<Map<String, List<Map<String, dynamic>>>>);
|
||||
) as _i4.Future<Map<String, List<Map<String, dynamic>>>>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getTransaction({
|
||||
_i4.Future<Map<String, dynamic>> getTransaction({
|
||||
required String? txHash,
|
||||
bool? verbose = true,
|
||||
String? requestID,
|
||||
|
@ -278,10 +277,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getAnonymitySet({
|
||||
_i4.Future<Map<String, dynamic>> getAnonymitySet({
|
||||
String? groupId = r'1',
|
||||
String? blockhash = r'',
|
||||
String? requestID,
|
||||
|
@ -297,10 +296,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<dynamic> getMintData({
|
||||
_i4.Future<dynamic> getMintData({
|
||||
dynamic mints,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -313,10 +312,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#requestID: requestID,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<dynamic>.value(),
|
||||
) as _i5.Future<dynamic>);
|
||||
returnValue: _i4.Future<dynamic>.value(),
|
||||
) as _i4.Future<dynamic>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getUsedCoinSerials({
|
||||
_i4.Future<Map<String, dynamic>> getUsedCoinSerials({
|
||||
String? requestID,
|
||||
required int? startNumber,
|
||||
}) =>
|
||||
|
@ -330,19 +329,19 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<int> getLatestCoinId({String? requestID}) => (super.noSuchMethod(
|
||||
_i4.Future<int> getLatestCoinId({String? requestID}) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getLatestCoinId,
|
||||
[],
|
||||
{#requestID: requestID},
|
||||
),
|
||||
returnValue: _i5.Future<int>.value(0),
|
||||
) as _i5.Future<int>);
|
||||
returnValue: _i4.Future<int>.value(0),
|
||||
) as _i4.Future<int>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getFeeRate({String? requestID}) =>
|
||||
_i4.Future<Map<String, dynamic>> getFeeRate({String? requestID}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getFeeRate,
|
||||
|
@ -350,10 +349,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
{#requestID: requestID},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<_i2.Decimal> estimateFee({
|
||||
_i4.Future<_i2.Decimal> estimateFee({
|
||||
String? requestID,
|
||||
required int? blocks,
|
||||
}) =>
|
||||
|
@ -366,7 +365,7 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#blocks: blocks,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<_i2.Decimal>.value(_FakeDecimal_0(
|
||||
returnValue: _i4.Future<_i2.Decimal>.value(_FakeDecimal_0(
|
||||
this,
|
||||
Invocation.method(
|
||||
#estimateFee,
|
||||
|
@ -377,15 +376,15 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
)),
|
||||
) as _i5.Future<_i2.Decimal>);
|
||||
) as _i4.Future<_i2.Decimal>);
|
||||
@override
|
||||
_i5.Future<_i2.Decimal> relayFee({String? requestID}) => (super.noSuchMethod(
|
||||
_i4.Future<_i2.Decimal> relayFee({String? requestID}) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#relayFee,
|
||||
[],
|
||||
{#requestID: requestID},
|
||||
),
|
||||
returnValue: _i5.Future<_i2.Decimal>.value(_FakeDecimal_0(
|
||||
returnValue: _i4.Future<_i2.Decimal>.value(_FakeDecimal_0(
|
||||
this,
|
||||
Invocation.method(
|
||||
#relayFee,
|
||||
|
@ -393,50 +392,30 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
{#requestID: requestID},
|
||||
),
|
||||
)),
|
||||
) as _i5.Future<_i2.Decimal>);
|
||||
) as _i4.Future<_i2.Decimal>);
|
||||
}
|
||||
|
||||
/// A class which mocks [CachedElectrumX].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
||||
class MockCachedElectrumX extends _i1.Mock implements _i5.CachedElectrumX {
|
||||
MockCachedElectrumX() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
||||
@override
|
||||
String get server => (super.noSuchMethod(
|
||||
Invocation.getter(#server),
|
||||
returnValue: '',
|
||||
) as String);
|
||||
@override
|
||||
int get port => (super.noSuchMethod(
|
||||
Invocation.getter(#port),
|
||||
returnValue: 0,
|
||||
) as int);
|
||||
@override
|
||||
bool get useSSL => (super.noSuchMethod(
|
||||
Invocation.getter(#useSSL),
|
||||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i3.Prefs get prefs => (super.noSuchMethod(
|
||||
Invocation.getter(#prefs),
|
||||
returnValue: _FakePrefs_1(
|
||||
_i3.ElectrumX get electrumXClient => (super.noSuchMethod(
|
||||
Invocation.getter(#electrumXClient),
|
||||
returnValue: _FakeElectrumX_1(
|
||||
this,
|
||||
Invocation.getter(#prefs),
|
||||
Invocation.getter(#electrumXClient),
|
||||
),
|
||||
) as _i3.Prefs);
|
||||
) as _i3.ElectrumX);
|
||||
@override
|
||||
List<_i4.ElectrumXNode> get failovers => (super.noSuchMethod(
|
||||
Invocation.getter(#failovers),
|
||||
returnValue: <_i4.ElectrumXNode>[],
|
||||
) as List<_i4.ElectrumXNode>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getAnonymitySet({
|
||||
_i4.Future<Map<String, dynamic>> getAnonymitySet({
|
||||
required String? groupId,
|
||||
String? blockhash = r'',
|
||||
required _i7.Coin? coin,
|
||||
required _i6.Coin? coin,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -449,8 +428,8 @@ class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
String base64ToHex(String? source) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -468,9 +447,9 @@ class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
|||
returnValue: '',
|
||||
) as String);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getTransaction({
|
||||
_i4.Future<Map<String, dynamic>> getTransaction({
|
||||
required String? txHash,
|
||||
required _i7.Coin? coin,
|
||||
required _i6.Coin? coin,
|
||||
bool? verbose = true,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
|
@ -484,11 +463,11 @@ class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<List<String>> getUsedCoinSerials({
|
||||
required _i7.Coin? coin,
|
||||
_i4.Future<List<String>> getUsedCoinSerials({
|
||||
required _i6.Coin? coin,
|
||||
int? startNumber = 0,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
|
@ -500,26 +479,26 @@ class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
|||
#startNumber: startNumber,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<List<String>>.value(<String>[]),
|
||||
) as _i5.Future<List<String>>);
|
||||
returnValue: _i4.Future<List<String>>.value(<String>[]),
|
||||
) as _i4.Future<List<String>>);
|
||||
@override
|
||||
_i5.Future<void> clearSharedTransactionCache({required _i7.Coin? coin}) =>
|
||||
_i4.Future<void> clearSharedTransactionCache({required _i6.Coin? coin}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#clearSharedTransactionCache,
|
||||
[],
|
||||
{#coin: coin},
|
||||
),
|
||||
returnValue: _i5.Future<void>.value(),
|
||||
returnValueForMissingStub: _i5.Future<void>.value(),
|
||||
) as _i5.Future<void>);
|
||||
returnValue: _i4.Future<void>.value(),
|
||||
returnValueForMissingStub: _i4.Future<void>.value(),
|
||||
) as _i4.Future<void>);
|
||||
}
|
||||
|
||||
/// A class which mocks [TransactionNotificationTracker].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockTransactionNotificationTracker extends _i1.Mock
|
||||
implements _i8.TransactionNotificationTracker {
|
||||
implements _i7.TransactionNotificationTracker {
|
||||
MockTransactionNotificationTracker() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
@ -548,14 +527,14 @@ class MockTransactionNotificationTracker extends _i1.Mock
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i5.Future<void> addNotifiedPending(String? txid) => (super.noSuchMethod(
|
||||
_i4.Future<void> addNotifiedPending(String? txid) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#addNotifiedPending,
|
||||
[txid],
|
||||
),
|
||||
returnValue: _i5.Future<void>.value(),
|
||||
returnValueForMissingStub: _i5.Future<void>.value(),
|
||||
) as _i5.Future<void>);
|
||||
returnValue: _i4.Future<void>.value(),
|
||||
returnValueForMissingStub: _i4.Future<void>.value(),
|
||||
) as _i4.Future<void>);
|
||||
@override
|
||||
bool wasNotifiedConfirmed(String? txid) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -565,21 +544,21 @@ class MockTransactionNotificationTracker extends _i1.Mock
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i5.Future<void> addNotifiedConfirmed(String? txid) => (super.noSuchMethod(
|
||||
_i4.Future<void> addNotifiedConfirmed(String? txid) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#addNotifiedConfirmed,
|
||||
[txid],
|
||||
),
|
||||
returnValue: _i5.Future<void>.value(),
|
||||
returnValueForMissingStub: _i5.Future<void>.value(),
|
||||
) as _i5.Future<void>);
|
||||
returnValue: _i4.Future<void>.value(),
|
||||
returnValueForMissingStub: _i4.Future<void>.value(),
|
||||
) as _i4.Future<void>);
|
||||
@override
|
||||
_i5.Future<void> deleteTransaction(String? txid) => (super.noSuchMethod(
|
||||
_i4.Future<void> deleteTransaction(String? txid) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#deleteTransaction,
|
||||
[txid],
|
||||
),
|
||||
returnValue: _i5.Future<void>.value(),
|
||||
returnValueForMissingStub: _i5.Future<void>.value(),
|
||||
) as _i5.Future<void>);
|
||||
returnValue: _i4.Future<void>.value(),
|
||||
returnValueForMissingStub: _i4.Future<void>.value(),
|
||||
) as _i4.Future<void>);
|
||||
}
|
||||
|
|
|
@ -3,16 +3,15 @@
|
|||
// Do not manually edit this file.
|
||||
|
||||
// ignore_for_file: no_leading_underscores_for_library_prefixes
|
||||
import 'dart:async' as _i5;
|
||||
import 'dart:async' as _i4;
|
||||
|
||||
import 'package:decimal/decimal.dart' as _i2;
|
||||
import 'package:mockito/mockito.dart' as _i1;
|
||||
import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i6;
|
||||
import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i4;
|
||||
import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i5;
|
||||
import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i3;
|
||||
import 'package:stackwallet/services/transaction_notification_tracker.dart'
|
||||
as _i8;
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i7;
|
||||
import 'package:stackwallet/utilities/prefs.dart' as _i3;
|
||||
as _i7;
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i6;
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: avoid_redundant_argument_values
|
||||
|
@ -35,8 +34,8 @@ class _FakeDecimal_0 extends _i1.SmartFake implements _i2.Decimal {
|
|||
);
|
||||
}
|
||||
|
||||
class _FakePrefs_1 extends _i1.SmartFake implements _i3.Prefs {
|
||||
_FakePrefs_1(
|
||||
class _FakeElectrumX_1 extends _i1.SmartFake implements _i3.ElectrumX {
|
||||
_FakeElectrumX_1(
|
||||
Object parent,
|
||||
Invocation parentInvocation,
|
||||
) : super(
|
||||
|
@ -48,13 +47,13 @@ class _FakePrefs_1 extends _i1.SmartFake implements _i3.Prefs {
|
|||
/// A class which mocks [ElectrumX].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
||||
class MockElectrumX extends _i1.Mock implements _i3.ElectrumX {
|
||||
MockElectrumX() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
||||
@override
|
||||
set failovers(List<_i4.ElectrumXNode>? _failovers) => super.noSuchMethod(
|
||||
set failovers(List<_i3.ElectrumXNode>? _failovers) => super.noSuchMethod(
|
||||
Invocation.setter(
|
||||
#failovers,
|
||||
_failovers,
|
||||
|
@ -90,7 +89,7 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i5.Future<dynamic> request({
|
||||
_i4.Future<dynamic> request({
|
||||
required String? command,
|
||||
List<dynamic>? args = const [],
|
||||
Duration? connectionTimeout = const Duration(seconds: 60),
|
||||
|
@ -109,10 +108,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#retries: retries,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<dynamic>.value(),
|
||||
) as _i5.Future<dynamic>);
|
||||
returnValue: _i4.Future<dynamic>.value(),
|
||||
) as _i4.Future<dynamic>);
|
||||
@override
|
||||
_i5.Future<List<Map<String, dynamic>>> batchRequest({
|
||||
_i4.Future<List<Map<String, dynamic>>> batchRequest({
|
||||
required String? command,
|
||||
required Map<String, List<dynamic>>? args,
|
||||
Duration? connectionTimeout = const Duration(seconds: 60),
|
||||
|
@ -129,11 +128,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#retries: retries,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<List<Map<String, dynamic>>>.value(
|
||||
returnValue: _i4.Future<List<Map<String, dynamic>>>.value(
|
||||
<Map<String, dynamic>>[]),
|
||||
) as _i5.Future<List<Map<String, dynamic>>>);
|
||||
) as _i4.Future<List<Map<String, dynamic>>>);
|
||||
@override
|
||||
_i5.Future<bool> ping({
|
||||
_i4.Future<bool> ping({
|
||||
String? requestID,
|
||||
int? retryCount = 1,
|
||||
}) =>
|
||||
|
@ -146,10 +145,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#retryCount: retryCount,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<bool>.value(false),
|
||||
) as _i5.Future<bool>);
|
||||
returnValue: _i4.Future<bool>.value(false),
|
||||
) as _i4.Future<bool>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getBlockHeadTip({String? requestID}) =>
|
||||
_i4.Future<Map<String, dynamic>> getBlockHeadTip({String? requestID}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getBlockHeadTip,
|
||||
|
@ -157,10 +156,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
{#requestID: requestID},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getServerFeatures({String? requestID}) =>
|
||||
_i4.Future<Map<String, dynamic>> getServerFeatures({String? requestID}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getServerFeatures,
|
||||
|
@ -168,10 +167,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
{#requestID: requestID},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<String> broadcastTransaction({
|
||||
_i4.Future<String> broadcastTransaction({
|
||||
required String? rawTx,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -184,10 +183,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#requestID: requestID,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<String>.value(''),
|
||||
) as _i5.Future<String>);
|
||||
returnValue: _i4.Future<String>.value(''),
|
||||
) as _i4.Future<String>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getBalance({
|
||||
_i4.Future<Map<String, dynamic>> getBalance({
|
||||
required String? scripthash,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -201,10 +200,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<List<Map<String, dynamic>>> getHistory({
|
||||
_i4.Future<List<Map<String, dynamic>>> getHistory({
|
||||
required String? scripthash,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -217,11 +216,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#requestID: requestID,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<List<Map<String, dynamic>>>.value(
|
||||
returnValue: _i4.Future<List<Map<String, dynamic>>>.value(
|
||||
<Map<String, dynamic>>[]),
|
||||
) as _i5.Future<List<Map<String, dynamic>>>);
|
||||
) as _i4.Future<List<Map<String, dynamic>>>);
|
||||
@override
|
||||
_i5.Future<Map<String, List<Map<String, dynamic>>>> getBatchHistory(
|
||||
_i4.Future<Map<String, List<Map<String, dynamic>>>> getBatchHistory(
|
||||
{required Map<String, List<dynamic>>? args}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -229,11 +228,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
[],
|
||||
{#args: args},
|
||||
),
|
||||
returnValue: _i5.Future<Map<String, List<Map<String, dynamic>>>>.value(
|
||||
returnValue: _i4.Future<Map<String, List<Map<String, dynamic>>>>.value(
|
||||
<String, List<Map<String, dynamic>>>{}),
|
||||
) as _i5.Future<Map<String, List<Map<String, dynamic>>>>);
|
||||
) as _i4.Future<Map<String, List<Map<String, dynamic>>>>);
|
||||
@override
|
||||
_i5.Future<List<Map<String, dynamic>>> getUTXOs({
|
||||
_i4.Future<List<Map<String, dynamic>>> getUTXOs({
|
||||
required String? scripthash,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -246,11 +245,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#requestID: requestID,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<List<Map<String, dynamic>>>.value(
|
||||
returnValue: _i4.Future<List<Map<String, dynamic>>>.value(
|
||||
<Map<String, dynamic>>[]),
|
||||
) as _i5.Future<List<Map<String, dynamic>>>);
|
||||
) as _i4.Future<List<Map<String, dynamic>>>);
|
||||
@override
|
||||
_i5.Future<Map<String, List<Map<String, dynamic>>>> getBatchUTXOs(
|
||||
_i4.Future<Map<String, List<Map<String, dynamic>>>> getBatchUTXOs(
|
||||
{required Map<String, List<dynamic>>? args}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -258,11 +257,11 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
[],
|
||||
{#args: args},
|
||||
),
|
||||
returnValue: _i5.Future<Map<String, List<Map<String, dynamic>>>>.value(
|
||||
returnValue: _i4.Future<Map<String, List<Map<String, dynamic>>>>.value(
|
||||
<String, List<Map<String, dynamic>>>{}),
|
||||
) as _i5.Future<Map<String, List<Map<String, dynamic>>>>);
|
||||
) as _i4.Future<Map<String, List<Map<String, dynamic>>>>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getTransaction({
|
||||
_i4.Future<Map<String, dynamic>> getTransaction({
|
||||
required String? txHash,
|
||||
bool? verbose = true,
|
||||
String? requestID,
|
||||
|
@ -278,10 +277,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getAnonymitySet({
|
||||
_i4.Future<Map<String, dynamic>> getAnonymitySet({
|
||||
String? groupId = r'1',
|
||||
String? blockhash = r'',
|
||||
String? requestID,
|
||||
|
@ -297,10 +296,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<dynamic> getMintData({
|
||||
_i4.Future<dynamic> getMintData({
|
||||
dynamic mints,
|
||||
String? requestID,
|
||||
}) =>
|
||||
|
@ -313,10 +312,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#requestID: requestID,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<dynamic>.value(),
|
||||
) as _i5.Future<dynamic>);
|
||||
returnValue: _i4.Future<dynamic>.value(),
|
||||
) as _i4.Future<dynamic>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getUsedCoinSerials({
|
||||
_i4.Future<Map<String, dynamic>> getUsedCoinSerials({
|
||||
String? requestID,
|
||||
required int? startNumber,
|
||||
}) =>
|
||||
|
@ -330,19 +329,19 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<int> getLatestCoinId({String? requestID}) => (super.noSuchMethod(
|
||||
_i4.Future<int> getLatestCoinId({String? requestID}) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getLatestCoinId,
|
||||
[],
|
||||
{#requestID: requestID},
|
||||
),
|
||||
returnValue: _i5.Future<int>.value(0),
|
||||
) as _i5.Future<int>);
|
||||
returnValue: _i4.Future<int>.value(0),
|
||||
) as _i4.Future<int>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getFeeRate({String? requestID}) =>
|
||||
_i4.Future<Map<String, dynamic>> getFeeRate({String? requestID}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getFeeRate,
|
||||
|
@ -350,10 +349,10 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
{#requestID: requestID},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<_i2.Decimal> estimateFee({
|
||||
_i4.Future<_i2.Decimal> estimateFee({
|
||||
String? requestID,
|
||||
required int? blocks,
|
||||
}) =>
|
||||
|
@ -366,7 +365,7 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
#blocks: blocks,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<_i2.Decimal>.value(_FakeDecimal_0(
|
||||
returnValue: _i4.Future<_i2.Decimal>.value(_FakeDecimal_0(
|
||||
this,
|
||||
Invocation.method(
|
||||
#estimateFee,
|
||||
|
@ -377,15 +376,15 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
},
|
||||
),
|
||||
)),
|
||||
) as _i5.Future<_i2.Decimal>);
|
||||
) as _i4.Future<_i2.Decimal>);
|
||||
@override
|
||||
_i5.Future<_i2.Decimal> relayFee({String? requestID}) => (super.noSuchMethod(
|
||||
_i4.Future<_i2.Decimal> relayFee({String? requestID}) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#relayFee,
|
||||
[],
|
||||
{#requestID: requestID},
|
||||
),
|
||||
returnValue: _i5.Future<_i2.Decimal>.value(_FakeDecimal_0(
|
||||
returnValue: _i4.Future<_i2.Decimal>.value(_FakeDecimal_0(
|
||||
this,
|
||||
Invocation.method(
|
||||
#relayFee,
|
||||
|
@ -393,50 +392,30 @@ class MockElectrumX extends _i1.Mock implements _i4.ElectrumX {
|
|||
{#requestID: requestID},
|
||||
),
|
||||
)),
|
||||
) as _i5.Future<_i2.Decimal>);
|
||||
) as _i4.Future<_i2.Decimal>);
|
||||
}
|
||||
|
||||
/// A class which mocks [CachedElectrumX].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
||||
class MockCachedElectrumX extends _i1.Mock implements _i5.CachedElectrumX {
|
||||
MockCachedElectrumX() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
||||
@override
|
||||
String get server => (super.noSuchMethod(
|
||||
Invocation.getter(#server),
|
||||
returnValue: '',
|
||||
) as String);
|
||||
@override
|
||||
int get port => (super.noSuchMethod(
|
||||
Invocation.getter(#port),
|
||||
returnValue: 0,
|
||||
) as int);
|
||||
@override
|
||||
bool get useSSL => (super.noSuchMethod(
|
||||
Invocation.getter(#useSSL),
|
||||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i3.Prefs get prefs => (super.noSuchMethod(
|
||||
Invocation.getter(#prefs),
|
||||
returnValue: _FakePrefs_1(
|
||||
_i3.ElectrumX get electrumXClient => (super.noSuchMethod(
|
||||
Invocation.getter(#electrumXClient),
|
||||
returnValue: _FakeElectrumX_1(
|
||||
this,
|
||||
Invocation.getter(#prefs),
|
||||
Invocation.getter(#electrumXClient),
|
||||
),
|
||||
) as _i3.Prefs);
|
||||
) as _i3.ElectrumX);
|
||||
@override
|
||||
List<_i4.ElectrumXNode> get failovers => (super.noSuchMethod(
|
||||
Invocation.getter(#failovers),
|
||||
returnValue: <_i4.ElectrumXNode>[],
|
||||
) as List<_i4.ElectrumXNode>);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getAnonymitySet({
|
||||
_i4.Future<Map<String, dynamic>> getAnonymitySet({
|
||||
required String? groupId,
|
||||
String? blockhash = r'',
|
||||
required _i7.Coin? coin,
|
||||
required _i6.Coin? coin,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -449,8 +428,8 @@ class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
String base64ToHex(String? source) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -468,9 +447,9 @@ class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
|||
returnValue: '',
|
||||
) as String);
|
||||
@override
|
||||
_i5.Future<Map<String, dynamic>> getTransaction({
|
||||
_i4.Future<Map<String, dynamic>> getTransaction({
|
||||
required String? txHash,
|
||||
required _i7.Coin? coin,
|
||||
required _i6.Coin? coin,
|
||||
bool? verbose = true,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
|
@ -484,11 +463,11 @@ class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
|||
},
|
||||
),
|
||||
returnValue:
|
||||
_i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i5.Future<Map<String, dynamic>>);
|
||||
_i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
|
||||
) as _i4.Future<Map<String, dynamic>>);
|
||||
@override
|
||||
_i5.Future<List<String>> getUsedCoinSerials({
|
||||
required _i7.Coin? coin,
|
||||
_i4.Future<List<String>> getUsedCoinSerials({
|
||||
required _i6.Coin? coin,
|
||||
int? startNumber = 0,
|
||||
}) =>
|
||||
(super.noSuchMethod(
|
||||
|
@ -500,26 +479,26 @@ class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX {
|
|||
#startNumber: startNumber,
|
||||
},
|
||||
),
|
||||
returnValue: _i5.Future<List<String>>.value(<String>[]),
|
||||
) as _i5.Future<List<String>>);
|
||||
returnValue: _i4.Future<List<String>>.value(<String>[]),
|
||||
) as _i4.Future<List<String>>);
|
||||
@override
|
||||
_i5.Future<void> clearSharedTransactionCache({required _i7.Coin? coin}) =>
|
||||
_i4.Future<void> clearSharedTransactionCache({required _i6.Coin? coin}) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#clearSharedTransactionCache,
|
||||
[],
|
||||
{#coin: coin},
|
||||
),
|
||||
returnValue: _i5.Future<void>.value(),
|
||||
returnValueForMissingStub: _i5.Future<void>.value(),
|
||||
) as _i5.Future<void>);
|
||||
returnValue: _i4.Future<void>.value(),
|
||||
returnValueForMissingStub: _i4.Future<void>.value(),
|
||||
) as _i4.Future<void>);
|
||||
}
|
||||
|
||||
/// A class which mocks [TransactionNotificationTracker].
|
||||
///
|
||||
/// See the documentation for Mockito's code generation for more information.
|
||||
class MockTransactionNotificationTracker extends _i1.Mock
|
||||
implements _i8.TransactionNotificationTracker {
|
||||
implements _i7.TransactionNotificationTracker {
|
||||
MockTransactionNotificationTracker() {
|
||||
_i1.throwOnMissingStub(this);
|
||||
}
|
||||
|
@ -548,14 +527,14 @@ class MockTransactionNotificationTracker extends _i1.Mock
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i5.Future<void> addNotifiedPending(String? txid) => (super.noSuchMethod(
|
||||
_i4.Future<void> addNotifiedPending(String? txid) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#addNotifiedPending,
|
||||
[txid],
|
||||
),
|
||||
returnValue: _i5.Future<void>.value(),
|
||||
returnValueForMissingStub: _i5.Future<void>.value(),
|
||||
) as _i5.Future<void>);
|
||||
returnValue: _i4.Future<void>.value(),
|
||||
returnValueForMissingStub: _i4.Future<void>.value(),
|
||||
) as _i4.Future<void>);
|
||||
@override
|
||||
bool wasNotifiedConfirmed(String? txid) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -565,21 +544,21 @@ class MockTransactionNotificationTracker extends _i1.Mock
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i5.Future<void> addNotifiedConfirmed(String? txid) => (super.noSuchMethod(
|
||||
_i4.Future<void> addNotifiedConfirmed(String? txid) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#addNotifiedConfirmed,
|
||||
[txid],
|
||||
),
|
||||
returnValue: _i5.Future<void>.value(),
|
||||
returnValueForMissingStub: _i5.Future<void>.value(),
|
||||
) as _i5.Future<void>);
|
||||
returnValue: _i4.Future<void>.value(),
|
||||
returnValueForMissingStub: _i4.Future<void>.value(),
|
||||
) as _i4.Future<void>);
|
||||
@override
|
||||
_i5.Future<void> deleteTransaction(String? txid) => (super.noSuchMethod(
|
||||
_i4.Future<void> deleteTransaction(String? txid) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#deleteTransaction,
|
||||
[txid],
|
||||
),
|
||||
returnValue: _i5.Future<void>.value(),
|
||||
returnValueForMissingStub: _i5.Future<void>.value(),
|
||||
) as _i5.Future<void>);
|
||||
returnValue: _i4.Future<void>.value(),
|
||||
returnValueForMissingStub: _i4.Future<void>.value(),
|
||||
) as _i4.Future<void>);
|
||||
}
|
||||
|
|
|
@ -78,33 +78,33 @@ void main() {
|
|||
);
|
||||
});
|
||||
|
||||
test("localizedStringAsFixed", () {
|
||||
expect(
|
||||
Amount(rawValue: BigInt.two, fractionDigits: 8)
|
||||
.localizedStringAsFixed(locale: "en_US"),
|
||||
"0.00000002",
|
||||
);
|
||||
expect(
|
||||
Amount(rawValue: BigInt.two, fractionDigits: 8)
|
||||
.localizedStringAsFixed(locale: "en_US", decimalPlaces: 2),
|
||||
"0.00",
|
||||
);
|
||||
expect(
|
||||
Amount.fromDecimal(Decimal.fromInt(2), fractionDigits: 8)
|
||||
.localizedStringAsFixed(locale: "en_US"),
|
||||
"2.00000000",
|
||||
);
|
||||
expect(
|
||||
Amount.fromDecimal(Decimal.fromInt(2), fractionDigits: 8)
|
||||
.localizedStringAsFixed(locale: "en_US", decimalPlaces: 4),
|
||||
"2.0000",
|
||||
);
|
||||
expect(
|
||||
Amount.fromDecimal(Decimal.fromInt(2), fractionDigits: 8)
|
||||
.localizedStringAsFixed(locale: "en_US", decimalPlaces: 0),
|
||||
"2",
|
||||
);
|
||||
});
|
||||
// test("localizedStringAsFixed", () {
|
||||
// expect(
|
||||
// Amount(rawValue: BigInt.two, fractionDigits: 8)
|
||||
// .localizedStringAsFixed(locale: "en_US"),
|
||||
// "0.00000002",
|
||||
// );
|
||||
// expect(
|
||||
// Amount(rawValue: BigInt.two, fractionDigits: 8)
|
||||
// .localizedStringAsFixed(locale: "en_US", decimalPlaces: 2),
|
||||
// "0.00",
|
||||
// );
|
||||
// expect(
|
||||
// Amount.fromDecimal(Decimal.fromInt(2), fractionDigits: 8)
|
||||
// .localizedStringAsFixed(locale: "en_US"),
|
||||
// "2.00000000",
|
||||
// );
|
||||
// expect(
|
||||
// Amount.fromDecimal(Decimal.fromInt(2), fractionDigits: 8)
|
||||
// .localizedStringAsFixed(locale: "en_US", decimalPlaces: 4),
|
||||
// "2.0000",
|
||||
// );
|
||||
// expect(
|
||||
// Amount.fromDecimal(Decimal.fromInt(2), fractionDigits: 8)
|
||||
// .localizedStringAsFixed(locale: "en_US", decimalPlaces: 0),
|
||||
// "2",
|
||||
// );
|
||||
// });
|
||||
});
|
||||
|
||||
group("deserialization", () {
|
||||
|
|
|
@ -68,7 +68,17 @@ void main() {
|
|||
coin: Coin.ethereum,
|
||||
maxDecimalPlaces: 8,
|
||||
),
|
||||
"10.12345678 ETH",
|
||||
"~10.12345678 ETH",
|
||||
);
|
||||
|
||||
expect(
|
||||
AmountUnit.normal.displayAmount(
|
||||
amount: amount,
|
||||
locale: "en_US",
|
||||
coin: Coin.ethereum,
|
||||
maxDecimalPlaces: 4,
|
||||
),
|
||||
"~10.1234 ETH",
|
||||
);
|
||||
|
||||
expect(
|
||||
|
@ -88,7 +98,7 @@ void main() {
|
|||
coin: Coin.ethereum,
|
||||
maxDecimalPlaces: 9,
|
||||
),
|
||||
"10123.456789123 mETH",
|
||||
"~10123.456789123 mETH",
|
||||
);
|
||||
|
||||
expect(
|
||||
|
@ -98,7 +108,7 @@ void main() {
|
|||
coin: Coin.ethereum,
|
||||
maxDecimalPlaces: 8,
|
||||
),
|
||||
"10123456.78912345 µETH",
|
||||
"~10123456.78912345 µETH",
|
||||
);
|
||||
|
||||
expect(
|
||||
|
@ -108,7 +118,7 @@ void main() {
|
|||
coin: Coin.ethereum,
|
||||
maxDecimalPlaces: 1,
|
||||
),
|
||||
"10123456789.1 gwei",
|
||||
"~10123456789.1 gwei",
|
||||
);
|
||||
|
||||
expect(
|
||||
|
|
|
@ -3,20 +3,63 @@ import 'package:flutter_svg/svg.dart';
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:stackwallet/models/isar/stack_theme.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/text_styles.dart';
|
||||
import 'package:stackwallet/widgets/custom_pin_put/custom_pin_put.dart';
|
||||
import 'package:stackwallet/widgets/custom_pin_put/pin_keyboard.dart';
|
||||
|
||||
import '../sample_data/theme_json.dart';
|
||||
|
||||
class PinWidget extends StatefulWidget {
|
||||
const PinWidget({
|
||||
super.key,
|
||||
this.onSubmit,
|
||||
this.controller,
|
||||
required this.pinAnimation,
|
||||
required this.isRandom,
|
||||
});
|
||||
|
||||
final void Function(String)? onSubmit;
|
||||
final TextEditingController? controller;
|
||||
final bool isRandom;
|
||||
final PinAnimationType pinAnimation;
|
||||
|
||||
@override
|
||||
PinWidgetState createState() => PinWidgetState();
|
||||
}
|
||||
|
||||
class PinWidgetState extends State<PinWidget> {
|
||||
int pinCount = 1;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
bool submittedPinMatches = false;
|
||||
|
||||
return CustomPinPut(
|
||||
fieldsCount: pinCount,
|
||||
isRandom: widget.isRandom,
|
||||
useNativeKeyboard: false,
|
||||
eachFieldHeight: 12,
|
||||
eachFieldWidth: 12,
|
||||
textStyle: STextStyles.label(context).copyWith(
|
||||
fontSize: 1,
|
||||
),
|
||||
obscureText: "",
|
||||
onPinLengthChanged: (newLength) {
|
||||
setState(() {
|
||||
pinCount = newLength;
|
||||
});
|
||||
},
|
||||
onSubmit: widget.onSubmit,
|
||||
controller: widget.controller,
|
||||
pinAnimationType: widget.pinAnimation,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
void main() {
|
||||
group("CustomPinPut tests, non-random PIN", () {
|
||||
testWidgets("CustomPinPut with 4 fields builds correctly, non-random PIN",
|
||||
(tester) async {
|
||||
const pinPut = CustomPinPut(
|
||||
fieldsCount: 4,
|
||||
isRandom: false,
|
||||
);
|
||||
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
theme: ThemeData(
|
||||
|
@ -30,13 +73,16 @@ void main() {
|
|||
],
|
||||
),
|
||||
home: const Material(
|
||||
child: pinPut,
|
||||
child: PinWidget(
|
||||
pinAnimation: PinAnimationType.none,
|
||||
isRandom: false,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
// expects 5 here. Four + the actual text field text
|
||||
expect(find.text(""), findsNWidgets(5));
|
||||
expect(find.text(""), findsNWidgets(1));
|
||||
expect(find.byType(PinKeyboard), findsOneWidget);
|
||||
expect(find.byType(BackspaceKey), findsOneWidget);
|
||||
expect(find.byType(NumberKey), findsNWidgets(10));
|
||||
|
@ -45,15 +91,6 @@ void main() {
|
|||
testWidgets("CustomPinPut entering a pin successfully, non-random PIN",
|
||||
(tester) async {
|
||||
bool submittedPinMatches = false;
|
||||
final pinPut = CustomPinPut(
|
||||
fieldsCount: 4,
|
||||
onSubmit: (pin) {
|
||||
submittedPinMatches = pin == "1234";
|
||||
print("pin entered: $pin");
|
||||
},
|
||||
useNativeKeyboard: false,
|
||||
isRandom: false,
|
||||
);
|
||||
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
|
@ -68,7 +105,14 @@ void main() {
|
|||
],
|
||||
),
|
||||
home: Material(
|
||||
child: pinPut,
|
||||
child: PinWidget(
|
||||
pinAnimation: PinAnimationType.none,
|
||||
isRandom: false,
|
||||
onSubmit: (pin) {
|
||||
submittedPinMatches = pin == "1234";
|
||||
print("pin entered: $pin");
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
@ -99,12 +143,6 @@ void main() {
|
|||
testWidgets("CustomPinPut pin enter fade animation, non-random PIN",
|
||||
(tester) async {
|
||||
final controller = TextEditingController();
|
||||
final pinPut = CustomPinPut(
|
||||
fieldsCount: 4,
|
||||
pinAnimationType: PinAnimationType.fade,
|
||||
controller: controller,
|
||||
isRandom: false,
|
||||
);
|
||||
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
|
@ -119,7 +157,11 @@ void main() {
|
|||
],
|
||||
),
|
||||
home: Material(
|
||||
child: pinPut,
|
||||
child: PinWidget(
|
||||
pinAnimation: PinAnimationType.none,
|
||||
isRandom: false,
|
||||
controller: controller,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
@ -137,12 +179,6 @@ void main() {
|
|||
testWidgets("CustomPinPut pin enter scale animation, non-random PIN",
|
||||
(tester) async {
|
||||
final controller = TextEditingController();
|
||||
final pinPut = CustomPinPut(
|
||||
fieldsCount: 4,
|
||||
pinAnimationType: PinAnimationType.scale,
|
||||
controller: controller,
|
||||
isRandom: false,
|
||||
);
|
||||
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
|
@ -157,7 +193,11 @@ void main() {
|
|||
],
|
||||
),
|
||||
home: Material(
|
||||
child: pinPut,
|
||||
child: PinWidget(
|
||||
pinAnimation: PinAnimationType.scale,
|
||||
isRandom: false,
|
||||
controller: controller,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
@ -175,12 +215,6 @@ void main() {
|
|||
testWidgets("CustomPinPut pin enter rotate animation, non-random PIN",
|
||||
(tester) async {
|
||||
final controller = TextEditingController();
|
||||
final pinPut = CustomPinPut(
|
||||
fieldsCount: 4,
|
||||
pinAnimationType: PinAnimationType.rotation,
|
||||
controller: controller,
|
||||
isRandom: false,
|
||||
);
|
||||
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
|
@ -195,7 +229,11 @@ void main() {
|
|||
],
|
||||
),
|
||||
home: Material(
|
||||
child: pinPut,
|
||||
child: PinWidget(
|
||||
pinAnimation: PinAnimationType.rotation,
|
||||
isRandom: false,
|
||||
controller: controller,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
@ -256,11 +294,6 @@ void main() {
|
|||
group("CustomPinPut tests, with random PIN", () {
|
||||
testWidgets("CustomPinPut with 4 fields builds correctly, with random PIN",
|
||||
(tester) async {
|
||||
const pinPut = CustomPinPut(
|
||||
fieldsCount: 4,
|
||||
isRandom: true,
|
||||
);
|
||||
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
theme: ThemeData(
|
||||
|
@ -274,81 +307,76 @@ void main() {
|
|||
],
|
||||
),
|
||||
home: const Material(
|
||||
child: pinPut,
|
||||
child: PinWidget(
|
||||
pinAnimation: PinAnimationType.none,
|
||||
isRandom: true,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
// expects 5 here. Four + the actual text field text
|
||||
expect(find.text(""), findsNWidgets(5));
|
||||
expect(find.text(""), findsNWidgets(1));
|
||||
expect(find.byType(PinKeyboard), findsOneWidget);
|
||||
expect(find.byType(BackspaceKey), findsOneWidget);
|
||||
expect(find.byType(NumberKey), findsNWidgets(10));
|
||||
});
|
||||
|
||||
testWidgets("CustomPinPut entering a pin successfully, with random PIN",
|
||||
(tester) async {
|
||||
bool submittedPinMatches = false;
|
||||
final pinPut = CustomPinPut(
|
||||
fieldsCount: 4,
|
||||
onSubmit: (pin) {
|
||||
submittedPinMatches = pin == "1234";
|
||||
print("pin entered: $pin");
|
||||
},
|
||||
useNativeKeyboard: false,
|
||||
isRandom: true,
|
||||
);
|
||||
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
theme: ThemeData(
|
||||
extensions: [
|
||||
StackColors.fromStackColorTheme(
|
||||
StackTheme.fromJson(
|
||||
json: lightThemeJsonMap,
|
||||
applicationThemesDirectoryPath: "test",
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
home: Material(
|
||||
child: pinPut,
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
await tester.tap(find.byWidgetPredicate(
|
||||
(widget) => widget is NumberKey && widget.number == "1"));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.byWidgetPredicate(
|
||||
(widget) => widget is NumberKey && widget.number == "2"));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.byWidgetPredicate(
|
||||
(widget) => widget is NumberKey && widget.number == "6"));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.byType(BackspaceKey));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.byWidgetPredicate(
|
||||
(widget) => widget is NumberKey && widget.number == "3"));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.byWidgetPredicate(
|
||||
(widget) => widget is NumberKey && widget.number == "4"));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.byType(SubmitKey));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(submittedPinMatches, true);
|
||||
});
|
||||
// testWidgets("CustomPinPut entering a pin successfully, with random PIN",
|
||||
// (tester) async {
|
||||
// bool submittedPinMatches = false;
|
||||
//
|
||||
// await tester.pumpWidget(
|
||||
// MaterialApp(
|
||||
// theme: ThemeData(
|
||||
// extensions: [
|
||||
// StackColors.fromStackColorTheme(
|
||||
// StackTheme.fromJson(
|
||||
// json: lightThemeJsonMap,
|
||||
// applicationThemesDirectoryPath: "test",
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// home: Material(
|
||||
// child: PinWidget(
|
||||
// pinAnimation: PinAnimationType.none,
|
||||
// isRandom: true,
|
||||
// onSubmit: (pin) {
|
||||
// submittedPinMatches = pin == "1234";
|
||||
// print("pin entered: $pin");
|
||||
// },
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// );
|
||||
//
|
||||
// await tester.tap(find.byWidgetPredicate(
|
||||
// (widget) => widget is NumberKey && widget.number == "1"));
|
||||
// await tester.pumpAndSettle();
|
||||
// await tester.tap(find.byWidgetPredicate(
|
||||
// (widget) => widget is NumberKey && widget.number == "2"));
|
||||
// await tester.pumpAndSettle();
|
||||
// await tester.tap(find.byWidgetPredicate(
|
||||
// (widget) => widget is NumberKey && widget.number == "6"));
|
||||
// await tester.pumpAndSettle();
|
||||
// await tester.tap(find.byType(BackspaceKey));
|
||||
// await tester.pumpAndSettle();
|
||||
// await tester.tap(find.byWidgetPredicate(
|
||||
// (widget) => widget is NumberKey && widget.number == "3"));
|
||||
// await tester.pumpAndSettle();
|
||||
// await tester.tap(find.byWidgetPredicate(
|
||||
// (widget) => widget is NumberKey && widget.number == "4"));
|
||||
// await tester.pumpAndSettle();
|
||||
// await tester.tap(find.byType(SubmitKey));
|
||||
// await tester.pumpAndSettle();
|
||||
//
|
||||
// expect(submittedPinMatches, true);
|
||||
// });
|
||||
|
||||
testWidgets("CustomPinPut pin enter fade animation, with random PIN",
|
||||
(tester) async {
|
||||
final controller = TextEditingController();
|
||||
final pinPut = CustomPinPut(
|
||||
fieldsCount: 4,
|
||||
pinAnimationType: PinAnimationType.fade,
|
||||
controller: controller,
|
||||
isRandom: true,
|
||||
);
|
||||
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
|
@ -363,7 +391,11 @@ void main() {
|
|||
],
|
||||
),
|
||||
home: Material(
|
||||
child: pinPut,
|
||||
child: PinWidget(
|
||||
pinAnimation: PinAnimationType.fade,
|
||||
isRandom: true,
|
||||
controller: controller,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
@ -401,7 +433,11 @@ void main() {
|
|||
],
|
||||
),
|
||||
home: Material(
|
||||
child: pinPut,
|
||||
child: PinWidget(
|
||||
isRandom: true,
|
||||
controller: controller,
|
||||
pinAnimation: PinAnimationType.scale,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
@ -439,7 +475,11 @@ void main() {
|
|||
],
|
||||
),
|
||||
home: Material(
|
||||
child: pinPut,
|
||||
child: PinWidget(
|
||||
isRandom: true,
|
||||
controller: controller,
|
||||
pinAnimation: PinAnimationType.rotation,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
|
|
@ -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: "",
|
||||
|
|
Loading…
Reference in a new issue