summaryrefslogtreecommitdiff
path: root/impls
diff options
context:
space:
mode:
Diffstat (limited to 'impls')
-rw-r--r--impls/monero.dart/lib/monero.dart18
-rw-r--r--impls/monero.dart/lib/src/generated_bindings_monero.g.dart14
-rw-r--r--impls/monero.dart/lib/src/ledger.dart55
-rw-r--r--impls/monero.dart/pubspec.yaml3
4 files changed, 82 insertions, 8 deletions
diff --git a/impls/monero.dart/lib/monero.dart b/impls/monero.dart/lib/monero.dart
index 4fcc970..7b6eac3 100644
--- a/impls/monero.dart/lib/monero.dart
+++ b/impls/monero.dart/lib/monero.dart
@@ -3607,6 +3607,24 @@ bool WalletManager_verifyWalletPassword(
return s;
}
+int WalletManager_queryWalletDevice(
+ WalletManager wm_ptr, {
+ required String keysFileName,
+ required String password,
+ required int kdfRounds,
+ }) {
+ debugStart?.call('MONERO_WalletManager_queryWalletDevice');
+ lib ??= MoneroC(DynamicLibrary.open(libPath));
+ final keysFileName_ = keysFileName.toNativeUtf8().cast<Char>();
+ final password_ = password.toNativeUtf8().cast<Char>();
+ final s = lib!.MONERO_WalletManager_queryWalletDevice(
+ wm_ptr, keysFileName_, password_, kdfRounds);
+ calloc.free(keysFileName_);
+ calloc.free(password_);
+ debugEnd?.call('MONERO_WalletManager_queryWalletDevice');
+ return s;
+}
+
List<String> WalletManager_findWallets(WalletManager wm_ptr,
{required String path}) {
debugStart?.call('MONERO_WalletManager_findWallets');
diff --git a/impls/monero.dart/lib/src/generated_bindings_monero.g.dart b/impls/monero.dart/lib/src/generated_bindings_monero.g.dart
index 039fbf9..cd2124b 100644
--- a/impls/monero.dart/lib/src/generated_bindings_monero.g.dart
+++ b/impls/monero.dart/lib/src/generated_bindings_monero.g.dart
@@ -4911,14 +4911,14 @@ class MoneroC {
bool Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>,
ffi.Pointer<ffi.Char>, bool, int)>();
- bool MONERO_WalletManager_queryWalletDevice(
- int device_type,
+ int MONERO_WalletManager_queryWalletDevice(
+ ffi.Pointer<ffi.Void> wm_ptr,
ffi.Pointer<ffi.Char> keys_file_name,
ffi.Pointer<ffi.Char> password,
int kdf_rounds,
) {
return _MONERO_WalletManager_queryWalletDevice(
- device_type,
+ wm_ptr,
keys_file_name,
password,
kdf_rounds,
@@ -4927,15 +4927,15 @@ class MoneroC {
late final _MONERO_WalletManager_queryWalletDevicePtr = _lookup<
ffi.NativeFunction<
- ffi.Bool Function(
- ffi.Int,
+ ffi.Int Function(
+ ffi.Pointer<ffi.Void>,
ffi.Pointer<ffi.Char>,
ffi.Pointer<ffi.Char>,
ffi.Uint64)>>('MONERO_WalletManager_queryWalletDevice');
late final _MONERO_WalletManager_queryWalletDevice =
_MONERO_WalletManager_queryWalletDevicePtr.asFunction<
- bool Function(
- int, ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Char>, int)>();
+ int Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>,
+ ffi.Pointer<ffi.Char>, int)>();
ffi.Pointer<ffi.Char> MONERO_WalletManager_findWallets(
ffi.Pointer<ffi.Void> wm_ptr,
diff --git a/impls/monero.dart/lib/src/ledger.dart b/impls/monero.dart/lib/src/ledger.dart
new file mode 100644
index 0000000..166bcf4
--- /dev/null
+++ b/impls/monero.dart/lib/src/ledger.dart
@@ -0,0 +1,55 @@
+import 'dart:async';
+import 'dart:ffi';
+import 'dart:typed_data';
+
+import 'package:ffi/ffi.dart';
+import 'package:ledger_flutter_plus/ledger_flutter_plus.dart';
+import 'package:monero/monero.dart' as monero;
+
+Timer? _ledgerExchangeTimer;
+String _lastLedgerRequest = '';
+
+void enableLedgerExchange(monero.wallet ptr, LedgerConnection connection) {
+ _ledgerExchangeTimer = Timer.periodic(Duration(milliseconds: 1), (_) async {
+ final ledgerRequestLength = monero.Wallet_getSendToDeviceLength(ptr);
+ final ledgerRequest = monero.Wallet_getSendToDevice(ptr)
+ .cast<Uint8>()
+ .asTypedList(ledgerRequestLength);
+ if (ledgerRequestLength > 0 && _lastLedgerRequest != ledgerRequest.join()) {
+ _lastLedgerRequest = ledgerRequest.join();
+
+ final 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];
+ }
+
+ monero.Wallet_setDeviceReceivedData(
+ ptr, result.cast<UnsignedChar>(), response.length);
+
+ monero.Wallet_setDeviceSendData(
+ ptr, malloc<Uint8>(0).cast<UnsignedChar>(), 0);
+ }
+ });
+}
+
+void disableLedgerExchange() {
+ _ledgerExchangeTimer?.cancel();
+}
+
+Future<Uint8List> exchange(LedgerConnection connection, Uint8List data) async =>
+ connection.sendOperation<Uint8List>(ExchangeOperation(data));
+
+class ExchangeOperation extends LedgerOperation<Uint8List> {
+ final Uint8List inputData;
+
+ ExchangeOperation(this.inputData);
+
+ @override
+ Future<Uint8List> read(ByteDataReader reader) async =>
+ reader.read(reader.remainingLength);
+
+ @override
+ Future<List<Uint8List>> write(ByteDataWriter writer) async => [inputData];
+}
diff --git a/impls/monero.dart/pubspec.yaml b/impls/monero.dart/pubspec.yaml
index 174a781..577dcbe 100644
--- a/impls/monero.dart/pubspec.yaml
+++ b/impls/monero.dart/pubspec.yaml
@@ -8,8 +8,9 @@ environment:
dependencies:
ffi: ^2.1.0
+ ledger_flutter_plus: ^1.2.5
dev_dependencies:
lints: ^5.0.0
test: ^1.24.0
- ffigen: ^14.0.0 \ No newline at end of file
+ ffigen: ^14.0.0