Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix exception happening during transaction parsing #265

Merged
merged 2 commits into from
Feb 12, 2024
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
3 changes: 1 addition & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
## 2.2.0-beta03
## 2.2.0-beta02
## 2.2.0-beta04

- Improvements on example wallet

Expand Down
57 changes: 51 additions & 6 deletions example/wallet/lib/dependencies/chains/evm_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ class EVMService {
'eth_signTransaction': ethSignTransaction,
'eth_sendTransaction': ethSendTransaction,
'eth_signTypedData': ethSignTypedData,
'eth_signTypedData_v4': ethSignTypedData,
'eth_signTypedData_v4': ethSignTypedDataV4,
'wallet_switchEthereumChain': switchChain,
'wallet_addEthereumChain': addChain,
// add whatever method/handler you want to support
Expand All @@ -68,6 +68,7 @@ class EVMService {

Future<void> personalSign(String topic, dynamic parameters) async {
debugPrint('[$runtimeType] personalSign request: $parameters');
// message, address

final pRequest = _web3Wallet.pendingRequests.getAll().first;
final data = EthUtils.getDataFromParamsList(parameters);
Expand Down Expand Up @@ -114,6 +115,7 @@ class EVMService {

Future<void> ethSign(String topic, dynamic parameters) async {
debugPrint('[$runtimeType] ethSign request: $parameters');
// address, message

final pRequest = _web3Wallet.pendingRequests.getAll().first;
final data = EthUtils.getDataFromParamsList(parameters);
Expand Down Expand Up @@ -162,7 +164,7 @@ class EVMService {
debugPrint('[$runtimeType] ethSignTypedData request: $parameters');

final pRequest = _web3Wallet.pendingRequests.getAll().first;
final data = parameters[1] as String;
final data = EthUtils.getDataFromParamsList(parameters);
var response = JsonRpcResponse(
id: pRequest.id,
jsonrpc: '2.0',
Expand Down Expand Up @@ -199,6 +201,47 @@ class EVMService {
);
}

Future<void> ethSignTypedDataV4(String topic, dynamic parameters) async {
debugPrint('[$runtimeType] ethSignTypedDataV4 request: $parameters');

final pRequest = _web3Wallet.pendingRequests.getAll().first;
final data = EthUtils.getDataFromParamsList(parameters);
var response = JsonRpcResponse(
id: pRequest.id,
jsonrpc: '2.0',
);
if (await requestApproval(data)) {
try {
final keys = GetIt.I<IKeyService>().getKeysForChain(
chainSupported.chainId,
);

final signature = EthSigUtil.signTypedData(
privateKey: keys[0].privateKey,
jsonData: data,
version: TypedDataVersion.V4,
);
response = response.copyWith(result: signature);
} catch (e) {
debugPrint('[$runtimeType] ethSignTypedDataV4 error $e');
response = response.copyWith(
error: JsonRpcError(code: 0, message: e.toString()),
);
}
} else {
response = response.copyWith(
error: const JsonRpcError(code: 5001, message: 'User rejected method'),
);
}

_goBackToDapp(topic, response.result ?? response.error);

return _web3Wallet.respondSessionRequest(
topic: topic,
response: response,
);
}

Future<dynamic> ethSignTransaction(String topic, dynamic parameters) async {
debugPrint('[$runtimeType] ethSignTransaction request: $parameters');
final pRequest = _web3Wallet.pendingRequests.getAll().first;
Expand All @@ -207,8 +250,9 @@ class EVMService {
jsonrpc: '2.0',
);

final tJson = parameters[0] as Map<String, dynamic>;
final result = await approveTransaction(tJson);
final data = EthUtils.getTransactionFromParams(parameters);
if (data == null) return;
final result = await approveTransaction(data);
if (result is Transaction) {
try {
// Load the private key
Expand Down Expand Up @@ -259,8 +303,9 @@ class EVMService {
jsonrpc: '2.0',
);

final tJson = parameters[0] as Map<String, dynamic>;
final result = await approveTransaction(tJson);
final data = EthUtils.getTransactionFromParams(parameters);
if (data == null) return;
final result = await approveTransaction(data);
if (result is Transaction) {
try {
// Load the private key
Expand Down
36 changes: 25 additions & 11 deletions example/wallet/lib/utils/eth_utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@ import 'package:convert/convert.dart';
import 'package:walletconnect_flutter_v2/walletconnect_flutter_v2.dart';

class EthUtils {
static final addressRegEx = RegExp(
r'^0x[a-fA-F0-9]{40}$',
caseSensitive: false,
);

static String getUtf8Message(String maybeHex) {
if (maybeHex.startsWith('0x')) {
final List<int> decoded = hex.decode(
Expand All @@ -15,26 +20,35 @@ class EthUtils {
return maybeHex;
}

static String getAddressFromParamsList(dynamic params) {
static dynamic getAddressFromParamsList(dynamic params) {
return (params as List).firstWhere((p) {
try {
EthereumAddress.fromHex(p);
return true;
if (addressRegEx.hasMatch(p)) {
EthereumAddress.fromHex(p);
return true;
}
return false;
} catch (e) {
return false;
}
});
}, orElse: () => null);
}

static dynamic getDataFromParamsList(dynamic params) {
return (params as List).firstWhere((p) {
final address = getAddressFromParamsList(params);
return p != address;
});
final address = getAddressFromParamsList(params);
final param = (params as List).firstWhere(
(p) => p != address,
orElse: () => null,
);
return param;
}

static Map<String, dynamic> getTransactionFromParams(dynamic params) {
final param = (params as List<dynamic>).first;
return param as Map<String, dynamic>;
static Map<String, dynamic>? getTransactionFromParams(dynamic params) {
final address = getAddressFromParamsList(params);
final param = params.firstWhere(
(p) => p != address,
orElse: () => null,
);
return param as Map<String, dynamic>?;
}
}
2 changes: 1 addition & 1 deletion lib/src/version.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: walletconnect_flutter_v2
description: This repository contains oficial implementation of WalletConnect v2 protocols for Flutter applications. The communications protocol for web3.
version: 2.2.0-beta03
version: 2.2.0-beta04
repository: https://github.com/WalletConnect/WalletConnectFlutterV2

environment:
Expand Down
Loading