mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2025-06-28 12:29:51 +00:00
CW-1045-Ledger-Bugs-Enhancements (#2278)
* feat: prepare ledger.dart to use callbacks * feat: set ledger callback using monero_c * fix(cw_monero): async ledger * build: Bump monero_c dependencies * feat: Add "How to connect" to HW Device selection screen * refactor: use monero_c free to clean pointer * fix: use new monero_c deps * fix: merge conflicts regarding new theming * feat: add status bottomsheet indicating an ongoing signing process * fix: getLastLedgerCommand monero.dart generation * reformat send_view_model.dart [skip ci] --------- Co-authored-by: Czarek Nakamoto <cyjan@mrcyjanek.net> Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>
This commit is contained in:
parent
e03dcc7fe9
commit
90aee053cd
46 changed files with 660 additions and 315 deletions
|
@ -388,9 +388,7 @@ Future<void> loadWallet(
|
|||
if (gLedger == null) {
|
||||
throw Exception("Tried to open a ledger wallet with no ledger connected");
|
||||
}
|
||||
final dummyWPtr = (currentWallet ??
|
||||
wmPtr.openWallet(path: '', password: ''));
|
||||
enableLedgerExchange(dummyWPtr, gLedger!);
|
||||
enableLedgerExchange(gLedger!);
|
||||
}
|
||||
|
||||
final addr = wmPtr.ffiAddress();
|
||||
|
|
|
@ -2,75 +2,50 @@ import 'dart:async';
|
|||
import 'dart:ffi';
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:cw_core/utils/print_verbose.dart';
|
||||
import 'package:ffi/ffi.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:ledger_flutter_plus/ledger_flutter_plus.dart';
|
||||
import 'package:ledger_flutter_plus/ledger_flutter_plus_dart.dart';
|
||||
import 'package:monero/src/wallet2.dart';
|
||||
import 'package:monero/src/monero.dart' as api;
|
||||
|
||||
LedgerConnection? gLedger;
|
||||
String? latestLedgerCommand;
|
||||
|
||||
Timer? _ledgerExchangeTimer;
|
||||
Timer? _ledgerKeepAlive;
|
||||
typedef LedgerCallback = Void Function(Pointer<UnsignedChar>, UnsignedInt);
|
||||
NativeCallable<LedgerCallback>? callable;
|
||||
|
||||
void enableLedgerExchange(Wallet2Wallet wallet, LedgerConnection connection) {
|
||||
_ledgerExchangeTimer?.cancel();
|
||||
_ledgerExchangeTimer = Timer.periodic(Duration(milliseconds: 1), (_) async {
|
||||
final ledgerRequestLength = wallet.getSendToDeviceLength();
|
||||
final ledgerRequest = wallet.getSendToDevice()
|
||||
.cast<Uint8>()
|
||||
.asTypedList(ledgerRequestLength);
|
||||
if (ledgerRequestLength > 0) {
|
||||
_ledgerKeepAlive?.cancel();
|
||||
void enableLedgerExchange(LedgerConnection connection) {
|
||||
callable?.close();
|
||||
|
||||
final Pointer<Uint8> emptyPointer = malloc<Uint8>(0);
|
||||
wallet.setDeviceSendData(
|
||||
emptyPointer.cast<UnsignedChar>(), 0);
|
||||
malloc.free(emptyPointer);
|
||||
void callback(Pointer<UnsignedChar> request, int requestLength) async {
|
||||
final ledgerRequest = request.cast<Uint8>().asTypedList(requestLength);
|
||||
|
||||
_logLedgerCommand(ledgerRequest, false);
|
||||
final response = await exchange(connection, ledgerRequest);
|
||||
_logLedgerCommand(response, true);
|
||||
_logLedgerCommand(ledgerRequest, false);
|
||||
final response = await exchange(connection, ledgerRequest);
|
||||
_logLedgerCommand(response, true);
|
||||
|
||||
if (ListEquality().equals(response, [0x55, 0x15])) {
|
||||
await connection.disconnect();
|
||||
// // TODO: Show POPUP pls unlock your device
|
||||
// await Future.delayed(Duration(seconds: 15));
|
||||
// response = await exchange(connection, ledgerRequest);
|
||||
}
|
||||
|
||||
final Pointer<Uint8> result = malloc<Uint8>(response.length);
|
||||
for (var i = 0; i < response.length; i++) {
|
||||
result.asTypedList(response.length)[i] = response[i];
|
||||
}
|
||||
|
||||
wallet.setDeviceReceivedData(
|
||||
result.cast<UnsignedChar>(), response.length);
|
||||
malloc.free(result);
|
||||
keepAlive(connection);
|
||||
final Pointer<Uint8> result = malloc<Uint8>(response.length);
|
||||
for (var i = 0; i < response.length; i++) {
|
||||
result.asTypedList(response.length)[i] = response[i];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void keepAlive(LedgerConnection connection) {
|
||||
if (connection.connectionType == ConnectionType.ble) {
|
||||
_ledgerKeepAlive = Timer.periodic(Duration(seconds: 10), (_) async {
|
||||
UniversalBle.setNotifiable(
|
||||
connection.device.id,
|
||||
connection.device.deviceInfo.serviceId,
|
||||
connection.device.deviceInfo.notifyCharacteristicKey,
|
||||
BleInputProperty.notification,
|
||||
).onError((_, __) async {});
|
||||
});
|
||||
latestLedgerCommand = _ledgerMoneroCommands[ledgerRequest[1]];
|
||||
|
||||
api.MoneroWallet.setDeviceReceivedData(
|
||||
result.cast<UnsignedChar>(), response.length);
|
||||
api.MoneroFree().free(result.cast());
|
||||
}
|
||||
|
||||
callable = NativeCallable<LedgerCallback>.listener(callback);
|
||||
api.MoneroWallet.setLedgerCallback(callable!.nativeFunction);
|
||||
}
|
||||
|
||||
void disableLedgerExchange() {
|
||||
_ledgerExchangeTimer?.cancel();
|
||||
_ledgerKeepAlive?.cancel();
|
||||
callable?.close();
|
||||
gLedger?.disconnect();
|
||||
gLedger = null;
|
||||
latestLedgerCommand = null;
|
||||
}
|
||||
|
||||
Future<Uint8List> exchange(LedgerConnection connection, Uint8List data) async =>
|
||||
|
@ -135,8 +110,6 @@ void _logLedgerCommand(Uint8List command, [bool isResponse = true]) {
|
|||
String toHexString(Uint8List data) =>
|
||||
data.map((e) => e.toRadixString(16).padLeft(2, '0')).join();
|
||||
|
||||
|
||||
|
||||
if (isResponse) {
|
||||
printV("< ${toHexString(command)}");
|
||||
} else {
|
||||
|
|
|
@ -927,8 +927,7 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
|
|||
}
|
||||
|
||||
void setLedgerConnection(LedgerConnection connection) {
|
||||
final dummyWPtr = createWalletPointer();
|
||||
enableLedgerExchange(dummyWPtr, connection);
|
||||
enableLedgerExchange(connection);
|
||||
}
|
||||
|
||||
@override
|
||||
|
|
|
@ -294,12 +294,7 @@ class MoneroWalletService extends WalletService<
|
|||
final password = credentials.password;
|
||||
final height = credentials.height;
|
||||
|
||||
if (currentWallet == null) {
|
||||
final tmpWptr = monero_wallet_manager.createWalletPointer();
|
||||
enableLedgerExchange(tmpWptr, credentials.ledgerConnection);
|
||||
} else {
|
||||
enableLedgerExchange(currentWallet!, credentials.ledgerConnection);
|
||||
}
|
||||
enableLedgerExchange(credentials.ledgerConnection);
|
||||
|
||||
await monero_wallet_manager.restoreWalletFromHardwareWallet(
|
||||
path: path,
|
||||
|
|
|
@ -42,10 +42,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: async
|
||||
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
|
||||
sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.11.0"
|
||||
version: "2.12.0"
|
||||
bip32:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -83,10 +83,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: boolean_selector
|
||||
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
|
||||
sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
version: "2.1.2"
|
||||
bs58check:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -172,10 +172,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: characters
|
||||
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
|
||||
sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.0"
|
||||
version: "1.4.0"
|
||||
checked_yaml:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -188,10 +188,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: clock
|
||||
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
|
||||
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
version: "1.1.2"
|
||||
code_builder:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -204,10 +204,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: collection
|
||||
sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
|
||||
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.19.0"
|
||||
version: "1.19.1"
|
||||
convert:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -283,10 +283,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: fake_async
|
||||
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
|
||||
sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.1"
|
||||
version: "1.3.2"
|
||||
ffi:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -461,18 +461,18 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: leak_tracker
|
||||
sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06"
|
||||
sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "10.0.7"
|
||||
version: "10.0.8"
|
||||
leak_tracker_flutter_testing:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: leak_tracker_flutter_testing
|
||||
sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379"
|
||||
sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.8"
|
||||
version: "3.0.9"
|
||||
leak_tracker_testing:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -517,10 +517,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: matcher
|
||||
sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
|
||||
sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.12.16+1"
|
||||
version: "0.12.17"
|
||||
material_color_utilities:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -533,10 +533,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: meta
|
||||
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
|
||||
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.15.0"
|
||||
version: "1.16.0"
|
||||
mime:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -573,8 +573,8 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
path: "impls/monero.dart"
|
||||
ref: b335585a7fb94b315eb52bd88f2da6d3489fa508
|
||||
resolved-ref: b335585a7fb94b315eb52bd88f2da6d3489fa508
|
||||
ref: "4868eb9220962a4176a7ed0fc7c809c6200e71a0"
|
||||
resolved-ref: "4868eb9220962a4176a7ed0fc7c809c6200e71a0"
|
||||
url: "https://github.com/mrcyjanek/monero_c"
|
||||
source: git
|
||||
version: "0.0.0"
|
||||
|
@ -615,10 +615,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: path
|
||||
sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
|
||||
sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.9.0"
|
||||
version: "1.9.1"
|
||||
path_provider:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -804,26 +804,26 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: source_span
|
||||
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
|
||||
sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.10.0"
|
||||
version: "1.10.1"
|
||||
stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stack_trace
|
||||
sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377"
|
||||
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.12.0"
|
||||
version: "1.12.1"
|
||||
stream_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stream_channel
|
||||
sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
|
||||
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.2"
|
||||
version: "2.1.4"
|
||||
stream_transform:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -836,26 +836,26 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: string_scanner
|
||||
sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3"
|
||||
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.0"
|
||||
version: "1.4.1"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: term_glyph
|
||||
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
|
||||
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.1"
|
||||
version: "1.2.2"
|
||||
test_api:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_api
|
||||
sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c"
|
||||
sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.7.3"
|
||||
version: "0.7.4"
|
||||
timing:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -916,10 +916,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: vm_service
|
||||
sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b
|
||||
sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "14.3.0"
|
||||
version: "14.3.1"
|
||||
watcher:
|
||||
dependency: "direct overridden"
|
||||
description:
|
||||
|
@ -977,5 +977,5 @@ packages:
|
|||
source: hosted
|
||||
version: "3.1.3"
|
||||
sdks:
|
||||
dart: ">=3.6.0 <4.0.0"
|
||||
dart: ">=3.7.0-0 <4.0.0"
|
||||
flutter: ">=3.24.0"
|
||||
|
|
|
@ -2,11 +2,10 @@ name: cw_monero
|
|||
description: A new flutter plugin project.
|
||||
version: 0.0.1
|
||||
publish_to: none
|
||||
author: Cake Wallet
|
||||
homepage: https://cakewallet.com
|
||||
|
||||
environment:
|
||||
sdk: ">=2.19.0 <3.0.0"
|
||||
sdk: ^3.5.0
|
||||
flutter: ">=1.20.0"
|
||||
|
||||
dependencies:
|
||||
|
@ -27,7 +26,7 @@ dependencies:
|
|||
monero:
|
||||
git:
|
||||
url: https://github.com/mrcyjanek/monero_c
|
||||
ref: b335585a7fb94b315eb52bd88f2da6d3489fa508
|
||||
ref: a27fbcb24d91143715ed930a05aaa4d853fba1f2
|
||||
path: impls/monero.dart
|
||||
mutex: ^3.1.0
|
||||
ledger_flutter_plus: ^1.4.1
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue