From 35633848e26dcf8cdc928de8df31f14eb9ee918c Mon Sep 17 00:00:00 2001 From: Czarek Nakamoto Date: Fri, 23 Aug 2024 12:23:30 +0200 Subject: ledger changes --- impls/monero.dart/lib/src/ledger.dart | 79 +++++++++++++++++++++++++++++++++++ impls/monero.dart/pubspec.yaml | 6 ++- 2 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 impls/monero.dart/lib/src/ledger.dart diff --git a/impls/monero.dart/lib/src/ledger.dart b/impls/monero.dart/lib/src/ledger.dart new file mode 100644 index 0000000..b24bced --- /dev/null +++ b/impls/monero.dart/lib/src/ledger.dart @@ -0,0 +1,79 @@ +import 'dart:async'; +import 'dart:ffi'; +import 'dart:typed_data'; + +import 'package:ffi/ffi.dart'; +import 'package:ledger_flutter/src/ledger.dart'; +import 'package:ledger_flutter/src/ledger/ledger_operation.dart'; +import 'package:ledger_flutter/src/models/ledger_device.dart'; +import 'package:ledger_flutter/src/utils/buffer.dart'; +import 'package:monero/monero.dart' as monero; + +Timer? _ledgerExchangeTimer; +Uint8List _lastLedgerRequest = Uint8List(0); + +void enableLedgerExchange( + monero.wallet ptr, Ledger ledger, LedgerDevice device) { + _ledgerExchangeTimer = Timer.periodic(Duration(milliseconds: 1), (_) async { + final ledgerRequestLength = monero.Wallet_getSendToDeviceLength(ptr); + final ledgerRequest = monero.Wallet_getSendToDevice(ptr) + .cast() + .asTypedList(ledgerRequestLength); + if (ledgerRequestLength > 0 && _lastLedgerRequest != ledgerRequest) { + final response = await exchange(ledger, device, ledgerRequest); + + final Pointer result = malloc(response.length); + result.asTypedList(response.length).addAll(response); + monero.Wallet_setDeviceReceivedData( + ptr, result.cast(), response.length); + + monero.Wallet_setDeviceSendData( + ptr, malloc(0).cast(), 0); + } + }); +} + +void disableLedgerExchange() { + _ledgerExchangeTimer?.cancel(); +} + +Future exchange( + Ledger ledger, LedgerDevice device, Uint8List data) async { + return ledger.sendOperation( + device, + ExchangeOperation( + cla: 0x00, + ins: 0x00, + p1: 0x00, + p2: 0x00, + inputData: data, + ), + ); +} + +class ExchangeOperation extends LedgerOperation { + final int cla; + final int ins; + final int p1; + final int p2; + final Uint8List inputData; + + ExchangeOperation({ + required this.cla, + required this.ins, + required this.p1, + required this.p2, + required this.inputData, + }); + + @override + Future read(ByteDataReader reader) async => + reader.read(reader.remainingLength); + + @override + Future> write(ByteDataWriter writer) async { + writer.write(inputData); + + return [writer.toBytes()]; + } +} diff --git a/impls/monero.dart/pubspec.yaml b/impls/monero.dart/pubspec.yaml index 4f48698..4c6254b 100644 --- a/impls/monero.dart/pubspec.yaml +++ b/impls/monero.dart/pubspec.yaml @@ -8,8 +8,12 @@ environment: dependencies: ffi: ^2.1.0 + ledger_flutter: + git: + url: https://github.com/MrCyjaneK/ledger-flutter + ref: d68f1be485717bedad0779ee6114afec1896fbc9 dev_dependencies: lints: ^4.0.0 test: ^1.24.0 - ffigen: ^13.0.0 \ No newline at end of file + ffigen: ^13.0.0 -- cgit v1.2.3