Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 43 additions & 1 deletion lib/wallets/wallet/intermediate/lib_monero_wallet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,14 @@ import '../../isar/models/wallet_info.dart';
import '../../models/tx_data.dart';
import '../wallet.dart';
import '../wallet_mixin_interfaces/multi_address_interface.dart';
import '../wallet_mixin_interfaces/sign_verify_interface.dart';
import '../wallet_mixin_interfaces/view_only_option_interface.dart';
import 'cryptonote_wallet.dart';

abstract class LibMoneroWallet<T extends CryptonoteCurrency>
extends CryptonoteWallet<T>
with ViewOnlyOptionInterface<T>
implements MultiAddressInterface<T> {
implements MultiAddressInterface<T>, SignVerifyInterface {
@override
int get isarTransactionVersion => 2;

Expand Down Expand Up @@ -175,6 +176,47 @@ abstract class LibMoneroWallet<T extends CryptonoteCurrency>
return csMonero.getTxKey(wallet!, txid);
}

@override
Future<String> signMessage(String message, {required Address address}) async {
if (isViewOnly) {
throw Exception("Cannot sign a message in a view only wallet");
}
if (wallet == null) {
throw Exception("Wallet not open");
}

final signature = await csMonero.signMessage(
wallet!,
message: message,
address: address.value,
);

// wallet2 returns an empty string on failure instead of throwing
if (signature.isEmpty) {
throw Exception("Failed to sign message with ${address.value}");
}

return signature;
}

@override
Future<bool> verifyMessage(
String message, {
required String address,
required String signature,
}) async {
if (wallet == null) {
throw Exception("Wallet not open");
}

return await csMonero.verifyMessage(
wallet!,
message: message,
address: address.trim(),
signature: signature.trim(),
);
}

void _setListener() {
if (wallet != null && !csMonero.hasListeners(wallet!)) {
csMonero.addListener(
Expand Down
13 changes: 13 additions & 0 deletions lib/wl_gen/interfaces/cs_monero_interface.dart
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,19 @@ abstract class CsMoneroInterface {

Future<String> getTxKey(WrappedWallet wallet, String txid);

Future<String> signMessage(
WrappedWallet wallet, {
required String message,
required String address,
});

Future<bool> verifyMessage(
WrappedWallet wallet, {
required String message,
required String address,
required String signature,
});

Future<void> save(WrappedWallet wallet);

Future<String> getPublicViewKey(WrappedWallet wallet);
Expand Down
19 changes: 19 additions & 0 deletions tool/wl_templates/XMR_cs_monero_interface_impl.template.dart
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,25 @@ class _CsMoneroInterfaceImpl extends CsMoneroInterface {
Future<String> getTxKey(WrappedWallet wallet, String txid) =>
wallet.get<lib_monero.Wallet>().getTxKey(txid);

@override
Future<String> signMessage(
WrappedWallet wallet, {
required String message,
required String address,
}) => wallet.get<lib_monero.Wallet>().signMessage(message, address);

@override
Future<bool> verifyMessage(
WrappedWallet wallet, {
required String message,
required String address,
required String signature,
}) => wallet.get<lib_monero.Wallet>().verifyMessage(
message,
address,
signature,
);

@override
Future<void> save(WrappedWallet wallet) =>
wallet.get<lib_monero.Wallet>().save();
Expand Down
Loading