Skip to content

Commit

Permalink
Merge pull request #265 from WalletConnect/bugfix/exception_during_tr…
Browse files Browse the repository at this point in the history
…ansaction_parsing

Fix exception happening during transaction parsing
  • Loading branch information
quetool committed Feb 12, 2024
2 parents 5679966 + fc6a894 commit b155351
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 21 deletions.
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

0 comments on commit b155351

Please sign in to comment.