summaryrefslogtreecommitdiff
path: root/patches/monero
diff options
context:
space:
mode:
authorCzarek Nakamoto <cyjan@mrcyjanek.net>2026-05-06 13:48:00 -0400
committerCzarek Nakamoto <cyjan@mrcyjanek.net>2026-05-07 11:28:22 -0400
commit7b95d7276fc321cf7eab88475c51b2829b8e4188 (patch)
tree2cfe0c0984d86cacbf53ee1cb33ee536fc3979df /patches/monero
parentbc8d1a0b75b97156d71579581b4cdfe58c777ed2 (diff)
Diffstat (limited to 'patches/monero')
-rw-r--r--patches/monero/0021-add-dummy-device-for-Trezor.patch596
1 files changed, 596 insertions, 0 deletions
diff --git a/patches/monero/0021-add-dummy-device-for-Trezor.patch b/patches/monero/0021-add-dummy-device-for-Trezor.patch
new file mode 100644
index 0000000..9205a9f
--- /dev/null
+++ b/patches/monero/0021-add-dummy-device-for-Trezor.patch
@@ -0,0 +1,596 @@
+From 32f25991193d88f07109ed0416ccd1cead078550 Mon Sep 17 00:00:00 2001
+From: Czarek Nakamoto <cyjan@mrcyjanek.net>
+Date: Wed, 6 May 2026 13:45:34 -0400
+Subject: [PATCH] add dummy device for Trezor
+
+---
+ src/device/device_io_dummy.cpp | 6 +-
+ src/device/device_io_dummy.hpp | 2 +-
+ src/device_trezor/trezor/transport.cpp | 178 ++++++++++++++++++++++++-
+ src/device_trezor/trezor/transport.hpp | 51 +++++++
+ src/wallet/api/wallet.cpp | 127 ++++++++++++++----
+ src/wallet/api/wallet.h | 14 +-
+ src/wallet/api/wallet2_api.h | 21 ++-
+ 7 files changed, 351 insertions(+), 48 deletions(-)
+
+diff --git a/src/device/device_io_dummy.cpp b/src/device/device_io_dummy.cpp
+index 74742150d..6365bb427 100644
+--- a/src/device/device_io_dummy.cpp
++++ b/src/device/device_io_dummy.cpp
+@@ -138,9 +138,9 @@ namespace hw {
+ MDEBUG("release()");
+ }
+
+- void device_io_dummy::setLedgerCallback(void (*sendToLedgerDevice)(unsigned char *command, unsigned int cmd_len)) {
+- MDEBUG("setLedgerCallback()");
+- sendToLedgerDeviceCallback = sendToLedgerDevice;
++ void device_io_dummy::setDeviceCallback(void (*sendToDeviceCallback)(unsigned char *command, unsigned int cmd_len)) {
++ MDEBUG("setDeviceCallback()");
++ sendToLedgerDeviceCallback = sendToDeviceCallback;
+ }
+
+ void device_io_dummy::setDeviceReceivedData(unsigned char* data, size_t len) {
+diff --git a/src/device/device_io_dummy.hpp b/src/device/device_io_dummy.hpp
+index 87a5f109f..80b356a0b 100644
+--- a/src/device/device_io_dummy.hpp
++++ b/src/device/device_io_dummy.hpp
+@@ -73,7 +73,7 @@ namespace hw {
+
+ int exchange(unsigned char *command, unsigned int cmd_len, unsigned char *response, unsigned int max_resp_len, bool user_input);
+
+- static void setLedgerCallback(void (*sendToLedgerDevice)(unsigned char *command, unsigned int cmd_len));
++ static void setDeviceCallback(void (*sendToDeviceCallback)(unsigned char *command, unsigned int cmd_len));
+ static void setDeviceReceivedData(unsigned char* data, size_t len);
+ };
+ };
+diff --git a/src/device_trezor/trezor/transport.cpp b/src/device_trezor/trezor/transport.cpp
+index 10dd82c53..5cf7e1cb8 100644
+--- a/src/device_trezor/trezor/transport.cpp
++++ b/src/device_trezor/trezor/transport.cpp
+@@ -27,6 +27,7 @@
+ // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ //
+
++#include "exceptions.hpp"
+ #ifdef WITH_DEVICE_TREZOR_WEBUSB
+ #include <libusb.h>
+ #endif
+@@ -1166,8 +1167,177 @@ namespace trezor{
+ return o << ">";
+ };
+
+-#endif // WITH_DEVICE_TREZOR_WEBUSB
++#endif // WITH_DEVICE_TREZOR_WEBUSB
+
++
++std::condition_variable hw::trezor::DummyTransport::cv_send;
++std::condition_variable hw::trezor::DummyTransport::cv_receive;
++bool hw::trezor::DummyTransport::stateIsConnected = false;
++unsigned char* hw::trezor::DummyTransport::sendToDevice = {};
++size_t hw::trezor::DummyTransport::sendToDeviceLength = 0;
++unsigned char* hw::trezor::DummyTransport::receivedFromDevice = {};
++size_t hw::trezor::DummyTransport::receivedFromDeviceLength = 0;
++bool hw::trezor::DummyTransport::waitsForDeviceSend = false;
++bool hw::trezor::DummyTransport::waitsForDeviceReceive = false;
++void (*hw::trezor::DummyTransport::sendToTrezorDeviceCallback)(unsigned char *command, unsigned int cmd_len) = nullptr;
++std::mutex hw::trezor::DummyTransport::mutex;
++
++const char * DummyTransport::PATH_PREFIX = "dummy:";
++
++DummyTransport::DummyTransport(
++ boost::optional<std::shared_ptr<Protocol>> proto
++)
++{
++ m_proto = proto ? proto.get() : std::make_shared<ProtocolV1>();
++}
++
++DummyTransport::~DummyTransport(){
++ close();
++}
++
++std::shared_ptr<Transport> DummyTransport::find_debug() {
++ return nullptr;
++}
++
++void DummyTransport::require_device() const{
++ if (!stateIsConnected){
++ throw std::runtime_error("stateIsConnected is false");
++ }
++}
++
++void DummyTransport::require_connected() const{
++ require_device();
++}
++
++void DummyTransport::enumerate(t_transport_vect & res) {
++ auto t = std::make_shared<DummyTransport>();
++ res.push_back(t);
++}
++
++std::string DummyTransport::get_path() const {
++ std::stringstream ss;
++ ss << DummyTransport::PATH_PREFIX << "dummy";
++ return ss.str();
++};
++
++void DummyTransport::open() {
++ if (sendToTrezorDeviceCallback == nullptr) {
++ throw exc::TrezorException("sendToTrezorDeviceCallback is null");
++ }
++ stateIsConnected = true;
++ m_proto->session_begin(*this);
++}
++
++void DummyTransport::close() {
++ stateIsConnected = false;
++};
++
++int DummyTransport::get_interface() const{
++ const int INTERFACE_NORMAL = 0;
++#ifdef WITH_TREZOR_DEBUGGING
++ const int INTERFACE_DEBUG = 1;
++ return m_debug_mode ? INTERFACE_DEBUG : INTERFACE_NORMAL;
++#else
++ return INTERFACE_NORMAL;
++#endif
++}
++
++unsigned char DummyTransport::get_endpoint() const{
++ const unsigned char ENDPOINT_NORMAL = 1;
++#ifdef WITH_TREZOR_DEBUGGING
++ const unsigned char ENDPOINT_DEBUG = 2;
++ return m_debug_mode ? ENDPOINT_DEBUG : ENDPOINT_NORMAL;
++#else
++ return ENDPOINT_NORMAL;
++#endif
++}
++
++void DummyTransport::write(const google::protobuf::Message &req) {
++ m_proto->write(*this, req);
++};
++
++void DummyTransport::read(std::shared_ptr<google::protobuf::Message> & msg, messages::MessageType * msg_type) {
++ m_proto->read(*this, msg, msg_type);
++};
++
++void DummyTransport::write_chunk(const void * buff, size_t size) {
++ require_connected();
++ if (size != REPLEN){
++ throw exc::CommunicationException("Invalid chunk size: ");
++ }
++
++ MDEBUG("write_chunk(): locking mutex");
++ std::unique_lock<std::mutex> lock(mutex);
++
++ sendToDevice = const_cast<unsigned char*>(static_cast<const unsigned char*>(buff));
++ sendToDeviceLength = size;
++ waitsForDeviceSend = true;
++ waitsForDeviceReceive = true;
++
++ if (sendToTrezorDeviceCallback != nullptr) {
++ MDEBUG("write_chunk(): calling sendToTrezorDeviceCallback");
++ sendToTrezorDeviceCallback(
++ const_cast<unsigned char*>(static_cast<const unsigned char*>(buff)),
++ static_cast<unsigned int>(size)
++ );
++ }
++
++ while (waitsForDeviceSend) {
++ cv_send.wait(lock);
++ MDEBUG("write_chunk(): waitsForDeviceSend notified");
++ }
++}
++
++size_t DummyTransport::read_chunk(void * buff, size_t size) {
++ require_connected();
++ MDEBUG("read_chunk(): locking mutex");
++ std::unique_lock<std::mutex> lock(mutex);
++
++ while (waitsForDeviceReceive) {
++ cv_receive.wait(lock);
++ MDEBUG("read_chunk(): waitsForDeviceReceive notified");
++ }
++
++ if (receivedFromDeviceLength > size) {
++ MDEBUG("read_chunk(): receivedFromDeviceLength ("
++ << receivedFromDeviceLength << ") > buffer size (" << size << ")");
++ throw exc::CommunicationException("Response chunk too large for buffer");
++ }
++
++ memset(buff, 0, size);
++ memcpy(buff, receivedFromDevice, receivedFromDeviceLength);
++
++ waitsForDeviceReceive = true;
++
++ return receivedFromDeviceLength;
++}
++
++std::ostream& DummyTransport::dump(std::ostream& o) const {
++ o << "DummyTransport<path=" << get_path();
++ return o << ">";
++};
++
++
++void DummyTransport::setDeviceCallback(void (*sendToDeviceCallback)(unsigned char *command, unsigned int cmd_len)) {
++ MDEBUG("setDeviceCallback()");
++ sendToTrezorDeviceCallback = sendToDeviceCallback;
++}
++
++void DummyTransport::setDeviceReceivedData(unsigned char* data, size_t len) {
++ MDEBUG("setDeviceReceivedData(len: " << len << ")");
++ std::unique_lock<std::mutex> lock(mutex);
++
++ receivedFromDevice = static_cast<unsigned char *>(malloc(len));
++ receivedFromDeviceLength = len;
++ memset(receivedFromDevice, 0, len);
++ memcpy(receivedFromDevice, data, len);
++ waitsForDeviceReceive = false;
++ waitsForDeviceSend = false;
++ cv_send.notify_all();
++ cv_receive.notify_all();
++}
++
++
+ void enumerate(t_transport_vect & res){
+ BridgeTransport bt;
+ try{
+@@ -1193,6 +1363,12 @@ namespace trezor{
+ MERROR("UdpTransport enumeration failed:" << e.what());
+ }
+ #endif
++ hw::trezor::DummyTransport dt;
++ try{
++ dt.enumerate(res);
++ } catch (const std::exception & e){
++ MERROR("DummyTransport enumeration failed:" << e.what());
++ }
+ }
+
+ void sort_transports_by_env(t_transport_vect & res){
+diff --git a/src/device_trezor/trezor/transport.hpp b/src/device_trezor/trezor/transport.hpp
+index 827b189fd..f1036383b 100644
+--- a/src/device_trezor/trezor/transport.hpp
++++ b/src/device_trezor/trezor/transport.hpp
+@@ -302,6 +302,57 @@ namespace trezor {
+
+ #endif
+
++class DummyTransport : public Transport {
++public:
++
++ explicit DummyTransport(
++ boost::optional<std::shared_ptr<Protocol>> proto = boost::none
++ );
++
++ virtual ~DummyTransport();
++
++ static const char * PATH_PREFIX;
++
++ std::string get_path() const override;
++ void enumerate(t_transport_vect & res) override;
++
++ void open() override;
++ void close() override;
++ std::shared_ptr<Transport> find_debug() override;
++
++ void write(const google::protobuf::Message &req) override;
++ void read(std::shared_ptr<google::protobuf::Message> & msg, messages::MessageType * msg_type=nullptr) override;
++
++ void write_chunk(const void * buff, size_t size) override;
++ size_t read_chunk(void * buff, size_t size) override;
++
++ std::ostream& dump(std::ostream& o) const override;
++ static std::mutex mutex;
++ static void setDeviceReceivedData(unsigned char* data, size_t len);
++ static void setDeviceCallback(void (*sendToDeviceCallback)(unsigned char *command, unsigned int cmd_len));
++ static std::condition_variable cv_send;
++ static std::condition_variable cv_receive;
++ static bool stateIsConnected;
++ static unsigned char* sendToDevice;
++ static size_t sendToDeviceLength;
++ static unsigned char* receivedFromDevice;
++ static size_t receivedFromDeviceLength;
++ static bool waitsForDeviceSend;
++ static bool waitsForDeviceReceive;
++ static void (*sendToTrezorDeviceCallback)(unsigned char *command, unsigned int cmd_len);
++private:
++ void require_device() const;
++ void require_connected() const;
++ int get_interface() const;
++ unsigned char get_endpoint() const;
++
++ std::shared_ptr<Protocol> m_proto;
++
++#ifdef WITH_TREZOR_DEBUGGING
++ bool m_debug_mode;
++#endif
++};
++
+ //
+ // General helpers
+ //
+diff --git a/src/wallet/api/wallet.cpp b/src/wallet/api/wallet.cpp
+index c24b4a97d..4cb37a4a6 100644
+--- a/src/wallet/api/wallet.cpp
++++ b/src/wallet/api/wallet.cpp
+@@ -42,6 +42,7 @@
+
+ #include "mnemonics/electrum-words.h"
+ #include "mnemonics/english.h"
++#include "wallet2_api.h"
+ #include <boost/format.hpp>
+ #include <sstream>
+ #include <unordered_map>
+@@ -53,6 +54,7 @@
+ #include "bc-ur/src/bc-ur.hpp"
+ #if defined(HIDAPI_DUMMY) && !defined(HAVE_HIDAPI)
+ #include "device/device_io_dummy.hpp"
++#include "device_trezor/trezor/transport.hpp"
+ #endif
+
+ using namespace std;
+@@ -3379,98 +3381,173 @@ uint64_t WalletImpl::getBytesSent()
+
+
+ // HIDAPI_DUMMY
+-bool Wallet::getStateIsConnected() {
++bool Wallet::getStateIsConnected(Device device) {
+ #if !(defined(HIDAPI_DUMMY) && !defined(HAVE_HIDAPI))
+ MERROR("MONERO compiled with #if !(defined(HIDAPI_DUMMY) && !defined(HAVE_HIDAPI))");
+ return false;
+ #else
+- return hw::io::device_io_dummy::stateIsConnected;
++ switch (device) {
++ case Monero::Wallet::Device_Ledger:
++ return hw::io::device_io_dummy::stateIsConnected;
++ case Monero::Wallet::Device_Trezor:
++ return hw::trezor::DummyTransport::stateIsConnected;
++ default:
++ throw std::runtime_error("unknown device type");
++ }
+ #endif
+ }
+
+-unsigned char* Wallet::getSendToDevice() {
++unsigned char* Wallet::getSendToDevice(Device device) {
+ #if !(defined(HIDAPI_DUMMY) && !defined(HAVE_HIDAPI))
+ MERROR("MONERO compiled with #if !(defined(HIDAPI_DUMMY) && !defined(HAVE_HIDAPI))");
+ return {};
+ #else
+- return hw::io::device_io_dummy::sendToDevice;
++ switch (device) {
++ case Monero::Wallet::Device_Ledger:
++ return hw::io::device_io_dummy::sendToDevice;
++ case Monero::Wallet::Device_Trezor:
++ return hw::trezor::DummyTransport::sendToDevice;
++ default:
++ throw std::runtime_error("unknown device type");
++ }
+ #endif
+ }
+
+-size_t Wallet::getSendToDeviceLength() {
++size_t Wallet::getSendToDeviceLength(Device device) {
+ #if !(defined(HIDAPI_DUMMY) && !defined(HAVE_HIDAPI))
+ MERROR("MONERO compiled with #if !(defined(HIDAPI_DUMMY) && !defined(HAVE_HIDAPI))");
+ return -1;
+ #else
+- return hw::io::device_io_dummy::sendToDeviceLength;
++ switch (device) {
++ case Monero::Wallet::Device_Ledger:
++ return hw::io::device_io_dummy::sendToDeviceLength;
++ case Monero::Wallet::Device_Trezor:
++ return hw::trezor::DummyTransport::sendToDeviceLength;
++ default:
++ throw std::runtime_error("unknown device type");
++ }
+ #endif
+ }
+
+-unsigned char* Wallet::getReceivedFromDevice() {
++unsigned char* Wallet::getReceivedFromDevice(Device device) {
+ #if !(defined(HIDAPI_DUMMY) && !defined(HAVE_HIDAPI))
+ MERROR("MONERO compiled with #if !(defined(HIDAPI_DUMMY) && !defined(HAVE_HIDAPI))");
+ return {};
+ #else
+- return hw::io::device_io_dummy::receivedFromDevice;
++ switch (device) {
++ case Monero::Wallet::Device_Ledger:
++ return hw::io::device_io_dummy::receivedFromDevice;
++ case Monero::Wallet::Device_Trezor:
++ return hw::trezor::DummyTransport::receivedFromDevice;
++ default:
++ throw std::runtime_error("unknown device type");
++ }
+ #endif
+ }
+
+-size_t Wallet::getReceivedFromDeviceLength() {
++size_t Wallet::getReceivedFromDeviceLength(Device device) {
+ #if !(defined(HIDAPI_DUMMY) && !defined(HAVE_HIDAPI))
+ MERROR("MONERO compiled with #if !(defined(HIDAPI_DUMMY) && !defined(HAVE_HIDAPI))");
+ return -1;
+ #else
+- return hw::io::device_io_dummy::receivedFromDeviceLength;
++ switch (device) {
++ case Monero::Wallet::Device_Ledger:
++ return hw::io::device_io_dummy::receivedFromDeviceLength;
++ case Monero::Wallet::Device_Trezor:
++ return hw::trezor::DummyTransport::receivedFromDeviceLength;
++ default:
++ throw std::runtime_error("unknown device type");
++ }
+ #endif
+ }
+
+-bool Wallet::getWaitsForDeviceSend() {
++bool Wallet::getWaitsForDeviceSend(Device device) {
+ #if !(defined(HIDAPI_DUMMY) && !defined(HAVE_HIDAPI))
+ MERROR("MONERO compiled with #if !(defined(HIDAPI_DUMMY) && !defined(HAVE_HIDAPI))");
+ return false;
+ #else
+- return hw::io::device_io_dummy::waitsForDeviceSend;
++ switch (device) {
++ case Monero::Wallet::Device_Ledger:
++ return hw::io::device_io_dummy::waitsForDeviceSend;
++ case Monero::Wallet::Device_Trezor:
++ return hw::trezor::DummyTransport::waitsForDeviceSend;
++ default:
++ throw std::runtime_error("unknown device type");
++ }
+ #endif
+ }
+
+-bool Wallet::getWaitsForDeviceReceive() {
++bool Wallet::getWaitsForDeviceReceive(Device device) {
+ #if !(defined(HIDAPI_DUMMY) && !defined(HAVE_HIDAPI))
+ MERROR("MONERO compiled with #if !(defined(HIDAPI_DUMMY) && !defined(HAVE_HIDAPI))");
+ return false;
+ #else
+- return hw::io::device_io_dummy::waitsForDeviceReceive;
++ switch (device) {
++ case Monero::Wallet::Device_Ledger:
++ return hw::io::device_io_dummy::waitsForDeviceReceive;
++ case Monero::Wallet::Device_Trezor:
++ return hw::trezor::DummyTransport::waitsForDeviceReceive;
++ default:
++ throw std::runtime_error("unknown device type");
++ }
+ #endif
+ }
+
+-void Wallet::setDeviceReceivedData(unsigned char* data, size_t len) {
++void Wallet::setDeviceReceivedData(Device device, unsigned char* data, size_t len) {
+ #if !(defined(HIDAPI_DUMMY) && !defined(HAVE_HIDAPI))
+ MERROR("MONERO compiled with #if !(defined(HIDAPI_DUMMY) && !defined(HAVE_HIDAPI))");
+ return;
+ #else
+- hw::io::device_io_dummy::setDeviceReceivedData(data, len);
++ switch (device) {
++ case Monero::Wallet::Device_Ledger:
++ hw::io::device_io_dummy::setDeviceReceivedData(data, len);
++ case Monero::Wallet::Device_Trezor:
++ hw::trezor::DummyTransport::setDeviceReceivedData(data, len);
++ default:
++ throw std::runtime_error("unknown device type");
++ }
+ #endif
+ }
+
+-void Wallet::setDeviceSendData(unsigned char* data, size_t len) {
++void Wallet::setDeviceSendData(Device device, unsigned char* data, size_t len) {
+ #if !(defined(HIDAPI_DUMMY) && !defined(HAVE_HIDAPI))
+ MERROR("MONERO compiled with #if !(defined(HIDAPI_DUMMY) && !defined(HAVE_HIDAPI))");
+ return;
+ #else
+- hw::io::device_io_dummy::sendToDevice = static_cast<unsigned char *>(malloc(len));
+- hw::io::device_io_dummy::sendToDeviceLength = len;
+- memset(hw::io::device_io_dummy::sendToDevice, 0, len);
+- memcpy(hw::io::device_io_dummy::sendToDevice, data, len);
+- hw::io::device_io_dummy::waitsForDeviceSend = false;
+- hw::io::device_io_dummy::cv_send.notify_all();
++ switch (device) {
++ case Monero::Wallet::Device_Ledger:
++ hw::io::device_io_dummy::sendToDevice = static_cast<unsigned char *>(malloc(len));
++ hw::io::device_io_dummy::sendToDeviceLength = len;
++ memset(hw::io::device_io_dummy::sendToDevice, 0, len);
++ memcpy(hw::io::device_io_dummy::sendToDevice, data, len);
++ hw::io::device_io_dummy::waitsForDeviceSend = false;
++ hw::io::device_io_dummy::cv_send.notify_all();
++ case Monero::Wallet::Device_Trezor:
++ hw::trezor::DummyTransport::sendToDevice = static_cast<unsigned char *>(malloc(len));
++ hw::trezor::DummyTransport::sendToDeviceLength = len;
++ memset(hw::trezor::DummyTransport::sendToDevice, 0, len);
++ memcpy(hw::trezor::DummyTransport::sendToDevice, data, len);
++ hw::trezor::DummyTransport::waitsForDeviceSend = false;
++ hw::trezor::DummyTransport::cv_send.notify_all();
++ default:
++ throw std::runtime_error("unknown device type");
++ }
+ #endif
+ }
+
+-void Wallet::setLedgerCallback(void (*sendToLedgerDevice)(unsigned char *command, unsigned int cmd_len)) {
++void Wallet::setDeviceCallback(Monero::Wallet::Device device, void (*sendToDevice)(unsigned char *command, unsigned int cmd_len)) {
+ #if !(defined(HIDAPI_DUMMY) && !defined(HAVE_HIDAPI))
+ MERROR("MONERO compiled with #if !(defined(HIDAPI_DUMMY) && !defined(HAVE_HIDAPI))");
+ return;
+ #else
+- hw::io::device_io_dummy::setLedgerCallback(sendToLedgerDevice);
++ switch (device) {
++ case Monero::Wallet::Device_Ledger:
++ hw::io::device_io_dummy::setDeviceCallback(sendToDevice);
++ case Monero::Wallet::Device_Trezor:
++ hw::trezor::DummyTransport::setDeviceCallback(sendToDevice);
++ default:
++ throw std::runtime_error("unknown device type");
++ }
+ #endif
+ }
+
+diff --git a/src/wallet/api/wallet.h b/src/wallet/api/wallet.h
+index 98c03b9c1..2a29c07b3 100644
+--- a/src/wallet/api/wallet.h
++++ b/src/wallet/api/wallet.h
+@@ -322,19 +322,19 @@ private:
+ mutable std::atomic<bool> m_is_connected;
+ boost::optional<epee::net_utils::http::login> m_daemon_login{};
+
+- bool getStateIsConnected();
++ bool getStateIsConnected(Device device);
+
+- unsigned char *getSendToDevice();
++ unsigned char *getSendToDevice(Device device);
+
+- size_t getSendToDeviceLength();
++ size_t getSendToDeviceLength(Device device);
+
+- unsigned char *getReceivedFromDevice();
++ unsigned char *getReceivedFromDevice(Device device);
+
+- size_t getReceivedFromDeviceLength();
++ size_t getReceivedFromDeviceLength(Device device);
+
+- bool getWaitsForDeviceSend();
++ bool getWaitsForDeviceSend(Device device);
+
+- bool getWaitsForDeviceReceive();
++ bool getWaitsForDeviceReceive(Device device);
+
+ virtual std::string serializeCacheToJson() const override;
+ };
+diff --git a/src/wallet/api/wallet2_api.h b/src/wallet/api/wallet2_api.h
+index 3d11929f9..61756a127 100644
+--- a/src/wallet/api/wallet2_api.h
++++ b/src/wallet/api/wallet2_api.h
+@@ -1206,17 +1206,16 @@ struct Wallet
+ virtual uint64_t getBytesSent() = 0;
+
+ // HIDAPI_DUMMY
+- static bool getStateIsConnected();
+- static unsigned char* getSendToDevice();
+- static size_t getSendToDeviceLength();
+- static unsigned char* getReceivedFromDevice();
+- static size_t getReceivedFromDeviceLength();
+- static bool getWaitsForDeviceSend();
+- static bool getWaitsForDeviceReceive();
+-
+- static void setDeviceReceivedData(unsigned char* data, size_t len);
+- static void setDeviceSendData(unsigned char* data, size_t len);
+- static void setLedgerCallback(void (*sendToLedgerDevice)(unsigned char *command, unsigned int cmd_len));
++ static bool getStateIsConnected(Device device);
++ static unsigned char* getSendToDevice(Device device);
++ static size_t getSendToDeviceLength(Device device);
++ static unsigned char* getReceivedFromDevice(Device device);
++ static size_t getReceivedFromDeviceLength(Device device);
++ static bool getWaitsForDeviceSend(Device device);
++ static bool getWaitsForDeviceReceive(Device device);
++ static void setDeviceReceivedData(Device device, unsigned char* data, size_t len);
++ static void setDeviceSendData(Device device, unsigned char* data, size_t len);
++ static void setDeviceCallback(Device device, void (*sendToDevice)(unsigned char *command, unsigned int cmd_len));
+
+ //! serialize wallet cache to JSON
+ virtual std::string serializeCacheToJson() const = 0;
+--
+2.50.1 (Apple Git-155)
+